]> git.mxchange.org Git - flightgear.git/commitdiff
From David Megginson:
authorcurt <curt>
Thu, 5 Apr 2001 20:20:44 +0000 (20:20 +0000)
committercurt <curt>
Thu, 5 Apr 2001 20:20:44 +0000 (20:20 +0000)
The files in the attached tarball make the following changes to
FlightGear:

- rename the existing FGInterface::init() method to
FGInterface::_setup to get it out of the way

- move *all* FDM initialization code out of src/Main/fg_init.cxx and
into FGInterface::init(), and clean up fg_init.cxx a little
(especially by removing the zillions of attempts to place the plane on
the ground at various locations in the code)

- modify FGInterface::bind() so that no values are picked up
automatically at bind time (they are set previously by init() instead)

- modify the init() methods of the classes derived from FGInterface
(i.e. larcsim, jsbsim, balloon, magic, and ada) to invoke
FGInterface::init() explicitly before doing their own setup

I don't claim that the code in FGInterface::init() is optimal (or even
correct), but it seems to work for on-ground starts with both LaRCSim
and JSBSim on runways pointing various directions from near sea level
to about 700' ASL (the range I happened to test).  I expect that Jon
and Tony will want to look at the code and refactor and correct it now
that they can see what's going on in one place.

Here's a quick outline of what is invoked:

  cur_fdm_state = new <whatever>(dt);
  cur_fdm_state->init();
  cur_fdm_state->bind();

The constructor allocates memory and sets default values only (with
the help of the FGInterface::_setup() method).  The init() method pull
any required properties out of the property tree and sets up the
initial state of the FDM.  The bind() method takes ownership of
FDM-related properties so that the FDM can publish them to the rest of
the sim.

Note that bind() and init() are virtual, so any implementation in a
subclass will hide the implementation in FGInterface; that's why
subclass implementations of init() and bind() have to invoke
FGInterface::init() and FGInterface::bind() explicitly, probably at
the start, so that they get the basic initialization.

src/FDM/ADA.cxx
src/FDM/Balloon.cxx
src/FDM/JSBSim.cxx
src/FDM/LaRCsim.cxx
src/FDM/MagicCarpet.cxx
src/FDM/flight.cxx
src/FDM/flight.hxx
src/Main/fg_init.cxx

