Skip to content

Commit 473232a

Browse files
authored
Fixed viscous drag, moment coeff, and sectional CL bugs (#397)
* fixed viscous drag * updated test ref values * version * black * renamed variables and fixed moment coeff * ffd ref value * CM ref value updated in vsp test * Updated geometry.py docstrings
1 parent 3ae9871 commit 473232a

46 files changed

Lines changed: 144 additions & 142 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

openaerostruct/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "2.5.1"
1+
__version__ = "2.5.2"

openaerostruct/aerodynamics/aero_groups.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def setup(self):
4444
self.connect(name + ".widths", name + "_perf.widths")
4545
self.connect(name + ".chords", name + "_perf.chords")
4646
self.connect(name + ".lengths", name + "_perf.lengths")
47-
self.connect(name + ".cos_sweep", name + "_perf.cos_sweep")
47+
self.connect(name + ".lengths_spanwise", name + "_perf.lengths_spanwise")
4848

4949
# Connect S_ref for performance calcs
5050
self.connect(name + ".S_ref", "total_perf." + name + "_S_ref")

openaerostruct/aerodynamics/functionals.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@ def setup(self):
4545
self.add_subsystem(
4646
"viscousdrag",
4747
ViscousDrag(surface=surface),
48-
promotes_inputs=["Mach_number", "re", "widths", "cos_sweep", "lengths", "S_ref", "t_over_c"],
48+
promotes_inputs=["Mach_number", "re", "widths", "lengths_spanwise", "lengths", "S_ref", "t_over_c"],
4949
promotes_outputs=["CDv"],
5050
)
5151

5252
self.add_subsystem(
5353
"wavedrag",
5454
WaveDrag(surface=surface),
55-
promotes_inputs=["Mach_number", "cos_sweep", "widths", "CL", "chords", "t_over_c"],
55+
promotes_inputs=["Mach_number", "lengths_spanwise", "widths", "CL", "chords", "t_over_c"],
5656
promotes_outputs=["CDw"],
5757
)
5858

openaerostruct/aerodynamics/geometry.py

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ class VLMGeometry(om.ExplicitComponent):
2121
b_pts[nx-1, ny, 3] : numpy array
2222
Bound points for the horseshoe vortices, found along the 1/4 chord.
2323
widths[ny-1] : numpy array
24-
The spanwise widths of each individual panel.
24+
The widths of each individual panel along y-axis (spanwise direction with zero sweep).
25+
lengths_spanwise[ny-1] : numpy array
26+
The the length of the quarter-chord line of each panels.
27+
This is identical to `widths` if sweep angle is 0.
28+
When wing is swept, `lengths_spanwise` is longer than `widths`.
2529
lengths[ny] : numpy array
2630
The chordwise length of the entire airfoil following the camber line.
2731
chords[ny] : numpy array
@@ -49,7 +53,7 @@ def setup(self):
4953
rng = np.random.default_rng(314)
5054
self.add_output("b_pts", val=rng.random((nx - 1, ny, 3)), units="m")
5155
self.add_output("widths", val=np.ones((ny - 1)), units="m")
52-
self.add_output("cos_sweep", val=np.zeros((ny - 1)), units="m")
56+
self.add_output("lengths_spanwise", val=np.ones((ny - 1)), units="m")
5357
self.add_output("lengths", val=np.zeros((ny)), units="m")
5458
self.add_output("chords", val=np.zeros((ny)), units="m")
5559
self.add_output("normals", val=np.zeros((nx - 1, ny - 1, 3)))
@@ -68,19 +72,19 @@ def setup(self):
6872
val[size:] = 0.25
6973
self.declare_partials("b_pts", "def_mesh", rows=rows, cols=cols, val=val)
7074

71-
# widths
75+
# width
7276
size = ny - 1
7377
base = np.arange(size)
74-
rows = np.tile(base, 12)
75-
col = np.tile(3 * base, 6) + np.repeat(np.arange(6), len(base))
78+
rows = np.tile(base, 8)
79+
col = np.tile(3 * base, 4) + np.repeat([1, 2, 4, 5], len(base))
7680
cols = np.tile(col, 2) + np.repeat([0, (nx - 1) * ny * 3], len(col))
7781
self.declare_partials("widths", "def_mesh", rows=rows, cols=cols)
7882

79-
# cos_sweep
80-
rows = np.tile(base, 8)
81-
col = np.tile(3 * base, 4) + np.repeat([1, 2, 4, 5], len(base))
83+
# length of panel in spanwise direction with sweep
84+
rows = np.tile(base, 12)
85+
col = np.tile(3 * base, 6) + np.repeat(np.arange(6), len(base))
8286
cols = np.tile(col, 2) + np.repeat([0, (nx - 1) * ny * 3], len(col))
83-
self.declare_partials("cos_sweep", "def_mesh", rows=rows, cols=cols)
87+
self.declare_partials("lengths_spanwise", "def_mesh", rows=rows, cols=cols)
8488

8589
# lengths
8690
size = ny
@@ -116,16 +120,13 @@ def compute(self, inputs, outputs):
116120
# Compute the bound points at quarter-chord
117121
b_pts = mesh[:-1, :, :] * 0.75 + mesh[1:, :, :] * 0.25
118122

119-
# Compute the widths of each panel at the quarter-chord line
123+
# Compute the length of the quarter-chord line of each panels
120124
quarter_chord = 0.25 * mesh[-1] + 0.75 * mesh[0]
121-
widths = np.linalg.norm(quarter_chord[1:, :] - quarter_chord[:-1, :], axis=1)
125+
lengths_spanwise = np.linalg.norm(quarter_chord[1:, :] - quarter_chord[:-1, :], axis=1)
122126

123-
# Compute the numerator of the cosine of the sweep angle of each panel
124-
# (we need this for the viscous drag dependence on sweep, and we only compute
125-
# the numerator because the denominator of the cosine fraction is the width,
126-
# which we have already computed. They are combined in the viscous drag
127-
# calculation.)
128-
cos_sweep = np.linalg.norm(quarter_chord[1:, [1, 2]] - quarter_chord[:-1, [1, 2]], axis=1)
127+
# Compute the widths of each panel.
128+
# This is a projection of `lengths_spanwise` to the spanwise axis (y-axis)
129+
widths = np.linalg.norm(quarter_chord[1:, [1, 2]] - quarter_chord[:-1, [1, 2]], axis=1)
129130

130131
# Compute the length of each chordwise set of mesh points through the camber line.
131132
dx = mesh[1:, :, 0] - mesh[:-1, :, 0]
@@ -171,7 +172,7 @@ def compute(self, inputs, outputs):
171172
# Store each array in the outputs dict
172173
outputs["b_pts"] = b_pts
173174
outputs["widths"] = widths
174-
outputs["cos_sweep"] = cos_sweep
175+
outputs["lengths_spanwise"] = lengths_spanwise
175176
outputs["lengths"] = lengths
176177
outputs["normals"] = normals
177178
outputs["S_ref"] = S_ref
@@ -184,18 +185,18 @@ def compute_partials(self, inputs, partials):
184185
ny = self.ny
185186
mesh = inputs["def_mesh"]
186187

187-
# Compute the widths of each panel at the quarter-chord line
188+
# Compute the length of the quarter-chord line of each panels
188189
quarter_chord = 0.25 * mesh[-1] + 0.75 * mesh[0]
189-
widths = np.linalg.norm(quarter_chord[1:, :] - quarter_chord[:-1, :], axis=1)
190+
lengths_spanwise = np.linalg.norm(quarter_chord[1:, :] - quarter_chord[:-1, :], axis=1)
190191

191-
# Compute the cosine of the sweep angle of each panel
192-
cos_sweep_array = np.linalg.norm(quarter_chord[1:, [1, 2]] - quarter_chord[:-1, [1, 2]], axis=1)
192+
# Compute the widths of each panel.
193+
widths = np.linalg.norm(quarter_chord[1:, [1, 2]] - quarter_chord[:-1, [1, 2]], axis=1)
193194

194195
delta = np.diff(quarter_chord, axis=0).T
195-
d1 = delta / widths
196+
d1 = delta / lengths_spanwise
197+
partials["lengths_spanwise", "def_mesh"] = np.outer([-0.75, 0.75, -0.25, 0.25], d1.flatten()).flatten()
198+
d1 = delta[1:, :] / widths
196199
partials["widths", "def_mesh"] = np.outer([-0.75, 0.75, -0.25, 0.25], d1.flatten()).flatten()
197-
d1 = delta[1:, :] / cos_sweep_array
198-
partials["cos_sweep", "def_mesh"] = np.outer([-0.75, 0.75, -0.25, 0.25], d1.flatten()).flatten()
199200

200201
partials["lengths", "def_mesh"][:] = 0.0
201202
dmesh = np.diff(mesh, axis=0)

openaerostruct/aerodynamics/lift_coeff_2D.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def setup(self):
4545
# Inputs
4646
self.add_input("alpha", val=3.0, units="deg")
4747
self.add_input("sec_forces", val=np.ones((self.nx - 1, self.ny - 1, 3)), units="N")
48-
self.add_input("widths", val=np.arange((self.ny - 1)) + 1.0, units="m")
48+
self.add_input("widths", val=np.ones((self.ny - 1)) * 0.2, units="m")
4949
self.add_input("chords", val=np.ones((self.ny)), units="m")
5050
self.add_input("v", val=1.0, units="m/s")
5151
self.add_input("rho", val=1.0, units="kg/m**3")

openaerostruct/aerodynamics/tests/test_geometry.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@ def test_outputs(self):
191191
prob.setup()
192192
prob.run_model()
193193

194-
assert_near_equal(prob["widths"], np.array([11.95624787, 11.90425878, 11.44086572]), 1e-6)
195-
assert_near_equal(prob["cos_sweep"], np.array([9.7938336, 9.79384207, 9.79385053]), 1e-6)
194+
assert_near_equal(prob["lengths_spanwise"], np.array([11.95624787, 11.90425878, 11.44086572]), 1e-6)
195+
assert_near_equal(prob["widths"], np.array([9.7938336, 9.79384207, 9.79385053]), 1e-6)
196196
assert_near_equal(prob["S_ref"], np.array([415.02211208]), 1e-6)
197197
assert_near_equal(prob["chords"], np.array([2.72796, 5.1252628, 7.8891638, 13.6189974]), 1e-6)
198198
assert_near_equal(prob["lengths"], np.array([2.72796, 5.1252628, 7.8891638, 13.6189974]), 1e-6)

openaerostruct/aerodynamics/tests/test_wave_drag.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ def test(self):
2020
indep_var_comp.add_output("t_over_c_cp", val=surface["t_over_c_cp"])
2121
indep_var_comp.add_output("Mach_number", val=0.95)
2222
indep_var_comp.add_output("CL", val=0.7)
23-
indep_var_comp.add_output("widths", val=np.array([12.14757848, 11.91832712, 11.43730892]), units="m")
24-
indep_var_comp.add_output("cos_sweep", val=np.array([10.01555924, 9.80832351, 9.79003729]), units="m")
23+
indep_var_comp.add_output("lengths_spanwise", val=np.array([12.14757848, 11.91832712, 11.43730892]), units="m")
24+
indep_var_comp.add_output("widths", val=np.array([10.01555924, 9.80832351, 9.79003729]), units="m")
2525
indep_var_comp.add_output("chords", val=np.array([2.72835132, 5.12528179, 7.88916016, 13.6189974]), units="m")
2626
group.add_subsystem("indep_var_comp", indep_var_comp, promotes=["*"])
2727

openaerostruct/aerodynamics/viscous_drag.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ def setup(self):
5555
self.add_input("re", val=5.0e6, units="1/m")
5656
self.add_input("Mach_number", val=1.6)
5757
self.add_input("S_ref", val=1.0, units="m**2")
58-
self.add_input("cos_sweep", val=np.ones((ny - 1)) * 0.2, units="m")
59-
self.add_input("widths", val=np.arange((ny - 1)) + 1.0, units="m")
58+
self.add_input("widths", val=np.ones((ny - 1)) * 0.2, units="m")
59+
self.add_input("lengths_spanwise", val=np.arange((ny - 1)) + 1.0, units="m")
6060
self.add_input("lengths", val=np.ones((ny)), units="m")
6161
self.add_input("t_over_c", val=np.arange((ny - 1)))
6262
self.add_output("CDv", val=0.0)
@@ -72,7 +72,7 @@ def compute(self, inputs, outputs):
7272
S_ref = inputs["S_ref"]
7373
widths = inputs["widths"]
7474
lengths = inputs["lengths"]
75-
cos_sweep = inputs["cos_sweep"] / widths
75+
cos_sweep = inputs["widths"] / inputs["lengths_spanwise"]
7676
t_over_c = inputs["t_over_c"]
7777

7878
# Take panel chord length to be average of its edge lengths
@@ -124,10 +124,9 @@ def compute_partials(self, inputs, partials):
124124

125125
M = inputs["Mach_number"]
126126
S_ref = inputs["S_ref"]
127-
128127
widths = inputs["widths"]
129128
lengths = inputs["lengths"]
130-
cos_sweep = inputs["cos_sweep"] / widths
129+
cos_sweep = widths / inputs["lengths_spanwise"]
131130

132131
# Take panel chord length to be average of its edge lengths
133132
chords = (lengths[1:] + lengths[:-1]) / 2.0
@@ -186,9 +185,9 @@ def compute_partials(self, inputs, partials):
186185

187186
partials["CDv", "lengths"][0, 1:] += CDv_lengths
188187
partials["CDv", "lengths"][0, :-1] += CDv_lengths
189-
partials["CDv", "widths"][0, :] = d_over_q * FF / S_ref * 0.72
188+
partials["CDv", "lengths_spanwise"][0, :] = d_over_q / S_ref * (-0.28 * k_FF * cos_sweep**1.28)
190189
partials["CDv", "S_ref"] = -D_over_q / S_ref**2
191-
partials["CDv", "cos_sweep"][0, :] = 0.28 * k_FF * d_over_q / S_ref / cos_sweep**0.72
190+
partials["CDv", "widths"][0, :] = d_over_q / S_ref * (FF + 0.28 * k_FF * cos_sweep**0.28)
192191
partials["CDv", "t_over_c"] = (
193192
d_over_q * widths * 1.34 * M**0.18 * (0.6 / self.c_max_t + 400 * t_over_c**3) * cos_sweep**0.28
194193
) / S_ref
@@ -239,9 +238,9 @@ def compute_partials(self, inputs, partials):
239238

240239
if self.surface["symmetry"]:
241240
partials["CDv", "lengths"][0, :] *= 2
242-
partials["CDv", "widths"][0, :] *= 2
241+
partials["CDv", "lengths_spanwise"][0, :] *= 2
243242
partials["CDv", "S_ref"] *= 2
244-
partials["CDv", "cos_sweep"][0, :] *= 2
243+
partials["CDv", "widths"][0, :] *= 2
245244
partials["CDv", "Mach_number"][0, :] *= 2
246245
partials["CDv", "re"][0, :] *= 2
247246
partials["CDv", "t_over_c"][0, :] *= 2

openaerostruct/aerodynamics/wave_drag.py

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ class WaveDrag(om.ExplicitComponent):
1212
----------
1313
Mach_number : float
1414
Mach number.
15-
cos_sweep[ny-1] : numpy array
16-
The width in the spanwise direction of each VLM panel. This is the numerator of cos(sweep).
1715
widths[ny-1] : numpy array
18-
The actual width of each VLM panel, rotated by the sweep angle. This is the denominator
16+
The width in the spanwise direction of each VLM panel. This is the numerator of cos(sweep).
17+
lengths_spanwise[ny-1] : numpy array
18+
The spanwise length of each VLM panel at 1/4 chord, rotated by the sweep angle. This is the denominator
1919
of cos(sweep)
2020
CL : float
2121
The CL of the lifting surface used for wave drag estimation.
@@ -46,9 +46,9 @@ def setup(self):
4646
ny = surface["mesh"].shape[1]
4747

4848
self.add_input("Mach_number", val=1.6)
49-
self.add_input("cos_sweep", val=np.ones((ny - 1)) * 0.2, units="m")
49+
self.add_input("widths", val=np.ones((ny - 1)) * 0.2, units="m")
5050
self.add_input(
51-
"widths", val=np.arange((ny - 1)) + 1.0, units="m"
51+
"lengths_spanwise", val=np.arange((ny - 1)) + 1.0, units="m"
5252
) # set to np.arange so that d_CDw_d_chords is nonzero
5353
self.add_input("CL", val=0.33)
5454
self.add_input("chords", val=np.ones((ny)), units="m")
@@ -62,16 +62,14 @@ def compute(self, inputs, outputs):
6262
if self.with_wave:
6363
t_over_c = inputs["t_over_c"]
6464
widths = inputs["widths"]
65-
actual_cos_sweep = inputs["cos_sweep"] / widths
65+
cos_sweep = widths / inputs["lengths_spanwise"]
6666
M = inputs["Mach_number"]
6767
chords = inputs["chords"]
6868
CL = inputs["CL"]
6969

7070
mean_chords = (chords[:-1] + chords[1:]) / 2.0
71-
panel_areas = mean_chords * inputs["cos_sweep"]
72-
avg_cos_sweep = np.sum(actual_cos_sweep * panel_areas) / np.sum(
73-
panel_areas
74-
) # weighted average of 1/4 chord sweep
71+
panel_areas = mean_chords * widths
72+
avg_cos_sweep = np.sum(cos_sweep * panel_areas) / np.sum(panel_areas) # weighted average of 1/4 chord sweep
7573
avg_t_over_c = np.sum(t_over_c * panel_areas) / np.sum(panel_areas) # weighted average of streamwise t/c
7674
MDD = self.ka / avg_cos_sweep - avg_t_over_c / avg_cos_sweep**2 - CL / (10 * avg_cos_sweep**3)
7775
Mcrit = MDD - (0.1 / 80.0) ** (1.0 / 3.0)
@@ -92,16 +90,16 @@ def compute_partials(self, inputs, partials):
9290
ny = self.surface["mesh"].shape[1]
9391
t_over_c = inputs["t_over_c"]
9492
widths = inputs["widths"]
95-
cos_sweep = inputs["cos_sweep"]
96-
actual_cos_sweep = cos_sweep / widths
93+
lengths_spanwise = inputs["lengths_spanwise"]
94+
cos_sweep = widths / lengths_spanwise
9795
M = inputs["Mach_number"]
9896
chords = inputs["chords"]
9997
CL = inputs["CL"]
10098

10199
chords = (chords[:-1] + chords[1:]) / 2.0
102-
panel_areas = chords * inputs["cos_sweep"]
100+
panel_areas = chords * widths
103101
sum_panel_areas = np.sum(panel_areas)
104-
avg_cos_sweep = np.sum(actual_cos_sweep * panel_areas) / sum_panel_areas
102+
avg_cos_sweep = np.sum(cos_sweep * panel_areas) / sum_panel_areas
105103
avg_t_over_c = np.sum(t_over_c * panel_areas) / sum_panel_areas
106104

107105
MDD = 0.95 / avg_cos_sweep - avg_t_over_c / avg_cos_sweep**2 - CL / (10 * avg_cos_sweep**3)
@@ -116,14 +114,14 @@ def compute_partials(self, inputs, partials):
116114
dMDDdtoc = -1.0 / (avg_cos_sweep**2)
117115
dtocavgdtoc = panel_areas / sum_panel_areas
118116

119-
ccos = np.sum(cos_sweep * chords)
120-
ccos2w = np.sum(chords * cos_sweep**2 / widths)
117+
ccos = np.sum(widths * chords)
118+
ccos2w = np.sum(chords * widths**2 / lengths_spanwise)
121119

122-
davgdcos = 2 * chords * cos_sweep / widths / ccos - chords * ccos2w / ccos**2
123-
dtocdcos = chords * t_over_c / ccos - chords * np.sum(chords * cos_sweep * t_over_c) / ccos**2
124-
davgdw = -1 * chords * cos_sweep**2 / widths**2 / ccos
125-
davgdc = cos_sweep**2 / widths / ccos - cos_sweep * ccos2w / ccos**2
126-
dtocdc = t_over_c * cos_sweep / ccos - cos_sweep * np.sum(chords * cos_sweep * t_over_c) / ccos**2
120+
davgdcos = 2 * chords * widths / lengths_spanwise / ccos - chords * ccos2w / ccos**2
121+
dtocdcos = chords * t_over_c / ccos - chords * np.sum(chords * widths * t_over_c) / ccos**2
122+
davgdw = -1 * chords * widths**2 / lengths_spanwise**2 / ccos
123+
davgdc = widths**2 / lengths_spanwise / ccos - widths * ccos2w / ccos**2
124+
dtocdc = t_over_c * widths / ccos - widths * np.sum(chords * widths * t_over_c) / ccos**2
127125

128126
dcdchords = np.zeros((ny - 1, ny))
129127
i, j = np.indices(dcdchords.shape)
@@ -132,17 +130,17 @@ def compute_partials(self, inputs, partials):
132130

133131
partials["CDw", "Mach_number"] = -1 * dCDwdMDD
134132
partials["CDw", "CL"] = dCDwdMDD * dMDDdCL
135-
partials["CDw", "widths"] = dCDwdMDD * dMDDdavg * davgdw
136-
partials["CDw", "cos_sweep"] = dCDwdMDD * dMDDdavg * davgdcos + dCDwdMDD * dMDDdtoc * dtocdcos
133+
partials["CDw", "lengths_spanwise"] = dCDwdMDD * dMDDdavg * davgdw
134+
partials["CDw", "widths"] = dCDwdMDD * dMDDdavg * davgdcos + dCDwdMDD * dMDDdtoc * dtocdcos
137135
partials["CDw", "chords"] = dCDwdMDD * dMDDdavg * np.matmul(
138136
davgdc, dcdchords
139137
) + dCDwdMDD * dMDDdtoc * np.matmul(dtocdc, dcdchords)
140138
partials["CDw", "t_over_c"] = dCDwdMDD * dMDDdtoc * dtocavgdtoc
141139

142140
if self.surface["symmetry"]:
143141
partials["CDw", "CL"][0, :] *= 2
142+
partials["CDw", "lengths_spanwise"][0, :] *= 2
144143
partials["CDw", "widths"][0, :] *= 2
145-
partials["CDw", "cos_sweep"][0, :] *= 2
146144
partials["CDw", "Mach_number"][0, :] *= 2
147145
partials["CDw", "chords"][0, :] *= 2
148146
partials["CDw", "t_over_c"][0, :] *= 2

openaerostruct/integration/aerostruct_groups.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def setup(self):
134134
"aero_geom",
135135
VLMGeometry(surface=surface),
136136
promotes_inputs=["def_mesh"],
137-
promotes_outputs=["b_pts", "widths", "cos_sweep", "lengths", "chords", "normals", "S_ref"],
137+
promotes_outputs=["b_pts", "widths", "lengths_spanwise", "lengths", "chords", "normals", "S_ref"],
138138
)
139139

140140
self.linear_solver = om.LinearRunOnce()
@@ -158,7 +158,7 @@ def setup(self):
158158
"re",
159159
"rho",
160160
"widths",
161-
"cos_sweep",
161+
"lengths_spanwise",
162162
"lengths",
163163
"S_ref",
164164
"sec_forces",
@@ -252,7 +252,7 @@ def setup(self):
252252
self.connect("coupled." + name + ".widths", name + "_perf.widths")
253253
# self.connect('coupled.' + name + '.chords', name + '_perf.chords')
254254
self.connect("coupled." + name + ".lengths", name + "_perf.lengths")
255-
self.connect("coupled." + name + ".cos_sweep", name + "_perf.cos_sweep")
255+
self.connect("coupled." + name + ".lengths_spanwise", name + "_perf.lengths_spanwise")
256256

257257
# Connect parameters from the 'coupled' group to the total performance group.
258258
self.connect("coupled." + name + ".S_ref", "total_perf." + name + "_S_ref")

0 commit comments

Comments
 (0)