47 #include "FGFDMExec.h"
48 #include "models/atmosphere/FGStandardAtmosphere.h"
49 #include "models/atmosphere/FGWinds.h"
50 #include "models/FGFCS.h"
51 #include "models/FGPropulsion.h"
52 #include "models/FGMassBalance.h"
53 #include "models/FGExternalReactions.h"
54 #include "models/FGBuoyantForces.h"
55 #include "models/FGAerodynamics.h"
56 #include "models/FGInertial.h"
57 #include "models/FGAircraft.h"
58 #include "models/FGAccelerations.h"
59 #include "models/FGAuxiliary.h"
60 #include "models/FGInput.h"
61 #include "initialization/FGTrim.h"
62 #include "input_output/FGScript.h"
63 #include "input_output/FGXMLFileRead.h"
77 : Root(root), RandomEngine(new default_random_engine), FDMctr(fdmctr)
96 IncrementThenHolding =
false;
97 TimeStepsUntilHold = -1;
103 AircraftPath =
"aircraft";
104 EnginePath =
"engine";
105 SystemsPath =
"systems";
108 char* num = getenv(
"JSBSIM_DEBUG");
109 if (num) debug_lvl = atoi(num);
120 FDMctr =
new unsigned int;
130 FGPropertyNode* instanceRoot = Root->GetNode(
"/fdm/jsbsim",IdFDM,
true);
134 char* num = getenv(
"JSBSIM_DISPERSE");
136 if (atoi(num) != 0) disperse = 1;
140 std::cerr <<
"Could not process JSBSIM_DISPERSIONS environment variable: Assumed NO dispersions." << endl;
148 catch (
const string& msg) {
149 cerr << endl <<
"Caught error: " << msg << endl;
153 cout << endl <<
"Caught error: " << e.what() << endl;
162 typedef int (
FGFDMExec::*iPMF)(void)
const;
165 instance->
Tie(
"simulation/disperse",
this, &FGFDMExec::GetDisperse);
166 instance->
Tie(
"simulation/randomseed",
this, (iPMF)&FGFDMExec::SRand, &FGFDMExec::SRand);
167 instance->
Tie(
"simulation/terminate", (
int *)&Terminate);
168 instance->
Tie(
"simulation/pause", (
int *)&holding);
172 instance->
Tie(
"simulation/frame", (
int *)&Frame);
173 instance->
Tie(
"simulation/trim-completed", (
int *)&trim_completed);
176 Constructing =
false;
200 }
catch (
const string& msg ) {
201 cout <<
"Caught error: " << msg << endl;
204 for (
unsigned int i=1; i<ChildFDMList.size(); i++)
delete ChildFDMList[i]->exec;
206 if (FDMctr != 0) (*FDMctr)--;
232 bool FGFDMExec::Allocate(
void)
236 Models.resize(eNumStandardModels);
248 Models[eInput] =
new FGInput(
this);
250 Models[eWinds] =
new FGWinds(
this);
251 Models[eSystems] =
new FGFCS(
this);
261 Models[eOutput] =
new FGOutput(
this);
267 Winds = (
FGWinds*)Models[eWinds];
268 FCS = (
FGFCS*)Models[eSystems];
278 Output = (
FGOutput*)Models[eOutput];
281 LoadPlanetConstants();
296 void FGFDMExec::InitializeModels(
void)
298 for (
unsigned int i = 0; i < Models.size(); i++) {
300 if (i == eInput || i == eOutput)
continue;
303 Models[i]->InitModel();
309 bool FGFDMExec::DeAllocate(
void)
312 for (
unsigned int i=0; i<eNumStandardModels; i++)
delete Models[i];
331 for (
unsigned int i=1; i<ChildFDMList.size(); i++) {
332 ChildFDMList[i]->AssignState( (
FGPropagate*)Models[ePropagate] );
333 ChildFDMList[i]->Run();
341 for (
unsigned int i = 0; i < Models.size(); i++) {
343 Models[i]->Run(holding);
347 unsigned int mode = ResetMode;
353 if (Terminate) success =
false;
360 void FGFDMExec::LoadInputs(
unsigned int idx)
364 Propagate->in.vPQRidot = Accelerations->
GetPQRidot();
365 Propagate->in.vUVWidot = Accelerations->
GetUVWidot();
366 Propagate->in.DeltaT = dT;
371 Inertial->in.Position = Propagate->GetLocation();
378 Winds->in.DistanceAGL = Propagate->GetDistanceAGL();
379 Winds->in.Tl2b = Propagate->
GetTl2b();
380 Winds->in.Tw2b = Auxiliary->
GetTw2b();
381 Winds->in.V = Auxiliary->
GetVt();
382 Winds->in.totalDeltaT = dT * Winds->
GetRate();
385 Auxiliary->in.Pressure = Atmosphere->
GetPressure();
386 Auxiliary->in.Density = Atmosphere->
GetDensity();
388 Auxiliary->in.PressureSL = Atmosphere->GetPressureSL();
392 Auxiliary->in.DistanceAGL = Propagate->GetDistanceAGL();
393 Auxiliary->in.Mass = MassBalance->GetMass();
394 Auxiliary->in.Tl2b = Propagate->
GetTl2b();
395 Auxiliary->in.Tb2l = Propagate->
GetTb2l();
396 Auxiliary->in.vPQR = Propagate->
GetPQR();
397 Auxiliary->in.vPQRi = Propagate->
GetPQRi();
398 Auxiliary->in.vPQRidot = Accelerations->
GetPQRidot();
399 Auxiliary->in.vUVW = Propagate->
GetUVW();
400 Auxiliary->in.vUVWdot = Accelerations->
GetUVWdot();
401 Auxiliary->in.vVel = Propagate->
GetVel();
402 Auxiliary->in.vBodyAccel = Accelerations->
GetBodyAccel();
403 Auxiliary->in.ToEyePt = MassBalance->
StructuralToBody(Aircraft->GetXYZep());
404 Auxiliary->in.VRPBody = MassBalance->
StructuralToBody(Aircraft->GetXYZvrp());
406 Auxiliary->in.vFw = Aerodynamics->
GetvFw();
407 Auxiliary->in.vLocation = Propagate->GetLocation();
408 Auxiliary->in.CosTht = Propagate->
GetCosEuler(eTht);
409 Auxiliary->in.SinTht = Propagate->
GetSinEuler(eTht);
410 Auxiliary->in.CosPhi = Propagate->
GetCosEuler(ePhi);
411 Auxiliary->in.SinPhi = Propagate->
GetSinEuler(ePhi);
413 Auxiliary->in.TurbPQR = Winds->GetTurbPQR();
419 Propulsion->in.Pressure = Atmosphere->
GetPressure();
423 Propulsion->in.Density = Atmosphere->
GetDensity();
427 Propulsion->in.Vt = Auxiliary->
GetVt();
428 Propulsion->in.qbar = Auxiliary->Getqbar();
429 Propulsion->in.TAT_c = Auxiliary->GetTAT_C();
430 Propulsion->in.AeroUVW = Auxiliary->GetAeroUVW();
431 Propulsion->in.AeroPQR = Auxiliary->GetAeroPQR();
432 Propulsion->in.alpha = Auxiliary->Getalpha();
433 Propulsion->in.beta = Auxiliary->Getbeta();
434 Propulsion->in.TotalDeltaT = dT * Propulsion->
GetRate();
441 Propulsion->in.H_agl = Propagate->GetDistanceAGL();
442 Propulsion->in.PQRi = Propagate->
GetPQRi();
446 Aerodynamics->in.Alpha = Auxiliary->Getalpha();
447 Aerodynamics->in.Beta = Auxiliary->Getbeta();
448 Aerodynamics->in.Qbar = Auxiliary->Getqbar();
449 Aerodynamics->in.Vt = Auxiliary->
GetVt();
450 Aerodynamics->in.Tb2w = Auxiliary->
GetTb2w();
451 Aerodynamics->in.Tw2b = Auxiliary->
GetTw2b();
454 case eGroundReactions:
456 GroundReactions->in.Vground = Auxiliary->
GetVground();
460 GroundReactions->in.BrakePos = FCS->GetBrakePos();
461 GroundReactions->in.FCSGearPos = FCS->
GetGearPos();
462 GroundReactions->in.EmptyWeight = MassBalance->GetEmptyWeight();
463 GroundReactions->in.Tb2l = Propagate->
GetTb2l();
464 GroundReactions->in.Tec2l = Propagate->
GetTec2l();
465 GroundReactions->in.Tec2b = Propagate->
GetTec2b();
466 GroundReactions->in.PQR = Propagate->
GetPQR();
467 GroundReactions->in.UVW = Propagate->
GetUVW();
468 GroundReactions->in.DistanceAGL = Propagate->GetDistanceAGL();
470 GroundReactions->in.TotalDeltaT = dT * GroundReactions->
GetRate();
471 GroundReactions->in.WOW = GroundReactions->GetWOW();
472 GroundReactions->in.Location = Propagate->GetLocation();
473 GroundReactions->in.vXYZcg = MassBalance->
GetXYZcg();
475 case eExternalReactions:
479 BuoyantForces->in.Density = Atmosphere->
GetDensity();
480 BuoyantForces->in.Pressure = Atmosphere->
GetPressure();
482 BuoyantForces->in.gravity = Inertial->GetGravity().
Magnitude();
486 MassBalance->in.GasMass = BuoyantForces->
GetGasMass();
488 MassBalance->in.TanksWeight = Propulsion->GetTanksWeight();
489 MassBalance->in.TanksMoment = Propulsion->GetTanksMoment();
490 MassBalance->in.TankInertia = Propulsion->CalculateTankInertias();
491 MassBalance->in.WOW = GroundReactions->GetWOW();
494 Aircraft->in.AeroForce = Aerodynamics->
GetForces();
495 Aircraft->in.PropForce = Propulsion->GetForces();
496 Aircraft->in.GroundForce = GroundReactions->GetForces();
497 Aircraft->in.ExternalForce = ExternalReactions->
GetForces();
498 Aircraft->in.BuoyantForce = BuoyantForces->
GetForces();
499 Aircraft->in.AeroMoment = Aerodynamics->
GetMoments();
500 Aircraft->in.PropMoment = Propulsion->GetMoments();
501 Aircraft->in.GroundMoment = GroundReactions->GetMoments();
502 Aircraft->in.ExternalMoment = ExternalReactions->
GetMoments();
503 Aircraft->in.BuoyantMoment = BuoyantForces->
GetMoments();
506 Accelerations->in.
J = MassBalance->
GetJ();
512 Accelerations->in.
Moment = Aircraft->GetMoments();
513 Accelerations->in.
GroundMoment = GroundReactions->GetMoments();
514 Accelerations->in.
Force = Aircraft->GetForces();
515 Accelerations->in.
GroundForce = GroundReactions->GetForces();
516 Accelerations->in.
vGravAccel = Inertial->GetGravity();
521 Accelerations->in.
DeltaT = dT;
522 Accelerations->in.
Mass = MassBalance->GetMass();
523 Accelerations->in.
MultipliersList = GroundReactions->GetMultipliersList();
534 void FGFDMExec::LoadPlanetConstants(
void)
536 Propagate->in.vOmegaPlanet = Inertial->GetOmegaPlanet();
537 Accelerations->in.
vOmegaPlanet = Inertial->GetOmegaPlanet();
538 Propagate->in.SemiMajor = Inertial->GetSemimajor();
539 Propagate->in.SemiMinor = Inertial->GetSemiminor();
540 Auxiliary->in.StandardGravity = Inertial->GetStandardGravity();
545 void FGFDMExec::LoadModelConstants(
void)
548 Aerodynamics->in.Wingarea = Aircraft->
GetWingArea();
549 Aerodynamics->in.Wingchord = Aircraft->
Getcbar();
550 Aerodynamics->in.Wingincidence = Aircraft->GetWingIncidence();
551 Aerodynamics->in.Wingspan = Aircraft->
GetWingSpan();
553 Auxiliary->in.Wingchord = Aircraft->
Getcbar();
554 GroundReactions->in.vXYZcg = MassBalance->
GetXYZcg();
567 Models[eInput]->InitModel();
568 Models[eOutput]->InitModel();
571 Propagate->InitializeDerivatives();
575 MassBalance->GetMassPropertiesReport(0);
578 <<
"End of vehicle configuration loading." << endl
579 <<
"-------------------------------------------------------------------------------"
580 <<
reset << std::setprecision(6) << endl;
583 for (
unsigned int n=0; n < propulsion->
GetNumEngines(); ++n) {
587 }
catch (
const string& str) {
601 Propagate->SetInitialState(FGIC);
610 if (Constructing)
return;
619 Script->ResetEvents();
623 if (!(mode & DONT_EXECUTE_RUN_IC))
634 Propagate->in.vPQRidot = Accelerations->
GetPQRidot();
635 Propagate->in.vUVWidot = Accelerations->
GetUVWidot();
644 vector <string> FDMList;
649 for (
unsigned int i=1; i<ChildFDMList.size(); i++) {
650 FDMList.push_back(ChildFDMList[i]->exec->GetAircraft()->GetAircraftName());
659 const SGPath& initfile)
664 result = Script->
LoadScript(GetFullPath(script), deltaT, initfile);
672 const SGPath& SystemsPath,
const string& model,
675 FGFDMExec::AircraftPath = GetFullPath(AircraftPath);
676 FGFDMExec::EnginePath = GetFullPath(EnginePath);
677 FGFDMExec::SystemsPath = GetFullPath(SystemsPath);
686 SGPath aircraftCfgFileName;
691 if( AircraftPath.isNull() || EnginePath.isNull() || SystemsPath.isNull()) {
692 cerr <<
"Error: attempted to load aircraft with undefined "
693 <<
"aircraft, engine, and system paths" << endl;
697 FullAircraftPath = AircraftPath;
698 if (addModelToPath) FullAircraftPath.append(model);
699 aircraftCfgFileName = FullAircraftPath/(model +
".xml");
706 int saved_debug_lvl = debug_lvl;
708 Element *document = XMLFileRead.LoadXMLDocument(aircraftCfgFileName);
711 if (IsChild) debug_lvl = 0;
713 ReadPrologue(document);
715 if (IsChild) debug_lvl = saved_debug_lvl;
720 result = ReadFileHeader(element);
722 cerr << endl <<
"Aircraft fileheader element has problems in file " << aircraftCfgFileName << endl;
727 if (IsChild) debug_lvl = 0;
732 result = Models[eInertial]->Load(element);
734 cerr << endl <<
"Planet element has problems in file " << aircraftCfgFileName << endl;
738 LoadPlanetConstants();
746 result = Models[eAircraft]->Load(element);
748 cerr << endl <<
"Aircraft metrics element has problems in file " << aircraftCfgFileName << endl;
752 cerr << endl <<
"No metrics element was found in the aircraft config file." << endl;
759 result = Models[eMassBalance]->Load(element);
761 cerr << endl <<
"Aircraft mass_balance element has problems in file " << aircraftCfgFileName << endl;
765 cerr << endl <<
"No mass_balance element was found in the aircraft config file." << endl;
770 element = document->
FindElement(
"ground_reactions");
772 result = Models[eGroundReactions]->Load(element);
775 <<
"Aircraft ground_reactions element has problems in file "
776 << aircraftCfgFileName << endl;
780 cerr << endl <<
"No ground_reactions element was found in the aircraft config file." << endl;
785 element = document->
FindElement(
"external_reactions");
787 result = Models[eExternalReactions]->Load(element);
789 cerr << endl <<
"Aircraft external_reactions element has problems in file " << aircraftCfgFileName << endl;
797 result = Models[eBuoyantForces]->Load(element);
799 cerr << endl <<
"Aircraft buoyant_forces element has problems in file " << aircraftCfgFileName << endl;
807 auto propulsion =
static_cast<FGPropulsion*
>(Models[ePropulsion]);
808 result = propulsion->
Load(element);
810 cerr << endl <<
"Aircraft propulsion element has problems in file " << aircraftCfgFileName << endl;
813 for (
unsigned int i=0; i < propulsion->GetNumEngines(); i++)
814 ((
FGFCS*)Models[eSystems])->AddThrottle();
820 result = Models[eSystems]->Load(element);
822 cerr << endl <<
"Aircraft system element has problems in file " << aircraftCfgFileName << endl;
831 result = Models[eSystems]->Load(element);
833 cerr << endl <<
"Aircraft autopilot element has problems in file " << aircraftCfgFileName << endl;
841 result = Models[eSystems]->Load(element);
843 cerr << endl <<
"Aircraft flight_control element has problems in file " << aircraftCfgFileName << endl;
851 result = Models[eAerodynamics]->Load(element);
853 cerr << endl <<
"Aircraft aerodynamics element has problems in file " << aircraftCfgFileName << endl;
857 cerr << endl <<
"No expected aerodynamics element was found in the aircraft config file." << endl;
863 if (!
static_cast<FGInput*
>(Models[eInput])->
Load(element))
873 if (!
static_cast<FGOutput*
>(Models[eOutput])->
Load(element))
882 result = ReadChild(element);
884 cerr << endl <<
"Aircraft child element has problems in file " << aircraftCfgFileName << endl;
891 LoadModelConstants();
895 if (IsChild) debug_lvl = saved_debug_lvl;
899 <<
" JSBSim failed to open the configuration file: " << aircraftCfgFileName
903 for (
unsigned int i=0; i< Models.size(); i++) LoadInputs(i);
908 masterPCS.
node = Root->GetNode();
917 string FGFDMExec::GetPropulsionTankReport()
919 return ((
FGPropulsion*)Models[ePropulsion])->GetPropulsionTankReport();
928 for (
int i=0; i<pcs->
node->nChildren(); i++) {
931 int node_idx = pcs->
node->getChild(i)->getIndex();
935 if (pcs->
node->getChild(i)->nChildren() == 0) {
936 if (pcsNew->
base_string.substr(0,12) ==
string(
"/fdm/jsbsim/")) {
939 if (pcs->
node->getChild(i)->getAttribute(SGPropertyNode::READ)) access=
"R";
940 if (pcs->
node->getChild(i)->getAttribute(SGPropertyNode::WRITE)) access+=
"W";
941 PropertyCatalog.push_back(pcsNew->
base_string+
" ("+access+
")");
955 for (
unsigned i=0; i<PropertyCatalog.size(); i++) {
956 if (PropertyCatalog[i].find(in) != string::npos) results += PropertyCatalog[i] +
"\n";
958 if (results.empty())
return "No matches found\n";
964 void FGFDMExec::PrintPropertyCatalog(
void)
968 << modelName <<
reset << endl << endl;
969 for (
unsigned i=0; i<PropertyCatalog.size(); i++) {
970 cout <<
" " << PropertyCatalog[i] << endl;
976 void FGFDMExec::PrintSimulationConfiguration(
void)
const
978 cout << endl <<
"Simulation Configuration" << endl <<
"------------------------" << endl;
979 cout << MassBalance->GetName() << endl;
980 cout << GroundReactions->GetName() << endl;
981 cout << Aerodynamics->GetName() << endl;
982 cout << Propulsion->GetName() << endl;
987 bool FGFDMExec::ReadFileHeader(Element* el)
991 if (debug_lvl == 0)
return result;
994 cout << endl <<
highint <<
fgblue <<
"Reading child model: " << IdFDM <<
reset << endl << endl;
997 if (el->FindElement(
"description"))
998 cout <<
" Description: " << el->FindElement(
"description")->GetDataLine() << endl;
999 if (el->FindElement(
"author"))
1000 cout <<
" Model Author: " << el->FindElement(
"author")->GetDataLine() << endl;
1001 if (el->FindElement(
"filecreationdate"))
1002 cout <<
" Creation Date: " << el->FindElement(
"filecreationdate")->GetDataLine() << endl;
1003 if (el->FindElement(
"version"))
1004 cout <<
" Version: " << el->FindElement(
"version")->GetDataLine() << endl;
1011 bool FGFDMExec::ReadPrologue(Element* el)
1015 if (!el)
return false;
1017 string AircraftName = el->GetAttributeValue(
"name");
1018 ((FGAircraft*)Models[eAircraft])->SetAircraftName(AircraftName);
1020 if (debug_lvl & 1) cout <<
underon <<
"Reading Aircraft Configuration File"
1023 CFGVersion = el->GetAttributeValue(
"version");
1024 Release = el->GetAttributeValue(
"release");
1027 cout <<
" Version: " <<
highint << CFGVersion
1029 if (CFGVersion != needed_cfg_version) {
1030 cerr << endl <<
fgred <<
"YOU HAVE AN INCOMPATIBLE CFG FILE FOR THIS AIRCRAFT."
1031 " RESULTS WILL BE UNPREDICTABLE !!" << endl;
1032 cerr <<
"Current version needed is: " << needed_cfg_version << endl;
1033 cerr <<
" You have version: " << CFGVersion << endl <<
fgdef << endl;
1037 if (Release ==
"ALPHA" && (debug_lvl & 1)) {
1038 cout << endl << endl
1039 <<
highint <<
"This aircraft model is an " <<
fgred << Release
1041 <<
"This aircraft model may not even properly load, and probably"
1042 <<
" will not fly as expected." << endl << endl
1043 <<
fgred <<
highint <<
"Use this model for development purposes ONLY!!!"
1045 }
else if (Release ==
"BETA" && (debug_lvl & 1)) {
1046 cout << endl << endl
1047 <<
highint <<
"This aircraft model is a " <<
fgred << Release
1049 <<
"This aircraft model probably will not fly as expected." << endl << endl
1050 <<
fgblue <<
highint <<
"Use this model for development purposes ONLY!!!"
1052 }
else if (Release ==
"PRODUCTION" && (debug_lvl & 1)) {
1053 cout << endl << endl
1054 <<
highint <<
"This aircraft model is a " <<
fgblue << Release
1056 }
else if (debug_lvl & 1) {
1057 cout << endl << endl
1058 <<
highint <<
"This aircraft model is an " <<
fgred << Release
1060 <<
"This aircraft model may not even properly load, and probably"
1061 <<
" will not fly as expected." << endl << endl
1062 <<
fgred <<
highint <<
"Use this model for development purposes ONLY!!!"
1071 bool FGFDMExec::ReadChild(Element* el)
1081 struct childData* child =
new childData;
1083 child->exec =
new FGFDMExec(Root, FDMctr);
1084 child->exec->SetChild(
true);
1086 string childAircraft = el->GetAttributeValue(
"name");
1087 string sMated = el->GetAttributeValue(
"mated");
1088 if (sMated ==
"false") child->mated =
false;
1089 string sInternal = el->GetAttributeValue(
"internal");
1090 if (sInternal ==
"true") child->internal =
true;
1092 child->exec->SetAircraftPath( AircraftPath );
1093 child->exec->SetEnginePath( EnginePath );
1094 child->exec->SetSystemsPath( SystemsPath );
1095 child->exec->LoadModel(childAircraft);
1097 Element* location = el->FindElement(
"location");
1099 child->Loc = location->FindElementTripletConvertTo(
"IN");
1101 const string s(
" No location was found for this child object!");
1102 cerr << location->ReadFrom() << endl <<
highint <<
fgred
1103 << s <<
reset << endl;
1104 throw BaseException(s);
1107 Element* orientation = el->FindElement(
"orient");
1109 child->Orient = orientation->FindElementTripletConvertTo(
"RAD");
1110 }
else if (debug_lvl > 0) {
1111 cerr << endl <<
highint <<
" No orientation was found for this child object! Assuming 0,0,0." <<
reset << endl;
1114 ChildFDMList.push_back(child);
1131 Trim =
new FGTrim(
this,tNone);
1140 if( IncrementThenHolding ) {
1142 if (TimeStepsUntilHold == 0) {
1149 IncrementThenHolding =
false;
1150 TimeStepsUntilHold--;
1152 }
else if ( TimeStepsUntilHold > 0 ) {
1154 TimeStepsUntilHold--;
1163 if (Constructing)
return;
1165 if (mode < 0 || mode > JSBSim::tNone)
1166 throw(
"Illegal trimming mode!");
1168 FGTrim trim(
this, (JSBSim::TrimMode)mode);
1169 bool success = trim.DoTrim();
1182 void FGFDMExec::SRand(
int sr)
1185 gaussian_random_number_phase = 0;
1186 RandomEngine->seed(sr);
1209 void FGFDMExec::Debug(
int from)
1211 if (debug_lvl <= 0)
return;
1213 if (debug_lvl & 1 && IdFDM == 0) {
1216 <<
"JSBSim Flight Dynamics Model v" << JSBSim_version << endl;
1217 cout <<
" [JSBSim-ML v" << needed_cfg_version <<
"]\n\n";
1218 cout <<
"JSBSim startup beginning ...\n\n";
1219 if (disperse == 1) cout <<
"Dispersions are ON." << endl << endl;
1220 }
else if (from == 3) {
1221 cout <<
"\n\nJSBSim startup complete\n\n";
1224 if (debug_lvl & 2 ) {
1225 if (from == 0) cout <<
"Instantiated: FGFDMExec" << endl;
1226 if (from == 1) cout <<
"Destroyed: FGFDMExec" << endl;
1228 if (debug_lvl & 4 ) {
1230 cout <<
"================== Frame: " << Frame <<
" Time: "
1231 << sim_time <<
" dt: " << dT << endl;
1234 if (debug_lvl & 8 ) {
1236 if (debug_lvl & 16) {
1238 if (debug_lvl & 64) {