From 93c69c4bc348b899eebc278e978ad518cdb4d780 Mon Sep 17 00:00:00 2001
From: david <david>
Date: Sun, 17 Feb 2002 21:05:27 +0000
Subject: [PATCH] Changes from Tony Peden to fix reinit crashes (and eliminate
 the force altitude function).

---
 src/FDM/LaRCsim.cxx     | 28 +++------------------
 src/FDM/LaRCsim.hxx     |  1 -
 src/FDM/LaRCsimIC.cxx   |  5 ----
 src/FDM/YASim/YASim.cxx |  2 +-
 src/FDM/flight.cxx      | 56 ++++++++++-------------------------------
 src/FDM/flight.hxx      |  8 +++---
 src/Main/fg_init.cxx    |  4 +++
 src/Main/main.cxx       | 11 ++++----
 8 files changed, 31 insertions(+), 84 deletions(-)

diff --git a/src/FDM/LaRCsim.cxx b/src/FDM/LaRCsim.cxx
index 20dfb738c..0cadfdd4c 100644
--- a/src/FDM/LaRCsim.cxx
+++ b/src/FDM/LaRCsim.cxx
@@ -79,8 +79,6 @@ FGLaRCsim::~FGLaRCsim(void) {
 void FGLaRCsim::init() {
    //do init common to all FDM's
    common_init();
-
-   //now do any specific to LaRCsim
 }
 
 
@@ -566,20 +564,6 @@ void FGLaRCsim::set_ls(void) {
     V_down_airmass = lsic->GetVdownAirmassFpsIC();
     ls_loop(0.0,-1);
     copy_from_LaRCsim();
-    SG_LOG( SG_FLIGHT, SG_INFO, "  FGLaRCsim::set_ls(): "  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     Phi: " <<  Phi  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     Theta: " <<  Theta  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     Psi: " <<  Psi  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     V_north: " <<  V_north  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     V_east: " <<  V_east  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     V_down: " <<  V_down  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     Altitude: " <<  Altitude  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     Latitude: " <<  Latitude  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     Longitude: " <<  Longitude  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     Runway_altitude: " <<  Runway_altitude  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     V_north_airmass: " <<  V_north_airmass  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     V_east_airmass: " <<  V_east_airmass  );
-    SG_LOG( SG_FLIGHT, SG_INFO, "     V_down_airmass: " <<  V_down_airmass  );
 }
 
 void FGLaRCsim::snap_shot(void) {
@@ -601,6 +585,7 @@ void FGLaRCsim::snap_shot(void) {
 void FGLaRCsim::set_Latitude(double lat) {
     SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Latitude: " << lat  );
     snap_shot();
+    _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
     lsic->SetLatitudeGDRadIC(lat);
     set_ls();
     copy_from_LaRCsim(); //update the bus
@@ -609,6 +594,8 @@ void FGLaRCsim::set_Latitude(double lat) {
 void FGLaRCsim::set_Longitude(double lon) {
     SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Longitude: " << lon  );
     snap_shot();
+    
+    _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
     lsic->SetLongitudeRadIC(lon);
     set_ls();
     copy_from_LaRCsim(); //update the bus
@@ -617,6 +604,7 @@ void FGLaRCsim::set_Longitude(double lon) {
 void FGLaRCsim::set_Altitude(double alt) {
     SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Altitude: " << alt  );
     snap_shot();
+    _set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
     lsic->SetAltitudeFtIC(alt);
     set_ls();
     copy_from_LaRCsim(); //update the bus
@@ -687,14 +675,6 @@ void FGLaRCsim::set_Gamma_vert_rad( double gamma) {
     copy_from_LaRCsim(); //update the bus
 }
 
-void FGLaRCsim::set_Runway_altitude(double ralt) {
-    SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_Runway_altitude: " << ralt  );
-    snap_shot();
-    lsic->SetRunwayAltitudeFtIC(ralt);
-    set_ls();
-    copy_from_LaRCsim(); //update the bus
-}
-
 void FGLaRCsim::set_AltitudeAGL(double altagl) {
     SG_LOG( SG_FLIGHT, SG_INFO, "FGLaRCsim::set_AltitudeAGL: " << altagl  );
     snap_shot();
diff --git a/src/FDM/LaRCsim.hxx b/src/FDM/LaRCsim.hxx
index 078579621..f5299c974 100644
--- a/src/FDM/LaRCsim.hxx
+++ b/src/FDM/LaRCsim.hxx
@@ -80,7 +80,6 @@ public:
     void set_Gamma_vert_rad( double gamma);
     
     // Earth
-    void set_Runway_altitude(double ralt);
     void set_Static_pressure(double p);
     void set_Static_temperature(double T); 
     void set_Density(double rho); 
diff --git a/src/FDM/LaRCsimIC.cxx b/src/FDM/LaRCsimIC.cxx
index 5ec1db499..4e689fc25 100644
--- a/src/FDM/LaRCsimIC.cxx
+++ b/src/FDM/LaRCsimIC.cxx
@@ -99,15 +99,11 @@ void LaRCsimIC::SetClimbRateFpmIC( SCALAR tt) {
 
 void LaRCsimIC::SetClimbRateFpsIC( SCALAR tt) {
   vtg=vt+vw;
-  cout << "vtg: " << vtg << endl;
   if(vtg > 0.1) {
     hdot = tt - vdownwind;
     gamma=asin(hdot/vtg);
     getTheta();
     vdown=-1*hdot;
-    cout << "hdot: " << hdot << endl;
-    cout << "gamma: " << gamma*SGD_RADIANS_TO_DEGREES << endl;
-    cout << "vdown: " << vdown << endl;
   }
 }
 
@@ -116,7 +112,6 @@ void LaRCsimIC::SetFlightPathAngleRadIC( SCALAR tt) {
   getTheta();
   vtg=vt+vw;
   hdot=vtg*sin(tt);
-  cout << "hdot: " << hdot << endl;
   vdown=-1*hdot;
 }
 
diff --git a/src/FDM/YASim/YASim.cxx b/src/FDM/YASim/YASim.cxx
index 3253715a5..166b56656 100644
--- a/src/FDM/YASim/YASim.cxx
+++ b/src/FDM/YASim/YASim.cxx
@@ -227,7 +227,7 @@ void YASim::copyToYASim(bool copyState)
     // The ground elevation doesn't come from FGInterface; query it
     // from the scenery and set it for others to find.
     double ground = scenery.get_cur_elev();
-    set_Runway_altitude(ground * FT2M);
+    _set_Runway_altitude(ground * FT2M);
     // cout << "YASIM: ground = " << ground << endl;
 
     // You'd this this would work, but it doesn't.  These values are
diff --git a/src/FDM/flight.cxx b/src/FDM/flight.cxx
index a0b7c4e59..9bc133c08 100644
--- a/src/FDM/flight.cxx
+++ b/src/FDM/flight.cxx
@@ -188,10 +188,6 @@ FGInterface::common_init ()
     SG_LOG( SG_FLIGHT, SG_INFO,
             "...initializing ground elevation to " << ground_elev_ft
             << "ft..." );
-    SG_LOG( SG_FLIGHT, SG_INFO, "common_init(): set ground elevation "
-            << ground_elev_ft );
-    base_fdm_state.set_Runway_altitude( ground_elev_ft );
-    set_Runway_altitude( ground_elev_ft );
 
     // Set sea-level radius
     SG_LOG( SG_FLIGHT, SG_INFO, "...initializing sea-level radius..." );
@@ -204,7 +200,7 @@ FGInterface::common_init ()
                     * SGD_DEGREES_TO_RADIANS,
                   fgGetDouble("/position/altitude-ft") * SG_FEET_TO_METER,
                   &sea_level_radius_meters, &lat_geoc );
-    set_Sea_level_radius( sea_level_radius_meters * SG_METER_TO_FEET );
+    _set_Sea_level_radius( sea_level_radius_meters * SG_METER_TO_FEET );
 
     // Set initial velocities
     SG_LOG( SG_FLIGHT, SG_INFO, "...initializing velocities..." );
@@ -358,6 +354,14 @@ FGInterface::bind ()
 	&FGInterface::get_Climb_Rate); // read-only
   fgTie("/velocities/side-slip-rad", this,
 	&FGInterface::get_Beta); // read-only
+  fgTie("/velocities/side-slip-deg", this,
+  &FGInterface::get_Beta_deg); // read-only
+  fgTie("/velocities/alpha-deg", this,
+  &FGInterface::get_Alpha_deg); // read-only
+  fgTie("/accelerations/nlf", this,
+  &FGInterface::get_Nlf); // read-only
+  
+  
 }
 
 
@@ -392,6 +396,10 @@ FGInterface::unbind ()
   fgUntie("/velocities/wBody-fps");
   fgUntie("/velocities/vertical-speed-fps");
   fgUntie("/velocities/side-slip-rad");
+  fgUntie("/velocities/side-slip-deg");
+  fgUntie("/velocities/alpha-deg");
+  fgUntie("/accelerations/nlf");
+  
 }
 
 /**
@@ -540,35 +548,6 @@ void FGInterface::extrapolate( int time_offset ) {
     geocentric_position_v[2] = radius;
 }
 
-
-// Set the altitude (force)
-void fgFDMForceAltitude(const string &model, double alt_meters) {
-    SG_LOG(SG_FLIGHT,SG_INFO, "fgFDMForceAltitude: " << alt_meters );
-
-    double sea_level_radius_meters;
-    double lat_geoc;
-
-    // Set the FG variables first
-    sgGeodToGeoc( base_fdm_state.get_Latitude(), alt_meters, 
-		  &sea_level_radius_meters, &lat_geoc);
-
-    base_fdm_state.set_Altitude( alt_meters * SG_METER_TO_FEET );
-    base_fdm_state.set_Sea_level_radius( sea_level_radius_meters *
-					 SG_METER_TO_FEET ); 
-		
-    cur_fdm_state->set_Altitude( alt_meters * SG_METER_TO_FEET );
-    cur_fdm_state->set_Sea_level_radius( sea_level_radius_meters * 
-                                         SG_METER_TO_FEET );
-    cur_fdm_state->set_Runway_altitude( scenery.get_cur_elev() *
-					SG_METER_TO_FEET );	
-
-    // additional work needed for some flight models
-    if ( model == "larcsim" ) {
-	ls_ForceAltitude( base_fdm_state.get_Altitude() );
-    }
-}
-
-
 // Positions
 void FGInterface::set_Latitude(double lat) {
     geodetic_position_v[0] = lat;
@@ -629,15 +608,6 @@ void FGInterface::set_Gamma_vert_rad( double gamma) {
     gamma_vert_rad = gamma;
 }
 
-// Earth
-void FGInterface::set_Sea_level_radius(double slr) {
-    sea_level_radius = slr;
-}
-
-void FGInterface::set_Runway_altitude(double ralt) {
-    runway_altitude = ralt;
-}
-
 void FGInterface::set_Static_pressure(double p) { static_pressure = p; }
 void FGInterface::set_Static_temperature(double T) { static_temperature = T; }
 void FGInterface::set_Density(double rho) { density = rho; }
diff --git a/src/FDM/flight.hxx b/src/FDM/flight.hxx
index b68482d79..fe0a11edd 100644
--- a/src/FDM/flight.hxx
+++ b/src/FDM/flight.hxx
@@ -513,8 +513,6 @@ public:
     virtual void set_Gamma_vert_rad( double gamma);
     
     // Earth
-    virtual void set_Sea_level_radius(double slr);
-    virtual void set_Runway_altitude(double ralt);
     
     virtual void set_Static_pressure(double p);
     virtual void set_Static_temperature(double T);
@@ -693,7 +691,7 @@ public:
     //    n_pilot_body_v[2] = z;
     // }
 
-    inline double get_Nlf(void) { return nlf; }
+    inline double get_Nlf(void) const { return nlf; }
 
     // inline double * get_Omega_dot_body_v() { return omega_dot_body_v; }
     // inline double get_P_dot_body() const { return omega_dot_body_v[0]; }
@@ -912,7 +910,9 @@ public:
     // }
 
     inline double get_Alpha() const { return alpha; }
+    inline double get_Alpha_deg() const { return alpha * SGD_RADIANS_TO_DEGREES; }
     inline double get_Beta() const { return beta; }
+    inline double get_Beta_deg() const { return beta * SGD_RADIANS_TO_DEGREES; }
     inline double get_Alpha_dot() const { return alpha_dot; }
     // inline void set_Alpha_dot( double ad ) { alpha_dot = ad; }
     inline double get_Beta_dot() const { return beta_dot; }
@@ -1081,8 +1081,6 @@ extern FGInterface * cur_fdm_state;
 
 // General interface to the flight model routines
 
-// Set the altitude (force)
-void fgFDMForceAltitude(const string &model, double alt_meters);
 
 // Toggle data logging on/off
 void fgToggleFDMdataLogging(void);
diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx
index 09748891a..631b3f2be 100644
--- a/src/Main/fg_init.cxx
+++ b/src/Main/fg_init.cxx
@@ -1017,6 +1017,10 @@ void fgReInitSubsystems( void )
 #endif
 
     fgInitFDM();
+    
+    // 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.
 
     fgInitView();
 
diff --git a/src/Main/main.cxx b/src/Main/main.cxx
index 6d91652fd..fe96a00f7 100644
--- a/src/Main/main.cxx
+++ b/src/Main/main.cxx
@@ -883,7 +883,7 @@ void fgUpdateTimeDepCalcs() {
     static const SGPropertyNode *master_freeze
 	= fgGetNode("/sim/freeze/master");
 
-    // cout << "Updating time dep calcs()" << endl;
+    //SG_LOG(SG_FLIGHT,SG_INFO, "Updating time dep calcs()");
 
     fgLIGHT *l = &cur_light_params;
     int i;
@@ -897,7 +897,8 @@ void fgUpdateTimeDepCalcs() {
     //      << " cur_elev = " << scenery.get_cur_elev() << endl;
 
     if ( !cur_fdm_state->get_inited() && scenery.get_cur_elev() > -9990 ) {
-	cout << "Finally initializing fdm" << endl;
+  SG_LOG(SG_FLIGHT,SG_INFO, "Finally initializing fdm");  
+	
 	cur_fdm_state->init();
 	if ( cur_fdm_state->get_bound() ) {
 	    cur_fdm_state->unbind();
@@ -1061,8 +1062,8 @@ static void fgMainLoop( void ) {
 		   cur_fdm_state->get_Altitude() * SG_FEET_TO_METER,
 		   scenery.get_cur_elev() + alt_adjust_m - 3.0,
 		   scenery.get_cur_elev() + alt_adjust_m );
-	    fgFDMForceAltitude( fgGetString("/sim/flight-model"), 
-				scenery.get_cur_elev() + alt_adjust_m );
+	    cur_fdm_state->set_Altitude( scenery.get_cur_elev() 
+                                                + alt_adjust_m );
 
 	    SG_LOG( SG_ALL, SG_DEBUG, 
 		    "<*> resetting altitude to " 
@@ -1716,7 +1717,7 @@ int mainLoop( int argc, char **argv ) {
 
     // build our custom render states
     fgBuildRenderStates();
-
+    
     // pass control off to the master GLUT event handler
     glutMainLoop();