]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/LaRCsim/c172_aero.c
Latest round of JSBim updates.
[flightgear.git] / src / FDM / LaRCsim / c172_aero.c
index d6f390c7650fa732dc48d313240df55ec9bd7014..0128040d842e09111f5740bdb663d0719cfb1539 100644 (file)
 extern COCKPIT cockpit_;
 
 
-SCALAR interp(SCALAR *y_table, SCALAR *x_table, int Ntable, SCALAR x)
+   SCALAR CLadot;
+   SCALAR CLq;
+   SCALAR CLde;
+   SCALAR CLob;
+  
+  
+   SCALAR Cdob;
+   SCALAR Cda;  /*Not used*/
+   SCALAR Cdde;
+  
+   SCALAR Cma;
+   SCALAR Cmadot;
+   SCALAR Cmq;
+   SCALAR Cmob; 
+   SCALAR Cmde;
+  
+   SCALAR Clbeta;
+   SCALAR Clp;
+   SCALAR Clr;
+   SCALAR Clda;
+   SCALAR Cldr;
+  
+   SCALAR Cnbeta;
+   SCALAR Cnp;
+   SCALAR Cnr;
+   SCALAR Cnda;
+   SCALAR Cndr;
+  
+   SCALAR Cybeta;
+   SCALAR Cyp;
+   SCALAR Cyr;
+   SCALAR Cyda;
+   SCALAR Cydr;
+
+  /*nondimensionalization quantities*/
+  /*units here are ft and lbs */
+   SCALAR cbar; /*mean aero chord ft*/
+   SCALAR b; /*wing span ft */
+   SCALAR Sw; /*wing planform surface area ft^2*/
+   SCALAR rPiARe; /*reciprocal of Pi*AR*e*/
+   SCALAR lbare;  /*elevator moment arm  MAC*/
+   
+   SCALAR Weight; /*lbs*/
+   SCALAR MaxTakeoffWeight,EmptyWeight;
+   SCALAR Cg;     /*%MAC*/
+   SCALAR Zcg;    /*%MAC*/
+  
+  
+  SCALAR CLwbh,CL,cm,cd,cn,cy,croll,cbar_2V,b_2V,qS,qScbar,qSb;
+  SCALAR CLo,Cdo,Cmo;
+  
+  SCALAR F_X_wind,F_Y_wind,F_Z_wind;
+  
+  SCALAR long_trim;
+
+  
+  SCALAR elevator, aileron, rudder;
+
+  
+  SCALAR Flap_Position;
+  int Flaps_In_Transit;
+
+static SCALAR interp(SCALAR *y_table, SCALAR *x_table, int Ntable, SCALAR x)
 {
        SCALAR slope;
        int i=1;
@@ -141,12 +204,13 @@ SCALAR interp(SCALAR *y_table, SCALAR *x_table, int Ntable, SCALAR x)
 }      
                                
 
