#include <math.h>
#include "uiuc_parsefile.h"
-//#include "uiuc_flapdata.h"
+// #include "uiuc_flapdata.h"
SG_USING_STD(map);
#if !defined (SG_HAVE_NATIVE_SGI_COMPILERS)
double F_X_aero_flapper, F_Z_aero_flapper;
#define F_X_aero_flapper aircraft_->F_X_aero_flapper
#define F_Z_aero_flapper aircraft_->F_Z_aero_flapper
- */
+
/* Other variables (not tokens) =================================*/
double convert_x, convert_y, convert_z;
/* Cm_adot must be mulitplied by cbar/2U
(see Roskam Control book, Part 1, pg. 147) */
Cm_adot_save = Cm_adot * Alpha_dot * cbar_2U;
- Cm += Cm_adot * Alpha_dot * cbar_2U;
+ //Cm += Cm_adot * Alpha_dot * cbar_2U;
+ if (eta_q_Cm_adot_fac)
+ {
+ Cm += Cm_adot_save * eta_q_Cm_adot_fac;
+ }
+ else
+ {
+ Cm += Cm_adot_save;
+ }
break;
}
case Cm_q_flag:
/* Cm_q must be mulitplied by cbar/2U
(see Roskam Control book, Part 1, pg. 147) */
Cm_q_save = Cm_q * Q_body * cbar_2U;
- Cm += Cm_q * Q_body * cbar_2U;
+ // Cm += Cm_q * Q_body * cbar_2U;
+ if (eta_q_Cm_q_fac)
+ {
+ Cm += Cm_q_save * eta_q_Cm_q_fac;
+ }
+ else
+ {
+ Cm += Cm_q_save;
+ }
break;
}
case Cm_ih_flag:
}
case Cmfade_flag:
{
- CmfadeI = uiuc_2Dinterpolation(Cmfade_aArray,
+ // compute the induced velocity on the tail to account for tail downwash
+ gamma_wing = V_rel_wind * Sw * CL / (2.0 * bw);
+ w_coef = 0.036;
+ w_induced = w_coef * gamma_wing;
+ downwash_angle = atan(w_induced/V_rel_wind);
+ AlphaTail = Alpha - downwash_angle;
+ CmfadeI = uiuc_2Dinterpolation(Cmfade_aArray,
Cmfade_deArray,
Cmfade_CmArray,
Cmfade_nAlphaArray,
Cmfade_nde,
- Alpha,
+ AlphaTail,
elevator);
- Cm += CmfadeI;
+ // Cm += CmfadeI;
+ if (eta_q_Cmfade_fac)
+ {
+ Cm += CmfadeI * eta_q_Cmfade_fac;
+ }
+ else
+ {
+ Cm += CmfadeI;
+ }
break;
}
case Cmfdf_flag:
Cl_beta = uiuc_ice_filter(Cl_beta_clean,kCl_beta);
}
Cl_beta_save = Cl_beta * Beta;
- Cl += Cl_beta * Beta;
+ // Cl += Cl_beta * Beta;
+ if (eta_q_Cl_beta_fac)
+ {
+ Cl += Cl_beta_save * eta_q_Cl_beta_fac;
+ }
+ else
+ {
+ Cl += Cl_beta_save;
+ }
break;
}
case Cl_p_flag:
/* Cl_p must be mulitplied by b/2U
(see Roskam Control book, Part 1, pg. 147) */
Cl_p_save = Cl_p * P_body * b_2U;
- Cl += Cl_p * P_body * b_2U;
+ // Cl += Cl_p * P_body * b_2U;
+ if (eta_q_Cl_p_fac)
+ {
+ Cl += Cl_p_save * eta_q_Cl_p_fac;
+ }
+ else
+ {
+ Cl += Cl_p_save;
+ }
break;
}
case Cl_r_flag:
/* Cl_r must be mulitplied by b/2U
(see Roskam Control book, Part 1, pg. 147) */
Cl_r_save = Cl_r * R_body * b_2U;
- Cl += Cl_r * R_body * b_2U;
+ // Cl += Cl_r * R_body * b_2U;
+ if (eta_q_Cl_r_fac)
+ {
+ Cl += Cl_r_save * eta_q_Cl_r_fac;
+ }
+ else
+ {
+ Cl += Cl_r_save;
+ }
break;
}
case Cl_da_flag:
Cl_dr = uiuc_ice_filter(Cl_dr_clean,kCl_dr);
}
Cl_dr_save = Cl_dr * rudder;
- Cl += Cl_dr * rudder;
+ // Cl += Cl_dr * rudder;
+ if (eta_q_Cl_dr_fac)
+ {
+ Cl += Cl_dr_save * eta_q_Cl_dr_fac;
+ }
+ else
+ {
+ Cl += Cl_dr_save;
+ }
break;
}
case Cl_daa_flag:
CY_beta = uiuc_ice_filter(CY_beta_clean,kCY_beta);
}
CY_beta_save = CY_beta * Beta;
- CY += CY_beta * Beta;
+ // CY += CY_beta * Beta;
+ if (eta_q_CY_beta_fac)
+ {
+ CY += CY_beta_save * eta_q_CY_beta_fac;
+ }
+ else
+ {
+ CY += CY_beta_save;
+ }
break;
}
case CY_p_flag:
/* CY_p must be mulitplied by b/2U
(see Roskam Control book, Part 1, pg. 147) */
CY_p_save = CY_p * P_body * b_2U;
- CY += CY_p * P_body * b_2U;
+ // CY += CY_p * P_body * b_2U;
+ if (eta_q_CY_p_fac)
+ {
+ CY += CY_p_save * eta_q_CY_p_fac;
+ }
+ else
+ {
+ CY += CY_p_save;
+ }
break;
}
case CY_r_flag:
/* CY_r must be mulitplied by b/2U
(see Roskam Control book, Part 1, pg. 147) */
CY_r_save = CY_r * R_body * b_2U;
- CY += CY_r * R_body * b_2U;
+ // CY += CY_r * R_body * b_2U;
+ if (eta_q_CY_r_fac)
+ {
+ CY += CY_r_save * eta_q_CY_r_fac;
+ }
+ else
+ {
+ CY += CY_r_save;
+ }
break;
}
case CY_da_flag:
CY_dr = uiuc_ice_filter(CY_dr_clean,kCY_dr);
}
CY_dr_save = CY_dr * rudder;
- CY += CY_dr * rudder;
+ // CY += CY_dr * rudder;
+ if (eta_q_CY_dr_fac)
+ {
+ CY += CY_dr_save * eta_q_CY_dr_fac;
+ }
+ else
+ {
+ CY += CY_dr_save;
+ }
break;
}
case CY_dra_flag:
Cn_beta = uiuc_ice_filter(Cn_beta_clean,kCn_beta);
}
Cn_beta_save = Cn_beta * Beta;
- Cn += Cn_beta * Beta;
+ // Cn += Cn_beta * Beta;
+ if (eta_q_Cn_beta_fac)
+ {
+ Cn += Cn_beta_save * eta_q_Cn_beta_fac;
+ }
+ else
+ {
+ Cn += Cn_beta_save;
+ }
break;
}
case Cn_p_flag:
/* Cn_p must be mulitplied by b/2U
(see Roskam Control book, Part 1, pg. 147) */
Cn_p_save = Cn_p * P_body * b_2U;
- Cn += Cn_p * P_body * b_2U;
+ // Cn += Cn_p * P_body * b_2U;
+ if (eta_q_Cn_p_fac)
+ {
+ Cn += Cn_p_save * eta_q_Cn_p_fac;
+ }
+ else
+ {
+ Cn += Cn_p_save;
+ }
break;
}
case Cn_r_flag:
/* Cn_r must be mulitplied by b/2U
(see Roskam Control book, Part 1, pg. 147) */
Cn_r_save = Cn_r * R_body * b_2U;
- Cn += Cn_r * R_body * b_2U;
+ // Cn += Cn_r * R_body * b_2U;
+ if (eta_q_Cn_r_fac)
+ {
+ Cn += Cn_r_save * eta_q_Cn_r_fac;
+ }
+ else
+ {
+ Cn += Cn_r_save;
+ }
break;
}
case Cn_da_flag:
Cn_dr = uiuc_ice_filter(Cn_dr_clean,kCn_dr);
}
Cn_dr_save = Cn_dr * rudder;
- Cn += Cn_dr * rudder;
+ // Cn += Cn_dr * rudder;
+ if (eta_q_Cn_dr_fac)
+ {
+ Cn += Cn_dr_save * eta_q_Cn_dr_fac;
+ }
+ else
+ {
+ Cn += Cn_dr_save;
+ }
break;
}
case Cn_q_flag:
{
cbar_2U = cbar / (2.0 * V_rel_wind);
b_2U = bw / (2.0 * V_rel_wind);
+ // ch is the horizontal tail chord
ch_2U = ch / (2.0 * V_rel_wind);
}
else if (use_dyn_on_speed_curve1)
cbar_2U = cbar / (2.0 * V_rel_wind_dum);
b_2U = bw / (2.0 * V_rel_wind_dum);
ch_2U = ch / (2.0 * V_rel_wind_dum);
+ Alpha_dot = 0.0;
}
else
{
- cbar_2U = 0.0;
- b_2U = 0.0;
- ch_2U = 0.0;
+ cbar_2U = 0.0;
+ b_2U = 0.0;
+ ch_2U = 0.0;
+ Alpha_dot = 0.0;
}
}
else if(use_abs_U_body_2U) // use absolute(U_body)
cbar_2U = cbar / (2.0 * U_body_dum);
b_2U = bw / (2.0 * U_body_dum);
ch_2U = ch / (2.0 * U_body_dum);
+ Alpha_dot = 0.0;
}
else
{
- cbar_2U = 0.0;
- b_2U = 0.0;
- ch_2U = 0.0;
+ cbar_2U = 0.0;
+ b_2U = 0.0;
+ ch_2U = 0.0;
+ Alpha_dot = 0.0;
}
}
else // use U_body
cbar_2U = cbar / (2.0 * U_body_dum);
b_2U = bw / (2.0 * U_body_dum);
ch_2U = ch / (2.0 * U_body_dum);
+ Alpha_dot = 0.0;
beta_flow_clean_tail = cbar_2U;
}
else
{
- cbar_2U = 0.0;
- b_2U = 0.0;
- ch_2U = 0.0;
+ cbar_2U = 0.0;
+ b_2U = 0.0;
+ ch_2U = 0.0;
+ Alpha_dot = 0.0;
}
}
+ // check if speed is sufficient to "trust" Alpha_dot value
+ if (use_Alpha_dot_on_speed)
+ {
+ if (V_rel_wind < Alpha_dot_on_speed)
+ Alpha_dot = 0.0;
+ }
+
+
// check to see if icing model engaged
if (ice_model)
{
F_X_engine = Throttle[3] * simpleSingleMaxThrust;
break;
}
+ case simpleSingleModel_flag:
+ {
+ /* simple model based on Hepperle's equation
+ * exponent dtdvvt was computed in uiuc_menu.cpp */
+ F_X_engine = Throttle[3] * t_v0 * (1 - pow((V_rel_wind/v_t0),dtdvvt));
+ if (slipstream_effects) {
+ tc = F_X_engine/(Dynamic_pressure * LS_PI * propDia * propDia / 4);
+ w_induced = 0.5 * V_rel_wind * (-1 + pow((1+tc),.5));
+ eta_q = (2* w_induced + V_rel_wind)*(2* w_induced + V_rel_wind)/(V_rel_wind * V_rel_wind);
+ /* add in a die-off function so that eta falls off w/ alfa and beta */
+ eta_q = Cos_alpha * Cos_alpha * Cos_beta * Cos_beta * eta_q;
+ /* determine the eta_q values for the respective coefficients */
+ if (eta_q_Cm_q_fac) {eta_q_Cm_q *= eta_q * eta_q_Cm_q_fac;}
+ if (eta_q_Cm_adot_fac) {eta_q_Cm_adot *= eta_q * eta_q_Cm_adot_fac;}
+ if (eta_q_Cmfade_fac) {eta_q_Cmfade *= eta_q * eta_q_Cmfade_fac;}
+ if (eta_q_Cl_beta_fac) {eta_q_Cl_beta *= eta_q * eta_q_Cl_beta_fac;}
+ if (eta_q_Cl_p_fac) {eta_q_Cl_p *= eta_q * eta_q_Cl_p_fac;}
+ if (eta_q_Cl_r_fac) {eta_q_Cl_r *= eta_q * eta_q_Cl_r_fac;}
+ if (eta_q_Cl_dr_fac) {eta_q_Cl_dr *= eta_q * eta_q_Cl_dr_fac;}
+ if (eta_q_CY_beta_fac) {eta_q_CY_beta *= eta_q * eta_q_CY_beta_fac;}
+ if (eta_q_CY_p_fac) {eta_q_CY_p *= eta_q * eta_q_CY_p_fac;}
+ if (eta_q_CY_r_fac) {eta_q_CY_r *= eta_q * eta_q_CY_r_fac;}
+ if (eta_q_CY_dr_fac) {eta_q_CY_dr *= eta_q * eta_q_CY_dr_fac;}
+ if (eta_q_Cn_beta_fac) {eta_q_Cn_beta *= eta_q * eta_q_Cn_beta_fac;}
+ if (eta_q_Cn_p_fac) {eta_q_Cn_p *= eta_q * eta_q_Cn_p_fac;}
+ if (eta_q_Cn_r_fac) {eta_q_Cn_r *= eta_q * eta_q_Cn_r_fac;}
+ if (eta_q_Cn_dr_fac) {eta_q_Cn_dr *= eta_q * eta_q_Cn_dr_fac;}
+ }
+ /* Need engineOmega for gyroscopic moments */
+ engineOmega = minOmega + Throttle[3] * (maxOmega - minOmega);
+ break;
+ }
case c172_flag:
{
//c172 engine lines ... looks like 0.83 is just a thrust increase
#include "uiuc_1Dinterpolation.h"
#include <FDM/LaRCsim/ls_generic.h>
#include <FDM/LaRCsim/ls_cockpit.h>
+#include <FDM/LaRCsim/ls_constants.h>
#ifdef __cplusplus
extern "C" {
HISTORY: 04/08/2000 initial release
06/18/2001 (RD) Added Throttle_pct_input
+ 08/29/2002 (MS) Added simpleSingleModel
----------------------------------------------------------------------
void uiuc_map_engine()
{
engine_map["simpleSingle"] = simpleSingle_flag ;
+ engine_map["simpleSingleModel"] = simpleSingleModel_flag ;
engine_map["c172"] = c172_flag ;
engine_map["cherokee"] = cherokee_flag ;
engine_map["Throttle_pct_input"]= Throttle_pct_input_flag ;
- engine_map["forcemom"] = forcemom_flag ;
- engine_map["Xp_input"] = Xp_input_flag ;
- engine_map["Zp_input"] = Zp_input_flag ;
- engine_map["Mp_input"] = Mp_input_flag ;
+ engine_map["gyroForce_Q_body"] = gyroForce_Q_body_flag ;
+ engine_map["gyroForce_R_body"] = gyroForce_R_body_flag ;
+ engine_map["omega"] = omega_flag ;
+ engine_map["omegaRPM"] = omegaRPM_flag ;
+ engine_map["polarInertia"] = polarInertia_flag ;
+ engine_map["slipstream_effects"] = slipstream_effects_flag ;
+ engine_map["propDia"] = propDia_flag ;
+ engine_map["eta_q_Cm_q"] = eta_q_Cm_q_flag ;
+ engine_map["eta_q_Cm_adot"] = eta_q_Cm_adot_flag ;
+ engine_map["eta_q_Cmfade"] = eta_q_Cmfade_flag ;
+ engine_map["eta_q_Cl_beta"] = eta_q_Cl_beta_flag ;
+ engine_map["eta_q_Cl_p"] = eta_q_Cl_p_flag ;
+ engine_map["eta_q_Cl_r"] = eta_q_Cl_r_flag ;
+ engine_map["eta_q_Cl_dr"] = eta_q_Cl_dr_flag ;
+ engine_map["eta_q_CY_beta"] = eta_q_CY_beta_flag ;
+ engine_map["eta_q_CY_p"] = eta_q_CY_p_flag ;
+ engine_map["eta_q_CY_r"] = eta_q_CY_r_flag ;
+ engine_map["eta_q_CY_dr"] = eta_q_CY_dr_flag ;
+ engine_map["eta_q_Cn_beta"] = eta_q_Cn_beta_flag ;
+ engine_map["eta_q_Cn_p"] = eta_q_Cn_p_flag ;
+ engine_map["eta_q_Cn_r"] = eta_q_Cn_r_flag ;
+ engine_map["eta_q_Cn_dr"] = eta_q_Cn_dr_flag ;
+ engine_map["forcemom"] = forcemom_flag ;
+ engine_map["Xp_input"] = Xp_input_flag ;
+ engine_map["Zp_input"] = Zp_input_flag ;
+ engine_map["Mp_input"] = Mp_input_flag ;
}
// end uiuc_map_engine.cpp
init_map["dyn_on_speed"] = dyn_on_speed_flag ;
init_map["dyn_on_speed_zero"] = dyn_on_speed_zero_flag ;
init_map["use_dyn_on_speed_curve1"] = use_dyn_on_speed_curve1_flag;
+ init_map["use_Alpha_dot_on_speed"] = use_Alpha_dot_on_speed_flag;
init_map["Alpha"] = Alpha_flag ;
init_map["Beta"] = Beta_flag ;
init_map["U_body"] = U_body_flag ;
record_map["M_n_rp"] = M_n_rp_record ;
/***********************Flapper Data********************/
- /* record_map["flapper_freq"] = flapper_freq_record ;
+ record_map["flapper_freq"] = flapper_freq_record ;
record_map["flapper_phi"] = flapper_phi_record ;
record_map["flapper_phi_deg"] = flapper_phi_deg_record ;
record_map["flapper_Lift"] = flapper_Lift_record ;
record_map["flapper_Thrust"] = flapper_Thrust_record ;
record_map["flapper_Inertia"] = flapper_Inertia_record ;
- record_map["flapper_Moment"] = flapper_Moment_record ;*/
+ record_map["flapper_Moment"] = flapper_Moment_record ;
+
+ /**************************Debug************************/
+ record_map["debug1"] = debug1_record ;
+ record_map["debug2"] = debug2_record ;
+ record_map["debug3"] = debug3_record ;
+
}
// end uiuc_map_record5.cpp
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;
- }
+ //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;