]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/UIUCModel/uiuc_coef_drag.cpp
Port over remaining Point3D usage to the more type and unit safe SG* classes.
[flightgear.git] / src / FDM / UIUCModel / uiuc_coef_drag.cpp
index e35cbdce537bf0462742c0ebe114886c7b450a40..38cfb3192b8b0740a9a99176ba105e1a7699e741 100644 (file)
 ----------------------------------------------------------------------
 
  HISTORY:      04/15/2000   initial release
+               10/25/2001   (RD) Added new variables needed for the non-
+                           linear Twin Otter model at zero flaps
+                           (CXfxxf0)
+              11/12/2001   (RD) Added new variables needed for the non-
+                           linear Twin Otter model with flaps
+                           (CXfxxf).  Zero flap vairables removed.
+              02/13/2002   (RD) Added variables so linear aero model
+                           values can be recorded
+              02/18/2002   (RD) Added uiuc_3Dinterp_quick() function
+                           for a quicker 3D interpolation.  Takes
+                           advantage of "nice" data.
 
 ----------------------------------------------------------------------
 
  AUTHOR(S):    Bipin Sehgal       <bsehgal@uiuc.edu>
-               Jeff Scott         <jscott@mail.com>
+               Jeff Scott         http://www.jeffscott.net/
+              Robert Deters      <rdeters@uiuc.edu>
 
 ----------------------------------------------------------------------
 
@@ -49,6 +61,8 @@
  CALLS TO:     uiuc_1Dinterpolation
                uiuc_2Dinterpolation
                uiuc_ice_filter
+              uiuc_3Dinterpolation
+              uiuc_3Dinterp_quick
 
 ----------------------------------------------------------------------
 
 
  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- USA or view http://www.gnu.org/copyleft/gpl.html.
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 **********************************************************************/
 
 #include "uiuc_coef_drag.h"
-
+#include <math.h>
 
 void uiuc_coef_drag()
 {
   string linetoken1;
   string linetoken2;
   stack command_list;
-  
+
+  double q_nondim;
+
   command_list = aeroDragParts -> getCommands();
   
   for (LIST command_line = command_list.begin(); command_line!=command_list.end(); ++command_line)
@@ -94,7 +109,8 @@ void uiuc_coef_drag()
               {
                 CDo = uiuc_ice_filter(CDo_clean,kCDo);
               }
-            CD += CDo;
+           CDo_save = CDo;
+            CD += CDo_save;
             break;
           }
         case CDK_flag:
@@ -103,7 +119,15 @@ void uiuc_coef_drag()
               {
                 CDK = uiuc_ice_filter(CDK_clean,kCDK);
               }
-            CD += CDK * CL * CL;
+           if (b_CLK)
+             {
+               CDK_save = CDK * (CL - CLK) * (CL - CLK);
+             }
+           else
+             {
+               CDK_save = CDK * CL * CL;
+             }
+            CD += CDK_save;
             break;
           }
         case CD_a_flag:
@@ -112,7 +136,8 @@ void uiuc_coef_drag()
               {
                 CD_a = uiuc_ice_filter(CD_a_clean,kCD_a);
               }
-            CD += CD_a * Alpha;
+           CD_a_save = CD_a * Std_Alpha;
+            CD += CD_a_save;
             break;
           }
         case CD_adot_flag:
@@ -123,7 +148,8 @@ void uiuc_coef_drag()
               }
             /* CD_adot must be mulitplied by cbar/2U 
                (see Roskam Control book, Part 1, pg. 147) */
-            CD += CD_adot * Alpha_dot * cbar_2U;
+           CD_adot_save = CD_adot * Std_Alpha_dot * cbar_2U;
+            CD += CD_adot_save;
             break;
           }
         case CD_q_flag:
@@ -136,12 +162,14 @@ void uiuc_coef_drag()
                (see Roskam Control book, Part 1, pg. 147) */
             /* why multiply by Theta_dot instead of Q_body? 
                see note in coef_lift.cpp */
-            CD += CD_q * Theta_dot * cbar_2U;
+           CD_q_save = CD_q * Theta_dot * cbar_2U;
+            CD += CD_q_save;
             break;
           }
         case CD_ih_flag:
           {
-            CD += CD_ih * ih;
+           CD_ih_save = fabs(CD_ih * ih);
+            CD += CD_ih_save;
             break;
           }
         case CD_de_flag:
@@ -150,7 +178,44 @@ void uiuc_coef_drag()
               {
                 CD_de = uiuc_ice_filter(CD_de_clean,kCD_de);
               }