index fd4ea9da83e49c4fb6cae83e57a765a4184ace59..f2965b684a8b15a30f0f73efffd05969e6f359df 100644 (file)
@@ -154,6 +154,11 @@ FGADA::~FGADA() {
 // Initialize the ADA flight model, dt is the time increment
 // for each subsequent iteration through the EOM
 void FGADA::init() {
+
+                               // explicitly call the superclass's
+                               // init() method first.
+    FGInterface::init();
+
     // cout << "FGADA::init()" << endl;
 
     char Buffer[numberofbytes];
index 9af965fb689d0da5de50abe54a9594b2e994663e..92b6dc039b043272c211d378627b130759393774 100644 (file)
@@ -75,6 +75,10 @@ FGBalloonSim::~FGBalloonSim() {
 // Initialize the BalloonSim flight model, dt is the time increment for
 // each subsequent iteration through the EOM
 void FGBalloonSim::init() {
+                               // explicitly call the superclass's
+                               // init method first.
+    FGInterface::init();
+
     sgVec3 temp;
 
     SG_LOG( SG_FLIGHT, SG_INFO, "Starting initializing BalloonSim" );
index bc31e1a174c3b274357835f66abda1282df11803..4ed9a6d27e8a315d43fa259bdfe5197dd1d200f1 100644 (file)
@@ -109,34 +109,14 @@ FGJSBsim::~FGJSBsim(void) {
 // each subsequent iteration through the EOM
 
 void FGJSBsim::init() {
+                               // Explicitly call the superclass's
+                               // init method first.
+    FGInterface::init();
 
     bool result;
 
     SG_LOG( SG_FLIGHT, SG_INFO, "Starting and initializing JSBsim" );
 
-#if 0
-    SGPath aircraft_path( globals->get_fg_root() );
-    aircraft_path.append( "Aircraft" );
-
-    SGPath engine_path( globals->get_fg_root() );
-    engine_path.append( "Engine" );
-
-    fdmex->GetState()->Setdt( get_delta_t() );
-
-    result = fdmex->LoadModel( aircraft_path.str(),
-                              engine_path.str(),
-                              fgGetString("/sim/aircraft") );
-
-    if (result) {
-       SG_LOG( SG_FLIGHT, SG_INFO, "  loaded aircraft " << fgGetString("/sim/aircraft") );
-    } else {
-       SG_LOG( SG_FLIGHT, SG_INFO, "  aircraft "
-               << fgGetString("/sim/aircraft")
-               << " does not exist" );
-       exit(-1);
-    }
-#endif    
-
     fdmex->GetAtmosphere()->UseInternal();
   
     SG_LOG( SG_FLIGHT, SG_INFO, "  Initializing JSBSim with:" );
@@ -177,24 +157,6 @@ void FGJSBsim::init() {
     SG_LOG( SG_FLIGHT, SG_INFO, "  Longitude: " 
            <<  fdmex->GetPosition()->GetLongitude() << " deg"  );
   
-    // for debug only
-    /* SG_LOG( SG_FLIGHT, SG_DEBUG, "  FGJSBSim::get_Altitude(): " <<  get_Altitude() );
-       SG_LOG( SG_FLIGHT, SG_DEBUG, "  FGJSBSim::get_Sea_level_radius(): " << get_Sea_level_radius()  );
-       SG_LOG( SG_FLIGHT, SG_DEBUG, "  scenery.cur_radius*SG_METER_TO_FEET: "
-       <<  scenery.cur_radius*SG_METER_TO_FEET );
-       SG_LOG( SG_FLIGHT, SG_DEBUG, "  Calculated Terrain ASL: " << endl 
-       << "    " << "scenery.cur_radius*SG_METER_TO_FEET -get_Sea_level_radius()= " 
-       <<  scenery.cur_radius*SG_METER_TO_FEET - get_Sea_level_radius()  );
-
-       SG_LOG( SG_FLIGHT, SG_DEBUG, "  Calculated Aircraft AGL: " << endl 
-       << "    " << "get_Altitude() + get_Sea_level_radius() - scenery.cur_radius*SG_METER_TO_FEET= " 
-       <<  get_Altitude() + get_Sea_level_radius()- scenery.cur_radius*SG_METER_TO_FEET );
-       SG_LOG( SG_FLIGHT, SG_DEBUG, "  fgGetDouble("/position/altitude"): " 
-       <<  fgGetDouble("/position/altitude") );
-       SG_LOG( SG_FLIGHT, SG_DEBUG, "  FGBFI::getAltitude(): " 
-       <<  FGBFI::getAltitude() );    */
-
-
     SG_LOG( SG_FLIGHT, SG_INFO, "  loaded initial conditions" );
 
     SG_LOG( SG_FLIGHT, SG_INFO, "  set dt" );
index e8a08d1ff40508897d935a6bfc464f46c27f4bdf..a43d59875f1f33d512d6a6aafd93b84844a4d62a 100644 (file)
@@ -67,6 +67,10 @@ FGLaRCsim::~FGLaRCsim(void) {
 // each subsequent iteration through the EOM
 void FGLaRCsim::init() {
 
+                               // Explicitly call the superclass's
+                               // init method first.
+    FGInterface::init();
+
     speed_up = fgGetValue("/sim/speed-up", true);
     
     ls_set_model_dt( get_delta_t() );
index 8a77931a879f900bae5d8a19b5d1a00871707418..858ff522139447b0aa5e1a1735405467f6d3d0bd 100644 (file)
@@ -44,6 +44,9 @@ FGMagicCarpet::~FGMagicCarpet() {
 // Initialize the Magic Carpet flight model, dt is the time increment
 // for each subsequent iteration through the EOM
 void FGMagicCarpet::init() {
+                               // explicitly call the superclass's
+                               // init method first
+    FGInterface::init();
 }
 
 
index a53a6680cae637969bfb381491905e82e2100461..46fb72403b6444bd6a982d63574e06bab8140e05 100644 (file)
@@ -74,12 +74,12 @@ FGEngInterface::~FGEngInterface(void) {
 
 // Constructor
 FGInterface::FGInterface() {
-    init();
+    _setup();
 }  
 
 FGInterface::FGInterface( double dt ) {
     
-    init();
+    _setup();
     delta_t = dt;
     remainder = elapsed = multi_loop = 0;
 }
@@ -90,8 +90,13 @@ FGInterface::~FGInterface() {
 }
 
 
+/**
+ * Set default values for the state of the FDM.
+ *
+ * This method is invoked by the constructors.
+ */
 void
-FGInterface::init ()
+FGInterface::_setup ()
 {
     init_vec( d_pilot_rp_body_v );
     init_vec( d_cg_rp_body_v );
@@ -160,6 +165,93 @@ FGInterface::init ()
     altitude_agl=0;
 }
 
+
+/**
+ * Initialize the state of the FDM.
+ *
+ * Subclasses of FGInterface may do their own, additional initialization,
+ * but normally they should invoke this method explicitly first as
+ * FGInterface::init() to make sure the basic structures are set up
+ * properly.
+ */
+void
+FGInterface::init ()
+{
+  SG_LOG(SG_FLIGHT, SG_INFO, "Start initializing FGInterface");
+
+  stamp();
+  set_remainder(0);
+
+                               // Set initial position
+  SG_LOG(SG_FLIGHT, SG_INFO, "...initializing position...");
+  set_Longitude(fgGetDouble("/position/longitude") * SGD_DEGREES_TO_RADIANS);
+  set_Latitude(fgGetDouble("/position/latitude") * SGD_DEGREES_TO_RADIANS);
+  double ground_elev_m = scenery.cur_elev + 1;
+  double ground_elev_ft = ground_elev_m * METERS_TO_FEET;
+  if (fgGetBool("/sim/startup/onground") ||
+      fgGetDouble("/position/altitude") < ground_elev_ft)
+    fgSetDouble("/position/altitude", ground_elev_ft);
+  set_Altitude(fgGetDouble("/position/altitude"));
+
+                               // Set ground elevation
+  SG_LOG(SG_FLIGHT, SG_INFO,
+        "...initializing ground elevation to "
+        << ground_elev_ft << "ft...");
+  fgFDMSetGroundElevation("jsb", ground_elev_m);
+
+                               // Set sea-level radius
+  SG_LOG(SG_FLIGHT, SG_INFO, "...initializing sea-level radius...");
+  double sea_level_radius_meters;
+  double lat_geoc;
+  sgGeodToGeoc(get_Latitude(), get_Altitude(),
+              &sea_level_radius_meters, &lat_geoc);
+  set_Sea_level_radius(sea_level_radius_meters * SG_METER_TO_FEET);
+
+                               // Set initial velocities
+  SG_LOG(SG_FLIGHT, SG_INFO, "...initializing velocities...");
+  if (!fgHasValue("/sim/startup/speed-set")) {
+    set_V_calibrated_kts(0.0);
+  } else {
+    const string speedset = fgGetString("/sim/startup/speed-set");
+    if (speedset == "knots" || speedset == "KNOTS") {
+      set_V_calibrated_kts(fgGetDouble("/velocities/airspeed"));
+    } else if (speedset == "mach" || speedset == "MACH") {
+      set_Mach_number(fgGetDouble("/velocities/mach"));
+    } else if (speedset == "UVW" || speedset == "uvw") {
+      set_Velocities_Wind_Body(fgGetDouble("/velocities/uBody"),
+                              fgGetDouble("/velocities/vBody"),
+                              fgGetDouble("/velocities/wBody"));
+    } else if (speedset == "NED" || speedset == "ned") {
+      set_Velocities_Local(fgGetDouble("/velocities/speed-north"),
+                          fgGetDouble("/velocities/speed-east"),
+                          fgGetDouble("/velocities/speed-down"));
+    } else {
+      SG_LOG(SG_FLIGHT, SG_ALERT,
+            "Unrecognized value for /sim/startup/speed-set: " << speedset);
+      set_V_calibrated_kts(0.0);
+    }
+  }
+
+                               // Set initial Euler angles
+  SG_LOG(SG_FLIGHT, SG_INFO, "...initializing Euler angles...");
+  set_Euler_Angles
+    (fgGetDouble("/orientation/roll") * SGD_DEGREES_TO_RADIANS,
+     fgGetDouble("/orientation/pitch") * SGD_DEGREES_TO_RADIANS,
+     fgGetDouble("/orientation/heading") * SGD_DEGREES_TO_RADIANS);
+
+  SG_LOG(SG_FLIGHT, SG_INFO, "End initializing FGInterface");
+}
+
+
+/**
+ * Bind getters and setters to properties.
+ *
+ * The bind() method will be invoked after init().  Note that unlike
+ * the usual implementations of FGSubsystem::bind(), this method does
+ * not automatically pick up existing values for the properties at
+ * bind time; instead, all values are set explicitly in the init()
+ * method.
+ */
 void
 FGInterface::bind ()
 {
@@ -192,48 +284,40 @@ FGInterface::bind ()
                                // Orientation
   fgTie("/orientation/roll", this,
        &FGInterface::get_Phi_deg,
-       &FGInterface::set_Phi_deg,
-       true);
+       &FGInterface::set_Phi_deg);
   fgTie("/orientation/pitch", this,
        &FGInterface::get_Theta_deg,
-       &FGInterface::set_Theta_deg,
-       true);
+       &FGInterface::set_Theta_deg);
   fgTie("/orientation/heading", this,
        &FGInterface::get_Psi_deg,
-       &FGInterface::set_Psi_deg,
-       true);
+       &FGInterface::set_Psi_deg);
 
                                // Calibrated airspeed
   fgTie("/velocities/airspeed", this,
        &FGInterface::get_V_calibrated_kts,
-       &FGInterface::set_V_calibrated_kts,
-       true);
+       &FGInterface::set_V_calibrated_kts);
 
                                // Local velocities
   fgTie("/velocities/speed-north", this,
-       &FGInterface::get_V_north); // read-only
+       &FGInterface::get_V_north,
+       &FGInterface::set_V_north);
   fgTie("/velocities/speed-east", this,
        &FGInterface::get_V_east,
-       &FGInterface::set_V_east,
-       true);
+       &FGInterface::set_V_east);
   fgTie("/velocities/speed-down", this,
        &FGInterface::get_V_down,
-       &FGInterface::set_V_down,
-       true);
+       &FGInterface::set_V_down);
 
                                // Relative wind
   fgTie("/velocities/uBody", this,
        &FGInterface::get_uBody,
-       &FGInterface::set_uBody,
-       true);
+       &FGInterface::set_uBody);
   fgTie("/velocities/vBody", this,
        &FGInterface::get_vBody,
-       &FGInterface::set_vBody,
-       true);
+       &FGInterface::set_vBody);
   fgTie("/velocities/wBody", this,
        &FGInterface::get_wBody,
-       &FGInterface::set_wBody,
-       true);
+       &FGInterface::set_wBody);
 
                                // Climb and slip (read-only)
   fgTie("/velocities/vertical-speed", this,
@@ -242,6 +326,13 @@ FGInterface::bind ()
        &FGInterface::get_Beta); // read-only
 }
 
+
+/**
+ * Unbind any properties bound to this FDM.
+ *
+ * This method allows the FDM to release properties so that a new
+ * FDM can bind them instead.
+ */
 void
 FGInterface::unbind ()
 {
@@ -266,6 +357,10 @@ FGInterface::unbind ()
   fgUntie("/velocities/side-slip");
 }
 
+
+/**
+ * Update the state of the FDM (i.e. run the equations of motion).
+ */
 void
 FGInterface::update ()
 {
index 1017127d1be9866135ee9a801077c7383680d1fe..20e22678098e928a6c5c9a7fc75fba30da5fbbdb 100644 (file)
@@ -282,6 +282,12 @@ private:
     // SGTimeStamp next_stamp;           // time this record is valid
 
 protected:
+
+                               // deliberately not virtual so that
+                               // FGInterface constructor will call
+                               // the right version
+    void _setup();
+
     void _busdump(void);
     void _updatePosition( double lat_geoc, double lon, double alt );
     void _updateWeather( void );
index 599469dab5d06cffc8b77fd684e774b6d4e73cee..7866a35f358bddd1602e29c02b509716d299d3a2 100644 (file)
@@ -404,48 +404,6 @@ bool fgSetPosFromAirportIDandHdg( const string& id, double tgt_hdg ) {
 }
 
 
-// Set initial position and orientation
-bool fgInitPosition( void ) {
-    FGInterface *f = current_aircraft.fdm_state;
-    string id = fgGetString("/sim/startup/airport-id");
-
-    // set initial position from default or command line coordinates
-    f->set_Longitude( fgGetDouble("/position/longitude") * SGD_DEGREES_TO_RADIANS );
-    f->set_Latitude( fgGetDouble("/position/latitude") * SGD_DEGREES_TO_RADIANS );
-
-    SG_LOG( SG_GENERAL, SG_INFO,
-           "scenery.cur_elev = " << scenery.cur_elev );
-    SG_LOG( SG_GENERAL, SG_INFO,
-           "/position/altitude = " << fgGetDouble("/position/altitude") );
-
-    // if we requested on ground startups
-    if ( fgGetBool( "/sim/startup/onground" ) ) {
-        fgSetDouble( "/position/altitude", (scenery.cur_elev + 1)
-                    * METERS_TO_FEET );
-    }
-
-    // if requested altitude is below ground level
-    if ( fgGetDouble( "/position/altitude" ) < (scenery.cur_elev + 1)
-        * METERS_TO_FEET ) {
-       fgSetDouble( "/position/altitude",
-                    (scenery.cur_elev + 1) * METERS_TO_FEET );
-    }
-
-    SG_LOG( SG_GENERAL, SG_INFO,
-           "starting altitude is = " <<
-           fgGetDouble("/position/altitude") );
-
-    f->set_Altitude( fgGetDouble("/position/altitude") );
-    SG_LOG( SG_GENERAL, SG_INFO,
-           "Initial position is: ("
-           << (f->get_Longitude() * SGD_RADIANS_TO_DEGREES) << ", "
-           << (f->get_Latitude() * SGD_RADIANS_TO_DEGREES) << ", "
-           << (f->get_Altitude() * SG_FEET_TO_METER) << ")" );
-
-    return true;
-}
-
-
 // General house keeping initializations
 bool fgInitGeneral( void ) {
     string root;
@@ -486,40 +444,6 @@ bool fgInitGeneral( void ) {
 }
 
 
-// set initial aircraft speed
-void
-fgVelocityInit( void ) 
-{
-  if (!fgHasValue("/sim/startup/speed-set")) {
-    current_aircraft.fdm_state->set_V_calibrated_kts(0.0);
-    return;
-  }
-
-  const string speedset = fgGetString("/sim/startup/speed-set");
-  if (speedset == "knots" || speedset == "KNOTS") {
-    current_aircraft.fdm_state
-      ->set_V_calibrated_kts(fgGetDouble("/velocities/airspeed"));
-  } else if (speedset == "mach" || speedset == "MACH") {
-    current_aircraft.fdm_state
-      ->set_Mach_number(fgGetDouble("/velocities/mach"));
-  } else if (speedset == "UVW" || speedset == "uvw") {
-    current_aircraft.fdm_state
-      ->set_Velocities_Wind_Body(fgGetDouble("/velocities/uBody"),
-                                fgGetDouble("/velocities/vBody"),
-                                fgGetDouble("/velocities/wBody"));
-  } else if (speedset == "NED" || speedset == "ned") {
-    current_aircraft.fdm_state
-      ->set_Velocities_Local(fgGetDouble("/velocities/speed-north"),
-                            fgGetDouble("/velocities/speed-east"),
-                            fgGetDouble("/velocities/speed-down"));
-  } else {
-    SG_LOG(SG_GENERAL, SG_ALERT,
-          "Unrecognized value for /sim/startup/speed-set: " << speedset);
-    current_aircraft.fdm_state->set_V_calibrated_kts(0.0);
-  }
-}             
-
-        
 // This is the top level init routine which calls all the other
 // initialization routines.  If you are adding a subsystem to flight
 // gear, its initialization call should located in this routine.
@@ -530,7 +454,11 @@ bool fgInitSubsystems( void ) {
     SG_LOG( SG_GENERAL, SG_INFO, "Initialize Subsystems");
     SG_LOG( SG_GENERAL, SG_INFO, "========== ==========");
 
-    // Initialize the material property lib
+
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the material property subsystem.
+    ////////////////////////////////////////////////////////////////////
+
     SGPath mpath( globals->get_fg_root() );
     mpath.append( "materials" );
     if ( material_lib.load( mpath.str() ) ) {
@@ -539,7 +467,11 @@ bool fgInitSubsystems( void ) {
        exit(-1);
     }
 
-    // Initialize the Scenery Management subsystem
+
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the scenery management subsystem.
+    ////////////////////////////////////////////////////////////////////
+
     if ( fgSceneryInit() ) {
        // Material lib initialized ok.
     } else {
@@ -560,6 +492,11 @@ bool fgInitSubsystems( void ) {
            "Current terrain elevation after tile mgr init " <<
            scenery.cur_elev );
 
+
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the flight model subsystem.
+    ////////////////////////////////////////////////////////////////////
+
     double dt = 1.0 / fgGetInt("/sim/model-hz");
     // cout << "dt = " << dt << endl;
 
@@ -583,70 +520,18 @@ bool fgInitSubsystems( void ) {
               << ", can't init aircraft");
        exit(-1);
     }
-    cur_fdm_state->stamp();
-    cur_fdm_state->set_remainder( 0 );
-
+    cur_fdm_state->init();
+    cur_fdm_state->bind();
+    
     // allocates structures so must happen before any of the flight
     // model or control parameters are set
     fgAircraftInit();   // In the future this might not be the case.
 
-    fgFDMSetGroundElevation( fgGetString("/sim/flight-model"),
-                            scenery.cur_elev );
-    
-    // set the initial position
-    fgInitPosition();
-
-    // Calculate ground elevation at starting point (we didn't have
-    // tmp_abs_view_pos calculated when fgTileMgrUpdate() was called above
-    //
-    // calculalate a cartesian point somewhere along the line between
-    // the center of the earth and our view position.  Doesn't have to
-    // be the exact elevation (this is good because we don't know it
-    // yet :-)
-
-    // now handled inside of the fgTileMgrUpdate()
-
-    // Reset our altitude if we are below ground
-    SG_LOG( SG_GENERAL, SG_DEBUG, "Current altitude = "
-           << cur_fdm_state->get_Altitude() );
-    SG_LOG( SG_GENERAL, SG_DEBUG, "Current runway altitude = " <<
-           cur_fdm_state->get_Runway_altitude() );
-
-    if ( cur_fdm_state->get_Altitude() < cur_fdm_state->get_Runway_altitude() +
-        3.758099) {
-       cur_fdm_state->set_Altitude( cur_fdm_state->get_Runway_altitude() +
-                                    3.758099 );
-    }
 
-    SG_LOG( SG_GENERAL, SG_INFO,
-           "Updated position (after elevation adj): ("
-           << (cur_fdm_state->get_Latitude() * SGD_RADIANS_TO_DEGREES) << ", "
-           << (cur_fdm_state->get_Longitude() * SGD_RADIANS_TO_DEGREES) << ", "
-           << (cur_fdm_state->get_Altitude() * SG_FEET_TO_METER) << ")" );
-
-    // We need to calculate a few sea_level_radius here so we can pass
-    // the correct value to the view class
-    double sea_level_radius_meters;
-    double lat_geoc;
-    sgGeodToGeoc( cur_fdm_state->get_Latitude(),
-                 cur_fdm_state->get_Altitude(),
-                 &sea_level_radius_meters, &lat_geoc);
-    cur_fdm_state->set_Sea_level_radius( sea_level_radius_meters *
-                                        SG_METER_TO_FEET );
-
-    // The following section sets up the flight model EOM parameters
-    // and should really be read in from one or more files.
-
-    // Initial Velocity
-    fgVelocityInit();
-
-    // Initial Orientation
-//     cur_fdm_state->
-//     set_Euler_Angles( fgGetDouble("/orientation/roll") * SGD_DEGREES_TO_RADIANS,
-//                       fgGetDouble("/orientation/pitch") * SGD_DEGREES_TO_RADIANS,
-//                       fgGetDouble("/orientation/heading") * SGD_DEGREES_TO_RADIANS );
-
-    // Initialize the event manager
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the event manager subsystem.
+    ////////////////////////////////////////////////////////////////////
+
     global_events.Init();
 
     // Output event stats every 60 seconds
@@ -655,6 +540,11 @@ bool fgInitSubsystems( void ) {
                                                   &fgEVENT_MGR::PrintStats),
                            fgEVENT::FG_EVENT_READY, 60000 );
 
+
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the view manager subsystem.
+    ////////////////////////////////////////////////////////////////////
+
     // Initialize win_ratio parameters
     for ( int i = 0; i < globals->get_viewmgr()->size(); ++i ) {
        globals->get_viewmgr()->get_view(i)->
@@ -682,6 +572,11 @@ bool fgInitSubsystems( void ) {
     SG_LOG( SG_GENERAL, SG_DEBUG, "  abs_view_pos = "
            << globals->get_current_view()->get_abs_view_pos());
 
+
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the lighting subsystem.
+    ////////////////////////////////////////////////////////////////////
+
     // fgUpdateSunPos() needs a few position and view parameters set
     // so it can calculate local relative sun angle and a few other
     // things for correctly orienting the sky.
@@ -700,10 +595,21 @@ bool fgInitSubsystems( void ) {
                            fgMethodCallback<fgLIGHT>( &cur_light_params,
                                                       &fgLIGHT::Update),
                            fgEVENT::FG_EVENT_READY, 30000 );
+
+
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the local time subsystem.
+    ////////////////////////////////////////////////////////////////////
+
     // update the current timezone each 30 minutes
     global_events.Register( "fgUpdateLocalTime()", fgUpdateLocalTime,
                            fgEVENT::FG_EVENT_READY, 1800000);
 
+
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the weather subsystem.
+    ////////////////////////////////////////////////////////////////////
+
     // Initialize the weather modeling subsystem
 #ifndef FG_OLD_WEATHER
     // Initialize the WeatherDatabase
@@ -733,7 +639,10 @@ bool fgInitSubsystems( void ) {
     current_weather.Init();
 #endif
 
+    ////////////////////////////////////////////////////////////////////
     // Initialize vor/ndb/ils/fix list management and query systems
+    ////////////////////////////////////////////////////////////////////
+
     SG_LOG(SG_GENERAL, SG_INFO, "Loading Navaids");
 
     SG_LOG(SG_GENERAL, SG_INFO, "  VOR/NDB");
@@ -756,12 +665,22 @@ bool fgInitSubsystems( void ) {
     p_fix.append( "Navaids/default.fix" );
     current_fixlist->init( p_fix );
 
-    // Radio stack subsystem.
+
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the radio stack subsystem.
+    ////////////////////////////////////////////////////////////////////
+
+                               // A textbook example of how FGSubsystem
+                               // should work...
     current_radiostack = new FGRadioStack;
     current_radiostack->init();
     current_radiostack->bind();
 
-    // Initialize the Cockpit subsystem
+
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the cockpit subsystem
+    ////////////////////////////////////////////////////////////////////
+
     if( fgCockpitInit( &current_aircraft )) {
        // Cockpit initialized ok.
     } else {
@@ -769,43 +688,20 @@ bool fgInitSubsystems( void ) {
        exit(-1);
     }
 
-    // Initialize the flight model subsystem data structures base on
-    // above values
 
-    cur_fdm_state->init();
-    cur_fdm_state->bind();
-//     if ( cur_fdm_state->init( 1.0 / fgGetInt("/sim/model-hz") ) ) {
-//     // fdm init successful
-//     } else {
-//     SG_LOG( SG_GENERAL, SG_ALERT, "FDM init() failed!  Cannot continue." );
-//     exit(-1);
-//     }
-
-    // *ABCD* I'm just sticking this here for now, it should probably
-    // move eventually
-    scenery.cur_elev = cur_fdm_state->get_Runway_altitude() * SG_FEET_TO_METER;
-
-    if ( cur_fdm_state->get_Altitude() <
-        cur_fdm_state->get_Runway_altitude() + 3.758099)
-    {
-       cur_fdm_state->set_Altitude( cur_fdm_state->get_Runway_altitude() +
-                                    3.758099 );
-    }
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the joystick subsystem.
+    ////////////////////////////////////////////////////////////////////
 
-    SG_LOG( SG_GENERAL, SG_INFO,
-           "Updated position (after elevation adj): ("
-           << (cur_fdm_state->get_Latitude() * SGD_RADIANS_TO_DEGREES) << ", "
-           << (cur_fdm_state->get_Longitude() * SGD_RADIANS_TO_DEGREES) << ", "
-           << (cur_fdm_state->get_Altitude() * SG_FEET_TO_METER) << ")" );
-    // *ABCD* end of thing that I just stuck in that I should probably
-    // move
-
-    // Joystick support
     if ( ! fgJoystickInit() ) {
        SG_LOG( SG_GENERAL, SG_ALERT, "Error in Joystick initialization!" );
     }
 
-    // Autopilot init
+
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the autopilot subsystem.
+    ////////////////////////////////////////////////////////////////////
+
     current_autopilot = new FGAutopilot;
     current_autopilot->init();
 
@@ -815,7 +711,11 @@ bool fgInitSubsystems( void ) {
     NewHeadingInit();
     NewAltitudeInit();
 
-    // Initialize I/O channels
+    
+    ////////////////////////////////////////////////////////////////////
+    // Initialize I/O subsystem.
+    ////////////////////////////////////////////////////////////////////
+
 #if ! defined( macintosh )
     fgIOInit();
 #endif
@@ -833,12 +733,26 @@ bool fgInitSubsystems( void ) {
        current_panel->bind();
     }
 
-    // Initialize the BFI
+    
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the BFI.
+    ////////////////////////////////////////////////////////////////////
+
     FGBFI::init();
 
+
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the controls subsystem.
+    ////////////////////////////////////////////////////////////////////
+
     controls.init();
     controls.bind();
 
+
+    ////////////////////////////////////////////////////////////////////////
+    // End of subsystem initialization.
+    ////////////////////////////////////////////////////////////////////
+
     SG_LOG( SG_GENERAL, SG_INFO, endl);
 
                                // Save the initial state for future
@@ -873,43 +787,6 @@ void fgReInitSubsystems( void )
                exit(-1);
     }
 
-    // cout << "current scenery elev = " << scenery.cur_elev << endl;
-
-    fgFDMSetGroundElevation( fgGetString("/sim/flight-model"), 
-                            scenery.cur_elev );
-    fgInitPosition();
-
-    // Reset our altitude if we are below ground
-    SG_LOG( SG_GENERAL, SG_DEBUG, "Current altitude = "
-           << cur_fdm_state->get_Altitude() );
-    SG_LOG( SG_GENERAL, SG_DEBUG, "Current runway altitude = "
-           << cur_fdm_state->get_Runway_altitude() );
-
-    if ( cur_fdm_state->get_Altitude() <
-        cur_fdm_state->get_Runway_altitude() + 3.758099)
-    {
-       cur_fdm_state->set_Altitude( cur_fdm_state->get_Runway_altitude() +
-                                    3.758099 );
-    }
-    double sea_level_radius_meters;
-    double lat_geoc;
-    sgGeodToGeoc( cur_fdm_state->get_Latitude(), cur_fdm_state->get_Altitude(), 
-                 &sea_level_radius_meters, &lat_geoc);
-    cur_fdm_state->set_Sea_level_radius( sea_level_radius_meters *
-                                        SG_METER_TO_FEET );
-       
-    // The following section sets up the flight model EOM parameters
-    // and should really be read in from one or more files.
-
-    // Initial Velocity
-    fgVelocityInit();
-
-    // Initial Orientation
-//     cur_fdm_state->
-//     set_Euler_Angles( fgGetDouble("/orientation/roll") * SGD_DEGREES_TO_RADIANS,
-//                       fgGetDouble("/orientation/pitch") * SGD_DEGREES_TO_RADIANS,
-//                       fgGetDouble("/orientation/heading") * SGD_DEGREES_TO_RADIANS );
-
     // Initialize view parameters
     FGViewerRPH *pilot_view =
        (FGViewerRPH *)globals->get_viewmgr()->get_view( 0 );
@@ -934,17 +811,6 @@ void fgReInitSubsystems( void )
            << globals->get_current_view()->get_abs_view_pos());
 
     cur_fdm_state->init();
-//     cur_fdm_state->bind();
-//     cur_fdm_state->init( 1.0 / fgGetInt("/sim/model-hz") );
-
-    scenery.cur_elev = cur_fdm_state->get_Runway_altitude() * SG_FEET_TO_METER;
-
-    if ( cur_fdm_state->get_Altitude() <
-        cur_fdm_state->get_Runway_altitude() + 3.758099)
-    {
-       cur_fdm_state->set_Altitude( cur_fdm_state->get_Runway_altitude() +
-                                    3.758099 );
-    }
 
     controls.reset_all();
     current_autopilot->reset();