]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGOutput.cpp
Sync. w. JSBSim CVS.
[flightgear.git] / src / FDM / JSBSim / FGOutput.cpp
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Module:       FGOutput.cpp
4  Author:       Jon Berndt
5  Date started: 12/02/98
6  Purpose:      Manage output of sim parameters to file or stdout
7  Called by:    FGSimExec
8
9  ------------- Copyright (C) 1999  Jon S. Berndt (jsb@hal-pc.org) -------------
10
11  This program is free software; you can redistribute it and/or modify it under
12  the terms of the GNU General Public License as published by the Free Software
13  Foundation; either version 2 of the License, or (at your option) any later
14  version.
15
16  This program is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
19  details.
20
21  You should have received a copy of the GNU General Public License along with
22  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
23  Place - Suite 330, Boston, MA  02111-1307, USA.
24
25  Further information about the GNU General Public License can also be found on
26  the world wide web at http://www.gnu.org.
27
28 FUNCTIONAL DESCRIPTION
29 --------------------------------------------------------------------------------
30 This is the place where you create output routines to dump data for perusal
31 later.
32
33 HISTORY
34 --------------------------------------------------------------------------------
35 12/02/98   JSB   Created
36
37 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 INCLUDES
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40
41 #include "FGOutput.h"
42 #include "FGState.h"
43 #include "FGFDMExec.h"
44 #include "FGAtmosphere.h"
45 #include "FGFCS.h"
46 #include "FGAerodynamics.h"
47 #include "FGGroundReactions.h"
48 #include "FGAircraft.h"
49 #include "FGMassBalance.h"
50 #include "FGPropagate.h"
51 #include "FGAuxiliary.h"
52 #include "FGInertial.h"
53
54 #include <iomanip>
55
56 namespace JSBSim {
57
58 static const char *IdSrc = "$Id$";
59 static const char *IdHdr = ID_OUTPUT;
60
61 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
62 CLASS IMPLEMENTATION
63 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
64
65 FGOutput::FGOutput(FGFDMExec* fdmex) : FGModel(fdmex)
66 {
67   Name = "FGOutput";
68   sFirstPass = dFirstPass = true;
69   socket = 0;
70   Type = otNone;
71   Filename = "";
72   SubSystems = 0;
73   enabled = true;
74   outputInFileName = "";
75
76   Debug(0);
77 }
78
79 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80
81 FGOutput::~FGOutput()
82 {
83   if (socket) delete socket;
84   for (unsigned int i=0; i<OutputProperties.size(); i++) delete OutputProperties[i];
85
86   Debug(1);
87 }
88
89 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
90
91 bool FGOutput::Run(void)
92 {
93   if (enabled) {
94     if (FGModel::Run()) return true;
95     if (Type == otSocket) {
96       SocketOutput();
97     } else if (Type == otCSV) {
98       DelimitedOutput(Filename);
99     } else if (Type == otTerminal) {
100       // Not done yet
101     } else if (Type == otNone) {
102       // Do nothing
103     } else {
104       // Not a valid type of output
105     }
106   }
107   return false;
108 }
109
110 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
111
112 void FGOutput::SetType(string type)
113 {
114   if (type == "CSV") {
115     Type = otCSV;
116   } else if (type == "TABULAR") {
117     Type = otTab;
118   } else if (type == "SOCKET") {
119     Type = otSocket;
120   } else if (type == "TERMINAL") {
121     Type = otTerminal;
122   } else if (type != string("NONE")) {
123     Type = otUnknown;
124     cerr << "Unknown type of output specified in config file" << endl;
125   }
126 }
127
128 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
129
130 void FGOutput::DelimitedOutput(string fname)
131 {
132   streambuf* buffer;
133   string scratch = "";
134
135   if (fname == "COUT" || fname == "cout") {
136     buffer = cout.rdbuf();
137   } else {
138     datafile.open(fname.c_str());
139     buffer = datafile.rdbuf();
140   }
141
142   ostream outstream(buffer);
143
144   if (dFirstPass) {
145     outstream << "Time";
146     if (SubSystems & ssSimulation) {
147       // Nothing here, yet
148     }
149     if (SubSystems & ssAerosurfaces) {
150       outstream << ", ";
151       outstream << "Aileron Cmd, ";
152       outstream << "Elevator Cmd, ";
153       outstream << "Rudder Cmd, ";
154       outstream << "Flap Cmd, ";
155       outstream << "Left Aileron Pos, ";
156       outstream << "Right Aileron Pos, ";
157       outstream << "Elevator Pos, ";
158       outstream << "Rudder Pos, ";
159       outstream << "Flap Pos";
160     }
161     if (SubSystems & ssRates) {
162       outstream << ", ";
163       outstream << "P, Q, R, ";
164       outstream << "Pdot, Qdot, Rdot";
165     }
166     if (SubSystems & ssVelocities) {
167       outstream << ", ";
168       outstream << "QBar, ";
169       outstream << "Vtotal, ";
170       outstream << "UBody, VBody, WBody, ";
171       outstream << "UAero, VAero, WAero, ";
172       outstream << "Vn, Ve, Vd";
173     }
174     if (SubSystems & ssForces) {
175       outstream << ", ";
176       outstream << "Drag, Side, Lift, ";
177       outstream << "L/D, ";
178       outstream << "Xforce, Yforce, Zforce";
179     }
180     if (SubSystems & ssMoments) {
181       outstream << ", ";
182       outstream << "L, M, N";
183     }
184     if (SubSystems & ssAtmosphere) {
185       outstream << ", ";
186       outstream << "Rho, ";
187       outstream << "NWind, EWind, DWind";
188     }
189     if (SubSystems & ssMassProps) {
190       outstream << ", ";
191       outstream << "Ixx, ";
192       outstream << "Ixy, ";
193       outstream << "Ixz, ";
194       outstream << "Iyx, ";
195       outstream << "Iyy, ";
196       outstream << "Iyz, ";
197       outstream << "Izx, ";
198       outstream << "Izy, ";
199       outstream << "Izz, ";
200       outstream << "Mass, ";
201       outstream << "Xcg, Ycg, Zcg";
202     }
203     if (SubSystems & ssPropagate) {
204       outstream << ", ";
205       outstream << "Altitude, ";
206       outstream << "Phi, Tht, Psi, ";
207       outstream << "Alpha, ";
208       outstream << "Beta, ";
209       outstream << "Latitude (Deg), ";
210       outstream << "Longitude (Deg), ";
211       outstream << "Distance AGL, ";
212       outstream << "Runway Radius";
213     }
214     if (SubSystems & ssCoefficients) {
215       scratch = Aerodynamics->GetCoefficientStrings();
216       if (scratch.length() != 0) outstream << ", " << scratch;
217     }
218     if (SubSystems & ssFCS) {
219       scratch = FCS->GetComponentStrings();
220       if (scratch.length() != 0) outstream << ", " << scratch;
221     }
222     if (SubSystems & ssGroundReactions) {
223       outstream << ", ";
224       outstream << GroundReactions->GetGroundReactionStrings();
225     }
226     if (SubSystems & ssPropulsion && Propulsion->GetNumEngines() > 0) {
227       outstream << ", ";
228       outstream << Propulsion->GetPropulsionStrings();
229     }
230     if (OutputProperties.size() > 0) {
231       for (unsigned int i=0;i<OutputProperties.size();i++) {
232         outstream << ", " << OutputProperties[i]->GetName();
233       }
234     }
235
236     outstream << endl;
237     dFirstPass = false;
238   }
239
240   outstream << State->Getsim_time();
241   if (SubSystems & ssSimulation) {
242   }
243   if (SubSystems & ssAerosurfaces) {
244     outstream << ", ";
245     outstream << FCS->GetDaCmd() << ", ";
246     outstream << FCS->GetDeCmd() << ", ";
247     outstream << FCS->GetDrCmd() << ", ";
248     outstream << FCS->GetDfCmd() << ", ";
249     outstream << FCS->GetDaLPos() << ", ";
250     outstream << FCS->GetDaRPos() << ", ";
251     outstream << FCS->GetDePos() << ", ";
252     outstream << FCS->GetDrPos() << ", ";
253     outstream << FCS->GetDfPos();
254   }
255   if (SubSystems & ssRates) {
256     outstream << ", ";
257     outstream << Propagate->GetPQR() << ", ";
258     outstream << Propagate->GetPQRdot();
259   }
260   if (SubSystems & ssVelocities) {
261     outstream << ", ";
262     outstream << Auxiliary->Getqbar() << ", ";
263     outstream << setprecision(12) << Auxiliary->GetVt() << ", ";
264     outstream << setprecision(12) << Propagate->GetUVW() << ", ";
265     outstream << Auxiliary->GetAeroUVW() << ", ";
266     outstream << Propagate->GetVel();
267   }
268   if (SubSystems & ssForces) {
269     outstream << ", ";
270     outstream << Aerodynamics->GetvFs() << ", ";
271     outstream << Aerodynamics->GetLoD() << ", ";
272     outstream << Aircraft->GetForces();
273   }
274   if (SubSystems & ssMoments) {
275     outstream << ", ";
276     outstream << Aircraft->GetMoments();
277   }
278   if (SubSystems & ssAtmosphere) {
279     outstream << ", ";
280     outstream << Atmosphere->GetDensity() << ", ";
281     outstream << Atmosphere->GetWindNED();
282   }
283   if (SubSystems & ssMassProps) {
284     outstream << ", ";
285     outstream << MassBalance->GetJ() << ", ";
286     outstream << MassBalance->GetMass() << ", ";
287     outstream << MassBalance->GetXYZcg();
288   }
289   if (SubSystems & ssPropagate) {
290     outstream << ", ";
291     outstream << Propagate->Geth() << ", ";
292     outstream << Propagate->GetEuler() << ", ";
293     outstream << Auxiliary->Getalpha(inDegrees) << ", ";
294     outstream << Auxiliary->Getbeta(inDegrees) << ", ";
295     outstream << Propagate->GetLocation().GetLatitudeDeg() << ", ";
296     outstream << Propagate->GetLocation().GetLongitudeDeg() << ", ";
297     outstream << Propagate->GetDistanceAGL() << ", ";
298     outstream << Propagate->GetRunwayRadius();
299   }
300   if (SubSystems & ssCoefficients) {
301     scratch = Aerodynamics->GetCoefficientValues();
302     if (scratch.length() != 0) outstream << ", " << scratch;
303   }
304   if (SubSystems & ssFCS) {
305     scratch = FCS->GetComponentValues();
306     if (scratch.length() != 0) outstream << ", " << scratch;
307   }
308   if (SubSystems & ssGroundReactions) {
309     outstream << ", ";
310     outstream << GroundReactions->GetGroundReactionValues();
311   }
312   if (SubSystems & ssPropulsion && Propulsion->GetNumEngines() > 0) {
313     outstream << ", ";
314     outstream << Propulsion->GetPropulsionValues();
315   }
316
317   for (unsigned int i=0;i<OutputProperties.size();i++) {
318     outstream << ", " << OutputProperties[i]->getDoubleValue();
319   }
320
321   outstream << endl;
322   outstream.flush();
323 }
324
325 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
326
327 void FGOutput::SocketOutput(void)
328 {
329   string asciiData;
330
331   if (socket == NULL) return;
332   if (!socket->GetConnectStatus()) return;
333
334   socket->Clear();
335   if (sFirstPass) {
336     socket->Append("<LABELS>");
337     socket->Append("Time");
338     socket->Append("Altitude");
339     socket->Append("Phi");
340     socket->Append("Tht");
341     socket->Append("Psi");
342     socket->Append("Rho");
343     socket->Append("Vtotal");
344     socket->Append("UBody");
345     socket->Append("VBody");
346     socket->Append("WBody");
347     socket->Append("UAero");
348     socket->Append("VAero");
349     socket->Append("WAero");
350     socket->Append("Vn");
351     socket->Append("Ve");
352     socket->Append("Vd");
353     socket->Append("Udot");
354     socket->Append("Vdot");
355     socket->Append("Wdot");
356     socket->Append("P");
357     socket->Append("Q");
358     socket->Append("R");
359     socket->Append("PDot");
360     socket->Append("QDot");
361     socket->Append("RDot");
362     socket->Append("Fx");
363     socket->Append("Fy");
364     socket->Append("Fz");
365     socket->Append("Latitude (Deg)");
366     socket->Append("Longitude (Deg)");
367     socket->Append("QBar");
368     socket->Append("Alpha");
369     socket->Append("L");
370     socket->Append("M");
371     socket->Append("N");
372     socket->Append("Throttle Position");
373     socket->Append("Left Aileron Position");
374     socket->Append("Right Aileron Position");
375     socket->Append("Elevator Position");
376     socket->Append("Rudder Position");
377     sFirstPass = false;
378     socket->Send();
379   }
380
381   socket->Clear();
382   socket->Append(State->Getsim_time());
383   socket->Append(Propagate->Geth());
384   socket->Append(Propagate->GetEuler(ePhi));
385   socket->Append(Propagate->GetEuler(eTht));
386   socket->Append(Propagate->GetEuler(ePsi));
387   socket->Append(Atmosphere->GetDensity());
388   socket->Append(Auxiliary->GetVt());
389   socket->Append(Propagate->GetUVW(eU));
390   socket->Append(Propagate->GetUVW(eV));
391   socket->Append(Propagate->GetUVW(eW));
392   socket->Append(Auxiliary->GetAeroUVW(eU));
393   socket->Append(Auxiliary->GetAeroUVW(eV));
394   socket->Append(Auxiliary->GetAeroUVW(eW));
395   socket->Append(Propagate->GetVel(eNorth));
396   socket->Append(Propagate->GetVel(eEast));
397   socket->Append(Propagate->GetVel(eDown));
398   socket->Append(Propagate->GetUVWdot(eU));
399   socket->Append(Propagate->GetUVWdot(eV));
400   socket->Append(Propagate->GetUVWdot(eW));
401   socket->Append(Propagate->GetPQR(eP));
402   socket->Append(Propagate->GetPQR(eQ));
403   socket->Append(Propagate->GetPQR(eR));
404   socket->Append(Propagate->GetPQRdot(eP));
405   socket->Append(Propagate->GetPQRdot(eQ));
406   socket->Append(Propagate->GetPQRdot(eR));
407   socket->Append(Aircraft->GetForces(eX));
408   socket->Append(Aircraft->GetForces(eY));
409   socket->Append(Aircraft->GetForces(eZ));
410   socket->Append(Propagate->GetLocation().GetLatitudeDeg());
411   socket->Append(Propagate->GetLocation().GetLongitudeDeg());
412   socket->Append(Auxiliary->Getqbar());
413   socket->Append(Auxiliary->Getalpha(inDegrees));
414   socket->Append(Aircraft->GetMoments(eL));
415   socket->Append(Aircraft->GetMoments(eM));
416   socket->Append(Aircraft->GetMoments(eN));
417   socket->Append(FCS->GetThrottlePos(0));
418   socket->Append(FCS->GetDaLPos());
419   socket->Append(FCS->GetDaRPos());
420   socket->Append(FCS->GetDePos());
421   socket->Append(FCS->GetDrPos());
422   socket->Send();
423 }
424
425 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
426
427 void FGOutput::SocketStatusOutput(string out_str)
428 {
429   string asciiData;
430
431   if (socket == NULL) return;
432
433   socket->Clear();
434   asciiData = string("<STATUS>") + out_str;
435   socket->Append(asciiData.c_str());
436   socket->Send();
437 }
438
439 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
440
441 bool FGOutput::Load(FGConfigFile* AC_cfg)
442 {
443   string token="", parameter="", separator="";
444   string name="", fname="";
445   int OutRate = 0;
446   FGConfigFile* Output_cfg;
447   string property;
448   unsigned int port;
449
450 # ifndef macintosh
451     separator = "/";
452 # else
453     separator = ";";
454 # endif
455
456   name = AC_cfg->GetValue("NAME");
457   fname = AC_cfg->GetValue("FILE");
458   token = AC_cfg->GetValue("TYPE");
459   port = atoi(AC_cfg->GetValue("PORT").c_str());
460
461   Output->SetType(token);
462
463   if (token == "SOCKET") {
464     socket = new FGfdmSocket(name,port);
465   }
466
467   if (!fname.empty()) {
468     outputInFileName = FDMExec->GetAircraftPath() + separator
469                         + FDMExec->GetModelName() + separator + fname + ".xml";
470     Output_cfg = new FGConfigFile(outputInFileName);
471     if (!Output_cfg->IsOpen()) {
472       cerr << "Could not open file: " << outputInFileName << endl;
473       return false;
474     }
475   } else {
476     Output_cfg = AC_cfg;
477   }
478   Output->SetFilename(name);
479
480   while ((token = Output_cfg->GetValue()) != string("/OUTPUT")) {
481     *Output_cfg >> parameter;
482     if (parameter == "RATE_IN_HZ") {
483       *Output_cfg >> OutRate;
484     }
485     if (parameter == "SIMULATION") {
486       *Output_cfg >> parameter;
487       if (parameter == "ON") SubSystems += ssSimulation;
488     }
489     if (parameter == "AEROSURFACES") {
490       *Output_cfg >> parameter;
491       if (parameter == "ON") SubSystems += ssAerosurfaces;
492     }
493     if (parameter == "RATES") {
494       *Output_cfg >> parameter;
495       if (parameter == "ON") SubSystems += ssRates;
496     }
497     if (parameter == "VELOCITIES") {
498       *Output_cfg >> parameter;
499       if (parameter == "ON") SubSystems += ssVelocities;
500     }
501     if (parameter == "FORCES") {
502       *Output_cfg >> parameter;
503       if (parameter == "ON") SubSystems += ssForces;
504     }
505     if (parameter == "MOMENTS") {
506       *Output_cfg >> parameter;
507       if (parameter == "ON") SubSystems += ssMoments;
508     }
509     if (parameter == "ATMOSPHERE") {
510       *Output_cfg >> parameter;
511       if (parameter == "ON") SubSystems += ssAtmosphere;
512     }
513     if (parameter == "MASSPROPS") {
514       *Output_cfg >> parameter;
515       if (parameter == "ON") SubSystems += ssMassProps;
516     }
517     if (parameter == "POSITION") {
518       *Output_cfg >> parameter;
519       if (parameter == "ON") SubSystems += ssPropagate;
520     }
521     if (parameter == "COEFFICIENTS") {
522       *Output_cfg >> parameter;
523       if (parameter == "ON") SubSystems += ssCoefficients;
524     }
525     if (parameter == "GROUND_REACTIONS") {
526       *Output_cfg >> parameter;
527       if (parameter == "ON") SubSystems += ssGroundReactions;
528     }
529     if (parameter == "FCS") {
530       *Output_cfg >> parameter;
531       if (parameter == "ON") SubSystems += ssFCS;
532     }
533     if (parameter == "PROPULSION") {
534       *Output_cfg >> parameter;
535       if (parameter == "ON") SubSystems += ssPropulsion;
536     }
537     if (parameter == "PROPERTY") {
538       *Output_cfg >> property;
539       OutputProperties.push_back(PropertyManager->GetNode(property));
540     }
541
542     if (parameter == "EOF") break;
543   }
544
545   OutRate = OutRate>120?120:(OutRate<0?0:OutRate);
546   rate = (int)(0.5 + 1.0/(State->Getdt()*OutRate));
547
548   Debug(2);
549
550   return true;
551 }
552
553 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
554 //    The bitmasked value choices are as follows:
555 //    unset: In this case (the default) JSBSim would only print
556 //       out the normally expected messages, essentially echoing
557 //       the config files as they are read. If the environment
558 //       variable is not set, debug_lvl is set to 1 internally
559 //    0: This requests JSBSim not to output any messages
560 //       whatsoever.
561 //    1: This value explicity requests the normal JSBSim
562 //       startup messages
563 //    2: This value asks for a message to be printed out when
564 //       a class is instantiated
565 //    4: When this value is set, a message is displayed when a
566 //       FGModel object executes its Run() method
567 //    8: When this value is set, various runtime state variables
568 //       are printed out periodically
569 //    16: When set various parameters are sanity checked and
570 //       a message is printed out when they go out of bounds
571
572 void FGOutput::Debug(int from)
573 {
574   string scratch="";
575
576   if (debug_lvl <= 0) return;
577
578   if (debug_lvl & 1) { // Standard console startup message output
579     if (from == 0) { // Constructor
580
581     }
582     if (from == 2) {
583       if (outputInFileName.empty())
584         cout << "  " << "Output parameters read inline" << endl;
585       else
586         cout << "    Output parameters read from file: " << outputInFileName << endl;
587
588       if (Filename == "cout" || Filename == "COUT") {
589         scratch = "    Log output goes to screen console";
590       } else if (!Filename.empty()) {
591         scratch = "    Log output goes to file: " + Filename;
592       }
593       switch (Type) {
594       case otCSV:
595         cout << scratch << " in CSV format output at rate " << 120/rate << " Hz" << endl;
596         break;
597       case otNone:
598         cout << "  No log output" << endl;
599         break;
600       }
601
602       if (SubSystems & ssSimulation)      cout << "    Simulation parameters logged" << endl;
603       if (SubSystems & ssAerosurfaces)    cout << "    Aerosurface parameters logged" << endl;
604       if (SubSystems & ssRates)           cout << "    Rate parameters logged" << endl;
605       if (SubSystems & ssVelocities)      cout << "    Velocity parameters logged" << endl;
606       if (SubSystems & ssForces)          cout << "    Force parameters logged" << endl;
607       if (SubSystems & ssMoments)         cout << "    Moments parameters logged" << endl;
608       if (SubSystems & ssAtmosphere)      cout << "    Atmosphere parameters logged" << endl;
609       if (SubSystems & ssMassProps)       cout << "    Mass parameters logged" << endl;
610       if (SubSystems & ssCoefficients)    cout << "    Coefficient parameters logged" << endl;
611       if (SubSystems & ssPropagate)       cout << "    Propagate parameters logged" << endl;
612       if (SubSystems & ssGroundReactions) cout << "    Ground parameters logged" << endl;
613       if (SubSystems & ssFCS)             cout << "    FCS parameters logged" << endl;
614       if (SubSystems & ssPropulsion)      cout << "    Propulsion parameters logged" << endl;
615       if (OutputProperties.size() > 0)    cout << "    Properties logged:" << endl;
616       for (unsigned int i=0;i<OutputProperties.size();i++) {
617         cout << "      - " << OutputProperties[i]->GetName() << endl;
618       }
619     }
620   }
621   if (debug_lvl & 2 ) { // Instantiation/Destruction notification
622     if (from == 0) cout << "Instantiated: FGOutput" << endl;
623     if (from == 1) cout << "Destroyed:    FGOutput" << endl;
624   }
625   if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
626   }
627   if (debug_lvl & 8 ) { // Runtime state variables
628   }
629   if (debug_lvl & 16) { // Sanity checking
630   }
631   if (debug_lvl & 64) {
632     if (from == 0) { // Constructor
633       cout << IdSrc << endl;
634       cout << IdHdr << endl;
635     }
636   }
637 }
638 }