]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/UIUCModel/uiuc_coefficients.cpp
Port over remaining Point3D usage to the more type and unit safe SG* classes.
[flightgear.git] / src / FDM / UIUCModel / uiuc_coefficients.cpp
index 38ff7b2433c6b054f9a887bfe8af7e922103ad15..d56c2f40934f5d8bd544699932120132a62cd67a 100644 (file)
@@ -12,9 +12,7 @@
 
 ----------------------------------------------------------------------
 
- REFERENCES:   Roskam, Jan.  Airplane Flight Dynamics and Automatic
-               Flight Controls, Part I.  Lawrence, KS: DARcorporation,
-               1995.
+ REFERENCES:   
 
 ----------------------------------------------------------------------
 
                             function from CLfade, CDfade, Cmfade, 
                             CYfada, CYfbetadr, Clfada, Clfbetadr, 
                             Cnfada, and Cnfbetadr switches
-
+              04/15/2000   (JS) broke up into multiple 
+                           uiuc_coef_xxx functions
+              06/18/2001   (RD) Added initialization of Std_Alpha and
+                           Std_Beta.  Added aileron_input and rudder_input.
+                           Added pilot_elev_no, pilot_ail_no, and
+                           pilot_rud_no.
+              07/05/2001   (RD) Added pilot_(elev,ail,rud)_no=false
+              01/11/2002   (AP) Added call to uiuc_iceboot()
+               12/02/2002   (RD) Moved icing demo interpolations to its
+                            own function
+              
 ----------------------------------------------------------------------
 
  AUTHOR(S):    Bipin Sehgal       <bsehgal@uiuc.edu>
                Jeff Scott         <jscott@mail.com>
-
+              Robert Deters      <rdeters@uiuc.edu>
+              Ann Peedikayil     <peedikay@uiuc.edu>
 ----------------------------------------------------------------------
 
  VARIABLES:
 
 ----------------------------------------------------------------------
 
- INPUTS:       -Alpha
-               -aileron
-               -elevator
-               -rudder
-               -coefficient components
+ INPUTS:       -V_rel_wind (or U_body)
+               -dyn_on_speed
+               -ice on/off
+              -phugoid on/off
 
 ----------------------------------------------------------------------
 
 
 ----------------------------------------------------------------------
 
- CALLED BY:    ?
+ CALLED BY:    uiuc_wrapper
 
 ----------------------------------------------------------------------
 
- CALLS TO:     uiuc_1Dinterpolation
-               uiuc_2Dinterpolation
-               uiuc_ice
+ CALLS TO:     uiuc_coef_lift
+               uiuc_coef_drag
+               uiuc_coef_pitch
+               uiuc_coef_sideforce
+               uiuc_coef_roll
+               uiuc_coef_yaw
+              uiuc_controlInput
 
 ----------------------------------------------------------------------
 
 
  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_coefficients.h"
 
