04/21/2002 (MSS) Added new variables for apparent mass effects
and options for computing *_2U coefficient
scale factors.
+ 08/29/2002 (MSS) Added simpleSingleModel
----------------------------------------------------------------------
use_V_rel_wind_2U_flag, nondim_rate_V_rel_wind_flag,
use_abs_U_body_2U_flag,
dyn_on_speed_flag, dyn_on_speed_zero_flag,
- use_dyn_on_speed_curve1_flag, Alpha_flag,
+ use_dyn_on_speed_curve1_flag, use_Alpha_dot_on_speed_flag, Alpha_flag,
Beta_flag, U_body_flag, V_body_flag, W_body_flag, ignore_unknown_flag};
// geometry === Aircraft-specific geometric quantities
I_yy_appMass_flag, I_zz_appMass_flag};
// engine ===== Propulsion data
-enum {simpleSingle_flag = 7000, c172_flag, cherokee_flag,
+enum {simpleSingle_flag = 7000, simpleSingleModel_flag,
+ c172_flag, cherokee_flag, gyroForce_Q_body_flag, gyroForce_R_body_flag,
+ omega_flag, omegaRPM_flag, polarInertia_flag,
+ slipstream_effects_flag, propDia_flag,
+ eta_q_Cm_q_flag,
+ eta_q_Cm_adot_flag,
+ eta_q_Cmfade_flag,
+ eta_q_Cl_beta_flag,
+ eta_q_Cl_p_flag,
+ eta_q_Cl_r_flag,
+ eta_q_Cl_dr_flag,
+ eta_q_CY_beta_flag,
+ eta_q_CY_p_flag,
+ eta_q_CY_r_flag,
+ eta_q_CY_dr_flag,
+ eta_q_Cn_beta_flag,
+ eta_q_Cn_p_flag,
+ eta_q_Cn_r_flag,
+ eta_q_Cn_dr_flag,
Throttle_pct_input_flag, forcemom_flag, Xp_input_flag, Zp_input_flag, Mp_input_flag};
// CD ========= Aerodynamic x-force quantities (longitudinal)
flapper_freq_record, flapper_phi_record,
flapper_phi_deg_record, flapper_Lift_record, flapper_Thrust_record,
- flapper_Inertia_record, flapper_Moment_record};
+ flapper_Inertia_record, flapper_Moment_record,
+
+ debug1_record, debug2_record, debug3_record};
// misc ======= Miscellaneous inputs
-enum {simpleHingeMomentCoef_flag = 17000, dfTimefdf_flag/*, flapper_flag,
- flapper_phi_init_flag*/};
+enum {simpleHingeMomentCoef_flag = 17000, dfTimefdf_flag, flapper_flag,
+ flapper_phi_init_flag};
//321654
// fog ======== Fog field quantities
bool use_dyn_on_speed_curve1;
#define use_dyn_on_speed_curve1 aircraft_->use_dyn_on_speed_curve1
bool P_body_init_true;
+
+ bool use_Alpha_dot_on_speed;
+#define use_Alpha_dot_on_speed aircraft_->use_Alpha_dot_on_speed
+ double Alpha_dot_on_speed;
+#define Alpha_dot_on_speed aircraft_->Alpha_dot_on_speed
+
+
double P_body_init;
#define P_body_init_true aircraft_->P_body_init_true
#define P_body_init aircraft_->P_body_init
double simpleSingleMaxThrust;
#define simpleSingleMaxThrust aircraft_->simpleSingleMaxThrust
+
+ bool simpleSingleModel;
+#define simpleSingleModel aircraft_->simpleSingleModel
+ double t_v0;
+#define t_v0 aircraft_->t_v0
+ double dtdv_t0;
+#define dtdv_t0 aircraft_->dtdv_t0
+ double v_t0;
+#define v_t0 aircraft_->v_t0
+ double dtdvvt;
+#define dtdvvt aircraft_->dtdvvt
+
+ double tc, induced, eta_q;
+#define tc aircraft_->tc
+#define induced aircraft_->induced
+#define eta_q aircraft_->eta_q
bool Throttle_pct_input;
string Throttle_pct_input_file;
#define Throttle_pct_input_dTArray aircraft_->Throttle_pct_input_dTArray
#define Throttle_pct_input_ntime aircraft_->Throttle_pct_input_ntime
#define Throttle_pct_input_startTime aircraft_->Throttle_pct_input_startTime
+ bool gyroForce_Q_body, gyroForce_R_body;
+ double minOmega, maxOmega, minOmegaRPM, maxOmegaRPM, engineOmega, polarInertia;
+#define gyroForce_Q_body aircraft_->gyroForce_Q_body
+#define gyroForce_R_body aircraft_->gyroForce_R_body
+#define minOmega aircraft_->minOmega
+#define maxOmega aircraft_->maxOmega
+#define minOmegaRPM aircraft_->minOmegaRPM
+#define maxOmegaRPM aircraft_->maxOmegaRPM
+#define engineOmega aircraft_->engineOmega
+#define polarInertia aircraft_->polarInertia
+
+ // propeller slipstream effects
+ bool slipstream_effects;
+ double propDia;
+ double eta_q_Cm_q, eta_q_Cm_q_fac;
+ double eta_q_Cm_adot, eta_q_Cm_adot_fac;
+ double eta_q_Cmfade, eta_q_Cmfade_fac;
+ double eta_q_Cl_beta, eta_q_Cl_beta_fac;
+ double eta_q_Cl_p, eta_q_Cl_p_fac;
+ double eta_q_Cl_r, eta_q_Cl_r_fac;
+ double eta_q_Cl_dr, eta_q_Cl_dr_fac;
+ double eta_q_CY_beta, eta_q_CY_beta_fac;
+ double eta_q_CY_p, eta_q_CY_p_fac;
+ double eta_q_CY_r, eta_q_CY_r_fac;
+ double eta_q_CY_dr, eta_q_CY_dr_fac;
+ double eta_q_Cn_beta, eta_q_Cn_beta_fac;
+ double eta_q_Cn_p, eta_q_Cn_p_fac;
+ double eta_q_Cn_r, eta_q_Cn_r_fac;
+ double eta_q_Cn_dr, eta_q_Cn_dr_fac;
+
+#define slipstream_effects aircraft_->slipstream_effects
+#define propDia aircraft_->propDia
+#define eta_q_Cm_q aircraft_->eta_q_Cm_q
+#define eta_q_Cm_q_fac aircraft_->eta_q_Cm_q_fac
+#define eta_q_Cm_adot aircraft_->eta_q_Cm_adot
+#define eta_q_Cm_adot_fac aircraft_->eta_q_Cm_adot_fac
+#define eta_q_Cmfade aircraft_->eta_q_Cmfade
+#define eta_q_Cmfade_fac aircraft_->eta_q_Cmfade_fac
+#define eta_q_Cl_beta aircraft_->eta_q_Cl_beta
+#define eta_q_Cl_beta_fac aircraft_->eta_q_Cl_beta_fac
+#define eta_q_Cl_p aircraft_->eta_q_Cl_p
+#define eta_q_Cl_p_fac aircraft_->eta_q_Cl_p_fac
+#define eta_q_Cl_r aircraft_->eta_q_Cl_r
+#define eta_q_Cl_r_fac aircraft_->eta_q_Cl_r_fac
+#define eta_q_Cl_dr aircraft_->eta_q_Cl_dr
+#define eta_q_Cl_dr_fac aircraft_->eta_q_Cl_dr_fac
+#define eta_q_CY_beta aircraft_->eta_q_CY_beta
+#define eta_q_CY_beta_fac aircraft_->eta_q_CY_beta_fac
+#define eta_q_CY_p aircraft_->eta_q_CY_p
+#define eta_q_CY_p_fac aircraft_->eta_q_CY_p_fac
+#define eta_q_CY_r aircraft_->eta_q_CY_r
+#define eta_q_CY_r_fac aircraft_->eta_q_CY_r_fac
+#define eta_q_CY_dr aircraft_->eta_q_CY_dr
+#define eta_q_CY_dr_fac aircraft_->eta_q_CY_dr_fac
+#define eta_q_Cn_beta aircraft_->eta_q_Cn_beta
+#define eta_q_Cn_beta_fac aircraft_->eta_q_Cn_beta_fac
+#define eta_q_Cn_p aircraft_->eta_q_Cn_p
+#define eta_q_Cn_p_fac aircraft_->eta_q_Cn_p_fac
+#define eta_q_Cn_r aircraft_->eta_q_Cn_r
+#define eta_q_Cn_r_fac aircraft_->eta_q_Cn_r_fac
+#define eta_q_Cn_dr aircraft_->eta_q_Cn_dr
+#define eta_q_Cn_dr_fac aircraft_->eta_q_Cn_dr_fac
+
+
bool Xp_input;
string Xp_input_file;
double Xp_input_timeArray[5400];
#define Cmfade_nAlphaArray aircraft_->Cmfade_nAlphaArray
#define Cmfade_nde aircraft_->Cmfade_nde
#define CmfadeI aircraft_->CmfadeI
+
+ double gamma_wing, w_induced, w_coef, downwash_angle, AlphaTail;
+#define gamma_wing aircraft_->gamma_wing
+#define w_induced aircraft_->w_induced
+#define w_coef aircraft_->w_coef
+#define downwash_angle aircraft_->downwash_angle
+#define AlphaTail aircraft_->AlphaTail
+
string Cmfdf;
double Cmfdf_dfArray[100];
double Cmfdf_CmArray[100];
#define dfTimefdf_dfArray aircraft_->dfTimefdf_dfArray
#define dfTimefdf_TimeArray aircraft_->dfTimefdf_TimeArray
#define dfTimefdf_ndf aircraft_->dfTimefdf_ndf
- /*
- FlapData *flapper_data;
+
+ /* FlapData *flapper_data;
#define flapper_data aircraft_->flapper_data
bool flapper_model;
#define flapper_model aircraft_->flapper_model
will compile with certain compilers.
08/29/2002 (RD) Separated each primary keyword into its
own function to speed up compile time
+ 08/29/2002 (RD w/ help from CO) Made changes to shorten
+ compile time. [] RD to add more comments here.
+ 08/29/3003 (MSS) Adding new keywords for new engine model
+ and slipstream effects on tail.
----------------------------------------------------------------------
use_dyn_on_speed_curve1 = true;
break;
}
+ case use_Alpha_dot_on_speed_flag:
+ {
+ use_Alpha_dot_on_speed = true;
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ Alpha_dot_on_speed = token_value;
+ break;
+ }
case Alpha_flag:
{
if (check_float(linetoken3))
engineParts -> storeCommands (*command_line);
break;
}
+ case simpleSingleModel_flag:
+ {
+ simpleSingleModel = true;
+ /* input the thrust at zero speed */
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ t_v0 = token_value;
+ /* input slope of thrust at speed for which thrust is zero */
+ if (check_float(linetoken4))
+ token4 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ dtdv_t0 = token_value;
+ /* input speed at which thrust is zero */
+ if (check_float(linetoken5))
+ token5 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ v_t0 = token_value;
+ dtdvvt = -dtdv_t0 * v_t0 / t_v0;
+ engineParts -> storeCommands (*command_line);
+ break;
+ }
case c172_flag:
{
engineParts -> storeCommands (*command_line);
Throttle_pct_input_startTime = token_value;
break;
}
+ case gyroForce_Q_body_flag:
+ {
+ /* include gyroscopic forces due to pitch */
+ gyroForce_Q_body = true;
+ break;
+ }
+ case gyroForce_R_body_flag:
+ {
+ /* include gyroscopic forces due to yaw */
+ gyroForce_R_body = true;
+ break;
+ }
+
+ case slipstream_effects_flag:
+ {
+ // include slipstream effects
+ slipstream_effects = true;
+ if (!simpleSingleModel)
+ uiuc_warnings_errors(3, *command_line);
+ break;
+ }
+ case propDia_flag:
+ {
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ propDia = token_value;
+ break;
+ }
+ case eta_q_Cm_q_flag:
+ {
+ // include slipstream effects due to Cm_q
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_Cm_q_fac = token_value;
+ if (eta_q_Cm_q_fac == 0.0) {eta_q_Cm_q_fac = 1.0;}
+ break;
+ }
+ case eta_q_Cm_adot_flag:
+ {
+ // include slipstream effects due to Cm_adot
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_Cm_adot_fac = token_value;
+ if (eta_q_Cm_adot_fac == 0.0) {eta_q_Cm_adot_fac = 1.0;}
+ break;
+ }
+ case eta_q_Cmfade_flag:
+ {
+ // include slipstream effects due to Cmfade
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_Cmfade_fac = token_value;
+ if (eta_q_Cmfade_fac == 0.0) {eta_q_Cmfade_fac = 1.0;}
+ break;
+ }
+ case eta_q_Cl_beta_flag:
+ {
+ // include slipstream effects due to Cl_beta
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_Cl_beta_fac = token_value;
+ if (eta_q_Cl_beta_fac == 0.0) {eta_q_Cl_beta_fac = 1.0;}
+ break;
+ }
+ case eta_q_Cl_p_flag:
+ {
+ // include slipstream effects due to Cl_p
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_Cl_p_fac = token_value;
+ if (eta_q_Cl_p_fac == 0.0) {eta_q_Cl_p_fac = 1.0;}
+ break;
+ }
+ case eta_q_Cl_r_flag:
+ {
+ // include slipstream effects due to Cl_r
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_Cl_r_fac = token_value;
+ if (eta_q_Cl_r_fac == 0.0) {eta_q_Cl_r_fac = 1.0;}
+ break;
+ }
+ case eta_q_Cl_dr_flag:
+ {
+ // include slipstream effects due to Cl_dr
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_Cl_dr_fac = token_value;
+ if (eta_q_Cl_dr_fac == 0.0) {eta_q_Cl_dr_fac = 1.0;}
+ break;
+ }
+ case eta_q_CY_beta_flag:
+ {
+ // include slipstream effects due to CY_beta
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_CY_beta_fac = token_value;
+ if (eta_q_CY_beta_fac == 0.0) {eta_q_CY_beta_fac = 1.0;}
+ break;
+ }
+ case eta_q_CY_p_flag:
+ {
+ // include slipstream effects due to CY_p
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_CY_p_fac = token_value;
+ if (eta_q_CY_p_fac == 0.0) {eta_q_CY_p_fac = 1.0;}
+ break;
+ }
+ case eta_q_CY_r_flag:
+ {
+ // include slipstream effects due to CY_r
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_CY_r_fac = token_value;
+ if (eta_q_CY_r_fac == 0.0) {eta_q_CY_r_fac = 1.0;}
+ break;
+ }
+ case eta_q_CY_dr_flag:
+ {
+ // include slipstream effects due to CY_dr
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_CY_dr_fac = token_value;
+ if (eta_q_CY_dr_fac == 0.0) {eta_q_CY_dr_fac = 1.0;}
+ break;
+ }
+ case eta_q_Cn_beta_flag:
+ {
+ // include slipstream effects due to Cn_beta
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_Cn_beta_fac = token_value;
+ if (eta_q_Cn_beta_fac == 0.0) {eta_q_Cn_beta_fac = 1.0;}
+ break;
+ }
+ case eta_q_Cn_p_flag:
+ {
+ // include slipstream effects due to Cn_p
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_Cn_p_fac = token_value;
+ if (eta_q_Cn_p_fac == 0.0) {eta_q_Cn_p_fac = 1.0;}
+ break;
+ }
+ case eta_q_Cn_r_flag:
+ {
+ // include slipstream effects due to Cn_r
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_Cn_r_fac = token_value;
+ if (eta_q_Cn_r_fac == 0.0) {eta_q_Cn_r_fac = 1.0;}
+ break;
+ }
+ case eta_q_Cn_dr_flag:
+ {
+ // include slipstream effects due to Cn_dr
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ eta_q_Cn_dr_fac = token_value;
+ if (eta_q_Cn_dr_fac == 0.0) {eta_q_Cn_dr_fac = 1.0;}
+ break;
+ }
+
+ case omega_flag:
+ {
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ minOmega = token_value;
+ if (check_float(linetoken4))
+ token4 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ maxOmega = token_value;
+ break;
+ }
+ case omegaRPM_flag:
+ {
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ minOmegaRPM = token_value;
+ minOmega = minOmegaRPM * 2.0 * LS_PI / 60;
+ if (check_float(linetoken4))
+ token4 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ maxOmegaRPM = token_value;
+ maxOmega = maxOmegaRPM * 2.0 * LS_PI / 60;
+ break;
+ }
+ case polarInertia_flag:
+ {
+ if (check_float(linetoken3))
+ token3 >> token_value;
+ else
+ uiuc_warnings_errors(1, *command_line);
+ polarInertia = token_value;
+ break;
+ }
case forcemom_flag:
{
engineParts -> storeCommands (*command_line);
recordParts -> storeCommands (*command_line);
break;
}*/
+ /****************** Flapper Data ***********************/
+ case debug1_record:
+ {
+ recordParts -> storeCommands (*command_line);
+ break;
+ }
+ case debug2_record:
+ {
+ recordParts -> storeCommands (*command_line);
+ break;
+ }
+ case debug3_record:
+ {
+ recordParts -> storeCommands (*command_line);
+ break;
+ }
default:
{
if (dont_ignore)
dfTimefdf_ndf);
break;
}
- /* case flapper_flag:
+ /*case flapper_flag:
{
string flap_file;
/* set speed at which dynamic pressure terms will be accounted for,
since if velocity is too small, coefficients will go to infinity */
- dyn_on_speed = 33; /* 20 kts, default */
- dyn_on_speed_zero = 0.5 * dyn_on_speed; /* only used of use_dyn_on_speed_curve1 is used */
+ dyn_on_speed = 33; /* 20 kts (33 ft/sec), default */
+ dyn_on_speed_zero = 0.5 * dyn_on_speed; /* only used if use_dyn_on_speed_curve1 is used */
bootindex = 0; // the index for the bootTime
dont_ignore = true;
}
/*********************** Moments ***********************/
-/* case flapper_freq_record:
+ /* case flapper_freq_record:
{
fout << flapper_freq << " ";
break;
{
fout << flapper_Moment << " ";
break;
- } */
+ }*/
+ /*********************** debug ***********************/
+ /* debug variables for use in probing data */
+ /* comment out old lines, and add new */
+ /* only remove code that you have written */
+ case debug1_record:
+ {
+ // eta on tail
+ // fout << eta_q << " ";
+ // engine RPM
+ // fout << engineOmega * 60 / (2 * LS_PI)<< " ";
+ // climb rate in fpm
+ //fout << V_down * 60 << " ";
+ // w_induced downwash at tail due to wing
+ fout << w_induced << " ";
+ break;
+ }
+ case debug2_record:
+ {
+ //Lift to drag ratio
+ // fout << V_north/V_down << " ";
+ // g's through the c.g. of the aircraft
+ // fout << (-A_Z_cg/32.174) << " ";
+ // gyroscopic moment (see uiuc_wrapper.cpp)
+ // fout << (polarInertia * engineOmega * Q_body) << " ";
+ // downwash_angle at tail
+ fout << downwash_angle * 57.29 << " ";
+
+ break;
+ }
+ case debug3_record:
+ {
+ // die off function for eta_q
+ // fout << (Cos_alpha * Cos_alpha) << " ";
+ // gyroscopic moment (see uiuc_wrapper.cpp)
+ // fout << (-polarInertia * engineOmega * R_body) << " ";
+ // AlphaTail
+ fout << AlphaTail * 57.29 << " ";
+ fout << Alpha * 57.29 << " ";
+ break;
+ }
+
};
} // end record map
}
F_Y_wind = CY * qS * Cos_beta * Cos_beta;
F_Z_wind = -CL * qS * Cos_beta * Cos_beta;
- /* wind-axis to body-axis transformation */
+ // wind-axis to body-axis transformation
F_X_aero = F_X_wind * Cos_alpha * Cos_beta - F_Y_wind * Cos_alpha * Sin_beta - F_Z_wind * Sin_alpha;
F_Y_aero = F_X_wind * Sin_beta + F_Y_wind * Cos_beta;
F_Z_aero = F_X_wind * Sin_alpha * Cos_beta - F_Y_wind * Sin_alpha * Sin_beta + F_Z_wind * Cos_alpha;
}
- /* Moment calculations */
+ // Moment calculations
M_l_aero = Cl * qSb * Cos_beta * Cos_beta;
M_m_aero = Cm * qScbar * Cos_beta * Cos_beta;
M_n_aero = Cn * qSb * Cos_beta * Cos_beta;
- /* Adding in apparent mass effects */
-
+ // Adding in apparent mass effects
if (Mass_appMass_ratio)
F_Z_aero += -(Mass_appMass_ratio * Mass) * W_dot_body;
if (I_xx_appMass_ratio)
if (I_yy_appMass_ratio)
M_m_aero += -(I_yy_appMass_ratio * I_yy) * Q_dot_body;
if (I_zz_appMass_ratio)
- M_m_aero += -(I_zz_appMass_ratio * I_yy) * R_dot_body;
+ M_n_aero += -(I_zz_appMass_ratio * I_zz) * R_dot_body;
if (Mass_appMass)
F_Z_aero += -Mass_appMass * W_dot_body;
if (I_yy_appMass)
M_m_aero += -I_yy_appMass * Q_dot_body;
if (I_zz_appMass)
- M_m_aero += -I_zz_appMass * R_dot_body;
+ M_n_aero += -I_zz_appMass * R_dot_body;
- //if (flapper_model)
- // {
- // F_X_aero += F_X_aero_flapper;
- // F_Z_aero += F_Z_aero_flapper;
- // M_m_aero += flapper_Moment;
- // }
+ // gyroscopic moments
+ // engineOmega is positive when rotation is ccw when viewed from the front
+ if (gyroForce_Q_body)
+ M_n_aero += polarInertia * engineOmega * Q_body;
+ if (gyroForce_R_body)
+ M_m_aero += -polarInertia * engineOmega * R_body;
+
+ // ornithopter support
+ if (flapper_model)
+ {
+ F_X_aero += F_X_aero_flapper;
+ F_Z_aero += F_Z_aero_flapper;
+ M_m_aero += flapper_Moment;
+ }
// fog field update
Fog = 0;