1 /**********************************************************************
3 FILENAME: uiuc_coef_drag.cpp
5 ----------------------------------------------------------------------
7 DESCRIPTION: computes aggregated aerodynamic drag coefficient
9 ----------------------------------------------------------------------
13 ----------------------------------------------------------------------
15 REFERENCES: Roskam, Jan. Airplane Flight Dynamics and Automatic
16 Flight Controls, Part I. Lawrence, KS: DARcorporation,
19 ----------------------------------------------------------------------
21 HISTORY: 04/15/2000 initial release
22 10/25/2001 (RD) Added new variables needed for the non-
23 linear Twin Otter model at zero flaps
25 11/12/2001 (RD) Added new variables needed for the non-
26 linear Twin Otter model with flaps
27 (CXfxxf). Zero flap vairables removed.
28 02/13/2002 (RD) Added variables so linear aero model
29 values can be recorded
30 02/18/2002 (RD) Added uiuc_3Dinterp_quick() function
31 for a quicker 3D interpolation. Takes
32 advantage of "nice" data.
34 ----------------------------------------------------------------------
36 AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
37 Jeff Scott <jscott@mail.com>
38 Robert Deters <rdeters@uiuc.edu>
40 ----------------------------------------------------------------------
44 ----------------------------------------------------------------------
48 -drag coefficient components
51 ----------------------------------------------------------------------
55 ----------------------------------------------------------------------
57 CALLED BY: uiuc_coefficients.cpp
59 ----------------------------------------------------------------------
61 CALLS TO: uiuc_1Dinterpolation
67 ----------------------------------------------------------------------
69 COPYRIGHT: (C) 2000 by Michael Selig
71 This program is free software; you can redistribute it and/or
72 modify it under the terms of the GNU General Public License
73 as published by the Free Software Foundation.
75 This program is distributed in the hope that it will be useful,
76 but WITHOUT ANY WARRANTY; without even the implied warranty of
77 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
78 GNU General Public License for more details.
80 You should have received a copy of the GNU General Public License
81 along with this program; if not, write to the Free Software
82 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
83 USA or view http://www.gnu.org/copyleft/gpl.html.
85 **********************************************************************/
87 #include "uiuc_coef_drag.h"
98 command_list = aeroDragParts -> getCommands();
100 for (LIST command_line = command_list.begin(); command_line!=command_list.end(); ++command_line)
102 linetoken1 = aeroDragParts -> getToken(*command_line, 1);
103 linetoken2 = aeroDragParts -> getToken(*command_line, 2);
105 switch (CD_map[linetoken2])
111 CDo = uiuc_ice_filter(CDo_clean,kCDo);
121 CDK = uiuc_ice_filter(CDK_clean,kCDK);
123 CDK_save = CDK * CL * CL;
131 CD_a = uiuc_ice_filter(CD_a_clean,kCD_a);
133 CD_a_save = CD_a * Alpha;
141 CD_adot = uiuc_ice_filter(CD_adot_clean,kCD_adot);
143 /* CD_adot must be mulitplied by cbar/2U
144 (see Roskam Control book, Part 1, pg. 147) */
145 CD_adot_save = CD_adot * Alpha_dot * cbar_2U;
146 CD += CD_adot * Alpha_dot * cbar_2U;
153 CD_q = uiuc_ice_filter(CD_q_clean,kCD_q);
155 /* CD_q must be mulitplied by cbar/2U
156 (see Roskam Control book, Part 1, pg. 147) */
157 /* why multiply by Theta_dot instead of Q_body?
158 see note in coef_lift.cpp */
159 CD_q_save = CD_q * Theta_dot * cbar_2U;
160 CD += CD_q * Theta_dot * cbar_2U;
165 CD_ih_save = fabs(CD_ih * ih);
166 CD += fabs(CD_ih * ih);
173 CD_de = uiuc_ice_filter(CD_de_clean,kCD_de);
175 CD_de_save = fabs(CD_de * elevator);
176 CD += fabs(CD_de * elevator);
181 CDfaI = uiuc_1Dinterpolation(CDfa_aArray,
190 CDfCLI = uiuc_1Dinterpolation(CDfCL_CLArray,
199 CDfdfI = uiuc_1Dinterpolation(CDfdf_dfArray,
208 CDfadeI = uiuc_2Dinterpolation(CDfade_aArray,
220 CDfadfI = uiuc_2Dinterpolation(CDfadf_aArray,
234 CXo = uiuc_ice_filter(CXo_clean,kCXo);
237 CXclean_wing += CXo_clean;
238 CXclean_tail += CXo_clean;
251 CXK = uiuc_ice_filter(CXK_clean,kCXK);
254 CXclean_wing += CXK_clean * CLclean_wing * CLclean_wing;
255 CXclean_tail += CXK_clean * CLclean_tail * CLclean_tail;
256 CXiced_wing += CXK * CLiced_wing * CLiced_wing;
257 CXiced_tail += CXK * CLiced_tail * CLiced_tail;
260 CXK_save = CXK * CZ * CZ;
268 CX_a = uiuc_ice_filter(CX_a_clean,kCX_a);
271 CXclean_wing += CX_a_clean * Alpha;
272 CXclean_tail += CX_a_clean * Alpha;
273 CXiced_wing += CX_a * Alpha;
274 CXiced_tail += CX_a * Alpha;
277 CX_a_save = CX_a * Alpha;
285 CX_a2 = uiuc_ice_filter(CX_a2_clean,kCX_a2);
288 CXclean_wing += CX_a2_clean * Alpha * Alpha;
289 CXclean_tail += CX_a2_clean * Alpha * Alpha;
290 CXiced_wing += CX_a2 * Alpha * Alpha;
291 CXiced_tail += CX_a2 * Alpha * Alpha;
294 CX_a2_save = CX_a2 * Alpha * Alpha;
295 CX += CX_a2 * Alpha * Alpha;
302 CX_a3 = uiuc_ice_filter(CX_a3_clean,kCX_a3);
305 CXclean_wing += CX_a3_clean * Alpha * Alpha * Alpha;
306 CXclean_tail += CX_a3_clean * Alpha * Alpha * Alpha;
307 CXiced_wing += CX_a3 * Alpha * Alpha * Alpha;
308 CXiced_tail += CX_a3 * Alpha * Alpha * Alpha;
311 CX_a3_save = CX_a3 * Alpha * Alpha * Alpha;
312 CX += CX_a3 * Alpha * Alpha * Alpha;
319 CX_adot = uiuc_ice_filter(CX_adot_clean,kCX_adot);
322 CXclean_wing += CX_adot_clean * Alpha_dot * cbar_2U;
323 CXclean_tail += CX_adot_clean * Alpha_dot * ch_2U;
324 CXiced_wing += CX * Alpha_dot * cbar_2U;
325 CXiced_tail += CX * Alpha_dot * ch_2U;
328 /* CX_adot must be mulitplied by cbar/2U
329 (see Roskam Control book, Part 1, pg. 147) */
330 CX_adot_save = CX_adot * Alpha_dot * cbar_2U;
331 CX += CX_adot * Alpha_dot * cbar_2U;
338 CX_q = uiuc_ice_filter(CX_q_clean,kCX_q);
341 CXclean_wing += CX_q_clean * Q_body * cbar_2U;
342 CXclean_tail += CX_q_clean * Q_body * ch_2U;
343 CXiced_wing += CX_q * Q_body * cbar_2U;
344 CXiced_tail += CX_q * Q_body * ch_2U;
347 /* CX_q must be mulitplied by cbar/2U
348 (see Roskam Control book, Part 1, pg. 147) */
349 CX_q_save = CX_q * Q_body * cbar_2U;
350 CX += CX_q * Q_body * cbar_2U;
357 CX_de = uiuc_ice_filter(CX_de_clean,kCX_de);
360 CXclean_wing += CX_de_clean * elevator;
361 CXclean_tail += CX_de_clean * elevator;
362 CXiced_wing += CX_de * elevator;
363 CXiced_tail += CX_de * elevator;
366 CX_de_save = CX_de * elevator;
367 CX += CX_de * elevator;
374 CX_dr = uiuc_ice_filter(CX_dr_clean,kCX_dr);
377 CXclean_wing += CX_dr_clean * rudder;
378 CXclean_tail += CX_dr_clean * rudder;
379 CXiced_wing += CX_dr * rudder;
380 CXiced_tail += CX_dr * rudder;
383 CX_dr_save = CX_dr * rudder;
384 CX += CX_dr * rudder;
391 CX_df = uiuc_ice_filter(CX_df_clean,kCX_df);
394 CXclean_wing += CX_df_clean * flap;
395 CXclean_tail += CX_df_clean * flap;
396 CXiced_wing += CX * flap;
397 CXiced_tail += CX * flap;
400 CX_df_save = CX_df * flap;
408 CX_adf = uiuc_ice_filter(CX_adf_clean,kCX_adf);
411 CXclean_wing += CX_adf_clean * Alpha * flap;
412 CXclean_tail += CX_adf_clean * Alpha * flap;
413 CXiced_wing += CX_adf * Alpha * flap;
414 CXiced_tail += CX_adf * Alpha * flap;
417 CX_adf_save = CX_adf * Alpha * flap;
418 CX += CX_adf * Alpha * flap;
423 if (CXfabetaf_nice == 1)
424 CXfabetafI = uiuc_3Dinterp_quick(CXfabetaf_fArray,
425 CXfabetaf_aArray_nice,
426 CXfabetaf_bArray_nice,
435 CXfabetafI = uiuc_3Dinterpolation(CXfabetaf_fArray,
439 CXfabetaf_nAlphaArray,
450 if (CXfadef_nice == 1)
451 CXfadefI = uiuc_3Dinterp_quick(CXfadef_fArray,
453 CXfadef_deArray_nice,
462 CXfadefI = uiuc_3Dinterpolation(CXfadef_fArray,
477 q_nondim = Q_body * cbar_2U;
478 if (CXfaqf_nice == 1)
479 CXfaqfI = uiuc_3Dinterp_quick(CXfaqf_fArray,
490 CXfaqfI = uiuc_3Dinterpolation(CXfaqf_fArray,
509 // end uiuc_coef_drag.cpp