+void uiuc_coefficients(double dt)
+{
+  static string uiuc_coefficients_error = " (from uiuc_coefficients.cpp) ";
+  double l_trim, l_defl;
+  double V_rel_wind_dum, U_body_dum;
 
-/* set speed at which dynamic pressure terms will be accounted for
-   since if velocity is too small, coefficients will go to infinity */
+  if (Alpha_init_true && Simtime==0)
+    Std_Alpha = Alpha_init;
 
-#define ON_VELOCITY 33 /* 20 kts */
+  if (Beta_init_true && Simtime==0)
+    Std_Beta = Beta_init;
 
+  // calculate rate derivative nondimensionalization factors
+  // check if speed is sufficient to compute dynamic pressure terms
+  if (dyn_on_speed==0) 
+    {
+      uiuc_warnings_errors(5, uiuc_coefficients_error);
+    }
+  if (nondim_rate_V_rel_wind || use_V_rel_wind_2U)         // c172_aero uses V_rel_wind
+    {
+      if (V_rel_wind > dyn_on_speed)
+       {
+         cbar_2U = cbar / (2.0 * V_rel_wind);
+         b_2U    = bw /   (2.0 * V_rel_wind);
+         // chord_h is the horizontal tail chord
+         ch_2U   = chord_h /   (2.0 * V_rel_wind);
+       }
+      else if (use_dyn_on_speed_curve1)
+       {
+         V_rel_wind_dum = dyn_on_speed_zero + V_rel_wind * (dyn_on_speed - dyn_on_speed_zero)/dyn_on_speed;
+         cbar_2U        = cbar / (2.0 * V_rel_wind_dum);
+         b_2U           = bw /   (2.0 * V_rel_wind_dum);
+         ch_2U          = chord_h /   (2.0 * V_rel_wind_dum);
+         Std_Alpha_dot      = 0.0;
+       }
+      else
+       {
+         cbar_2U   = 0.0;
+         b_2U      = 0.0;
+         ch_2U     = 0.0;
+         Std_Alpha_dot = 0.0;
+       }
+    }
+  else if(use_abs_U_body_2U)      // use absolute(U_body)
+    {
+      if (fabs(U_body) > dyn_on_speed)
+       {
+         cbar_2U = cbar / (2.0 * fabs(U_body));
+         b_2U    = bw /   (2.0 * fabs(U_body));
+         ch_2U   = chord_h /   (2.0 * fabs(U_body));
+       }
+      else if (use_dyn_on_speed_curve1)
+       {
+         U_body_dum = dyn_on_speed_zero + fabs(U_body) * (dyn_on_speed - dyn_on_speed_zero)/dyn_on_speed;
+         cbar_2U    = cbar / (2.0 * U_body_dum);
+         b_2U       = bw /   (2.0 * U_body_dum);
+         ch_2U      = chord_h /   (2.0 * U_body_dum);
+         Std_Alpha_dot  = 0.0;
+       }
+      else
+       {
+         cbar_2U   = 0.0;
+         b_2U      = 0.0;
+         ch_2U     = 0.0;
+         Std_Alpha_dot = 0.0;
+       }
+    }
+  else      // use U_body
+    {
+      if (U_body > dyn_on_speed)
+       {
+         cbar_2U = cbar / (2.0 * U_body);
+         b_2U    = bw /   (2.0 * U_body);
+         ch_2U   = chord_h /   (2.0 * U_body);
+       }
+      else if (use_dyn_on_speed_curve1)
+       {
+         U_body_dum = dyn_on_speed_zero + U_body * (dyn_on_speed - dyn_on_speed_zero)/dyn_on_speed;
+         cbar_2U    = cbar / (2.0 * U_body_dum);
+         b_2U       = bw /   (2.0 * U_body_dum);
+         ch_2U      = chord_h /   (2.0 * U_body_dum);
+         Std_Alpha_dot  = 0.0;
+         beta_flow_clean_tail = cbar_2U;
+       }
+      else
+       {
+         cbar_2U   = 0.0;
+         b_2U      = 0.0;
+         ch_2U     = 0.0;
+         Std_Alpha_dot = 0.0;
+       }
+    }
 
-void uiuc_coefficients()
-{
-  string linetoken1;
-  string linetoken2;
-  stack command_list;
-  double cbar_2U = 0, b_2U = 0;
-  double slope = 0;
-  bool ice_on = false;
-  
-  // determine if speed is sufficient to compute dynamic pressure
-  if (U_body > ON_VELOCITY)
+  // check if speed is sufficient to "trust" Std_Alpha_dot value
+  if (use_Alpha_dot_on_speed)
     {
-      cbar_2U = cbar / (2.0 * U_body);
-      b_2U = bw / (2.0 * U_body);
+      if (V_rel_wind     < Alpha_dot_on_speed)
+         Std_Alpha_dot = 0.0;
     }
-  else
+
+
+  // check to see if icing model engaged
+  if (ice_model)
+    {
+      uiuc_iceboot(dt);
+      uiuc_ice_eta();
+    }
+
+  // check to see if data files are used for control deflections
+  if (outside_control == false)
+    {
+      pilot_elev_no = false;
+      pilot_ail_no = false;
+      pilot_rud_no = false;
+    }
+  if (elevator_step || elevator_singlet || elevator_doublet || elevator_input || aileron_input || rudder_input || flap_pos_input)
     {
-      cbar_2U = 0.0;
-      b_2U = 0.0;
+      uiuc_controlInput();
     }
 
-  //check to see if icing model engaged and set flag
-  if (Simtime >= iceTime)
+  //if (Simtime >=10.0)
+  //  {
+  //    ap_hh_on = 1;
+  //    ap_Psi_ref_rad = 0*DEG_TO_RAD;
+  //  }
+
+  if (ap_pah_on || ap_alh_on || ap_rah_on || ap_hh_on)
+    {
+      uiuc_auto_pilot(dt);
+    }
+
+  CD = CX = CL = CZ = Cm = CY = Cl = Cn = 0.0;
+  CLclean_wing = CLiced_wing = CLclean_tail = CLiced_tail = 0.0;
+  CZclean_wing = CZiced_wing = CZclean_tail = CZiced_tail = 0.0;
+  CXclean_wing = CXiced_wing = CXclean_tail = CXiced_tail = 0.0;
+  CL_clean = CL_iced = 0.0;
+  CY_clean = CY_iced = 0.0;
+  CD_clean = CD_iced = 0.0;
+  Cm_iced = Cm_clean = 0.0;
+  Cl_iced = Cl_clean = 0.0;
+  Cn_iced = Cn_clean = 0.0;
+
+  uiuc_coef_lift();
+  uiuc_coef_drag();
+  uiuc_coef_pitch();
+  uiuc_coef_sideforce();
+  uiuc_coef_roll();
+  uiuc_coef_yaw();
+
+  //uncomment next line to always run icing functions
+  //nonlin_ice_case = 1;
+
+  if (nonlin_ice_case)
     {
-      ice_on = true;
+      if (eta_from_file)
+       {
+         if (eta_tail_input) {
+           double time = Simtime - eta_tail_input_startTime;
+           eta_tail = uiuc_1Dinterpolation(eta_tail_input_timeArray,
+                                           eta_tail_input_daArray,
+                                           eta_tail_input_ntime,
+                                           time);
+         }
+         if (eta_wing_left_input) {
+           double time = Simtime - eta_wing_left_input_startTime;
+           eta_wing_left = uiuc_1Dinterpolation(eta_wing_left_input_timeArray,
+                                                eta_wing_left_input_daArray,
+                                                eta_wing_left_input_ntime,
+                                                time);
+         }
+         if (eta_wing_right_input) {
+           double time = Simtime - eta_wing_right_input_startTime;
+           eta_wing_right = uiuc_1Dinterpolation(eta_wing_right_input_timeArray,
+                                                 eta_wing_right_input_daArray,
+                                                 eta_wing_right_input_ntime,
+                                                 time);
+         }
+       }
+
+      delta_CL = delta_CD = delta_Cm = delta_Cl = delta_Cn = 0.0;
+      Calc_Iced_Forces();
+      add_ice_effects();
+      tactilefadefI = 0.0;
+      if (eta_tail == 0.2 && tactile_pitch && tactilefadef)
+       {
+         if (tactilefadef_nice == 1)
+           tactilefadefI = uiuc_3Dinterp_quick(tactilefadef_fArray,
+                                          tactilefadef_aArray_nice,
+                                          tactilefadef_deArray_nice,
+                                          tactilefadef_tactileArray,
+                                          tactilefadef_na_nice,
+                                          tactilefadef_nde_nice,
+                                          tactilefadef_nf,
+                                          flap_pos,
+                                          Std_Alpha,
+                                          elevator);
+         else
+           tactilefadefI = uiuc_3Dinterpolation(tactilefadef_fArray,
+                                           tactilefadef_aArray,
+                                           tactilefadef_deArray,
+                                           tactilefadef_tactileArray,
+                                           tactilefadef_nAlphaArray,
+                                           tactilefadef_nde,
+                                           tactilefadef_nf,
+                                           flap_pos,
+                                           Std_Alpha,
+                                           elevator);
+       }
+      else if (demo_tactile)
+       {
+         double time = Simtime - demo_tactile_startTime;
+         tactilefadefI = uiuc_1Dinterpolation(demo_tactile_timeArray,
+                                              demo_tactile_daArray,
+                                              demo_tactile_ntime,
+                                              time);
+       }
+      if (icing_demo)
+       uiuc_icing_demo();
     }
 
-  // slowly increase icing severity over period of transientTime
-  if (Simtime >= iceTime && Simtime < (iceTime + transientTime))
+  if (pilot_ail_no)
     {
-      slope = eta_final / transientTime;
-      eta = slope * (Simtime - iceTime);
+      if (aileron <=0)
+       Lat_control = - aileron / damax * RAD_TO_DEG;
+      else
+       Lat_control = - aileron / damin * RAD_TO_DEG;
     }
-  else
+
+  // can go past real limits
+  // add flag to behave like trim_case2 later
+  if (pilot_elev_no)
     {
-      eta = eta_final;
+      if (outside_control == false)
+       {
+         l_trim = elevator_tab;
+         l_defl = elevator - elevator_tab;
+         if (l_trim <=0 )
+           Long_trim = l_trim / demax * RAD_TO_DEG;
+         else
+           Long_trim = l_trim / demin * RAD_TO_DEG;
+         if (l_defl <= 0)
+           Long_control = l_defl / demax * RAD_TO_DEG;
+         else
+           Long_control = l_defl / demin * RAD_TO_DEG;
+       }
     }
 
-  CL = CD = Cm = CY = Cl = Cn = 0.0;
-  command_list = aeroParts -> getCommands();
-  
-  
-  for (LIST command_line = command_list.begin(); command_line!=command_list.end(); ++command_line)
+  if (pilot_rud_no)
     {
-      linetoken1 = aeroParts -> getToken(*command_line, 1); // function parameters gettoken(string,tokenNo);
-      linetoken2 = aeroParts -> getToken(*command_line, 2); // 2 represents token No 2
-
-      switch (Keyword_map[linetoken1])
-        {
-        case CD_flag:
-          {
-            switch(CD_map[linetoken2])
-              {
-              case CDo_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CDo = uiuc_ice(CDo_clean,kCDo,eta);
-                    }
-                  CD += CDo;
-                  break;
-                }
-              case CDK_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CDK = uiuc_ice(CDK_clean,kCDK,eta);
-                    }
-                  CD += CDK * CL * CL;
-                  break;
-                }
-              case CD_a_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CD_a = uiuc_ice(CD_a_clean,kCD_a,eta);
-                    }
-                  CD += CD_a * Alpha;
-                  break;
-                }
-              case CD_de_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CD_de = uiuc_ice(CD_de_clean,kCD_de,eta);
-                    }
-                  CD += CD_de * elevator;
-                  break;
-                }
-              case CDfa_flag:
-                {
-                  CDfaI = uiuc_1Dinterpolation(CDfa_aArray,
-                                               CDfa_CDArray,
-                                               CDfa_nAlpha,
-                                               Alpha);
-                  CD += CDfaI;
-                  break;
-                }
-              case CDfade_flag:
-                {
-                  CDfadeI = uiuc_2Dinterpolation(CDfade_aArray,
-                                                 CDfade_deArray,
-                                                 CDfade_CDArray,
-                                                 CDfade_nAlphaArray,
-                                                 CDfade_nde,
-                                                 Alpha,
-                                                 elevator);
-                  CD += CDfadeI;
-                  break;
-                }
-              };
-            break;
-          } // end CD map
-        case CL_flag:
-          {
-            switch(CL_map[linetoken2])
-              {
-              case CLo_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CLo = uiuc_ice(CLo_clean,kCLo,eta);
-                    }
-                  CL += CLo;
-                  break;
-                }
-              case CL_a_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CL_a = uiuc_ice(CL_a_clean,kCL_a,eta);
-                    }
-                  CL += CL_a * Alpha;
-                  break;
-                }
-              case CL_adot_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CL_adot = uiuc_ice(CL_adot_clean,kCL_a,eta);
-                    }
-                  /* CL_adot must be mulitplied by cbar/2U 
-                     (see Roskam Control book, Part 1, pg. 147) */
-                  CL += CL_adot * Alpha_dot * cbar_2U;
-                  break;
-                }
-              case CL_q_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CL_q = uiuc_ice(CL_q_clean,kCL_q,eta);
-                    }
-                  /* CL_q must be mulitplied by cbar/2U 
-                     (see Roskam Control book, Part 1, pg. 147) */
-                  /* why multiply by Theta_dot instead of Q_body?
-                     that is what is done in c172_aero.c; assume it 
-                     has something to do with axes systems */
-                  CL += CL_q * Theta_dot * cbar_2U;
-                  break;
-                }
-              case CL_de_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CL_de = uiuc_ice(CL_de_clean,kCL_de,eta);
-                    }
-                  CL += CL_de * elevator;
-                  break;
-                }
-              case CLfa_flag:
-                {
-                  CLfaI = uiuc_1Dinterpolation(CLfa_aArray,
-                                               CLfa_CLArray,
-                                               CLfa_nAlpha,
-                                               Alpha);
-                  CL += CLfaI;
-                  break;
-                }
-              case CLfade_flag:
-                {
-                  CLfadeI = uiuc_2Dinterpolation(CLfade_aArray,
-                                                 CLfade_deArray,
-                                                 CLfade_CLArray,
-                                                 CLfade_nAlphaArray,
-                                                 CLfade_nde,
-                                                 Alpha,
-                                                 elevator);
-                  CL += CLfadeI;
-                  break;
-                }
-              };
-            break;
-          } // end CL map
-        case Cm_flag:
-          {
-            switch(Cm_map[linetoken2])
-              {
-              case Cmo_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cmo = uiuc_ice(Cmo_clean,kCmo,eta);
-                    }
-                  Cm += Cmo;
-                  break;
-                }
-              case Cm_a_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cm_a = uiuc_ice(Cm_a_clean,kCm_a,eta);
-                    }
-                  Cm += Cm_a * Alpha;
-                  break;
-                }
-              case Cm_adot_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cm_adot = uiuc_ice(Cm_adot_clean,kCm_a,eta);
-                    }
-                  /* Cm_adot must be mulitplied by cbar/2U 
-                     (see Roskam Control book, Part 1, pg. 147) */
-                  Cm += Cm_adot * Alpha_dot * cbar_2U;
-                  break;
-                }
-              case Cm_q_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cm_q = uiuc_ice(Cm_q_clean,kCm_q,eta);
-                    }
-                  /* Cm_q must be mulitplied by cbar/2U 
-                     (see Roskam Control book, Part 1, pg. 147) */
-                  Cm += Cm_q * Q_body * cbar_2U;
-                  break;
-                }
-              case Cm_de_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cm_de = uiuc_ice(Cm_de_clean,kCm_de,eta);
-                    }
-                  Cm += Cm_de * elevator;
-                  break;
-                }
-              case Cmfade_flag:
-                {
-                  CmfadeI = uiuc_2Dinterpolation(Cmfade_aArray,
-                                                 Cmfade_deArray,
-                                                 Cmfade_CmArray,
-                                                 Cmfade_nAlphaArray,
-                                                 Cmfade_nde,
-                                                 Alpha,
-                                                 elevator);
-                  Cm += CmfadeI;
-                  break;
-                }
-              };
-            break;
-          } // end Cm map
-        case CY_flag:
-          {
-            switch(CY_map[linetoken2])
-              {
-              case CYo_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CYo = uiuc_ice(CYo_clean,kCYo,eta);
-                    }
-                  CY += CYo;
-                  break;
-                }
-              case CY_beta_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CY_beta = uiuc_ice(CY_beta_clean,kCY_beta,eta);
-                    }
-                  CY += CY_beta * Beta;
-                  break;
-                }
-              case CY_p_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CY_p = uiuc_ice(CY_p_clean,kCY_p,eta);
-                    }
-                  /* CY_p must be mulitplied by b/2U 
-                     (see Roskam Control book, Part 1, pg. 147) */
-                  CY += CY_p * P_body * b_2U;
-                  break;
-                }
-              case CY_r_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CY_r = uiuc_ice(CY_r_clean,kCY_r,eta);
-                    }
-                  /* CY_r must be mulitplied by b/2U 
-                     (see Roskam Control book, Part 1, pg. 147) */
-                  CY += CY_r * R_body * b_2U;
-                  break;
-                }
-              case CY_da_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CY_da = uiuc_ice(CY_da_clean,kCY_da,eta);
-                    }
-                  CY += CY_da * aileron;
-                  break;
-                }
-              case CY_dr_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      CY_dr = uiuc_ice(CY_dr_clean,kCY_dr,eta);
-                    }
-                  CY += CY_dr * rudder;
-                  break;
-                }
-              case CYfada_flag:
-                {
-                  CYfadaI = uiuc_2Dinterpolation(CYfada_aArray,
-                                                 CYfada_daArray,
-                                                 CYfada_CYArray,
-                                                 CYfada_nAlphaArray,
-                                                 CYfada_nda,
-                                                 Alpha,
-                                                 aileron);
-                  CY += CYfadaI;
-                  break;
-                }
-              case CYfbetadr_flag:
-                {
-                  CYfbetadrI = uiuc_2Dinterpolation(CYfbetadr_betaArray,
-                                                    CYfbetadr_drArray,
-                                                    CYfbetadr_CYArray,
-                                                    CYfbetadr_nBetaArray,
-                                                    CYfbetadr_ndr,
-                                                    Beta,
-                                                    rudder);
-                  CY += CYfbetadrI;
-                  break;
-                }
-              };
-            break;
-          } // end CY map
-        case Cl_flag:
-          {
-            switch(Cl_map[linetoken2])
-              {
-              case Clo_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Clo = uiuc_ice(Clo_clean,kClo,eta);
-                    }
-                  Cl += Clo;
-                  break;
-                }
-              case Cl_beta_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cl_beta = uiuc_ice(Cl_beta_clean,kCl_beta,eta);
-                    }
-                  Cl += Cl_beta * Beta;
-                  break;
-                }
-              case Cl_p_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cl_p = uiuc_ice(Cl_p_clean,kCl_p,eta);
-                    }
-                  /* Cl_p must be mulitplied by b/2U 
-                     (see Roskam Control book, Part 1, pg. 147) */
-                  Cl += Cl_p * P_body * b_2U;
-                  break;
-                }
-              case Cl_r_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cl_r = uiuc_ice(Cl_r_clean,kCl_r,eta);
-                    }
-                  /* Cl_r must be mulitplied by b/2U 
-                     (see Roskam Control book, Part 1, pg. 147) */
-                  Cl += Cl_r * R_body * b_2U;
-                  break;
-                }
-              case Cl_da_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cl_da = uiuc_ice(Cl_da_clean,kCl_da,eta);
-                    }
-                  Cl += Cl_da * aileron;
-                  break;
-                }
-              case Cl_dr_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cl_dr = uiuc_ice(Cl_dr_clean,kCl_dr,eta);
-                    }
-                  Cl += Cl_dr * rudder;
-                  break;
-                }
-              case Clfada_flag:
-                {
-                  ClfadaI = uiuc_2Dinterpolation(Clfada_aArray,
-                                                 Clfada_daArray,
-                                                 Clfada_ClArray,
-                                                 Clfada_nAlphaArray,
-                                                 Clfada_nda,
-                                                 Alpha,
-                                                 aileron);
-                  Cl += ClfadaI;
-                  break;
-                }
-              case Clfbetadr_flag:
-                {
-                  ClfbetadrI = uiuc_2Dinterpolation(Clfbetadr_betaArray,
-                                                    Clfbetadr_drArray,
-                                                    Clfbetadr_ClArray,
-                                                    Clfbetadr_nBetaArray,
-                                                    Clfbetadr_ndr,
-                                                    Beta,
-                                                    rudder);
-                  Cl += ClfbetadrI;
-                  break;
-                }
-              };
-            break;
-          } // end Cl map
-        case Cn_flag:
-          {
-            switch(Cn_map[linetoken2])
-              {
-              case Cno_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cno = uiuc_ice(Cno_clean,kCno,eta);
-                    }
-                  Cn += Cno;
-                  break;
-                }
-              case Cn_beta_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cn_beta = uiuc_ice(Cn_beta_clean,kCn_beta,eta);
-                    }
-                  Cn += Cn_beta * Beta;
-                  break;
-                }
-              case Cn_p_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cn_p = uiuc_ice(Cn_p_clean,kCn_p,eta);
-                    }
-                  /* Cn_p must be mulitplied by b/2U 
-                     (see Roskam Control book, Part 1, pg. 147) */
-                  Cn += Cn_p * P_body * b_2U;
-                  break;
-                }
-              case Cn_r_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cn_r = uiuc_ice(Cn_r_clean,kCn_r,eta);
-                    }
-                  /* Cn_r must be mulitplied by b/2U 
-                     (see Roskam Control book, Part 1, pg. 147) */
-                  Cn += Cn_r * R_body * b_2U;
-                  break;
-                }
-              case Cn_da_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cn_da = uiuc_ice(Cn_da_clean,kCn_da,eta);
-                    }
-                  Cn += Cn_da * aileron;
-                  break;
-                }
-              case Cn_dr_flag:
-                {
-                  if (ice_on == true)
-                    {
-                      Cn_dr = uiuc_ice(Cn_dr_clean,kCn_dr,eta);
-                    }
-                  Cn += Cn_dr * rudder;
-                  break;
-                }
-              case Cnfada_flag:
-                {
-                  CnfadaI = uiuc_2Dinterpolation(Cnfada_aArray,
-                                                 Cnfada_daArray,
-                                                 Cnfada_CnArray,
-                                                 Cnfada_nAlphaArray,
-                                                 Cnfada_nda,
-                                                 Alpha,
-                                                 aileron);
-                  Cn += CnfadaI;
-                  break;
-                }
-              case Cnfbetadr_flag:
-                {
-                  CnfbetadrI = uiuc_2Dinterpolation(Cnfbetadr_betaArray,
-                                                    Cnfbetadr_drArray,
-                                                    Cnfbetadr_CnArray,
-                                                    Cnfbetadr_nBetaArray,
-                                                    Cnfbetadr_ndr,
-                                                    Beta,
-                                                    rudder);
-                  Cn += CnfbetadrI;
-                  break;
-                }
-              };
-            break;
-          } // end Cn map
-        };
-    } // end keyword map
+      if (rudder <=0)
+       Rudder_pedal = - rudder / drmax * RAD_TO_DEG;
+      else
+       Rudder_pedal = - rudder / drmin * RAD_TO_DEG;
+    }
 
   return;
 }