@@ -123,6 +123,11 @@ class Parachute:
123123 Parachute.added_mass_coefficient : float
124124 Coefficient used to calculate the added-mass due to dragged air. It is
125125 calculated from the porosity of the parachute.
126+ Parachute.opening_shock_coefficient : float
127+ Empirical coefficient (commonly noted Cx) used to estimate the peak
128+ transient force experienced during parachute inflation. Typical
129+ values range from 1.2 to 2.0 depending on the deployment method and
130+ canopy type. Default value is 1.5.
126131 """
127132
128133 def __init__ (
@@ -137,6 +142,7 @@ def __init__(
137142 height = None ,
138143 porosity = 0.0432 ,
139144 drag_coefficient = 1.4 ,
145+ opening_shock_coefficient = 1.5 ,
140146 ):
141147 """Initializes Parachute class.
142148
@@ -217,6 +223,12 @@ def __init__(
217223 - **1.5** — extended-skirt canopy
218224
219225 Has no effect when ``radius`` is explicitly provided.
226+ opening_shock_coefficient : float, optional
227+ Empirical coefficient (commonly noted Cx) used to estimate the
228+ peak transient force experienced during parachute inflation via
229+ :meth:`calculate_opening_shock_force`. Typical values range from
230+ 1.2 to 2.0 depending on the deployment method and canopy type.
231+ Default value is 1.5.
220232 """
221233
222234 # Save arguments as attributes
@@ -228,6 +240,7 @@ def __init__(
228240 self .noise = noise
229241 self .drag_coefficient = drag_coefficient
230242 self .porosity = porosity
243+ self .opening_shock_coefficient = opening_shock_coefficient
231244
232245 # Initialize derived attributes
233246 self .radius = self .__resolve_radius (radius , cd_s , drag_coefficient )
@@ -259,6 +272,39 @@ def __compute_added_mass_coefficient(self, porosity):
259272 1 - 1.465 * porosity - 0.25975 * porosity ** 2 + 1.2626 * porosity ** 3
260273 )
261274
275+ def calculate_opening_shock_force (self , air_density , velocity ):
276+ """Estimates the peak transient force experienced by the recovery
277+ hardware during parachute inflation (the "opening shock").
278+
279+ The estimate follows the simplified model described in Knacke's
280+ "Parachute Recovery Systems Design Manual" (1992, Section 5.5):
281+
282+ .. math::
283+
284+ F_0 = C_x \\ cdot C_{d} S \\ cdot q
285+
286+ where :math:`C_x` is the ``opening_shock_coefficient``,
287+ :math:`C_{d} S` is the parachute's ``cd_s``, and :math:`q` is the
288+ dynamic pressure (:math:`q = \\ tfrac{1}{2} \\ rho V^2`) at the instant
289+ the canopy begins to inflate.
290+
291+ Parameters
292+ ----------
293+ air_density : float
294+ Freestream air density, in kg/m^3, at the moment of parachute
295+ deployment.
296+ velocity : float
297+ Freestream velocity relative to the rocket, in m/s, at the moment
298+ of parachute deployment.
299+
300+ Returns
301+ -------
302+ float
303+ Estimated peak opening shock force, in Newtons.
304+ """
305+ dynamic_pressure = 0.5 * air_density * velocity ** 2
306+ return self .opening_shock_coefficient * self .cd_s * dynamic_pressure
307+
262308 def __init_noise (self , noise ):
263309 """Initializes all noise-related attributes.
264310
@@ -431,6 +477,7 @@ def to_dict(self, **kwargs):
431477 "drag_coefficient" : self .drag_coefficient ,
432478 "height" : self .height ,
433479 "porosity" : self .porosity ,
480+ "opening_shock_coefficient" : self .opening_shock_coefficient ,
434481 }
435482
436483 if kwargs .get ("include_outputs" , False ):
@@ -465,6 +512,7 @@ def from_dict(cls, data):
465512 drag_coefficient = data .get ("drag_coefficient" , 1.4 ),
466513 height = data .get ("height" , None ),
467514 porosity = data .get ("porosity" , 0.0432 ),
515+ opening_shock_coefficient = data .get ("opening_shock_coefficient" , 1.5 ),
468516 )
469517
470518 return parachute
0 commit comments