rocket engine and piston engine fixes
This commit is contained in:
parent
a70431c5a4
commit
b1eebb21a6
3 changed files with 35 additions and 16 deletions
|
@ -88,7 +88,7 @@ FGPiston::FGPiston(FGFDMExec* exec, Element* el, int engine_number)
|
|||
MinManifoldPressure_inHg = 6.5;
|
||||
MaxManifoldPressure_inHg = 28.5;
|
||||
ISFC = -1;
|
||||
volumetric_efficiency = -0.1;
|
||||
volumetric_efficiency = 0.85;
|
||||
Bore = 5.125;
|
||||
Stroke = 4.375;
|
||||
Cylinders = 4;
|
||||
|
@ -239,32 +239,41 @@ FGPiston::FGPiston(FGFDMExec* exec, Element* el, int engine_number)
|
|||
|
||||
StarterHP = sqrt(MaxHP) * 0.4;
|
||||
displacement_SI = Displacement * in3tom3;
|
||||
RatedMeanPistonSpeed_fps = ( MaxRPM * Stroke) / (360); // AKA 2 * (RPM/60) * ( Stroke / 12) or 2NS
|
||||
|
||||
// Create IFSC and VE to match the engine if not provided
|
||||
int calculated_ve=0;
|
||||
if (volumetric_efficiency < 0) {
|
||||
volumetric_efficiency = MaxManifoldPressure_inHg / 29.92;
|
||||
calculated_ve=1;
|
||||
}
|
||||
// Create IFSC to match the engine if not provided
|
||||
if (ISFC < 0) {
|
||||
double pmep = MaxManifoldPressure_inHg > 29.92 ? 0 : 29.92 - MaxManifoldPressure_inHg;
|
||||
double pmep = 29.92 - MaxManifoldPressure_inHg;
|
||||
pmep *= inhgtopa;
|
||||
double fmep = (18400 * (2*(Stroke/12)*(MaxRPM/60)) * fttom + 46500)/2;
|
||||
double fmep = (18400 * RatedMeanPistonSpeed_fps * fttom + 46500);
|
||||
double hp_loss = ((pmep + fmep) * displacement_SI * MaxRPM)/(Cycles*22371);
|
||||
ISFC = ( Displacement * MaxRPM * volumetric_efficiency ) / (9411 * (MaxHP+hp_loss));
|
||||
ISFC = ( 1.1*Displacement * MaxRPM * volumetric_efficiency *(MaxManifoldPressure_inHg / 29.92) ) / (9411 * (MaxHP+hp_loss));
|
||||
// cout <<"FMEP: "<< fmep <<" PMEP: "<< pmep << " hp_loss: " <<hp_loss <<endl;
|
||||
}
|
||||
if ( MaxManifoldPressure_inHg > 29.9 ) { // Don't allow boosting with a bogus number
|
||||
MaxManifoldPressure_inHg = 29.9;
|
||||
if (calculated_ve) volumetric_efficiency = 1.0;
|
||||
}
|
||||
minMAP = MinManifoldPressure_inHg * inhgtopa; // inHg to Pa
|
||||
maxMAP = MaxManifoldPressure_inHg * inhgtopa;
|
||||
|
||||
// For throttle
|
||||
RatedMeanPistonSpeed_fps = ( MaxRPM * Stroke) / (360); // AKA 2 * (RPM/60) * ( Stroke / 12) or 2NS
|
||||
if(Z_airbox < 998){
|
||||
double Ze=RatedMeanPistonSpeed_fps/PeakMeanPistonSpeed_fps; // engine impedence
|
||||
/*
|
||||
* Pm = ( Ze / ( Ze + Zi + Zt ) ) * Pa
|
||||
* Where:
|
||||
* Pm = Manifold Pressure
|
||||
* Pa = Ambient Pressre
|
||||
* Ze = engine impedance, Ze is effectively 1 / Mean Piston Speed
|
||||
* Zi = airbox impedance
|
||||
* Zt = throttle impedance
|
||||
*
|
||||
* For the calculation below throttle is fully open or Zt = 0
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
if(Z_airbox < 0.0){
|
||||
double Ze=PeakMeanPistonSpeed_fps/RatedMeanPistonSpeed_fps; // engine impedence
|
||||
Z_airbox = (standard_pressure *Ze / maxMAP) - Ze; // impedence of airbox
|
||||
}
|
||||
Z_throttle=(((MaxRPM * Stroke) / 360)/((IdleRPM * Stroke) / 360))*(standard_pressure/minMAP - 1) - Z_airbox; // Constant for Throttle impedence
|
||||
|
@ -913,7 +922,9 @@ void FGPiston::Debug(int from)
|
|||
cout << " MaxThrottle: " << MaxThrottle << endl;
|
||||
cout << " MinThrottle: " << MinThrottle << endl;
|
||||
cout << " ISFC: " << ISFC << endl;
|
||||
cout << " Volumentric Efficiency: " << volumetric_efficiency << endl;
|
||||
cout << " Volumetric Efficiency: " << volumetric_efficiency << endl;
|
||||
cout << " PeakMeanPistonSpeed_fps: " << PeakMeanPistonSpeed_fps << endl;
|
||||
cout << " Intake Impedance Factor: " << Z_airbox << endl;
|
||||
|
||||
cout << endl;
|
||||
cout << " Combustion Efficiency table:" << endl;
|
||||
|
|
|
@ -69,6 +69,7 @@ FGRocket::FGRocket(FGFDMExec* exec, Element *el, int engine_number)
|
|||
FuelFlowRate = 0.0;
|
||||
OxidizerFlowRate = 0.0;
|
||||
SLOxiFlowMax = 0.0;
|
||||
BuildupTime = 0.0;
|
||||
It = 0.0;
|
||||
|
||||
// Defaults
|
||||
|
@ -77,6 +78,8 @@ FGRocket::FGRocket(FGFDMExec* exec, Element *el, int engine_number)
|
|||
|
||||
if (el->FindElement("isp"))
|
||||
Isp = el->FindElementValueAsNumber("isp");
|
||||
if (el->FindElement("builduptime"))
|
||||
BuildupTime = el->FindElementValueAsNumber("builduptime");
|
||||
if (el->FindElement("maxthrottle"))
|
||||
MaxThrottle = el->FindElementValueAsNumber("maxthrottle");
|
||||
if (el->FindElement("minthrottle"))
|
||||
|
@ -127,7 +130,6 @@ double FGRocket::Calculate(void)
|
|||
if (ThrustTable != 0L) { // Thrust table given -> Solid fuel used
|
||||
|
||||
if ((Throttle == 1 || BurnTime > 0.0 ) && !Starved) {
|
||||
BurnTime += State->Getdt();
|
||||
double TotalEngineFuelBurned=0.0;
|
||||
for (int i=0; i<(int)SourceTanks.size(); i++) {
|
||||
FGTank* tank = Propulsion->GetTank(i);
|
||||
|
@ -137,6 +139,11 @@ double FGRocket::Calculate(void)
|
|||
}
|
||||
|
||||
VacThrust = ThrustTable->GetValue(TotalEngineFuelBurned);
|
||||
if (BurnTime <= BuildupTime && BuildupTime > 0.0) {
|
||||
VacThrust *= sin((BurnTime/BuildupTime)*M_PI/2.0);
|
||||
// VacThrust *= (1-cos((BurnTime/BuildupTime)*M_PI))/2.0; // 1 - cos approach
|
||||
}
|
||||
BurnTime += State->Getdt(); // Increment burn time
|
||||
} else {
|
||||
VacThrust = 0.0;
|
||||
}
|
||||
|
|
|
@ -200,6 +200,7 @@ private:
|
|||
double OxidizerFlowRate;
|
||||
double PropellantFlowRate;
|
||||
bool Flameout;
|
||||
double BuildupTime;
|
||||
FGTable* ThrustTable;
|
||||
|
||||
void Debug(int from);
|
||||
|
|
Loading…
Reference in a new issue