-            CD += CD_de * elevator;
+           CD_de_save = fabs(CD_de * elevator);
+            CD += CD_de_save;
+            break;
+          }
+        case CD_dr_flag:
+          {
+           CD_dr_save = fabs(CD_dr * rudder);
+           CD += CD_dr_save;
+            break;
+          }
+        case CD_da_flag:
+          {
+           CD_da_save = fabs(CD_da * aileron);
+            CD += CD_da_save;
+            break;
+          }
+        case CD_beta_flag:
+          {
+           CD_beta_save = fabs(CD_beta * Std_Beta);
+            CD += CD_beta_save;
+            break;
+          }
+        case CD_df_flag:
+          {
+           CD_df_save = fabs(CD_df * flap_pos);
+            CD += CD_df_save;
+            break;
+          }
+        case CD_ds_flag:
+          {
+           CD_ds_save = fabs(CD_ds * spoiler_pos);
+            CD += CD_ds_save;
+            break;
+          }
+        case CD_dg_flag:
+          {
+           CD_dg_save = fabs(CD_dg * gear_pos_norm);
+            CD += CD_dg_save;
             break;
           }
         case CDfa_flag:
@@ -158,7 +223,7 @@ void uiuc_coef_drag()
             CDfaI = uiuc_1Dinterpolation(CDfa_aArray,
                                          CDfa_CDArray,
                                          CDfa_nAlpha,
-                                         Alpha);
+                                         Std_Alpha);
             CD += CDfaI;
             break;
           }
@@ -176,7 +241,7 @@ void uiuc_coef_drag()
             CDfdfI = uiuc_1Dinterpolation(CDfdf_dfArray,
                                           CDfdf_CDArray,
                                           CDfdf_ndf,
-                                          flap);
+                                          flap_pos);
             CD += CDfdfI;
             break;
           }
@@ -187,7 +252,7 @@ void uiuc_coef_drag()
                                            CDfade_CDArray,
                                            CDfade_nAlphaArray,
                                            CDfade_nde,
-                                           Alpha,
+                                           Std_Alpha,
                                            elevator);
                   CD += CDfadeI;
                   break;
@@ -199,8 +264,8 @@ void uiuc_coef_drag()
                                            CDfadf_CDArray,
                                            CDfadf_nAlphaArray,
                                            CDfadf_ndf,
-                                           Alpha,
-                                           flap);
+                                           Std_Alpha,
+                                           flap_pos);
             CD += CDfadfI;
             break;
           }
@@ -217,7 +282,8 @@ void uiuc_coef_drag()
                     CXiced_tail += CXo;
                   }
               }
-            CX += CXo;
+           CXo_save = CXo;
+            CX += CXo_save;
             break;
           }
         case CXK_flag:
@@ -233,7 +299,8 @@ void uiuc_coef_drag()
                     CXiced_tail += CXK * CLiced_tail * CLiced_tail;
                   }
               }
-            CX += CXK * CZ * CZ;
+           CXK_save = CXK * CZ * CZ;
+            CX += CXK_save;
             break;
           }
         case CX_a_flag:
@@ -243,13 +310,14 @@ void uiuc_coef_drag()
                 CX_a = uiuc_ice_filter(CX_a_clean,kCX_a);
                 if (beta_model)
                   {
-                    CXclean_wing += CX_a_clean * Alpha;
-                    CXclean_tail += CX_a_clean * Alpha;
-                    CXiced_wing += CX_a * Alpha;
-                    CXiced_tail += CX_a * Alpha;
+                    CXclean_wing += CX_a_clean * Std_Alpha;
+                    CXclean_tail += CX_a_clean * Std_Alpha;
+                    CXiced_wing += CX_a * Std_Alpha;
+                    CXiced_tail += CX_a * Std_Alpha;
                   }
               }
-            CX += CX_a * Alpha;
+           CX_a_save = CX_a * Std_Alpha;
+            CX += CX_a_save;
             break;
           }
         case CX_a2_flag:
@@ -259,13 +327,14 @@ void uiuc_coef_drag()
                 CX_a2 = uiuc_ice_filter(CX_a2_clean,kCX_a2);
                 if (beta_model)
                   {
-                    CXclean_wing += CX_a2_clean * Alpha * Alpha;
-                    CXclean_tail += CX_a2_clean * Alpha * Alpha;
-                    CXiced_wing += CX_a2 * Alpha * Alpha;
-                    CXiced_tail += CX_a2 * Alpha * Alpha;
+                    CXclean_wing += CX_a2_clean * Std_Alpha * Std_Alpha;
+                    CXclean_tail += CX_a2_clean * Std_Alpha * Std_Alpha;
+                    CXiced_wing += CX_a2 * Std_Alpha * Std_Alpha;
+                    CXiced_tail += CX_a2 * Std_Alpha * Std_Alpha;
                   }
               }
-            CX += CX_a2 * Alpha * Alpha;
+           CX_a2_save = CX_a2 * Std_Alpha * Std_Alpha;
+            CX += CX_a2_save;
             break;
           }
         case CX_a3_flag:
