1
0
Fork 0

LaRCsim FDM - detabbing of all files.

All '\t' have been replaced with 8 spaces, as most of the code is indented with spaces.
This commit is contained in:
Edward d'Auvergne 2015-12-10 10:07:21 +01:00
parent dc04fc2294
commit 9b7db929f2
42 changed files with 3976 additions and 3976 deletions

View file

@ -1,42 +1,42 @@
I will explain assumptions I have made:
All global vars, such as Alpha, Alpha_dot, Density, Altitude, so on,
have correct values in the moment cherokee functions are called.
All global vars, such as Alpha, Alpha_dot, Density, Altitude, so on,
have correct values in the moment cherokee functions are called.
Body coord system is defined as follows:
X_body -> from cg to nose
Y_body -> along right wing
Z_body -> "down" (to make right coord system)
All forces and moments act in CG.
Body coord system is defined as follows:
X_body -> from cg to nose
Y_body -> along right wing
Z_body -> "down" (to make right coord system)
All forces and moments act in CG.
If strange behaviour is experienced, (like impossibility of level
flight), it is probably misused coord system. Let me know and fix
the error.
If strange behaviour is experienced, (like impossibility of level
flight), it is probably misused coord system. Let me know and fix
the error.
All controls are in the range [-1.0, 1.0] If it is not so, values in
cherokee_aero.c on lines 119-121 should be changed acordingly. If
commands appear to be oposite, this is the place to change sign
convention.
All controls are in the range [-1.0, 1.0] If it is not so, values in
cherokee_aero.c on lines 119-121 should be changed acordingly. If
commands appear to be oposite, this is the place to change sign
convention.
Engine controls are in range [0.0, 1.0] (I found out later that lower
bound is -0.2, so I added fabs(). I know, it is dirty and phisiclly
wrong, but it was simply the fastest way to deal with it).
Engine controls are in range [0.0, 1.0] (I found out later that lower
bound is -0.2, so I added fabs(). I know, it is dirty and phisiclly
wrong, but it was simply the fastest way to deal with it).
All initialization files are *.ic:
mass = 74.53 slugs
Ixx = 1070 slugs
Iyy = 1249 slugs
Izz = 2312 slugs
Ixz = 0.0 slugs
above changes are writen in *.ic included in cherokee.zip. However,
other data in *.ic files are not changed in any way.
All initialization files are *.ic:
mass = 74.53 slugs
Ixx = 1070 slugs
Iyy = 1249 slugs
Izz = 2312 slugs
Ixz = 0.0 slugs
above changes are writen in *.ic included in cherokee.zip. However,
other data in *.ic files are not changed in any way.
aditional properties: (if needed)
S = 157.5 ft^2 -> wing area
b = 30.0 ft -> wing span
Ar = 5.71 -> aspect ratio
c = 5.25 ft -> midspan chord
aditional properties: (if needed)
S = 157.5 ft^2 -> wing area
b = 30.0 ft -> wing span
Ar = 5.71 -> aspect ratio
c = 5.25 ft -> midspan chord
Once more: Source are TOTALY UNCHECKED. I hope it will work, but I do not
@ -50,11 +50,11 @@ gsikic@public.srce.hr
PS
Work to be done (for myself):
Landing gear (it is just navion_gear.c copied for now, these are similar
class of aircraft, so it should work),
Alpha_max is still undone,
Spin (if I find any references concerning simulating spin),
Efect of ground,
Flaps,
.......
Landing gear (it is just navion_gear.c copied for now, these are similar
class of aircraft, so it should work),
Alpha_max is still undone,
Spin (if I find any references concerning simulating spin),
Efect of ground,
Flaps,
.......

View file

@ -45,14 +45,14 @@ void FGNewEngine::init(double dt) {
CONVERT_HP_TO_WATTS = 745.6999;
// Properties of working fluids
Cp_air = 1005; // J/KgK
Cp_fuel = 1700; // J/KgK
Cp_air = 1005; // J/KgK
Cp_fuel = 1700; // J/KgK
calorific_value_fuel = 47.3e6; // W/Kg Note that this is only an approximate value
rho_fuel = 800; // kg/m^3 - an estimate for now
rho_fuel = 800; // kg/m^3 - an estimate for now
R_air = 287.3;
// environment inputs
p_amb_sea_level = 101325; // Pascals
p_amb_sea_level = 101325; // Pascals
// Control inputs - ARE THESE NEEDED HERE???
Throttle_Lever_Pos = 75;
@ -67,7 +67,7 @@ void FGNewEngine::init(double dt) {
MaxHP = 200; //Lycoming IO360 -A-C-D series
// MaxHP = 180; //Current Lycoming IO360 ?
// displacement = 520; //Continental IO520-M
displacement = 360; //Lycoming IO360
displacement = 360; //Lycoming IO360
displacement_SI = displacement * CONVERT_CUBIC_INCHES_TO_METERS_CUBED;
engine_inertia = 0.2; //kgm^2 - value taken from a popular family saloon car engine - need to find an aeroengine value !!!!!
prop_inertia = 0.05; //kgm^2 - this value is a total guess - dcl
@ -77,7 +77,7 @@ void FGNewEngine::init(double dt) {
Max_Manifold_Pressure = 28.50; //Inches Hg. An approximation - should be able to find it in the engine performance data
Min_Manifold_Pressure = 6.5; //Inches Hg. This is a guess corresponding to approx 0.24 bar MAP (7 in Hg) - need to find some proper data for this
Max_RPM = 2700;
Min_RPM = 600; //Recommended idle from Continental data sheet
Min_RPM = 600; //Recommended idle from Continental data sheet
Mag_Derate_Percent = 5;
Gear_Ratio = 1;
n_R = 2; // Number of crank revolutions per power cycle - 2 for a 4 stroke engine.
@ -90,20 +90,20 @@ void FGNewEngine::init(double dt) {
// Initialise Engine Variables used by this instance
if(running)
RPM = 600;
RPM = 600;
else
RPM = 0;
RPM = 0;
Percentage_Power = 0;
Manifold_Pressure = 29.96; // Inches
Fuel_Flow_gals_hr = 0;
// Torque = 0;
Torque_SI = 0;
CHT = 298.0; //deg Kelvin
CHT_degF = (CHT * 1.8) - 459.67; //deg Fahrenheit
CHT = 298.0; //deg Kelvin
CHT_degF = (CHT * 1.8) - 459.67; //deg Fahrenheit
Mixture = 14;
Oil_Pressure = 0; // PSI
Oil_Temp = 85; // Deg C
current_oil_temp = 298.0; //deg Kelvin
Oil_Pressure = 0; // PSI
Oil_Temp = 85; // Deg C
current_oil_temp = 298.0; //deg Kelvin
/**** one of these is superfluous !!!!***/
HP = 0;
RPS = 0;
@ -124,24 +124,24 @@ void FGNewEngine::update() {
// Hack for testing - should output every 5 seconds
static int count1 = 0;
if(count1 == 0) {
// cout << "P_atmos = " << p_amb << " T_atmos = " << T_amb << '\n';
// cout << "Manifold pressure = " << Manifold_Pressure << " True_Manifold_Pressure = " << True_Manifold_Pressure << '\n';
// cout << "p_amb_sea_level = " << p_amb_sea_level << '\n';
// cout << "equivalence_ratio = " << equivalence_ratio << '\n';
// cout << "combustion_efficiency = " << combustion_efficiency << '\n';
// cout << "AFR = " << 14.7 / equivalence_ratio << '\n';
// cout << "Mixture lever = " << Mixture_Lever_Pos << '\n';
// cout << "n = " << RPM << " rpm\n";
// cout << "P_atmos = " << p_amb << " T_atmos = " << T_amb << '\n';
// cout << "Manifold pressure = " << Manifold_Pressure << " True_Manifold_Pressure = " << True_Manifold_Pressure << '\n';
// cout << "p_amb_sea_level = " << p_amb_sea_level << '\n';
// cout << "equivalence_ratio = " << equivalence_ratio << '\n';
// cout << "combustion_efficiency = " << combustion_efficiency << '\n';
// cout << "AFR = " << 14.7 / equivalence_ratio << '\n';
// cout << "Mixture lever = " << Mixture_Lever_Pos << '\n';
// cout << "n = " << RPM << " rpm\n";
// cout << "T_amb = " << T_amb << '\n';
// cout << "running = " << running << '\n';
// cout << "fuel = " << fgGetFloat("/consumables/fuel/tank[0]/level-gal_us") << '\n';
// cout << "Percentage_Power = " << Percentage_Power << '\n';
// cout << "current_oil_temp = " << current_oil_temp << '\n';
// cout << "EGT = " << EGT << '\n';
// cout << "running = " << running << '\n';
// cout << "fuel = " << fgGetFloat("/consumables/fuel/tank[0]/level-gal_us") << '\n';
// cout << "Percentage_Power = " << Percentage_Power << '\n';
// cout << "current_oil_temp = " << current_oil_temp << '\n';
// cout << "EGT = " << EGT << '\n';
}
count1++;
if(count1 == 100)
count1 = 0;
count1 = 0;
*/
// Check parameters that may alter the operating state of the engine.
@ -156,59 +156,59 @@ void FGNewEngine::update() {
// 2 -> right only
// 3 -> both
if(mag_pos != 0) {
spark = true;
spark = true;
} else {
spark = false;
spark = false;
} // neglects battery voltage, master on switch, etc for now.
if((mag_pos == 1) || (mag_pos > 2))
Magneto_Left = true;
Magneto_Left = true;
if(mag_pos > 1)
Magneto_Right = true;
Magneto_Right = true;
// crude check for fuel
if((fgGetFloat("/consumables/fuel/tank[0]/level-gal_us") > 0) || (fgGetFloat("/consumables/fuel/tank[1]/level-gal_us") > 0)) {
fuel = true;
fuel = true;
} else {
fuel = false;
fuel = false;
} // Need to make this better, eg position of fuel selector switch.
// Check if we are turning the starter motor
if(cranking != starter) {
// This check saves .../cranking from getting updated every loop - they only update when changed.
cranking = starter;
crank_counter = 0;
// This check saves .../cranking from getting updated every loop - they only update when changed.
cranking = starter;
crank_counter = 0;
}
// Note that although /engines/engine[0]/starter and /engines/engine[0]/cranking might appear to be duplication it is
// not since the starter may be engaged with the battery voltage too low for cranking to occur (or perhaps the master
// switch just left off) and the sound manager will read .../cranking to determine wether to play a cranking sound.
// For now though none of that is implemented so cranking can be set equal to .../starter without further checks.
// int Alternate_Air_Pos =0; // Off = 0. Reduces power by 3 % for same throttle setting
// int Alternate_Air_Pos =0; // Off = 0. Reduces power by 3 % for same throttle setting
// DCL - don't know what this Alternate_Air_Pos is - this is a leftover from the Schubert code.
//Check mode of engine operation
if(cranking) {
crank_counter++;
if(RPM <= 480) {
RPM += 100;
if(RPM > 480)
RPM = 480;
} else {
// consider making a horrible noise if the starter is engaged with the engine running
}
crank_counter++;
if(RPM <= 480) {
RPM += 100;
if(RPM > 480)
RPM = 480;
} else {
// consider making a horrible noise if the starter is engaged with the engine running
}
}
if((!running) && (spark) && (fuel) && (crank_counter > 120)) {
// start the engine if revs high enough
if(RPM > 450) {
// For now just instantaneously start but later we should maybe crank for a bit
running = true;
// RPM = 600;
}
// start the engine if revs high enough
if(RPM > 450) {
// For now just instantaneously start but later we should maybe crank for a bit
running = true;
// RPM = 600;
}
}
if( (running) && ((!spark)||(!fuel)) ) {
// Cut the engine
// note that we only cut the power - the engine may continue to spin if the prop is in a moving airstream
running = false;
// Cut the engine
// note that we only cut the power - the engine may continue to spin if the prop is in a moving airstream
running = false;
}
// Now we've ascertained whether the engine is running or not we can start to do the engine calculations 'proper'
@ -250,14 +250,14 @@ void FGNewEngine::update() {
}
else {
Torque_SI = ((Power_SI * 60.0) / (2.0 * LS_PI * RPM)) - Torque_FMEP; //Torque = power / angular velocity
// cout << Torque << " Nm\n";
// cout << Torque << " Nm\n";
}
//Calculate Exhaust gas temperature
if(running)
Calc_EGT();
Calc_EGT();
else
EGT = 298.0;
EGT = 298.0;
// Calculate Cylinder Head Temperature
Calc_CHT();
@ -286,14 +286,14 @@ void FGNewEngine::update() {
// And finally a last check on the engine state after doing the torque balance with the prop - have we stalled?
if(running) {
//Check if we have stalled the engine
if (RPM == 0) {
running = false;
} else if((RPM <= 480) && (cranking)) {
//Make sure the engine noise dosn't play if the engine won't start due to eg mixture lever pulled out.
running = false;
EGT = 298.0;
}
//Check if we have stalled the engine
if (RPM == 0) {
running = false;
} else if((RPM <= 480) && (cranking)) {
//Make sure the engine noise dosn't play if the engine won't start due to eg mixture lever pulled out.
running = false;
EGT = 298.0;
}
}
// And finally, do any unit conversions from internal units to output units
@ -324,22 +324,22 @@ float FGNewEngine::Lookup_Combustion_Efficiency(float thi_actual)
for(i=0;i<j;i++)
{
if(i == (j-1)) {
// Assume linear extrapolation of the slope between the last two points beyond the last point
float dydx = (neta_comb[i] - neta_comb[i-1]) / (thi[i] - thi[i-1]);
neta_comb_actual = neta_comb[i] + dydx * (thi_actual - thi[i]);
return neta_comb_actual;
}
if(thi_actual == thi[i]) {
neta_comb_actual = neta_comb[i];
return neta_comb_actual;
}
if((thi_actual > thi[i]) && (thi_actual < thi[i + 1])) {
//do linear interpolation between the two points
factor = (thi_actual - thi[i]) / (thi[i+1] - thi[i]);
neta_comb_actual = (factor * (neta_comb[i+1] - neta_comb[i])) + neta_comb[i];
return neta_comb_actual;
}
if(i == (j-1)) {
// Assume linear extrapolation of the slope between the last two points beyond the last point
float dydx = (neta_comb[i] - neta_comb[i-1]) / (thi[i] - thi[i-1]);
neta_comb_actual = neta_comb[i] + dydx * (thi_actual - thi[i]);
return neta_comb_actual;
}
if(thi_actual == thi[i]) {
neta_comb_actual = neta_comb[i];
return neta_comb_actual;
}
if((thi_actual > thi[i]) && (thi_actual < thi[i + 1])) {
//do linear interpolation between the two points
factor = (thi_actual - thi[i]) / (thi[i+1] - thi[i]);
neta_comb_actual = (factor * (neta_comb[i+1] - neta_comb[i])) + neta_comb[i];
return neta_comb_actual;
}
}
//if we get here something has gone badly wrong
@ -372,28 +372,28 @@ float FGNewEngine::Power_Mixture_Correlation(float thi_actual)
for(i=0;i<j;i++)
{
if(i == (j-1)) {
// Assume linear extrapolation of the slope between the last two points beyond the last point
dydx = (mixPerPow[i] - mixPerPow[i-1]) / (AFR[i] - AFR[i-1]);
mixPerPow_actual = mixPerPow[i] + dydx * (AFR_actual - AFR[i]);
return mixPerPow_actual;
}
if((i == 0) && (AFR_actual < AFR[i])) {
// Assume linear extrapolation of the slope between the first two points for points before the first point
dydx = (mixPerPow[1] - mixPerPow[0]) / (AFR[1] - AFR[0]);
mixPerPow_actual = mixPerPow[0] + dydx * (AFR_actual - AFR[0]);
return mixPerPow_actual;
}
if(AFR_actual == AFR[i]) {
mixPerPow_actual = mixPerPow[i];
return mixPerPow_actual;
}
if((AFR_actual > AFR[i]) && (AFR_actual < AFR[i + 1])) {
//do linear interpolation between the two points
factor = (AFR_actual - AFR[i]) / (AFR[i+1] - AFR[i]);
mixPerPow_actual = (factor * (mixPerPow[i+1] - mixPerPow[i])) + mixPerPow[i];
return mixPerPow_actual;
}
if(i == (j-1)) {
// Assume linear extrapolation of the slope between the last two points beyond the last point
dydx = (mixPerPow[i] - mixPerPow[i-1]) / (AFR[i] - AFR[i-1]);
mixPerPow_actual = mixPerPow[i] + dydx * (AFR_actual - AFR[i]);
return mixPerPow_actual;
}
if((i == 0) && (AFR_actual < AFR[i])) {
// Assume linear extrapolation of the slope between the first two points for points before the first point
dydx = (mixPerPow[1] - mixPerPow[0]) / (AFR[1] - AFR[0]);
mixPerPow_actual = mixPerPow[0] + dydx * (AFR_actual - AFR[0]);
return mixPerPow_actual;
}
if(AFR_actual == AFR[i]) {
mixPerPow_actual = mixPerPow[i];
return mixPerPow_actual;
}
if((AFR_actual > AFR[i]) && (AFR_actual < AFR[i + 1])) {
//do linear interpolation between the two points
factor = (AFR_actual - AFR[i]) / (AFR[i+1] - AFR[i]);
mixPerPow_actual = (factor * (mixPerPow[i+1] - mixPerPow[i])) + mixPerPow[i];
return mixPerPow_actual;
}
}
//if we get here something has gone badly wrong
@ -408,16 +408,16 @@ void FGNewEngine::Calc_CHT()
{
float h1 = -95.0; //co-efficient for free convection
float h2 = -3.95; //co-efficient for forced convection
float h3 = -0.05; //co-efficient for forced convection due to prop backwash
float v_apparent; //air velocity over cylinder head in m/s
float h3 = -0.05; //co-efficient for forced convection due to prop backwash
float v_apparent; //air velocity over cylinder head in m/s
float v_dot_cooling_air;
float m_dot_cooling_air;
float temperature_difference;
float arbitary_area = 1.0;
float dqdt_from_combustion;
float dqdt_forced; //Rate of energy transfer to/from cylinder head due to forced convection (Joules) (sign convention: to cylinder head is +ve)
float dqdt_free; //Rate of energy transfer to/from cylinder head due to free convection (Joules) (sign convention: to cylinder head is +ve)
float dqdt_cylinder_head; //Overall energy change in cylinder head
float dqdt_forced; //Rate of energy transfer to/from cylinder head due to forced convection (Joules) (sign convention: to cylinder head is +ve)
float dqdt_free; //Rate of energy transfer to/from cylinder head due to free convection (Joules) (sign convention: to cylinder head is +ve)
float dqdt_cylinder_head; //Overall energy change in cylinder head
float CpCylinderHead = 800.0; //FIXME - this is a guess - I need to look up the correct value
float MassCylinderHead = 8.0; //Kg - this is a guess - it dosn't have to be absolutely accurate but can be varied to alter the warm-up rate
float HeatCapacityCylinderHead;
@ -484,11 +484,11 @@ float FGNewEngine::Calc_Manifold_Pressure ( float LeverPosn, float MaxMan, float
//allow for idle bypass valve or slightly open throttle stop
if(Inches < MinMan)
Inches = MinMan;
Inches = MinMan;
//Check for stopped engine (crudest way of compensating for engine speed)
if(RPM == 0)
Inches = 29.92;
Inches = 29.92;
return Inches;
}
@ -566,14 +566,14 @@ void FGNewEngine::Calc_Percentage_Power(bool mag_left, bool mag_right)
// Now Derate engine for the effects of Bad/Switched off magnetos
//if (Magneto_Left == 0 && Magneto_Right == 0) {
if(!running) {
// cout << "Both OFF\n";
Percentage_Power = 0;
// cout << "Both OFF\n";
Percentage_Power = 0;
} else if (mag_left && mag_right) {
// cout << "Both On ";
// cout << "Both On ";
} else if (mag_left == 0 || mag_right== 0) {
// cout << "1 Magneto Failed ";
Percentage_Power = Percentage_Power * ((100.0 - Mag_Derate_Percent)/100.0);
// cout << FGEng1_Percentage_Power << "%" << "\t";
// cout << "1 Magneto Failed ";
Percentage_Power = Percentage_Power * ((100.0 - Mag_Derate_Percent)/100.0);
// cout << FGEng1_Percentage_Power << "%" << "\t";
}
/*
//DCL - stall the engine if RPM drops below 450 - this is possible if mixture lever is pulled right out
@ -582,24 +582,24 @@ void FGNewEngine::Calc_Percentage_Power(bool mag_left, bool mag_right)
Percentage_Power = 0;
*/
if(Percentage_Power < 0)
Percentage_Power = 0;
Percentage_Power = 0;
}
// Calculate Oil Temperature in degrees Kelvin
float FGNewEngine::Calc_Oil_Temp (float oil_temp)
{
float idle_percentage_power = 2.3; // approximately
float target_oil_temp; // Steady state oil temp at the current engine conditions
float time_constant; // The time constant for the differential equation
float idle_percentage_power = 2.3; // approximately
float target_oil_temp; // Steady state oil temp at the current engine conditions
float time_constant; // The time constant for the differential equation
if(running) {
target_oil_temp = 363;
time_constant = 500; // Time constant for engine-on idling.
if(Percentage_Power > idle_percentage_power) {
time_constant /= ((Percentage_Power / idle_percentage_power) / 10.0); // adjust for power
}
target_oil_temp = 363;
time_constant = 500; // Time constant for engine-on idling.
if(Percentage_Power > idle_percentage_power) {
time_constant /= ((Percentage_Power / idle_percentage_power) / 10.0); // adjust for power
}
} else {
target_oil_temp = 298;
time_constant = 1000; // Time constant for engine-off; reflects the fact that oil is no longer getting circulated
target_oil_temp = 298;
time_constant = 1000; // Time constant for engine-off; reflects the fact that oil is no longer getting circulated
}
float dOilTempdt = (target_oil_temp - oil_temp) / time_constant;
@ -612,18 +612,18 @@ float FGNewEngine::Calc_Oil_Temp (float oil_temp)
// Calculate Oil Pressure
float FGNewEngine::Calc_Oil_Press (float Oil_Temp, float Engine_RPM)
{
float Oil_Pressure = 0; //PSI
float Oil_Press_Relief_Valve = 60; //PSI
float Oil_Pressure = 0; //PSI
float Oil_Press_Relief_Valve = 60; //PSI
float Oil_Press_RPM_Max = 1800;
float Design_Oil_Temp = 85; //Celsius
float Oil_Viscosity_Index = 0.25; // PSI/Deg C
// float Temp_Deviation = 0; // Deg C
float Design_Oil_Temp = 85; //Celsius
float Oil_Viscosity_Index = 0.25; // PSI/Deg C
// float Temp_Deviation = 0; // Deg C
Oil_Pressure = (Oil_Press_Relief_Valve / Oil_Press_RPM_Max) * Engine_RPM;
// Pressure relief valve opens at Oil_Press_Relief_Valve PSI setting
if (Oil_Pressure >= Oil_Press_Relief_Valve) {
Oil_Pressure = Oil_Press_Relief_Valve;
Oil_Pressure = Oil_Press_Relief_Valve;
}
// Now adjust pressure according to Temp which affects the viscosity
@ -640,7 +640,7 @@ void FGNewEngine::Do_Prop_Calcs()
float Gear_Ratio = 1.0;
float forward_velocity; // m/s
float prop_power_consumed_SI; // Watts
double J; // advance ratio - dimensionless
double J; // advance ratio - dimensionless
double Cp_20; // coefficient of power for 20 degree blade angle
double Cp_25; // coefficient of power for 25 degree blade angle
double Cp; // Our actual coefficient of power
@ -675,8 +675,8 @@ void FGNewEngine::Do_Prop_Calcs()
//cout << "prop HP consumed = " << prop_power_consumed_SI / 745.699 << '\n';
if(angular_velocity_SI == 0)
prop_torque = 0;
// However this can give problems - if rpm == 0 but forward velocity increases the prop should be able to generate a torque to start the engine spinning
// Unlikely to happen in practice - but I suppose someone could move the lever of a stopped large piston engine from feathered to windmilling.
// However this can give problems - if rpm == 0 but forward velocity increases the prop should be able to generate a torque to start the engine spinning
// Unlikely to happen in practice - but I suppose someone could move the lever of a stopped large piston engine from feathered to windmilling.
// This *does* give problems - if the plane is put into a steep climb whilst windmilling the engine friction will eventually stop it spinning.
// When put back into a dive it never starts re-spinning again. Although it is unlikely that anyone would do this in real life, they might well do it in a sim!!!
else
@ -690,11 +690,11 @@ void FGNewEngine::Do_Prop_Calcs()
// Check for zero forward velocity to avoid divide by zero
if(forward_velocity < 0.0001)
prop_thrust = 0.0;
// I don't see how this works - how can the plane possibly start from rest ???
// Hmmmm - it works because the forward_velocity at present never drops below about 0.03 even at rest
// We can't really rely on this in the future - needs fixing !!!!
// The problem is that we're doing this calculation backwards - we're working out the thrust from the power consumed and the velocity, which becomes invalid as velocity goes to zero.
// It would be far more natural to work out the power consumed from the thrust - FIXME!!!!!.
// I don't see how this works - how can the plane possibly start from rest ???
// Hmmmm - it works because the forward_velocity at present never drops below about 0.03 even at rest
// We can't really rely on this in the future - needs fixing !!!!
// The problem is that we're doing this calculation backwards - we're working out the thrust from the power consumed and the velocity, which becomes invalid as velocity goes to zero.
// It would be far more natural to work out the power consumed from the thrust - FIXME!!!!!.
else
prop_thrust = neta_prop * prop_power_consumed_SI / forward_velocity; //TODO - rename forward_velocity to IAS_SI
//cout << "prop_thrust = " << prop_thrust << '\n';

View file

@ -36,22 +36,22 @@ private:
float CONVERT_HP_TO_WATTS;
// Properties of working fluids
float Cp_air; // J/KgK
float Cp_fuel; // J/KgK
float Cp_air; // J/KgK
float Cp_fuel; // J/KgK
float calorific_value_fuel; // W/Kg
float rho_fuel; // kg/m^3
float rho_air; // kg/m^3
float rho_fuel; // kg/m^3
float rho_air; // kg/m^3
// environment inputs
float p_amb_sea_level; // Sea level ambient pressure in Pascals
float p_amb; // Ambient pressure at current altitude in Pascals
float T_amb; // ditto deg Kelvin
float p_amb_sea_level; // Sea level ambient pressure in Pascals
float p_amb; // Ambient pressure at current altitude in Pascals
float T_amb; // ditto deg Kelvin
// Control inputs
float Throttle_Lever_Pos; // 0 = Closed, 100 = Fully Open
float Propeller_Lever_Pos; // 0 = Full Course 100 = Full Fine
float Mixture_Lever_Pos; // 0 = Idle Cut Off 100 = Full Rich
int mag_pos; // 0=off, 1=left, 2=right, 3=both.
float Throttle_Lever_Pos; // 0 = Closed, 100 = Fully Open
float Propeller_Lever_Pos; // 0 = Full Course 100 = Full Fine
float Mixture_Lever_Pos; // 0 = Idle Cut Off 100 = Full Rich
int mag_pos; // 0=off, 1=left, 2=right, 3=both.
bool starter;
//misc
@ -59,75 +59,75 @@ private:
double time_step;
// Engine Specific Variables that should be read in from a config file
float MaxHP; // Horsepower
float displacement; // Cubic inches
float displacement_SI; //m^3 (derived from above rather than read in)
float engine_inertia; //kg.m^2
float prop_inertia; //kg.m^2
float Max_Fuel_Flow; // Units??? Do we need this variable any more??
float MaxHP; // Horsepower
float displacement; // Cubic inches
float displacement_SI; //m^3 (derived from above rather than read in)
float engine_inertia; //kg.m^2
float prop_inertia; //kg.m^2
float Max_Fuel_Flow; // Units??? Do we need this variable any more??
// Engine specific variables that maybe should be read in from config but are pretty generic and won't vary much for a naturally aspirated piston engine.
float Max_Manifold_Pressure; // inches Hg - typical manifold pressure at full throttle and typical max rpm
float Min_Manifold_Pressure; // inches Hg - typical manifold pressure at idle (closed throttle)
float Max_RPM; // rpm - this is really a bit of a hack and could be make redundant if the prop model works properly and takes tips at speed of sound into account.
float Min_RPM; // rpm - possibly redundant ???
float Mag_Derate_Percent; // Percentage reduction in power when mags are switched from 'both' to either 'L' or 'R'
float Gear_Ratio; // Gearing between engine and propellor
float Max_RPM; // rpm - this is really a bit of a hack and could be make redundant if the prop model works properly and takes tips at speed of sound into account.
float Min_RPM; // rpm - possibly redundant ???
float Mag_Derate_Percent; // Percentage reduction in power when mags are switched from 'both' to either 'L' or 'R'
float Gear_Ratio; // Gearing between engine and propellor
float n_R; // Number of cycles per power stroke - 2 for a 4 stroke engine.
// Engine Variables not read in from config file
float RPM; // rpm
float Percentage_Power; // Power output as percentage of maximum power output
float Manifold_Pressure; // Inches Hg
float Fuel_Flow_gals_hr; // USgals/hour
float Torque_lbft; // lb-ft
float Torque_SI; // Nm
float CHT; // Cylinder head temperature deg K
float CHT_degF; // Ditto in deg Fahrenheit
float RPM; // rpm
float Percentage_Power; // Power output as percentage of maximum power output
float Manifold_Pressure; // Inches Hg
float Fuel_Flow_gals_hr; // USgals/hour
float Torque_lbft; // lb-ft
float Torque_SI; // Nm
float CHT; // Cylinder head temperature deg K
float CHT_degF; // Ditto in deg Fahrenheit
float Mixture;
float Oil_Pressure; // PSI
float Oil_Temp; // Deg C
float current_oil_temp; // deg K
float Oil_Pressure; // PSI
float Oil_Temp; // Deg C
float current_oil_temp; // deg K
/**** one of these is superfluous !!!!***/
float HP; // Current power output in HP
float Power_SI; // Current power output in Watts
float HP; // Current power output in HP
float Power_SI; // Current power output in Watts
float RPS;
float angular_velocity_SI; // rad/s
float Torque_FMEP; // The component of Engine torque due to FMEP (Nm)
float Torque_Imbalance; // difference between engine and prop torque
float EGT; // Exhaust gas temperature deg K
float EGT_degF; // Exhaust gas temperature deg Fahrenheit
float Torque_Imbalance; // difference between engine and prop torque
float EGT; // Exhaust gas temperature deg K
float EGT_degF; // Exhaust gas temperature deg Fahrenheit
float volumetric_efficiency;
float combustion_efficiency;
float equivalence_ratio; // ratio of stoichiometric AFR over actual AFR
float thi_sea_level; // the equivalence ratio we would be running at assuming sea level air denisity in the manifold
float v_dot_air; // volume flow rate of air into engine - m^3/s
float m_dot_air; // mass flow rate of air into engine - kg/s
float m_dot_fuel; // mass flow rate of fuel into engine - kg/s
float swept_volume; // total engine swept volume - m^3
float equivalence_ratio; // ratio of stoichiometric AFR over actual AFR
float thi_sea_level; // the equivalence ratio we would be running at assuming sea level air denisity in the manifold
float v_dot_air; // volume flow rate of air into engine - m^3/s
float m_dot_air; // mass flow rate of air into engine - kg/s
float m_dot_fuel; // mass flow rate of fuel into engine - kg/s
float swept_volume; // total engine swept volume - m^3
/********* swept volume or the geometry used to calculate it should be in the config read section surely ??? ******/
float True_Manifold_Pressure; //in Hg - actual manifold gauge pressure
float rho_air_manifold; // denisty of air in the manifold - kg/m^3
float R_air; // Gas constant of air (287) UNITS???
float delta_T_exhaust; // Temperature change of exhaust this time step - degK
float rho_air_manifold; // denisty of air in the manifold - kg/m^3
float R_air; // Gas constant of air (287) UNITS???
float delta_T_exhaust; // Temperature change of exhaust this time step - degK
float heat_capacity_exhaust; // exhaust gas specific heat capacity - J/kgK
float enthalpy_exhaust; // Enthalpy at current exhaust gas conditions - UNITS???
float enthalpy_exhaust; // Enthalpy at current exhaust gas conditions - UNITS???
float Percentage_of_best_power_mixture_power; // Current power as a percentage of what power we would have at the same conditions but at best power mixture
float abstract_mixture; //temporary hack
float angular_acceleration; //rad/s^2
float abstract_mixture; //temporary hack
float angular_acceleration; //rad/s^2
float FMEP; //Friction Mean Effective Pressure (Pa)
// Various bits of housekeeping describing the engines state.
bool running; // flag to indicate the engine is running self sustaining
bool cranking; // flag to indicate the engine is being cranked
int crank_counter; // Number of iterations that the engine has been cranked non-stop
bool spark; // flag to indicate a spark is available
bool fuel; // flag to indicate fuel is available
bool running; // flag to indicate the engine is running self sustaining
bool cranking; // flag to indicate the engine is being cranked
int crank_counter; // Number of iterations that the engine has been cranked non-stop
bool spark; // flag to indicate a spark is available
bool fuel; // flag to indicate fuel is available
// Propellor Variables
float FGProp1_RPS; // rps
float prop_torque; // Nm
float prop_thrust; // Newtons
float FGProp1_RPS; // rps
float prop_torque; // Nm
float prop_thrust; // Newtons
double prop_diameter; // meters
double blade_angle; // degrees
@ -177,12 +177,12 @@ public:
//constructor
FGNewEngine() {
// outfile.open("FGNewEngine.dat", ios::out|ios::trunc);
// outfile.open("FGNewEngine.dat", ios::out|ios::trunc);
}
//destructor
~FGNewEngine() {
// outfile.close();
// outfile.close();
}
// set initial default values
@ -193,30 +193,30 @@ public:
inline void set_IAS( float value ) { IAS = value; }
inline void set_Throttle_Lever_Pos( float value ) {
Throttle_Lever_Pos = value;
Throttle_Lever_Pos = value;
}
inline void set_Propeller_Lever_Pos( float value ) {
Propeller_Lever_Pos = value;
Propeller_Lever_Pos = value;
}
inline void set_Mixture_Lever_Pos( float value ) {
Mixture_Lever_Pos = value;
Mixture_Lever_Pos = value;
}
// set the magneto switch position
inline void set_Magneto_Switch_Pos( int value ) {
mag_pos = value;
mag_pos = value;
}
inline void setStarterFlag( bool flag ) {
starter = flag;
starter = flag;
}
// set ambient pressure - takes pounds per square foot
inline void set_p_amb( float value ) {
p_amb = value * 47.88026;
// Convert to Pascals
p_amb = value * 47.88026;
// Convert to Pascals
}
// set ambient temperature - takes degrees Rankine
inline void set_T_amb( float value ) {
T_amb = value * 0.555555555556;
// Convert to degrees Kelvin
T_amb = value * 0.555555555556;
// Convert to degrees Kelvin
}
// accessors
@ -225,7 +225,7 @@ public:
// inline float get_Rho() const { return Rho; }
inline float get_MaxHP() const { return MaxHP; }
inline float get_Percentage_Power() const { return Percentage_Power; }
inline float get_EGT() const { return EGT_degF; } // Returns EGT in Fahrenheit
inline float get_EGT() const { return EGT_degF; } // Returns EGT in Fahrenheit
inline float get_CHT() const { return CHT_degF; } // Note this returns CHT in Fahrenheit
inline float get_prop_thrust_SI() const { return prop_thrust; }
inline float get_prop_thrust_lbs() const { return (prop_thrust * 0.2248); }

View file

@ -25,7 +25,7 @@
#endif
#include <math.h>
#include <string.h> // strcmp()
#include <string.h> // strcmp()
#include <simgear/constants.h>
#include <simgear/debug/logstream.hxx>
@ -74,16 +74,16 @@ FGLaRCsim::FGLaRCsim( double dt ) {
copy_to_LaRCsim(); // initialize all of LaRCsim's vars
//this should go away someday -- formerly done in fg_init.cxx
Mass = 2./32.174;
I_xx = 0.0454;
I_yy = 0.0191;
I_zz = 0.0721;
I_xz = 0;
// Mass = 8.547270E+01;
// I_xx = 1.048000E+03;
// I_yy = 3.000000E+03;
// I_zz = 3.530000E+03;
// I_xz = 0.000000E+00;
Mass = 2./32.174;
I_xx = 0.0454;
I_yy = 0.0191;
I_zz = 0.0721;
I_xz = 0;
// Mass = 8.547270E+01;
// I_xx = 1.048000E+03;
// I_yy = 3.000000E+03;
// I_zz = 3.530000E+03;
// I_xz = 0.000000E+00;
}
ls_set_model_dt(dt);
@ -121,142 +121,142 @@ void FGLaRCsim::update( double dt ) {
if ( !strcmp(aero->getStringValue(), "c172") ) {
// set control inputs
// cout << "V_calibrated_kts = " << V_calibrated_kts << '\n';
eng.set_IAS( V_calibrated_kts );
eng.set_Throttle_Lever_Pos( globals->get_controls()->get_throttle( 0 )
* 100.0 );
eng.set_Propeller_Lever_Pos( 100 );
eng.set_IAS( V_calibrated_kts );
eng.set_Throttle_Lever_Pos( globals->get_controls()->get_throttle( 0 )
* 100.0 );
eng.set_Propeller_Lever_Pos( 100 );
eng.set_Mixture_Lever_Pos( globals->get_controls()->get_mixture( 0 )
* 100.0 );
eng.set_Magneto_Switch_Pos( globals->get_controls()->get_magnetos(0) );
eng.setStarterFlag( globals->get_controls()->get_starter(0) );
eng.set_p_amb( Static_pressure );
eng.set_T_amb( Static_temperature );
* 100.0 );
eng.set_Magneto_Switch_Pos( globals->get_controls()->get_magnetos(0) );
eng.setStarterFlag( globals->get_controls()->get_starter(0) );
eng.set_p_amb( Static_pressure );
eng.set_T_amb( Static_temperature );
// update engine model
eng.update();
// update engine model
eng.update();
// Fake control-surface positions
fgSetDouble("/surface-positions/flap-pos-norm",
fgGetDouble("/controls/flight/flaps"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/elevator-pos-norm",
fgGetDouble("/controls/flight/elevator"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/left-aileron-pos-norm",
fgGetDouble("/controls/flight/aileron"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/right-aileron-pos-norm",
-1 * fgGetDouble("/controls/flight/aileron"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/rudder-pos-norm",
fgGetDouble("/controls/flight/rudder"));
// Fake control-surface positions
fgSetDouble("/surface-positions/flap-pos-norm",
fgGetDouble("/controls/flight/flaps"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/elevator-pos-norm",
fgGetDouble("/controls/flight/elevator"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/left-aileron-pos-norm",
fgGetDouble("/controls/flight/aileron"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/right-aileron-pos-norm",
-1 * fgGetDouble("/controls/flight/aileron"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/rudder-pos-norm",
fgGetDouble("/controls/flight/rudder"));
// copy engine state values onto "bus"
fgSetDouble("/engines/engine/rpm", eng.get_RPM());
fgSetDouble("/engines/engine/mp-osi", eng.get_Manifold_Pressure());
fgSetDouble("/engines/engine/max-hp", eng.get_MaxHP());
fgSetDouble("/engines/engine/power-pct", eng.get_Percentage_Power());
fgSetDouble("/engines/engine/egt-degf", eng.get_EGT());
fgSetDouble("/engines/engine/cht-degf", eng.get_CHT());
fgSetDouble("/engines/engine/prop-thrust", eng.get_prop_thrust_SI());
fgSetDouble("/engines/engine/fuel-flow-gph",
eng.get_fuel_flow_gals_hr());
fgSetDouble("/engines/engine/oil-temperature-degf",
eng.get_oil_temp());
fgSetDouble("/engines/engine/running", eng.getRunningFlag());
fgSetDouble("/engines/engine/cranking", eng.getCrankingFlag());
// copy engine state values onto "bus"
fgSetDouble("/engines/engine/rpm", eng.get_RPM());
fgSetDouble("/engines/engine/mp-osi", eng.get_Manifold_Pressure());
fgSetDouble("/engines/engine/max-hp", eng.get_MaxHP());
fgSetDouble("/engines/engine/power-pct", eng.get_Percentage_Power());
fgSetDouble("/engines/engine/egt-degf", eng.get_EGT());
fgSetDouble("/engines/engine/cht-degf", eng.get_CHT());
fgSetDouble("/engines/engine/prop-thrust", eng.get_prop_thrust_SI());
fgSetDouble("/engines/engine/fuel-flow-gph",
eng.get_fuel_flow_gals_hr());
fgSetDouble("/engines/engine/oil-temperature-degf",
eng.get_oil_temp());
fgSetDouble("/engines/engine/running", eng.getRunningFlag());
fgSetDouble("/engines/engine/cranking", eng.getCrankingFlag());
const SGPropertyNode *fuel_freeze
= fgGetNode("/sim/freeze/fuel");
const SGPropertyNode *fuel_freeze
= fgGetNode("/sim/freeze/fuel");
if ( ! fuel_freeze->getBoolValue() ) {
//Assume we are using both tanks equally for now
fgSetDouble("/consumables/fuel/tank[0]/level-gal_us",
fgGetDouble("/consumables/fuel/tank[0]/level-gal_us")
- (eng.get_fuel_flow_gals_hr() / (2 * 3600))
* dt);
fgSetDouble("/consumables/fuel/tank[1]/level-gal_us",
fgGetDouble("/consumables/fuel/tank[1]/level-gal_us")
- (eng.get_fuel_flow_gals_hr() / (2 * 3600))
* dt);
}
if ( ! fuel_freeze->getBoolValue() ) {
//Assume we are using both tanks equally for now
fgSetDouble("/consumables/fuel/tank[0]/level-gal_us",
fgGetDouble("/consumables/fuel/tank[0]/level-gal_us")
- (eng.get_fuel_flow_gals_hr() / (2 * 3600))
* dt);
fgSetDouble("/consumables/fuel/tank[1]/level-gal_us",
fgGetDouble("/consumables/fuel/tank[1]/level-gal_us")
- (eng.get_fuel_flow_gals_hr() / (2 * 3600))
* dt);
}
// Apparently the IO360 thrust model is not working.
// F_X_engine is zero here.
F_X_engine = eng.get_prop_thrust_lbs();
// Apparently the IO360 thrust model is not working.
// F_X_engine is zero here.
F_X_engine = eng.get_prop_thrust_lbs();
Flap_handle = 30.0 * globals->get_controls()->get_flaps();
Flap_handle = 30.0 * globals->get_controls()->get_flaps();
}
// done with c172-larcsim if-block
if ( !strcmp(aero->getStringValue(), "basic") ) {
// set control inputs
// cout << "V_calibrated_kts = " << V_calibrated_kts << '\n';
eng.set_IAS( V_calibrated_kts );
eng.set_Throttle_Lever_Pos( globals->get_controls()->get_throttle( 0 )
* 100.0 );
eng.set_Propeller_Lever_Pos( 100 );
eng.set_IAS( V_calibrated_kts );
eng.set_Throttle_Lever_Pos( globals->get_controls()->get_throttle( 0 )
* 100.0 );
eng.set_Propeller_Lever_Pos( 100 );
eng.set_Mixture_Lever_Pos( globals->get_controls()->get_mixture( 0 )
* 100.0 );
eng.set_Magneto_Switch_Pos( globals->get_controls()->get_magnetos(0) );
eng.setStarterFlag( globals->get_controls()->get_starter(0) );
eng.set_p_amb( Static_pressure );
eng.set_T_amb( Static_temperature );
* 100.0 );
eng.set_Magneto_Switch_Pos( globals->get_controls()->get_magnetos(0) );
eng.setStarterFlag( globals->get_controls()->get_starter(0) );
eng.set_p_amb( Static_pressure );
eng.set_T_amb( Static_temperature );
// update engine model
eng.update();
// update engine model
eng.update();
// Fake control-surface positions
fgSetDouble("/surface-positions/flap-pos-norm",
fgGetDouble("/controls/flight/flaps"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/elevator-pos-norm",
fgGetDouble("/controls/flight/elevator"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/left-aileron-pos-norm",
fgGetDouble("/controls/flight/aileron"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/right-aileron-pos-norm",
-1 * fgGetDouble("/controls/flight/aileron"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/rudder-pos-norm",
fgGetDouble("/controls/flight/rudder"));
// Fake control-surface positions
fgSetDouble("/surface-positions/flap-pos-norm",
fgGetDouble("/controls/flight/flaps"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/elevator-pos-norm",
fgGetDouble("/controls/flight/elevator"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/left-aileron-pos-norm",
fgGetDouble("/controls/flight/aileron"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/right-aileron-pos-norm",
-1 * fgGetDouble("/controls/flight/aileron"));
// FIXME: ignoring trim
fgSetDouble("/surface-positions/rudder-pos-norm",
fgGetDouble("/controls/flight/rudder"));
// copy engine state values onto "bus"
fgSetDouble("/engines/engine/rpm", eng.get_RPM());
fgSetDouble("/engines/engine/mp-osi", eng.get_Manifold_Pressure());
fgSetDouble("/engines/engine/max-hp", eng.get_MaxHP());
fgSetDouble("/engines/engine/power-pct", eng.get_Percentage_Power());
fgSetDouble("/engines/engine/egt-degf", eng.get_EGT());
fgSetDouble("/engines/engine/cht-degf", eng.get_CHT());
fgSetDouble("/engines/engine/prop-thrust", eng.get_prop_thrust_SI());
fgSetDouble("/engines/engine/fuel-flow-gph",
eng.get_fuel_flow_gals_hr());
fgSetDouble("/engines/engine/oil-temperature-degf",
eng.get_oil_temp());
fgSetDouble("/engines/engine/running", eng.getRunningFlag());
fgSetDouble("/engines/engine/cranking", eng.getCrankingFlag());
// copy engine state values onto "bus"
fgSetDouble("/engines/engine/rpm", eng.get_RPM());
fgSetDouble("/engines/engine/mp-osi", eng.get_Manifold_Pressure());
fgSetDouble("/engines/engine/max-hp", eng.get_MaxHP());
fgSetDouble("/engines/engine/power-pct", eng.get_Percentage_Power());
fgSetDouble("/engines/engine/egt-degf", eng.get_EGT());
fgSetDouble("/engines/engine/cht-degf", eng.get_CHT());
fgSetDouble("/engines/engine/prop-thrust", eng.get_prop_thrust_SI());
fgSetDouble("/engines/engine/fuel-flow-gph",
eng.get_fuel_flow_gals_hr());
fgSetDouble("/engines/engine/oil-temperature-degf",
eng.get_oil_temp());
fgSetDouble("/engines/engine/running", eng.getRunningFlag());
fgSetDouble("/engines/engine/cranking", eng.getCrankingFlag());
const SGPropertyNode *fuel_freeze
= fgGetNode("/sim/freeze/fuel");
const SGPropertyNode *fuel_freeze
= fgGetNode("/sim/freeze/fuel");
if ( ! fuel_freeze->getBoolValue() ) {
//Assume we are using both tanks equally for now
fgSetDouble("/consumables/fuel/tank[0]/level-gal_us",
fgGetDouble("/consumables/fuel/tank[0]/level-gal_us")
- (eng.get_fuel_flow_gals_hr() / (2 * 3600))
* dt);
fgSetDouble("/consumables/fuel/tank[1]/level-gal_us",
fgGetDouble("/consumables/fuel/tank[1]/level-gal_us")
- (eng.get_fuel_flow_gals_hr() / (2 * 3600))
* dt);
}
if ( ! fuel_freeze->getBoolValue() ) {
//Assume we are using both tanks equally for now
fgSetDouble("/consumables/fuel/tank[0]/level-gal_us",
fgGetDouble("/consumables/fuel/tank[0]/level-gal_us")
- (eng.get_fuel_flow_gals_hr() / (2 * 3600))
* dt);
fgSetDouble("/consumables/fuel/tank[1]/level-gal_us",
fgGetDouble("/consumables/fuel/tank[1]/level-gal_us")
- (eng.get_fuel_flow_gals_hr() / (2 * 3600))
* dt);
}
// Apparently the IO360 thrust model is not working.
// F_X_engine is zero here.
F_X_engine = eng.get_prop_thrust_lbs();
// Apparently the IO360 thrust model is not working.
// F_X_engine is zero here.
F_X_engine = eng.get_prop_thrust_lbs();
Flap_handle = 30.0 * globals->get_controls()->get_flaps();
Flap_handle = 30.0 * globals->get_controls()->get_flaps();
}
// done with basic-larcsim if-block
@ -264,8 +264,8 @@ void FGLaRCsim::update( double dt ) {
// lets try to avoid really screwing up the LaRCsim model
if ( get_Altitude() < -9000.0 ) {
save_alt = get_Altitude();
set_Altitude( 0.0 );
save_alt = get_Altitude();
set_Altitude( 0.0 );
}
// copy control positions into the LaRCsim structure
@ -336,34 +336,34 @@ void FGLaRCsim::update( double dt ) {
// spoilers with transition occurring in uiuc_aerodeflections.cpp
if(use_spoilers) {
Spoiler_handle = spoiler_max * fgGetDouble("/controls/flight/spoilers");
Spoiler_handle = spoiler_max * fgGetDouble("/controls/flight/spoilers");
}
// gear with transition occurring here in LaRCsim.cxx
if (use_gear) {
if(fgGetBool("/controls/gear/gear-down")) {
Gear_handle = 1.0;
}
else {
Gear_handle = 0.;
}
// commanded gear is 0 or 1
gear_cmd_norm = Gear_handle;
// amount gear moves per time step [relative to 1]
gear_increment_per_timestep = gear_rate * dt;
// determine gear position with respect to gear command
if (gear_pos_norm < gear_cmd_norm) {
gear_pos_norm += gear_increment_per_timestep;
if (gear_pos_norm > gear_cmd_norm)
gear_pos_norm = gear_cmd_norm;
} else if (gear_pos_norm > gear_cmd_norm) {
gear_pos_norm -= gear_increment_per_timestep;
if (gear_pos_norm < gear_cmd_norm)
gear_pos_norm = gear_cmd_norm;
}
// set the gear position
fgSetDouble("/gear/gear[0]/position-norm", gear_pos_norm);
fgSetDouble("/gear/gear[1]/position-norm", gear_pos_norm);
fgSetDouble("/gear/gear[2]/position-norm", gear_pos_norm);
if(fgGetBool("/controls/gear/gear-down")) {
Gear_handle = 1.0;
}
else {
Gear_handle = 0.;
}
// commanded gear is 0 or 1
gear_cmd_norm = Gear_handle;
// amount gear moves per time step [relative to 1]
gear_increment_per_timestep = gear_rate * dt;
// determine gear position with respect to gear command
if (gear_pos_norm < gear_cmd_norm) {
gear_pos_norm += gear_increment_per_timestep;
if (gear_pos_norm > gear_cmd_norm)
gear_pos_norm = gear_cmd_norm;
} else if (gear_pos_norm > gear_cmd_norm) {
gear_pos_norm -= gear_increment_per_timestep;
if (gear_pos_norm < gear_cmd_norm)
gear_pos_norm = gear_cmd_norm;
}
// set the gear position
fgSetDouble("/gear/gear[0]/position-norm", gear_pos_norm);
fgSetDouble("/gear/gear[1]/position-norm", gear_pos_norm);
fgSetDouble("/gear/gear[2]/position-norm", gear_pos_norm);
}
@ -376,34 +376,34 @@ void FGLaRCsim::update( double dt ) {
fgSetDouble("/engines/engine/cranking", 1);
fgSetDouble("/engines/engine/running", 1);
if ( !strcmp(uiuc_type->getStringValue(), "uiuc-prop")) {
// uiuc prop driven airplane, e.g. Wright Flyer
// uiuc prop driven airplane, e.g. Wright Flyer
}
else if ( !strcmp(uiuc_type->getStringValue(), "uiuc-jet")) {
// uiuc jet aircraft, e.g. a4d
// used for setting the sound
fgSetDouble("/engines/engine/n1", (75 + (globals->get_controls()->get_throttle( 0 ) * 100.0 )/400));
fgSetDouble("/engines/engine/prop-thrust", (4000 + F_X_engine/2));
// used for setting the instruments
fgSetDouble("/engines/engine[0]/n1", (50 + (globals->get_controls()->get_throttle( 0 ) * 50)));
// uiuc jet aircraft, e.g. a4d
// used for setting the sound
fgSetDouble("/engines/engine/n1", (75 + (globals->get_controls()->get_throttle( 0 ) * 100.0 )/400));
fgSetDouble("/engines/engine/prop-thrust", (4000 + F_X_engine/2));
// used for setting the instruments
fgSetDouble("/engines/engine[0]/n1", (50 + (globals->get_controls()->get_throttle( 0 ) * 50)));
}
else if ( !strcmp(uiuc_type->getStringValue(), "uiuc-sailplane")) {
// uiuc sailplane, e.g. asw20
fgSetDouble("/engines/engine/cranking", 0);
// uiuc sailplane, e.g. asw20
fgSetDouble("/engines/engine/cranking", 0);
}
else if ( !strcmp(uiuc_type->getStringValue(), "uiuc-hangglider")) {
// uiuc hang glider, e.g. airwave
fgSetDouble("/engines/engine/cranking", 0);
// uiuc hang glider, e.g. airwave
fgSetDouble("/engines/engine/cranking", 0);
}
else if ( !strcmp(uiuc_type->getStringValue(), "uiuc-ornithopter")) {
// flapping wings
fgSetDouble("/canopy/position-norm", 0);
fgSetDouble("/wing-phase/position-norm", sin(flapper_phi - 3 * LS_PI / 2));
fgSetDouble("/wing-phase/position-deg", flapper_phi*RAD_TO_DEG);
fgSetDouble("/wing-phase/position-one", 1);
fgSetDouble("/thorax/volume", 0);
fgSetDouble("/thorax/rpm", 0);
// fgSetDouble("/thorax/volume", ((1+sin(2*(flapper_phi+LS_PI)))/2));
// fgSetDouble("/thorax/rpm", ((1+sin(2*(flapper_phi+LS_PI)))/2));
// flapping wings
fgSetDouble("/canopy/position-norm", 0);
fgSetDouble("/wing-phase/position-norm", sin(flapper_phi - 3 * LS_PI / 2));
fgSetDouble("/wing-phase/position-deg", flapper_phi*RAD_TO_DEG);
fgSetDouble("/wing-phase/position-one", 1);
fgSetDouble("/thorax/volume", 0);
fgSetDouble("/thorax/rpm", 0);
// fgSetDouble("/thorax/volume", ((1+sin(2*(flapper_phi+LS_PI)))/2));
// fgSetDouble("/thorax/rpm", ((1+sin(2*(flapper_phi+LS_PI)))/2));
}
}
@ -411,10 +411,10 @@ void FGLaRCsim::update( double dt ) {
// add Gamma_horiz_deg to properties, mss 021213
if (use_gamma_horiz_on_speed) {
if (V_rel_wind > gamma_horiz_on_speed) {
fgSetDouble("/orientation/gamma-horiz-deg", (Gamma_horiz_rad * RAD_TO_DEG));
fgSetDouble("/orientation/gamma-horiz-deg", (Gamma_horiz_rad * RAD_TO_DEG));
}
else {
fgSetDouble("/orientation/gamma-horiz-deg", fgGetDouble("/orientation/heading-deg"));
fgSetDouble("/orientation/gamma-horiz-deg", fgGetDouble("/orientation/heading-deg"));
}
}
else {
@ -432,7 +432,7 @@ void FGLaRCsim::update( double dt ) {
// but lets restore our original bogus altitude when we are done
if ( save_alt < -9000.0 ) {
set_Altitude( save_alt );
set_Altitude( save_alt );
}
}
@ -647,9 +647,9 @@ bool FGLaRCsim::copy_from_LaRCsim() {
// Velocities
_set_Velocities_Local( V_north, V_east, V_down );
// set_Velocities_Ground( V_north_rel_ground, V_east_rel_ground,
// V_down_rel_ground );
// V_down_rel_ground );
_set_Velocities_Local_Airmass( V_north_airmass, V_east_airmass,
V_down_airmass );
V_down_airmass );
// set_Velocities_Local_Rel_Airmass( V_north_rel_airmass,
// V_east_rel_airmass, V_down_rel_airmass );
// set_Velocities_Gust( U_gust, V_gust, W_gust );
@ -675,9 +675,9 @@ bool FGLaRCsim::copy_from_LaRCsim() {
_set_Mach_number( Mach_number );
SG_LOG( SG_FLIGHT, SG_DEBUG, "lon = " << Longitude
<< " lat_geoc = " << Lat_geocentric << " lat_geod = " << Latitude
<< " alt = " << Altitude << " sl_radius = " << Sea_level_radius
<< " radius_to_vehicle = " << Radius_to_vehicle );
<< " lat_geoc = " << Lat_geocentric << " lat_geod = " << Latitude
<< " alt = " << Altitude << " sl_radius = " << Sea_level_radius
<< " radius_to_vehicle = " << Radius_to_vehicle );
double tmp_lon_geoc = Lon_geocentric;
while ( tmp_lon_geoc < -SGD_PI ) { tmp_lon_geoc += SGD_2PI; }
@ -689,7 +689,7 @@ bool FGLaRCsim::copy_from_LaRCsim() {
// Positions
_set_Geocentric_Position( Lat_geocentric, tmp_lon_geoc,
Radius_to_vehicle );
Radius_to_vehicle );
_set_Geodetic_Position( Latitude, tmp_lon, Altitude );
_set_Euler_Angles( Phi, Theta, Psi );
@ -757,23 +757,23 @@ bool FGLaRCsim::copy_from_LaRCsim() {
// cout << "climb rate = " << -V_down * 60 << endl;
if ( !strcmp(aero->getStringValue(), "uiuc") ) {
if (pilot_elev_no) {
globals->get_controls()->set_elevator(Long_control);
globals->get_controls()->set_elevator_trim(Long_trim);
// controls.set_elevator(Long_control);
// controls.set_elevator_trim(Long_trim);
if (pilot_elev_no) {
globals->get_controls()->set_elevator(Long_control);
globals->get_controls()->set_elevator_trim(Long_trim);
// controls.set_elevator(Long_control);
// controls.set_elevator_trim(Long_trim);
}
if (pilot_ail_no) {
if (pilot_ail_no) {
globals->get_controls()->set_aileron(Lat_control);
// controls.set_aileron(Lat_control);
// controls.set_aileron(Lat_control);
}
if (pilot_rud_no) {
if (pilot_rud_no) {
globals->get_controls()->set_rudder(Rudder_pedal);
// controls.set_rudder(Rudder_pedal);
// controls.set_rudder(Rudder_pedal);
}
if (pilot_throttle_no) {
if (pilot_throttle_no) {
globals->get_controls()->set_throttle(0,Throttle_pct);
// controls.set_throttle(0,Throttle_pct);
// controls.set_throttle(0,Throttle_pct);
}
}
@ -810,9 +810,9 @@ void FGLaRCsim::snap_shot(void) {
lsic->SetHeadingRadIC( get_Psi() );
lsic->SetClimbRateFpsIC( get_Climb_Rate() );
lsic->SetVNEDAirmassFpsIC( get_V_north_airmass(),
get_V_east_airmass(),
get_V_down_airmass() );
}
get_V_east_airmass(),
get_V_down_airmass() );
}
//Positions
void FGLaRCsim::set_Latitude(double lat) {
@ -841,7 +841,7 @@ void FGLaRCsim::set_Altitude(double alt) {
void FGLaRCsim::set_V_calibrated_kts(double vc) {
SG_LOG( SG_FLIGHT, SG_INFO,
"FGLaRCsim::set_V_calibrated_kts: " << vc );
"FGLaRCsim::set_V_calibrated_kts: " << vc );
snap_shot();
lsic->SetVcalibratedKtsIC(vc);
set_ls();
@ -858,7 +858,7 @@ void FGLaRCsim::set_Mach_number(double mach) {
void FGLaRCsim::set_Velocities_Local( double north, double east, double down ){
SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Velocities_local: "
<< north << " " << east << " " << down );
<< north << " " << east << " " << down );
snap_shot();
lsic->SetVNEDFpsIC(north, east, down);
set_ls();
@ -867,7 +867,7 @@ void FGLaRCsim::set_Velocities_Local( double north, double east, double down ){
void FGLaRCsim::set_Velocities_Body( double u, double v, double w){
SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Velocities_Body: "
<< u << " " << v << " " << w );
<< u << " " << v << " " << w );
snap_shot();
lsic->SetUVWFpsIC(u,v,w);
set_ls();
@ -877,7 +877,7 @@ void FGLaRCsim::set_Velocities_Body( double u, double v, double w){
//Euler angles
void FGLaRCsim::set_Euler_Angles( double phi, double theta, double psi ) {
SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Euler_angles: "
<< phi << " " << theta << " " << psi );
<< phi << " " << theta << " " << psi );
snap_shot();
lsic->SetPitchAngleRadIC(theta);
@ -914,10 +914,10 @@ void FGLaRCsim::set_AltitudeAGL(double altagl) {
/* getting a namespace conflict...
void FGLaRCsim::set_Velocities_Local_Airmass (double wnorth,
double weast,
double wdown ) {
double weast,
double wdown ) {
SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Velocities_Local_Airmass: "
<< wnorth << " " << weast << " " << wdown );
<< wnorth << " " << weast << " " << wdown );
snap_shot();
lsic->SetVNEDAirmassFpsIC( wnorth, weast, wdown );
set_ls();
@ -927,23 +927,23 @@ void FGLaRCsim::set_Velocities_Local_Airmass (double wnorth,
void FGLaRCsim::set_Static_pressure(double p) {
SG_LOG( SG_FLIGHT, SG_INFO,
"FGLaRCsim::set_Static_pressure: " << p );
"FGLaRCsim::set_Static_pressure: " << p );
SG_LOG( SG_FLIGHT, SG_INFO,
"LaRCsim does not support externally supplied atmospheric data" );
"LaRCsim does not support externally supplied atmospheric data" );
}
void FGLaRCsim::set_Static_temperature(double T) {
SG_LOG( SG_FLIGHT, SG_INFO,
"FGLaRCsim::set_Static_temperature: " << T );
"FGLaRCsim::set_Static_temperature: " << T );
SG_LOG( SG_FLIGHT, SG_INFO,
"LaRCsim does not support externally supplied atmospheric data" );
"LaRCsim does not support externally supplied atmospheric data" );
}
void FGLaRCsim::set_Density(double rho) {
SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Density: " << rho );
SG_LOG( SG_FLIGHT, SG_INFO,
"LaRCsim does not support externally supplied atmospheric data" );
"LaRCsim does not support externally supplied atmospheric data" );
}

View file

@ -96,11 +96,11 @@ public:
void _set_Inertias( double m, double xx, double yy, double zz, double xz)
{
mass = m;
i_xx = xx;
i_yy = yy;
i_zz = zz;
i_xz = xz;
mass = m;
i_xx = xx;
i_yy = yy;
i_zz = zz;
i_xz = xz;
}
};

View file

@ -1,43 +1,43 @@
/***************************************************************************
TITLE: atmos_62
TITLE: atmos_62
----------------------------------------------------------------------------
FUNCTION: 1962 atmosphere table interpolation routine
FUNCTION: 1962 atmosphere table interpolation routine
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 920827 by Bruce Jackson as part of the C-castle
development effort.
GENEALOGY: Created 920827 by Bruce Jackson as part of the C-castle
development effort.
----------------------------------------------------------------------------
DESIGNED BY: B. Jackson
DESIGNED BY: B. Jackson
CODED BY: B. Jackson
CODED BY: B. Jackson
MAINTAINED BY: B. Jackson
MAINTAINED BY: B. Jackson
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
931220 Added ambient pressure and temperature as outputs. EBJ
940111 Changed includes from "ls_eom.h" to "ls_types.h" and
"ls_constants.h"; changed DATA to SCALAR types. EBJ
DATE PURPOSE BY
931220 Added ambient pressure and temperature as outputs. EBJ
940111 Changed includes from "ls_eom.h" to "ls_types.h" and
"ls_constants.h"; changed DATA to SCALAR types. EBJ
----------------------------------------------------------------------------
REFERENCES:
[ 1] Hornbeck, Robert W.: "Numerical Methods", Prentice-Hall,
1975. ISBN 0-13-626614-2
[ 1] Hornbeck, Robert W.: "Numerical Methods", Prentice-Hall,
1975. ISBN 0-13-626614-2
----------------------------------------------------------------------------
@ -64,16 +64,16 @@
#include <math.h>
#define alt_0 d_a_table[index ][0]
#define alt_1 d_a_table[index+1][0]
#define den_0 d_a_table[index ][1]
#define den_1 d_a_table[index+1][1]
#define sps_0 d_a_table[index ][2]
#define sps_1 d_a_table[index+1][2]
#define gden_0 d_a_table[index ][3]
#define gden_1 d_a_table[index+1][3]
#define gsps_0 d_a_table[index ][4]
#define gsps_1 d_a_table[index+1][4]
#define alt_0 d_a_table[index ][0]
#define alt_1 d_a_table[index+1][0]
#define den_0 d_a_table[index ][1]
#define den_1 d_a_table[index+1][1]
#define sps_0 d_a_table[index ][2]
#define sps_1 d_a_table[index+1][2]
#define gden_0 d_a_table[index ][3]
#define gden_1 d_a_table[index+1][3]
#define gsps_0 d_a_table[index ][4]
#define gsps_1 d_a_table[index+1][4]
#define MAX_ALT_INDEX 121
#define DELT_ALT 2000.
@ -83,137 +83,137 @@
#define MAX_ALTITUDE 240000.
void ls_atmos( SCALAR altitude, SCALAR * sigma, SCALAR * v_sound,
SCALAR * t_amb, SCALAR * p_amb )
SCALAR * t_amb, SCALAR * p_amb )
{
int index;
SCALAR daltp, daltn, daltp3, daltn3, density;
SCALAR t_amb_r, p_amb_r;
int index;
SCALAR daltp, daltn, daltp3, daltn3, density;
SCALAR t_amb_r, p_amb_r;
SCALAR tmp;
static SCALAR d_a_table[MAX_ALT_INDEX][5] =
static SCALAR d_a_table[MAX_ALT_INDEX][5] =
{
{ 0., 2.37701E-03, 1.11642E+03, 0.00000E+00, 0.00000E+00 },
{ 2000., 2.24098E-03, 1.10872E+03, 1.92857E-12, -1.75815E-08 },
{ 4000., 2.11099E-03, 1.10097E+03, 1.34570E-12, -1.21740E-08 },
{ 6000., 1.98684E-03, 1.09315E+03, 1.44862E-12, -1.47225E-08 },
{ 8000., 1.86836E-03, 1.08529E+03, 1.36481E-12, -1.44359E-08 },
{ 10000., 1.75537E-03, 1.07736E+03, 1.32716E-12, -1.45340E-08 },
{ 12000., 1.64768E-03, 1.06938E+03, 1.27657E-12, -1.44280E-08 },
{ 14000., 1.54511E-03, 1.06133E+03, 1.24656E-12, -1.62540E-08 },
{ 16000., 1.44751E-03, 1.05323E+03, 1.19220E-12, -1.50560E-08 },
{ 18000., 1.35469E-03, 1.04506E+03, 1.15463E-12, -1.65220E-08 },
{ 20000., 1.26649E-03, 1.03683E+03, 1.11926E-12, -1.63562E-08 },
{ 22000., 1.18276E-03, 1.02853E+03, 1.07333E-12, -1.70533E-08 },
{ 24000., 1.10333E-03, 1.02016E+03, 1.03743E-12, -1.59305E-08 },
{ 26000., 1.02805E-03, 1.01173E+03, 1.00195E-12, -2.27248E-08 },
{ 28000., 9.56760E-04, 1.00322E+03, 9.39764E-13, 3.29851E-10 },
{ 30000., 8.89320E-04, 9.94641E+02, 1.01399E-12, -8.80946E-08 },
{ 32000., 8.25570E-04, 9.85988E+02, 5.39268E-13, 2.41048E-07 },
{ 34000., 7.65380E-04, 9.77258E+02, 2.16894E-12, -9.91599E-07 },
{ 36000., 7.08600E-04, 9.68448E+02, -4.10001E-12, 3.60535E-06 },
{ 38000., 6.44190E-04, 9.68053E+02, 2.78612E-12, -8.07290E-07 },
{ 40000., 5.85146E-04, 9.68053E+02, 1.00455E-12, 2.16313E-07 },
{ 42000., 5.31517E-04, 9.68053E+02, 1.31819E-12, -5.79609E-08 },
{ 44000., 4.82801E-04, 9.68053E+02, 1.09217E-12, 1.55309E-08 },
{ 46000., 4.38554E-04, 9.68053E+02, 1.01661E-12, -4.16262E-09 },
{ 48000., 3.98359E-04, 9.68053E+02, 9.19375E-13, 1.11961E-09 },
{ 50000., 3.61850E-04, 9.68053E+02, 8.34886E-13, -3.15801E-10 },
{ 52000., 3.28686E-04, 9.68053E+02, 7.58579E-13, 1.43600E-10 },
{ 54000., 2.98561E-04, 9.68053E+02, 6.89297E-13, -2.58597E-10 },
{ 56000., 2.71197E-04, 9.68053E+02, 6.25735E-13, 8.90788E-10 },
{ 58000., 2.46341E-04, 9.68053E+02, 5.69765E-13, -3.30456E-09 },
{ 60000., 2.23765E-04, 9.68053E+02, 5.15206E-13, 1.23274E-08 },
{ 62000., 2.03256E-04, 9.68053E+02, 4.69912E-13, -4.60052E-08 },
{ 64000., 1.84627E-04, 9.68053E+02, 4.25146E-13, 1.71693E-07 },
{ 66000., 1.67616E-04, 9.68314E+02, 2.56502E-13, -2.49268E-07 },
{ 68000., 1.51855E-04, 9.68676E+02, 4.23844E-13, 9.76878E-07 },
{ 70000., 1.37615E-04, 9.71034E+02, 3.29621E-13, -6.64245E-07 },
{ 72000., 1.24744E-04, 9.72390E+02, 3.11170E-13, 1.77102E-07 },
{ 74000., 1.13107E-04, 9.73745E+02, 2.76697E-13, -4.56627E-08 },
{ 76000., 1.02584E-04, 9.75099E+02, 2.53043E-13, 4.04902E-09 },
{ 78000., 9.30660E-05, 9.76450E+02, 2.18633E-13, 2.49667E-08 },
{ 80000., 8.44530E-05, 9.77799E+02, 2.29927E-13, -1.06916E-07 },
{ 82000., 7.67140E-05, 9.78950E+02, 1.72660E-13, 1.05696E-07 },
{ 84000., 6.97010E-05, 9.80290E+02, 1.68432E-13, -3.23682E-08 },
{ 86000., 6.33490E-05, 9.81620E+02, 1.45113E-13, 8.77690E-09 },
{ 88000., 5.75880E-05, 9.82950E+02, 1.37617E-13, -2.73938E-09 },
{ 90000., 5.23700E-05, 9.84280E+02, 1.18918E-13, 2.18061E-09 },
{ 92000., 4.76350E-05, 9.85610E+02, 1.11210E-13, -5.98306E-09 },
{ 94000., 4.33410E-05, 9.86930E+02, 9.77408E-14, 6.75162E-09 },
{ 96000., 3.94430E-05, 9.88260E+02, 9.18264E-14, -6.02343E-09 },
{ 98000., 3.59080E-05, 9.89580E+02, 7.94534E-14, 2.34210E-09 },
{ 100000., 3.26960E-05, 9.90900E+02, 7.48600E-14, -3.34498E-09 },
{ 102000., 2.97810E-05, 9.92210E+02, 6.66067E-14, -3.96219E-09 },
{ 104000., 2.71320E-05, 9.93530E+02, 5.77131E-14, 3.41937E-08 },
{ 106000., 2.46980E-05, 9.95410E+02, 2.50410E-14, 7.07187E-07 },
{ 108000., 2.24140E-05, 9.99070E+02, 6.71229E-14, -1.92943E-07 },
{ 110000., 2.03570E-05, 1.00272E+03, 4.69675E-14, 4.95832E-08 },
{ 112000., 1.85010E-05, 1.00636E+03, 4.65069E-14, -2.03903E-08 },
{ 114000., 1.68270E-05, 1.00998E+03, 4.00047E-14, 1.97789E-09 },
{ 116000., 1.53150E-05, 1.01359E+03, 3.64744E-14, -2.52130E-09 },
{ 118000., 1.39480E-05, 1.01719E+03, 3.15976E-14, -6.89271E-09 },
{ 120000., 1.27100E-05, 1.02077E+03, 3.06351E-14, 9.21465E-11 },
{ 122000., 1.15920E-05, 1.02434E+03, 2.58618E-14, -8.47587E-09 },
{ 124000., 1.05790E-05, 1.02789E+03, 2.34176E-14, 3.81135E-09 },
{ 126000., 9.66010E-06, 1.03144E+03, 2.16178E-14, -6.76951E-09 },
{ 128000., 8.82710E-06, 1.03497E+03, 1.89611E-14, -6.73330E-09 },
{ 130000., 8.07070E-06, 1.03848E+03, 1.74377E-14, 3.70270E-09 },
{ 132000., 7.38380E-06, 1.04199E+03, 1.55382E-14, -8.07752E-09 },
{ 134000., 6.75940E-06, 1.04548E+03, 1.41595E-14, -1.39263E-09 },
{ 136000., 6.19160E-06, 1.04896E+03, 1.27239E-14, -1.35196E-09 },
{ 138000., 5.67490E-06, 1.05243E+03, 1.15951E-14, -8.19953E-09 },
{ 140000., 5.20450E-06, 1.05588E+03, 1.03459E-14, 4.15010E-09 },
{ 142000., 4.77570E-06, 1.05933E+03, 9.42149E-15, -8.40086E-09 },
{ 144000., 4.38470E-06, 1.06276E+03, 8.66820E-15, -5.46671E-10 },
{ 146000., 4.02820E-06, 1.06618E+03, 7.65573E-15, -4.41246E-09 },
{ 148000., 3.70260E-06, 1.06959E+03, 7.05890E-15, 3.19650E-09 },
{ 150000., 3.40520E-06, 1.07299E+03, 6.40867E-15, -2.33736E-08 },
{ 152000., 3.13330E-06, 1.07637E+03, 5.55641E-15, 6.02977E-08 },
{ 154000., 2.88480E-06, 1.07975E+03, 6.46568E-15, -2.17817E-07 },
{ 156000., 2.66270E-06, 1.08202E+03, 8.18087E-15, -8.54029E-07 },
{ 158000., 2.46830E-06, 1.08202E+03, 2.36086E-15, 2.28931E-07 },
{ 160000., 2.28810E-06, 1.08202E+03, 3.67571E-15, -6.16972E-08 },
{ 162000., 2.12120E-06, 1.08202E+03, 2.88632E-15, 1.78573E-08 },
{ 164000., 1.96640E-06, 1.08202E+03, 2.92903E-15, -9.73206E-09 },
{ 166000., 1.82300E-06, 1.08202E+03, 2.49757E-15, 2.10709E-08 },
{ 168000., 1.69000E-06, 1.08202E+03, 2.68069E-15, -7.45517E-08 },
{ 170000., 1.56680E-06, 1.08202E+03, 1.47966E-15, 2.77136E-07 },
{ 172000., 1.45250E-06, 1.08202E+03, 4.75068E-15, -1.03399E-06 },
{ 174000., 1.35240E-06, 1.07963E+03, 8.17622E-16, 2.73830E-07 },
{ 176000., 1.25880E-06, 1.07723E+03, 1.72883E-15, -7.63301E-08 },
{ 178000., 1.17130E-06, 1.07482E+03, 1.41704E-15, 1.64901E-08 },
{ 180000., 1.08960E-06, 1.07240E+03, 1.30299E-15, -4.63038E-09 },
{ 182000., 1.01320E-06, 1.06998E+03, 1.32100E-15, 2.03140E-09 },
{ 184000., 9.41950E-07, 1.06756E+03, 1.13799E-15, -3.49522E-09 },
{ 186000., 8.75370E-07, 1.06513E+03, 1.13202E-15, -3.05052E-09 },
{ 188000., 8.13260E-07, 1.06269E+03, 1.03892E-15, 6.97283E-10 },
{ 190000., 7.55320E-07, 1.06025E+03, 9.67290E-16, 2.61383E-10 },
{ 192000., 7.01260E-07, 1.05781E+03, 9.11920E-16, -1.74281E-09 },
{ 194000., 6.50850E-07, 1.05536E+03, 8.60032E-16, -8.29013E-09 },
{ 196000., 6.03870E-07, 1.05290E+03, 7.92951E-16, 1.99033E-08 },
{ 198000., 5.60110E-07, 1.05044E+03, 7.98164E-16, -7.13232E-08 },
{ 200000., 5.19320E-07, 1.04798E+03, 4.69394E-16, 2.65389E-07 },
{ 202000., 4.81340E-07, 1.04550E+03, 1.53926E-15, -1.02023E-06 },
{ 204000., 4.47960E-07, 1.04063E+03, 2.73571E-16, 2.30547E-07 },
{ 206000., 4.16690E-07, 1.03565E+03, 5.31456E-16, -6.69551E-08 },
{ 208000., 3.87320E-07, 1.03065E+03, 4.50605E-16, 7.27308E-09 },
{ 210000., 3.59790E-07, 1.02562E+03, 4.26126E-16, -7.13720E-09 },
{ 212000., 3.33970E-07, 1.02057E+03, 4.09893E-16, -8.72426E-09 },
{ 214000., 3.09780E-07, 1.01549E+03, 3.79301E-16, -2.96576E-09 },
{ 216000., 2.87120E-07, 1.01039E+03, 3.67902E-16, -9.41272E-09 },
{ 218000., 2.65920E-07, 1.00526E+03, 3.39092E-16, -4.38337E-09 },
{ 220000., 2.46090E-07, 1.00011E+03, 3.30732E-16, -3.05378E-09 },
{ 222000., 2.27570E-07, 9.94940E+02, 3.02981E-16, -1.34015E-08 },
{ 224000., 2.10270E-07, 9.89730E+02, 2.87343E-16, -3.34027E-09 },
{ 226000., 1.94120E-07, 9.84500E+02, 2.72646E-16, -3.23743E-09 },
{ 228000., 1.79060E-07, 9.79250E+02, 2.57074E-16, -1.37100E-08 },
{ 230000., 1.65030E-07, 9.73960E+02, 2.44060E-16, -1.92258E-09 },
{ 232000., 1.51970E-07, 9.68650E+02, 2.21687E-16, -8.59969E-09 },
{ 234000., 1.39810E-07, 9.63310E+02, 2.19191E-16, -8.67865E-09 },
{ 236000., 1.28510E-07, 9.57940E+02, 1.91549E-16, -1.68569E-09 },
{ 238000., 1.18020E-07, 9.52550E+02, 2.29613E-16, -1.45786E-08 },
{ 240000., 1.08270E-07, 9.47120E+02, 0.00000E+00, 0.00000E+00 }
{ 0., 2.37701E-03, 1.11642E+03, 0.00000E+00, 0.00000E+00 },
{ 2000., 2.24098E-03, 1.10872E+03, 1.92857E-12, -1.75815E-08 },
{ 4000., 2.11099E-03, 1.10097E+03, 1.34570E-12, -1.21740E-08 },
{ 6000., 1.98684E-03, 1.09315E+03, 1.44862E-12, -1.47225E-08 },
{ 8000., 1.86836E-03, 1.08529E+03, 1.36481E-12, -1.44359E-08 },
{ 10000., 1.75537E-03, 1.07736E+03, 1.32716E-12, -1.45340E-08 },
{ 12000., 1.64768E-03, 1.06938E+03, 1.27657E-12, -1.44280E-08 },
{ 14000., 1.54511E-03, 1.06133E+03, 1.24656E-12, -1.62540E-08 },
{ 16000., 1.44751E-03, 1.05323E+03, 1.19220E-12, -1.50560E-08 },
{ 18000., 1.35469E-03, 1.04506E+03, 1.15463E-12, -1.65220E-08 },
{ 20000., 1.26649E-03, 1.03683E+03, 1.11926E-12, -1.63562E-08 },
{ 22000., 1.18276E-03, 1.02853E+03, 1.07333E-12, -1.70533E-08 },
{ 24000., 1.10333E-03, 1.02016E+03, 1.03743E-12, -1.59305E-08 },
{ 26000., 1.02805E-03, 1.01173E+03, 1.00195E-12, -2.27248E-08 },
{ 28000., 9.56760E-04, 1.00322E+03, 9.39764E-13, 3.29851E-10 },
{ 30000., 8.89320E-04, 9.94641E+02, 1.01399E-12, -8.80946E-08 },
{ 32000., 8.25570E-04, 9.85988E+02, 5.39268E-13, 2.41048E-07 },
{ 34000., 7.65380E-04, 9.77258E+02, 2.16894E-12, -9.91599E-07 },
{ 36000., 7.08600E-04, 9.68448E+02, -4.10001E-12, 3.60535E-06 },
{ 38000., 6.44190E-04, 9.68053E+02, 2.78612E-12, -8.07290E-07 },
{ 40000., 5.85146E-04, 9.68053E+02, 1.00455E-12, 2.16313E-07 },
{ 42000., 5.31517E-04, 9.68053E+02, 1.31819E-12, -5.79609E-08 },
{ 44000., 4.82801E-04, 9.68053E+02, 1.09217E-12, 1.55309E-08 },
{ 46000., 4.38554E-04, 9.68053E+02, 1.01661E-12, -4.16262E-09 },
{ 48000., 3.98359E-04, 9.68053E+02, 9.19375E-13, 1.11961E-09 },
{ 50000., 3.61850E-04, 9.68053E+02, 8.34886E-13, -3.15801E-10 },
{ 52000., 3.28686E-04, 9.68053E+02, 7.58579E-13, 1.43600E-10 },
{ 54000., 2.98561E-04, 9.68053E+02, 6.89297E-13, -2.58597E-10 },
{ 56000., 2.71197E-04, 9.68053E+02, 6.25735E-13, 8.90788E-10 },
{ 58000., 2.46341E-04, 9.68053E+02, 5.69765E-13, -3.30456E-09 },
{ 60000., 2.23765E-04, 9.68053E+02, 5.15206E-13, 1.23274E-08 },
{ 62000., 2.03256E-04, 9.68053E+02, 4.69912E-13, -4.60052E-08 },
{ 64000., 1.84627E-04, 9.68053E+02, 4.25146E-13, 1.71693E-07 },
{ 66000., 1.67616E-04, 9.68314E+02, 2.56502E-13, -2.49268E-07 },
{ 68000., 1.51855E-04, 9.68676E+02, 4.23844E-13, 9.76878E-07 },
{ 70000., 1.37615E-04, 9.71034E+02, 3.29621E-13, -6.64245E-07 },
{ 72000., 1.24744E-04, 9.72390E+02, 3.11170E-13, 1.77102E-07 },
{ 74000., 1.13107E-04, 9.73745E+02, 2.76697E-13, -4.56627E-08 },
{ 76000., 1.02584E-04, 9.75099E+02, 2.53043E-13, 4.04902E-09 },
{ 78000., 9.30660E-05, 9.76450E+02, 2.18633E-13, 2.49667E-08 },
{ 80000., 8.44530E-05, 9.77799E+02, 2.29927E-13, -1.06916E-07 },
{ 82000., 7.67140E-05, 9.78950E+02, 1.72660E-13, 1.05696E-07 },
{ 84000., 6.97010E-05, 9.80290E+02, 1.68432E-13, -3.23682E-08 },
{ 86000., 6.33490E-05, 9.81620E+02, 1.45113E-13, 8.77690E-09 },
{ 88000., 5.75880E-05, 9.82950E+02, 1.37617E-13, -2.73938E-09 },
{ 90000., 5.23700E-05, 9.84280E+02, 1.18918E-13, 2.18061E-09 },
{ 92000., 4.76350E-05, 9.85610E+02, 1.11210E-13, -5.98306E-09 },
{ 94000., 4.33410E-05, 9.86930E+02, 9.77408E-14, 6.75162E-09 },
{ 96000., 3.94430E-05, 9.88260E+02, 9.18264E-14, -6.02343E-09 },
{ 98000., 3.59080E-05, 9.89580E+02, 7.94534E-14, 2.34210E-09 },
{ 100000., 3.26960E-05, 9.90900E+02, 7.48600E-14, -3.34498E-09 },
{ 102000., 2.97810E-05, 9.92210E+02, 6.66067E-14, -3.96219E-09 },
{ 104000., 2.71320E-05, 9.93530E+02, 5.77131E-14, 3.41937E-08 },
{ 106000., 2.46980E-05, 9.95410E+02, 2.50410E-14, 7.07187E-07 },
{ 108000., 2.24140E-05, 9.99070E+02, 6.71229E-14, -1.92943E-07 },
{ 110000., 2.03570E-05, 1.00272E+03, 4.69675E-14, 4.95832E-08 },
{ 112000., 1.85010E-05, 1.00636E+03, 4.65069E-14, -2.03903E-08 },
{ 114000., 1.68270E-05, 1.00998E+03, 4.00047E-14, 1.97789E-09 },
{ 116000., 1.53150E-05, 1.01359E+03, 3.64744E-14, -2.52130E-09 },
{ 118000., 1.39480E-05, 1.01719E+03, 3.15976E-14, -6.89271E-09 },
{ 120000., 1.27100E-05, 1.02077E+03, 3.06351E-14, 9.21465E-11 },
{ 122000., 1.15920E-05, 1.02434E+03, 2.58618E-14, -8.47587E-09 },
{ 124000., 1.05790E-05, 1.02789E+03, 2.34176E-14, 3.81135E-09 },
{ 126000., 9.66010E-06, 1.03144E+03, 2.16178E-14, -6.76951E-09 },
{ 128000., 8.82710E-06, 1.03497E+03, 1.89611E-14, -6.73330E-09 },
{ 130000., 8.07070E-06, 1.03848E+03, 1.74377E-14, 3.70270E-09 },
{ 132000., 7.38380E-06, 1.04199E+03, 1.55382E-14, -8.07752E-09 },
{ 134000., 6.75940E-06, 1.04548E+03, 1.41595E-14, -1.39263E-09 },
{ 136000., 6.19160E-06, 1.04896E+03, 1.27239E-14, -1.35196E-09 },
{ 138000., 5.67490E-06, 1.05243E+03, 1.15951E-14, -8.19953E-09 },
{ 140000., 5.20450E-06, 1.05588E+03, 1.03459E-14, 4.15010E-09 },
{ 142000., 4.77570E-06, 1.05933E+03, 9.42149E-15, -8.40086E-09 },
{ 144000., 4.38470E-06, 1.06276E+03, 8.66820E-15, -5.46671E-10 },
{ 146000., 4.02820E-06, 1.06618E+03, 7.65573E-15, -4.41246E-09 },
{ 148000., 3.70260E-06, 1.06959E+03, 7.05890E-15, 3.19650E-09 },
{ 150000., 3.40520E-06, 1.07299E+03, 6.40867E-15, -2.33736E-08 },
{ 152000., 3.13330E-06, 1.07637E+03, 5.55641E-15, 6.02977E-08 },
{ 154000., 2.88480E-06, 1.07975E+03, 6.46568E-15, -2.17817E-07 },
{ 156000., 2.66270E-06, 1.08202E+03, 8.18087E-15, -8.54029E-07 },
{ 158000., 2.46830E-06, 1.08202E+03, 2.36086E-15, 2.28931E-07 },
{ 160000., 2.28810E-06, 1.08202E+03, 3.67571E-15, -6.16972E-08 },
{ 162000., 2.12120E-06, 1.08202E+03, 2.88632E-15, 1.78573E-08 },
{ 164000., 1.96640E-06, 1.08202E+03, 2.92903E-15, -9.73206E-09 },
{ 166000., 1.82300E-06, 1.08202E+03, 2.49757E-15, 2.10709E-08 },
{ 168000., 1.69000E-06, 1.08202E+03, 2.68069E-15, -7.45517E-08 },
{ 170000., 1.56680E-06, 1.08202E+03, 1.47966E-15, 2.77136E-07 },
{ 172000., 1.45250E-06, 1.08202E+03, 4.75068E-15, -1.03399E-06 },
{ 174000., 1.35240E-06, 1.07963E+03, 8.17622E-16, 2.73830E-07 },
{ 176000., 1.25880E-06, 1.07723E+03, 1.72883E-15, -7.63301E-08 },
{ 178000., 1.17130E-06, 1.07482E+03, 1.41704E-15, 1.64901E-08 },
{ 180000., 1.08960E-06, 1.07240E+03, 1.30299E-15, -4.63038E-09 },
{ 182000., 1.01320E-06, 1.06998E+03, 1.32100E-15, 2.03140E-09 },
{ 184000., 9.41950E-07, 1.06756E+03, 1.13799E-15, -3.49522E-09 },
{ 186000., 8.75370E-07, 1.06513E+03, 1.13202E-15, -3.05052E-09 },
{ 188000., 8.13260E-07, 1.06269E+03, 1.03892E-15, 6.97283E-10 },
{ 190000., 7.55320E-07, 1.06025E+03, 9.67290E-16, 2.61383E-10 },
{ 192000., 7.01260E-07, 1.05781E+03, 9.11920E-16, -1.74281E-09 },
{ 194000., 6.50850E-07, 1.05536E+03, 8.60032E-16, -8.29013E-09 },
{ 196000., 6.03870E-07, 1.05290E+03, 7.92951E-16, 1.99033E-08 },
{ 198000., 5.60110E-07, 1.05044E+03, 7.98164E-16, -7.13232E-08 },
{ 200000., 5.19320E-07, 1.04798E+03, 4.69394E-16, 2.65389E-07 },
{ 202000., 4.81340E-07, 1.04550E+03, 1.53926E-15, -1.02023E-06 },
{ 204000., 4.47960E-07, 1.04063E+03, 2.73571E-16, 2.30547E-07 },
{ 206000., 4.16690E-07, 1.03565E+03, 5.31456E-16, -6.69551E-08 },
{ 208000., 3.87320E-07, 1.03065E+03, 4.50605E-16, 7.27308E-09 },
{ 210000., 3.59790E-07, 1.02562E+03, 4.26126E-16, -7.13720E-09 },
{ 212000., 3.33970E-07, 1.02057E+03, 4.09893E-16, -8.72426E-09 },
{ 214000., 3.09780E-07, 1.01549E+03, 3.79301E-16, -2.96576E-09 },
{ 216000., 2.87120E-07, 1.01039E+03, 3.67902E-16, -9.41272E-09 },
{ 218000., 2.65920E-07, 1.00526E+03, 3.39092E-16, -4.38337E-09 },
{ 220000., 2.46090E-07, 1.00011E+03, 3.30732E-16, -3.05378E-09 },
{ 222000., 2.27570E-07, 9.94940E+02, 3.02981E-16, -1.34015E-08 },
{ 224000., 2.10270E-07, 9.89730E+02, 2.87343E-16, -3.34027E-09 },
{ 226000., 1.94120E-07, 9.84500E+02, 2.72646E-16, -3.23743E-09 },
{ 228000., 1.79060E-07, 9.79250E+02, 2.57074E-16, -1.37100E-08 },
{ 230000., 1.65030E-07, 9.73960E+02, 2.44060E-16, -1.92258E-09 },
{ 232000., 1.51970E-07, 9.68650E+02, 2.21687E-16, -8.59969E-09 },
{ 234000., 1.39810E-07, 9.63310E+02, 2.19191E-16, -8.67865E-09 },
{ 236000., 1.28510E-07, 9.57940E+02, 1.91549E-16, -1.68569E-09 },
{ 238000., 1.18020E-07, 9.52550E+02, 2.29613E-16, -1.45786E-08 },
{ 240000., 1.08270E-07, 9.47120E+02, 0.00000E+00, 0.00000E+00 }
};
/* for purposes of doing the table lookup, force the incoming
@ -222,7 +222,7 @@ void ls_atmos( SCALAR altitude, SCALAR * sigma, SCALAR * v_sound,
// printf("altitude = %.2f\n", altitude);
if ( altitude < 0.0 ) {
altitude = 0.0;
altitude = 0.0;
}
// printf("altitude = %.2f\n", altitude);
@ -240,28 +240,28 @@ void ls_atmos( SCALAR altitude, SCALAR * sigma, SCALAR * v_sound,
daltn3 = daltn*daltn*daltn;
density = (gden_0/6)*((daltp3/2000) - 2000*daltp)
+ (gden_1/6)*((daltn3/2000) - 2000*daltn)
+ den_0*daltp/2000 + den_1*daltn/2000;
+ (gden_1/6)*((daltn3/2000) - 2000*daltn)
+ den_0*daltp/2000 + den_1*daltn/2000;
*v_sound = (gsps_0/6)*((daltp3/2000) - 2000*daltp)
+ (gsps_1/6)*((daltn3/2000) - 2000*daltn)
+ sps_0*daltp/2000 + sps_1*daltn/2000;
+ (gsps_1/6)*((daltn3/2000) - 2000*daltn)
+ sps_0*daltp/2000 + sps_1*daltn/2000;
*sigma = density/SEA_LEVEL_DENSITY;
if (altitude < HLEV) /* BUG - these curve fits are only good to about 75000 ft */
{
t_amb_r = 1. - 6.875e-6*altitude;
// printf("index = %d t_amb_r = %.2f\n", index, t_amb_r);
// p_amb_r = pow( t_amb_r, 5.256 );
tmp = 5.256; // avoid a segfault (?)
p_amb_r = pow( t_amb_r, tmp );
// printf("p_amb_r = %.2f\n", p_amb_r);
t_amb_r = 1. - 6.875e-6*altitude;
// printf("index = %d t_amb_r = %.2f\n", index, t_amb_r);
// p_amb_r = pow( t_amb_r, 5.256 );
tmp = 5.256; // avoid a segfault (?)
p_amb_r = pow( t_amb_r, tmp );
// printf("p_amb_r = %.2f\n", p_amb_r);
}
else
{
t_amb_r = 0.751895;
p_amb_r = 0.2234*exp( -4.806e-5 * (altitude - HLEV));
t_amb_r = 0.751895;
p_amb_r = 0.2234*exp( -4.806e-5 * (altitude - HLEV));
}
*p_amb = p_amb_r * PAMB0;

View file

@ -18,7 +18,7 @@ extern "C" {
void ls_atmos( SCALAR altitude, SCALAR * sigma, SCALAR * v_sound,
SCALAR * t_amb, SCALAR * p_amb );
SCALAR * t_amb, SCALAR * p_amb );
#ifdef __cplusplus
}

View file

@ -1,37 +1,37 @@
/***************************************************************************
TITLE: c172_aero
TITLE: c172_aero
----------------------------------------------------------------------------
FUNCTION: aerodynamics model based on constant stability derivatives
FUNCTION: aerodynamics model based on constant stability derivatives
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Based on data from:
Part 1 of Roskam's S&C text
The FAA type certificate data sheet for the 172
Various sources on the net
John D. Anderson's Intro to Flight text (NACA 2412 data)
UIUC's airfoil data web site
GENEALOGY: Based on data from:
Part 1 of Roskam's S&C text
The FAA type certificate data sheet for the 172
Various sources on the net
John D. Anderson's Intro to Flight text (NACA 2412 data)
UIUC's airfoil data web site
----------------------------------------------------------------------------
DESIGNED BY: Tony Peden
CODED BY: Tony Peden
MAINTAINED BY: Tony Peden
DESIGNED BY: Tony Peden
CODED BY: Tony Peden
MAINTAINED BY: Tony Peden
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
DATE PURPOSE BY
6/10/99 Initial test release
@ -40,28 +40,28 @@
REFERENCES:
Aero Coeffs:
CL lift
Cd drag
Cm pitching moment
Cy sideforce
Cn yawing moment
Croll,Cl rolling moment (yeah, I know. Shoot me.)
CL lift
Cd drag
Cm pitching moment
Cy sideforce
Cn yawing moment
Croll,Cl rolling moment (yeah, I know. Shoot me.)
Subscripts
o constant i.e. not a function of alpha or beta
a alpha
adot d(alpha)/dt
q pitch rate
qdot d(q)/dt
beta sideslip angle
p roll rate
r yaw rate
da aileron deflection
de elevator deflection
dr rudder deflection
s stability axes
o constant i.e. not a function of alpha or beta
a alpha
adot d(alpha)/dt
q pitch rate
qdot d(q)/dt
beta sideslip angle
p roll rate
r yaw rate
da aileron deflection
de elevator deflection
dr rudder deflection
s stability axes
----------------------------------------------------------------------------
@ -74,7 +74,7 @@
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
@ -83,7 +83,7 @@
--------------------------------------------------------------------------*/
#include "ls_generic.h"
#include "ls_cockpit.h"
#include "ls_constants.h"
@ -100,10 +100,10 @@
#ifdef USENZ
#define NZ generic_.n_cg_body_v[2]
#define NZ generic_.n_cg_body_v[2]
#else
#define NZ 1
#endif
#define NZ 1
#endif
extern COCKPIT cockpit_;
@ -174,35 +174,35 @@ extern COCKPIT cockpit_;
static SCALAR interp(SCALAR *y_table, SCALAR *x_table, int Ntable, SCALAR x)
{
SCALAR slope;
int i=1;
float y;
/* if x is outside the table, return value at x[0] or x[Ntable-1]*/
if(x <= x_table[0])
{
y=y_table[0];
/* printf("x smaller than x_table[0]: %g %g\n",x,x_table[0]); */
}
else if(x >= x_table[Ntable-1])
{
slope=(y_table[Ntable-1]-y_table[Ntable-2])/(x_table[Ntable-1]-x_table[Ntable-2]);
y=slope*(x-x_table[Ntable-1]) +y_table[Ntable-1];
/* printf("x larger than x_table[N]: %g %g %d\n",x,x_table[NCL-1],Ntable-1);
*/ }
else /*x is within the table, interpolate linearly to find y value*/
{
while(x_table[i] <= x) {i++;}
slope=(y_table[i]-y_table[i-1])/(x_table[i]-x_table[i-1]);
/* printf("x: %g, i: %d, cl[i]: %g, cl[i-1]: %g, slope: %g\n",x,i,y_table[i],y_table[i-1],slope); */
y=slope*(x-x_table[i-1]) +y_table[i-1];
}
return y;
}
SCALAR slope;
int i=1;
float y;
/* if x is outside the table, return value at x[0] or x[Ntable-1]*/
if(x <= x_table[0])
{
y=y_table[0];
/* printf("x smaller than x_table[0]: %g %g\n",x,x_table[0]); */
}
else if(x >= x_table[Ntable-1])
{
slope=(y_table[Ntable-1]-y_table[Ntable-2])/(x_table[Ntable-1]-x_table[Ntable-2]);
y=slope*(x-x_table[Ntable-1]) +y_table[Ntable-1];
/* printf("x larger than x_table[N]: %g %g %d\n",x,x_table[NCL-1],Ntable-1);
*/ }
else /*x is within the table, interpolate linearly to find y value*/
{
while(x_table[i] <= x) {i++;}
slope=(y_table[i]-y_table[i-1])/(x_table[i]-x_table[i-1]);
/* printf("x: %g, i: %d, cl[i]: %g, cl[i-1]: %g, slope: %g\n",x,i,y_table[i],y_table[i-1],slope); */
y=slope*(x-x_table[i-1]) +y_table[i-1];
}
return y;
}
void c172_aero( SCALAR dt, int Initialize ) {
@ -214,7 +214,7 @@ void c172_aero( SCALAR dt, int Initialize ) {
static SCALAR trim_inc = 0.0002;
static SCALAR alpha_ind[NCL]={-0.087,0,0.14,0.21,0.24,0.26,0.28,0.31,0.35};
static SCALAR alpha_ind[NCL]={-0.087,0,0.14,0.21,0.24,0.26,0.28,0.31,0.35};
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};
@ -230,68 +230,68 @@ void c172_aero( SCALAR dt, int Initialize ) {
/* printf("Initialize= %d\n",Initialize); */
/* printf("Initializing aero model...Initialize= %d\n", Initialize);
*/
/* printf("Initializing aero model...Initialize= %d\n", Initialize);
*/
/*nondimensionalization quantities*/
/*units here are ft and lbs */
cbar=4.9; /*mean aero chord ft*/
b=35.8; /*wing span ft */
Sw=174; /*wing planform surface area ft^2*/
rPiARe=0.054; /*reciprocal of Pi*AR*e*/
lbare=3.682; /*elevator moment arm / MAC*/
CLadot=1.7;
CLq=3.9;
CLob=0;
/*units here are ft and lbs */
cbar=4.9; /*mean aero chord ft*/
b=35.8; /*wing span ft */
Sw=174; /*wing planform surface area ft^2*/
rPiARe=0.054; /*reciprocal of Pi*AR*e*/
lbare=3.682; /*elevator moment arm / MAC*/
CLadot=1.7;
CLq=3.9;
CLob=0;
Ai=1.24;
Cdob=0.036;
Cda=0.13; /*Not used*/
Cdde=0.06;
Cdob=0.036;
Cda=0.13; /*Not used*/
Cdde=0.06;
Cma=-1.8;
Cmadot=-5.2;
Cmq=-12.4;
Cmob=-0.02;
Cmde=-1.28;
CLde=-Cmde / lbare; /* kinda backwards, huh? */
Cma=-1.8;
Cmadot=-5.2;
Cmq=-12.4;
Cmob=-0.02;
Cmde=-1.28;
CLde=-Cmde / lbare; /* kinda backwards, huh? */
Clbeta=-0.089;
Clp=-0.47;
Clr=0.096;
Clda=-0.09;
Cldr=0.0147;
Clbeta=-0.089;
Clp=-0.47;
Clr=0.096;
Clda=-0.09;
Cldr=0.0147;
Cnbeta=0.065;
Cnp=-0.03;
Cnr=-0.099;
Cnda=-0.0053;
Cndr=-0.0657;
Cnbeta=0.065;
Cnp=-0.03;
Cnr=-0.099;
Cnda=-0.0053;
Cndr=-0.0657;
Cybeta=-0.31;
Cyp=-0.037;
Cyr=0.21;
Cyda=0.0;
Cydr=0.187;
Cybeta=-0.31;
Cyp=-0.037;
Cyr=0.21;
Cyda=0.0;
Cydr=0.187;
MaxTakeoffWeight=2550;
EmptyWeight=1500;
MaxTakeoffWeight=2550;
EmptyWeight=1500;
Zcg=0.51;
Zcg=0.51;
/*
LaRCsim uses:
Cm > 0 => ANU
Cl > 0 => Right wing down
Cn > 0 => ANL
so:
Cl > 0 => Right wing down
Cn > 0 => ANL
so:
elevator > 0 => AND -- aircraft nose down
aileron > 0 => right wing up
rudder > 0 => ANL
aileron > 0 => right wing up
rudder > 0 => ANL
*/
/*do weight & balance here since there is no better place*/
@ -316,58 +316,58 @@ void c172_aero( SCALAR dt, int Initialize ) {
if(Flap_handle < flap_ind[0])
{
fi=0;
Flap_handle=flap_ind[0];
lastFlapHandle=Flap_handle;
Flap_Position=flap_ind[0];
fi=0;
Flap_handle=flap_ind[0];
lastFlapHandle=Flap_handle;
Flap_Position=flap_ind[0];
}
else if(Flap_handle > flap_ind[Ndf-1])
{
fi=Ndf-1;
Flap_handle=flap_ind[fi];
lastFlapHandle=Flap_handle;
Flap_Position=flap_ind[fi];
fi=Ndf-1;
Flap_handle=flap_ind[fi];
lastFlapHandle=Flap_handle;
Flap_Position=flap_ind[fi];
}
else
{
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)
{
else
{
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)
{
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
{
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_transit_rate*dt;
else
{
Flaps_In_Transit=0;
Flap_Position=Flap_handle;
}
}
}
lastFlapHandle=Flap_handle;
}
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
{
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_transit_rate*dt;
else
{
Flaps_In_Transit=0;
Flap_Position=Flap_handle;
}
}
}
lastFlapHandle=Flap_handle;
}
if(Aft_trim) long_trim = long_trim - trim_inc;
if(Fwd_trim) long_trim = long_trim + trim_inc;
@ -375,17 +375,17 @@ void c172_aero( SCALAR dt, int Initialize ) {
/* printf("Long_control: %7.4f, long_trim: %7.4f,DEG_TO_RAD: %7.4f, RAD_TO_DEG: %7.4f\n",Long_control,long_trim,DEG_TO_RAD,RAD_TO_DEG);
*/ /*scale pct control to degrees deflection*/
if ((Long_control+Long_trim) <= 0)
elevator=(Long_control+Long_trim)*28*DEG_TO_RAD;
elevator=(Long_control+Long_trim)*28*DEG_TO_RAD;
else
elevator=(Long_control+Long_trim)*23*DEG_TO_RAD;
elevator=(Long_control+Long_trim)*23*DEG_TO_RAD;
aileron = -1*Lat_control*17.5*DEG_TO_RAD;
rudder = -1*Rudder_pedal*16*DEG_TO_RAD;
/*
The aileron travel limits are 20 deg. TEU and 15 deg TED
but since we don't distinguish between left and right we'll
use the average here (17.5 deg)
*/
use the average here (17.5 deg)
*/
/*calculate rate derivative nondimensionalization (is that a word?) factors */
@ -396,14 +396,14 @@ void c172_aero( SCALAR dt, int Initialize ) {
*/
if(V_rel_wind > DYN_ON_SPEED)
{
cbar_2V=cbar/(2*V_rel_wind);
b_2V=b/(2*V_rel_wind);
cbar_2V=cbar/(2*V_rel_wind);
b_2V=b/(2*V_rel_wind);
}
else
{
cbar_2V=0;
b_2V=0;
}
cbar_2V=0;
b_2V=0;
}
/*calcuate the qS nondimensionalization factors*/
@ -430,7 +430,7 @@ void c172_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); */

View file

@ -1,36 +1,36 @@
/***************************************************************************
TITLE: engine.c
TITLE: engine.c
----------------------------------------------------------------------------
FUNCTION: dummy engine routine
FUNCTION: dummy engine routine
----------------------------------------------------------------------------
MODULE STATUS: incomplete
MODULE STATUS: incomplete
----------------------------------------------------------------------------
GENEALOGY: This is a renamed navion_engine.c originall written by E. Bruce
Jackson
GENEALOGY: This is a renamed navion_engine.c originall written by E. Bruce
Jackson
----------------------------------------------------------------------------
DESIGNED BY: designer
CODED BY: programmer
MAINTAINED BY: maintainer
DESIGNED BY: designer
CODED BY: programmer
MAINTAINED BY: maintainer
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
CURRENT RCS HEADER INFO:
CURRENT RCS HEADER INFO:
$Header$
@ -40,23 +40,23 @@ $Header$
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY: ls_model();
CALLED BY: ls_model();
----------------------------------------------------------------------------
CALLS TO: none
CALLS TO: none
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include <math.h>
@ -67,31 +67,31 @@ $Header$
#include "ls_cockpit.h"
#include "c172_aero.h"
extern SIM_CONTROL sim_control_;
extern SIM_CONTROL sim_control_;
void c172_engine( SCALAR dt, int init ) {
float v,h,pa;
float bhp=160;
Throttle[3] = Throttle_pct;
if ( ! Use_External_Engine ) {
/* do a crude engine power calc based on throttle position */
v=V_rel_wind;
h=Altitude;
if(V_rel_wind < 10)
v=10;
if(Altitude < 0)
h=0;
pa=(0.00144*v + 0.546)*(1 - 1.6E-5*h)*bhp;
if(pa < 0)
pa=0;
/* do a crude engine power calc based on throttle position */
v=V_rel_wind;
h=Altitude;
if(V_rel_wind < 10)
v=10;
if(Altitude < 0)
h=0;
pa=(0.00144*v + 0.546)*(1 - 1.6E-5*h)*bhp;
if(pa < 0)
pa=0;
F_X_engine = Throttle[3]*(pa*550)/v;
F_X_engine = Throttle[3]*(pa*550)/v;
} else {
/* accept external settings */
/* accept external settings */
}
/* printf("F_X_engine = %.3f\n", F_X_engine); */

View file

@ -1,38 +1,38 @@
/***************************************************************************
TITLE: gear
TITLE: gear
----------------------------------------------------------------------------
FUNCTION: Landing gear model for example simulation
FUNCTION: Landing gear model for example simulation
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 931012 by E. B. Jackson
GENEALOGY: Created 931012 by E. B. Jackson
----------------------------------------------------------------------------
DESIGNED BY: E. B. Jackson
CODED BY: E. B. Jackson
MAINTAINED BY: E. B. Jackson
DESIGNED BY: E. B. Jackson
CODED BY: E. B. Jackson
MAINTAINED BY: E. B. Jackson
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
931218 Added navion.h header to allow connection with
aileron displacement for nosewheel steering. EBJ
940511 Connected nosewheel to rudder pedal; adjusted gain.
CURRENT RCS HEADER:
931218 Added navion.h header to allow connection with
aileron displacement for nosewheel steering. EBJ
940511 Connected nosewheel to rudder pedal; adjusted gain.
CURRENT RCS HEADER:
$Header$
$Log$
@ -79,23 +79,23 @@ Updates from Tony.
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include <math.h>
@ -157,24 +157,24 @@ void c172_gear()
*/
static int num_wheels = NUM_WHEELS; /* number of wheels */
static int num_wheels = NUM_WHEELS; /* number of wheels */
static DATA d_wheel_rp_body_v[NUM_WHEELS][3] = /* X, Y, Z locations,full extension */
{
{ 3.91, 0., 6.67 }, /*nose*/ /* in feet */
{ -1.47, 3.58, 6.71 }, /*right main*/
{ -1.47, -3.58, 6.71 }, /*left main*/
{ -15.67, 0, 2.42 } /*tail skid */
{ 3.91, 0., 6.67 }, /*nose*/ /* in feet */
{ -1.47, 3.58, 6.71 }, /*right main*/
{ -1.47, -3.58, 6.71 }, /*left main*/
{ -15.67, 0, 2.42 } /*tail skid */
};
// static DATA gear_travel[NUM_WHEELS] = /*in Z-axis*/
// { -0.5, 2.5, 2.5, 0};
static DATA spring_constant[NUM_WHEELS] = /* springiness, lbs/ft */
{ 1200., 900., 900., 10000. };
static DATA spring_damping[NUM_WHEELS] = /* damping, lbs/ft/sec */
{ 200., 300., 300., 400. };
static DATA percent_brake[NUM_WHEELS] = /* percent applied braking */
{ 0., 0., 0., 0. }; /* 0 = none, 1 = full */
static DATA caster_angle_rad[NUM_WHEELS] = /* steerable tires - in */
{ 0., 0., 0., 0}; /* radians, +CW */
static DATA spring_constant[NUM_WHEELS] = /* springiness, lbs/ft */
{ 1200., 900., 900., 10000. };
static DATA spring_damping[NUM_WHEELS] = /* damping, lbs/ft/sec */
{ 200., 300., 300., 400. };
static DATA percent_brake[NUM_WHEELS] = /* percent applied braking */
{ 0., 0., 0., 0. }; /* 0 = none, 1 = full */
static DATA caster_angle_rad[NUM_WHEELS] = /* steerable tires - in */
{ 0., 0., 0., 0}; /* radians, +CW */
/*
* End of aircraft specific code
*/
@ -187,58 +187,58 @@ void c172_gear()
*
* mu ^
* |
* max_mu | +
* | /|
* sliding_mu | / +------
* | /
* | /
* max_mu | +
* | /|
* sliding_mu | / +------
* | /
* | /
* +--+------------------------>
* | | | sideward V
* 0 bkout skid
* V V
* V V
*/
static int it_rolls[NUM_WHEELS] = { 1,1,1,0};
static DATA sliding_mu[NUM_WHEELS] = { 0.5, 0.5, 0.5, 0.3};
static DATA rolling_mu[NUM_WHEELS] = { 0.01, 0.01, 0.01, 0.0};
static DATA max_brake_mu[NUM_WHEELS] ={ 0.0, 0.6, 0.6, 0.0};
static DATA max_mu = 0.8;
static DATA bkout_v = 0.1;
static int it_rolls[NUM_WHEELS] = { 1,1,1,0};
static DATA sliding_mu[NUM_WHEELS] = { 0.5, 0.5, 0.5, 0.3};
static DATA rolling_mu[NUM_WHEELS] = { 0.01, 0.01, 0.01, 0.0};
static DATA max_brake_mu[NUM_WHEELS] ={ 0.0, 0.6, 0.6, 0.0};
static DATA max_mu = 0.8;
static DATA bkout_v = 0.1;
static DATA skid_v = 1.0;
/*
* Local data variables
*/
DATA d_wheel_cg_body_v[3]; /* wheel offset from cg, X-Y-Z */
DATA d_wheel_cg_local_v[3]; /* wheel offset from cg, N-E-D */
DATA d_wheel_rwy_local_v[3]; /* wheel offset from rwy, N-E-U */
DATA v_wheel_cg_local_v[3]; /*wheel velocity rel to cg N-E-D*/
// DATA v_wheel_body_v[3]; /* wheel velocity, X-Y-Z */
DATA v_wheel_local_v[3]; /* wheel velocity, N-E-D */
DATA f_wheel_local_v[3]; /* wheel reaction force, N-E-D */
DATA d_wheel_cg_body_v[3]; /* wheel offset from cg, X-Y-Z */
DATA d_wheel_cg_local_v[3]; /* wheel offset from cg, N-E-D */
DATA d_wheel_rwy_local_v[3]; /* wheel offset from rwy, N-E-U */
DATA v_wheel_cg_local_v[3]; /*wheel velocity rel to cg N-E-D*/
// DATA v_wheel_body_v[3]; /* wheel velocity, X-Y-Z */
DATA v_wheel_local_v[3]; /* wheel velocity, N-E-D */
DATA f_wheel_local_v[3]; /* wheel reaction force, N-E-D */
// DATA altitude_local_v[3]; /*altitude vector in local (N-E-D) i.e. (0,0,h)*/
// DATA altitude_body_v[3]; /*altitude vector in body (X,Y,Z)*/
DATA temp3a[3];
// DATA temp3b[3];
DATA tempF[3];
DATA tempM[3];
DATA reaction_normal_force; /* wheel normal (to rwy) force */
DATA cos_wheel_hdg_angle, sin_wheel_hdg_angle; /* temp storage */
DATA tempM[3];
DATA reaction_normal_force; /* wheel normal (to rwy) force */
DATA cos_wheel_hdg_angle, sin_wheel_hdg_angle; /* temp storage */
DATA v_wheel_forward, v_wheel_sideward, abs_v_wheel_sideward;
DATA forward_mu, sideward_mu; /* friction coefficients */
DATA beta_mu; /* breakout friction slope */
DATA forward_mu, sideward_mu; /* friction coefficients */
DATA beta_mu; /* breakout friction slope */
DATA forward_wheel_force, sideward_wheel_force;
int i; /* per wheel loop counter */
int i; /* per wheel loop counter */
/*
* Execution starts here
*/
beta_mu = max_mu/(skid_v-bkout_v);
clear3( F_gear_v ); /* Initialize sum of forces... */
clear3( M_gear_v ); /* ...and moments */
clear3( F_gear_v ); /* Initialize sum of forces... */
clear3( M_gear_v ); /* ...and moments */
/*
* Put aircraft specific executable code here
@ -248,152 +248,152 @@ void c172_gear()
percent_brake[2] = Brake_pct[1];
caster_angle_rad[0] =
(0.01 + 0.04 * (1 - V_calibrated_kts / 130)) * Rudder_pedal;
(0.01 + 0.04 * (1 - V_calibrated_kts / 130)) * Rudder_pedal;
for (i=0;i<num_wheels;i++) /* Loop for each wheel */
for (i=0;i<num_wheels;i++) /* Loop for each wheel */
{
/* printf("%s:\n",gear_strings[i]); */
/* printf("%s:\n",gear_strings[i]); */
/*========================================*/
/* Calculate wheel position w.r.t. runway */
/*========================================*/
/*========================================*/
/* Calculate wheel position w.r.t. runway */
/*========================================*/
/* printf("\thgcg: %g, theta: %g,phi: %g\n",D_cg_above_rwy,Theta*RAD_TO_DEG,Phi*RAD_TO_DEG); */
/* printf("\thgcg: %g, theta: %g,phi: %g\n",D_cg_above_rwy,Theta*RAD_TO_DEG,Phi*RAD_TO_DEG); */
/* First calculate wheel location w.r.t. cg in body (X-Y-Z) axes... */
/* First calculate wheel location w.r.t. cg in body (X-Y-Z) axes... */
sub3( d_wheel_rp_body_v[i], D_cg_rp_body_v, d_wheel_cg_body_v );
sub3( d_wheel_rp_body_v[i], D_cg_rp_body_v, d_wheel_cg_body_v );
/* then converting to local (North-East-Down) axes... */
/* then converting to local (North-East-Down) axes... */
multtrans3x3by3( T_local_to_body_m, d_wheel_cg_body_v, d_wheel_cg_local_v );
multtrans3x3by3( T_local_to_body_m, d_wheel_cg_body_v, d_wheel_cg_local_v );
/* Runway axes correction - third element is Altitude, not (-)Z... */
/* Runway axes correction - third element is Altitude, not (-)Z... */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* since altitude = -Z */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* since altitude = -Z */
/* Add wheel offset to cg location in local axes */
/* Add wheel offset to cg location in local axes */
add3( d_wheel_cg_local_v, D_cg_rwy_local_v, d_wheel_rwy_local_v );
add3( d_wheel_cg_local_v, D_cg_rwy_local_v, d_wheel_rwy_local_v );
/* remove Runway axes correction so right hand rule applies */
/* remove Runway axes correction so right hand rule applies */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* now Z positive down */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* now Z positive down */
/*============================*/
/* Calculate wheel velocities */
/*============================*/
/*============================*/
/* Calculate wheel velocities */
/*============================*/
/* contribution due to angular rates */
/* contribution due to angular rates */
cross3( Omega_body_v, d_wheel_cg_body_v, temp3a );
cross3( Omega_body_v, d_wheel_cg_body_v, temp3a );
/* transform into local axes */
/* transform into local axes */
multtrans3x3by3( T_local_to_body_m, temp3a,v_wheel_cg_local_v );
multtrans3x3by3( T_local_to_body_m, temp3a,v_wheel_cg_local_v );
/* plus contribution due to cg velocities */
/* plus contribution due to cg velocities */
add3( v_wheel_cg_local_v, V_local_rel_ground_v, v_wheel_local_v );
add3( v_wheel_cg_local_v, V_local_rel_ground_v, v_wheel_local_v );
clear3(f_wheel_local_v);
reaction_normal_force=0;
if( HEIGHT_AGL_WHEEL < 0. )
/*the wheel is underground -- which implies ground contact
so calculate reaction forces */
{
/*===========================================*/
/* Calculate forces & moments for this wheel */
/*===========================================*/
clear3(f_wheel_local_v);
reaction_normal_force=0;
if( HEIGHT_AGL_WHEEL < 0. )
/*the wheel is underground -- which implies ground contact
so calculate reaction forces */
{
/*===========================================*/
/* Calculate forces & moments for this wheel */
/*===========================================*/
/* Add any anticipation, or frame lead/prediction, here... */
/* Add any anticipation, or frame lead/prediction, here... */
/* no lead used at present */
/* no lead used at present */
/* Calculate sideward and forward velocities of the wheel
in the runway plane */
/* Calculate sideward and forward velocities of the wheel
in the runway plane */
cos_wheel_hdg_angle = cos(caster_angle_rad[i] + Psi);
sin_wheel_hdg_angle = sin(caster_angle_rad[i] + Psi);
cos_wheel_hdg_angle = cos(caster_angle_rad[i] + Psi);
sin_wheel_hdg_angle = sin(caster_angle_rad[i] + Psi);
v_wheel_forward = v_wheel_local_v[0]*cos_wheel_hdg_angle
+ v_wheel_local_v[1]*sin_wheel_hdg_angle;
v_wheel_sideward = v_wheel_local_v[1]*cos_wheel_hdg_angle
- v_wheel_local_v[0]*sin_wheel_hdg_angle;
/* Calculate normal load force (simple spring constant) */
v_wheel_forward = v_wheel_local_v[0]*cos_wheel_hdg_angle
+ v_wheel_local_v[1]*sin_wheel_hdg_angle;
v_wheel_sideward = v_wheel_local_v[1]*cos_wheel_hdg_angle
- v_wheel_local_v[0]*sin_wheel_hdg_angle;
/* Calculate normal load force (simple spring constant) */
reaction_normal_force = 0.;
reaction_normal_force = 0.;
reaction_normal_force = spring_constant[i]*d_wheel_rwy_local_v[2]
- v_wheel_local_v[2]*spring_damping[i];
/* printf("\treaction_normal_force: %g\n",reaction_normal_force); */
reaction_normal_force = spring_constant[i]*d_wheel_rwy_local_v[2]
- v_wheel_local_v[2]*spring_damping[i];
/* printf("\treaction_normal_force: %g\n",reaction_normal_force); */
if (reaction_normal_force > 0.) reaction_normal_force = 0.;
/* to prevent damping component from swamping spring component */
if (reaction_normal_force > 0.) reaction_normal_force = 0.;
/* to prevent damping component from swamping spring component */
/* Calculate friction coefficients */
/* Calculate friction coefficients */
if(it_rolls[i])
{
forward_mu = (max_brake_mu[i] - rolling_mu[i])*percent_brake[i] + rolling_mu[i];
abs_v_wheel_sideward = sqrt(v_wheel_sideward*v_wheel_sideward);
sideward_mu = sliding_mu[i];
if (abs_v_wheel_sideward < skid_v)
sideward_mu = (abs_v_wheel_sideward - bkout_v)*beta_mu;
if (abs_v_wheel_sideward < bkout_v) sideward_mu = 0.;
}
else
{
forward_mu=sliding_mu[i];
sideward_mu=sliding_mu[i];
}
if(it_rolls[i])
{
forward_mu = (max_brake_mu[i] - rolling_mu[i])*percent_brake[i] + rolling_mu[i];
abs_v_wheel_sideward = sqrt(v_wheel_sideward*v_wheel_sideward);
sideward_mu = sliding_mu[i];
if (abs_v_wheel_sideward < skid_v)
sideward_mu = (abs_v_wheel_sideward - bkout_v)*beta_mu;
if (abs_v_wheel_sideward < bkout_v) sideward_mu = 0.;
}
else
{
forward_mu=sliding_mu[i];
sideward_mu=sliding_mu[i];
}
/* Calculate foreward and sideward reaction forces */
/* Calculate foreward and sideward reaction forces */
forward_wheel_force = forward_mu*reaction_normal_force;
sideward_wheel_force = sideward_mu*reaction_normal_force;
if(v_wheel_forward < 0.) forward_wheel_force = -forward_wheel_force;
if(v_wheel_sideward < 0.) sideward_wheel_force = -sideward_wheel_force;
/* printf("\tFfwdgear: %g Fsidegear: %g\n",forward_wheel_force,sideward_wheel_force);
forward_wheel_force = forward_mu*reaction_normal_force;
sideward_wheel_force = sideward_mu*reaction_normal_force;
if(v_wheel_forward < 0.) forward_wheel_force = -forward_wheel_force;
if(v_wheel_sideward < 0.) sideward_wheel_force = -sideward_wheel_force;
/* printf("\tFfwdgear: %g Fsidegear: %g\n",forward_wheel_force,sideward_wheel_force);
*/
/* Rotate into local (N-E-D) axes */
/* Rotate into local (N-E-D) axes */
f_wheel_local_v[0] = forward_wheel_force*cos_wheel_hdg_angle
- sideward_wheel_force*sin_wheel_hdg_angle;
f_wheel_local_v[1] = forward_wheel_force*sin_wheel_hdg_angle
+ sideward_wheel_force*cos_wheel_hdg_angle;
f_wheel_local_v[2] = reaction_normal_force;
f_wheel_local_v[0] = forward_wheel_force*cos_wheel_hdg_angle
- sideward_wheel_force*sin_wheel_hdg_angle;
f_wheel_local_v[1] = forward_wheel_force*sin_wheel_hdg_angle
+ sideward_wheel_force*cos_wheel_hdg_angle;
f_wheel_local_v[2] = reaction_normal_force;
/* Convert reaction force from local (N-E-D) axes to body (X-Y-Z) */
mult3x3by3( T_local_to_body_m, f_wheel_local_v, tempF );
/* Convert reaction force from local (N-E-D) axes to body (X-Y-Z) */
mult3x3by3( T_local_to_body_m, f_wheel_local_v, tempF );
/* Calculate moments from force and offsets in body axes */
/* Calculate moments from force and offsets in body axes */
cross3( d_wheel_cg_body_v, tempF, tempM );
cross3( d_wheel_cg_body_v, tempF, tempM );
/* Sum forces and moments across all wheels */
/* Sum forces and moments across all wheels */
add3( tempF, F_gear_v, F_gear_v );
add3( tempM, M_gear_v, M_gear_v );
add3( tempF, F_gear_v, F_gear_v );
add3( tempM, M_gear_v, M_gear_v );
}
}
/* printf("\tN: %g,dZrwy: %g dZdotrwy: %g\n",reaction_normal_force,HEIGHT_AGL_WHEEL,v_wheel_cg_local_v[2]); */
/* printf("\tN: %g,dZrwy: %g dZdotrwy: %g\n",reaction_normal_force,HEIGHT_AGL_WHEEL,v_wheel_cg_local_v[2]); */
/*printf("\tFxgear: %g Fygear: %g, Fzgear: %g\n",F_X_gear,F_Y_gear,F_Z_gear);
printf("\tMgear: %g, Lgear: %g, Ngear: %g\n\n",M_m_gear,M_l_gear,M_n_gear); */
/*printf("\tFxgear: %g Fygear: %g, Fzgear: %g\n",F_X_gear,F_Y_gear,F_Z_gear);
printf("\tMgear: %g, Lgear: %g, Ngear: %g\n\n",M_m_gear,M_l_gear,M_n_gear); */
}

View file

@ -1,59 +1,59 @@
/***************************************************************************
TITLE: navion_init.c
TITLE: navion_init.c
----------------------------------------------------------------------------
FUNCTION: Initializes navion math model
FUNCTION: Initializes navion math model
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Renamed navion_init.c originally created on 930111 by Bruce Jackson
GENEALOGY: Renamed navion_init.c originally created on 930111 by Bruce Jackson
----------------------------------------------------------------------------
DESIGNED BY: EBJ
CODED BY: EBJ
MAINTAINED BY: EBJ
DESIGNED BY: EBJ
CODED BY: EBJ
MAINTAINED BY: EBJ
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
950314 Removed initialization of state variables, since this is
now done (version 1.4b1) in ls_init. EBJ
950406 Removed #include of "shmdefs.h"; shmdefs.h is a duplicate
of "navion.h". EBJ
CURRENT RCS HEADER:
950314 Removed initialization of state variables, since this is
now done (version 1.4b1) in ls_init. EBJ
950406 Removed #include of "shmdefs.h"; shmdefs.h is a duplicate
of "navion.h". EBJ
CURRENT RCS HEADER:
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include "ls_types.h"

File diff suppressed because it is too large Load diff

View file

@ -1,14 +1,14 @@
/***************************************************************************
TITLE: Cherokee_aero
TITLE: Cherokee_aero
----------------------------------------------------------------------------
FUNCTION: Linear aerodynamics model
FUNCTION: Linear aerodynamics model
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
@ -17,20 +17,20 @@
----------------------------------------------------------------------------
MODIFICATION HISTORY:
----------------------------------------------------------------------------
REFERENCES:
Based upon book:
Barnes W. McCormick,
"Aerodynamics, Aeronautics and Flight Mechanics",
John Wiley & Sons,1995, ISBN 0-471-11087-6
Based upon book:
Barnes W. McCormick,
"Aerodynamics, Aeronautics and Flight Mechanics",
John Wiley & Sons,1995, ISBN 0-471-11087-6
any suggestions, corrections, aditional data, flames, everything to
Gordan Sikic
gsikic@public.srce.hr
any suggestions, corrections, aditional data, flames, everything to
Gordan Sikic
gsikic@public.srce.hr
This source is not checked in this configuration in any way.
@ -70,101 +70,101 @@ This source is not checked in this configuration in any way.
void cherokee_aero()
/*float ** Cherokee (float t, VectorStanja &X, float *U)*/
{
static float
Cza = -19149.0/(146.69*146.69*157.5/2.0*0.00238),
Czat = -73.4*4*146.69/0.00238/157.5/5.25,
Czq = -2.655*4*2400.0/32.2/0.00238/157.5/146.69/5.25,
Cma = -21662.0 *2/146.69/0.00238/157.5/146.69/5.25,
Cmat = -892.4 *4/146.69/0.00238/157.5/146.69/5.25,
Cmq = -2405.1 *4/0.00238/157.5/146.69/5.25/5.25,
Czde = -1050.49 *2/0.00238/157.5/146.69/146.69,
Cmde = -12771.9 *2/0.00238/157.5/146.69/146.69/5.25,
Clb = -12891.0/(146.69*146.69*157.5/2.0*0.00238)/30.0,
Clp = -0.4704,
Clr = 0.1665,
Cyb = -1169.8/(146.69*146.69*157.5/2.0*0.00238),
// Cyp = -0.0342, (unused)
Cnb = 11127.2/(146.69*146.69*157.5/2.0*0.00238)/30.0,
Cnp = -0.0691,
Cnr = -0.0930,
// Cyf = -14.072/(146.69*146.69*157.5/2.0*0.00238), (unused)
// Cyps = 89.229/(146.69*146.69*157.5/2.0*0.00238), (unused)
// Clf = -5812.4/(146.69*146.69*157.5/2.0*0.00238)/30.0, //%Clda ? (unused)
// Cnf = -853.93/(146.69*146.69*157.5/2.0*0.00238)/30.0, //%Cnda ? (unused)
// Cnps = -1149.0/(146.69*146.69*157.5/2.0*0.00238)/30.0, //%Cndr ? (unused)
Cyr = 1.923/(146.69*146.69*157.5/2.0*0.00238),
static float
Cza = -19149.0/(146.69*146.69*157.5/2.0*0.00238),
Czat = -73.4*4*146.69/0.00238/157.5/5.25,
Czq = -2.655*4*2400.0/32.2/0.00238/157.5/146.69/5.25,
Cma = -21662.0 *2/146.69/0.00238/157.5/146.69/5.25,
Cmat = -892.4 *4/146.69/0.00238/157.5/146.69/5.25,
Cmq = -2405.1 *4/0.00238/157.5/146.69/5.25/5.25,
Czde = -1050.49 *2/0.00238/157.5/146.69/146.69,
Cmde = -12771.9 *2/0.00238/157.5/146.69/146.69/5.25,
Clb = -12891.0/(146.69*146.69*157.5/2.0*0.00238)/30.0,
Clp = -0.4704,
Clr = 0.1665,
Cyb = -1169.8/(146.69*146.69*157.5/2.0*0.00238),
// Cyp = -0.0342, (unused)
Cnb = 11127.2/(146.69*146.69*157.5/2.0*0.00238)/30.0,
Cnp = -0.0691,
Cnr = -0.0930,
// Cyf = -14.072/(146.69*146.69*157.5/2.0*0.00238), (unused)
// Cyps = 89.229/(146.69*146.69*157.5/2.0*0.00238), (unused)
// Clf = -5812.4/(146.69*146.69*157.5/2.0*0.00238)/30.0, //%Clda ? (unused)
// Cnf = -853.93/(146.69*146.69*157.5/2.0*0.00238)/30.0, //%Cnda ? (unused)
// Cnps = -1149.0/(146.69*146.69*157.5/2.0*0.00238)/30.0, //%Cndr ? (unused)
Cyr = 1.923/(146.69*146.69*157.5/2.0*0.00238),
Cx0 = -0.4645/(157.5*0.3048*0.3048),
Cx0 = -0.4645/(157.5*0.3048*0.3048),
Cz0 = -0.11875,
Cm0 = 0.0959,
Cz0 = -0.11875,
Cm0 = 0.0959,
Clda = -5812.4/(146.69*146.69*157.5/2.0*0.00238)/30.0, // Clf
// Cnda = -853.93/(146.69*146.69*157.5/2.0*0.00238)/30.0, // Cnf (unused)
Cndr = -1149.0/(146.69*146.69*157.5/2.0*0.00238)/30.0, // Cnps
Clda = -5812.4/(146.69*146.69*157.5/2.0*0.00238)/30.0, // Clf
// Cnda = -853.93/(146.69*146.69*157.5/2.0*0.00238)/30.0, // Cnf (unused)
Cndr = -1149.0/(146.69*146.69*157.5/2.0*0.00238)/30.0, // Cnps
/*
Possible problems: convention about positive control surfaces offset
Possible problems: convention about positive control surfaces offset
*/
elevator = 0.0, // 20.0 * 180.0/57.3 * Long_control
aileron = 0.0, // 30.0 * 180.0/57.3 * Lat_control
rudder = 0.0, // 30.0 * 180.0/57.3 * Rudder_pedal,
elevator = 0.0, // 20.0 * 180.0/57.3 * Long_control
aileron = 0.0, // 30.0 * 180.0/57.3 * Lat_control
rudder = 0.0, // 30.0 * 180.0/57.3 * Rudder_pedal,
// m = 2400/32.2, // mass
S = 157.5, // wing area
b = 30.0, // wing span
c = 5.25, // main aerodynamic chrod
// m = 2400/32.2, // mass
S = 157.5, // wing area
b = 30.0, // wing span
c = 5.25, // main aerodynamic chrod
// Ixyz[3] = {1070.0*14.59*0.3048*0.3048, 1249.0*14.59*0.3048*0.3048, 2312.0*14.59*0.3048*0.3048},
// Fa[3],
// Ma[3],
// *RetVal[4] = {&m, Ixyz, Fa, Ma};
// Ixyz[3] = {1070.0*14.59*0.3048*0.3048, 1249.0*14.59*0.3048*0.3048, 2312.0*14.59*0.3048*0.3048},
// Fa[3],
// Ma[3],
// *RetVal[4] = {&m, Ixyz, Fa, Ma};
// float
V = 0.0, // V_rel_wind
qd = 0.0, // Density*V*V/2.0, //dinamicki tlak
// float
V = 0.0, // V_rel_wind
qd = 0.0, // Density*V*V/2.0, //dinamicki tlak
Cx,Cy,Cz,
Cl,Cm,Cn,
p,q,r;
Cx,Cy,Cz,
Cl,Cm,Cn,
p,q,r;
/* derivatives are defined in "wind" axes so... */
p = P_body*Cos_alpha + R_body*Sin_alpha;
q = Q_body;
r = -P_body*Sin_alpha + R_body*Cos_alpha;
p = P_body*Cos_alpha + R_body*Sin_alpha;
q = Q_body;
r = -P_body*Sin_alpha + R_body*Cos_alpha;
Cz = Cz0 + Cza*Std_Alpha + Czat*(Std_Alpha_dot*c/2.0/V) + Czq*(q*c/2.0/V) + Czde * elevator;
Cm = Cm0 + Cma*Std_Alpha + Cmat*(Std_Alpha_dot*c/2.0/V) + Cmq*(q*c/2.0/V) + Cmde * elevator;
Cz = Cz0 + Cza*Std_Alpha + Czat*(Std_Alpha_dot*c/2.0/V) + Czq*(q*c/2.0/V) + Czde * elevator;
Cm = Cm0 + Cma*Std_Alpha + Cmat*(Std_Alpha_dot*c/2.0/V) + Cmq*(q*c/2.0/V) + Cmde * elevator;
Cx = Cx0 - (Cza*Std_Alpha)*(Cza*Std_Alpha)/(LS_PI*5.71*0.6);
Cl = Clb*Std_Beta + Clp*(p*b/2.0/V) + Clr*(r*b/2.0/V) + Clda * aileron;
Cx = Cx0 - (Cza*Std_Alpha)*(Cza*Std_Alpha)/(LS_PI*5.71*0.6);
Cl = Clb*Std_Beta + Clp*(p*b/2.0/V) + Clr*(r*b/2.0/V) + Clda * aileron;
Cy = Cyb*Std_Beta + Cyr*(r*b/2.0/V);
Cn = Cnb*Std_Beta + Cnp*(p*b/2.0/V) + Cnr*(r*b/2.0/V) + Cndr * rudder;
Cy = Cyb*Std_Beta + Cyr*(r*b/2.0/V);
Cn = Cnb*Std_Beta + Cnp*(p*b/2.0/V) + Cnr*(r*b/2.0/V) + Cndr * rudder;
/* back to body axes */
{
float
CD = Cx,
CL = Cz;
{
float
CD = Cx,
CL = Cz;
Cx = CD - CL*Sin_alpha;
Cz = CL;
}
Cx = CD - CL*Sin_alpha;
Cz = CL;
}
/* AD forces and moments */
F_X_aero = Cx*qd*S;
F_Y_aero = Cy*qd*S;
F_Z_aero = Cz*qd*S;
F_X_aero = Cx*qd*S;
F_Y_aero = Cy*qd*S;
F_Z_aero = Cz*qd*S;
M_l_aero = (Cl*Cos_alpha - Cn*Sin_alpha)*b*qd*S;
M_m_aero = Cm*c*qd*S;
M_n_aero = (Cl*Sin_alpha + Cn*Cos_alpha)*b*qd*S;
M_l_aero = (Cl*Cos_alpha - Cn*Sin_alpha)*b*qd*S;
M_m_aero = Cm*c*qd*S;
M_n_aero = (Cl*Sin_alpha + Cn*Cos_alpha)*b*qd*S;
}

View file

@ -7,14 +7,14 @@ meaning that there is no time delay, engine acts as gain only.
Based upon book:
Barnes W. McCormick,
"Aerodynamics, Aeronautics and Flight Mechanics",
John Wiley & Sons,1995, ISBN 0-471-11087-6
Based upon book:
Barnes W. McCormick,
"Aerodynamics, Aeronautics and Flight Mechanics",
John Wiley & Sons,1995, ISBN 0-471-11087-6
any suggestions, corrections, aditional data, flames, everything to
Gordan Sikic
gsikic@public.srce.hr
any suggestions, corrections, aditional data, flames, everything to
Gordan Sikic
gsikic@public.srce.hr
This source is not checked in this configuration in any way.
@ -39,62 +39,62 @@ This source is not checked in this configuration in any way.
void cherokee_engine( SCALAR dt, int init )
{
static float
dP = (180.0-117.0)*745.7, // in Wats
dn = (2700.0-2350.0)/60.0, // d_rpm (I mean d_rps, in seconds)
D = 6.17*0.3048, // propeller diameter
dPh = (58.0-180.0)*745.7, // change of power as f-cn of height
dH = 25000.0*0.3048;
static float
dP = (180.0-117.0)*745.7, // in Wats
dn = (2700.0-2350.0)/60.0, // d_rpm (I mean d_rps, in seconds)
D = 6.17*0.3048, // propeller diameter
dPh = (58.0-180.0)*745.7, // change of power as f-cn of height
dH = 25000.0*0.3048;
float n, // rps
H,
J, // advance ratio (ratio of horizontal speed to speed of propeller's tip)
eta, // iskoristivost elise
T,
V,
P;
float n, // rps
H,
J, // advance ratio (ratio of horizontal speed to speed of propeller's tip)
eta, // iskoristivost elise
T,
V,
P;
/* copied from navion_engine.c */
if (init || sim_control_.sim_type != cockpit)
Throttle[3] = Throttle_pct;
Throttle[3] = Throttle_pct;
/*assumption -> 0.0 <= Throttle[3] <=1.0 */
P = fabs(Throttle[3])*180.0*745.7; /*180.0*745.5 ->max avail power in W */
n = dn/dP*(P-117.0*745.7) + 2350.0/60.0;
/*assumption -> 0.0 <= Throttle[3] <=1.0 */
P = fabs(Throttle[3])*180.0*745.7; /*180.0*745.5 ->max avail power in W */
n = dn/dP*(P-117.0*745.7) + 2350.0/60.0;
/* V [m/s] */
V = (V_rel_wind < 10.0*0.3048 ? 10.0 : V_rel_wind*0.3048);
V = (V_rel_wind < 10.0*0.3048 ? 10.0 : V_rel_wind*0.3048);
J = V/n/D;
J = V/n/D;
/*
propeller efficiency
propeller efficiency
if J >0.7 & J < .85
eta = 0.8;
eta = 0.8;
elseif J < 0.7
eta = (0.8-0.55)/(.7-.3)*(J-0.3) + 0.55;
eta = (0.8-0.55)/(.7-.3)*(J-0.3) + 0.55;
else
eta = (0.6-0.8)/(1.0-0.85)*(J-0.85) + 0.8;
eta = (0.6-0.8)/(1.0-0.85)*(J-0.85) + 0.8;
end
*/
eta = (J < 0.7 ? ((0.8-0.55)/(.7-.3)*(J-0.3) + 0.55) :
(J > 0.85 ? ((0.6-0.8)/(1.0-0.85)*(J-0.85) + 0.8) : 0.8));
eta = (J < 0.7 ? ((0.8-0.55)/(.7-.3)*(J-0.3) + 0.55) :
(J > 0.85 ? ((0.6-0.8)/(1.0-0.85)*(J-0.85) + 0.8) : 0.8));
/* power on Altitude (I mean Altitude, not Attitude...)*/
H = Altitude/0.3048; /* H == Altitude in [m] */
P *= (dPh/dH*H + 180.0*745.7)/(180.0*745.7);
H = Altitude/0.3048; /* H == Altitude in [m] */
P *= (dPh/dH*H + 180.0*745.7)/(180.0*745.7);
T = eta*P/V; /* T in N (Thrust in Newtons) */
T = eta*P/V; /* T in N (Thrust in Newtons) */
/*assumption: Engine's line of thrust passes through cg */
F_X_engine = T*0.2248; /* F_X_engine in lb */
F_X_engine = T*0.2248; /* F_X_engine in lb */
F_Y_engine = 0.0;
F_Z_engine = 0.0;

View file

@ -1,38 +1,38 @@
/***************************************************************************
TITLE: gear
TITLE: gear
----------------------------------------------------------------------------
FUNCTION: Landing gear model for example simulation
FUNCTION: Landing gear model for example simulation
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 931012 by E. B. Jackson
GENEALOGY: Created 931012 by E. B. Jackson
----------------------------------------------------------------------------
DESIGNED BY: E. B. Jackson
CODED BY: E. B. Jackson
MAINTAINED BY: E. B. Jackson
DESIGNED BY: E. B. Jackson
CODED BY: E. B. Jackson
MAINTAINED BY: E. B. Jackson
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
931218 Added navion.h header to allow connection with
aileron displacement for nosewheel steering. EBJ
940511 Connected nosewheel to rudder pedal; adjusted gain.
CURRENT RCS HEADER:
931218 Added navion.h header to allow connection with
aileron displacement for nosewheel steering. EBJ
940511 Connected nosewheel to rudder pedal; adjusted gain.
CURRENT RCS HEADER:
$Header$
$Log$
@ -67,23 +67,23 @@ Start of 0.6.x branch.
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include <math.h>
@ -143,21 +143,21 @@ void cherokee_gear()
#define NUM_WHEELS 3
static int num_wheels = NUM_WHEELS; /* number of wheels */
static int num_wheels = NUM_WHEELS; /* number of wheels */
static DATA d_wheel_rp_body_v[NUM_WHEELS][3] = /* X, Y, Z locations */
{
{ 10., 0., 4. }, /* in feet */
{ -1., 3., 4. },
{ -1., -3., 4. }
{ 10., 0., 4. }, /* in feet */
{ -1., 3., 4. },
{ -1., -3., 4. }
};
static DATA spring_constant[NUM_WHEELS] = /* springiness, lbs/ft */
{ 1500., 5000., 5000. };
static DATA spring_damping[NUM_WHEELS] = /* damping, lbs/ft/sec */
{ 100., 150., 150. };
static DATA percent_brake[NUM_WHEELS] = /* percent applied braking */
{ 0., 0., 0. }; /* 0 = none, 1 = full */
static DATA caster_angle_rad[NUM_WHEELS] = /* steerable tires - in */
{ 0., 0., 0.}; /* radians, +CW */
static DATA spring_constant[NUM_WHEELS] = /* springiness, lbs/ft */
{ 1500., 5000., 5000. };
static DATA spring_damping[NUM_WHEELS] = /* damping, lbs/ft/sec */
{ 100., 150., 150. };
static DATA percent_brake[NUM_WHEELS] = /* percent applied braking */
{ 0., 0., 0. }; /* 0 = none, 1 = full */
static DATA caster_angle_rad[NUM_WHEELS] = /* steerable tires - in */
{ 0., 0., 0.}; /* radians, +CW */
/*
* End of aircraft specific code
*/
@ -170,51 +170,51 @@ void cherokee_gear()
*
* mu ^
* |
* max_mu | +
* | /|
* sliding_mu | / +------
* | /
* | /
* max_mu | +
* | /|
* sliding_mu | / +------
* | /
* | /
* +--+------------------------>
* | | | sideward V
* 0 bkout skid
* V V
* V V
*/
static DATA sliding_mu = 0.5;
static DATA rolling_mu = 0.01;
static DATA max_brake_mu = 0.6;
static DATA max_mu = 0.8;
static DATA bkout_v = 0.1;
static DATA sliding_mu = 0.5;
static DATA rolling_mu = 0.01;
static DATA max_brake_mu = 0.6;
static DATA max_mu = 0.8;
static DATA bkout_v = 0.1;
static DATA skid_v = 1.0;
/*
* Local data variables
*/
DATA d_wheel_cg_body_v[3]; /* wheel offset from cg, X-Y-Z */
DATA d_wheel_cg_local_v[3]; /* wheel offset from cg, N-E-D */
DATA d_wheel_rwy_local_v[3]; /* wheel offset from rwy, N-E-U */
// DATA v_wheel_body_v[3]; /* wheel velocity, X-Y-Z */
DATA v_wheel_local_v[3]; /* wheel velocity, N-E-D */
DATA f_wheel_local_v[3]; /* wheel reaction force, N-E-D */
DATA temp3a[3], temp3b[3], tempF[3], tempM[3];
DATA reaction_normal_force; /* wheel normal (to rwy) force */
DATA cos_wheel_hdg_angle, sin_wheel_hdg_angle; /* temp storage */
DATA d_wheel_cg_body_v[3]; /* wheel offset from cg, X-Y-Z */
DATA d_wheel_cg_local_v[3]; /* wheel offset from cg, N-E-D */
DATA d_wheel_rwy_local_v[3]; /* wheel offset from rwy, N-E-U */
// DATA v_wheel_body_v[3]; /* wheel velocity, X-Y-Z */
DATA v_wheel_local_v[3]; /* wheel velocity, N-E-D */
DATA f_wheel_local_v[3]; /* wheel reaction force, N-E-D */
DATA temp3a[3], temp3b[3], tempF[3], tempM[3];
DATA reaction_normal_force; /* wheel normal (to rwy) force */
DATA cos_wheel_hdg_angle, sin_wheel_hdg_angle; /* temp storage */
DATA v_wheel_forward, v_wheel_sideward, abs_v_wheel_sideward;
DATA forward_mu, sideward_mu; /* friction coefficients */
DATA beta_mu; /* breakout friction slope */
DATA forward_mu, sideward_mu; /* friction coefficients */
DATA beta_mu; /* breakout friction slope */
DATA forward_wheel_force, sideward_wheel_force;
int i; /* per wheel loop counter */
int i; /* per wheel loop counter */
/*
* Execution starts here
*/
beta_mu = max_mu/(skid_v-bkout_v);
clear3( F_gear_v ); /* Initialize sum of forces... */
clear3( M_gear_v ); /* ...and moments */
clear3( F_gear_v ); /* Initialize sum of forces... */
clear3( M_gear_v ); /* ...and moments */
/*
* Put aircraft specific executable code here
@ -225,115 +225,115 @@ void cherokee_gear()
caster_angle_rad[0] = 0.03*Rudder_pedal;
for (i=0;i<num_wheels;i++) /* Loop for each wheel */
for (i=0;i<num_wheels;i++) /* Loop for each wheel */
{
/*========================================*/
/* Calculate wheel position w.r.t. runway */
/*========================================*/
/* First calculate wheel location w.r.t. cg in body (X-Y-Z) axes... */
sub3( d_wheel_rp_body_v[i], D_cg_rp_body_v, d_wheel_cg_body_v );
/* then converting to local (North-East-Down) axes... */
multtrans3x3by3( T_local_to_body_m, d_wheel_cg_body_v, d_wheel_cg_local_v );
/* Runway axes correction - third element is Altitude, not (-)Z... */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* since altitude = -Z */
/* Add wheel offset to cg location in local axes */
add3( d_wheel_cg_local_v, D_cg_rwy_local_v, d_wheel_rwy_local_v );
/* remove Runway axes correction so right hand rule applies */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* now Z positive down */
/*============================*/
/* Calculate wheel velocities */
/*============================*/
/* contribution due to angular rates */
cross3( Omega_body_v, d_wheel_cg_body_v, temp3a );
/* transform into local axes */
multtrans3x3by3( T_local_to_body_m, temp3a, temp3b );
/*========================================*/
/* Calculate wheel position w.r.t. runway */
/*========================================*/
/* First calculate wheel location w.r.t. cg in body (X-Y-Z) axes... */
sub3( d_wheel_rp_body_v[i], D_cg_rp_body_v, d_wheel_cg_body_v );
/* then converting to local (North-East-Down) axes... */
multtrans3x3by3( T_local_to_body_m, d_wheel_cg_body_v, d_wheel_cg_local_v );
/* Runway axes correction - third element is Altitude, not (-)Z... */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* since altitude = -Z */
/* Add wheel offset to cg location in local axes */
add3( d_wheel_cg_local_v, D_cg_rwy_local_v, d_wheel_rwy_local_v );
/* remove Runway axes correction so right hand rule applies */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* now Z positive down */
/*============================*/
/* Calculate wheel velocities */
/*============================*/
/* contribution due to angular rates */
cross3( Omega_body_v, d_wheel_cg_body_v, temp3a );
/* transform into local axes */
multtrans3x3by3( T_local_to_body_m, temp3a, temp3b );
/* plus contribution due to cg velocities */
/* plus contribution due to cg velocities */
add3( temp3b, V_local_rel_ground_v, v_wheel_local_v );
/*===========================================*/
/* Calculate forces & moments for this wheel */
/*===========================================*/
/* Add any anticipation, or frame lead/prediction, here... */
/* no lead used at present */
/* Calculate sideward and forward velocities of the wheel
in the runway plane */
cos_wheel_hdg_angle = cos(caster_angle_rad[i] + Psi);
sin_wheel_hdg_angle = sin(caster_angle_rad[i] + Psi);
v_wheel_forward = v_wheel_local_v[0]*cos_wheel_hdg_angle
+ v_wheel_local_v[1]*sin_wheel_hdg_angle;
v_wheel_sideward = v_wheel_local_v[1]*cos_wheel_hdg_angle
- v_wheel_local_v[0]*sin_wheel_hdg_angle;
add3( temp3b, V_local_rel_ground_v, v_wheel_local_v );
/*===========================================*/
/* Calculate forces & moments for this wheel */
/*===========================================*/
/* Add any anticipation, or frame lead/prediction, here... */
/* no lead used at present */
/* Calculate sideward and forward velocities of the wheel
in the runway plane */
cos_wheel_hdg_angle = cos(caster_angle_rad[i] + Psi);
sin_wheel_hdg_angle = sin(caster_angle_rad[i] + Psi);
v_wheel_forward = v_wheel_local_v[0]*cos_wheel_hdg_angle
+ v_wheel_local_v[1]*sin_wheel_hdg_angle;
v_wheel_sideward = v_wheel_local_v[1]*cos_wheel_hdg_angle
- v_wheel_local_v[0]*sin_wheel_hdg_angle;
/* Calculate normal load force (simple spring constant) */
reaction_normal_force = 0.;
if( d_wheel_rwy_local_v[2] < 0. )
{
reaction_normal_force = spring_constant[i]*d_wheel_rwy_local_v[2]
- v_wheel_local_v[2]*spring_damping[i];
if (reaction_normal_force > 0.) reaction_normal_force = 0.;
/* to prevent damping component from swamping spring component */
}
/* Calculate friction coefficients */
forward_mu = (max_brake_mu - rolling_mu)*percent_brake[i] + rolling_mu;
abs_v_wheel_sideward = sqrt(v_wheel_sideward*v_wheel_sideward);
sideward_mu = sliding_mu;
if (abs_v_wheel_sideward < skid_v)
sideward_mu = (abs_v_wheel_sideward - bkout_v)*beta_mu;
if (abs_v_wheel_sideward < bkout_v) sideward_mu = 0.;
/* Calculate normal load force (simple spring constant) */
reaction_normal_force = 0.;
if( d_wheel_rwy_local_v[2] < 0. )
{
reaction_normal_force = spring_constant[i]*d_wheel_rwy_local_v[2]
- v_wheel_local_v[2]*spring_damping[i];
if (reaction_normal_force > 0.) reaction_normal_force = 0.;
/* to prevent damping component from swamping spring component */
}
/* Calculate friction coefficients */
forward_mu = (max_brake_mu - rolling_mu)*percent_brake[i] + rolling_mu;
abs_v_wheel_sideward = sqrt(v_wheel_sideward*v_wheel_sideward);
sideward_mu = sliding_mu;
if (abs_v_wheel_sideward < skid_v)
sideward_mu = (abs_v_wheel_sideward - bkout_v)*beta_mu;
if (abs_v_wheel_sideward < bkout_v) sideward_mu = 0.;
/* Calculate foreward and sideward reaction forces */
forward_wheel_force = forward_mu*reaction_normal_force;
sideward_wheel_force = sideward_mu*reaction_normal_force;
if(v_wheel_forward < 0.) forward_wheel_force = -forward_wheel_force;
if(v_wheel_sideward < 0.) sideward_wheel_force = -sideward_wheel_force;
/* Rotate into local (N-E-D) axes */
f_wheel_local_v[0] = forward_wheel_force*cos_wheel_hdg_angle
- sideward_wheel_force*sin_wheel_hdg_angle;
f_wheel_local_v[1] = forward_wheel_force*sin_wheel_hdg_angle
+ sideward_wheel_force*cos_wheel_hdg_angle;
f_wheel_local_v[2] = reaction_normal_force;
/* Convert reaction force from local (N-E-D) axes to body (X-Y-Z) */
mult3x3by3( T_local_to_body_m, f_wheel_local_v, tempF );
/* Calculate moments from force and offsets in body axes */
/* Calculate foreward and sideward reaction forces */
forward_wheel_force = forward_mu*reaction_normal_force;
sideward_wheel_force = sideward_mu*reaction_normal_force;
if(v_wheel_forward < 0.) forward_wheel_force = -forward_wheel_force;
if(v_wheel_sideward < 0.) sideward_wheel_force = -sideward_wheel_force;
/* Rotate into local (N-E-D) axes */
f_wheel_local_v[0] = forward_wheel_force*cos_wheel_hdg_angle
- sideward_wheel_force*sin_wheel_hdg_angle;
f_wheel_local_v[1] = forward_wheel_force*sin_wheel_hdg_angle
+ sideward_wheel_force*cos_wheel_hdg_angle;
f_wheel_local_v[2] = reaction_normal_force;
/* Convert reaction force from local (N-E-D) axes to body (X-Y-Z) */
mult3x3by3( T_local_to_body_m, f_wheel_local_v, tempF );
/* Calculate moments from force and offsets in body axes */
cross3( d_wheel_cg_body_v, tempF, tempM );
/* Sum forces and moments across all wheels */
add3( tempF, F_gear_v, F_gear_v );
add3( tempM, M_gear_v, M_gear_v );
cross3( d_wheel_cg_body_v, tempF, tempM );
/* Sum forces and moments across all wheels */
add3( tempF, F_gear_v, F_gear_v );
add3( tempM, M_gear_v, M_gear_v );
}
}

View file

@ -1,47 +1,47 @@
/***************************************************************************
TITLE: cherokee_init.c
TITLE: cherokee_init.c
----------------------------------------------------------------------------
FUNCTION: Initializes cherokee math model
FUNCTION: Initializes cherokee math model
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY:
GENEALOGY:
----------------------------------------------------------------------------
----------------------------------------------------------------------------
CURRENT RCS HEADER:
CURRENT RCS HEADER:
Well,
I do not have vorking RCS here (Sorry)
Well,
I do not have vorking RCS here (Sorry)
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include "ls_types.h"

View file

@ -1,34 +1,34 @@
/***************************************************************************
TITLE: engine.c
TITLE: engine.c
----------------------------------------------------------------------------
FUNCTION: dummy engine routine
FUNCTION: dummy engine routine
----------------------------------------------------------------------------
MODULE STATUS: incomplete
MODULE STATUS: incomplete
----------------------------------------------------------------------------
GENEALOGY: Created 15 OCT 92 as dummy routine for checkout. EBJ
GENEALOGY: Created 15 OCT 92 as dummy routine for checkout. EBJ
----------------------------------------------------------------------------
DESIGNED BY: designer
CODED BY: programmer
MAINTAINED BY: maintainer
DESIGNED BY: designer
CODED BY: programmer
MAINTAINED BY: maintainer
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
CURRENT RCS HEADER INFO:
CURRENT RCS HEADER INFO:
$Header$
@ -67,23 +67,23 @@ Initial Flight Gear revision.
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY: ls_model();
CALLED BY: ls_model();
----------------------------------------------------------------------------
CALLS TO: none
CALLS TO: none
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
@ -91,10 +91,10 @@ Initial Flight Gear revision.
#include "ls_types.h"
#include "default_model_routines.h"
void inertias( SCALAR dt, int Initialize ) {}
void subsystems( SCALAR dt, int Initialize ) {}
/* void engine() {} */
/* void gear() {} */
void inertias( SCALAR dt, int Initialize ) {}
void subsystems( SCALAR dt, int Initialize ) {}
/* void engine() {} */
/* void gear() {} */

View file

@ -1,41 +1,41 @@
/***************************************************************************
TITLE: ls_Accel
TITLE: ls_Accel
----------------------------------------------------------------------------
FUNCTION: Sums forces and moments and calculates accelerations
FUNCTION: Sums forces and moments and calculates accelerations
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Written 920731 by Bruce Jackson. Based upon equations
GENEALOGY: Written 920731 by Bruce Jackson. Based upon equations
given in reference [1] and a Matrix-X/System Build block
diagram model of equations of motion coded by David Raney
at NASA-Langley in June of 1992.
----------------------------------------------------------------------------
DESIGNED BY: Bruce Jackson
DESIGNED BY: Bruce Jackson
CODED BY: Bruce Jackson
CODED BY: Bruce Jackson
MAINTAINED BY:
MAINTAINED BY:
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE
DATE PURPOSE
931007 Moved calculations of auxiliary accelerations here from ls_aux.c BY
and corrected minus sign in front of A_Y_Pilot
contribution from Q_body*P_body*D_X_pilot term.
931007 Moved calculations of auxiliary accelerations here from ls_aux.c BY
and corrected minus sign in front of A_Y_Pilot
contribution from Q_body*P_body*D_X_pilot term.
940111 Changed DATA to SCALAR; updated header files
$Header$
$Log$
Revision 1.1 2002/09/10 01:14:01 curt
@ -82,7 +82,7 @@ Initial Flight Gear revision.
REFERENCES:
[ 1] McFarland, Richard E.: "A Standard Kinematic Model
[ 1] McFarland, Richard E.: "A Standard Kinematic Model
for Flight Simulation at NASA-Ames", NASA CR-2497,
January 1975
@ -100,7 +100,7 @@ Initial Flight Gear revision.
----------------------------------------------------------------------------
OUTPUTS: State derivatives
OUTPUTS: State derivatives
-------------------------------------------------------------------------*/
#include "ls_types.h"
@ -111,10 +111,10 @@ Initial Flight Gear revision.
void ls_accel( void ) {
SCALAR inv_Mass, inv_Radius;
SCALAR ixz2, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10;
SCALAR dx_pilot_from_cg, dy_pilot_from_cg, dz_pilot_from_cg;
SCALAR tan_Lat_geocentric;
SCALAR inv_Mass, inv_Radius;
SCALAR ixz2, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10;
SCALAR dx_pilot_from_cg, dy_pilot_from_cg, dz_pilot_from_cg;
SCALAR tan_Lat_geocentric;
/* Sum forces and moments at reference point */
@ -178,7 +178,7 @@ void ls_accel( void ) {
Q_dot_body = c5*R_body*P_body + c6*(R_body*R_body - P_body*P_body) + c7*M_m_cg;
R_dot_body = (c8*P_body + c9*R_body)*Q_body + c4*M_l_cg + c10*M_n_cg;
/* Calculate body axis accelerations (move to ls_accel?) */
/* Calculate body axis accelerations (move to ls_accel?) */
inv_Mass = 1/Mass;
@ -190,16 +190,16 @@ void ls_accel( void ) {
dy_pilot_from_cg = Dy_pilot - Dy_cg;
dz_pilot_from_cg = Dz_pilot - Dz_cg;
A_X_pilot = A_X_cg + (-R_body*R_body - Q_body*Q_body)*dx_pilot_from_cg
+ ( P_body*Q_body - R_dot_body )*dy_pilot_from_cg
+ ( P_body*R_body + Q_dot_body )*dz_pilot_from_cg;
A_Y_pilot = A_Y_cg + ( P_body*Q_body + R_dot_body )*dx_pilot_from_cg
+ (-P_body*P_body - R_body*R_body)*dy_pilot_from_cg
+ ( Q_body*R_body - P_dot_body )*dz_pilot_from_cg;
A_Z_pilot = A_Z_cg + ( P_body*R_body - Q_dot_body )*dx_pilot_from_cg
+ ( Q_body*R_body + P_dot_body )*dy_pilot_from_cg
+ (-Q_body*Q_body - P_body*P_body)*dz_pilot_from_cg;
A_X_pilot = A_X_cg + (-R_body*R_body - Q_body*Q_body)*dx_pilot_from_cg
+ ( P_body*Q_body - R_dot_body )*dy_pilot_from_cg
+ ( P_body*R_body + Q_dot_body )*dz_pilot_from_cg;
A_Y_pilot = A_Y_cg + ( P_body*Q_body + R_dot_body )*dx_pilot_from_cg
+ (-P_body*P_body - R_body*R_body)*dy_pilot_from_cg
+ ( Q_body*R_body - P_dot_body )*dz_pilot_from_cg;
A_Z_pilot = A_Z_cg + ( P_body*R_body - Q_dot_body )*dx_pilot_from_cg
+ ( Q_body*R_body + P_dot_body )*dy_pilot_from_cg
+ (-Q_body*Q_body - P_body*P_body)*dz_pilot_from_cg;
N_X_cg = INVG*A_X_cg;
N_Y_cg = INVG*A_Y_cg;
N_Z_cg = INVG*A_Z_cg;
@ -210,11 +210,11 @@ void ls_accel( void ) {
U_dot_body = T_local_to_body_11*V_dot_north + T_local_to_body_12*V_dot_east
+ T_local_to_body_13*V_dot_down - Q_total*W_body + R_total*V_body;
+ T_local_to_body_13*V_dot_down - Q_total*W_body + R_total*V_body;
V_dot_body = T_local_to_body_21*V_dot_north + T_local_to_body_22*V_dot_east
+ T_local_to_body_23*V_dot_down - R_total*U_body + P_total*W_body;
+ T_local_to_body_23*V_dot_down - R_total*U_body + P_total*W_body;
W_dot_body = T_local_to_body_31*V_dot_north + T_local_to_body_32*V_dot_east
+ T_local_to_body_33*V_dot_down - P_total*V_body + Q_total*U_body;
+ T_local_to_body_33*V_dot_down - P_total*V_body + Q_total*U_body;
/* End of ls_accel */
}

View file

@ -1,47 +1,47 @@
/***************************************************************************
TITLE: ls_aux
TITLE: ls_aux
----------------------------------------------------------------------------
FUNCTION: Atmospheric and auxilary relationships for LaRCSim EOM
FUNCTION: Atmospheric and auxilary relationships for LaRCSim EOM
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 9208026 as part of C-castle simulation project.
GENEALOGY: Created 9208026 as part of C-castle simulation project.
----------------------------------------------------------------------------
DESIGNED BY: B. Jackson
DESIGNED BY: B. Jackson
CODED BY: B. Jackson
CODED BY: B. Jackson
MAINTAINED BY: B. Jackson
MAINTAINED BY: B. Jackson
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE
DATE PURPOSE
931006 Moved calculations of auxiliary accelerations from here
to ls_accel.c and corrected minus sign in front of A_Y_Pilot
contribution from Q_body*P_body*D_X_pilot term. EBJ
to ls_accel.c and corrected minus sign in front of A_Y_Pilot
contribution from Q_body*P_body*D_X_pilot term. EBJ
931014 Changed calculation of Alpha from atan to atan2 so sign is correct.
EBJ
EBJ
931220 Added calculations for static and total temperatures & pressures,
as well as dynamic and impact pressures and calibrated airspeed.
EBJ
as well as dynamic and impact pressures and calibrated airspeed.
EBJ
940111 Changed #included header files from old "ls_eom.h" to newer
"ls_types.h", "ls_constants.h" and "ls_generic.h". EBJ
"ls_types.h", "ls_constants.h" and "ls_generic.h". EBJ
950207 Changed use of "abs" to "fabs" in calculation of signU. EBJ
950228 Fixed bug in calculation of beta_dot. EBJ
950228 Fixed bug in calculation of beta_dot. EBJ
CURRENT RCS HEADER INFO:
@ -260,7 +260,7 @@ Initial Flight Gear revision.
*
* Revision 1.7 1993/10/14 11:25:38 bjax
* Changed calculation of Alpha to use 'atan2' instead of 'atan' so alphas
* larger than +/- 90 degrees are calculated correctly. EBJ
* larger than +/- 90 degrees are calculated correctly. EBJ
*
* Revision 1.6 1993/10/07 18:45:56 bjax
* A little cleanup; no significant changes. EBJ
@ -282,25 +282,25 @@ Initial Flight Gear revision.
----------------------------------------------------------------------------
REFERENCES: [ 1] Shapiro, Ascher H.: "The Dynamics and Thermodynamics
of Compressible Fluid Flow", Volume I, The Ronald
Press, 1953.
REFERENCES: [ 1] Shapiro, Ascher H.: "The Dynamics and Thermodynamics
of Compressible Fluid Flow", Volume I, The Ronald
Press, 1953.
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include "ls_types.h"
@ -317,210 +317,210 @@ Initial Flight Gear revision.
void ls_aux( void ) {
SCALAR dx_pilot_from_cg, dy_pilot_from_cg, dz_pilot_from_cg;
/* SCALAR inv_Mass; */
SCALAR v_XZ_plane_2, signU, v_tangential;
/* SCALAR inv_radius_ratio; */
SCALAR cos_rwy_hdg, sin_rwy_hdg;
SCALAR mach2, temp_ratio, pres_ratio;
SCALAR tmp;
SCALAR dx_pilot_from_cg, dy_pilot_from_cg, dz_pilot_from_cg;
/* SCALAR inv_Mass; */
SCALAR v_XZ_plane_2, signU, v_tangential;
/* SCALAR inv_radius_ratio; */
SCALAR cos_rwy_hdg, sin_rwy_hdg;
SCALAR mach2, temp_ratio, pres_ratio;
SCALAR tmp;
/* update geodetic position */
ls_geoc_to_geod( Lat_geocentric, Radius_to_vehicle,
&Latitude, &Altitude, &Sea_level_radius );
Longitude = Lon_geocentric - Earth_position_angle;
ls_geoc_to_geod( Lat_geocentric, Radius_to_vehicle,
&Latitude, &Altitude, &Sea_level_radius );
Longitude = Lon_geocentric - Earth_position_angle;
/* Calculate body axis velocities */
/* Form relative velocity vector */
/* Form relative velocity vector */
V_north_rel_ground = V_north;
V_east_rel_ground = V_east
- OMEGA_EARTH*Sea_level_radius*cos( Lat_geocentric );
V_down_rel_ground = V_down;
V_north_rel_ground = V_north;
V_east_rel_ground = V_east
- OMEGA_EARTH*Sea_level_radius*cos( Lat_geocentric );
V_down_rel_ground = V_down;
V_north_rel_airmass = V_north_rel_ground - V_north_airmass;
V_east_rel_airmass = V_east_rel_ground - V_east_airmass;
V_down_rel_airmass = V_down_rel_ground - V_down_airmass;
U_body = T_local_to_body_11*V_north_rel_airmass
+ T_local_to_body_12*V_east_rel_airmass
+ T_local_to_body_13*V_down_rel_airmass + U_gust;
V_body = T_local_to_body_21*V_north_rel_airmass
+ T_local_to_body_22*V_east_rel_airmass
+ T_local_to_body_23*V_down_rel_airmass + V_gust;
W_body = T_local_to_body_31*V_north_rel_airmass
+ T_local_to_body_32*V_east_rel_airmass
+ T_local_to_body_33*V_down_rel_airmass + W_gust;
V_rel_wind = sqrt(U_body*U_body + V_body*V_body + W_body*W_body);
V_north_rel_airmass = V_north_rel_ground - V_north_airmass;
V_east_rel_airmass = V_east_rel_ground - V_east_airmass;
V_down_rel_airmass = V_down_rel_ground - V_down_airmass;
U_body = T_local_to_body_11*V_north_rel_airmass
+ T_local_to_body_12*V_east_rel_airmass
+ T_local_to_body_13*V_down_rel_airmass + U_gust;
V_body = T_local_to_body_21*V_north_rel_airmass
+ T_local_to_body_22*V_east_rel_airmass
+ T_local_to_body_23*V_down_rel_airmass + V_gust;
W_body = T_local_to_body_31*V_north_rel_airmass
+ T_local_to_body_32*V_east_rel_airmass
+ T_local_to_body_33*V_down_rel_airmass + W_gust;
V_rel_wind = sqrt(U_body*U_body + V_body*V_body + W_body*W_body);
/* Calculate alpha and beta rates */
/* Calculate alpha and beta rates */
v_XZ_plane_2 = (U_body*U_body + W_body*W_body);
if (U_body == 0)
signU = 1;
else
signU = U_body/fabs(U_body);
if( (v_XZ_plane_2 == 0) || (V_rel_wind == 0) )
{
Std_Alpha_dot = 0;
Std_Beta_dot = 0;
}
else
{
Std_Alpha_dot = (U_body*W_dot_body - W_body*U_dot_body)/
v_XZ_plane_2;
Std_Beta_dot = (signU*v_XZ_plane_2*V_dot_body
- V_body*(U_body*U_dot_body + W_body*W_dot_body))
/(V_rel_wind*V_rel_wind*sqrt(v_XZ_plane_2));
}
v_XZ_plane_2 = (U_body*U_body + W_body*W_body);
if (U_body == 0)
signU = 1;
else
signU = U_body/fabs(U_body);
if( (v_XZ_plane_2 == 0) || (V_rel_wind == 0) )
{
Std_Alpha_dot = 0;
Std_Beta_dot = 0;
}
else
{
Std_Alpha_dot = (U_body*W_dot_body - W_body*U_dot_body)/
v_XZ_plane_2;
Std_Beta_dot = (signU*v_XZ_plane_2*V_dot_body
- V_body*(U_body*U_dot_body + W_body*W_dot_body))
/(V_rel_wind*V_rel_wind*sqrt(v_XZ_plane_2));
}
/* Calculate flight path and other flight condition values */
if (U_body == 0)
Std_Alpha = 0;
else
Std_Alpha = atan2( W_body, U_body );
Cos_alpha = cos(Std_Alpha);
Sin_alpha = sin(Std_Alpha);
if (V_rel_wind == 0)
Std_Beta = 0;
else
Std_Beta = asin( V_body/ V_rel_wind );
Cos_beta = cos(Std_Beta);
Sin_beta = sin(Std_Beta);
V_true_kts = V_rel_wind * V_TO_KNOTS;
V_ground_speed = sqrt(V_north_rel_ground*V_north_rel_ground
+ V_east_rel_ground*V_east_rel_ground );
if (U_body == 0)
Std_Alpha = 0;
else
Std_Alpha = atan2( W_body, U_body );
Cos_alpha = cos(Std_Alpha);
Sin_alpha = sin(Std_Alpha);
if (V_rel_wind == 0)
Std_Beta = 0;
else
Std_Beta = asin( V_body/ V_rel_wind );
Cos_beta = cos(Std_Beta);
Sin_beta = sin(Std_Beta);
V_true_kts = V_rel_wind * V_TO_KNOTS;
V_ground_speed = sqrt(V_north_rel_ground*V_north_rel_ground
+ V_east_rel_ground*V_east_rel_ground );
V_rel_ground = sqrt(V_ground_speed*V_ground_speed
+ V_down_rel_ground*V_down_rel_ground );
v_tangential = sqrt(V_north*V_north + V_east*V_east);
V_inertial = sqrt(v_tangential*v_tangential + V_down*V_down);
if( (V_ground_speed == 0) && (V_down == 0) )
Gamma_vert_rad = 0;
else
Gamma_vert_rad = atan2( -V_down, V_ground_speed );
if( (V_north_rel_ground == 0) && (V_east_rel_ground == 0) )
Gamma_horiz_rad = 0;
else
Gamma_horiz_rad = atan2( V_east_rel_ground, V_north_rel_ground );
if (Gamma_horiz_rad < 0)
Gamma_horiz_rad = Gamma_horiz_rad + 2*LS_PI;
/* Calculate local gravity */
ls_gravity( Radius_to_vehicle, Lat_geocentric, &Gravity );
V_rel_ground = sqrt(V_ground_speed*V_ground_speed
+ V_down_rel_ground*V_down_rel_ground );
v_tangential = sqrt(V_north*V_north + V_east*V_east);
V_inertial = sqrt(v_tangential*v_tangential + V_down*V_down);
if( (V_ground_speed == 0) && (V_down == 0) )
Gamma_vert_rad = 0;
else
Gamma_vert_rad = atan2( -V_down, V_ground_speed );
if( (V_north_rel_ground == 0) && (V_east_rel_ground == 0) )
Gamma_horiz_rad = 0;
else
Gamma_horiz_rad = atan2( V_east_rel_ground, V_north_rel_ground );
if (Gamma_horiz_rad < 0)
Gamma_horiz_rad = Gamma_horiz_rad + 2*LS_PI;
/* Calculate local gravity */
ls_gravity( Radius_to_vehicle, Lat_geocentric, &Gravity );
/* call function for (smoothed) density ratio, sonic velocity, and
ambient pressure */
ambient pressure */
ls_atmos(Altitude, &Sigma, &V_sound,
&Static_temperature, &Static_pressure);
Density = Sigma*SEA_LEVEL_DENSITY;
Mach_number = V_rel_wind / V_sound;
V_equiv = V_rel_wind*sqrt(Sigma);
V_equiv_kts = V_equiv*V_TO_KNOTS;
ls_atmos(Altitude, &Sigma, &V_sound,
&Static_temperature, &Static_pressure);
Density = Sigma*SEA_LEVEL_DENSITY;
Mach_number = V_rel_wind / V_sound;
V_equiv = V_rel_wind*sqrt(Sigma);
V_equiv_kts = V_equiv*V_TO_KNOTS;
/* calculate temperature and pressure ratios (from [1]) */
mach2 = Mach_number*Mach_number;
temp_ratio = 1.0 + 0.2*mach2;
tmp = 3.5;
pres_ratio = pow( temp_ratio, tmp );
mach2 = Mach_number*Mach_number;
temp_ratio = 1.0 + 0.2*mach2;
tmp = 3.5;
pres_ratio = pow( temp_ratio, tmp );
Total_temperature = temp_ratio*Static_temperature;
Total_pressure = pres_ratio*Static_pressure;
Total_temperature = temp_ratio*Static_temperature;
Total_pressure = pres_ratio*Static_pressure;
/* calculate impact and dynamic pressures */
Impact_pressure = Total_pressure - Static_pressure;
Impact_pressure = Total_pressure - Static_pressure;
Dynamic_pressure = 0.5*Density*V_rel_wind*V_rel_wind;
Dynamic_pressure = 0.5*Density*V_rel_wind*V_rel_wind;
/* calculate calibrated airspeed indication */
V_calibrated = sqrt( 2.0*Dynamic_pressure / SEA_LEVEL_DENSITY );
V_calibrated_kts = V_calibrated*V_TO_KNOTS;
Centrifugal_relief = 1 - v_tangential/(Radius_to_vehicle*Gravity);
V_calibrated = sqrt( 2.0*Dynamic_pressure / SEA_LEVEL_DENSITY );
V_calibrated_kts = V_calibrated*V_TO_KNOTS;
Centrifugal_relief = 1 - v_tangential/(Radius_to_vehicle*Gravity);
/* Determine location in runway coordinates */
Radius_to_rwy = Sea_level_radius + Runway_altitude;
cos_rwy_hdg = cos(Runway_heading*DEG_TO_RAD);
sin_rwy_hdg = sin(Runway_heading*DEG_TO_RAD);
D_cg_north_of_rwy = Radius_to_rwy*(Latitude - Runway_latitude);
D_cg_east_of_rwy = Radius_to_rwy*cos(Runway_latitude)
*(Longitude - Runway_longitude);
D_cg_above_rwy = Radius_to_vehicle - Radius_to_rwy;
X_cg_rwy = D_cg_north_of_rwy*cos_rwy_hdg
+ D_cg_east_of_rwy*sin_rwy_hdg;
Y_cg_rwy =-D_cg_north_of_rwy*sin_rwy_hdg
+ D_cg_east_of_rwy*cos_rwy_hdg;
H_cg_rwy = D_cg_above_rwy;
dx_pilot_from_cg = Dx_pilot - Dx_cg;
dy_pilot_from_cg = Dy_pilot - Dy_cg;
dz_pilot_from_cg = Dz_pilot - Dz_cg;
Radius_to_rwy = Sea_level_radius + Runway_altitude;
cos_rwy_hdg = cos(Runway_heading*DEG_TO_RAD);
sin_rwy_hdg = sin(Runway_heading*DEG_TO_RAD);
D_cg_north_of_rwy = Radius_to_rwy*(Latitude - Runway_latitude);
D_cg_east_of_rwy = Radius_to_rwy*cos(Runway_latitude)
*(Longitude - Runway_longitude);
D_cg_above_rwy = Radius_to_vehicle - Radius_to_rwy;
X_cg_rwy = D_cg_north_of_rwy*cos_rwy_hdg
+ D_cg_east_of_rwy*sin_rwy_hdg;
Y_cg_rwy =-D_cg_north_of_rwy*sin_rwy_hdg
+ D_cg_east_of_rwy*cos_rwy_hdg;
H_cg_rwy = D_cg_above_rwy;
dx_pilot_from_cg = Dx_pilot - Dx_cg;
dy_pilot_from_cg = Dy_pilot - Dy_cg;
dz_pilot_from_cg = Dz_pilot - Dz_cg;
D_pilot_north_of_rwy = D_cg_north_of_rwy
+ T_local_to_body_11*dx_pilot_from_cg
+ T_local_to_body_21*dy_pilot_from_cg
+ T_local_to_body_31*dz_pilot_from_cg;
D_pilot_east_of_rwy = D_cg_east_of_rwy
+ T_local_to_body_12*dx_pilot_from_cg
+ T_local_to_body_22*dy_pilot_from_cg
+ T_local_to_body_32*dz_pilot_from_cg;
D_pilot_above_rwy = D_cg_above_rwy
- T_local_to_body_13*dx_pilot_from_cg
- T_local_to_body_23*dy_pilot_from_cg
- T_local_to_body_33*dz_pilot_from_cg;
X_pilot_rwy = D_pilot_north_of_rwy*cos_rwy_hdg
+ D_pilot_east_of_rwy*sin_rwy_hdg;
Y_pilot_rwy = -D_pilot_north_of_rwy*sin_rwy_hdg
+ D_pilot_east_of_rwy*cos_rwy_hdg;
H_pilot_rwy = D_pilot_above_rwy;
D_pilot_north_of_rwy = D_cg_north_of_rwy
+ T_local_to_body_11*dx_pilot_from_cg
+ T_local_to_body_21*dy_pilot_from_cg
+ T_local_to_body_31*dz_pilot_from_cg;
D_pilot_east_of_rwy = D_cg_east_of_rwy
+ T_local_to_body_12*dx_pilot_from_cg
+ T_local_to_body_22*dy_pilot_from_cg
+ T_local_to_body_32*dz_pilot_from_cg;
D_pilot_above_rwy = D_cg_above_rwy
- T_local_to_body_13*dx_pilot_from_cg
- T_local_to_body_23*dy_pilot_from_cg
- T_local_to_body_33*dz_pilot_from_cg;
X_pilot_rwy = D_pilot_north_of_rwy*cos_rwy_hdg
+ D_pilot_east_of_rwy*sin_rwy_hdg;
Y_pilot_rwy = -D_pilot_north_of_rwy*sin_rwy_hdg
+ D_pilot_east_of_rwy*cos_rwy_hdg;
H_pilot_rwy = D_pilot_above_rwy;
/* Calculate Euler rates */
Sin_phi = sin(Phi);
Cos_phi = cos(Phi);
Sin_theta = sin(Theta);
Cos_theta = cos(Theta);
Sin_psi = sin(Psi);
Cos_psi = cos(Psi);
if( Cos_theta == 0 )
Psi_dot = 0;
else
Psi_dot = (Q_total*Sin_phi + R_total*Cos_phi)/Cos_theta;
Theta_dot = Q_total*Cos_phi - R_total*Sin_phi;
Phi_dot = P_total + Psi_dot*Sin_theta;
Sin_phi = sin(Phi);
Cos_phi = cos(Phi);
Sin_theta = sin(Theta);
Cos_theta = cos(Theta);
Sin_psi = sin(Psi);
Cos_psi = cos(Psi);
if( Cos_theta == 0 )
Psi_dot = 0;
else
Psi_dot = (Q_total*Sin_phi + R_total*Cos_phi)/Cos_theta;
Theta_dot = Q_total*Cos_phi - R_total*Sin_phi;
Phi_dot = P_total + Psi_dot*Sin_theta;
/* end of ls_aux */
}

View file

@ -1,37 +1,37 @@
/***************************************************************************
TITLE: ls_cockpit.h
TITLE: ls_cockpit.h
----------------------------------------------------------------------------
FUNCTION: Header for cockpit IO
FUNCTION: Header for cockpit IO
----------------------------------------------------------------------------
MODULE STATUS: Developmental
MODULE STATUS: Developmental
----------------------------------------------------------------------------
GENEALOGY: Created 20 DEC 93 by E. B. Jackson
GENEALOGY: Created 20 DEC 93 by E. B. Jackson
----------------------------------------------------------------------------
DESIGNED BY: E. B. Jackson
CODED BY: E. B. Jackson
MAINTAINED BY: E. B. Jackson
DESIGNED BY: E. B. Jackson
CODED BY: E. B. Jackson
MAINTAINED BY: E. B. Jackson
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
950314 Added "throttle_pct" field to cockpit header for both
display and trim purposes. EBJ
CURRENT RCS HEADER:
950314 Added "throttle_pct" field to cockpit header for both
display and trim purposes. EBJ
CURRENT RCS HEADER:
$Header$
$Log$
@ -103,24 +103,24 @@ typedef struct {
extern COCKPIT cockpit_;
#define Left_button cockpit_.left_pb_on_stick
#define Right_button cockpit_.right_pb_on_stick
#define Rudder_pedal cockpit_.rudder_pedal
#define Flap_handle cockpit_.flap_handle
#define Throttle cockpit_.throttle
#define Throttle_pct cockpit_.throttle_pct
#define First_trigger cockpit_.trig_pos_1
#define Second_trigger cockpit_.trig_pos_2
#define Long_control cockpit_.long_stick
#define Left_button cockpit_.left_pb_on_stick
#define Right_button cockpit_.right_pb_on_stick
#define Rudder_pedal cockpit_.rudder_pedal
#define Flap_handle cockpit_.flap_handle
#define Throttle cockpit_.throttle
#define Throttle_pct cockpit_.throttle_pct
#define First_trigger cockpit_.trig_pos_1
#define Second_trigger cockpit_.trig_pos_2
#define Long_control cockpit_.long_stick
#define Long_trim cockpit_.long_trim
#define Lat_control cockpit_.lat_stick
#define Fwd_trim cockpit_.forward_trim
#define Aft_trim cockpit_.aft_trim
#define Left_trim cockpit_.left_trim
#define Right_trim cockpit_.right_trim
#define SB_extend cockpit_.sb_extend
#define SB_retract cockpit_.sb_retract
#define Gear_sel_up cockpit_.gear_sel_up
#define Lat_control cockpit_.lat_stick
#define Fwd_trim cockpit_.forward_trim
#define Aft_trim cockpit_.aft_trim
#define Left_trim cockpit_.left_trim
#define Right_trim cockpit_.right_trim
#define SB_extend cockpit_.sb_extend
#define SB_retract cockpit_.sb_retract
#define Gear_sel_up cockpit_.gear_sel_up
#define Brake_pct cockpit_.brake_pct

View file

@ -1,67 +1,67 @@
/***************************************************************************
TITLE: ls_constants.h
TITLE: ls_constants.h
----------------------------------------------------------------------------
FUNCTION: LaRCSim constants definition header file
FUNCTION: LaRCSim constants definition header file
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 15 DEC 1993 by Bruce Jackson; was part of
old ls_eom.h header file
GENEALOGY: Created 15 DEC 1993 by Bruce Jackson; was part of
old ls_eom.h header file
----------------------------------------------------------------------------
DESIGNED BY: B. Jackson
CODED BY: B. Jackson
MAINTAINED BY: guess who
DESIGNED BY: B. Jackson
CODED BY: B. Jackson
MAINTAINED BY: guess who
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
----------------------------------------------------------------------------
REFERENCES:
[ 1] McFarland, Richard E.: "A Standard Kinematic Model
for Flight Simulation at NASA-Ames", NASA CR-2497,
January 1975
[ 2] ANSI/AIAA R-004-1992 "Recommended Practice: Atmos-
pheric and Space Flight Vehicle Coordinate Systems",
February 1992
[ 3] Beyer, William H., editor: "CRC Standard Mathematical
Tables, 28th edition", CRC Press, Boca Raton, FL, 1987,
ISBN 0-8493-0628-0
[ 4] Dowdy, M. C.; Jackson, E. B.; and Nichols, J. H.:
"Controls Analysis and Simulation Test Loop Environ-
ment (CASTLE) Programmer's Guide, Version 1.3",
NATC TM 89-11, 30 March 1989.
[ 5] Halliday, David; and Resnick, Robert: "Fundamentals
of Physics, Revised Printing", Wiley and Sons, 1974.
ISBN 0-471-34431-1
REFERENCES:
[ 1] McFarland, Richard E.: "A Standard Kinematic Model
for Flight Simulation at NASA-Ames", NASA CR-2497,
January 1975
[ 2] ANSI/AIAA R-004-1992 "Recommended Practice: Atmos-
pheric and Space Flight Vehicle Coordinate Systems",
February 1992
[ 3] Beyer, William H., editor: "CRC Standard Mathematical
Tables, 28th edition", CRC Press, Boca Raton, FL, 1987,
ISBN 0-8493-0628-0
[ 4] Dowdy, M. C.; Jackson, E. B.; and Nichols, J. H.:
"Controls Analysis and Simulation Test Loop Environ-
ment (CASTLE) Programmer's Guide, Version 1.3",
NATC TM 89-11, 30 March 1989.
[ 5] Halliday, David; and Resnick, Robert: "Fundamentals
of Physics, Revised Printing", Wiley and Sons, 1974.
ISBN 0-471-34431-1
[ 6] Anon: "U. S. Standard Atmosphere, 1962"
[ 7] Anon: "Aeronautical Vest Pocket Handbook, 17th edition",
Pratt & Whitney Aircraft Group, Dec. 1977
[ 8] Stevens, Brian L.; and Lewis, Frank L.: "Aircraft
Control and Simulation", Wiley and Sons, 1992.
ISBN 0-471-61397-5
[ 6] Anon: "U. S. Standard Atmosphere, 1962"
[ 7] Anon: "Aeronautical Vest Pocket Handbook, 17th edition",
Pratt & Whitney Aircraft Group, Dec. 1977
[ 8] Stevens, Brian L.; and Lewis, Frank L.: "Aircraft
Control and Simulation", Wiley and Sons, 1992.
ISBN 0-471-61397-5
--------------------------------------------------------------------------*/
@ -81,22 +81,22 @@
#endif
/* Define constants (note: many factors will need to change for other
systems of measure) */
systems of measure) */
/* Value of Pi from ref [3] */
#define LS_PI 3.14159265358979323846264338327950288419716939967511
#define LS_PI 3.14159265358979323846264338327950288419716939967511
/* Value of earth radius from [8], ft */
#define EQUATORIAL_RADIUS 20925650.
#define EQUATORIAL_RADIUS 20925650.
#define RESQ 437882827922500.
/* Value of earth flattening parameter from ref [8]
Note: FP = f
E = 1-f
EPS = sqrt(1-(1-f)^2) */
#define FP .003352813178
/* Value of earth flattening parameter from ref [8]
Note: FP = f
E = 1-f
EPS = sqrt(1-(1-f)^2) */
#define FP .003352813178
#define E .996647186
#define EPS .081819221
#define INVG .031080997
@ -105,21 +105,21 @@
#define OMEGA_EARTH .00007272205217
/* miscellaneous units conversions (ref [7]) */
#define V_TO_KNOTS 0.5921
#define DEG_TO_RAD 0.017453292
#define RAD_TO_DEG 57.29577951
#define FT_TO_METERS 0.3048
#define METERS_TO_FT 3.2808
#define K_TO_R 1.8
#define R_TO_K 0.55555556
#define NSM_TO_PSF 0.02088547
#define PSF_TO_NSM 47.8801826
#define KCM_TO_SCF 0.00194106
#define SCF_TO_KCM 515.183616
#define V_TO_KNOTS 0.5921
#define DEG_TO_RAD 0.017453292
#define RAD_TO_DEG 57.29577951
#define FT_TO_METERS 0.3048
#define METERS_TO_FT 3.2808
#define K_TO_R 1.8
#define R_TO_K 0.55555556
#define NSM_TO_PSF 0.02088547
#define PSF_TO_NSM 47.8801826
#define KCM_TO_SCF 0.00194106
#define SCF_TO_KCM 515.183616
/* ENGLISH Atmospheric reference properties [6] */
#define SEA_LEVEL_DENSITY 0.002376888
#define SEA_LEVEL_DENSITY 0.002376888
#endif

View file

@ -1,68 +1,68 @@
/***************************************************************************
TITLE: ls_generic.h
TITLE: ls_generic.h
----------------------------------------------------------------------------
FUNCTION: LaRCSim generic parameters header file
FUNCTION: LaRCSim generic parameters header file
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 15 DEC 1993 by Bruce Jackson;
was part of old ls_eom.h header
GENEALOGY: Created 15 DEC 1993 by Bruce Jackson;
was part of old ls_eom.h header
----------------------------------------------------------------------------
DESIGNED BY: B. Jackson
CODED BY: B. Jackson
MAINTAINED BY: guess who
DESIGNED BY: B. Jackson
CODED BY: B. Jackson
MAINTAINED BY: guess who
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
----------------------------------------------------------------------------
REFERENCES:
[ 1] McFarland, Richard E.: "A Standard Kinematic Model
for Flight Simulation at NASA-Ames", NASA CR-2497,
January 1975
[ 2] ANSI/AIAA R-004-1992 "Recommended Practice: Atmos-
pheric and Space Flight Vehicle Coordinate Systems",
February 1992
[ 3] Beyer, William H., editor: "CRC Standard Mathematical
Tables, 28th edition", CRC Press, Boca Raton, FL, 1987,
ISBN 0-8493-0628-0
[ 4] Dowdy, M. C.; Jackson, E. B.; and Nichols, J. H.:
"Controls Analysis and Simulation Test Loop Environ-
ment (CASTLE) Programmer's Guide, Version 1.3",
NATC TM 89-11, 30 March 1989.
[ 5] Halliday, David; and Resnick, Robert: "Fundamentals
of Physics, Revised Printing", Wiley and Sons, 1974.
ISBN 0-471-34431-1
REFERENCES:
[ 1] McFarland, Richard E.: "A Standard Kinematic Model
for Flight Simulation at NASA-Ames", NASA CR-2497,
January 1975
[ 2] ANSI/AIAA R-004-1992 "Recommended Practice: Atmos-
pheric and Space Flight Vehicle Coordinate Systems",
February 1992
[ 3] Beyer, William H., editor: "CRC Standard Mathematical
Tables, 28th edition", CRC Press, Boca Raton, FL, 1987,
ISBN 0-8493-0628-0
[ 4] Dowdy, M. C.; Jackson, E. B.; and Nichols, J. H.:
"Controls Analysis and Simulation Test Loop Environ-
ment (CASTLE) Programmer's Guide, Version 1.3",
NATC TM 89-11, 30 March 1989.
[ 5] Halliday, David; and Resnick, Robert: "Fundamentals
of Physics, Revised Printing", Wiley and Sons, 1974.
ISBN 0-471-34431-1
[ 6] Anon: "U. S. Standard Atmosphere, 1962"
[ 7] Anon: "Aeronautical Vest Pocket Handbook, 17th edition",
Pratt & Whitney Aircraft Group, Dec. 1977
[ 8] Stevens, Brian L.; and Lewis, Frank L.: "Aircraft
Control and Simulation", Wiley and Sons, 1992.
ISBN 0-471-61397-5
[ 6] Anon: "U. S. Standard Atmosphere, 1962"
[ 7] Anon: "Aeronautical Vest Pocket Handbook, 17th edition",
Pratt & Whitney Aircraft Group, Dec. 1977
[ 8] Stevens, Brian L.; and Lewis, Frank L.: "Aircraft
Control and Simulation", Wiley and Sons, 1992.
ISBN 0-471-61397-5
--------------------------------------------------------------------------*/
@ -82,340 +82,340 @@ extern "C" {
typedef struct {
/*================== Mass properties and geometry values ==================*/
DATA mass, i_xx, i_yy, i_zz, i_xz; /* Inertias */
#define Mass generic_.mass
#define I_xx generic_.i_xx
#define I_yy generic_.i_yy
#define I_zz generic_.i_zz
#define I_xz generic_.i_xz
VECTOR_3 d_pilot_rp_body_v; /* Pilot location rel to ref pt */
#define D_pilot_rp_body_v generic_.d_pilot_rp_body_v
#define Dx_pilot generic_.d_pilot_rp_body_v[0]
#define Dy_pilot generic_.d_pilot_rp_body_v[1]
#define Dz_pilot generic_.d_pilot_rp_body_v[2]
DATA mass, i_xx, i_yy, i_zz, i_xz; /* Inertias */
#define Mass generic_.mass
#define I_xx generic_.i_xx
#define I_yy generic_.i_yy
#define I_zz generic_.i_zz
#define I_xz generic_.i_xz
VECTOR_3 d_pilot_rp_body_v; /* Pilot location rel to ref pt */
#define D_pilot_rp_body_v generic_.d_pilot_rp_body_v
#define Dx_pilot generic_.d_pilot_rp_body_v[0]
#define Dy_pilot generic_.d_pilot_rp_body_v[1]
#define Dz_pilot generic_.d_pilot_rp_body_v[2]
VECTOR_3 d_cg_rp_body_v; /* CG position w.r.t. ref. point */
#define D_cg_rp_body_v generic_.d_cg_rp_body_v
#define Dx_cg generic_.d_cg_rp_body_v[0]
#define Dy_cg generic_.d_cg_rp_body_v[1]
#define Dz_cg generic_.d_cg_rp_body_v[2]
VECTOR_3 d_cg_rp_body_v; /* CG position w.r.t. ref. point */
#define D_cg_rp_body_v generic_.d_cg_rp_body_v
#define Dx_cg generic_.d_cg_rp_body_v[0]
#define Dy_cg generic_.d_cg_rp_body_v[1]
#define Dz_cg generic_.d_cg_rp_body_v[2]
/*================================ Forces =================================*/
VECTOR_3 f_body_total_v;
#define F_body_total_v generic_.f_body_total_v
#define F_X generic_.f_body_total_v[0]
#define F_Y generic_.f_body_total_v[1]
#define F_Z generic_.f_body_total_v[2]
#define F_body_total_v generic_.f_body_total_v
#define F_X generic_.f_body_total_v[0]
#define F_Y generic_.f_body_total_v[1]
#define F_Z generic_.f_body_total_v[2]
VECTOR_3 f_local_total_v;
#define F_local_total_v generic_.f_local_total_v
#define F_north generic_.f_local_total_v[0]
#define F_east generic_.f_local_total_v[1]
#define F_down generic_.f_local_total_v[2]
#define F_local_total_v generic_.f_local_total_v
#define F_north generic_.f_local_total_v[0]
#define F_east generic_.f_local_total_v[1]
#define F_down generic_.f_local_total_v[2]
VECTOR_3 f_aero_v;
#define F_aero_v generic_.f_aero_v
#define F_X_aero generic_.f_aero_v[0]
#define F_Y_aero generic_.f_aero_v[1]
#define F_Z_aero generic_.f_aero_v[2]
#define F_aero_v generic_.f_aero_v
#define F_X_aero generic_.f_aero_v[0]
#define F_Y_aero generic_.f_aero_v[1]
#define F_Z_aero generic_.f_aero_v[2]
VECTOR_3 f_engine_v;
#define F_engine_v generic_.f_engine_v
#define F_X_engine generic_.f_engine_v[0]
#define F_Y_engine generic_.f_engine_v[1]
#define F_Z_engine generic_.f_engine_v[2]
#define F_engine_v generic_.f_engine_v
#define F_X_engine generic_.f_engine_v[0]
#define F_Y_engine generic_.f_engine_v[1]
#define F_Z_engine generic_.f_engine_v[2]
int use_external_engine;
#define Use_External_Engine generic_.use_external_engine
VECTOR_3 f_gear_v;
#define F_gear_v generic_.f_gear_v
#define F_X_gear generic_.f_gear_v[0]
#define F_Y_gear generic_.f_gear_v[1]
#define F_Z_gear generic_.f_gear_v[2]
#define F_gear_v generic_.f_gear_v
#define F_X_gear generic_.f_gear_v[0]
#define F_Y_gear generic_.f_gear_v[1]
#define F_Z_gear generic_.f_gear_v[2]
/*================================ Moments ================================*/
VECTOR_3 m_total_rp_v;
#define M_total_rp_v generic_.m_total_rp_v
#define M_l_rp generic_.m_total_rp_v[0]
#define M_m_rp generic_.m_total_rp_v[1]
#define M_n_rp generic_.m_total_rp_v[2]
#define M_total_rp_v generic_.m_total_rp_v
#define M_l_rp generic_.m_total_rp_v[0]
#define M_m_rp generic_.m_total_rp_v[1]
#define M_n_rp generic_.m_total_rp_v[2]
VECTOR_3 m_total_cg_v;
#define M_total_cg_v generic_.m_total_cg_v
#define M_l_cg generic_.m_total_cg_v[0]
#define M_m_cg generic_.m_total_cg_v[1]
#define M_n_cg generic_.m_total_cg_v[2]
#define M_total_cg_v generic_.m_total_cg_v
#define M_l_cg generic_.m_total_cg_v[0]
#define M_m_cg generic_.m_total_cg_v[1]
#define M_n_cg generic_.m_total_cg_v[2]
VECTOR_3 m_aero_v;
#define M_aero_v generic_.m_aero_v
#define M_l_aero generic_.m_aero_v[0]
#define M_m_aero generic_.m_aero_v[1]
#define M_n_aero generic_.m_aero_v[2]
#define M_aero_v generic_.m_aero_v
#define M_l_aero generic_.m_aero_v[0]
#define M_m_aero generic_.m_aero_v[1]
#define M_n_aero generic_.m_aero_v[2]
VECTOR_3 m_engine_v;
#define M_engine_v generic_.m_engine_v
#define M_l_engine generic_.m_engine_v[0]
#define M_m_engine generic_.m_engine_v[1]
#define M_n_engine generic_.m_engine_v[2]
#define M_engine_v generic_.m_engine_v
#define M_l_engine generic_.m_engine_v[0]
#define M_m_engine generic_.m_engine_v[1]
#define M_n_engine generic_.m_engine_v[2]
VECTOR_3 m_gear_v;
#define M_gear_v generic_.m_gear_v
#define M_l_gear generic_.m_gear_v[0]
#define M_m_gear generic_.m_gear_v[1]
#define M_n_gear generic_.m_gear_v[2]
#define M_gear_v generic_.m_gear_v
#define M_l_gear generic_.m_gear_v[0]
#define M_m_gear generic_.m_gear_v[1]
#define M_n_gear generic_.m_gear_v[2]
/*============================== Accelerations ============================*/
VECTOR_3 v_dot_local_v;
#define V_dot_local_v generic_.v_dot_local_v
#define V_dot_north generic_.v_dot_local_v[0]
#define V_dot_east generic_.v_dot_local_v[1]
#define V_dot_down generic_.v_dot_local_v[2]
#define V_dot_local_v generic_.v_dot_local_v
#define V_dot_north generic_.v_dot_local_v[0]
#define V_dot_east generic_.v_dot_local_v[1]
#define V_dot_down generic_.v_dot_local_v[2]
VECTOR_3 v_dot_body_v;
#define V_dot_body_v generic_.v_dot_body_v
#define U_dot_body generic_.v_dot_body_v[0]
#define V_dot_body generic_.v_dot_body_v[1]
#define W_dot_body generic_.v_dot_body_v[2]
#define V_dot_body_v generic_.v_dot_body_v
#define U_dot_body generic_.v_dot_body_v[0]
#define V_dot_body generic_.v_dot_body_v[1]
#define W_dot_body generic_.v_dot_body_v[2]
VECTOR_3 a_cg_body_v;
#define A_cg_body_v generic_.a_cg_body_v
#define A_X_cg generic_.a_cg_body_v[0]
#define A_Y_cg generic_.a_cg_body_v[1]
#define A_Z_cg generic_.a_cg_body_v[2]
#define A_cg_body_v generic_.a_cg_body_v
#define A_X_cg generic_.a_cg_body_v[0]
#define A_Y_cg generic_.a_cg_body_v[1]
#define A_Z_cg generic_.a_cg_body_v[2]
VECTOR_3 a_pilot_body_v;
#define A_pilot_body_v generic_.a_pilot_body_v
#define A_X_pilot generic_.a_pilot_body_v[0]
#define A_Y_pilot generic_.a_pilot_body_v[1]
#define A_Z_pilot generic_.a_pilot_body_v[2]
#define A_pilot_body_v generic_.a_pilot_body_v
#define A_X_pilot generic_.a_pilot_body_v[0]
#define A_Y_pilot generic_.a_pilot_body_v[1]
#define A_Z_pilot generic_.a_pilot_body_v[2]
VECTOR_3 n_cg_body_v;
#define N_cg_body_v generic_.n_cg_body_v
#define N_X_cg generic_.n_cg_body_v[0]
#define N_Y_cg generic_.n_cg_body_v[1]
#define N_Z_cg generic_.n_cg_body_v[2]
#define N_cg_body_v generic_.n_cg_body_v
#define N_X_cg generic_.n_cg_body_v[0]
#define N_Y_cg generic_.n_cg_body_v[1]
#define N_Z_cg generic_.n_cg_body_v[2]
VECTOR_3 n_pilot_body_v;
#define N_pilot_body_v generic_.n_pilot_body_v
#define N_X_pilot generic_.n_pilot_body_v[0]
#define N_Y_pilot generic_.n_pilot_body_v[1]
#define N_Z_pilot generic_.n_pilot_body_v[2]
#define N_pilot_body_v generic_.n_pilot_body_v
#define N_X_pilot generic_.n_pilot_body_v[0]
#define N_Y_pilot generic_.n_pilot_body_v[1]
#define N_Z_pilot generic_.n_pilot_body_v[2]
VECTOR_3 omega_dot_body_v;
#define Omega_dot_body_v generic_.omega_dot_body_v
#define P_dot_body generic_.omega_dot_body_v[0]
#define Q_dot_body generic_.omega_dot_body_v[1]
#define R_dot_body generic_.omega_dot_body_v[2]
#define Omega_dot_body_v generic_.omega_dot_body_v
#define P_dot_body generic_.omega_dot_body_v[0]
#define Q_dot_body generic_.omega_dot_body_v[1]
#define R_dot_body generic_.omega_dot_body_v[2]
/*============================== Velocities ===============================*/
VECTOR_3 v_local_v;
#define V_local_v generic_.v_local_v
#define V_north generic_.v_local_v[0]
#define V_east generic_.v_local_v[1]
#define V_down generic_.v_local_v[2]
#define V_local_v generic_.v_local_v
#define V_north generic_.v_local_v[0]
#define V_east generic_.v_local_v[1]
#define V_down generic_.v_local_v[2]
VECTOR_3 v_local_rel_ground_v; /* V rel w.r.t. earth surface */
#define V_local_rel_ground_v generic_.v_local_rel_ground_v
#define V_north_rel_ground generic_.v_local_rel_ground_v[0]
#define V_east_rel_ground generic_.v_local_rel_ground_v[1]
#define V_down_rel_ground generic_.v_local_rel_ground_v[2]
VECTOR_3 v_local_rel_ground_v; /* V rel w.r.t. earth surface */
#define V_local_rel_ground_v generic_.v_local_rel_ground_v
#define V_north_rel_ground generic_.v_local_rel_ground_v[0]
#define V_east_rel_ground generic_.v_local_rel_ground_v[1]
#define V_down_rel_ground generic_.v_local_rel_ground_v[2]
VECTOR_3 v_local_airmass_v; /* velocity of airmass (steady winds) */
#define V_local_airmass_v generic_.v_local_airmass_v
#define V_north_airmass generic_.v_local_airmass_v[0]
#define V_east_airmass generic_.v_local_airmass_v[1]
#define V_down_airmass generic_.v_local_airmass_v[2]
VECTOR_3 v_local_airmass_v; /* velocity of airmass (steady winds) */
#define V_local_airmass_v generic_.v_local_airmass_v
#define V_north_airmass generic_.v_local_airmass_v[0]
#define V_east_airmass generic_.v_local_airmass_v[1]
#define V_down_airmass generic_.v_local_airmass_v[2]
VECTOR_3 v_local_rel_airmass_v; /* velocity of veh. relative to airmass */
#define V_local_rel_airmass_v generic_.v_local_rel_airmass_v
#define V_north_rel_airmass generic_.v_local_rel_airmass_v[0]
#define V_east_rel_airmass generic_.v_local_rel_airmass_v[1]
#define V_down_rel_airmass generic_.v_local_rel_airmass_v[2]
VECTOR_3 v_local_rel_airmass_v; /* velocity of veh. relative to airmass */
#define V_local_rel_airmass_v generic_.v_local_rel_airmass_v
#define V_north_rel_airmass generic_.v_local_rel_airmass_v[0]
#define V_east_rel_airmass generic_.v_local_rel_airmass_v[1]
#define V_down_rel_airmass generic_.v_local_rel_airmass_v[2]
VECTOR_3 v_local_gust_v; /* linear turbulence components, L frame */
#define V_local_gust_v generic_.v_local_gust_v
#define U_gust generic_.v_local_gust_v[0]
#define V_gust generic_.v_local_gust_v[1]
#define W_gust generic_.v_local_gust_v[2]
#define V_local_gust_v generic_.v_local_gust_v
#define U_gust generic_.v_local_gust_v[0]
#define V_gust generic_.v_local_gust_v[1]
#define W_gust generic_.v_local_gust_v[2]
VECTOR_3 v_wind_body_v; /* Wind-relative velocities in body axis */
#define V_wind_body_v generic_.v_wind_body_v
#define U_body generic_.v_wind_body_v[0]
#define V_body generic_.v_wind_body_v[1]
#define W_body generic_.v_wind_body_v[2]
VECTOR_3 v_wind_body_v; /* Wind-relative velocities in body axis */
#define V_wind_body_v generic_.v_wind_body_v
#define U_body generic_.v_wind_body_v[0]
#define V_body generic_.v_wind_body_v[1]
#define W_body generic_.v_wind_body_v[2]
DATA v_rel_wind, v_true_kts, v_rel_ground, v_inertial;
DATA v_ground_speed, v_equiv, v_equiv_kts;
DATA v_calibrated, v_calibrated_kts;
#define V_rel_wind generic_.v_rel_wind
#define V_true_kts generic_.v_true_kts
#define V_rel_ground generic_.v_rel_ground
#define V_inertial generic_.v_inertial
#define V_ground_speed generic_.v_ground_speed
#define V_equiv generic_.v_equiv
#define V_equiv_kts generic_.v_equiv_kts
#define V_calibrated generic_.v_calibrated
#define V_calibrated_kts generic_.v_calibrated_kts
#define V_rel_wind generic_.v_rel_wind
#define V_true_kts generic_.v_true_kts
#define V_rel_ground generic_.v_rel_ground
#define V_inertial generic_.v_inertial
#define V_ground_speed generic_.v_ground_speed
#define V_equiv generic_.v_equiv
#define V_equiv_kts generic_.v_equiv_kts
#define V_calibrated generic_.v_calibrated
#define V_calibrated_kts generic_.v_calibrated_kts
VECTOR_3 omega_body_v; /* Angular B rates */
#define Omega_body_v generic_.omega_body_v
#define P_body generic_.omega_body_v[0]
#define Q_body generic_.omega_body_v[1]
#define R_body generic_.omega_body_v[2]
VECTOR_3 omega_local_v; /* Angular L rates */
#define Omega_local_v generic_.omega_local_v
#define P_local generic_.omega_local_v[0]
#define Q_local generic_.omega_local_v[1]
#define R_local generic_.omega_local_v[2]
VECTOR_3 omega_body_v; /* Angular B rates */
#define Omega_body_v generic_.omega_body_v
#define P_body generic_.omega_body_v[0]
#define Q_body generic_.omega_body_v[1]
#define R_body generic_.omega_body_v[2]
VECTOR_3 omega_local_v; /* Angular L rates */
#define Omega_local_v generic_.omega_local_v
#define P_local generic_.omega_local_v[0]
#define Q_local generic_.omega_local_v[1]
#define R_local generic_.omega_local_v[2]
VECTOR_3 omega_total_v; /* Diff btw B & L */
#define Omega_total_v generic_.omega_total_v
#define P_total generic_.omega_total_v[0]
#define Q_total generic_.omega_total_v[1]
#define R_total generic_.omega_total_v[2]
VECTOR_3 omega_total_v; /* Diff btw B & L */
#define Omega_total_v generic_.omega_total_v
#define P_total generic_.omega_total_v[0]
#define Q_total generic_.omega_total_v[1]
#define R_total generic_.omega_total_v[2]
VECTOR_3 euler_rates_v;
#define Euler_rates_v generic_.euler_rates_v
#define Phi_dot generic_.euler_rates_v[0]
#define Theta_dot generic_.euler_rates_v[1]
#define Psi_dot generic_.euler_rates_v[2]
#define Euler_rates_v generic_.euler_rates_v
#define Phi_dot generic_.euler_rates_v[0]
#define Theta_dot generic_.euler_rates_v[1]
#define Psi_dot generic_.euler_rates_v[2]
VECTOR_3 geocentric_rates_v; /* Geocentric linear velocities */
#define Geocentric_rates_v generic_.geocentric_rates_v
#define Latitude_dot generic_.geocentric_rates_v[0]
#define Longitude_dot generic_.geocentric_rates_v[1]
#define Radius_dot generic_.geocentric_rates_v[2]
VECTOR_3 geocentric_rates_v; /* Geocentric linear velocities */
#define Geocentric_rates_v generic_.geocentric_rates_v
#define Latitude_dot generic_.geocentric_rates_v[0]
#define Longitude_dot generic_.geocentric_rates_v[1]
#define Radius_dot generic_.geocentric_rates_v[2]
/*=============================== Positions ===============================*/
VECTOR_3 geocentric_position_v;
#define Geocentric_position_v generic_.geocentric_position_v
#define Lat_geocentric generic_.geocentric_position_v[0]
#define Lon_geocentric generic_.geocentric_position_v[1]
#define Radius_to_vehicle generic_.geocentric_position_v[2]
#define Geocentric_position_v generic_.geocentric_position_v
#define Lat_geocentric generic_.geocentric_position_v[0]
#define Lon_geocentric generic_.geocentric_position_v[1]
#define Radius_to_vehicle generic_.geocentric_position_v[2]
VECTOR_3 geodetic_position_v;
#define Geodetic_position_v generic_.geodetic_position_v
#define Latitude generic_.geodetic_position_v[0]
#define Longitude generic_.geodetic_position_v[1]
#define Altitude generic_.geodetic_position_v[2]
#define Geodetic_position_v generic_.geodetic_position_v
#define Latitude generic_.geodetic_position_v[0]
#define Longitude generic_.geodetic_position_v[1]
#define Altitude generic_.geodetic_position_v[2]
VECTOR_3 euler_angles_v;
#define Euler_angles_v generic_.euler_angles_v
#define Phi generic_.euler_angles_v[0]
#define Theta generic_.euler_angles_v[1]
#define Psi generic_.euler_angles_v[2]
#define Euler_angles_v generic_.euler_angles_v
#define Phi generic_.euler_angles_v[0]
#define Theta generic_.euler_angles_v[1]
#define Psi generic_.euler_angles_v[2]
/*======================= Miscellaneous quantities ========================*/
DATA t_local_to_body_m[3][3]; /* Transformation matrix L to B */
#define T_local_to_body_m generic_.t_local_to_body_m
#define T_local_to_body_11 generic_.t_local_to_body_m[0][0]
#define T_local_to_body_12 generic_.t_local_to_body_m[0][1]
#define T_local_to_body_13 generic_.t_local_to_body_m[0][2]
#define T_local_to_body_21 generic_.t_local_to_body_m[1][0]
#define T_local_to_body_22 generic_.t_local_to_body_m[1][1]
#define T_local_to_body_23 generic_.t_local_to_body_m[1][2]
#define T_local_to_body_31 generic_.t_local_to_body_m[2][0]
#define T_local_to_body_32 generic_.t_local_to_body_m[2][1]
#define T_local_to_body_33 generic_.t_local_to_body_m[2][2]
DATA t_local_to_body_m[3][3]; /* Transformation matrix L to B */
#define T_local_to_body_m generic_.t_local_to_body_m
#define T_local_to_body_11 generic_.t_local_to_body_m[0][0]
#define T_local_to_body_12 generic_.t_local_to_body_m[0][1]
#define T_local_to_body_13 generic_.t_local_to_body_m[0][2]
#define T_local_to_body_21 generic_.t_local_to_body_m[1][0]
#define T_local_to_body_22 generic_.t_local_to_body_m[1][1]
#define T_local_to_body_23 generic_.t_local_to_body_m[1][2]
#define T_local_to_body_31 generic_.t_local_to_body_m[2][0]
#define T_local_to_body_32 generic_.t_local_to_body_m[2][1]
#define T_local_to_body_33 generic_.t_local_to_body_m[2][2]
DATA gravity; /* Local acceleration due to G */
#define Gravity generic_.gravity
DATA gravity; /* Local acceleration due to G */
#define Gravity generic_.gravity
DATA centrifugal_relief; /* load factor reduction due to speed */
#define Centrifugal_relief generic_.centrifugal_relief
DATA centrifugal_relief; /* load factor reduction due to speed */
#define Centrifugal_relief generic_.centrifugal_relief
DATA alpha, beta, alpha_dot, beta_dot; /* in radians */
#define Std_Alpha generic_.alpha
#define Std_Beta generic_.beta
#define Std_Alpha_dot generic_.alpha_dot
#define Std_Beta_dot generic_.beta_dot
DATA alpha, beta, alpha_dot, beta_dot; /* in radians */
#define Std_Alpha generic_.alpha
#define Std_Beta generic_.beta
#define Std_Alpha_dot generic_.alpha_dot
#define Std_Beta_dot generic_.beta_dot
DATA cos_alpha, sin_alpha, cos_beta, sin_beta;
#define Cos_alpha generic_.cos_alpha
#define Sin_alpha generic_.sin_alpha
#define Cos_beta generic_.cos_beta
#define Sin_beta generic_.sin_beta
#define Cos_alpha generic_.cos_alpha
#define Sin_alpha generic_.sin_alpha
#define Cos_beta generic_.cos_beta
#define Sin_beta generic_.sin_beta
DATA cos_phi, sin_phi, cos_theta, sin_theta, cos_psi, sin_psi;
#define Cos_phi generic_.cos_phi
#define Sin_phi generic_.sin_phi
#define Cos_theta generic_.cos_theta
#define Sin_theta generic_.sin_theta
#define Cos_psi generic_.cos_psi
#define Sin_psi generic_.sin_psi
DATA gamma_vert_rad, gamma_horiz_rad; /* Flight path angles */
#define Gamma_vert_rad generic_.gamma_vert_rad
#define Gamma_horiz_rad generic_.gamma_horiz_rad
#define Cos_phi generic_.cos_phi
#define Sin_phi generic_.sin_phi
#define Cos_theta generic_.cos_theta
#define Sin_theta generic_.sin_theta
#define Cos_psi generic_.cos_psi
#define Sin_psi generic_.sin_psi
DATA gamma_vert_rad, gamma_horiz_rad; /* Flight path angles */
#define Gamma_vert_rad generic_.gamma_vert_rad
#define Gamma_horiz_rad generic_.gamma_horiz_rad
DATA sigma, density, v_sound, mach_number;
#define Sigma generic_.sigma
#define Density generic_.density
#define V_sound generic_.v_sound
#define Mach_number generic_.mach_number
#define Sigma generic_.sigma
#define Density generic_.density
#define V_sound generic_.v_sound
#define Mach_number generic_.mach_number
DATA static_pressure, total_pressure, impact_pressure, dynamic_pressure;
#define Static_pressure generic_.static_pressure
#define Total_pressure generic_.total_pressure
#define Impact_pressure generic_.impact_pressure
#define Dynamic_pressure generic_.dynamic_pressure
#define Static_pressure generic_.static_pressure
#define Total_pressure generic_.total_pressure
#define Impact_pressure generic_.impact_pressure
#define Dynamic_pressure generic_.dynamic_pressure
DATA static_temperature, total_temperature;
#define Static_temperature generic_.static_temperature
#define Total_temperature generic_.total_temperature
#define Static_temperature generic_.static_temperature
#define Total_temperature generic_.total_temperature
DATA sea_level_radius, earth_position_angle;
#define Sea_level_radius generic_.sea_level_radius
#define Earth_position_angle generic_.earth_position_angle
#define Sea_level_radius generic_.sea_level_radius
#define Earth_position_angle generic_.earth_position_angle
DATA runway_altitude, runway_latitude, runway_longitude, runway_heading;
#define Runway_altitude generic_.runway_altitude
#define Runway_latitude generic_.runway_latitude
#define Runway_longitude generic_.runway_longitude
#define Runway_heading generic_.runway_heading
#define Runway_altitude generic_.runway_altitude
#define Runway_latitude generic_.runway_latitude
#define Runway_longitude generic_.runway_longitude
#define Runway_heading generic_.runway_heading
DATA radius_to_rwy;
#define Radius_to_rwy generic_.radius_to_rwy
#define Radius_to_rwy generic_.radius_to_rwy
VECTOR_3 d_cg_rwy_local_v; /* CG rel. to rwy in local coords */
#define D_cg_rwy_local_v generic_.d_cg_rwy_local_v
#define D_cg_north_of_rwy generic_.d_cg_rwy_local_v[0]
#define D_cg_east_of_rwy generic_.d_cg_rwy_local_v[1]
#define D_cg_above_rwy generic_.d_cg_rwy_local_v[2]
#define D_cg_rwy_local_v generic_.d_cg_rwy_local_v
#define D_cg_north_of_rwy generic_.d_cg_rwy_local_v[0]
#define D_cg_east_of_rwy generic_.d_cg_rwy_local_v[1]
#define D_cg_above_rwy generic_.d_cg_rwy_local_v[2]
VECTOR_3 d_cg_rwy_rwy_v; /* CG relative to runway, in rwy coordinates */
#define D_cg_rwy_rwy_v generic_.d_cg_rwy_rwy_v
#define X_cg_rwy generic_.d_cg_rwy_rwy_v[0]
#define Y_cg_rwy generic_.d_cg_rwy_rwy_v[1]
#define H_cg_rwy generic_.d_cg_rwy_rwy_v[2]
VECTOR_3 d_cg_rwy_rwy_v; /* CG relative to runway, in rwy coordinates */
#define D_cg_rwy_rwy_v generic_.d_cg_rwy_rwy_v
#define X_cg_rwy generic_.d_cg_rwy_rwy_v[0]
#define Y_cg_rwy generic_.d_cg_rwy_rwy_v[1]
#define H_cg_rwy generic_.d_cg_rwy_rwy_v[2]
VECTOR_3 d_pilot_rwy_local_v; /* pilot rel. to rwy in local coords */
#define D_pilot_rwy_local_v generic_.d_pilot_rwy_local_v
#define D_pilot_north_of_rwy generic_.d_pilot_rwy_local_v[0]
#define D_pilot_east_of_rwy generic_.d_pilot_rwy_local_v[1]
#define D_pilot_above_rwy generic_.d_pilot_rwy_local_v[2]
VECTOR_3 d_pilot_rwy_local_v; /* pilot rel. to rwy in local coords */
#define D_pilot_rwy_local_v generic_.d_pilot_rwy_local_v
#define D_pilot_north_of_rwy generic_.d_pilot_rwy_local_v[0]
#define D_pilot_east_of_rwy generic_.d_pilot_rwy_local_v[1]
#define D_pilot_above_rwy generic_.d_pilot_rwy_local_v[2]
VECTOR_3 d_pilot_rwy_rwy_v; /* pilot rel. to rwy, in rwy coords. */
#define D_pilot_rwy_rwy_v generic_.d_pilot_rwy_rwy_v
#define X_pilot_rwy generic_.d_pilot_rwy_rwy_v[0]
#define Y_pilot_rwy generic_.d_pilot_rwy_rwy_v[1]
#define H_pilot_rwy generic_.d_pilot_rwy_rwy_v[2]
VECTOR_3 d_pilot_rwy_rwy_v; /* pilot rel. to rwy, in rwy coords. */
#define D_pilot_rwy_rwy_v generic_.d_pilot_rwy_rwy_v
#define X_pilot_rwy generic_.d_pilot_rwy_rwy_v[0]
#define Y_pilot_rwy generic_.d_pilot_rwy_rwy_v[1]
#define H_pilot_rwy generic_.d_pilot_rwy_rwy_v[2]
} GENERIC;
extern GENERIC generic_; /* usually defined in ls_main.c */
extern GENERIC generic_; /* usually defined in ls_main.c */
#ifdef __cplusplus

View file

@ -1,42 +1,42 @@
/***************************************************************************
TITLE: ls_geodesy
TITLE: ls_geodesy
----------------------------------------------------------------------------
FUNCTION: Converts geocentric coordinates to geodetic positions
FUNCTION: Converts geocentric coordinates to geodetic positions
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Written as part of LaRCSim project by E. B. Jackson
GENEALOGY: Written as part of LaRCSim project by E. B. Jackson
----------------------------------------------------------------------------
DESIGNED BY: E. B. Jackson
CODED BY: E. B. Jackson
MAINTAINED BY: E. B. Jackson
DESIGNED BY: E. B. Jackson
CODED BY: E. B. Jackson
MAINTAINED BY: E. B. Jackson
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
930208 Modified to avoid singularity near polar region. EBJ
930602 Moved backwards calcs here from ls_step. EBJ
931214 Changed erroneous Latitude and Altitude variables to
*lat_geod and *alt in routine ls_geoc_to_geod. EBJ
940111 Changed header files from old ls_eom.h style to ls_types,
and ls_constants. Also replaced old DATA type with new
SCALAR type. EBJ
MODIFICATION HISTORY:
DATE PURPOSE BY
930208 Modified to avoid singularity near polar region. EBJ
930602 Moved backwards calcs here from ls_step. EBJ
931214 Changed erroneous Latitude and Altitude variables to
*lat_geod and *alt in routine ls_geoc_to_geod. EBJ
940111 Changed header files from old ls_eom.h style to ls_types,
and ls_constants. Also replaced old DATA type with new
SCALAR type. EBJ
CURRENT RCS HEADER:
CURRENT RCS HEADER:
$Header$
$Log$
@ -224,34 +224,34 @@ Initial Flight Gear revision.
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
[ 1] Stevens, Brian L.; and Lewis, Frank L.: "Aircraft
Control and Simulation", Wiley and Sons, 1992.
ISBN 0-471-61397-5
[ 1] Stevens, Brian L.; and Lewis, Frank L.: "Aircraft
Control and Simulation", Wiley and Sons, 1992.
ISBN 0-471-61397-5
----------------------------------------------------------------------------
CALLED BY: ls_aux
CALLED BY: ls_aux
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
lat_geoc Geocentric latitude, radians, + = North
radius C.G. radius to earth center, ft
INPUTS:
lat_geoc Geocentric latitude, radians, + = North
radius C.G. radius to earth center, ft
----------------------------------------------------------------------------
OUTPUTS:
lat_geod Geodetic latitude, radians, + = North
alt C.G. altitude above mean sea level, ft
sea_level_r radius from earth center to sea level at
local vertical (surface normal) of C.G.
OUTPUTS:
lat_geod Geodetic latitude, radians, + = North
alt C.G. altitude above mean sea level, ft
sea_level_r radius from earth center to sea level at
local vertical (surface normal) of C.G.
--------------------------------------------------------------------------*/
@ -266,54 +266,54 @@ Initial Flight Gear revision.
void ls_geoc_to_geod( SCALAR lat_geoc, SCALAR radius, SCALAR *lat_geod,
SCALAR *alt, SCALAR *sea_level_r )
SCALAR *alt, SCALAR *sea_level_r )
{
SCALAR t_lat, x_alpha, mu_alpha, delt_mu, r_alpha, l_point, rho_alpha;
SCALAR sin_mu_a, denom,delt_lambda, lambda_sl, sin_lambda_sl;
SCALAR t_lat, x_alpha, mu_alpha, delt_mu, r_alpha, l_point, rho_alpha;
SCALAR sin_mu_a, denom,delt_lambda, lambda_sl, sin_lambda_sl;
if( ( (HALF_PI - lat_geoc) < ONE_SECOND ) /* near North pole */
|| ( (HALF_PI + lat_geoc) < ONE_SECOND ) ) /* near South pole */
{
*lat_geod = lat_geoc;
*sea_level_r = EQUATORIAL_RADIUS*E;
*alt = radius - *sea_level_r;
}
else
{
t_lat = tan(lat_geoc);
x_alpha = E*EQUATORIAL_RADIUS/sqrt(t_lat*t_lat + E*E);
mu_alpha = atan2(sqrt(RESQ - x_alpha*x_alpha),E*x_alpha);
if (lat_geoc < 0) mu_alpha = - mu_alpha;
sin_mu_a = sin(mu_alpha);
delt_lambda = mu_alpha - lat_geoc;
r_alpha = x_alpha/cos(lat_geoc);
l_point = radius - r_alpha;
*alt = l_point*cos(delt_lambda);
denom = sqrt(1-EPS*EPS*sin_mu_a*sin_mu_a);
rho_alpha = EQUATORIAL_RADIUS*(1-EPS)/
(denom*denom*denom);
delt_mu = atan2(l_point*sin(delt_lambda),rho_alpha + *alt);
*lat_geod = mu_alpha - delt_mu;
lambda_sl = atan( E*E * tan(*lat_geod) ); /* SL geoc. latitude */
sin_lambda_sl = sin( lambda_sl );
*sea_level_r = sqrt(RESQ
/(1 + ((1/(E*E))-1)*sin_lambda_sl*sin_lambda_sl));
}
if( ( (HALF_PI - lat_geoc) < ONE_SECOND ) /* near North pole */
|| ( (HALF_PI + lat_geoc) < ONE_SECOND ) ) /* near South pole */
{
*lat_geod = lat_geoc;
*sea_level_r = EQUATORIAL_RADIUS*E;
*alt = radius - *sea_level_r;
}
else
{
t_lat = tan(lat_geoc);
x_alpha = E*EQUATORIAL_RADIUS/sqrt(t_lat*t_lat + E*E);
mu_alpha = atan2(sqrt(RESQ - x_alpha*x_alpha),E*x_alpha);
if (lat_geoc < 0) mu_alpha = - mu_alpha;
sin_mu_a = sin(mu_alpha);
delt_lambda = mu_alpha - lat_geoc;
r_alpha = x_alpha/cos(lat_geoc);
l_point = radius - r_alpha;
*alt = l_point*cos(delt_lambda);
denom = sqrt(1-EPS*EPS*sin_mu_a*sin_mu_a);
rho_alpha = EQUATORIAL_RADIUS*(1-EPS)/
(denom*denom*denom);
delt_mu = atan2(l_point*sin(delt_lambda),rho_alpha + *alt);
*lat_geod = mu_alpha - delt_mu;
lambda_sl = atan( E*E * tan(*lat_geod) ); /* SL geoc. latitude */
sin_lambda_sl = sin( lambda_sl );
*sea_level_r = sqrt(RESQ
/(1 + ((1/(E*E))-1)*sin_lambda_sl*sin_lambda_sl));
}
}
void ls_geod_to_geoc( SCALAR lat_geod, SCALAR alt,
SCALAR *sl_radius, SCALAR *lat_geoc )
SCALAR *sl_radius, SCALAR *lat_geoc )
{
SCALAR lambda_sl, sin_lambda_sl, cos_lambda_sl, sin_mu, cos_mu, px, py;
lambda_sl = atan( E*E * tan(lat_geod) ); /* sea level geocentric latitude */
sin_lambda_sl = sin( lambda_sl );
cos_lambda_sl = cos( lambda_sl );
sin_mu = sin(lat_geod); /* Geodetic (map makers') latitude */
sin_mu = sin(lat_geod); /* Geodetic (map makers') latitude */
cos_mu = cos(lat_geod);
*sl_radius = sqrt(RESQ
/(1 + ((1/(E*E))-1)*sin_lambda_sl*sin_lambda_sl));
/(1 + ((1/(E*E))-1)*sin_lambda_sl*sin_lambda_sl));
py = *sl_radius*sin_lambda_sl + alt*sin_mu;
px = *sl_radius*cos_lambda_sl + alt*cos_mu;
*lat_geoc = atan2( py, px );

View file

@ -9,10 +9,10 @@ extern "C" {
#endif
void ls_geoc_to_geod( SCALAR lat_geoc, SCALAR radius,
SCALAR *lat_geod, SCALAR *alt, SCALAR *sea_level_r );
SCALAR *lat_geod, SCALAR *alt, SCALAR *sea_level_r );
void ls_geod_to_geoc( SCALAR lat_geod, SCALAR alt, SCALAR *sl_radius,
SCALAR *lat_geoc );
SCALAR *lat_geoc );
#ifdef __cplusplus
}

View file

@ -1,38 +1,38 @@
/***************************************************************************
TITLE: ls_gravity
TITLE: ls_gravity
----------------------------------------------------------------------------
FUNCTION: Gravity model for LaRCsim
FUNCTION: Gravity model for LaRCsim
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created by Bruce Jackson on September 25, 1992.
GENEALOGY: Created by Bruce Jackson on September 25, 1992.
----------------------------------------------------------------------------
DESIGNED BY: Bruce Jackson
CODED BY: Bruce Jackson
MAINTAINED BY: Bruce Jackson
DESIGNED BY: Bruce Jackson
CODED BY: Bruce Jackson
MAINTAINED BY: Bruce Jackson
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
940111 Changed include files to "ls_types.h" and
"ls_constants.h" from "ls_eom.h"; also changed DATA types
to SCALAR types. EBJ
MODIFICATION HISTORY:
DATE PURPOSE BY
940111 Changed include files to "ls_types.h" and
"ls_constants.h" from "ls_eom.h"; also changed DATA types
to SCALAR types. EBJ
$Header$
$Log$
Revision 1.1 2002/09/10 01:14:02 curt
@ -60,29 +60,29 @@ Initial Flight Gear revision.
*
* Revision 1.1 1992/12/30 13:18:46 bjax
* Initial revision
*
*
----------------------------------------------------------------------------
REFERENCES: Stevens, Brian L.; and Lewis, Frank L.: "Aircraft
Control and Simulation", Wiley and Sons, 1992.
ISBN 0-471-
REFERENCES: Stevens, Brian L.; and Lewis, Frank L.: "Aircraft
Control and Simulation", Wiley and Sons, 1992.
ISBN 0-471-
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include "ls_types.h"
@ -90,19 +90,19 @@ Initial Flight Gear revision.
#include "ls_gravity.h"
#include <math.h>
#define GM 1.4076431E16
#define J2 1.08263E-3
#define GM 1.4076431E16
#define J2 1.08263E-3
void ls_gravity( SCALAR radius, SCALAR lat, SCALAR *gravity )
{
SCALAR radius_ratio, rrsq, sinsqlat;
radius_ratio = radius/EQUATORIAL_RADIUS;
rrsq = radius_ratio*radius_ratio;
sinsqlat = sin(lat)*sin(lat);
*gravity = (GM/(radius*radius))
*sqrt(2.25*rrsq*rrsq*J2*J2*(5*sinsqlat*sinsqlat -2*sinsqlat + 1)
+ 3*rrsq*J2*(1 - 3*sinsqlat) + 1);
SCALAR radius_ratio, rrsq, sinsqlat;
radius_ratio = radius/EQUATORIAL_RADIUS;
rrsq = radius_ratio*radius_ratio;
sinsqlat = sin(lat)*sin(lat);
*gravity = (GM/(radius*radius))
*sqrt(2.25*rrsq*rrsq*J2*J2*(5*sinsqlat*sinsqlat -2*sinsqlat + 1)
+ 3*rrsq*J2*(1 - 3*sinsqlat) + 1);
}

View file

@ -1,36 +1,36 @@
/***************************************************************************
TITLE: ls_init.c
TITLE: ls_init.c
----------------------------------------------------------------------------
FUNCTION: Initializes simulation
FUNCTION: Initializes simulation
----------------------------------------------------------------------------
MODULE STATUS: incomplete
MODULE STATUS: incomplete
----------------------------------------------------------------------------
GENEALOGY: Written 921230 by Bruce Jackson
GENEALOGY: Written 921230 by Bruce Jackson
----------------------------------------------------------------------------
DESIGNED BY: EBJ
CODED BY: EBJ
MAINTAINED BY: EBJ
DESIGNED BY: EBJ
CODED BY: EBJ
MAINTAINED BY: EBJ
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
950314 Added get_set, put_set, and init routines. EBJ
CURRENT RCS HEADER:
950314 Added get_set, put_set, and init routines. EBJ
CURRENT RCS HEADER:
$Header$
$Log$
@ -109,23 +109,23 @@ Initial Flight Gear revision.
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
// static char rcsid[] = "$Id$";
@ -156,14 +156,14 @@ void basic_init( void );
typedef struct
{
symbol_rec Symbol;
double value;
symbol_rec Symbol;
double value;
} cont_state_rec;
typedef struct
{
symbol_rec Symbol;
long value;
symbol_rec Symbol;
long value;
} disc_state_rec;
@ -172,8 +172,8 @@ extern SCALAR Simtime;
/* static int Symbols_loaded = 0; */
static int Number_of_Continuous_States = 0;
static int Number_of_Discrete_States = 0;
static cont_state_rec Continuous_States[ MAX_NUMBER_OF_CONTINUOUS_STATES ];
static disc_state_rec Discrete_States[ MAX_NUMBER_OF_DISCRETE_STATES ];
static cont_state_rec Continuous_States[ MAX_NUMBER_OF_CONTINUOUS_STATES ];
static disc_state_rec Discrete_States[ MAX_NUMBER_OF_DISCRETE_STATES ];
void ls_init_init( void ) {
@ -181,52 +181,52 @@ void ls_init_init( void ) {
/* int error; */
if (Number_of_Continuous_States == 0)
{
Number_of_Continuous_States = HARDWIRED;
{
Number_of_Continuous_States = HARDWIRED;
for (i=0;i<HARDWIRED;i++)
strcpy( Continuous_States[i].Symbol.Mod_Name, "*" );
for (i=0;i<HARDWIRED;i++)
strcpy( Continuous_States[i].Symbol.Mod_Name, "*" );
strcpy( Continuous_States[ 0].Symbol.Par_Name,
"generic_.geodetic_position_v[0]");
strcpy( Continuous_States[ 1].Symbol.Par_Name,
"generic_.geodetic_position_v[1]");
strcpy( Continuous_States[ 2].Symbol.Par_Name,
"generic_.geodetic_position_v[2]");
strcpy( Continuous_States[ 3].Symbol.Par_Name,
"generic_.v_local_v[0]");
strcpy( Continuous_States[ 4].Symbol.Par_Name,
"generic_.v_local_v[1]");
strcpy( Continuous_States[ 5].Symbol.Par_Name,
"generic_.v_local_v[2]");
strcpy( Continuous_States[ 6].Symbol.Par_Name,
"generic_.euler_angles_v[0]");
strcpy( Continuous_States[ 7].Symbol.Par_Name,
"generic_.euler_angles_v[1]");
strcpy( Continuous_States[ 8].Symbol.Par_Name,
"generic_.euler_angles_v[2]");
strcpy( Continuous_States[ 9].Symbol.Par_Name,
"generic_.omega_body_v[0]");
strcpy( Continuous_States[10].Symbol.Par_Name,
"generic_.omega_body_v[1]");
strcpy( Continuous_States[11].Symbol.Par_Name,
"generic_.omega_body_v[2]");
strcpy( Continuous_States[12].Symbol.Par_Name,
"generic_.earth_position_angle");
}
strcpy( Continuous_States[ 0].Symbol.Par_Name,
"generic_.geodetic_position_v[0]");
strcpy( Continuous_States[ 1].Symbol.Par_Name,
"generic_.geodetic_position_v[1]");
strcpy( Continuous_States[ 2].Symbol.Par_Name,
"generic_.geodetic_position_v[2]");
strcpy( Continuous_States[ 3].Symbol.Par_Name,
"generic_.v_local_v[0]");
strcpy( Continuous_States[ 4].Symbol.Par_Name,
"generic_.v_local_v[1]");
strcpy( Continuous_States[ 5].Symbol.Par_Name,
"generic_.v_local_v[2]");
strcpy( Continuous_States[ 6].Symbol.Par_Name,
"generic_.euler_angles_v[0]");
strcpy( Continuous_States[ 7].Symbol.Par_Name,
"generic_.euler_angles_v[1]");
strcpy( Continuous_States[ 8].Symbol.Par_Name,
"generic_.euler_angles_v[2]");
strcpy( Continuous_States[ 9].Symbol.Par_Name,
"generic_.omega_body_v[0]");
strcpy( Continuous_States[10].Symbol.Par_Name,
"generic_.omega_body_v[1]");
strcpy( Continuous_States[11].Symbol.Par_Name,
"generic_.omega_body_v[2]");
strcpy( Continuous_States[12].Symbol.Par_Name,
"generic_.earth_position_angle");
}
/* commented out by CLO
for (i=0;i<Number_of_Continuous_States;i++)
{
(void) ls_get_sym_val( &Continuous_States[i].Symbol, &error );
if (error) Continuous_States[i].Symbol.Addr = NIL_POINTER;
}
{
(void) ls_get_sym_val( &Continuous_States[i].Symbol, &error );
if (error) Continuous_States[i].Symbol.Addr = NIL_POINTER;
}
for (i=0;i<Number_of_Discrete_States;i++)
{
(void) ls_get_sym_val( &Discrete_States[i].Symbol, &error );
if (error) Discrete_States[i].Symbol.Addr = NIL_POINTER;
}
{
(void) ls_get_sym_val( &Discrete_States[i].Symbol, &error );
if (error) Discrete_States[i].Symbol.Addr = NIL_POINTER;
}
*/
}
@ -270,14 +270,14 @@ void ls_init( char * aircraft ) {
/* commented out by CLO
for(i=0;i<Number_of_Continuous_States;i++)
if (Continuous_States[i].Symbol.Addr)
ls_set_sym_val( &Continuous_States[i].Symbol,
Continuous_States[i].value );
if (Continuous_States[i].Symbol.Addr)
ls_set_sym_val( &Continuous_States[i].Symbol,
Continuous_States[i].value );
for(i=0;i<Number_of_Discrete_States;i++)
if (Discrete_States[i].Symbol.Addr)
ls_set_sym_val( &Discrete_States[i].Symbol,
(double) Discrete_States[i].value );
if (Discrete_States[i].Symbol.Addr)
ls_set_sym_val( &Discrete_States[i].Symbol,
(double) Discrete_States[i].value );
*/
switch (current_model) {
@ -336,70 +336,70 @@ char *ls_init_get_set(char *buffer, char *eob)
while( !abrt && (eob > bufptr))
{
bufptr = strtok( 0L, "\n");
if (bufptr == 0) return 0L;
if (strncasecmp( bufptr, "end", 3) == 0) break;
bufptr = strtok( 0L, "\n");
if (bufptr == 0) return 0L;
if (strncasecmp( bufptr, "end", 3) == 0) break;
sscanf( bufptr, "%s", line );
if (line[0] != '#') /* ignore comments */
{
switch (looking_for)
{
case cont_states_header:
{
if (strncasecmp( line, "continuous_states", 17) == 0)
{
n = sscanf( bufptr, "%s%d", line,
&Number_of_Continuous_States );
if (n != 2) abrt = 1;
looking_for = cont_states;
i = 0;
}
break;
}
case cont_states:
{
n = sscanf( bufptr, "%s%s%le",
Continuous_States[i].Symbol.Mod_Name,
Continuous_States[i].Symbol.Par_Name,
&Continuous_States[i].value );
if (n != 3) abrt = 1;
Continuous_States[i].Symbol.Addr = NIL_POINTER;
i++;
if (i >= Number_of_Continuous_States)
looking_for = disc_states_header;
break;
}
case disc_states_header:
{
if (strncasecmp( line, "discrete_states", 15) == 0)
{
n = sscanf( bufptr, "%s%d", line,
&Number_of_Discrete_States );
if (n != 2) abrt = 1;
looking_for = disc_states;
i = 0;
}
break;
}
case disc_states:
{
n = sscanf( bufptr, "%s%s%ld",
Discrete_States[i].Symbol.Mod_Name,
Discrete_States[i].Symbol.Par_Name,
&Discrete_States[i].value );
if (n != 3) abrt = 1;
Discrete_States[i].Symbol.Addr = NIL_POINTER;
i++;
if (i >= Number_of_Discrete_States) looking_for = done;
}
case done:
{
break;
}
}
sscanf( bufptr, "%s", line );
if (line[0] != '#') /* ignore comments */
{
switch (looking_for)
{
case cont_states_header:
{
if (strncasecmp( line, "continuous_states", 17) == 0)
{
n = sscanf( bufptr, "%s%d", line,
&Number_of_Continuous_States );
if (n != 2) abrt = 1;
looking_for = cont_states;
i = 0;
}
break;
}
case cont_states:
{
n = sscanf( bufptr, "%s%s%le",
Continuous_States[i].Symbol.Mod_Name,
Continuous_States[i].Symbol.Par_Name,
&Continuous_States[i].value );
if (n != 3) abrt = 1;
Continuous_States[i].Symbol.Addr = NIL_POINTER;
i++;
if (i >= Number_of_Continuous_States)
looking_for = disc_states_header;
break;
}
case disc_states_header:
{
if (strncasecmp( line, "discrete_states", 15) == 0)
{
n = sscanf( bufptr, "%s%d", line,
&Number_of_Discrete_States );
if (n != 2) abrt = 1;
looking_for = disc_states;
i = 0;
}
break;
}
case disc_states:
{
n = sscanf( bufptr, "%s%s%ld",
Discrete_States[i].Symbol.Mod_Name,
Discrete_States[i].Symbol.Par_Name,
&Discrete_States[i].value );
if (n != 3) abrt = 1;
Discrete_States[i].Symbol.Addr = NIL_POINTER;
i++;
if (i >= Number_of_Discrete_States) looking_for = done;
}
case done:
{
break;
}
}
}
}
}
Symbols_loaded = !abrt;
@ -423,18 +423,18 @@ void ls_init_put_set( FILE *fp )
fprintf(fp, " continuous_states: %d\n", Number_of_Continuous_States);
fprintf(fp, "# module parameter value\n");
for (i=0; i<Number_of_Continuous_States; i++)
fprintf(fp, " %s\t%s\t%E\n",
Continuous_States[i].Symbol.Mod_Name,
Continuous_States[i].Symbol.Par_Name,
Continuous_States[i].value );
fprintf(fp, " %s\t%s\t%E\n",
Continuous_States[i].Symbol.Mod_Name,
Continuous_States[i].Symbol.Par_Name,
Continuous_States[i].value );
fprintf(fp, " discrete_states: %d\n", Number_of_Discrete_States);
fprintf(fp, "# module parameter value\n");
for (i=0;i<Number_of_Discrete_States;i++)
fprintf(fp, " %s\t%s\t%ld\n",
Discrete_States[i].Symbol.Mod_Name,
Discrete_States[i].Symbol.Par_Name,
Discrete_States[i].value );
fprintf(fp, " %s\t%s\t%ld\n",
Discrete_States[i].Symbol.Mod_Name,
Discrete_States[i].Symbol.Par_Name,
Discrete_States[i].value );
fprintf(fp, "end\n");
return;
}
@ -446,13 +446,13 @@ void ls_save_current_as_ic( void ) {
/* commented out by CLO
for(i=0;i<Number_of_Continuous_States;i++)
if (Continuous_States[i].Symbol.Addr)
Continuous_States[i].value =
ls_get_sym_val( &Continuous_States[i].Symbol, &error );
if (Continuous_States[i].Symbol.Addr)
Continuous_States[i].value =
ls_get_sym_val( &Continuous_States[i].Symbol, &error );
for(i=0;i<Number_of_Discrete_States;i++)
if (Discrete_States[i].Symbol.Addr)
Discrete_States[i].value = (long)
ls_get_sym_val( &Discrete_States[i].Symbol, &error );
if (Discrete_States[i].Symbol.Addr)
Discrete_States[i].value = (long)
ls_get_sym_val( &Discrete_States[i].Symbol, &error );
*/
}

View file

@ -28,66 +28,66 @@
/***************************************************************************
TITLE: LaRCsim.c
TITLE: LaRCsim.c
----------------------------------------------------------------------------
FUNCTION: Top level routine for LaRCSIM. Includes
global variable declarations.
FUNCTION: Top level routine for LaRCSIM. Includes
global variable declarations.
----------------------------------------------------------------------------
MODULE STATUS: Developmental
MODULE STATUS: Developmental
----------------------------------------------------------------------------
GENEALOGY: Written 921230 by Bruce Jackson
GENEALOGY: Written 921230 by Bruce Jackson
----------------------------------------------------------------------------
DESIGNED BY: EBJ
CODED BY: EBJ
MAINTAINED BY: EBJ
DESIGNED BY: EBJ
CODED BY: EBJ
MAINTAINED BY: EBJ
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
930111 Added "progname" variable to keep name of invoking command.
EBJ
931012 Removed altitude < 0. test to support gear development. EBJ
931214 Added various pressures (Impact, Dynamic, Static, etc.) EBJ
931215 Adopted new generic variable structure. EBJ
931218 Added command line options decoding. EBJ
940110 Changed file type of matrix file to ".m" EBJ
940513 Renamed this routine "LaRCsim.c" from "ls_main.c" EBJ
940513 Added time_stamp routine, t_stamp. EBJ
950225 Added options flag, 'i', to set I/O output rate. EBJ
950306 Added calls to ls_get_settings() and ls_put_settings() EBJ
950314 Options flag 'i' now reads IC file; 'o' is output rate EBJ
950406 Many changes: added definition of default value macros;
removed local variables term_update_hz, model_dt, endtime,
substituted sim_control_ globals for these; removed
initialization of sim_control_.tape_channels; moved optarg
to generic extern; added mod_end_time & mod_buf_size flags
and temporary buffer_time and data_rate locals to
ls_checkopts(); added additional command line switches '-s'
and '-b'; made psuedo-mandatory file names for data output
switches; considerable rewrite of logic for setting data
buffer length and interleave parameters; updated '-h' help
output message; added protection logic to calculations of
these parameters; added check of return value on first call
to ls_cockpit() so <esc> abort works from initial pause
state; added call to ls_unsync() immediately following
first ls_sync() call, if paused (to avoid alarm clock
timeout); moved call to ls_record() into non-paused
multiloop path (was filling buffer with identical data
during pause); put check of paused flag before calling sync
routine ls_pause(); and added call to exit() on termination.
930111 Added "progname" variable to keep name of invoking command.
EBJ
931012 Removed altitude < 0. test to support gear development. EBJ
931214 Added various pressures (Impact, Dynamic, Static, etc.) EBJ
931215 Adopted new generic variable structure. EBJ
931218 Added command line options decoding. EBJ
940110 Changed file type of matrix file to ".m" EBJ
940513 Renamed this routine "LaRCsim.c" from "ls_main.c" EBJ
940513 Added time_stamp routine, t_stamp. EBJ
950225 Added options flag, 'i', to set I/O output rate. EBJ
950306 Added calls to ls_get_settings() and ls_put_settings() EBJ
950314 Options flag 'i' now reads IC file; 'o' is output rate EBJ
950406 Many changes: added definition of default value macros;
removed local variables term_update_hz, model_dt, endtime,
substituted sim_control_ globals for these; removed
initialization of sim_control_.tape_channels; moved optarg
to generic extern; added mod_end_time & mod_buf_size flags
and temporary buffer_time and data_rate locals to
ls_checkopts(); added additional command line switches '-s'
and '-b'; made psuedo-mandatory file names for data output
switches; considerable rewrite of logic for setting data
buffer length and interleave parameters; updated '-h' help
output message; added protection logic to calculations of
these parameters; added check of return value on first call
to ls_cockpit() so <esc> abort works from initial pause
state; added call to ls_unsync() immediately following
first ls_sync() call, if paused (to avoid alarm clock
timeout); moved call to ls_record() into non-paused
multiloop path (was filling buffer with identical data
during pause); put check of paused flag before calling sync
routine ls_pause(); and added call to exit() on termination.
$Header$
@ -202,23 +202,23 @@ $Original log: LaRCsim.c,v $
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
@ -249,12 +249,12 @@ $Original log: LaRCsim.c,v $
/* global variable declarations */
/* TAPE *Tape; */
GENERIC generic_;
SIM_CONTROL sim_control_;
/* TAPE *Tape; */
GENERIC generic_;
SIM_CONTROL sim_control_;
COCKPIT cockpit_;
SCALAR Simtime;
SCALAR Simtime;
#define DEFAULT_TERM_UPDATE_HZ 20
#define DEFAULT_MODEL_HZ 120
@ -266,7 +266,7 @@ SCALAR Simtime;
/* global variables */
char *progname;
char *fullname;
char *fullname;
/* file variables - default simulation settings */
@ -289,13 +289,13 @@ void ls_stamp( void ) {
nowtime_t = time( 0 );
nowtime = localtime( &nowtime_t ); /* set fields to correct time values */
date = (nowtime->tm_year % 100)*10000
+ (nowtime->tm_mon + 1)*100
+ (nowtime->tm_mday);
+ (nowtime->tm_mon + 1)*100
+ (nowtime->tm_mday);
sprintf(sim_control_.date_string, "%06ld", date);
sprintf(sim_control_.time_stamp, "%02d:%02d:%02d",
nowtime->tm_hour, nowtime->tm_min, nowtime->tm_sec);
nowtime->tm_hour, nowtime->tm_min, nowtime->tm_sec);
#ifdef COMPILE_THIS_CODE_THIS_USELESS_CODE
cuserid( sim_control_.userid ); /* set up user id */
cuserid( sim_control_.userid ); /* set up user id */
#endif /* COMPILE_THIS_CODE_THIS_USELESS_CODE */
return;
}
@ -303,21 +303,21 @@ void ls_stamp( void ) {
void ls_setdefopts( void ) {
/* set default values for most options */
sim_control_.debug = 0; /* change to non-zero if in dbx! */
sim_control_.debug = 0; /* change to non-zero if in dbx! */
sim_control_.vision = 0;
sim_control_.write_av = 0; /* write Agile-Vu '.flt' file */
sim_control_.write_mat = 0; /* write matrix-x/matlab script */
sim_control_.write_tab = 0; /* write tab delim. history file */
sim_control_.write_asc1 = 0; /* write GetData file */
sim_control_.save_spacing = DEFAULT_SAVE_SPACING;
/* interpolation on recording */
sim_control_.write_spacing = DEFAULT_WRITE_SPACING;
/* interpolation on output */
sim_control_.write_av = 0; /* write Agile-Vu '.flt' file */
sim_control_.write_mat = 0; /* write matrix-x/matlab script */
sim_control_.write_tab = 0; /* write tab delim. history file */
sim_control_.write_asc1 = 0; /* write GetData file */
sim_control_.save_spacing = DEFAULT_SAVE_SPACING;
/* interpolation on recording */
sim_control_.write_spacing = DEFAULT_WRITE_SPACING;
/* interpolation on output */
sim_control_.end_time = DEFAULT_END_TIME;
sim_control_.model_hz = DEFAULT_MODEL_HZ;
sim_control_.term_update_hz = DEFAULT_TERM_UPDATE_HZ;
sim_control_.time_slices = (long int)(DEFAULT_END_TIME * DEFAULT_MODEL_HZ /
DEFAULT_SAVE_SPACING);
DEFAULT_SAVE_SPACING);
sim_control_.paused = 0;
speedup = 1.0;
@ -334,7 +334,7 @@ void ls_setdefopts( void ) {
extern char *optarg;
extern int optind;
int ls_checkopts(argc, argv) /* check and set options flags */
int ls_checkopts(argc, argv) /* check and set options flags */
int argc;
char *argv[];
{
@ -351,126 +351,126 @@ int ls_checkopts(argc, argv) /* check and set options flags */
/* set default values */
buffer_time = sim_control_.time_slices * sim_control_.save_spacing /
sim_control_.model_hz;
sim_control_.model_hz;
data_rate = sim_control_.model_hz / sim_control_.save_spacing;
while ((c = getopt(argc, argv, "Aa:b:de:f:hi:kmo:r:s:t:x:")) != EOF)
switch (c) {
case 'A':
if (sim_control_.sim_type == GLmouse)
{
fprintf(stderr, "Cannot specify both keyboard (k) and ACES (A) cockpits option\n");
fprintf(stderr, "Keyboard operation assumed.\n");
break;
}
sim_control_.sim_type = cockpit;
break;
case 'a':
sim_control_.write_av = 1;
if (optarg != NULL)
if (*optarg != '-')
strncpy(fltname, optarg, MAX_FILE_NAME_LENGTH);
else
optind--;
break;
case 'b':
buffer_time = atof(optarg);
if (buffer_time <= 0.) opt_err = -1;
mod_buf_size++;
break;
case 'd':
sim_control_.debug = 1;
break;
case 'e':
sim_control_.end_time = atof(optarg);
mod_end_time++;
break;
case 'f':
sim_control_.model_hz = atof(optarg);
break;
case 'h':
opt_err = 1;
break;
case 'i':
/* ls_get_settings( optarg ); */
break;
case 'k':
sim_control_.sim_type = GLmouse;
break;
case 'm':
sim_control_.vision = 1;
break;
case 'o':
sim_control_.term_update_hz = atof(optarg);
if (sim_control_.term_update_hz <= 0.) opt_err = 1;
break;
case 'r':
sim_control_.write_mat = 1;
if (optarg != NULL)
if (*optarg != '-')
strncpy(matname, optarg, MAX_FILE_NAME_LENGTH);
else
optind--;
break;
case 's':
data_rate = atof(optarg);
if (data_rate <= 0.) opt_err = -1;
break;
case 't':
sim_control_.write_tab = 1;
if (optarg != NULL)
if (*optarg != '-')
strncpy(tabname, optarg, MAX_FILE_NAME_LENGTH);
else
optind--;
break;
case 'x':
sim_control_.write_asc1 = 1;
if (optarg != NULL)
if (*optarg != '-')
strncpy(asc1name, optarg, MAX_FILE_NAME_LENGTH);
else
optind--;
break;
default:
opt_err = 1;
}
switch (c) {
case 'A':
if (sim_control_.sim_type == GLmouse)
{
fprintf(stderr, "Cannot specify both keyboard (k) and ACES (A) cockpits option\n");
fprintf(stderr, "Keyboard operation assumed.\n");
break;
}
sim_control_.sim_type = cockpit;
break;
case 'a':
sim_control_.write_av = 1;
if (optarg != NULL)
if (*optarg != '-')
strncpy(fltname, optarg, MAX_FILE_NAME_LENGTH);
else
optind--;
break;
case 'b':
buffer_time = atof(optarg);
if (buffer_time <= 0.) opt_err = -1;
mod_buf_size++;
break;
case 'd':
sim_control_.debug = 1;
break;
case 'e':
sim_control_.end_time = atof(optarg);
mod_end_time++;
break;
case 'f':
sim_control_.model_hz = atof(optarg);
break;
case 'h':
opt_err = 1;
break;
case 'i':
/* ls_get_settings( optarg ); */
break;
case 'k':
sim_control_.sim_type = GLmouse;
break;
case 'm':
sim_control_.vision = 1;
break;
case 'o':
sim_control_.term_update_hz = atof(optarg);
if (sim_control_.term_update_hz <= 0.) opt_err = 1;
break;
case 'r':
sim_control_.write_mat = 1;
if (optarg != NULL)
if (*optarg != '-')
strncpy(matname, optarg, MAX_FILE_NAME_LENGTH);
else
optind--;
break;
case 's':
data_rate = atof(optarg);
if (data_rate <= 0.) opt_err = -1;
break;
case 't':
sim_control_.write_tab = 1;
if (optarg != NULL)
if (*optarg != '-')
strncpy(tabname, optarg, MAX_FILE_NAME_LENGTH);
else
optind--;
break;
case 'x':
sim_control_.write_asc1 = 1;
if (optarg != NULL)
if (*optarg != '-')
strncpy(asc1name, optarg, MAX_FILE_NAME_LENGTH);
else
optind--;
break;
default:
opt_err = 1;
}
if (opt_err)
{
fprintf(stderr, "Usage: %s [-options]\n", progname);
fprintf(stderr, "\n");
fprintf(stderr, " where [-options] is zero or more of the following:\n");
fprintf(stderr, "\n");
fprintf(stderr, " [A|k] Run mode: [A]CES cockpit [default]\n");
fprintf(stderr, " or [k]eyboard\n");
fprintf(stderr, "\n");
fprintf(stderr, " [i <filename>] [i]nitial conditions filename\n");
fprintf(stderr, "\n");
fprintf(stderr, " [f <value>] Iteration rate [f]requency, Hz (default is %5.2f Hz)\n",
sim_control_.model_hz);
fprintf(stderr, "\n");
fprintf(stderr, " [o <value>] Display [o]utput frequency, Hz (default is %5.2f Hz)\n",
sim_control_.term_update_hz);
fprintf(stderr, "\n");
fprintf(stderr, " [s <value>] Data storage frequency, Hz (default is %5.2f Hz)\n",
data_rate);
fprintf(stderr, "\n");
fprintf(stderr, " [e <value>] [e]nd time in seconds (default %5.1f seconds)\n",
sim_control_.end_time);
fprintf(stderr, "\n");
fprintf(stderr, " [b <value>] circular time history storage [b]uffer size, in seconds \n");
fprintf(stderr, " (default %5.1f seconds) (normally same as end time)\n",
sim_control_.time_slices*sim_control_.save_spacing/
sim_control_.model_hz);
fprintf(stderr, "\n");
fprintf(stderr, " [atxr [<filename>]] Output: [a]gile-vu (default name: %s )\n", fltname);
fprintf(stderr, " and/or [t]ab delimited ( '' name: %s )\n", tabname);
fprintf(stderr, " and/or [x]plot (default name: %s)\n", asc1name);
fprintf(stderr, " and/or mat[r]ix script ( '' name: %s )\n", matname);
fprintf(stderr, "\n");
return OPT_ERR;
fprintf(stderr, "Usage: %s [-options]\n", progname);
fprintf(stderr, "\n");
fprintf(stderr, " where [-options] is zero or more of the following:\n");
fprintf(stderr, "\n");
fprintf(stderr, " [A|k] Run mode: [A]CES cockpit [default]\n");
fprintf(stderr, " or [k]eyboard\n");
fprintf(stderr, "\n");
fprintf(stderr, " [i <filename>] [i]nitial conditions filename\n");
fprintf(stderr, "\n");
fprintf(stderr, " [f <value>] Iteration rate [f]requency, Hz (default is %5.2f Hz)\n",
sim_control_.model_hz);
fprintf(stderr, "\n");
fprintf(stderr, " [o <value>] Display [o]utput frequency, Hz (default is %5.2f Hz)\n",
sim_control_.term_update_hz);
fprintf(stderr, "\n");
fprintf(stderr, " [s <value>] Data storage frequency, Hz (default is %5.2f Hz)\n",
data_rate);
fprintf(stderr, "\n");
fprintf(stderr, " [e <value>] [e]nd time in seconds (default %5.1f seconds)\n",
sim_control_.end_time);
fprintf(stderr, "\n");
fprintf(stderr, " [b <value>] circular time history storage [b]uffer size, in seconds \n");
fprintf(stderr, " (default %5.1f seconds) (normally same as end time)\n",
sim_control_.time_slices*sim_control_.save_spacing/
sim_control_.model_hz);
fprintf(stderr, "\n");
fprintf(stderr, " [atxr [<filename>]] Output: [a]gile-vu (default name: %s )\n", fltname);
fprintf(stderr, " and/or [t]ab delimited ( '' name: %s )\n", tabname);
fprintf(stderr, " and/or [x]plot (default name: %s)\n", asc1name);
fprintf(stderr, " and/or mat[r]ix script ( '' name: %s )\n", matname);
fprintf(stderr, "\n");
return OPT_ERR;
}
/* calculate additional controls */
@ -479,9 +479,9 @@ int ls_checkopts(argc, argv) /* check and set options flags */
if (sim_control_.save_spacing < 1) sim_control_.save_spacing = 1;
sim_control_.time_slices = buffer_time * sim_control_.model_hz /
sim_control_.save_spacing;
sim_control_.save_spacing;
if (sim_control_.time_slices < 2) sim_control_.time_slices = 2;
return OPT_OK;
}
#endif /* COMPILE_THIS_CODE_THIS_USELESS_CODE */
@ -527,13 +527,13 @@ int ls_cockpit( void ) {
int ls_toplevel_init(double dt, char * aircraft) {
model_dt = dt;
ls_setdefopts(); /* set default options */
ls_setdefopts(); /* set default options */
ls_stamp(); /* ID stamp; record time and date of run */
if (speedup == 0.0) {
fprintf(stderr, "%s: Cannot run with speedup of 0.\n", progname);
return 1;
fprintf(stderr, "%s: Cannot run with speedup of 0.\n", progname);
return 1;
}
/* printf("LS pre Init pos = %.2f\n", Latitude); */
@ -543,8 +543,8 @@ int ls_toplevel_init(double dt, char * aircraft) {
/* printf("LS post Init pos = %.2f\n", Latitude); */
if (speedup > 0) {
/* Initialize (get) cockpit (controls) settings */
ls_cockpit();
/* Initialize (get) cockpit (controls) settings */
ls_cockpit();
}
return(1);
@ -553,14 +553,14 @@ int ls_toplevel_init(double dt, char * aircraft) {
/* Run an iteration of the EOM (equations of motion) */
int ls_update(int multiloop) {
int i;
int i;
if (speedup > 0) {
ls_cockpit();
ls_cockpit();
}
for ( i = 0; i < multiloop; i++ ) {
ls_loop( model_dt, 0);
ls_loop( model_dt, 0);
}
return 1;

View file

@ -1,48 +1,48 @@
/***************************************************************************
TITLE: ls_matrix.c
TITLE: ls_matrix.c
----------------------------------------------------------------------------
FUNCTION: general real matrix routines; includes
gaussj() for matrix inversion using
Gauss-Jordan method with full pivoting.
The routines in this module have come more or less from ref [1].
Note that, probably due to the heritage of ref [1] (which has a
FORTRAN version that was probably written first), the use of 1 as
the first element of an array (or vector) is used. This is accomplished
in memory by allocating, but not using, the 0 elements in each dimension.
While this wastes some memory, it allows the routines to be ported more
easily from FORTRAN (I suspect) as well as adhering to conventional
matrix notation. As a result, however, traditional ANSI C convention
(0-base indexing) is not followed; as the authors of ref [1] point out,
there is some question of the portability of the resulting routines
which sometimes access negative indexes. See ref [1] for more details.
FUNCTION: general real matrix routines; includes
gaussj() for matrix inversion using
Gauss-Jordan method with full pivoting.
The routines in this module have come more or less from ref [1].
Note that, probably due to the heritage of ref [1] (which has a
FORTRAN version that was probably written first), the use of 1 as
the first element of an array (or vector) is used. This is accomplished
in memory by allocating, but not using, the 0 elements in each dimension.
While this wastes some memory, it allows the routines to be ported more
easily from FORTRAN (I suspect) as well as adhering to conventional
matrix notation. As a result, however, traditional ANSI C convention
(0-base indexing) is not followed; as the authors of ref [1] point out,
there is some question of the portability of the resulting routines
which sometimes access negative indexes. See ref [1] for more details.
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 950222 E. B. Jackson
GENEALOGY: Created 950222 E. B. Jackson
----------------------------------------------------------------------------
DESIGNED BY: from Numerical Recipes in C, by Press, et. al.
CODED BY: Bruce Jackson
MAINTAINED BY:
DESIGNED BY: from Numerical Recipes in C, by Press, et. al.
CODED BY: Bruce Jackson
MAINTAINED BY:
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
CURRENT RCS HEADER:
MODIFICATION HISTORY:
DATE PURPOSE BY
CURRENT RCS HEADER:
$Header$
$Log$
@ -68,24 +68,24 @@ Initial revision.
----------------------------------------------------------------------------
REFERENCES: [1] Press, William H., et. al, Numerical Recipes in
C, 2nd edition, Cambridge University Press, 1992
REFERENCES: [1] Press, William H., et. al, Numerical Recipes in
C, 2nd edition, Cambridge University Press, 1992
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
@ -129,10 +129,10 @@ double **nr_matrix(long nrl, long nrh, long ncl, long nch)
m=(double **) malloc((size_t)((nrow+NR_END)*sizeof(double*)));
if (!m)
{
fprintf(stderr, "Memory failure in routine 'nr_matrix'.\n");
exit(1);
}
{
fprintf(stderr, "Memory failure in routine 'nr_matrix'.\n");
exit(1);
}
m += NR_END;
m -= nrl;
@ -140,10 +140,10 @@ double **nr_matrix(long nrl, long nrh, long ncl, long nch)
/* allocate rows and set pointers to them */
m[nrl] = (double *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double)));
if (!m[nrl])
{
fprintf(stderr, "Memory failure in routine 'matrix'\n");
exit(1);
}
{
fprintf(stderr, "Memory failure in routine 'matrix'\n");
exit(1);
}
m[nrl] += NR_END;
m[nrl] -= ncl;
@ -179,38 +179,38 @@ int nr_gaussj(double **a, int n, double **b, int m)
/* Note: this routine modified by EBJ to make b optional, if m == 0 */
{
int *indxc, *indxr, *ipiv;
int i, icol = 0, irow = 0, j, k, l, ll;
int *indxc, *indxr, *ipiv;
int i, icol = 0, irow = 0, j, k, l, ll;
double big, dum, pivinv, temp;
int bexists = ((m != 0) || (b == 0));
int bexists = ((m != 0) || (b == 0));
indxc = nr_ivector(1,n); /* The integer arrays ipiv, indxr, and */
indxr = nr_ivector(1,n); /* indxc are used for pivot bookkeeping */
indxc = nr_ivector(1,n); /* The integer arrays ipiv, indxr, and */
indxr = nr_ivector(1,n); /* indxc are used for pivot bookkeeping */
ipiv = nr_ivector(1,n);
for (j=1;j<=n;j++) ipiv[j] = 0;
for (i=1;i<=n;i++) /* This is the main loop over columns */
{
big = 0.0;
for (j=1;j<=n;j++) /* This is outer loop of pivot search */
if (ipiv[j] != 1)
for (k=1;k<=n;k++)
{
if (ipiv[k] == 0)
{
if (fabs(a[j][k]) >= big)
{
big = fabs(a[j][k]);
irow = j;
icol = k;
}
}
else
if (ipiv[k] > 1) return -1;
}
++(ipiv[icol]);
for (i=1;i<=n;i++) /* This is the main loop over columns */
{
big = 0.0;
for (j=1;j<=n;j++) /* This is outer loop of pivot search */
if (ipiv[j] != 1)
for (k=1;k<=n;k++)
{
if (ipiv[k] == 0)
{
if (fabs(a[j][k]) >= big)
{
big = fabs(a[j][k]);
irow = j;
icol = k;
}
}
else
if (ipiv[k] > 1) return -1;
}
++(ipiv[icol]);
/* We now have the pivot element, so we interchange rows, if needed, */
/* to put the pivot element on the diagonal. The columns are not */
@ -221,45 +221,45 @@ int nr_gaussj(double **a, int n, double **b, int m)
/* this form of bookkeeping, the solution b's will end up in the correct */
/* order, and the inverse matrix will be scrambed by columns. */
if (irow != icol)
{
/* for (l=1;1<=n;l++) SWAP(a[irow][l],a[icol][l]) */
for (l=1;l<=n;l++)
{
temp=a[irow][l];
a[irow][l]=a[icol][l];
a[icol][l]=temp;
}
if (bexists) for (l=1;l<=m;l++) SWAP(b[irow][l],b[icol][l])
}
indxr[i] = irow; /* We are now ready to divide the pivot row */
indxc[i] = icol; /* by the pivot element, a[irow][icol] */
if (a[icol][icol] == 0.0) return -1;
pivinv = 1.0/a[icol][icol];
a[icol][icol] = 1.0;
for (l=1;l<=n;l++) a[icol][l] *= pivinv;
if (bexists) for (l=1;l<=m;l++) b[icol][l] *= pivinv;
for (ll=1;ll<=n;ll++) /* Next, we reduce the rows... */
if (ll != icol ) /* .. except for the pivot one */
{
dum = a[ll][icol];
a[ll][icol] = 0.0;
for (l=1;l<=n;l++) a[ll][l] -= a[icol][l]*dum;
if (bexists) for (l=1;l<=m;l++) b[ll][i] -= b[icol][l]*dum;
}
}
if (irow != icol)
{
/* for (l=1;1<=n;l++) SWAP(a[irow][l],a[icol][l]) */
for (l=1;l<=n;l++)
{
temp=a[irow][l];
a[irow][l]=a[icol][l];
a[icol][l]=temp;
}
if (bexists) for (l=1;l<=m;l++) SWAP(b[irow][l],b[icol][l])
}
indxr[i] = irow; /* We are now ready to divide the pivot row */
indxc[i] = icol; /* by the pivot element, a[irow][icol] */
if (a[icol][icol] == 0.0) return -1;
pivinv = 1.0/a[icol][icol];
a[icol][icol] = 1.0;
for (l=1;l<=n;l++) a[icol][l] *= pivinv;
if (bexists) for (l=1;l<=m;l++) b[icol][l] *= pivinv;
for (ll=1;ll<=n;ll++) /* Next, we reduce the rows... */
if (ll != icol ) /* .. except for the pivot one */
{
dum = a[ll][icol];
a[ll][icol] = 0.0;
for (l=1;l<=n;l++) a[ll][l] -= a[icol][l]*dum;
if (bexists) for (l=1;l<=m;l++) b[ll][i] -= b[icol][l]*dum;
}
}
/* This is the end of the mail loop over columns of the reduction. It
only remains to unscrambled the solution in view of the column
interchanges. We do this by interchanging pairs of columns in
the reverse order that the permutation was built up. */
for (l=n;l>=1;l--)
{
if (indxr[l] != indxc[l])
for (k=1;k<=n;k++)
SWAP(a[k][indxr[l]],a[k][indxc[l]])
}
{
if (indxr[l] != indxc[l])
for (k=1;k<=n;k++)
SWAP(a[k][indxr[l]],a[k][indxc[l]])
}
/* and we are done */
@ -267,35 +267,35 @@ int nr_gaussj(double **a, int n, double **b, int m)
nr_free_ivector(indxr,1 /*,n*/ );
nr_free_ivector(indxc,1 /*,n*/ );
return 0; /* indicate success */
return 0; /* indicate success */
}
void nr_copymat(double **orig, int n, double **copy)
/* overwrites matrix 'copy' with copy of matrix 'orig' */
{
long i, j;
if ((orig==0)||(copy==0)||(n==0)) return;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
copy[i][j] = orig[i][j];
long i, j;
if ((orig==0)||(copy==0)||(n==0)) return;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
copy[i][j] = orig[i][j];
}
void nr_multmat(double **m1, int n, double **m2, double **prod)
{
long i, j, k;
if ((m1==0)||(m2==0)||(prod==0)||(n==0)) return;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
prod[i][j] = 0.0;
for(k=1;k<=n;k++) prod[i][j] += m1[i][k]*m2[k][j];
}
long i, j, k;
if ((m1==0)||(m2==0)||(prod==0)||(n==0)) return;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
prod[i][j] = 0.0;
for(k=1;k<=n;k++) prod[i][j] += m1[i][k]*m2[k][j];
}
}
void nr_printmat(double **a, int n)
@ -305,9 +305,9 @@ void nr_printmat(double **a, int n)
printf("\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("% 9.4f ", a[i][j]);
printf("\n");
for(j=1;j<=n;j++)
printf("% 9.4f ", a[i][j]);
printf("\n");
}
printf("\n");
@ -329,32 +329,32 @@ void testmat( void ) /* main() for test purposes */
/* for(i=1;i<=n;i++) mat1[i][i]= 5.0; */
for(loop=0;loop<maxloop;loop++)
{
if (loop != 0)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
mat1[i][j] = 2.0 - 4.0*invmaxlong*(double) rand();
for(loop=0;loop<maxloop;loop++)
{
if (loop != 0)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
mat1[i][j] = 2.0 - 4.0*invmaxlong*(double) rand();
printf("Original matrix:\n");
nr_printmat( mat1, n );
nr_copymat( mat1, n, mat2 );
i = nr_gaussj( mat2, n, 0, 0 );
if (i) printf("Singular matrix.\n");
printf("Inverted matrix:\n");
nr_printmat( mat2, n );
nr_multmat( mat1, n, mat2, mat3 );
printf("Original multiplied by inverse:\n");
nr_printmat( mat3, n );
if (loop < maxloop-1) /* sleep(1) */;
}
printf("Original matrix:\n");
nr_printmat( mat1, n );
nr_copymat( mat1, n, mat2 );
i = nr_gaussj( mat2, n, 0, 0 );
if (i) printf("Singular matrix.\n");
printf("Inverted matrix:\n");
nr_printmat( mat2, n );
nr_multmat( mat1, n, mat2, mat3 );
printf("Original multiplied by inverse:\n");
nr_printmat( mat3, n );
if (loop < maxloop-1) /* sleep(1) */;
}
nr_free_matrix( mat1, 1, n, 1, n );
nr_free_matrix( mat2, 1, n, 1, n );

View file

@ -1,46 +1,46 @@
/***************************************************************************
TITLE: ls_matrix.h
TITLE: ls_matrix.h
----------------------------------------------------------------------------
FUNCTION: Header file for general real matrix routines.
The routines in this module have come more or less from ref [1].
Note that, probably due to the heritage of ref [1] (which has a
FORTRAN version that was probably written first), the use of 1 as
the first element of an array (or vector) is used. This is accomplished
in memory by allocating, but not using, the 0 elements in each dimension.
While this wastes some memory, it allows the routines to be ported more
easily from FORTRAN (I suspect) as well as adhering to conventional
matrix notation. As a result, however, traditional ANSI C convention
(0-base indexing) is not followed; as the authors of ref [1] point out,
there is some question of the portability of the resulting routines
which sometimes access negative indexes. See ref [1] for more details.
FUNCTION: Header file for general real matrix routines.
The routines in this module have come more or less from ref [1].
Note that, probably due to the heritage of ref [1] (which has a
FORTRAN version that was probably written first), the use of 1 as
the first element of an array (or vector) is used. This is accomplished
in memory by allocating, but not using, the 0 elements in each dimension.
While this wastes some memory, it allows the routines to be ported more
easily from FORTRAN (I suspect) as well as adhering to conventional
matrix notation. As a result, however, traditional ANSI C convention
(0-base indexing) is not followed; as the authors of ref [1] point out,
there is some question of the portability of the resulting routines
which sometimes access negative indexes. See ref [1] for more details.
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 950222 E. B. Jackson
GENEALOGY: Created 950222 E. B. Jackson
----------------------------------------------------------------------------
DESIGNED BY: from Numerical Recipes in C, by Press, et. al.
CODED BY: Bruce Jackson
MAINTAINED BY:
DESIGNED BY: from Numerical Recipes in C, by Press, et. al.
CODED BY: Bruce Jackson
MAINTAINED BY:
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
CURRENT RCS HEADER:
MODIFICATION HISTORY:
DATE PURPOSE BY
CURRENT RCS HEADER:
$Header$
$Log$
@ -62,24 +62,24 @@ Initial revision.
----------------------------------------------------------------------------
REFERENCES: [1] Press, William H., et. al, Numerical Recipes in
C, 2nd edition, Cambridge University Press, 1992
REFERENCES: [1] Press, William H., et. al, Numerical Recipes in
C, 2nd edition, Cambridge University Press, 1992
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include <stdlib.h>

View file

@ -1,40 +1,40 @@
/***************************************************************************
TITLE: ls_model()
TITLE: ls_model()
----------------------------------------------------------------------------
FUNCTION: Model loop executive
FUNCTION: Model loop executive
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 15 October 1992 as part of LaRCSIM project
by Bruce Jackson.
GENEALOGY: Created 15 October 1992 as part of LaRCSIM project
by Bruce Jackson.
----------------------------------------------------------------------------
DESIGNED BY: Bruce Jackson
CODED BY: Bruce Jackson
MAINTAINED BY: maintainer
DESIGNED BY: Bruce Jackson
CODED BY: Bruce Jackson
MAINTAINED BY: maintainer
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
950306 Added parameters to call: dt, which is the step size
to be taken this loop (caution: may vary from call to call)
and Initialize, which if non-zero, implies an initialization
is requested. EBJ
950306 Added parameters to call: dt, which is the step size
to be taken this loop (caution: may vary from call to call)
and Initialize, which if non-zero, implies an initialization
is requested. EBJ
CURRENT RCS HEADER INFO:
CURRENT RCS HEADER INFO:
$Header$
$Log$
Revision 1.5 2005/12/19 12:53:21 ehofman
@ -140,23 +140,23 @@ Initial Flight Gear revision.
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY: ls_step (in initialization), ls_loop (planned)
CALLED BY: ls_step (in initialization), ls_loop (planned)
----------------------------------------------------------------------------
CALLS TO: aero(), engine(), gear()
CALLS TO: aero(), engine(), gear()
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include <stdio.h>

View file

@ -1,42 +1,42 @@
/***************************************************************************
TITLE: ls_sim_control.h
TITLE: ls_sim_control.h
----------------------------------------------------------------------------
FUNCTION: LaRCSim simulation control parameters header file
FUNCTION: LaRCSim simulation control parameters header file
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 18 DEC 1993 by Bruce Jackson
GENEALOGY: Created 18 DEC 1993 by Bruce Jackson
----------------------------------------------------------------------------
DESIGNED BY: B. Jackson
CODED BY: B. Jackson
MAINTAINED BY: guess who
DESIGNED BY: B. Jackson
CODED BY: B. Jackson
MAINTAINED BY: guess who
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
940204 Added "overrun" flag to indicate non-real-time frame.
940210 Added "vision" flag to indicate use of shared memory.
940513 Added "max_tape_channels" and "max_time_slices" EBJ
950308 Increased size of time_stamp and date_string to include
terminating null char. EBJ
950314 Addedf "paused" flag to make this global (was local to
ls_cockpit routine). EBJ
950406 Removed tape_channels parameter, and added end_time, model_hz,
and term_update_hz parameters. EBJ
MODIFICATION HISTORY:
DATE PURPOSE BY
940204 Added "overrun" flag to indicate non-real-time frame.
940210 Added "vision" flag to indicate use of shared memory.
940513 Added "max_tape_channels" and "max_time_slices" EBJ
950308 Increased size of time_stamp and date_string to include
terminating null char. EBJ
950314 Addedf "paused" flag to make this global (was local to
ls_cockpit routine). EBJ
950406 Removed tape_channels parameter, and added end_time, model_hz,
and term_update_hz parameters. EBJ
$Header$
$Log$
@ -79,7 +79,7 @@ Initial Flight Gear revision.
* Modified write_cmp2 flag to write_asc1 flag, since XPLOT 4.00 doesn't
* support cmp2. Also added RCS header and log entries in header.
*
--------------------------------------------------------------------------*/
@ -95,37 +95,37 @@ Initial Flight Gear revision.
typedef struct {
enum { batch, terminal, GLmouse, cockpit } sim_type;
char simname[64]; /* name of simulation */
int run_number; /* run number of this session */
char date_string[7]; /* like "931220" */
char time_stamp[9]; /* like "13:00:00" */
char simname[64]; /* name of simulation */
int run_number; /* run number of this session */
char date_string[7]; /* like "931220" */
char time_stamp[9]; /* like "13:00:00" */
#ifdef COMPILE_THIS_CODE_THIS_USELESS_CODE
char userid[L_cuserid]; /* who is running this sim */
#endif /* COMPILE_THIS_CODE_THIS_USELESS_CODE */
long time_slices; /* number of points that can be recorded (circ buff) */
int write_av; /* will be writing out an Agile_VU file after run */
int write_mat; /* will be writing out a matrix script of session */
int write_tab; /* will be writing out a tab-delimited time history */
int write_asc1; /* will be writing out a GetData ASCII 1 file */
int save_spacing; /* spacing between data points when recording
data to memory; 0 = every point, 1 = every
other point; 2 = every fourth point, etc. */
int write_spacing; /* spacing between data points when writing
output files; 0 = every point, 1 = every
other point; 2 = every fourth point, etc. */
int overrun; /* indicates, if non-zero, a frame overrun
occurred in the previous frame. Suitable for
setting a display flag or writing an error
message. */
int vision; /* indicates, if non-zero, marriage to LaRC VISION
software (developed A. Dare and J. Burley of the
former Cockpit Technologies Branch) */
int debug; /* indicates, if non-zero, to operate in debug mode
which implies disable double-buffering and synch.
attempts to avoid errors */
int paused; /* indicates simulation is paused */
float end_time; /* end of simulation run value */
float model_hz; /* current inner loop frame rate */
long time_slices; /* number of points that can be recorded (circ buff) */
int write_av; /* will be writing out an Agile_VU file after run */
int write_mat; /* will be writing out a matrix script of session */
int write_tab; /* will be writing out a tab-delimited time history */
int write_asc1; /* will be writing out a GetData ASCII 1 file */
int save_spacing; /* spacing between data points when recording
data to memory; 0 = every point, 1 = every
other point; 2 = every fourth point, etc. */
int write_spacing; /* spacing between data points when writing
output files; 0 = every point, 1 = every
other point; 2 = every fourth point, etc. */
int overrun; /* indicates, if non-zero, a frame overrun
occurred in the previous frame. Suitable for
setting a display flag or writing an error
message. */
int vision; /* indicates, if non-zero, marriage to LaRC VISION
software (developed A. Dare and J. Burley of the
former Cockpit Technologies Branch) */
int debug; /* indicates, if non-zero, to operate in debug mode
which implies disable double-buffering and synch.
attempts to avoid errors */
int paused; /* indicates simulation is paused */
float end_time; /* end of simulation run value */
float model_hz; /* current inner loop frame rate */
float term_update_hz; /* current terminal refresh frequency */
} SIM_CONTROL;

View file

@ -1,52 +1,52 @@
/***************************************************************************
TITLE: ls_step
TITLE: ls_step
----------------------------------------------------------------------------
FUNCTION: Integration routine for equations of motion
(vehicle states)
FUNCTION: Integration routine for equations of motion
(vehicle states)
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Written 920802 by Bruce Jackson. Based upon equations
given in reference [1] and a Matrix-X/System Build block
diagram model of equations of motion coded by David Raney
at NASA-Langley in June of 1992.
GENEALOGY: Written 920802 by Bruce Jackson. Based upon equations
given in reference [1] and a Matrix-X/System Build block
diagram model of equations of motion coded by David Raney
at NASA-Langley in June of 1992.
----------------------------------------------------------------------------
DESIGNED BY: Bruce Jackson
CODED BY: Bruce Jackson
MAINTAINED BY:
DESIGNED BY: Bruce Jackson
CODED BY: Bruce Jackson
MAINTAINED BY:
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
921223 Modified calculation of Phi and Psi to use the "atan2" routine
rather than the "atan" to allow full circular angles.
"atan" limits to +/- pi/2. EBJ
940111 Changed from oldstyle include file ls_eom.h; also changed
from DATA to SCALAR type. EBJ
921223 Modified calculation of Phi and Psi to use the "atan2" routine
rather than the "atan" to allow full circular angles.
"atan" limits to +/- pi/2. EBJ
940111 Changed from oldstyle include file ls_eom.h; also changed
from DATA to SCALAR type. EBJ
950207 Initialized Alpha_dot and Beta_dot to zero on first pass; calculated
thereafter. EBJ
950207 Initialized Alpha_dot and Beta_dot to zero on first pass; calculated
thereafter. EBJ
950224 Added logic to avoid adding additional increment to V_east
in case V_east already accounts for rotating earth.
EBJ
950224 Added logic to avoid adding additional increment to V_east
in case V_east already accounts for rotating earth.
EBJ
CURRENT RCS HEADER:
CURRENT RCS HEADER:
$Header$
$Log$
@ -268,32 +268,32 @@ Initial Flight Gear revision.
----------------------------------------------------------------------------
REFERENCES:
[ 1] McFarland, Richard E.: "A Standard Kinematic Model
for Flight Simulation at NASA-Ames", NASA CR-2497,
January 1975
[ 2] ANSI/AIAA R-004-1992 "Recommended Practice: Atmos-
pheric and Space Flight Vehicle Coordinate Systems",
February 1992
REFERENCES:
[ 1] McFarland, Richard E.: "A Standard Kinematic Model
for Flight Simulation at NASA-Ames", NASA CR-2497,
January 1975
[ 2] ANSI/AIAA R-004-1992 "Recommended Practice: Atmos-
pheric and Space Flight Vehicle Coordinate Systems",
February 1992
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO: None.
CALLS TO: None.
----------------------------------------------------------------------------
INPUTS: State derivatives
INPUTS: State derivatives
----------------------------------------------------------------------------
OUTPUTS: States
OUTPUTS: States
--------------------------------------------------------------------------*/
@ -312,8 +312,8 @@ Initial Flight Gear revision.
/* #include "ls_sim_control.h" */
#include <math.h>
extern Model current_model; /* defined in ls_model.c */
extern SCALAR Simtime; /* defined in ls_main.c */
extern Model current_model; /* defined in ls_model.c */
extern SCALAR Simtime; /* defined in ls_main.c */
void uiuc_init_vars() {
static int init = 0;
@ -328,102 +328,102 @@ void uiuc_init_vars() {
void ls_step( SCALAR dt, int Initialize ) {
static int inited = 0;
SCALAR dth;
static SCALAR v_dot_north_past, v_dot_east_past, v_dot_down_past;
static SCALAR latitude_dot_past, longitude_dot_past, radius_dot_past;
static SCALAR p_dot_body_past, q_dot_body_past, r_dot_body_past;
SCALAR p_local_in_body, q_local_in_body, r_local_in_body;
SCALAR epsilon, inv_eps, local_gnd_veast;
SCALAR e_dot_0, e_dot_1, e_dot_2, e_dot_3;
static SCALAR e_0, e_1, e_2, e_3;
static SCALAR e_dot_0_past, e_dot_1_past, e_dot_2_past, e_dot_3_past;
SCALAR cos_Lat_geocentric, inv_Radius_to_vehicle;
static int inited = 0;
SCALAR dth;
static SCALAR v_dot_north_past, v_dot_east_past, v_dot_down_past;
static SCALAR latitude_dot_past, longitude_dot_past, radius_dot_past;
static SCALAR p_dot_body_past, q_dot_body_past, r_dot_body_past;
SCALAR p_local_in_body, q_local_in_body, r_local_in_body;
SCALAR epsilon, inv_eps, local_gnd_veast;
SCALAR e_dot_0, e_dot_1, e_dot_2, e_dot_3;
static SCALAR e_0, e_1, e_2, e_3;
static SCALAR e_dot_0_past, e_dot_1_past, e_dot_2_past, e_dot_3_past;
SCALAR cos_Lat_geocentric, inv_Radius_to_vehicle;
/* I N I T I A L I Z A T I O N */
if ( (inited == 0) || (Initialize != 0) )
{
if ( (inited == 0) || (Initialize != 0) )
{
/* Set past values to zero */
v_dot_north_past = v_dot_east_past = v_dot_down_past = 0;
latitude_dot_past = longitude_dot_past = radius_dot_past = 0;
p_dot_body_past = q_dot_body_past = r_dot_body_past = 0;
e_dot_0_past = e_dot_1_past = e_dot_2_past = e_dot_3_past = 0;
v_dot_north_past = v_dot_east_past = v_dot_down_past = 0;
latitude_dot_past = longitude_dot_past = radius_dot_past = 0;
p_dot_body_past = q_dot_body_past = r_dot_body_past = 0;
e_dot_0_past = e_dot_1_past = e_dot_2_past = e_dot_3_past = 0;
/* Initialize geocentric position from geodetic latitude and altitude */
ls_geod_to_geoc( Latitude, Altitude, &Sea_level_radius, &Lat_geocentric);
Earth_position_angle = 0;
Lon_geocentric = Longitude;
Radius_to_vehicle = Altitude + Sea_level_radius;
ls_geod_to_geoc( Latitude, Altitude, &Sea_level_radius, &Lat_geocentric);
Earth_position_angle = 0;
Lon_geocentric = Longitude;
Radius_to_vehicle = Altitude + Sea_level_radius;
/* Correct eastward velocity to account for earths' rotation, if necessary */
local_gnd_veast = OMEGA_EARTH*Sea_level_radius*cos(Lat_geocentric);
if( fabs(V_east - V_east_rel_ground) < 0.8*local_gnd_veast )
V_east = V_east + local_gnd_veast;
local_gnd_veast = OMEGA_EARTH*Sea_level_radius*cos(Lat_geocentric);
if( fabs(V_east - V_east_rel_ground) < 0.8*local_gnd_veast )
V_east = V_east + local_gnd_veast;
/* Initialize quaternions and transformation matrix from Euler angles */
// Initialize UIUC aircraft model
if (current_model == UIUC) {
uiuc_init_2_wrapper();
// Initialize UIUC aircraft model
if (current_model == UIUC) {
uiuc_init_2_wrapper();
}
e_0 = cos(Psi*0.5)*cos(Theta*0.5)*cos(Phi*0.5)
+ sin(Psi*0.5)*sin(Theta*0.5)*sin(Phi*0.5);
e_1 = cos(Psi*0.5)*cos(Theta*0.5)*sin(Phi*0.5)
- sin(Psi*0.5)*sin(Theta*0.5)*cos(Phi*0.5);
e_2 = cos(Psi*0.5)*sin(Theta*0.5)*cos(Phi*0.5)
+ sin(Psi*0.5)*cos(Theta*0.5)*sin(Phi*0.5);
e_3 =-cos(Psi*0.5)*sin(Theta*0.5)*sin(Phi*0.5)
+ sin(Psi*0.5)*cos(Theta*0.5)*cos(Phi*0.5);
T_local_to_body_11 = e_0*e_0 + e_1*e_1 - e_2*e_2 - e_3*e_3;
T_local_to_body_12 = 2*(e_1*e_2 + e_0*e_3);
T_local_to_body_13 = 2*(e_1*e_3 - e_0*e_2);
T_local_to_body_21 = 2*(e_1*e_2 - e_0*e_3);
T_local_to_body_22 = e_0*e_0 - e_1*e_1 + e_2*e_2 - e_3*e_3;
T_local_to_body_23 = 2*(e_2*e_3 + e_0*e_1);
T_local_to_body_31 = 2*(e_1*e_3 + e_0*e_2);
T_local_to_body_32 = 2*(e_2*e_3 - e_0*e_1);
T_local_to_body_33 = e_0*e_0 - e_1*e_1 - e_2*e_2 + e_3*e_3;
e_0 = cos(Psi*0.5)*cos(Theta*0.5)*cos(Phi*0.5)
+ sin(Psi*0.5)*sin(Theta*0.5)*sin(Phi*0.5);
e_1 = cos(Psi*0.5)*cos(Theta*0.5)*sin(Phi*0.5)
- sin(Psi*0.5)*sin(Theta*0.5)*cos(Phi*0.5);
e_2 = cos(Psi*0.5)*sin(Theta*0.5)*cos(Phi*0.5)
+ sin(Psi*0.5)*cos(Theta*0.5)*sin(Phi*0.5);
e_3 =-cos(Psi*0.5)*sin(Theta*0.5)*sin(Phi*0.5)
+ sin(Psi*0.5)*cos(Theta*0.5)*cos(Phi*0.5);
T_local_to_body_11 = e_0*e_0 + e_1*e_1 - e_2*e_2 - e_3*e_3;
T_local_to_body_12 = 2*(e_1*e_2 + e_0*e_3);
T_local_to_body_13 = 2*(e_1*e_3 - e_0*e_2);
T_local_to_body_21 = 2*(e_1*e_2 - e_0*e_3);
T_local_to_body_22 = e_0*e_0 - e_1*e_1 + e_2*e_2 - e_3*e_3;
T_local_to_body_23 = 2*(e_2*e_3 + e_0*e_1);
T_local_to_body_31 = 2*(e_1*e_3 + e_0*e_2);
T_local_to_body_32 = 2*(e_2*e_3 - e_0*e_1);
T_local_to_body_33 = e_0*e_0 - e_1*e_1 - e_2*e_2 + e_3*e_3;
// Initialize local velocities (V_north, V_east, V_down)
// based on transformation matrix calculated above
if (current_model == UIUC) {
uiuc_local_vel_init();
}
// Initialize local velocities (V_north, V_east, V_down)
// based on transformation matrix calculated above
if (current_model == UIUC) {
uiuc_local_vel_init();
}
/* Calculate local gravitation acceleration */
/* Calculate local gravitation acceleration */
ls_gravity( Radius_to_vehicle, Lat_geocentric, &Gravity );
ls_gravity( Radius_to_vehicle, Lat_geocentric, &Gravity );
/* Initialize vehicle model */
/* Initialize vehicle model */
ls_aux();
ls_model(0.0, 0);
ls_aux();
ls_model(0.0, 0);
/* Calculate initial accelerations */
/* Calculate initial accelerations */
ls_accel();
ls_accel();
/* Initialize auxiliary variables */
ls_aux();
Std_Alpha_dot = 0.;
Std_Beta_dot = 0.;
ls_aux();
Std_Alpha_dot = 0.;
Std_Beta_dot = 0.;
/* set flag; disable integrators */
inited = -1;
dt = 0.0;
}
inited = -1;
dt = 0.0;
}
/* Update time */
dth = 0.5*dt;
Simtime = Simtime + dt;
dth = 0.5*dt;
Simtime = Simtime + dt;
/* L I N E A R V E L O C I T I E S */
@ -446,12 +446,12 @@ void ls_step( SCALAR dt, int Initialize ) {
cos_Lat_geocentric = cos(Lat_geocentric);
if ( cos_Lat_geocentric != 0) {
Longitude_dot = V_east/(Radius_to_vehicle*cos_Lat_geocentric);
Longitude_dot = V_east/(Radius_to_vehicle*cos_Lat_geocentric);
}
Latitude_dot = V_north*inv_Radius_to_vehicle;
Radius_dot = -V_down;
/* A N G U L A R V E L O C I T I E S A N D P O S I T I O N S */
/* Integrate rotational accelerations to get velocities */
@ -493,74 +493,74 @@ void ls_step( SCALAR dt, int Initialize ) {
/* Integrate using trapezoidal as before */
e_0 = e_0 + dth*(e_dot_0 + e_dot_0_past);
e_1 = e_1 + dth*(e_dot_1 + e_dot_1_past);
e_2 = e_2 + dth*(e_dot_2 + e_dot_2_past);
e_3 = e_3 + dth*(e_dot_3 + e_dot_3_past);
e_0 = e_0 + dth*(e_dot_0 + e_dot_0_past);
e_1 = e_1 + dth*(e_dot_1 + e_dot_1_past);
e_2 = e_2 + dth*(e_dot_2 + e_dot_2_past);
e_3 = e_3 + dth*(e_dot_3 + e_dot_3_past);
/* calculate orthagonality correction - scale quaternion to unity length */
epsilon = sqrt(e_0*e_0 + e_1*e_1 + e_2*e_2 + e_3*e_3);
inv_eps = 1/epsilon;
e_0 = inv_eps*e_0;
e_1 = inv_eps*e_1;
e_2 = inv_eps*e_2;
e_3 = inv_eps*e_3;
epsilon = sqrt(e_0*e_0 + e_1*e_1 + e_2*e_2 + e_3*e_3);
inv_eps = 1/epsilon;
e_0 = inv_eps*e_0;
e_1 = inv_eps*e_1;
e_2 = inv_eps*e_2;
e_3 = inv_eps*e_3;
/* Save past values */
e_dot_0_past = e_dot_0;
e_dot_1_past = e_dot_1;
e_dot_2_past = e_dot_2;
e_dot_3_past = e_dot_3;
e_dot_0_past = e_dot_0;
e_dot_1_past = e_dot_1;
e_dot_2_past = e_dot_2;
e_dot_3_past = e_dot_3;
/* Update local to body transformation matrix */
T_local_to_body_11 = e_0*e_0 + e_1*e_1 - e_2*e_2 - e_3*e_3;
T_local_to_body_12 = 2*(e_1*e_2 + e_0*e_3);
T_local_to_body_13 = 2*(e_1*e_3 - e_0*e_2);
T_local_to_body_21 = 2*(e_1*e_2 - e_0*e_3);
T_local_to_body_22 = e_0*e_0 - e_1*e_1 + e_2*e_2 - e_3*e_3;
T_local_to_body_23 = 2*(e_2*e_3 + e_0*e_1);
T_local_to_body_31 = 2*(e_1*e_3 + e_0*e_2);
T_local_to_body_32 = 2*(e_2*e_3 - e_0*e_1);
T_local_to_body_33 = e_0*e_0 - e_1*e_1 - e_2*e_2 + e_3*e_3;
T_local_to_body_11 = e_0*e_0 + e_1*e_1 - e_2*e_2 - e_3*e_3;
T_local_to_body_12 = 2*(e_1*e_2 + e_0*e_3);
T_local_to_body_13 = 2*(e_1*e_3 - e_0*e_2);
T_local_to_body_21 = 2*(e_1*e_2 - e_0*e_3);
T_local_to_body_22 = e_0*e_0 - e_1*e_1 + e_2*e_2 - e_3*e_3;
T_local_to_body_23 = 2*(e_2*e_3 + e_0*e_1);
T_local_to_body_31 = 2*(e_1*e_3 + e_0*e_2);
T_local_to_body_32 = 2*(e_2*e_3 - e_0*e_1);
T_local_to_body_33 = e_0*e_0 - e_1*e_1 - e_2*e_2 + e_3*e_3;
/* Calculate Euler angles */
Theta = asin( -T_local_to_body_13 );
Theta = asin( -T_local_to_body_13 );
if( T_local_to_body_11 == 0 )
Psi = 0;
else
Psi = atan2( T_local_to_body_12, T_local_to_body_11 );
if( T_local_to_body_11 == 0 )
Psi = 0;
else
Psi = atan2( T_local_to_body_12, T_local_to_body_11 );
if( T_local_to_body_33 == 0 )
Phi = 0;
else
Phi = atan2( T_local_to_body_23, T_local_to_body_33 );
if( T_local_to_body_33 == 0 )
Phi = 0;
else
Phi = atan2( T_local_to_body_23, T_local_to_body_33 );
/* Resolve Psi to 0 - 359.9999 */
if (Psi < 0 ) Psi = Psi + 2*LS_PI;
if (Psi < 0 ) Psi = Psi + 2*LS_PI;
/* L I N E A R P O S I T I O N S */
/* Trapezoidal acceleration for position */
Lat_geocentric = Lat_geocentric + dth*(Latitude_dot + latitude_dot_past );
Lon_geocentric = Lon_geocentric + dth*(Longitude_dot + longitude_dot_past);
Radius_to_vehicle = Radius_to_vehicle + dth*(Radius_dot + radius_dot_past );
Earth_position_angle = Earth_position_angle + dt*OMEGA_EARTH;
Lat_geocentric = Lat_geocentric + dth*(Latitude_dot + latitude_dot_past );
Lon_geocentric = Lon_geocentric + dth*(Longitude_dot + longitude_dot_past);
Radius_to_vehicle = Radius_to_vehicle + dth*(Radius_dot + radius_dot_past );
Earth_position_angle = Earth_position_angle + dt*OMEGA_EARTH;
/* Save past values */
latitude_dot_past = Latitude_dot;
longitude_dot_past = Longitude_dot;
radius_dot_past = Radius_dot;
latitude_dot_past = Latitude_dot;
longitude_dot_past = Longitude_dot;
radius_dot_past = Radius_dot;
/* end of ls_step */
}
/*************************************************************************/

View file

@ -5,7 +5,7 @@
#define _LS_STEP_H
void ls_step( SCALAR dt, int Initialize );
void ls_step( SCALAR dt, int Initialize );
#endif /* _LS_STEP_H */

View file

@ -1,42 +1,42 @@
/***************************************************************************
TITLE: ls_sym.h
TITLE: ls_sym.h
----------------------------------------------------------------------------
FUNCTION: Header file for symbol table routines
FUNCTION: Header file for symbol table routines
----------------------------------------------------------------------------
MODULE STATUS: production
MODULE STATUS: production
----------------------------------------------------------------------------
GENEALOGY: Created 930629 by E. B. Jackson
GENEALOGY: Created 930629 by E. B. Jackson
----------------------------------------------------------------------------
DESIGNED BY: Bruce Jackson
CODED BY: same
MAINTAINED BY:
DESIGNED BY: Bruce Jackson
CODED BY: same
MAINTAINED BY:
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
950227 Added header and declarations for ls_print_findsym_error(),
ls_get_double(), and ls_get_double() routines. EBJ
950227 Added header and declarations for ls_print_findsym_error(),
ls_get_double(), and ls_get_double() routines. EBJ
950302 Added structure for symbol description. EBJ
950306 Added ls_get_sym_val() and ls_set_sym_val() routines.
This is now the production version. EBJ
CURRENT RCS HEADER:
950302 Added structure for symbol description. EBJ
950306 Added ls_get_sym_val() and ls_set_sym_val() routines.
This is now the production version. EBJ
CURRENT RCS HEADER:
$Header$
$Log$
@ -76,23 +76,23 @@ Initial Flight Gear revision.
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
@ -118,56 +118,56 @@ Initial Flight Gear revision.
typedef enum {Unknown, Char, UChar, SHint, USHint, Sint, Uint, Slng, Ulng, flt, dbl} vartype;
typedef char SYMBOL_NAME[64];
typedef vartype SYMBOL_TYPE;
typedef char SYMBOL_NAME[64];
typedef vartype SYMBOL_TYPE;
typedef struct
{
SYMBOL_NAME Mod_Name;
SYMBOL_NAME Par_Name;
SYMBOL_NAME Mod_Name;
SYMBOL_NAME Par_Name;
SYMBOL_TYPE Par_Type;
SYMBOL_NAME Alias;
char *Addr;
} symbol_rec;
char *Addr;
} symbol_rec;
extern int ls_findsym( const char *modname, const char *varname,
char **addr, vartype *vtype );
extern int ls_findsym( const char *modname, const char *varname,
char **addr, vartype *vtype );
extern void ls_print_findsym_error(int result,
char *mod_name,
char *var_name);
extern void ls_print_findsym_error(int result,
char *mod_name,
char *var_name);
extern double ls_get_double(vartype sym_type, void *addr );
extern double ls_get_double(vartype sym_type, void *addr );
extern void ls_set_double(vartype sym_type, void *addr, double value );
extern void ls_set_double(vartype sym_type, void *addr, double value );
extern double ls_get_sym_val( symbol_rec *symrec, int *error );
extern double ls_get_sym_val( symbol_rec *symrec, int *error );
/* This routine attempts to return the present value of the symbol
described in symbol_rec. If Addr is non-zero, the value of that
location, interpreted as type double, will be returned. If Addr
is zero, and Mod_Name and Par_Name are both not null strings,
the ls_findsym() routine is used to try to obtain the address
by looking at debugger symbol tables in the executable image, and
the value of the double contained at that address is returned,
and the symbol record is updated to contain the address of that
symbol. If an error is discovered, 'error' will be non-zero and
and error message is printed on stderr. */
/* This routine attempts to return the present value of the symbol
described in symbol_rec. If Addr is non-zero, the value of that
location, interpreted as type double, will be returned. If Addr
is zero, and Mod_Name and Par_Name are both not null strings,
the ls_findsym() routine is used to try to obtain the address
by looking at debugger symbol tables in the executable image, and
the value of the double contained at that address is returned,
and the symbol record is updated to contain the address of that
symbol. If an error is discovered, 'error' will be non-zero and
and error message is printed on stderr. */
extern void ls_set_sym_val( symbol_rec *symrec, double value );
extern void ls_set_sym_val( symbol_rec *symrec, double value );
/* This routine sets the value of a double at the location pointed
to by the symbol_rec's Addr field, if Addr is non-zero. If Addr
is zero, and Mod_Name and Par_Name are both not null strings,
the ls_findsym() routine is used to try to obtain the address
by looking at debugger symbol tables in the executable image, and
the value of the double contained at that address is returned,
and the symbol record is updated to contain the address of that
symbol. If an error is discovered, 'error' will be non-zero and
and error message is printed on stderr. */
/* This routine sets the value of a double at the location pointed
to by the symbol_rec's Addr field, if Addr is non-zero. If Addr
is zero, and Mod_Name and Par_Name are both not null strings,
the ls_findsym() routine is used to try to obtain the address
by looking at debugger symbol tables in the executable image, and
the value of the double contained at that address is returned,
and the symbol record is updated to contain the address of that
symbol. If an error is discovered, 'error' will be non-zero and
and error message is printed on stderr. */
#endif /* _LS_SYM_H */

View file

@ -1,90 +1,90 @@
/***************************************************************************
TITLE: ls_trim.c
TITLE: ls_trim.c
----------------------------------------------------------------------------
FUNCTION: Trims the simulated aircraft by using certain
controls to null out a similar number of outputs.
FUNCTION: Trims the simulated aircraft by using certain
controls to null out a similar number of outputs.
This routine used modified Newton-Raphson method to find the vector
of control corrections, delta_U, to drive a similar-sized vector of
output errors, Y, to near-zero. Nearness to zero is to within a
tolerance specified by the Criteria vector. An optional Weight
vector can be used to improve the numerical properties of the
Jacobian matrix (called H_Partials).
of control corrections, delta_U, to drive a similar-sized vector of
output errors, Y, to near-zero. Nearness to zero is to within a
tolerance specified by the Criteria vector. An optional Weight
vector can be used to improve the numerical properties of the
Jacobian matrix (called H_Partials).
Using a single-sided difference method, each control is
independently perturbed and the change in each output of
interest is calculated, forming a Jacobian matrix H (variable
name is H_Partials):
Using a single-sided difference method, each control is
independently perturbed and the change in each output of
interest is calculated, forming a Jacobian matrix H (variable
name is H_Partials):
dY = H dU
dY = H dU
The columns of H correspond to the control effect; the rows of
H correspond to the outputs affected.
The columns of H correspond to the control effect; the rows of
H correspond to the outputs affected.
We wish to find dU such that for U = U0 + dU,
Y = Y0 + dY = 0
or dY = -Y0
We wish to find dU such that for U = U0 + dU,
Y = Y0 + dY = 0
or dY = -Y0
One solution is dU = inv(H)*(-Y0); however, inverting H
directly is not numerically sound, since it may be singular
(especially if one of the controls is on a limit, or the
problem is poorly posed). An alternative is to either weight
the elements of dU to make them more normalized; another is to
multiply both sides by the transpose of H and invert the
resulting [H' H]. This routine does both:
One solution is dU = inv(H)*(-Y0); however, inverting H
directly is not numerically sound, since it may be singular
(especially if one of the controls is on a limit, or the
problem is poorly posed). An alternative is to either weight
the elements of dU to make them more normalized; another is to
multiply both sides by the transpose of H and invert the
resulting [H' H]. This routine does both:
-Y0 = H dU
W (-Y0) = W H dU premultiply by W
H' W (-Y0) = H' W H dU premultiply by H'
W (-Y0) = W H dU premultiply by W
H' W (-Y0) = H' W H dU premultiply by H'
dU = [inv(H' W H)][ H' W (-Y0)] Solve for dU
As a further refinement, dU is limited to a smallish magnitude
so that Y approaches 0 in small steps (to avoid an overshoot
if the problem is inherently non-linear).
As a further refinement, dU is limited to a smallish magnitude
so that Y approaches 0 in small steps (to avoid an overshoot
if the problem is inherently non-linear).
Lastly, this routine can be easily fooled by "local minima",
or depressions in the solution space that don't lead to a Y =
0 solution. The only advice we can offer is to "go somewheres
else and try again"; often approaching a trim solution from a
different (non-trimmed) starting point will prove beneficial.
Lastly, this routine can be easily fooled by "local minima",
or depressions in the solution space that don't lead to a Y =
0 solution. The only advice we can offer is to "go somewheres
else and try again"; often approaching a trim solution from a
different (non-trimmed) starting point will prove beneficial.
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created from old CASTLE SHELL$TRIM.PAS
on 6 FEB 95, which was based upon an Ames
CASPRE routine called BQUIET.
GENEALOGY: Created from old CASTLE SHELL$TRIM.PAS
on 6 FEB 95, which was based upon an Ames
CASPRE routine called BQUIET.
----------------------------------------------------------------------------
DESIGNED BY: E. B. Jackson
DESIGNED BY: E. B. Jackson
CODED BY: same
CODED BY: same
MAINTAINED BY: same
MAINTAINED BY: same
----------------------------------------------------------------------------
MODIFICATION HISTORY:
MODIFICATION HISTORY:
DATE PURPOSE BY
DATE PURPOSE BY
950307 Modified to make use of ls_get_sym_val and ls_put_sym_val
routines. EBJ
950329 Fixed bug in making use of more than 3 controls;
removed call by ls_trim_get_set() to ls_trim_init(). EBJ
950307 Modified to make use of ls_get_sym_val and ls_put_sym_val
routines. EBJ
950329 Fixed bug in making use of more than 3 controls;
removed call by ls_trim_get_set() to ls_trim_init(). EBJ
CURRENT RCS HEADER:
CURRENT RCS HEADER:
$Header$
$Log$
@ -142,23 +142,23 @@ Start of 0.6.x branch.
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
@ -192,38 +192,38 @@ static char rcsid[] = "$Id$";
typedef struct
{
symbol_rec Symbol;
double Min_Val, Max_Val, Curr_Val, Authority;
double Percent, Requested_Percent, Pert_Size;
int Ineffective, At_Limit;
symbol_rec Symbol;
double Min_Val, Max_Val, Curr_Val, Authority;
double Percent, Requested_Percent, Pert_Size;
int Ineffective, At_Limit;
} control_rec;
typedef struct
{
symbol_rec Symbol;
double Curr_Val, Weighting, Trim_Criteria;
int Uncontrollable;
symbol_rec Symbol;
double Curr_Val, Weighting, Trim_Criteria;
int Uncontrollable;
} output_rec;
static int Symbols_loaded = 0;
static int Index;
static int Trim_Cycles;
static int First;
static int Trimmed;
static double Gain;
static int Symbols_loaded = 0;
static int Index;
static int Trim_Cycles;
static int First;
static int Trimmed;
static double Gain;
static int Number_of_Controls;
static int Number_of_Outputs;
static control_rec Controls[ MAX_NUMBER_OF_CONTROLS ];
static output_rec Outputs[ MAX_NUMBER_OF_OUTPUTS ];
static int Number_of_Controls;
static int Number_of_Outputs;
static control_rec Controls[ MAX_NUMBER_OF_CONTROLS ];
static output_rec Outputs[ MAX_NUMBER_OF_OUTPUTS ];
static double **H_Partials;
static double **H_Partials;
static double Baseline_Output[ MAX_NUMBER_OF_OUTPUTS ];
static double Saved_Control, Saved_Control_Percent;
static double Baseline_Output[ MAX_NUMBER_OF_OUTPUTS ];
static double Saved_Control, Saved_Control_Percent;
static double Cost, Previous_Cost;
static double Cost, Previous_Cost;
@ -242,13 +242,13 @@ int ls_trim_init()
Trimmed = 0;
for (i=0;i<Number_of_Controls;i++)
{
Controls[i].Curr_Val = ls_get_sym_val( &Controls[i].Symbol, &error );
if (error) Controls[i].Symbol.Addr = NIL_POINTER;
Controls[i].Requested_Percent =
(Controls[i].Curr_Val - Controls[i].Min_Val)
/Controls[i].Authority;
}
{
Controls[i].Curr_Val = ls_get_sym_val( &Controls[i].Symbol, &error );
if (error) Controls[i].Symbol.Addr = NIL_POINTER;
Controls[i].Requested_Percent =
(Controls[i].Curr_Val - Controls[i].Min_Val)
/Controls[i].Authority;
}
H_Partials = nr_matrix( 1, Number_of_Controls, 1, Number_of_Controls );
if (H_Partials == 0) return -1;
@ -262,20 +262,20 @@ void ls_trim_get_vals()
int i, error;
for (i=0;i<Number_of_Outputs;i++)
{
Outputs[i].Curr_Val = ls_get_sym_val( &Outputs[i].Symbol, &error );
if (error) Outputs[i].Symbol.Addr = NIL_POINTER;
}
{
Outputs[i].Curr_Val = ls_get_sym_val( &Outputs[i].Symbol, &error );
if (error) Outputs[i].Symbol.Addr = NIL_POINTER;
}
Cost = 0.0;
for (i=0;i<Number_of_Controls;i++)
{
Controls[i].Curr_Val = ls_get_sym_val( &Controls[i].Symbol, &error );
if (error) Controls[i].Symbol.Addr = NIL_POINTER;
Controls[i].Percent =
(Controls[i].Curr_Val - Controls[i].Min_Val)
/Controls[i].Authority;
}
{
Controls[i].Curr_Val = ls_get_sym_val( &Controls[i].Symbol, &error );
if (error) Controls[i].Symbol.Addr = NIL_POINTER;
Controls[i].Percent =
(Controls[i].Curr_Val - Controls[i].Min_Val)
/Controls[i].Authority;
}
}
@ -286,22 +286,22 @@ void ls_trim_move_controls()
int i;
for(i=0;i<Number_of_Controls;i++)
{
Controls[i].At_Limit = 0;
if (Controls[i].Requested_Percent <= 0.0)
{
Controls[i].Requested_Percent = 0.0;
Controls[i].At_Limit = 1;
}
if (Controls[i].Requested_Percent >= 1.0)
{
Controls[i].Requested_Percent = 1.0;
Controls[i].At_Limit = 1;
}
Controls[i].Curr_Val = Controls[i].Min_Val +
(Controls[i].Max_Val - Controls[i].Min_Val) *
Controls[i].Requested_Percent;
}
{
Controls[i].At_Limit = 0;
if (Controls[i].Requested_Percent <= 0.0)
{
Controls[i].Requested_Percent = 0.0;
Controls[i].At_Limit = 1;
}
if (Controls[i].Requested_Percent >= 1.0)
{
Controls[i].Requested_Percent = 1.0;
Controls[i].At_Limit = 1;
}
Controls[i].Curr_Val = Controls[i].Min_Val +
(Controls[i].Max_Val - Controls[i].Min_Val) *
Controls[i].Requested_Percent;
}
}
void ls_trim_put_controls()
@ -310,8 +310,8 @@ void ls_trim_put_controls()
int i;
for (i=0;i<Number_of_Controls;i++)
if (Controls[i].Symbol.Addr)
ls_set_sym_val( &Controls[i].Symbol, Controls[i].Curr_Val );
if (Controls[i].Symbol.Addr)
ls_set_sym_val( &Controls[i].Symbol, Controls[i].Curr_Val );
}
void ls_trim_calc_cost()
@ -321,7 +321,7 @@ void ls_trim_calc_cost()
Cost = 0.0;
for(i=0;i<Number_of_Outputs;i++)
Cost += pow((Outputs[i].Curr_Val/Outputs[i].Trim_Criteria),2.0);
Cost += pow((Outputs[i].Curr_Val/Outputs[i].Trim_Criteria),2.0);
}
void ls_trim_save_baseline_outputs()
@ -329,7 +329,7 @@ void ls_trim_save_baseline_outputs()
int i, error;
for (i=0;i<Number_of_Outputs;i++)
Baseline_Output[i] = ls_get_sym_val( &Outputs[i].Symbol, &error );
Baseline_Output[i] = ls_get_sym_val( &Outputs[i].Symbol, &error );
}
int ls_trim_eval_outputs()
@ -338,7 +338,7 @@ int ls_trim_eval_outputs()
trimmed = 1;
for(i=0;i<Number_of_Outputs;i++)
if( fabs(Outputs[i].Curr_Val) > Outputs[i].Trim_Criteria) trimmed = 0;
if( fabs(Outputs[i].Curr_Val) > Outputs[i].Trim_Criteria) trimmed = 0;
return trimmed;
}
@ -350,54 +350,54 @@ void ls_trim_calc_h_column()
delta_control = (Controls[Index].Curr_Val - Saved_Control)/Controls[Index].Authority;
for(i=0;i<Number_of_Outputs;i++)
{
delta_output = Outputs[i].Curr_Val - Baseline_Output[i];
H_Partials[i+1][Index+1] = delta_output/delta_control;
}
{
delta_output = Outputs[i].Curr_Val - Baseline_Output[i];
H_Partials[i+1][Index+1] = delta_output/delta_control;
}
}
void ls_trim_do_step()
{
int i, j, l, singular;
double **h_trans_w_h;
double delta_req_mag, scaling;
double delta_U_requested[ MAX_NUMBER_OF_CONTROLS ];
double temp[ MAX_NUMBER_OF_CONTROLS ];
double **h_trans_w_h;
double delta_req_mag, scaling;
double delta_U_requested[ MAX_NUMBER_OF_CONTROLS ];
double temp[ MAX_NUMBER_OF_CONTROLS ];
/* Identify ineffective controls (whose partials are all near zero) */
for (j=0;j<Number_of_Controls;j++)
{
Controls[j].Ineffective = 1;
for(i=0;i<Number_of_Outputs;i++)
if (fabs(H_Partials[i+1][j+1]) > EPS) Controls[j].Ineffective = 0;
}
{
Controls[j].Ineffective = 1;
for(i=0;i<Number_of_Outputs;i++)
if (fabs(H_Partials[i+1][j+1]) > EPS) Controls[j].Ineffective = 0;
}
/* Identify uncontrollable outputs */
for (j=0;j<Number_of_Outputs;j++)
{
Outputs[j].Uncontrollable = 1;
for(i=0;i<Number_of_Controls;i++)
if (fabs(H_Partials[j+1][i+1]) > EPS) Outputs[j].Uncontrollable = 0;
}
{
Outputs[j].Uncontrollable = 1;
for(i=0;i<Number_of_Controls;i++)
if (fabs(H_Partials[j+1][i+1]) > EPS) Outputs[j].Uncontrollable = 0;
}
/* Calculate well-conditioned partials matrix [ H' W H ] */
h_trans_w_h = nr_matrix(1, Number_of_Controls, 1, Number_of_Controls);
if (h_trans_w_h == 0)
{
fprintf(stderr, "Memory error in ls_trim().\n");
exit(1);
}
{
fprintf(stderr, "Memory error in ls_trim().\n");
exit(1);
}
for (l=1;l<=Number_of_Controls;l++)
for (j=1;j<=Number_of_Controls;j++)
{
h_trans_w_h[l][j] = 0.0;
for (i=1;i<=Number_of_Outputs;i++)
h_trans_w_h[l][j] +=
H_Partials[i][l]*H_Partials[i][j]*Outputs[i-1].Weighting;
}
for (j=1;j<=Number_of_Controls;j++)
{
h_trans_w_h[l][j] = 0.0;
for (i=1;i<=Number_of_Outputs;i++)
h_trans_w_h[l][j] +=
H_Partials[i][l]*H_Partials[i][j]*Outputs[i-1].Weighting;
}
/* Invert the partials array [ inv( H' W H ) ]; note: h_trans_w_h is replaced
with its inverse during this function call */
@ -405,50 +405,50 @@ void ls_trim_do_step()
singular = nr_gaussj( h_trans_w_h, Number_of_Controls, 0, 0 );
if (singular) /* Can't invert successfully */
{
nr_free_matrix( h_trans_w_h, 1, Number_of_Controls,
1, Number_of_Controls );
fprintf(stderr, "Singular matrix in ls_trim().\n");
return;
}
{
nr_free_matrix( h_trans_w_h, 1, Number_of_Controls,
1, Number_of_Controls );
fprintf(stderr, "Singular matrix in ls_trim().\n");
return;
}
/* Form right hand side of equality: temp = [ H' W (-Y) ] */
for(i=0;i<Number_of_Controls;i++)
{
temp[i] = 0.0;
for(j=0;j<Number_of_Outputs;j++)
temp[i] -= H_Partials[j+1][i+1]*Baseline_Output[j]*Outputs[j].Weighting;
}
{
temp[i] = 0.0;
for(j=0;j<Number_of_Outputs;j++)
temp[i] -= H_Partials[j+1][i+1]*Baseline_Output[j]*Outputs[j].Weighting;
}
/* Solve for dU = [inv( H' W H )][ H' W (-Y)] */
for(i=0;i<Number_of_Controls;i++)
{
delta_U_requested[i] = 0.0;
for(j=0;j<Number_of_Controls;j++)
delta_U_requested[i] += h_trans_w_h[i+1][j+1]*temp[j];
}
{
delta_U_requested[i] = 0.0;
for(j=0;j<Number_of_Controls;j++)
delta_U_requested[i] += h_trans_w_h[i+1][j+1]*temp[j];
}
/* limit step magnitude to certain size, but not direction */
delta_req_mag = 0.0;
for(i=0;i<Number_of_Controls;i++)
delta_req_mag += delta_U_requested[i]*delta_U_requested[i];
delta_req_mag += delta_U_requested[i]*delta_U_requested[i];
delta_req_mag = sqrt(delta_req_mag);
scaling = STEP_LIMIT/delta_req_mag;
if (scaling < 1.0)
for(i=0;i<Number_of_Controls;i++)
delta_U_requested[i] *= scaling;
for(i=0;i<Number_of_Controls;i++)
delta_U_requested[i] *= scaling;
/* Convert deltas to percent of authority */
for(i=0;i<Number_of_Controls;i++)
Controls[i].Requested_Percent = Controls[i].Percent + delta_U_requested[i];
Controls[i].Requested_Percent = Controls[i].Percent + delta_U_requested[i];
/* free up temporary matrix */
nr_free_matrix( h_trans_w_h, 1, Number_of_Controls,
1, Number_of_Controls );
1, Number_of_Controls );
}
@ -462,70 +462,70 @@ int ls_trim()
Trimmed = 0;
if (Symbols_loaded) {
ls_trim_init(); /* Initialize Outputs & controls */
ls_trim_get_vals(); /* Limit the current control settings */
Baseline = TRUE;
ls_trim_move_controls(); /* Write out the new values of controls */
ls_trim_put_controls();
ls_loop( 0.0, -1 ); /* Cycle the simulation once with new limited
controls */
ls_trim_init(); /* Initialize Outputs & controls */
ls_trim_get_vals(); /* Limit the current control settings */
Baseline = TRUE;
ls_trim_move_controls(); /* Write out the new values of controls */
ls_trim_put_controls();
ls_loop( 0.0, -1 ); /* Cycle the simulation once with new limited
controls */
/* Main trim cycle loop follows */
/* Main trim cycle loop follows */
while((!Trimmed) && (Trim_Cycles < Max_Cycles))
{
ls_trim_get_vals();
if (Index == -1)
{
ls_trim_calc_cost();
/*Adjust_Gain(); */
ls_trim_save_baseline_outputs();
Trimmed = ls_trim_eval_outputs();
}
else
{
ls_trim_calc_h_column();
Controls[Index].Curr_Val = Saved_Control;
Controls[Index].Percent = Saved_Control_Percent;
Controls[Index].Requested_Percent = Saved_Control_Percent;
}
Index++;
if (!Trimmed)
{
if (Index >= Number_of_Controls)
{
Baseline = TRUE;
Index = -1;
ls_trim_do_step();
}
else
{ /* Save the current value & pert next control */
Baseline = FALSE;
Saved_Control = Controls[Index].Curr_Val;
Saved_Control_Percent = Controls[Index].Percent;
while((!Trimmed) && (Trim_Cycles < Max_Cycles))
{
ls_trim_get_vals();
if (Index == -1)
{
ls_trim_calc_cost();
/*Adjust_Gain(); */
ls_trim_save_baseline_outputs();
Trimmed = ls_trim_eval_outputs();
}
else
{
ls_trim_calc_h_column();
Controls[Index].Curr_Val = Saved_Control;
Controls[Index].Percent = Saved_Control_Percent;
Controls[Index].Requested_Percent = Saved_Control_Percent;
}
Index++;
if (!Trimmed)
{
if (Index >= Number_of_Controls)
{
Baseline = TRUE;
Index = -1;
ls_trim_do_step();
}
else
{ /* Save the current value & pert next control */
Baseline = FALSE;
Saved_Control = Controls[Index].Curr_Val;
Saved_Control_Percent = Controls[Index].Percent;
if (Controls[Index].Percent <
(1.0 - Controls[Index].Pert_Size) )
{
Controls[Index].Requested_Percent =
Controls[Index].Percent +
Controls[Index].Pert_Size ;
}
else
{
Controls[Index].Requested_Percent =
Controls[Index].Percent -
Controls[Index].Pert_Size;
}
}
ls_trim_move_controls();
ls_trim_put_controls();
ls_loop( 0.0, -1 );
Trim_Cycles++;
}
}
if (Controls[Index].Percent <
(1.0 - Controls[Index].Pert_Size) )
{
Controls[Index].Requested_Percent =
Controls[Index].Percent +
Controls[Index].Pert_Size ;
}
else
{
Controls[Index].Requested_Percent =
Controls[Index].Percent -
Controls[Index].Pert_Size;
}
}
ls_trim_move_controls();
ls_trim_put_controls();
ls_loop( 0.0, -1 );
Trim_Cycles++;
}
}
nr_free_matrix( H_Partials, 1, Number_of_Controls, 1, Number_of_Controls );
nr_free_matrix( H_Partials, 1, Number_of_Controls, 1, Number_of_Controls );
}
if (!Trimmed) fprintf(stderr, "Trim unsuccessful.\n");
@ -562,99 +562,99 @@ char *ls_trim_get_set(char *buffer, char *eob)
while( !abrt && (eob > bufptr))
{
bufptr = strtok_r( 0L, "\n", lasts );
if (bufptr == 0) return 0L;
if (strncasecmp( bufptr, "end", 3) == 0) break;
bufptr = strtok_r( 0L, "\n", lasts );
if (bufptr == 0) return 0L;
if (strncasecmp( bufptr, "end", 3) == 0) break;
sscanf( bufptr, "%s", line );
if (line[0] != '#') /* ignore comments */
{
switch (looking_for)
{
case controls_header:
{
if (strncasecmp( line, "controls", 8) == 0)
{
n = sscanf( bufptr, "%s%d", line, &Number_of_Controls );
if (n != 2) abrt = 1;
looking_for = controls;
i = 0;
}
break;
}
case controls:
{
n = sscanf( bufptr, "%s%s%le%le%le",
Controls[i].Symbol.Mod_Name,
Controls[i].Symbol.Par_Name,
&Controls[i].Min_Val,
&Controls[i].Max_Val,
&Controls[i].Pert_Size);
if (n != 5) abrt = 1;
Controls[i].Symbol.Addr = NIL_POINTER;
i++;
if (i >= Number_of_Controls) looking_for = outputs_header;
break;
}
case outputs_header:
{
if (strncasecmp( line, "outputs", 7) == 0)
{
n = sscanf( bufptr, "%s%d", line, &Number_of_Outputs );
if (n != 2) abrt = 1;
looking_for = outputs;
i = 0;
}
break;
}
case outputs:
{
n = sscanf( bufptr, "%s%s%le",
Outputs[i].Symbol.Mod_Name,
Outputs[i].Symbol.Par_Name,
&Outputs[i].Trim_Criteria );
if (n != 3) abrt = 1;
Outputs[i].Symbol.Addr = NIL_POINTER;
i++;
if (i >= Number_of_Outputs) looking_for = done;
}
case done:
{
break;
}
}
sscanf( bufptr, "%s", line );
if (line[0] != '#') /* ignore comments */
{
switch (looking_for)
{
case controls_header:
{
if (strncasecmp( line, "controls", 8) == 0)
{
n = sscanf( bufptr, "%s%d", line, &Number_of_Controls );
if (n != 2) abrt = 1;
looking_for = controls;
i = 0;
}
break;
}
case controls:
{
n = sscanf( bufptr, "%s%s%le%le%le",
Controls[i].Symbol.Mod_Name,
Controls[i].Symbol.Par_Name,
&Controls[i].Min_Val,
&Controls[i].Max_Val,
&Controls[i].Pert_Size);
if (n != 5) abrt = 1;
Controls[i].Symbol.Addr = NIL_POINTER;
i++;
if (i >= Number_of_Controls) looking_for = outputs_header;
break;
}
case outputs_header:
{
if (strncasecmp( line, "outputs", 7) == 0)
{
n = sscanf( bufptr, "%s%d", line, &Number_of_Outputs );
if (n != 2) abrt = 1;
looking_for = outputs;
i = 0;
}
break;
}
case outputs:
{
n = sscanf( bufptr, "%s%s%le",
Outputs[i].Symbol.Mod_Name,
Outputs[i].Symbol.Par_Name,
&Outputs[i].Trim_Criteria );
if (n != 3) abrt = 1;
Outputs[i].Symbol.Addr = NIL_POINTER;
i++;
if (i >= Number_of_Outputs) looking_for = done;
}
case done:
{
break;
}
}
}
}
}
if ((!abrt) &&
(Number_of_Controls > 0) &&
(Number_of_Outputs == Number_of_Controls))
{
Symbols_loaded = 1;
(Number_of_Controls > 0) &&
(Number_of_Outputs == Number_of_Controls))
{
Symbols_loaded = 1;
for(i=0;i<Number_of_Controls;i++) /* Initialize fields in Controls data */
{
Controls[i].Curr_Val = ls_get_sym_val( &Controls[i].Symbol, &error );
if (error)
Controls[i].Symbol.Addr = NIL_POINTER;
Controls[i].Authority = Controls[i].Max_Val - Controls[i].Min_Val;
if (Controls[i].Authority == 0.0)
Controls[i].Authority = 1.0;
Controls[i].Requested_Percent =
(Controls[i].Curr_Val - Controls[i].Min_Val)
/Controls[i].Authority;
Controls[i].Pert_Size = Controls[i].Pert_Size/Controls[i].Authority;
}
for(i=0;i<Number_of_Controls;i++) /* Initialize fields in Controls data */
{
Controls[i].Curr_Val = ls_get_sym_val( &Controls[i].Symbol, &error );
if (error)
Controls[i].Symbol.Addr = NIL_POINTER;
Controls[i].Authority = Controls[i].Max_Val - Controls[i].Min_Val;
if (Controls[i].Authority == 0.0)
Controls[i].Authority = 1.0;
Controls[i].Requested_Percent =
(Controls[i].Curr_Val - Controls[i].Min_Val)
/Controls[i].Authority;
Controls[i].Pert_Size = Controls[i].Pert_Size/Controls[i].Authority;
}
for (i=0;i<Number_of_Outputs;i++) /* Initialize fields in Outputs data */
{
Outputs[i].Curr_Val = ls_get_sym_val( &Outputs[i].Symbol, &error );
if (error) Outputs[i].Symbol.Addr = NIL_POINTER;
Outputs[i].Weighting =
Outputs[0].Trim_Criteria/Outputs[i].Trim_Criteria;
}
}
for (i=0;i<Number_of_Outputs;i++) /* Initialize fields in Outputs data */
{
Outputs[i].Curr_Val = ls_get_sym_val( &Outputs[i].Symbol, &error );
if (error) Outputs[i].Symbol.Addr = NIL_POINTER;
Outputs[i].Weighting =
Outputs[0].Trim_Criteria/Outputs[i].Trim_Criteria;
}
}
bufptr = *lasts;
return bufptr;
@ -676,19 +676,19 @@ void ls_trim_put_set( FILE *fp )
fprintf(fp, " controls: %d\n", Number_of_Controls);
fprintf(fp, "# module parameter min_val max_val pert_size\n");
for (i=0; i<Number_of_Controls; i++)
fprintf(fp, " %s\t%s\t%E\t%E\t%E\n",
Controls[i].Symbol.Mod_Name,
Controls[i].Symbol.Par_Name,
Controls[i].Min_Val,
Controls[i].Max_Val,
Controls[i].Pert_Size*Controls[i].Authority);
fprintf(fp, " %s\t%s\t%E\t%E\t%E\n",
Controls[i].Symbol.Mod_Name,
Controls[i].Symbol.Par_Name,
Controls[i].Min_Val,
Controls[i].Max_Val,
Controls[i].Pert_Size*Controls[i].Authority);
fprintf(fp, " outputs: %d\n", Number_of_Outputs);
fprintf(fp, "# module parameter trim_criteria\n");
for (i=0;i<Number_of_Outputs;i++)
fprintf(fp, " %s\t%s\t%E\n",
Outputs[i].Symbol.Mod_Name,
Outputs[i].Symbol.Par_Name,
Outputs[i].Trim_Criteria );
fprintf(fp, " %s\t%s\t%E\n",
Outputs[i].Symbol.Mod_Name,
Outputs[i].Symbol.Par_Name,
Outputs[i].Trim_Criteria );
fprintf(fp, "end\n");
return;
}

View file

@ -1,34 +1,34 @@
/***************************************************************************
TITLE: ls_types.h
TITLE: ls_types.h
----------------------------------------------------------------------------
FUNCTION: LaRCSim type definitions header file
FUNCTION: LaRCSim type definitions header file
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 15 DEC 1993 by Bruce Jackson from old
ls_eom.h header
GENEALOGY: Created 15 DEC 1993 by Bruce Jackson from old
ls_eom.h header
----------------------------------------------------------------------------
DESIGNED BY: B. Jackson
CODED BY: B. Jackson
MAINTAINED BY: guess who
DESIGNED BY: B. Jackson
CODED BY: B. Jackson
MAINTAINED BY: guess who
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
19 MAY 2001 Reduce MSVC6 warnings Geoff R. McLane
MODIFICATION HISTORY:
DATE PURPOSE BY
19 MAY 2001 Reduce MSVC6 warnings Geoff R. McLane
--------------------------------------------------------------------------*/
#ifndef _LS_TYPES_H

View file

@ -1,41 +1,41 @@
/***************************************************************************
TITLE: Navion_aero
TITLE: Navion_aero
----------------------------------------------------------------------------
FUNCTION: Linear aerodynamics model
FUNCTION: Linear aerodynamics model
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Based upon class notes from AA271, Stanford University,
GENEALOGY: Based upon class notes from AA271, Stanford University,
Spring 1988. Dr. Robert Cannon, instructor.
----------------------------------------------------------------------------
DESIGNED BY: Bruce Jackson
CODED BY: Bruce Jackson
MAINTAINED BY: Bruce Jackson
DESIGNED BY: Bruce Jackson
CODED BY: Bruce Jackson
MAINTAINED BY: Bruce Jackson
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
DATE PURPOSE BY
921229 Changed Alpha, Beta into radians; added Alpha bias.
EBJ
EBJ
930105 Modified to support linear airframe simulation by
adding shared memory initialization routine. EBJ
adding shared memory initialization routine. EBJ
931013 Added scaling by airspeed, to allow for low-airspeed
ground operations. EBJ
ground operations. EBJ
940216 Scaled long, lat stick and rudder to more appropriate values
of elevator and aileron. EBJ
of elevator and aileron. EBJ
----------------------------------------------------------------------------
@ -65,24 +65,24 @@ control surface deflections. For example, L_beta is an estimate of how
much roll moment varies per degree of sideslip increase. A decoding
ring is given below:
X Aerodynamic force, lbs, in X-axis (+ forward)
Y Aerodynamic force, lbs, in Y-axis (+ right)
Z Aerodynamic force, lbs, in Z-axis (+ down)
L Aero. moment about X-axis (+ roll right), ft-lbs
M Aero. moment about Y-axis (+ pitch up), ft-lbs
N Aero. moment about Z-axis (+ nose right), ft-lbs
X Aerodynamic force, lbs, in X-axis (+ forward)
Y Aerodynamic force, lbs, in Y-axis (+ right)
Z Aerodynamic force, lbs, in Z-axis (+ down)
L Aero. moment about X-axis (+ roll right), ft-lbs
M Aero. moment about Y-axis (+ pitch up), ft-lbs
N Aero. moment about Z-axis (+ nose right), ft-lbs
0 Subscript implying initial, or nominal, value
u X-axis component of airspeed (ft/sec) (+ forward)
v Y-axis component of airspeed (ft/sec) (+ right)
w Z-axis component of airspeed (ft/sec) (+ down)
p X-axis ang. rate (rad/sec) (+ roll right), rad/sec
q Y-axis ang. rate (rad/sec) (+ pitch up), rad/sec
r Z-axis ang. rate (rad/sec) (+ yaw right), rad/sec
beta Angle of sideslip, degrees (+ wind in RIGHT ear)
da Aileron deflection, degrees (+ left ail. TE down)
de Elevator deflection, degrees (+ trailing edge down)
dr Rudder deflection, degrees (+ trailing edge LEFT)
0 Subscript implying initial, or nominal, value
u X-axis component of airspeed (ft/sec) (+ forward)
v Y-axis component of airspeed (ft/sec) (+ right)
w Z-axis component of airspeed (ft/sec) (+ down)
p X-axis ang. rate (rad/sec) (+ roll right), rad/sec
q Y-axis ang. rate (rad/sec) (+ pitch up), rad/sec
r Z-axis ang. rate (rad/sec) (+ yaw right), rad/sec
beta Angle of sideslip, degrees (+ wind in RIGHT ear)
da Aileron deflection, degrees (+ left ail. TE down)
de Elevator deflection, degrees (+ trailing edge down)
dr Rudder deflection, degrees (+ trailing edge LEFT)
----------------------------------------------------------------------------
@ -203,10 +203,10 @@ void navion_aero( SCALAR dt, int Initialize ) {
F_Z_aero = scale*(Z_0 + Mass*(Z_u*u + Z_w*w + Z_de*elevator));
M_l_aero = scale*(I_xx*(L_beta*Std_Beta + L_p*P_body + L_r*R_body
+ L_da*aileron + L_dr*rudder));
+ L_da*aileron + L_dr*rudder));
M_m_aero = scale*(M_0 + I_yy*(M_w*w + M_q*Q_body + M_de*(elevator + Long_trim)));
M_n_aero = scale*(I_zz*(N_beta*Std_Beta + N_p*P_body + N_r*R_body
+ N_da*aileron + N_dr*rudder));
+ N_da*aileron + N_dr*rudder));
}

View file

@ -1,34 +1,34 @@
/***************************************************************************
TITLE: engine.c
TITLE: engine.c
----------------------------------------------------------------------------
FUNCTION: dummy engine routine
FUNCTION: dummy engine routine
----------------------------------------------------------------------------
MODULE STATUS: incomplete
MODULE STATUS: incomplete
----------------------------------------------------------------------------
GENEALOGY: Created 15 OCT 92 as dummy routine for checkout. EBJ
GENEALOGY: Created 15 OCT 92 as dummy routine for checkout. EBJ
----------------------------------------------------------------------------
DESIGNED BY: designer
CODED BY: programmer
MAINTAINED BY: maintainer
DESIGNED BY: designer
CODED BY: programmer
MAINTAINED BY: maintainer
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
CURRENT RCS HEADER INFO:
CURRENT RCS HEADER INFO:
$Header$
@ -38,23 +38,23 @@ $Header$
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY: ls_model();
CALLED BY: ls_model();
----------------------------------------------------------------------------
CALLS TO: none
CALLS TO: none
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include <math.h>
@ -64,7 +64,7 @@ $Header$
#include "ls_sim_control.h"
#include "ls_cockpit.h"
extern SIM_CONTROL sim_control_;
extern SIM_CONTROL sim_control_;
void navion_engine( SCALAR dt, int init ) {
/* if (init) { */

View file

@ -1,38 +1,38 @@
/***************************************************************************
TITLE: gear
TITLE: gear
----------------------------------------------------------------------------
FUNCTION: Landing gear model for example simulation
FUNCTION: Landing gear model for example simulation
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Created 931012 by E. B. Jackson
GENEALOGY: Created 931012 by E. B. Jackson
----------------------------------------------------------------------------
DESIGNED BY: E. B. Jackson
CODED BY: E. B. Jackson
MAINTAINED BY: E. B. Jackson
DESIGNED BY: E. B. Jackson
CODED BY: E. B. Jackson
MAINTAINED BY: E. B. Jackson
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
931218 Added navion.h header to allow connection with
aileron displacement for nosewheel steering. EBJ
940511 Connected nosewheel to rudder pedal; adjusted gain.
CURRENT RCS HEADER:
931218 Added navion.h header to allow connection with
aileron displacement for nosewheel steering. EBJ
940511 Connected nosewheel to rudder pedal; adjusted gain.
CURRENT RCS HEADER:
$Header$
$Log$
@ -92,23 +92,23 @@ Initial Flight Gear revision.
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include <math.h>
@ -167,21 +167,21 @@ void navion_gear( SCALAR dt, int Initialize ) {
#define NUM_WHEELS 3
static int num_wheels = NUM_WHEELS; /* number of wheels */
static int num_wheels = NUM_WHEELS; /* number of wheels */
static DATA d_wheel_rp_body_v[NUM_WHEELS][3] = /* X, Y, Z locations */
{
{ 10., 0., 4. }, /* in feet */
{ -1., 3., 4. },
{ -1., -3., 4. }
{ 10., 0., 4. }, /* in feet */
{ -1., 3., 4. },
{ -1., -3., 4. }
};
static DATA spring_constant[NUM_WHEELS] = /* springiness, lbs/ft */
{ 1500., 5000., 5000. };
static DATA spring_damping[NUM_WHEELS] = /* damping, lbs/ft/sec */
{ 100., 150., 150. };
static DATA percent_brake[NUM_WHEELS] = /* percent applied braking */
{ 0., 0., 0. }; /* 0 = none, 1 = full */
static DATA caster_angle_rad[NUM_WHEELS] = /* steerable tires - in */
{ 0., 0., 0.}; /* radians, +CW */
static DATA spring_constant[NUM_WHEELS] = /* springiness, lbs/ft */
{ 1500., 5000., 5000. };
static DATA spring_damping[NUM_WHEELS] = /* damping, lbs/ft/sec */
{ 100., 150., 150. };
static DATA percent_brake[NUM_WHEELS] = /* percent applied braking */
{ 0., 0., 0. }; /* 0 = none, 1 = full */
static DATA caster_angle_rad[NUM_WHEELS] = /* steerable tires - in */
{ 0., 0., 0.}; /* radians, +CW */
/*
* End of aircraft specific code
*/
@ -194,51 +194,51 @@ void navion_gear( SCALAR dt, int Initialize ) {
*
* mu ^
* |
* max_mu | +
* | /|
* sliding_mu | / +------
* | /
* | /
* max_mu | +
* | /|
* sliding_mu | / +------
* | /
* | /
* +--+------------------------>
* | | | sideward V
* 0 bkout skid
* V V
* V V
*/
static DATA sliding_mu = 0.5;
static DATA rolling_mu = 0.01;
static DATA max_brake_mu = 0.6;
static DATA max_mu = 0.8;
static DATA bkout_v = 0.1;
static DATA sliding_mu = 0.5;
static DATA rolling_mu = 0.01;
static DATA max_brake_mu = 0.6;
static DATA max_mu = 0.8;
static DATA bkout_v = 0.1;
static DATA skid_v = 1.0;
/*
* Local data variables
*/
DATA d_wheel_cg_body_v[3]; /* wheel offset from cg, X-Y-Z */
DATA d_wheel_cg_local_v[3]; /* wheel offset from cg, N-E-D */
DATA d_wheel_rwy_local_v[3]; /* wheel offset from rwy, N-E-U */
// DATA v_wheel_body_v[3]; /* wheel velocity, X-Y-Z */
DATA v_wheel_local_v[3]; /* wheel velocity, N-E-D */
DATA f_wheel_local_v[3]; /* wheel reaction force, N-E-D */
DATA temp3a[3], temp3b[3], tempF[3], tempM[3];
DATA reaction_normal_force; /* wheel normal (to rwy) force */
DATA cos_wheel_hdg_angle, sin_wheel_hdg_angle; /* temp storage */
DATA d_wheel_cg_body_v[3]; /* wheel offset from cg, X-Y-Z */
DATA d_wheel_cg_local_v[3]; /* wheel offset from cg, N-E-D */
DATA d_wheel_rwy_local_v[3]; /* wheel offset from rwy, N-E-U */
// DATA v_wheel_body_v[3]; /* wheel velocity, X-Y-Z */
DATA v_wheel_local_v[3]; /* wheel velocity, N-E-D */
DATA f_wheel_local_v[3]; /* wheel reaction force, N-E-D */
DATA temp3a[3], temp3b[3], tempF[3], tempM[3];
DATA reaction_normal_force; /* wheel normal (to rwy) force */
DATA cos_wheel_hdg_angle, sin_wheel_hdg_angle; /* temp storage */
DATA v_wheel_forward, v_wheel_sideward, abs_v_wheel_sideward;
DATA forward_mu, sideward_mu; /* friction coefficients */
DATA beta_mu; /* breakout friction slope */
DATA forward_mu, sideward_mu; /* friction coefficients */
DATA beta_mu; /* breakout friction slope */
DATA forward_wheel_force, sideward_wheel_force;
int i; /* per wheel loop counter */
int i; /* per wheel loop counter */
/*
* Execution starts here
*/
beta_mu = max_mu/(skid_v-bkout_v);
clear3( F_gear_v ); /* Initialize sum of forces... */
clear3( M_gear_v ); /* ...and moments */
clear3( F_gear_v ); /* Initialize sum of forces... */
clear3( M_gear_v ); /* ...and moments */
/*
* Put aircraft specific executable code here
@ -249,115 +249,115 @@ void navion_gear( SCALAR dt, int Initialize ) {
caster_angle_rad[0] = 0.03*Rudder_pedal;
for (i=0;i<num_wheels;i++) /* Loop for each wheel */
for (i=0;i<num_wheels;i++) /* Loop for each wheel */
{
/*========================================*/
/* Calculate wheel position w.r.t. runway */
/*========================================*/
/* First calculate wheel location w.r.t. cg in body (X-Y-Z) axes... */
sub3( d_wheel_rp_body_v[i], D_cg_rp_body_v, d_wheel_cg_body_v );
/* then converting to local (North-East-Down) axes... */
multtrans3x3by3( T_local_to_body_m, d_wheel_cg_body_v, d_wheel_cg_local_v );
/* Runway axes correction - third element is Altitude, not (-)Z... */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* since altitude = -Z */
/* Add wheel offset to cg location in local axes */
add3( d_wheel_cg_local_v, D_cg_rwy_local_v, d_wheel_rwy_local_v );
/* remove Runway axes correction so right hand rule applies */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* now Z positive down */
/*============================*/
/* Calculate wheel velocities */
/*============================*/
/* contribution due to angular rates */
cross3( Omega_body_v, d_wheel_cg_body_v, temp3a );
/* transform into local axes */
multtrans3x3by3( T_local_to_body_m, temp3a, temp3b );
/*========================================*/
/* Calculate wheel position w.r.t. runway */
/*========================================*/
/* First calculate wheel location w.r.t. cg in body (X-Y-Z) axes... */
sub3( d_wheel_rp_body_v[i], D_cg_rp_body_v, d_wheel_cg_body_v );
/* then converting to local (North-East-Down) axes... */
multtrans3x3by3( T_local_to_body_m, d_wheel_cg_body_v, d_wheel_cg_local_v );
/* Runway axes correction - third element is Altitude, not (-)Z... */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* since altitude = -Z */
/* Add wheel offset to cg location in local axes */
add3( d_wheel_cg_local_v, D_cg_rwy_local_v, d_wheel_rwy_local_v );
/* remove Runway axes correction so right hand rule applies */
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* now Z positive down */
/*============================*/
/* Calculate wheel velocities */
/*============================*/
/* contribution due to angular rates */
cross3( Omega_body_v, d_wheel_cg_body_v, temp3a );
/* transform into local axes */
multtrans3x3by3( T_local_to_body_m, temp3a, temp3b );
/* plus contribution due to cg velocities */
/* plus contribution due to cg velocities */
add3( temp3b, V_local_rel_ground_v, v_wheel_local_v );
/*===========================================*/
/* Calculate forces & moments for this wheel */
/*===========================================*/
/* Add any anticipation, or frame lead/prediction, here... */
/* no lead used at present */
/* Calculate sideward and forward velocities of the wheel
in the runway plane */
cos_wheel_hdg_angle = cos(caster_angle_rad[i] + Psi);
sin_wheel_hdg_angle = sin(caster_angle_rad[i] + Psi);
v_wheel_forward = v_wheel_local_v[0]*cos_wheel_hdg_angle
+ v_wheel_local_v[1]*sin_wheel_hdg_angle;
v_wheel_sideward = v_wheel_local_v[1]*cos_wheel_hdg_angle
- v_wheel_local_v[0]*sin_wheel_hdg_angle;
add3( temp3b, V_local_rel_ground_v, v_wheel_local_v );
/*===========================================*/
/* Calculate forces & moments for this wheel */
/*===========================================*/
/* Add any anticipation, or frame lead/prediction, here... */
/* no lead used at present */
/* Calculate sideward and forward velocities of the wheel
in the runway plane */
cos_wheel_hdg_angle = cos(caster_angle_rad[i] + Psi);
sin_wheel_hdg_angle = sin(caster_angle_rad[i] + Psi);
v_wheel_forward = v_wheel_local_v[0]*cos_wheel_hdg_angle
+ v_wheel_local_v[1]*sin_wheel_hdg_angle;
v_wheel_sideward = v_wheel_local_v[1]*cos_wheel_hdg_angle
- v_wheel_local_v[0]*sin_wheel_hdg_angle;
/* Calculate normal load force (simple spring constant) */
reaction_normal_force = 0.;
if( d_wheel_rwy_local_v[2] < 0. )
{
reaction_normal_force = spring_constant[i]*d_wheel_rwy_local_v[2]
- v_wheel_local_v[2]*spring_damping[i];
if (reaction_normal_force > 0.) reaction_normal_force = 0.;
/* to prevent damping component from swamping spring component */
}
/* Calculate friction coefficients */
forward_mu = (max_brake_mu - rolling_mu)*percent_brake[i] + rolling_mu;
abs_v_wheel_sideward = sqrt(v_wheel_sideward*v_wheel_sideward);
sideward_mu = sliding_mu;
if (abs_v_wheel_sideward < skid_v)
sideward_mu = (abs_v_wheel_sideward - bkout_v)*beta_mu;
if (abs_v_wheel_sideward < bkout_v) sideward_mu = 0.;
/* Calculate normal load force (simple spring constant) */
reaction_normal_force = 0.;
if( d_wheel_rwy_local_v[2] < 0. )
{
reaction_normal_force = spring_constant[i]*d_wheel_rwy_local_v[2]
- v_wheel_local_v[2]*spring_damping[i];
if (reaction_normal_force > 0.) reaction_normal_force = 0.;
/* to prevent damping component from swamping spring component */
}
/* Calculate friction coefficients */
forward_mu = (max_brake_mu - rolling_mu)*percent_brake[i] + rolling_mu;
abs_v_wheel_sideward = sqrt(v_wheel_sideward*v_wheel_sideward);
sideward_mu = sliding_mu;
if (abs_v_wheel_sideward < skid_v)
sideward_mu = (abs_v_wheel_sideward - bkout_v)*beta_mu;
if (abs_v_wheel_sideward < bkout_v) sideward_mu = 0.;
/* Calculate foreward and sideward reaction forces */
forward_wheel_force = forward_mu*reaction_normal_force;
sideward_wheel_force = sideward_mu*reaction_normal_force;
if(v_wheel_forward < 0.) forward_wheel_force = -forward_wheel_force;
if(v_wheel_sideward < 0.) sideward_wheel_force = -sideward_wheel_force;
/* Rotate into local (N-E-D) axes */
f_wheel_local_v[0] = forward_wheel_force*cos_wheel_hdg_angle
- sideward_wheel_force*sin_wheel_hdg_angle;
f_wheel_local_v[1] = forward_wheel_force*sin_wheel_hdg_angle
+ sideward_wheel_force*cos_wheel_hdg_angle;
f_wheel_local_v[2] = reaction_normal_force;
/* Convert reaction force from local (N-E-D) axes to body (X-Y-Z) */
mult3x3by3( T_local_to_body_m, f_wheel_local_v, tempF );
/* Calculate moments from force and offsets in body axes */
/* Calculate foreward and sideward reaction forces */
forward_wheel_force = forward_mu*reaction_normal_force;
sideward_wheel_force = sideward_mu*reaction_normal_force;
if(v_wheel_forward < 0.) forward_wheel_force = -forward_wheel_force;
if(v_wheel_sideward < 0.) sideward_wheel_force = -sideward_wheel_force;
/* Rotate into local (N-E-D) axes */
f_wheel_local_v[0] = forward_wheel_force*cos_wheel_hdg_angle
- sideward_wheel_force*sin_wheel_hdg_angle;
f_wheel_local_v[1] = forward_wheel_force*sin_wheel_hdg_angle
+ sideward_wheel_force*cos_wheel_hdg_angle;
f_wheel_local_v[2] = reaction_normal_force;
/* Convert reaction force from local (N-E-D) axes to body (X-Y-Z) */
mult3x3by3( T_local_to_body_m, f_wheel_local_v, tempF );
/* Calculate moments from force and offsets in body axes */
cross3( d_wheel_cg_body_v, tempF, tempM );
/* Sum forces and moments across all wheels */
add3( tempF, F_gear_v, F_gear_v );
add3( tempM, M_gear_v, M_gear_v );
cross3( d_wheel_cg_body_v, tempF, tempM );
/* Sum forces and moments across all wheels */
add3( tempF, F_gear_v, F_gear_v );
add3( tempM, M_gear_v, M_gear_v );
}
}

View file

@ -1,59 +1,59 @@
/***************************************************************************
TITLE: navion_init.c
TITLE: navion_init.c
----------------------------------------------------------------------------
FUNCTION: Initializes navion math model
FUNCTION: Initializes navion math model
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Added to navion package 930111 by Bruce Jackson
GENEALOGY: Added to navion package 930111 by Bruce Jackson
----------------------------------------------------------------------------
DESIGNED BY: EBJ
CODED BY: EBJ
MAINTAINED BY: EBJ
DESIGNED BY: EBJ
CODED BY: EBJ
MAINTAINED BY: EBJ
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
MODIFICATION HISTORY:
DATE PURPOSE BY
950314 Removed initialization of state variables, since this is
now done (version 1.4b1) in ls_init. EBJ
950406 Removed #include of "shmdefs.h"; shmdefs.h is a duplicate
of "navion.h". EBJ
CURRENT RCS HEADER:
950314 Removed initialization of state variables, since this is
now done (version 1.4b1) in ls_init. EBJ
950406 Removed #include of "shmdefs.h"; shmdefs.h is a duplicate
of "navion.h". EBJ
CURRENT RCS HEADER:
----------------------------------------------------------------------------
REFERENCES:
REFERENCES:
----------------------------------------------------------------------------
CALLED BY:
CALLED BY:
----------------------------------------------------------------------------
CALLS TO:
CALLS TO:
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
OUTPUTS:
OUTPUTS:
--------------------------------------------------------------------------*/
#include "ls_types.h"

View file

@ -2,28 +2,28 @@ init
0010
continuous_states: 22
# module parameter value
* generic_.geodetic_position_v[0] 2.793445E-05
* generic_.geodetic_position_v[1] 3.262070E-07
* generic_.geodetic_position_v[2] 3.758099E+00
* generic_.v_local_v[0] 7.287719E+00
* generic_.v_local_v[1] 1.521770E+03
* generic_.v_local_v[2] -1.265722E-05
* generic_.euler_angles_v[0] -2.658474E-06
* generic_.euler_angles_v[1] 7.401790E-03
* generic_.euler_angles_v[2] 1.391358E-03
* generic_.omega_body_v[0] 7.206685E-05
* generic_.omega_body_v[1] 0.000000E+00
* generic_.omega_body_v[2] 9.492658E-05
* generic_.earth_position_angle 0.000000E+00
* generic_.mass 8.547270E+01
* generic_.i_xx 1.048000E+03
* generic_.i_yy 3.000000E+03
* generic_.i_zz 3.530000E+03
* generic_.i_xz 0.000000E+00
* generic_.d_cg_rp_body_v[0] 0.000000E+00
* generic_.d_cg_rp_body_v[1] 0.000000E+00
* generic_.d_cg_rp_body_v[2] 0.000000E+00
aero long_trim 1.969572E-03
* generic_.geodetic_position_v[0] 2.793445E-05
* generic_.geodetic_position_v[1] 3.262070E-07
* generic_.geodetic_position_v[2] 3.758099E+00
* generic_.v_local_v[0] 7.287719E+00
* generic_.v_local_v[1] 1.521770E+03
* generic_.v_local_v[2] -1.265722E-05
* generic_.euler_angles_v[0] -2.658474E-06
* generic_.euler_angles_v[1] 7.401790E-03
* generic_.euler_angles_v[2] 1.391358E-03
* generic_.omega_body_v[0] 7.206685E-05
* generic_.omega_body_v[1] 0.000000E+00
* generic_.omega_body_v[2] 9.492658E-05
* generic_.earth_position_angle 0.000000E+00
* generic_.mass 8.547270E+01
* generic_.i_xx 1.048000E+03
* generic_.i_yy 3.000000E+03
* generic_.i_zz 3.530000E+03
* generic_.i_xz 0.000000E+00
* generic_.d_cg_rp_body_v[0] 0.000000E+00
* generic_.d_cg_rp_body_v[1] 0.000000E+00
* generic_.d_cg_rp_body_v[2] 0.000000E+00
aero long_trim 1.969572E-03
discrete_states: 0
# module parameter value
end

View file

@ -1,32 +1,32 @@
/***************************************************************************
TITLE: uiuc_aero
TITLE: uiuc_aero
----------------------------------------------------------------------------
FUNCTION: aerodynamics, engine and gear model
FUNCTION: aerodynamics, engine and gear model
----------------------------------------------------------------------------
MODULE STATUS: developmental
MODULE STATUS: developmental
----------------------------------------------------------------------------
GENEALOGY: Equations based on Part 1 of Roskam's S&C text
GENEALOGY: Equations based on Part 1 of Roskam's S&C text
----------------------------------------------------------------------------
DESIGNED BY: Bipin Sehgal
CODED BY: Bipin Sehgal
MAINTAINED BY: Rob Deters and Glen Dimock
DESIGNED BY: Bipin Sehgal
CODED BY: Bipin Sehgal
MAINTAINED BY: Rob Deters and Glen Dimock
----------------------------------------------------------------------------
MODIFICATION HISTORY:
DATE PURPOSE BY
DATE PURPOSE BY
3/17/00 Initial test release
3/09/01 Added callout to UIUC gear function. (DPM)
6/18/01 Added call out to UIUC record routine (RD)
@ -45,7 +45,7 @@
----------------------------------------------------------------------------
INPUTS:
INPUTS:
----------------------------------------------------------------------------
@ -69,7 +69,7 @@ void uiuc_init_2_wrapper()
// On first time through initialize UIUC aircraft model
if (init==0) {
init=-1;
uiuc_defaults_inits();
uiuc_defaults_inits();
uiuc_init_aeromodel();
}