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 + -
显示快捷键?