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
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);
}
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;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-FGColumnVector3& FGBuoyantForces::GetGasMassMoment(void)
+const FGColumnVector3& FGBuoyantForces::GetGasMassMoment(void)
{
vXYZgasCell_arm.InitMatrix();
for (unsigned int i = 0; i < Cells.size(); i++) {
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-FGMatrix33& FGBuoyantForces::GetGasMassInertia(void)
+const FGMatrix33& FGBuoyantForces::GetGasMassInertia(void)
{
const unsigned int size = Cells.size();
string FGBuoyantForces::GetBuoyancyStrings(string delimeter)
{
string CoeffStrings = "";
- bool firstime = true;
/*
+ bool firstime = true;
for (sd = 0; sd < variables.size(); sd++) {
if (firstime) {
firstime = false;
string FGBuoyantForces::GetBuoyancyValues(string delimeter)
{
string SDValues = "";
- bool firstime = true;
/*
+ bool firstime = true;
for (sd = 0; sd < variables.size(); sd++) {
if (firstime) {
firstime = false;
{
}
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-void FGBuoyantForces::unbind(void)
-{
-}
-
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// The bitmasked value choices are as follows:
// unset: In this case (the default) JSBSim would only print
@code
<buoyant_forces>
+
+ <!-- Interface properties -->
+ <property>ballonets/in-flow-ft3ps[0]</property>
+
<gas_cell type="HYDROGEN">
<location unit="M">
<x> 18.8 </x>
<valve_coefficient unit="M4*SEC/KG"> 0.015 </valve_coefficient>
</gas_cell>
- ... {other gass cells} ...
+ ... {other gas cells} ...
</buoyant_forces>
@endcode
/** 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.
/** 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
FGColumnVector3 vGasCellXYZ;
FGColumnVector3 vXYZgasCell_arm;
+ vector <double*> interface_properties;
+
bool NoneDefined;
void bind(void);
- void unbind(void);
void Debug(int from);
};
/** 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:
/** 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;
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;
* Inputs: p_amb, Throttle, ThrottleAngle,
* MeanPistonSpeed_fps, dt
*
- * Outputs: MAP, ManifoldPressure_inHg
+ * Outputs: MAP, ManifoldPressure_inHg, TMAP
*/
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.
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
<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>
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
//