-void aero( SCALAR dt, int Initialize ) {
+void c172_aero( SCALAR dt, int Initialize ) {
   
   
-  static int init = 0;
-  static int flap_dir=0;
+  // static int init = 0;
+  static int fi=0;
   static SCALAR lastFlapHandle=0;
+  static SCALAR Ai;
   
   static SCALAR trim_inc = 0.0002;
 
@@ -154,6 +218,7 @@ void aero( SCALAR dt, int Initialize ) {
   static SCALAR CLtable[NCL]={-0.22,0.25,1.02,1.252,1.354,1.44,1.466,1.298,0.97};  
   
   static SCALAR flap_ind[Ndf]={0,10,20,30};
+  static SCALAR flap_times[Ndf]={0,4,2,2};
   static SCALAR dCLf[Ndf]={0,0.20,0.30,0.35};
   static SCALAR dCdf[Ndf]={0,0.0021,0.0085,0.0191};
   static SCALAR dCmf[Ndf]={0,-0.0654,-0.0981,-0.114};
@@ -180,8 +245,8 @@ void aero( SCALAR dt, int Initialize ) {
           
           CLob=0;
 
-
-          Cdob=0.031;
+       Ai=1.24;
+          Cdob=0.036;
           Cda=0.13;  /*Not used*/
           Cdde=0.06;
 
@@ -238,61 +303,70 @@ void aero( SCALAR dt, int Initialize ) {
   {  Weight=1500; }
   
   
-  if(Dx_cg > 0.5586)
-  {  Dx_cg = 0.5586; }
-  else if(Dx_cg < -0.4655)
-  {  Dx_cg = -0.4655; }
+  if(Dx_cg > 0.43)
+  {  Dx_cg = 0.43; }
+  else if(Dx_cg < -0.6)
+  {  Dx_cg = -0.6; }
   
-  Cg=Dx_cg/cbar +0.25;
+  Cg=0.25 - Dx_cg/cbar;
   
   Dz_cg=Zcg*cbar;
+  Dy_cg=0;
   
 
   if(Flap_handle < flap_ind[0])
   {
-       Flap_handle=flap_ind[0];
+       fi=0;
+       Flap_handle=flap_ind[0];
+       lastFlapHandle=Flap_handle;
        Flap_Position=flap_ind[0];
   }
-  else if(Flap_handle > flap_ind[3])
+  else if(Flap_handle > flap_ind[Ndf-1])
   {
-        Flap_handle=flap_ind[3];
-        Flap_Position=flap_ind[3];
+        fi=Ndf-1;
+        Flap_handle=flap_ind[fi];
+        lastFlapHandle=Flap_handle;
+        Flap_Position=flap_ind[fi];
   }
   else         
   {            
         
-        
-        if((Flap_handle != lastFlapHandle) && (dt > 0)) {
-               Flaps_In_Transit=1;
-        } else if(dt <= 0) {
-               Flap_Position=Flap_handle;
-        }
-                       
-        lastFlapHandle=Flap_handle;
-        if((Flaps_In_Transit) && (dt > 0))     
-        {      
-               if(Flap_Position < 10)
-                       flap_transit_rate = 2.5;
-               else
-                       flap_transit_rate=5;
-                       
+        if(dt <= 0)
+           Flap_Position=Flap_handle;
+        else   
+        {
+               if(Flap_handle != lastFlapHandle)
+               {
+                  Flaps_In_Transit=1;
+               }
                if(Flaps_In_Transit)
                {
+                  fi=0;
+              while(flap_ind[fi] < Flap_handle) { fi++; }
                   if(Flap_Position < Flap_handle)
-                       flap_dir=1;
+                  {
+               if(flap_times[fi] > 0)
+                               flap_transit_rate=(flap_ind[fi] - flap_ind[fi-1])/flap_times[fi];
+                          else
+                               flap_transit_rate=(flap_ind[fi] - flap_ind[fi-1])/5;
+                  }                                    
                   else 
-                       flap_dir=-1;            
-                  
+                  {
+                       if(flap_times[fi+1] > 0)
+                                  flap_transit_rate=(flap_ind[fi] - flap_ind[fi+1])/flap_times[fi+1];          
+                               else
+                              flap_transit_rate=(flap_ind[fi] - flap_ind[fi+1])/5;   
+                  }
                   if(fabs(Flap_Position - Flap_handle) > dt*flap_transit_rate)
-                          Flap_Position+=flap_dir*flap_transit_rate*dt;
-
-                  if(fabs(Flap_Position - Flap_handle) < dt*flap_transit_rate)
+                          Flap_Position+=flap_transit_rate*dt;
+                  else
                   {
                           Flaps_In_Transit=0;
                           Flap_Position=Flap_handle;
                   }
        }
-         }     
+        }      
+        lastFlapHandle=Flap_handle;
   }              
   
   if(Aft_trim) long_trim = long_trim - trim_inc;
@@ -316,7 +390,7 @@ void aero( SCALAR dt, int Initialize ) {
     
   /*calculate rate derivative nondimensionalization (is that a word?) factors */
   /*hack to avoid divide by zero*/
-  /*the dynamic terms might be negligible at low ground speeds anyway*/ 
+  /*the dynamic terms are negligible at low ground speeds anyway*/ 
   
 /*   printf("Vinf: %g, Span: %g\n",V_rel_wind,b);
  */  
@@ -346,7 +420,7 @@ void aero( SCALAR dt, int Initialize ) {
  
   
   /* sum coefficients */
-  CLwbh = interp(CLtable,alpha_ind,NCL,Alpha);
+  CLwbh = interp(CLtable,alpha_ind,NCL,Std_Alpha);
 /*   printf("CLwbh: %g\n",CLwbh);
  */
   CLo = CLob + interp(dCLf,flap_ind,Ndf,Flap_Position);
@@ -356,17 +430,19 @@ void aero( SCALAR dt, int Initialize ) {
   /* printf("FP: %g\n",Flap_Position);
   printf("CLo: %g\n",CLo);
   printf("Cdo: %g\n",Cdo);
-  printf("Cmo: %g\n",Cmo); */
+  printf("Cmo: %g\n",Cmo);       */
+
+
  
 
 
-  CL = CLo + CLwbh + (CLadot*Alpha_dot + CLq*Theta_dot)*cbar_2V + CLde*elevator;
-  cd = Cdo + rPiARe*CL*CL + Cdde*elevator;
-  cy = Cybeta*Beta + (Cyp*P_body + Cyr*R_body)*b_2V + Cyda*aileron + Cydr*rudder;
+  CL = CLo + CLwbh + (CLadot*Std_Alpha_dot + CLq*Theta_dot)*cbar_2V + CLde*elevator;
+  cd = Cdo + rPiARe*Ai*Ai*CL*CL + Cdde*elevator;
+  cy = Cybeta*Std_Beta + (Cyp*P_body + Cyr*R_body)*b_2V + Cyda*aileron + Cydr*rudder;
   
-  cm = Cmo + Cma*Alpha + (Cmq*Q_body + Cmadot*Alpha_dot)*cbar_2V + Cmde*(elevator);
-  cn = Cnbeta*Beta + (Cnp*P_body + Cnr*R_body)*b_2V + Cnda*aileron + Cndr*rudder; 
-  croll=Clbeta*Beta + (Clp*P_body + Clr*R_body)*b_2V + Clda*aileron + Cldr*rudder;
+  cm = Cmo + Cma*Std_Alpha + (Cmq*Q_body + Cmadot*Std_Alpha_dot)*cbar_2V + Cmde*(elevator);
+  cn = Cnbeta*Std_Beta + (Cnp*P_body + Cnr*R_body)*b_2V + Cnda*aileron + Cndr*rudder; 
+  croll=Clbeta*Std_Beta + (Clp*P_body + Clr*R_body)*b_2V + Clda*aileron + Cldr*rudder;
   
 /*   printf("aero: CL: %7.4f, Cd: %7.4f, Cm: %7.4f, Cy: %7.4f, Cn: %7.4f, Cl: %7.4f\n",CL,cd,cm,cy,cn,croll);
  */