Skip to content

Commit 9c0dd13

Browse files
committed
ENH: change geometry class to be compute only
1 parent 1dfcf85 commit 9c0dd13

8 files changed

Lines changed: 146 additions & 87 deletions

File tree

rocketpy/rocket/aero_surface/fins/_base_fin.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ def root_chord(self, value):
148148
"""
149149
self._root_chord = value
150150
self._update_geometry_chain()
151+
self.evaluate_shape()
151152

152153
@property
153154
def span(self):
@@ -171,6 +172,7 @@ def span(self, value):
171172
"""
172173
self._span = value
173174
self._update_geometry_chain()
175+
self.evaluate_shape()
174176

175177
@property
176178
def cant_angle(self):
@@ -326,14 +328,16 @@ def evaluate_geometrical_parameters(self):
326328
327329
This method delegates to the configured geometry strategy.
328330
"""
329-
self.geometry.evaluate_geometrical_parameters()
331+
geometry_data = self.geometry.evaluate_geometrical_parameters()
332+
for key, value in geometry_data.items():
333+
setattr(self, key, value)
330334

331335
def evaluate_shape(self):
332336
"""Evaluate the shape representation of the fin.
333337
334338
This method delegates to the configured geometry strategy.
335339
"""
336-
self.geometry.evaluate_shape()
340+
self.shape_vec = self.geometry.evaluate_shape()
337341

338342
@abstractmethod
339343
def draw(self):

rocketpy/rocket/aero_surface/fins/_geometry.py

Lines changed: 128 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ def __init__(self, owner):
1414

1515
@abstractmethod
1616
def evaluate_geometrical_parameters(self):
17-
"""Evaluate and store geometry-dependent aerodynamic parameters."""
17+
"""Evaluate and return geometry-dependent aerodynamic parameters."""
1818

1919
@abstractmethod
2020
def evaluate_shape(self):
21-
"""Evaluate the shape vector used by plotting and outputs."""
21+
"""Evaluate and return the shape vector used by plotting and outputs."""
2222

2323
def get_data(self, include_outputs=False):
2424
"""Return geometry-specific serialization data."""
@@ -48,9 +48,6 @@ def __init__(
4848
self._tip_chord = tip_chord
4949
self._sweep_length = sweep_length
5050
self._sweep_angle = sweep_angle
51-
self.owner._tip_chord = self._tip_chord
52-
self.owner._sweep_length = self._sweep_length
53-
self.owner._sweep_angle = self._sweep_angle
5451

5552
@property
5653
def tip_chord(self):
@@ -59,7 +56,6 @@ def tip_chord(self):
5956
@tip_chord.setter
6057
def tip_chord(self, value):
6158
self._tip_chord = value
62-
self.owner._tip_chord = value
6359

6460
@property
6561
def sweep_length(self):
@@ -68,7 +64,6 @@ def sweep_length(self):
6864
@sweep_length.setter
6965
def sweep_length(self, value):
7066
self._sweep_length = value
71-
self.owner._sweep_length = value
7267

7368
@property
7469
def sweep_angle(self):
@@ -78,11 +73,9 @@ def sweep_angle(self):
7873
def sweep_angle(self, value):
7974
self._sweep_angle = value
8075
self._sweep_length = np.tan(np.radians(value)) * self.owner.span
81-
self.owner._sweep_angle = self._sweep_angle
82-
self.owner._sweep_length = self._sweep_length
8376

8477
def evaluate_geometrical_parameters(self):
85-
"""Calculates and saves trapezoidal fin geometric parameters."""
78+
"""Calculate trapezoidal fin geometric parameters."""
8679
# pylint: disable=invalid-name
8780
owner = self.owner
8881
Yr = owner.root_chord + self.tip_chord
@@ -128,19 +121,31 @@ def evaluate_geometrical_parameters(self):
128121
+ (8 / (tau - 1) ** 2) * np.log((tau**2 + 1) / (2 * tau))
129122
)
130123

131-
owner.Yr = Yr
132-
owner.Af = Af
133-
owner.AR = AR
134-
owner.gamma_c = gamma_c
135-
owner.Yma = Yma
136-
owner.roll_geometrical_constant = roll_geometrical_constant
137-
owner.tau = tau
138-
owner.lift_interference_factor = lift_interference_factor
139-
owner.λ = lambda_ # pylint: disable=non-ascii-name
140-
owner.roll_damping_interference_factor = roll_damping_interference_factor
141-
owner.roll_forcing_interference_factor = roll_forcing_interference_factor
124+
self.Yr = Yr
125+
self.Af = Af
126+
self.AR = AR
127+
self.gamma_c = gamma_c
128+
self.Yma = Yma
129+
self.roll_geometrical_constant = roll_geometrical_constant
130+
self.tau = tau
131+
self.lift_interference_factor = lift_interference_factor
132+
self.λ = lambda_ # pylint: disable=non-ascii-name
133+
self.roll_damping_interference_factor = roll_damping_interference_factor
134+
self.roll_forcing_interference_factor = roll_forcing_interference_factor
142135

143-
self.evaluate_shape()
136+
return {
137+
"Yr": Yr,
138+
"Af": Af,
139+
"AR": AR,
140+
"gamma_c": gamma_c,
141+
"Yma": Yma,
142+
"roll_geometrical_constant": roll_geometrical_constant,
143+
"tau": tau,
144+
"lift_interference_factor": lift_interference_factor,
145+
"λ": lambda_, # pylint: disable=non-ascii-name
146+
"roll_damping_interference_factor": roll_damping_interference_factor,
147+
"roll_forcing_interference_factor": roll_forcing_interference_factor,
148+
}
144149

145150
def evaluate_shape(self):
146151
owner = self.owner
@@ -160,7 +165,9 @@ def evaluate_shape(self):
160165
]
161166

162167
x_array, y_array = zip(*points)
163-
owner.shape_vec = [np.array(x_array), np.array(y_array)]
168+
shape_vec = [np.array(x_array), np.array(y_array)]
169+
self.shape_vec = shape_vec
170+
return shape_vec
164171

165172
def get_data(self, include_outputs=False):
166173
data = {
@@ -171,19 +178,23 @@ def get_data(self, include_outputs=False):
171178
if include_outputs:
172179
data.update(
173180
{
174-
"shape_vec": self.owner.shape_vec,
175-
"Af": self.owner.Af,
176-
"AR": self.owner.AR,
177-
"gamma_c": self.owner.gamma_c,
178-
"Yma": self.owner.Yma,
179-
"roll_geometrical_constant": (self.owner.roll_geometrical_constant),
180-
"tau": self.owner.tau,
181-
"lift_interference_factor": (self.owner.lift_interference_factor),
182-
"roll_damping_interference_factor": (
183-
self.owner.roll_damping_interference_factor
181+
"shape_vec": getattr(self, "shape_vec", None),
182+
"Af": getattr(self, "Af", None),
183+
"AR": getattr(self, "AR", None),
184+
"gamma_c": getattr(self, "gamma_c", None),
185+
"Yma": getattr(self, "Yma", None),
186+
"roll_geometrical_constant": getattr(
187+
self, "roll_geometrical_constant", None
188+
),
189+
"tau": getattr(self, "tau", None),
190+
"lift_interference_factor": getattr(
191+
self, "lift_interference_factor", None
184192
),
185-
"roll_forcing_interference_factor": (
186-
self.owner.roll_forcing_interference_factor
193+
"roll_damping_interference_factor": getattr(
194+
self, "roll_damping_interference_factor", None
195+
),
196+
"roll_forcing_interference_factor": getattr(
197+
self, "roll_forcing_interference_factor", None
187198
),
188199
}
189200
)
@@ -194,7 +205,7 @@ class _EllipticalGeometry(_FinGeometry):
194205
"""Geometry strategy for elliptical fins."""
195206

196207
def evaluate_geometrical_parameters(self): # pylint: disable=too-many-statements
197-
"""Calculates and saves elliptical fin geometric parameters."""
208+
"""Calculate elliptical fin geometric parameters."""
198209
owner = self.owner
199210

200211
# pylint: disable=invalid-name
@@ -286,17 +297,27 @@ def evaluate_geometrical_parameters(self): # pylint: disable=too-many-statement
286297
+ (8 / (tau - 1) ** 2) * np.log((tau**2 + 1) / (2 * tau))
287298
)
288299

289-
owner.Af = Af
290-
owner.AR = AR
291-
owner.gamma_c = gamma_c
292-
owner.Yma = Yma
293-
owner.roll_geometrical_constant = roll_geometrical_constant
294-
owner.tau = tau
295-
owner.lift_interference_factor = lift_interference_factor
296-
owner.roll_damping_interference_factor = roll_damping_interference_factor
297-
owner.roll_forcing_interference_factor = roll_forcing_interference_factor
300+
self.Af = Af
301+
self.AR = AR
302+
self.gamma_c = gamma_c
303+
self.Yma = Yma
304+
self.roll_geometrical_constant = roll_geometrical_constant
305+
self.tau = tau
306+
self.lift_interference_factor = lift_interference_factor
307+
self.roll_damping_interference_factor = roll_damping_interference_factor
308+
self.roll_forcing_interference_factor = roll_forcing_interference_factor
298309

299-
self.evaluate_shape()
310+
return {
311+
"Af": Af,
312+
"AR": AR,
313+
"gamma_c": gamma_c,
314+
"Yma": Yma,
315+
"roll_geometrical_constant": roll_geometrical_constant,
316+
"tau": tau,
317+
"lift_interference_factor": lift_interference_factor,
318+
"roll_damping_interference_factor": roll_damping_interference_factor,
319+
"roll_forcing_interference_factor": roll_forcing_interference_factor,
320+
}
300321

301322
def evaluate_shape(self):
302323
owner = self.owner
@@ -305,24 +326,26 @@ def evaluate_shape(self):
305326
np.radians(angles)
306327
)
307328
y_array = owner.span * np.sin(np.radians(angles))
308-
owner.shape_vec = [x_array, y_array]
329+
shape_vec = [x_array, y_array]
330+
self.shape_vec = shape_vec
331+
return shape_vec
309332

310333
def get_data(self, include_outputs=False):
311334
if not include_outputs:
312335
return {}
313336
return {
314-
"Af": self.owner.Af,
315-
"AR": self.owner.AR,
316-
"gamma_c": self.owner.gamma_c,
317-
"Yma": self.owner.Yma,
318-
"roll_geometrical_constant": self.owner.roll_geometrical_constant,
319-
"tau": self.owner.tau,
320-
"lift_interference_factor": self.owner.lift_interference_factor,
321-
"roll_damping_interference_factor": (
322-
self.owner.roll_damping_interference_factor
337+
"Af": getattr(self, "Af", None),
338+
"AR": getattr(self, "AR", None),
339+
"gamma_c": getattr(self, "gamma_c", None),
340+
"Yma": getattr(self, "Yma", None),
341+
"roll_geometrical_constant": getattr(self, "roll_geometrical_constant", None),
342+
"tau": getattr(self, "tau", None),
343+
"lift_interference_factor": getattr(self, "lift_interference_factor", None),
344+
"roll_damping_interference_factor": getattr(
345+
self, "roll_damping_interference_factor", None
323346
),
324-
"roll_forcing_interference_factor": (
325-
self.owner.roll_forcing_interference_factor
347+
"roll_forcing_interference_factor": getattr(
348+
self, "roll_forcing_interference_factor", None
326349
),
327350
}
328351

@@ -357,7 +380,7 @@ def infer_dimensions(shape_points):
357380
def evaluate_geometrical_parameters(
358381
self,
359382
): # pylint: disable=too-many-statements,too-many-locals,invalid-name
360-
"""Calculates and saves free-form fin geometric parameters."""
383+
"""Calculate free-form fin geometric parameters."""
361384
owner = self.owner
362385

363386
Af = 0
@@ -474,45 +497,65 @@ def evaluate_geometrical_parameters(
474497
mac_lead /= total_area
475498
cos_gamma = cos_gamma_sum / (points_per_line - 1)
476499

477-
owner.Af = Af
478-
owner.AR = AR
479-
owner.gamma_c = np.arccos(cos_gamma)
480-
owner.Yma = mac_span
481-
owner.mac_length = mac_length
482-
owner.mac_lead = mac_lead
483-
owner.tau = tau
484-
owner.roll_geometrical_constant = roll_geometrical_constant
485-
owner.lift_interference_factor = lift_interference_factor
486-
owner.roll_forcing_interference_factor = roll_forcing_interference_factor
487-
owner.roll_damping_interference_factor = 1 + (
500+
gamma_c = np.arccos(cos_gamma)
501+
502+
self.Af = Af
503+
self.AR = AR
504+
self.gamma_c = gamma_c
505+
self.Yma = mac_span
506+
self.mac_length = mac_length
507+
self.mac_lead = mac_lead
508+
self.tau = tau
509+
self.roll_geometrical_constant = roll_geometrical_constant
510+
self.lift_interference_factor = lift_interference_factor
511+
self.roll_forcing_interference_factor = roll_forcing_interference_factor
512+
self.roll_damping_interference_factor = 1 + (
488513
roll_damping_numerator / roll_damping_denominator
489514
)
490515

491-
self.evaluate_shape()
516+
return {
517+
"Af": Af,
518+
"AR": AR,
519+
"gamma_c": gamma_c,
520+
"Yma": mac_span,
521+
"mac_length": mac_length,
522+
"mac_lead": mac_lead,
523+
"tau": tau,
524+
"roll_geometrical_constant": roll_geometrical_constant,
525+
"lift_interference_factor": lift_interference_factor,
526+
"roll_forcing_interference_factor": roll_forcing_interference_factor,
527+
"roll_damping_interference_factor": self.roll_damping_interference_factor,
528+
}
492529

493530
def evaluate_shape(self):
494531
x_array, y_array = zip(*self.shape_points)
495-
self.owner.shape_vec = [np.array(x_array), np.array(y_array)]
532+
shape_vec = [np.array(x_array), np.array(y_array)]
533+
self.shape_vec = shape_vec
534+
return shape_vec
496535

497536
def get_data(self, include_outputs=False):
498537
data = {"shape_points": self.shape_points}
499538
if include_outputs:
500539
data.update(
501540
{
502-
"Af": self.owner.Af,
503-
"AR": self.owner.AR,
504-
"gamma_c": self.owner.gamma_c,
505-
"Yma": self.owner.Yma,
506-
"mac_length": self.owner.mac_length,
507-
"mac_lead": self.owner.mac_lead,
508-
"roll_geometrical_constant": (self.owner.roll_geometrical_constant),
509-
"tau": self.owner.tau,
510-
"lift_interference_factor": (self.owner.lift_interference_factor),
511-
"roll_forcing_interference_factor": (
512-
self.owner.roll_forcing_interference_factor
541+
"Af": getattr(self, "Af", None),
542+
"AR": getattr(self, "AR", None),
543+
"gamma_c": getattr(self, "gamma_c", None),
544+
"Yma": getattr(self, "Yma", None),
545+
"mac_length": getattr(self, "mac_length", None),
546+
"mac_lead": getattr(self, "mac_lead", None),
547+
"roll_geometrical_constant": getattr(
548+
self, "roll_geometrical_constant", None
549+
),
550+
"tau": getattr(self, "tau", None),
551+
"lift_interference_factor": getattr(
552+
self, "lift_interference_factor", None
553+
),
554+
"roll_forcing_interference_factor": getattr(
555+
self, "roll_forcing_interference_factor", None
513556
),
514-
"roll_damping_interference_factor": (
515-
self.owner.roll_damping_interference_factor
557+
"roll_damping_interference_factor": getattr(
558+
self, "roll_damping_interference_factor", None
516559
),
517560
}
518561
)

rocketpy/rocket/aero_surface/fins/elliptical_fin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ def __init__(
159159

160160
self.geometry = _EllipticalGeometry(self)
161161
self._update_geometry_chain()
162+
self.evaluate_shape()
162163

163164
self.prints = _EllipticalFinPrints(self)
164165
self.plots = _EllipticalFinPlots(self)

rocketpy/rocket/aero_surface/fins/elliptical_fins.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ def __init__(
160160

161161
self.geometry = _EllipticalGeometry(self)
162162
self._update_geometry_chain()
163+
self.evaluate_shape()
163164

164165
self.prints = _EllipticalFinsPrints(self)
165166
self.plots = _EllipticalFinsPlots(self)

rocketpy/rocket/aero_surface/fins/free_form_fin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ def __init__(
147147

148148
self.geometry = _FreeFormGeometry(self, shape_points)
149149
self._update_geometry_chain()
150+
self.evaluate_shape()
150151

151152
self.prints = _FreeFormFinPrints(self)
152153
self.plots = _FreeFormFinPlots(self)

rocketpy/rocket/aero_surface/fins/free_form_fins.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ def __init__(
146146

147147
self.geometry = _FreeFormGeometry(self, shape_points)
148148
self._update_geometry_chain()
149+
self.evaluate_shape()
149150

150151
self.prints = _FreeFormFinsPrints(self)
151152
self.plots = _FreeFormFinsPlots(self)

0 commit comments

Comments
 (0)