@@ -67,14 +67,15 @@ def compute(self, inputs, outputs):
6767 chords = inputs ["chords" ]
6868 CL = inputs ["CL" ]
6969
70- mean_chords = (chords [:- 1 ] + chords [1 :]) / 2.0
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
73- avg_t_over_c = np .sum (t_over_c * panel_areas ) / np .sum (panel_areas ) # weighted average of streamwise t/c
70+ panel_mid_chords = (chords [:- 1 ] + chords [1 :]) / 2.0
71+ panel_areas = panel_mid_chords * widths
72+ sum_panel_areas = np .sum (panel_areas )
73+ avg_cos_sweep = np .sum (cos_sweep * panel_areas ) / sum_panel_areas # weighted average of 1/4 chord sweep
74+ avg_t_over_c = np .sum (t_over_c * panel_areas ) / sum_panel_areas # weighted average of streamwise t/c
7475 MDD = self .ka / avg_cos_sweep - avg_t_over_c / avg_cos_sweep ** 2 - CL / (10 * avg_cos_sweep ** 3 )
7576 Mcrit = MDD - (0.1 / 80.0 ) ** (1.0 / 3.0 )
7677
77- if M > Mcrit :
78+ if np . real ( M ) > np . real ( Mcrit ) :
7879 outputs ["CDw" ] = 20 * (M - Mcrit ) ** 4
7980 else :
8081 outputs ["CDw" ] = 0.0
@@ -86,6 +87,14 @@ def compute(self, inputs, outputs):
8687
8788 def compute_partials (self , inputs , partials ):
8889 """Jacobian for wave drag."""
90+ # Explicitly zero out the partials to begin, we can't assume the input partials arrays contain zeros already
91+ partials ["CDw" , "CL" ][:] = 0.0
92+ partials ["CDw" , "lengths_spanwise" ][:] = 0.0
93+ partials ["CDw" , "widths" ][:] = 0.0
94+ partials ["CDw" , "Mach_number" ][:] = 0.0
95+ partials ["CDw" , "chords" ][:] = 0.0
96+ partials ["CDw" , "t_over_c" ][:] = 0.0
97+
8998 if self .with_wave :
9099 ny = self .surface ["mesh" ].shape [1 ]
91100 t_over_c = inputs ["t_over_c" ]
@@ -96,16 +105,16 @@ def compute_partials(self, inputs, partials):
96105 chords = inputs ["chords" ]
97106 CL = inputs ["CL" ]
98107
99- chords = (chords [:- 1 ] + chords [1 :]) / 2.0
100- panel_areas = chords * widths
108+ panel_mid_chords = (chords [:- 1 ] + chords [1 :]) / 2.0
109+ panel_areas = panel_mid_chords * widths
101110 sum_panel_areas = np .sum (panel_areas )
102111 avg_cos_sweep = np .sum (cos_sweep * panel_areas ) / sum_panel_areas
103112 avg_t_over_c = np .sum (t_over_c * panel_areas ) / sum_panel_areas
104113
105- MDD = 0.95 / avg_cos_sweep - avg_t_over_c / avg_cos_sweep ** 2 - CL / (10 * avg_cos_sweep ** 3 )
114+ MDD = self . ka / avg_cos_sweep - avg_t_over_c / avg_cos_sweep ** 2 - CL / (10 * avg_cos_sweep ** 3 )
106115 Mcrit = MDD - (0.1 / 80.0 ) ** (1.0 / 3.0 )
107116
108- if M > Mcrit :
117+ if np . real ( M ) > np . real ( Mcrit ) :
109118 dCDwdMDD = - 80 * (M - Mcrit ) ** 3
110119 dMDDdCL = - 1.0 / (10 * avg_cos_sweep ** 3 )
111120 dMDDdavg = (- 10 * self .ka * avg_cos_sweep ** 2 + 20 * avg_t_over_c * avg_cos_sweep + 3 * CL ) / (
@@ -114,14 +123,19 @@ def compute_partials(self, inputs, partials):
114123 dMDDdtoc = - 1.0 / (avg_cos_sweep ** 2 )
115124 dtocavgdtoc = panel_areas / sum_panel_areas
116125
117- ccos = np .sum (widths * chords )
118- ccos2w = np .sum (chords * widths ** 2 / lengths_spanwise )
126+ ccos = np .sum (widths * panel_mid_chords )
127+ ccos2w = np .sum (panel_mid_chords * widths ** 2 / lengths_spanwise )
119128
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
129+ davgdcos = (
130+ 2 * panel_mid_chords * widths / lengths_spanwise / ccos - panel_mid_chords * ccos2w / ccos ** 2
131+ )
132+ dtocdcos = (
133+ panel_mid_chords * t_over_c / ccos
134+ - panel_mid_chords * np .sum (panel_mid_chords * widths * t_over_c ) / ccos ** 2
135+ )
136+ davgdw = - 1 * panel_mid_chords * widths ** 2 / lengths_spanwise ** 2 / ccos
123137 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
138+ dtocdc = t_over_c * widths / ccos - widths * np .sum (panel_mid_chords * widths * t_over_c ) / ccos ** 2
125139
126140 dcdchords = np .zeros ((ny - 1 , ny ))
127141 i , j = np .indices (dcdchords .shape )
0 commit comments