Sync. w. JSBSim: fix a few unexpected glitches
This commit is contained in:
parent
c74cdade0b
commit
86b34010f3
5 changed files with 69 additions and 48 deletions
|
@ -5,7 +5,7 @@
|
|||
Date started: 01/21/08
|
||||
Purpose: Encapsulates the buoyant forces
|
||||
|
||||
------------- Copyright (C) 2008 Anders Gidenstam -------------
|
||||
------------- Copyright (C) 2008 - 2009 Anders Gidenstam -------------
|
||||
------------- Copyright (C) 2008 Jon S. Berndt (jsb@hal-pc.org) -------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
|
@ -72,7 +72,9 @@ FGBuoyantForces::~FGBuoyantForces()
|
|||
for (unsigned int i=0; i<Cells.size(); i++) delete Cells[i];
|
||||
Cells.clear();
|
||||
|
||||
unbind();
|
||||
for (unsigned int i=0; i<interface_properties.size(); i++)
|
||||
delete interface_properties[i];
|
||||
interface_properties.clear();
|
||||
|
||||
Debug(1);
|
||||
}
|
||||
|
@ -125,6 +127,29 @@ bool FGBuoyantForces::Load(Element *element)
|
|||
document = element;
|
||||
}
|
||||
|
||||
Element *property_element = document->FindElement("property");
|
||||
if (property_element)
|
||||
cout << endl << " Declared properties" << endl << endl;
|
||||
while (property_element) {
|
||||
string interface_property_string = property_element->GetDataLine();
|
||||
|
||||
if (PropertyManager->HasNode(interface_property_string)) {
|
||||
cout << " Property " << interface_property_string <<
|
||||
" is already defined." << endl;
|
||||
} else {
|
||||
double value=0.0;
|
||||
if ( ! property_element->GetAttributeValue("value").empty())
|
||||
value = property_element->GetAttributeValueAsNumber("value");
|
||||
interface_properties.push_back(new double(value));
|
||||
interface_property_string = property_element->GetDataLine();
|
||||
PropertyManager->Tie(interface_property_string,
|
||||
interface_properties.back());
|
||||
cout << " " << interface_property_string <<
|
||||
" (initial value: " << value << ")" << endl;
|
||||
}
|
||||
property_element = document->FindNextElement("property");
|
||||
}
|
||||
|
||||
gas_cell_element = document->FindElement("gas_cell");
|
||||
while (gas_cell_element) {
|
||||
NoneDefined = false;
|
||||
|
@ -150,7 +175,7 @@ double FGBuoyantForces::GetGasMass(void)
|
|||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
FGColumnVector3& FGBuoyantForces::GetGasMassMoment(void)
|
||||
const FGColumnVector3& FGBuoyantForces::GetGasMassMoment(void)
|
||||
{
|
||||
vXYZgasCell_arm.InitMatrix();
|
||||
for (unsigned int i = 0; i < Cells.size(); i++) {
|
||||
|
@ -161,7 +186,7 @@ FGColumnVector3& FGBuoyantForces::GetGasMassMoment(void)
|
|||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
FGMatrix33& FGBuoyantForces::GetGasMassInertia(void)
|
||||
const FGMatrix33& FGBuoyantForces::GetGasMassInertia(void)
|
||||
{
|
||||
const unsigned int size = Cells.size();
|
||||
|
||||
|
@ -190,8 +215,8 @@ FGMatrix33& FGBuoyantForces::GetGasMassInertia(void)
|
|||
string FGBuoyantForces::GetBuoyancyStrings(string delimeter)
|
||||
{
|
||||
string CoeffStrings = "";
|
||||
bool firstime = true;
|
||||
/*
|
||||
bool firstime = true;
|
||||
for (sd = 0; sd < variables.size(); sd++) {
|
||||
if (firstime) {
|
||||
firstime = false;
|
||||
|
@ -220,8 +245,8 @@ string FGBuoyantForces::GetBuoyancyStrings(string delimeter)
|
|||
string FGBuoyantForces::GetBuoyancyValues(string delimeter)
|
||||
{
|
||||
string SDValues = "";
|
||||
bool firstime = true;
|
||||
/*
|
||||
bool firstime = true;
|
||||
for (sd = 0; sd < variables.size(); sd++) {
|
||||
if (firstime) {
|
||||
firstime = false;
|
||||
|
@ -251,12 +276,6 @@ void FGBuoyantForces::bind(void)
|
|||
{
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
void FGBuoyantForces::unbind(void)
|
||||
{
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
// The bitmasked value choices are as follows:
|
||||
// unset: In this case (the default) JSBSim would only print
|
||||
|
|
|
@ -71,6 +71,10 @@ CLASS DOCUMENTATION
|
|||
|
||||
@code
|
||||
<buoyant_forces>
|
||||
|
||||
<!-- Interface properties -->
|
||||
<property>ballonets/in-flow-ft3ps[0]</property>
|
||||
|
||||
<gas_cell type="HYDROGEN">
|
||||
<location unit="M">
|
||||
<x> 18.8 </x>
|
||||
|
@ -84,7 +88,7 @@ CLASS DOCUMENTATION
|
|||
<valve_coefficient unit="M4*SEC/KG"> 0.015 </valve_coefficient>
|
||||
</gas_cell>
|
||||
|
||||
... {other gass cells} ...
|
||||
... {other gas cells} ...
|
||||
|
||||
</buoyant_forces>
|
||||
@endcode
|
||||
|
@ -124,11 +128,11 @@ public:
|
|||
|
||||
/** Gets the total Buoyant force vector.
|
||||
@return a force vector. */
|
||||
FGColumnVector3 GetForces(void) {return vTotalForces;}
|
||||
const FGColumnVector3& GetForces(void) const {return vTotalForces;}
|
||||
|
||||
/** Gets the total Buoyancy moment vector.
|
||||
@return a moment vector. */
|
||||
FGColumnVector3 GetMoments(void) {return vTotalMoments;}
|
||||
const FGColumnVector3& GetMoments(void) const {return vTotalMoments;}
|
||||
|
||||
/** Gets the total gas mass. The gas mass is part of the aircraft's
|
||||
inertia.
|
||||
|
@ -137,11 +141,11 @@ public:
|
|||
|
||||
/** Gets the total moment from the gas mass.
|
||||
@return a moment vector. */
|
||||
FGColumnVector3& GetGasMassMoment(void);
|
||||
const FGColumnVector3& GetGasMassMoment(void);
|
||||
|
||||
/** Gets the total moments of inertia for the gas mass.
|
||||
@return . */
|
||||
FGMatrix33& GetGasMassInertia(void);
|
||||
const FGMatrix33& GetGasMassInertia(void);
|
||||
|
||||
/** Gets the strings for the current set of gas cells.
|
||||
@param delimeter either a tab or comma string depending on output type
|
||||
|
@ -165,10 +169,11 @@ private:
|
|||
FGColumnVector3 vGasCellXYZ;
|
||||
FGColumnVector3 vXYZgasCell_arm;
|
||||
|
||||
vector <double*> interface_properties;
|
||||
|
||||
bool NoneDefined;
|
||||
|
||||
void bind(void);
|
||||
void unbind(void);
|
||||
|
||||
void Debug(int from);
|
||||
};
|
||||
|
|
|
@ -189,40 +189,41 @@ public:
|
|||
|
||||
/** Get the index of this gas cell
|
||||
@return gas cell index. */
|
||||
int GetIndex(void) {return CellNum;}
|
||||
int GetIndex(void) const {return CellNum;}
|
||||
|
||||
/** Get the center of gravity location of the gas cell
|
||||
(including any ballonets)
|
||||
@return CoG location in the structural frame. */
|
||||
const FGColumnVector3& GetXYZ(void) {return vXYZ;}
|
||||
const FGColumnVector3& GetXYZ(void) const {return vXYZ;}
|
||||
|
||||
/** Get the center of gravity location of the gas cell
|
||||
(including any ballonets)
|
||||
@return CoG location in the structural frame. */
|
||||
double GetXYZ(int idx) {return vXYZ(idx);}
|
||||
double GetXYZ(int idx) const {return vXYZ(idx);}
|
||||
|
||||
/** Get the current mass of the gas cell (including any ballonets)
|
||||
@return gas mass in slug. */
|
||||
double GetMass(void) {return Mass;}
|
||||
double GetMass(void) const {return Mass;}
|
||||
|
||||
/** Get the moments of inertia of the gas cell (including any ballonets)
|
||||
@return moments of inertia matrix in slug ft<sup>2</sup>. */
|
||||
FGMatrix33& GetInertia(void) {return gasCellJ;}
|
||||
@return moments of inertia matrix relative the gas cell location
|
||||
in slug ft<sup>2</sup>. */
|
||||
const FGMatrix33& GetInertia(void) const {return gasCellJ;}
|
||||
|
||||
/** Get the moment due to mass of the gas cell (including any ballonets)
|
||||
|
||||
Note that the buoyancy of the gas cell is handled separately by the
|
||||
FGForce part and not included here.
|
||||
@return moment vector in lbs ft. */
|
||||
FGColumnVector3& GetMassMoment(void) {return gasCellM;}
|
||||
const FGColumnVector3& GetMassMoment(void) const {return gasCellM;}
|
||||
|
||||
/** Get the current gas temperature inside the gas cell
|
||||
@return gas temperature in Rankine. */
|
||||
double GetTemperature(void) {return Temperature;}
|
||||
double GetTemperature(void) const {return Temperature;}
|
||||
|
||||
/** Get the current gas pressure inside the gas cell
|
||||
@return gas pressure in lbs / ft<sup>2</sup>. */
|
||||
double GetPressure(void) {return Pressure;}
|
||||
double GetPressure(void) const {return Pressure;}
|
||||
|
||||
private:
|
||||
|
||||
|
@ -316,25 +317,25 @@ public:
|
|||
|
||||
/** Get the center of gravity location of the ballonet
|
||||
@return CoG location in the structural frame. */
|
||||
const FGColumnVector3& GetXYZ(void) {return vXYZ;}
|
||||
const FGColumnVector3& GetXYZ(void) const {return vXYZ;}
|
||||
/** Get the center of gravity location of the ballonet
|
||||
@return CoG location in the structural frame. */
|
||||
double GetXYZ(int idx) {return vXYZ(idx);}
|
||||
double GetXYZ(int idx) const {return vXYZ(idx);}
|
||||
|
||||
/** Get the current mass of the ballonets
|
||||
@return mass in slug. */
|
||||
double GetMass(void) {return Contents * M_air;}
|
||||
double GetMass(void) const {return Contents * M_air;}
|
||||
|
||||
/** Get the moments of inertia of the ballonet
|
||||
@return moments of inertia matrix in slug ft<sup>2</sup>. */
|
||||
FGMatrix33& GetInertia(void) {return ballonetJ;}
|
||||
const FGMatrix33& GetInertia(void) const {return ballonetJ;}
|
||||
|
||||
/** Get the current volume of the ballonet
|
||||
@return volume in ft<sup>3</sup>. */
|
||||
double GetVolume(void) {return Volume;}
|
||||
double GetVolume(void) const {return Volume;}
|
||||
/** Get the current heat flow into the ballonet
|
||||
@return heat flow in lbs ft / sec. */
|
||||
double GetHeatFlow(void) {return dU;} // [lbs ft / sec]
|
||||
double GetHeatFlow(void) const {return dU;} // [lbs ft / sec]
|
||||
|
||||
private:
|
||||
int CellNum;
|
||||
|
|
|
@ -322,6 +322,7 @@ void FGPiston::ResetToIC(void)
|
|||
|
||||
ManifoldPressure_inHg = Atmosphere->GetPressure() * psftoinhg; // psf to in Hg
|
||||
MAP = Atmosphere->GetPressure() * psftopa;
|
||||
TMAP = MAP;
|
||||
double airTemperature_degK = RankineToKelvin(Atmosphere->GetTemperature());
|
||||
OilTemp_degK = airTemperature_degK;
|
||||
CylinderHeadTemp_degK = airTemperature_degK;
|
||||
|
@ -512,7 +513,7 @@ void FGPiston::doBoostControl(void)
|
|||
* Inputs: p_amb, Throttle, ThrottleAngle,
|
||||
* MeanPistonSpeed_fps, dt
|
||||
*
|
||||
* Outputs: MAP, ManifoldPressure_inHg
|
||||
* Outputs: MAP, ManifoldPressure_inHg, TMAP
|
||||
*/
|
||||
|
||||
void FGPiston::doMAP(void)
|
||||
|
@ -524,23 +525,19 @@ void FGPiston::doMAP(void)
|
|||
|
||||
if ( map_coefficient < 0.1 ) map_coefficient = 0.1;
|
||||
|
||||
// map_coefficient = pow ((throttle_area * MaxManifoldPressure_Percent),RPM/MaxRPM);
|
||||
// Add a one second lag to manifold pressure changes
|
||||
double dMAP = (MAP - p_amb * map_coefficient) * dt;
|
||||
MAP -=dMAP;
|
||||
double dMAP = (TMAP - p_amb * map_coefficient) * dt;
|
||||
TMAP -=dMAP;
|
||||
|
||||
// Find the mean effective pressure required to achieve this manifold pressure
|
||||
// Doing this before boost so boost doesn't add horsepower to the engine.
|
||||
// A better method would be deterimining the HP consumed by the supercharger
|
||||
// Fixme: determine the HP consumed by the supercharger
|
||||
|
||||
PMEP = MAP - p_amb; // Fixme: p_amb should be exhaust manifold pressure
|
||||
PMEP = TMAP - p_amb; // Fixme: p_amb should be exhaust manifold pressure
|
||||
|
||||
if (Boosted) {
|
||||
// If takeoff boost is fitted, we currently assume the following throttle map:
|
||||
// (In throttle % - actual input is 0 -> 1)
|
||||
// 99 / 100 - Takeoff boost
|
||||
// 96 / 97 / 98 - Rated boost
|
||||
// 0 - 95 - Idle to Rated boost (MinManifoldPressure to MaxManifoldPressure)
|
||||
// In real life, most planes would be fitted with a mechanical 'gate' between
|
||||
// the rated boost and takeoff boost positions.
|
||||
|
||||
|
@ -548,22 +545,20 @@ void FGPiston::doMAP(void)
|
|||
if (bTakeoffBoost) {
|
||||
if (Throttle > 0.98) {
|
||||
bTakeoffPos = true;
|
||||
} else if(Throttle <= 0.95) {
|
||||
bTakeoffPos = false;
|
||||
} else {
|
||||
bTakeoffPos = false;
|
||||
}
|
||||
}
|
||||
// Boost the manifold pressure.
|
||||
double boost_factor = BoostMul[BoostSpeed] * map_coefficient * RPM/RatedRPM[BoostSpeed];
|
||||
if (boost_factor < 1.0) boost_factor = 1.0; // boost will never reduce the MAP
|
||||
MAP *= boost_factor;
|
||||
MAP = TMAP * boost_factor;
|
||||
// Now clip the manifold pressure to BCV or Wastegate setting.
|
||||
if (bTakeoffPos) {
|
||||
if (MAP > TakeoffMAP[BoostSpeed]) MAP = TakeoffMAP[BoostSpeed];
|
||||
} else {
|
||||
if (MAP > RatedMAP[BoostSpeed]) MAP = RatedMAP[BoostSpeed];
|
||||
}
|
||||
} else {
|
||||
MAP = TMAP;
|
||||
}
|
||||
|
||||
// And set the value in American units as well
|
||||
|
|
|
@ -80,7 +80,7 @@ CLASS DOCUMENTATION
|
|||
<maxrpm> {number} </maxrpm>
|
||||
<maxthrottle> {number} </maxthrottle>
|
||||
<minthrottle> {number} </minthrottle>
|
||||
<bsfc unit="{LBS/HP*HR | "KG/KW*HR"}"> {number} </bsft>
|
||||
<bsfc unit="{LBS/HP*HR | "KG/KW*HR"}"> {number} </bsfc>
|
||||
<volumetric_efficiency> {number} </volumetric_efficiency>
|
||||
<numboostspeeds> {number} </numboostspeeds>
|
||||
<boostoverride> {0 | 1} </boostoverride>
|
||||
|
@ -295,6 +295,7 @@ private:
|
|||
double minMAP; // Pa
|
||||
double maxMAP; // Pa
|
||||
double MAP; // Pa
|
||||
double TMAP; // Pa - throttle manifold pressure e.g. before the supercharger boost
|
||||
double ISFC; // Indicated specific fuel consumption [lbs/horsepower*hour
|
||||
|
||||
//
|
||||
|
|
Loading…
Reference in a new issue