@@ -275,13 +344,14 @@ void uiuc_coef_drag()
                 CX_a3 = uiuc_ice_filter(CX_a3_clean,kCX_a3);
                 if (beta_model)
                   {
-                    CXclean_wing += CX_a3_clean * Alpha * Alpha * Alpha;
-                    CXclean_tail += CX_a3_clean * Alpha * Alpha * Alpha;
-                    CXiced_wing += CX_a3 * Alpha * Alpha * Alpha;
-                    CXiced_tail += CX_a3 * Alpha * Alpha * Alpha;
+                    CXclean_wing += CX_a3_clean * Std_Alpha * Std_Alpha * Std_Alpha;
+                    CXclean_tail += CX_a3_clean * Std_Alpha * Std_Alpha * Std_Alpha;
+                    CXiced_wing += CX_a3 * Std_Alpha * Std_Alpha * Std_Alpha;
+                    CXiced_tail += CX_a3 * Std_Alpha * Std_Alpha * Std_Alpha;
                   }
               }
-            CX += CX_a3 * Alpha * Alpha * Alpha;
+           CX_a3_save = CX_a3 * Std_Alpha * Std_Alpha * Std_Alpha;
+            CX += CX_a3_save;
             break;
           }
         case CX_adot_flag:
@@ -291,15 +361,16 @@ void uiuc_coef_drag()
                 CX_adot = uiuc_ice_filter(CX_adot_clean,kCX_adot);
                 if (beta_model)
                   {
-                    CXclean_wing += CX_adot_clean * Alpha_dot * cbar_2U;
-                    CXclean_tail += CX_adot_clean * Alpha_dot * ch_2U;
-                    CXiced_wing += CX * Alpha_dot * cbar_2U;
-                    CXiced_tail += CX * Alpha_dot * ch_2U;
+                    CXclean_wing += CX_adot_clean * Std_Alpha_dot * cbar_2U;
+                    CXclean_tail += CX_adot_clean * Std_Alpha_dot * ch_2U;
+                    CXiced_wing += CX * Std_Alpha_dot * cbar_2U;
+                    CXiced_tail += CX * Std_Alpha_dot * ch_2U;
                   }
               }
             /* CX_adot must be mulitplied by cbar/2U 
                (see Roskam Control book, Part 1, pg. 147) */
-            CX += CX_adot * Alpha_dot * cbar_2U;
+           CX_adot_save = CX_adot * Std_Alpha_dot * cbar_2U;
+            CX += CX_adot_save;
             break;
           }
         case CX_q_flag:
@@ -317,7 +388,8 @@ void uiuc_coef_drag()
               }
             /* CX_q must be mulitplied by cbar/2U 
                (see Roskam Control book, Part 1, pg. 147) */
-            CX += CX_q * Q_body * cbar_2U;
+           CX_q_save = CX_q * Q_body * cbar_2U;
+            CX += CX_q_save;
             break;
           }
         case CX_de_flag:
@@ -333,7 +405,8 @@ void uiuc_coef_drag()
                     CXiced_tail += CX_de * elevator;
                   }
               }
-            CX += CX_de * elevator;
+           CX_de_save = CX_de * elevator;
+            CX += CX_de_save;
             break;
           }
         case CX_dr_flag:
@@ -349,7 +422,8 @@ void uiuc_coef_drag()
                     CXiced_tail += CX_dr * rudder;
                   }
               }
-            CX += CX_dr * rudder;
+           CX_dr_save = CX_dr * rudder;
+            CX += CX_dr_save;
             break;
           }
         case CX_df_flag:
@@ -359,13 +433,14 @@ void uiuc_coef_drag()
                 CX_df = uiuc_ice_filter(CX_df_clean,kCX_df);
                 if (beta_model)
                   {
-                    CXclean_wing += CX_df_clean * flap;
-                    CXclean_tail += CX_df_clean * flap;
-                    CXiced_wing += CX * flap;
-                    CXiced_tail += CX * flap;
+                    CXclean_wing += CX_df_clean * flap_pos;
+                    CXclean_tail += CX_df_clean * flap_pos;
+                    CXiced_wing += CX * flap_pos;
+                    CXiced_tail += CX * flap_pos;
                   }
               }
-            CX += CX_df * flap;
+           CX_df_save = CX_df * flap_pos;
+            CX += CX_df_save;
             break;
           }
         case CX_adf_flag:
