Skip to content

Commit 93d36fb

Browse files
Merge pull request #898 from xjjiang/FLOPS_anti_icing
Flops anti-icing mass computation update
2 parents dae37da + 7a19d44 commit 93d36fb

File tree

3 files changed

+59
-4
lines changed

3 files changed

+59
-4
lines changed

aviary/subsystems/aerodynamics/gasp_based/test/test_common.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import numpy as np
44
import openmdao.api as om
55
from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal
6+
from openmdao.utils.testing_utils import use_tempdirs
67

78
from aviary.subsystems.aerodynamics.gasp_based.common import (
89
AeroForces,
@@ -13,6 +14,7 @@
1314
from aviary.variable_info.variables import Aircraft, Dynamic
1415

1516

17+
@use_tempdirs
1618
class TestAeroForces(unittest.TestCase):
1719
def testAeroForces(self):
1820
nn = 3

aviary/subsystems/mass/flops_based/anti_icing.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class AntiIcingMass(om.ExplicitComponent):
2020
def initialize(self):
2121
add_aviary_option(self, Aircraft.Engine.NUM_ENGINES)
2222
add_aviary_option(self, Aircraft.Propulsion.TOTAL_NUM_ENGINES)
23+
add_aviary_option(self, Aircraft.Engine.REFERENCE_SLS_THRUST, units='lbf')
2324

2425
def setup(self):
2526
num_engine_type = len(self.options[Aircraft.Engine.NUM_ENGINES])
@@ -29,6 +30,9 @@ def setup(self):
2930
add_aviary_input(self, Aircraft.Nacelle.AVG_DIAMETER, shape=num_engine_type, units='ft')
3031
add_aviary_input(self, Aircraft.Wing.SPAN, units='ft')
3132
add_aviary_input(self, Aircraft.Wing.SWEEP, units='deg')
33+
add_aviary_input(
34+
self, Aircraft.Engine.SCALED_SLS_THRUST, shape=num_engine_type, units='lbf'
35+
)
3236

3337
add_aviary_output(self, Aircraft.AntiIcing.MASS, units='lbm')
3438

@@ -45,8 +49,13 @@ def compute(self, inputs, outputs):
4549
span = inputs[Aircraft.Wing.SPAN]
4650
sweep = inputs[Aircraft.Wing.SWEEP]
4751

52+
thrust = inputs[Aircraft.Engine.SCALED_SLS_THRUST]
53+
ref_sls_thrust, _ = self.options[Aircraft.Engine.REFERENCE_SLS_THRUST]
54+
thrust_rat = thrust / ref_sls_thrust
55+
adjusted_avg_diam = avg_diam * np.sqrt(thrust_rat)
56+
4857
count_factor = distributed_engine_count_factor(total_engines)
49-
f_nacelle = distributed_nacelle_diam_factor(avg_diam, num_engines)
58+
f_nacelle = distributed_nacelle_diam_factor(adjusted_avg_diam, num_engines)
5059

5160
outputs[Aircraft.AntiIcing.MASS] = (
5261
(
@@ -65,11 +74,18 @@ def compute_partials(self, inputs, J):
6574
scaler = inputs[Aircraft.AntiIcing.MASS_SCALER]
6675
max_width = inputs[Aircraft.Fuselage.MAX_WIDTH]
6776
avg_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER]
68-
count_factor = distributed_engine_count_factor(total_engines)
69-
f_nacelle = distributed_nacelle_diam_factor(avg_diam, num_engines)
7077
span = inputs[Aircraft.Wing.SPAN]
7178
sweep = inputs[Aircraft.Wing.SWEEP]
7279

80+
# scale avg_diam by thrust ratio
81+
thrust = inputs[Aircraft.Engine.SCALED_SLS_THRUST]
82+
ref_sls_thrust, _ = self.options[Aircraft.Engine.REFERENCE_SLS_THRUST]
83+
thrust_rat = thrust / ref_sls_thrust
84+
adjusted_avg_diam = avg_diam * np.sqrt(thrust_rat)
85+
86+
count_factor = distributed_engine_count_factor(total_engines)
87+
f_nacelle = distributed_nacelle_diam_factor(adjusted_avg_diam, num_engines)
88+
7389
diam_deriv_fact = distributed_nacelle_diam_factor_deriv(num_engines)
7490

7591
cos_sweep = np.cos(sweep * np.pi / 180)
@@ -82,11 +98,23 @@ def compute_partials(self, inputs, J):
8298
J[Aircraft.AntiIcing.MASS, Aircraft.Fuselage.MAX_WIDTH] = 1.5 * scaler / GRAV_ENGLISH_LBM
8399

84100
J[Aircraft.AntiIcing.MASS, Aircraft.Nacelle.AVG_DIAMETER] = (
85-
3.8 * diam_deriv_fact * count_factor * scaler / GRAV_ENGLISH_LBM
101+
3.8 * diam_deriv_fact * np.sqrt(thrust_rat) * count_factor * scaler / GRAV_ENGLISH_LBM
86102
)
87103

88104
J[Aircraft.AntiIcing.MASS, Aircraft.Wing.SPAN] = 1 / cos_sweep * scaler / GRAV_ENGLISH_LBM
89105

90106
J[Aircraft.AntiIcing.MASS, Aircraft.Wing.SWEEP] = (
91107
span * (np.pi / 180) * sin_sweep / (cos_sweep) ** 2 * scaler / GRAV_ENGLISH_LBM
92108
)
109+
110+
J[Aircraft.AntiIcing.MASS, Aircraft.Engine.SCALED_SLS_THRUST] = (
111+
3.8
112+
* diam_deriv_fact
113+
* avg_diam
114+
* 0.5
115+
* np.sqrt(ref_sls_thrust / thrust)
116+
/ ref_sls_thrust
117+
* count_factor
118+
* scaler
119+
/ GRAV_ENGLISH_LBM
120+
)

aviary/subsystems/mass/flops_based/test/test_anti_icing.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def test_case(self, case_name):
4444
Aircraft.Nacelle.AVG_DIAMETER,
4545
Aircraft.Wing.SPAN,
4646
Aircraft.Wing.SWEEP,
47+
Aircraft.Engine.SCALED_SLS_THRUST,
4748
],
4849
output_keys=Aircraft.AntiIcing.MASS,
4950
tol=3.0e-3,
@@ -73,6 +74,15 @@ def test_case_2(self):
7374
prob.set_val(Aircraft.Nacelle.AVG_DIAMETER, np.array([7.94]), 'ft')
7475
prob.set_val(Aircraft.Wing.SPAN, 117.83, 'ft')
7576
prob.set_val(Aircraft.Wing.SWEEP, 25.0, 'deg')
77+
prob.set_val(
78+
Aircraft.Engine.SCALED_SLS_THRUST,
79+
np.array(
80+
[
81+
28928.1,
82+
]
83+
),
84+
'lbf',
85+
)
7686

7787
prob.run_model()
7888

@@ -100,6 +110,9 @@ def test_case_3(self):
100110
)
101111

