1
0
Fork 0

Robert Deters:

> I have attached some new additions to the UIUC code.  Most of the
> changes allow for the addition of apparent mass.  This is very
> useful with light aircraft and gliders.
This commit is contained in:
curt 2002-05-09 05:02:36 +00:00
parent e11f9c5b41
commit 37b665075f
6 changed files with 244 additions and 24 deletions

View file

@ -65,6 +65,9 @@
uiuc_3Dinterp_quick() function. Takes
advantage of data in a "nice" form (data
that are in a rectangular matrix).
04/21/2002 (MSS) Added new variables for apparent mass effects
and options for computing *_2U coefficient
scale factors.
----------------------------------------------------------------------
@ -155,7 +158,10 @@ enum {Dx_pilot_flag = 2000, Dy_pilot_flag, Dz_pilot_flag,
P_body_flag, Q_body_flag, R_body_flag,
Phi_flag, Theta_flag, Psi_flag,
Long_trim_flag, recordRate_flag, recordStartTime_flag,
nondim_rate_V_rel_wind_flag, dyn_on_speed_flag, Alpha_flag,
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,
Beta_flag, U_body_flag, V_body_flag, W_body_flag};
// geometry === Aircraft-specific geometric quantities
@ -173,7 +179,12 @@ enum {de_flag = 4000, da_flag, dr_flag,
enum {nomix_flag = 5000};
//mass ======== Aircraft-specific mass properties
enum {Weight_flag = 6000, Mass_flag, I_xx_flag, I_yy_flag, I_zz_flag, I_xz_flag};
enum {Weight_flag = 6000,
Mass_flag, I_xx_flag, I_yy_flag, I_zz_flag, I_xz_flag,
Mass_appMass_ratio_flag, I_xx_appMass_ratio_flag,
I_yy_appMass_ratio_flag, I_zz_appMass_ratio_flag,
Mass_appMass_flag, I_xx_appMass_flag,
I_yy_appMass_flag, I_zz_appMass_flag};
// engine ===== Propulsion data
enum {simpleSingle_flag = 7000, c172_flag, cherokee_flag,
@ -239,7 +250,13 @@ enum {iceTime_flag = 15000, transientTime_flag, eta_ice_final_flag,
// record ===== Record desired quantites to file
enum {Simtime_record = 16000, dt_record,
cbar_2U_record, b_2U_record, ch_2U_record,
Weight_record, Mass_record, I_xx_record, I_yy_record, I_zz_record, I_xz_record,
Mass_appMass_ratio_record, I_xx_appMass_ratio_record,
I_yy_appMass_ratio_record, I_zz_appMass_ratio_record,
Mass_appMass_record, I_xx_appMass_record,
I_yy_appMass_record, I_zz_appMass_record,
Dx_pilot_record, Dy_pilot_record, Dz_pilot_record,
Dx_cg_record, Dy_cg_record, Dz_cg_record,
@ -438,16 +455,24 @@ struct AIRCRAFT
/* init ========== Initial values for equations of motion =======*/
map <string,int> init_map;
#define init_map aircraft_->init_map
#define init_map aircraft_->init_map
int recordRate;
#define recordRate aircraft_->recordRate
double recordStartTime;
#define recordStartTime aircraft_->recordStartTime
bool use_V_rel_wind_2U;
#define use_V_rel_wind_2U aircraft_->use_V_rel_wind_2U
bool nondim_rate_V_rel_wind;
#define nondim_rate_V_rel_wind aircraft_->nondim_rate_V_rel_wind
bool use_abs_U_body_2U;
#define use_abs_U_body_2U aircraft_->use_abs_U_body_2U
double dyn_on_speed;
#define dyn_on_speed aircraft_->dyn_on_speed
double dyn_on_speed_zero;
#define dyn_on_speed_zero aircraft_->dyn_on_speed_zero
bool use_dyn_on_speed_curve1;
#define use_dyn_on_speed_curve1 aircraft_->use_dyn_on_speed_curve1
bool P_body_init_true;
double P_body_init;
#define P_body_init_true aircraft_->P_body_init_true
@ -638,6 +663,22 @@ struct AIRCRAFT
double Weight;
#define Weight aircraft_->Weight
double Mass_appMass_ratio;
#define Mass_appMass_ratio aircraft_->Mass_appMass_ratio
double I_xx_appMass_ratio;
#define I_xx_appMass_ratio aircraft_->I_xx_appMass_ratio
double I_yy_appMass_ratio;
#define I_yy_appMass_ratio aircraft_->I_yy_appMass_ratio
double I_zz_appMass_ratio;
#define I_zz_appMass_ratio aircraft_->I_zz_appMass_ratio
double Mass_appMass;
#define Mass_appMass aircraft_->Mass_appMass
double I_xx_appMass;
#define I_xx_appMass aircraft_->I_xx_appMass
double I_yy_appMass;
#define I_yy_appMass aircraft_->I_yy_appMass
double I_zz_appMass;
#define I_zz_appMass aircraft_->I_zz_appMass
/* Variables (token2) ===========================================*/
/* engine ======== Propulsion data ==============================*/

View file

@ -100,6 +100,7 @@
void uiuc_coefficients()
{
double l_trim, l_defl;
double V_rel_wind_dum, U_body_dum;
if (Alpha_init_true && Simtime==0)
Alpha = Alpha_init;
@ -109,34 +110,71 @@ void uiuc_coefficients()
// calculate rate derivative nondimensionalization factors
// check if speed is sufficient to compute dynamic pressure terms
if (nondim_rate_V_rel_wind) // c172_aero uses V_rel_wind
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);
ch_2U = ch / (2.0 * V_rel_wind);
b_2U = bw / (2.0 * V_rel_wind);
ch_2U = ch / (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 = ch / (2.0 * V_rel_wind_dum);
}
else
{
cbar_2U = 0.0;
b_2U = 0.0;
ch_2U = 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 = ch / (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 = ch / (2.0 * U_body_dum);
}
else
{
cbar_2U = 0.0;
b_2U = 0.0;
ch_2U = 0.0;
b_2U = 0.0;
ch_2U = 0.0;
}
}
else // use U_body which is probably more correct
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 = ch / (2.0 * U_body);
b_2U = bw / (2.0 * U_body);
ch_2U = ch / (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 = ch / (2.0 * U_body_dum);
beta_flow_clean_tail = cbar_2U;
}
else
{
cbar_2U = 0.0;
b_2U = 0.0;
ch_2U = 0.0;
b_2U = 0.0;
ch_2U = 0.0;
}
}

View file

@ -90,8 +90,12 @@ void uiuc_map_init()
init_map["Long_trim"] = Long_trim_flag ;
init_map["recordRate"] = recordRate_flag ;
init_map["recordStartTime"] = recordStartTime_flag ;
init_map["use_V_rel_wind_2U"] = use_V_rel_wind_2U_flag ;
init_map["nondim_rate_V_rel_wind"]= nondim_rate_V_rel_wind_flag;
init_map["use_abs_U_body_2U"] = use_abs_U_body_2U_flag ;
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["Alpha"] = Alpha_flag ;
init_map["Beta"] = Beta_flag ;
init_map["U_body"] = U_body_flag ;

View file

@ -74,6 +74,14 @@ void uiuc_map_mass()
mass_map["I_yy"] = I_yy_flag ;
mass_map["I_zz"] = I_zz_flag ;
mass_map["I_xz"] = I_xz_flag ;
mass_map["Mass_appMass_ratio"] = Mass_appMass_ratio_flag ;
mass_map["I_xx_appMass_ratio"] = I_xx_appMass_ratio_flag ;
mass_map["I_yy_appMass_ratio"] = I_yy_appMass_ratio_flag ;
mass_map["I_zz_appMass_ratio"] = I_zz_appMass_ratio_flag ;
mass_map["Mass_appMass"] = Mass_appMass_flag ;
mass_map["I_xx_appMass"] = I_xx_appMass_flag ;
mass_map["I_yy_appMass"] = I_yy_appMass_flag ;
mass_map["I_zz_appMass"] = I_zz_appMass_flag ;
}
// end uiuc_map_mass.cpp

View file

@ -263,7 +263,8 @@ void uiuc_menu( string aircraft_name )
/* 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 = 33; /* 20 kts, default */
dyn_on_speed_zero = 0.5 * dyn_on_speed; /* only used of use_dyn_on_speed_curve1 is used */
@ -533,11 +534,21 @@ void uiuc_menu( string aircraft_name )
recordStartTime = token_value;
break;
}
case use_V_rel_wind_2U_flag:
{
use_V_rel_wind_2U = true;
break;
}
case nondim_rate_V_rel_wind_flag:
{
nondim_rate_V_rel_wind = true;
break;
}
case use_abs_U_body_2U_flag:
{
use_abs_U_body_2U = true;
break;
}
case dyn_on_speed_flag:
{
if (check_float(linetoken3))
@ -548,6 +559,21 @@ void uiuc_menu( string aircraft_name )
dyn_on_speed = token_value;
break;
}
case dyn_on_speed_zero_flag:
{
if (check_float(linetoken3))
token3 >> token_value;
else
uiuc_warnings_errors(1, *command_line);
dyn_on_speed_zero = token_value;
break;
}
case use_dyn_on_speed_curve1_flag:
{
use_dyn_on_speed_curve1 = true;
break;
}
case Alpha_flag:
{
if (check_float(linetoken3))
@ -1032,6 +1058,94 @@ void uiuc_menu( string aircraft_name )
massParts -> storeCommands (*command_line);
break;
}
case Mass_appMass_ratio_flag:
{
if (check_float(linetoken3))
token3 >> token_value;
else
uiuc_warnings_errors(1, *command_line);
Mass_appMass_ratio = token_value;
massParts -> storeCommands (*command_line);
break;
}
case I_xx_appMass_ratio_flag:
{
if (check_float(linetoken3))
token3 >> token_value;
else
uiuc_warnings_errors(1, *command_line);
I_xx_appMass_ratio = token_value;
massParts -> storeCommands (*command_line);
break;
}
case I_yy_appMass_ratio_flag:
{
if (check_float(linetoken3))
token3 >> token_value;
else
uiuc_warnings_errors(1, *command_line);
I_yy_appMass_ratio = token_value;
massParts -> storeCommands (*command_line);
break;
}
case I_zz_appMass_ratio_flag:
{
if (check_float(linetoken3))
token3 >> token_value;
else
uiuc_warnings_errors(1, *command_line);
I_zz_appMass_ratio = token_value;
massParts -> storeCommands (*command_line);
break;
}
case Mass_appMass_flag:
{
if (check_float(linetoken3))
token3 >> token_value;
else
uiuc_warnings_errors(1, *command_line);
Mass_appMass = token_value;
massParts -> storeCommands (*command_line);
break;
}
case I_xx_appMass_flag:
{
if (check_float(linetoken3))
token3 >> token_value;
else
uiuc_warnings_errors(1, *command_line);
I_xx_appMass = token_value;
massParts -> storeCommands (*command_line);
break;
}
case I_yy_appMass_flag:
{
if (check_float(linetoken3))
token3 >> token_value;
else
uiuc_warnings_errors(1, *command_line);
I_yy_appMass = token_value;
massParts -> storeCommands (*command_line);
break;
}
case I_zz_appMass_flag:
{
if (check_float(linetoken3))
token3 >> token_value;
else
uiuc_warnings_errors(1, *command_line);
I_zz_appMass = token_value;
massParts -> storeCommands (*command_line);
break;
}
default:
{
uiuc_warnings_errors(2, *command_line);

View file

@ -199,9 +199,9 @@ void uiuc_force_moment(double dt)
}
else
{
F_X_wind = -CD * qS;
F_Y_wind = CY * qS;
F_Z_wind = -CL * qS;
F_X_wind = -CD * qS * Cos_beta * Cos_beta;
F_Y_wind = CY * qS * Cos_beta * Cos_beta;
F_Z_wind = -CL * qS * Cos_beta * Cos_beta;
/* 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;
@ -209,14 +209,29 @@ void uiuc_force_moment(double dt)
F_Z_aero = F_X_wind * Sin_alpha * Cos_beta - F_Y_wind * Sin_alpha * Sin_beta + F_Z_wind * Cos_alpha;
}
/* Moment calculations */
M_l_aero = Cl * qSb;
M_m_aero = Cm * qScbar;
M_n_aero = Cn * qSb;
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;
/* Call flight data recorder */
// if (Simtime >= recordStartTime)
// uiuc_recorder(dt);
/* Adding in apparent mass effects */
if (Mass_appMass_ratio)
F_Z_aero += -(Mass_appMass_ratio * Mass) * W_dot_body;
if (I_xx_appMass_ratio)
M_l_aero += -(I_xx_appMass_ratio * I_xx) * P_dot_body;
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;
if (Mass_appMass)
F_Z_aero += -Mass_appMass * W_dot_body;
if (I_xx_appMass)
M_l_aero += -I_xx_appMass * P_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;
// fog field update
Fog = 0;