fgpropulsion.cpp
来自「6 DOF Missle Simulation」· C++ 代码 · 共 699 行 · 第 1/2 页
CPP
699 行
return string(localpath + engine_filename + ".xml"); } } return string(fullpath + engine_filename + ".xml");}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ifstream* FGPropulsion::FindEngineFile(string engine_filename){ string fullpath, localpath; string enginePath = FDMExec->GetEnginePath(); string aircraftPath = FDMExec->GetFullAircraftPath(); ifstream* engine_file = new ifstream(); string separator = "/"; fullpath = enginePath + separator; localpath = aircraftPath + separator + "Engines" + separator; engine_file->open(string(fullpath + engine_filename + ".xml").c_str()); if ( !engine_file->is_open()) { engine_file->open(string(localpath + engine_filename + ".xml").c_str()); if ( !engine_file->is_open()) { cerr << " Could not open engine file: " << engine_filename << " in path " << fullpath << " or " << localpath << endl; } } return engine_file;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%string FGPropulsion::GetPropulsionStrings(string delimeter){ unsigned int i; string PropulsionStrings = ""; bool firstime = true; stringstream buf; for (i=0; i<Engines.size(); i++) { if (firstime) firstime = false; else PropulsionStrings += delimeter; PropulsionStrings += Engines[i]->GetEngineLabels(delimeter); } for (i=0; i<Tanks.size(); i++) { if (Tanks[i]->GetType() == FGTank::ttFUEL) buf << delimeter << "Fuel Tank " << i; else if (Tanks[i]->GetType() == FGTank::ttOXIDIZER) buf << delimeter << "Oxidizer Tank " << i; } return PropulsionStrings;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%string FGPropulsion::GetPropulsionValues(string delimeter){ unsigned int i; string PropulsionValues = ""; bool firstime = true; stringstream buf; for (i=0; i<Engines.size(); i++) { if (firstime) firstime = false; else PropulsionValues += delimeter; PropulsionValues += Engines[i]->GetEngineValues(delimeter); } for (i=0; i<Tanks.size(); i++) { buf << delimeter; buf << Tanks[i]->GetContents(); } return PropulsionValues;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FGColumnVector3& FGPropulsion::GetTanksMoment(void){ vXYZtank_arm.InitMatrix(); for (unsigned int i=0; i<Tanks.size(); i++) { vXYZtank_arm(eX) += Tanks[i]->GetXYZ(eX) * Tanks[i]->GetContents(); vXYZtank_arm(eY) += Tanks[i]->GetXYZ(eY) * Tanks[i]->GetContents(); vXYZtank_arm(eZ) += Tanks[i]->GetXYZ(eZ) * Tanks[i]->GetContents(); } return vXYZtank_arm;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double FGPropulsion::GetTanksWeight(void){ double Tw = 0.0; for (unsigned int i=0; i<Tanks.size(); i++) Tw += Tanks[i]->GetContents(); return Tw;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FGMatrix33& FGPropulsion::CalculateTankInertias(void){ unsigned int size; size = Tanks.size(); if (size == 0) return tankJ; tankJ = FGMatrix33(); for (unsigned int i=0; i<size; i++) { tankJ += MassBalance->GetPointmassInertia( lbtoslug * Tanks[i]->GetContents(), Tanks[i]->GetXYZ() ); tankJ(1,1) += Tanks[i]->GetIxx(); tankJ(2,2) += Tanks[i]->GetIyy(); tankJ(3,3) += Tanks[i]->GetIzz(); } return tankJ;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGPropulsion::SetMagnetos(int setting){ if (ActiveEngine < 0) { for (unsigned i=0; i<Engines.size(); i++) { // ToDo: first need to make sure the engine Type is really appropriate: // do a check to see if it is of type Piston. This should be done for // all of this kind of possibly across-the-board settings. ((FGPiston*)Engines[i])->SetMagnetos(setting); } } else { ((FGPiston*)Engines[ActiveEngine])->SetMagnetos(setting); }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGPropulsion::SetStarter(int setting){ if (ActiveEngine < 0) { for (unsigned i=0; i<Engines.size(); i++) { if (setting == 0) Engines[i]->SetStarter(false); else Engines[i]->SetStarter(true); } } else { if (setting == 0) Engines[ActiveEngine]->SetStarter(false); else Engines[ActiveEngine]->SetStarter(true); }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGPropulsion::SetCutoff(int setting){ if (ActiveEngine < 0) { for (unsigned i=0; i<Engines.size(); i++) { if (setting == 0) ((FGTurbine*)Engines[i])->SetCutoff(false); else ((FGTurbine*)Engines[i])->SetCutoff(true); } } else { if (setting == 0) ((FGTurbine*)Engines[ActiveEngine])->SetCutoff(false); else ((FGTurbine*)Engines[ActiveEngine])->SetCutoff(true); }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGPropulsion::SetActiveEngine(int engine){ if (engine >= (int)Engines.size() || engine < 0) ActiveEngine = -1; else ActiveEngine = engine;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%double FGPropulsion::Transfer(int source, int target, double amount){ double shortage, overage; if (source == -1) { shortage = 0.0; } else { shortage = Tanks[source]->Drain(amount); } if (target == -1) { overage = 0.0; } else { overage = Tanks[target]->Fill(amount - shortage); } return overage;}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGPropulsion::DoRefuel(double time_slice){ unsigned int i; double fillrate = 100 * time_slice; // 100 lbs/sec = 6000 lbs/min int TanksNotFull = 0; for (i=0; i<numTanks; i++) { if (Tanks[i]->GetPctFull() < 99.99) ++TanksNotFull; } if (TanksNotFull) { for (i=0; i<numTanks; i++) { if (Tanks[i]->GetPctFull() < 99.99) Transfer(-1, i, fillrate/TanksNotFull); } }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGPropulsion::DumpFuel(double time_slice){ unsigned int i; int TanksDumping = 0; for (i=0; i<numTanks; i++) { if (Tanks[i]->GetContents() > Tanks[i]->GetStandpipe()) ++TanksDumping; } if (TanksDumping == 0) return; double dump_rate_per_tank = DumpRate / 60.0 * time_slice / TanksDumping; for (i=0; i<numTanks; i++) { if (Tanks[i]->GetContents() > Tanks[i]->GetStandpipe()) { Transfer(i, -1, dump_rate_per_tank); } }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGPropulsion::SetFuelFreeze(bool f){ fuel_freeze = f; for (unsigned int i=0; i<numEngines; i++) { Engines[i]->SetFuelFreeze(f); }}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%void FGPropulsion::bind(void){ typedef double (FGPropulsion::*PMF)(int) const; typedef int (FGPropulsion::*iPMF)(void) const; IsBound = true; PropertyManager->Tie("propulsion/set-running", this, (iPMF)0, &FGPropulsion::InitRunning, true); if (HaveTurbineEngine) { PropertyManager->Tie("propulsion/starter_cmd", this, (iPMF)0, &FGPropulsion::SetStarter, true); PropertyManager->Tie("propulsion/cutoff_cmd", this, (iPMF)0, &FGPropulsion::SetCutoff, true); } if (HavePistonEngine) { PropertyManager->Tie("propulsion/starter_cmd", this, (iPMF)0, &FGPropulsion::SetStarter, true); PropertyManager->Tie("propulsion/magneto_cmd", this, (iPMF)0, &FGPropulsion::SetMagnetos, true); } PropertyManager->Tie("propulsion/active_engine", this, (iPMF)&FGPropulsion::GetActiveEngine, &FGPropulsion::SetActiveEngine, true); PropertyManager->Tie("propulsion/total-fuel-lbs", this, &FGPropulsion::GetTotalFuelQuantity); PropertyManager->Tie("propulsion/refuel", this, &FGPropulsion::GetRefuel, &FGPropulsion::SetRefuel, true); PropertyManager->Tie("propulsion/fuel_dump", this, &FGPropulsion::GetFuelDump, &FGPropulsion::SetFuelDump, true); PropertyManager->Tie("forces/fbx-prop-lbs", this,1, (PMF)&FGPropulsion::GetForces); PropertyManager->Tie("forces/fby-prop-lbs", this,2, (PMF)&FGPropulsion::GetForces); PropertyManager->Tie("forces/fbz-prop-lbs", this,3, (PMF)&FGPropulsion::GetForces); PropertyManager->Tie("moments/l-prop-lbsft", this,1, (PMF)&FGPropulsion::GetMoments); PropertyManager->Tie("moments/m-prop-lbsft", this,2, (PMF)&FGPropulsion::GetMoments); PropertyManager->Tie("moments/n-prop-lbsft", this,3, (PMF)&FGPropulsion::GetMoments);}//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%// The bitmasked value choices are as follows:// unset: In this case (the default) JSBSim would only print// out the normally expected messages, essentially echoing// the config files as they are read. If the environment// variable is not set, debug_lvl is set to 1 internally// 0: This requests JSBSim not to output any messages// whatsoever.// 1: This value explicity requests the normal JSBSim// startup messages// 2: This value asks for a message to be printed out when// a class is instantiated// 4: When this value is set, a message is displayed when a// FGModel object executes its Run() method// 8: When this value is set, various runtime state variables// are printed out periodically// 16: When set various parameters are sanity checked and// a message is printed out when they go out of boundsvoid FGPropulsion::Debug(int from){ if (debug_lvl <= 0) return; if (debug_lvl & 1) { // Standard console startup message output if (from == 2) { // Loader cout << endl << " Propulsion:" << endl; } } if (debug_lvl & 2 ) { // Instantiation/Destruction notification if (from == 0) cout << "Instantiated: FGPropulsion" << endl; if (from == 1) cout << "Destroyed: FGPropulsion" << endl; } if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects } if (debug_lvl & 8 ) { // Runtime state variables } if (debug_lvl & 16) { // Sanity checking } if (debug_lvl & 64) { if (from == 0) { // Constructor cout << IdSrc << endl; cout << IdHdr << endl; } }}}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?