@@ -375,13 +450,120 @@ void uiuc_coef_drag()
                 CX_adf = uiuc_ice_filter(CX_adf_clean,kCX_adf);
                 if (beta_model)
                   {
-                    CXclean_wing += CX_adf_clean * Alpha * flap;
-                    CXclean_tail += CX_adf_clean * Alpha * flap;
-                    CXiced_wing += CX_adf * Alpha * flap;
-                    CXiced_tail += CX_adf * Alpha * flap;
+                    CXclean_wing += CX_adf_clean * Std_Alpha * flap_pos;
+                    CXclean_tail += CX_adf_clean * Std_Alpha * flap_pos;
+                    CXiced_wing += CX_adf * Std_Alpha * flap_pos;
+                    CXiced_tail += CX_adf * Std_Alpha * flap_pos;
                   }
               }
-            CX += CX_adf * Alpha * flap;
+           CX_adf_save = CX_adf * Std_Alpha * flap_pos;
+            CX += CX_adf_save;
+            break;
+          }
+        case CXfabetaf_flag:
+          {
+           if (CXfabetaf_nice == 1) {
+             CXfabetafI = uiuc_3Dinterp_quick(CXfabetaf_fArray,
+                                              CXfabetaf_aArray_nice,
+                                              CXfabetaf_bArray_nice,
+                                              CXfabetaf_CXArray,
+                                              CXfabetaf_na_nice,
+                                              CXfabetaf_nb_nice,
+                                              CXfabetaf_nf,
+                                              flap_pos,
+                                              Std_Alpha,
+                                              Std_Beta);
+             // temp until Jim's code works
+             //CXo = uiuc_3Dinterp_quick(CXfabetaf_fArray,
+             //                         CXfabetaf_aArray_nice,
+             //                         CXfabetaf_bArray_nice,
+             //                         CXfabetaf_CXArray,
+             //                         CXfabetaf_na_nice,
+             //                         CXfabetaf_nb_nice,
+             //                         CXfabetaf_nf,
+             //                         flap_pos,
+             //                         0.0,
+             //                         Std_Beta); 
+           }
+           else {
+             CXfabetafI = uiuc_3Dinterpolation(CXfabetaf_fArray,
+                                               CXfabetaf_aArray,
+                                               CXfabetaf_betaArray,
+                                               CXfabetaf_CXArray,
+                                               CXfabetaf_nAlphaArray,
+                                               CXfabetaf_nbeta,
+                                               CXfabetaf_nf,
+                                               flap_pos,
+                                               Std_Alpha,
+                                               Std_Beta);
+             // temp until Jim's code works
+             //CXo = uiuc_3Dinterpolation(CXfabetaf_fArray,
+             //                          CXfabetaf_aArray,
+             //                          CXfabetaf_betaArray,
+             //                          CXfabetaf_CXArray,
+             //                          CXfabetaf_nAlphaArray,
+             //                          CXfabetaf_nbeta,
+             //                          CXfabetaf_nf,
+             //                          flap_pos,
+             //                          0.0,
+             //                          Std_Beta); 
+           }
+           CX += CXfabetafI;
+            break;
+          }
+        case CXfadef_flag:
+          {
+           if (CXfadef_nice == 1)
+             CXfadefI = uiuc_3Dinterp_quick(CXfadef_fArray,
+                                            CXfadef_aArray_nice,
+                                            CXfadef_deArray_nice,
+                                            CXfadef_CXArray,
+                                            CXfadef_na_nice,
+                                            CXfadef_nde_nice,
+                                            CXfadef_nf,
+                                            flap_pos,
+                                            Std_Alpha,
+                                            elevator);
+           else
+             CXfadefI = uiuc_3Dinterpolation(CXfadef_fArray,
+                                             CXfadef_aArray,
+                                             CXfadef_deArray,
+                                             CXfadef_CXArray,
+                                             CXfadef_nAlphaArray,
+                                             CXfadef_nde,
+                                             CXfadef_nf,
+                                             flap_pos,
+                                             Std_Alpha,
+                                             elevator);
+            CX += CXfadefI;
+            break;
+          }
+        case CXfaqf_flag:
+          {
+           q_nondim = Q_body * cbar_2U;
+           if (CXfaqf_nice == 1)
+             CXfaqfI = uiuc_3Dinterp_quick(CXfaqf_fArray,
+                                           CXfaqf_aArray_nice,
+                                           CXfaqf_qArray_nice,
+                                           CXfaqf_CXArray,
+                                           CXfaqf_na_nice,
+                                           CXfaqf_nq_nice,
+                                           CXfaqf_nf,
+                                           flap_pos,
+                                           Std_Alpha,
+                                           q_nondim);
+           else
+             CXfaqfI = uiuc_3Dinterpolation(CXfaqf_fArray,
+                                            CXfaqf_aArray,
+                                            CXfaqf_qArray,
+                                            CXfaqf_CXArray,
+                                            CXfaqf_nAlphaArray,
+                                            CXfaqf_nq,
+                                            CXfaqf_nf,
+                                            flap_pos,
+                                            Std_Alpha,
+                                            q_nondim);
+            CX += CXfaqfI;
             break;
           }
         };