102112
prob.model_options['*'] = options
113+
prob.model_options[Aircraft.Engine.REFERENCE_SLS_THRUST] = np.array(
114+
[28928.1, 28928.1, 28928.1]
115+
)
103116

104117
prob.setup(check=False, force_alloc_complex=True)
105118

@@ -108,6 +121,9 @@ def test_case_3(self):
108121
prob.set_val(Aircraft.Nacelle.AVG_DIAMETER, np.array([7.94, 8, 5]), 'ft')
109122
prob.set_val(Aircraft.Wing.SPAN, 117.83, 'ft')
110123
prob.set_val(Aircraft.Wing.SWEEP, 25.0, 'deg')
124+
prob.set_val(
125+
Aircraft.Engine.SCALED_SLS_THRUST, np.array([28928.1, 28928.1, 28928.1]), 'lbf'
126+
)
111127

112128
prob.run_model()
113129

@@ -158,6 +174,15 @@ def test_case_2(self):
158174
prob.set_val(Aircraft.Nacelle.AVG_DIAMETER, np.array([7.94]), 'ft')
159175
prob.set_val(Aircraft.Wing.SPAN, 117.83, 'ft')
160176
prob.set_val(Aircraft.Wing.SWEEP, 25.0, 'deg')
177+
prob.set_val(
178+
Aircraft.Engine.SCALED_SLS_THRUST,
179+
np.array(
180+
[
181+
28928.1,
182+
]
183+
),
184+
'lbf',
185+
)
161186

162187
partial_data = prob.check_partials(out_stream=None, method='cs')
163188
assert_check_partials(partial_data, atol=1e-12, rtol=1e-12)

0 commit comments

Comments
 (0)