]> git.mxchange.org Git - flightgear.git/commitdiff
Add the ability to control turbulence rate as well as magnitude.
authordavid <david>
Sun, 13 Jul 2003 20:13:18 +0000 (20:13 +0000)
committerdavid <david>
Sun, 13 Jul 2003 20:13:18 +0000 (20:13 +0000)
Square the normalized direction acceleration for the y and z axes, so
that turbulence predominantly affects pitch.

Bind to the /environment/turbulence/magnitude-norm and
/environment/turbulence/rate-hz properties in FlightGear.

src/Environment/environment.cxx
src/Environment/environment.hxx
src/Environment/environment_mgr.cxx
src/FDM/JSBSim/FGAtmosphere.cpp
src/FDM/JSBSim/FGAtmosphere.h
src/FDM/JSBSim/JSBSim.cxx
src/FDM/JSBSim/JSBSim.hxx
src/Main/options.cxx
src/Network/native_ctrls.cxx

index 09313213a16fd63293cd90711ea30276aba5e29c..d8d6cdf46000cee772bbc2411f3fd7fa35cfc259 100644 (file)
@@ -126,7 +126,8 @@ FGEnvironment::FGEnvironment()
     wind_from_north_fps(0),
     wind_from_east_fps(0),
     wind_from_down_fps(0),
-    turbulence_norm(0)
+    turbulence_magnitude_norm(0),
+    turbulence_rate_hz(1)
 {
   _setup_tables();
   _recalc_density();
@@ -157,14 +158,15 @@ FGEnvironment::copy (const FGEnvironment &env)
     wind_from_north_fps = env.wind_from_north_fps;
     wind_from_east_fps = env.wind_from_east_fps;
     wind_from_down_fps = env.wind_from_down_fps;
-    turbulence_norm = env.turbulence_norm;
+    turbulence_magnitude_norm = env.turbulence_magnitude_norm;
+    turbulence_rate_hz = env.turbulence_rate_hz;
 }
 
 static inline bool
 maybe_copy_value (FGEnvironment * env, const SGPropertyNode * node,
                   const char * name, void (FGEnvironment::*setter)(double))
 {
-    const SGPropertyNode * child = node->getChild(name);
+    const SGPropertyNode * child = node->getNode(name);
                                 // fragile: depends on not being typed
                                 // as a number
     if (child != 0 && child->getStringValue()[0] != '\0') {
@@ -205,8 +207,11 @@ FGEnvironment::read (const SGPropertyNode * node)
     maybe_copy_value(this, node, "elevation-ft",
                      &FGEnvironment::set_elevation_ft);
 
-    maybe_copy_value(this, node, "turbulence-norm",
-                     &FGEnvironment::set_turbulence_norm);
+    maybe_copy_value(this, node, "turbulence/magnitude-norm",
+                     &FGEnvironment::set_turbulence_magnitude_norm);
+
+    maybe_copy_value(this, node, "turbulence/rate-hz",
+                     &FGEnvironment::set_turbulence_rate_hz);
 }
 
 
@@ -289,9 +294,15 @@ FGEnvironment::get_wind_from_down_fps () const
 }
 
 double
-FGEnvironment::get_turbulence_norm () const
+FGEnvironment::get_turbulence_magnitude_norm () const
+{
+  return turbulence_magnitude_norm;
+}
+
+double
+FGEnvironment::get_turbulence_rate_hz () const
 {
-  return turbulence_norm;
+  return turbulence_rate_hz;
 }
 
 double
@@ -394,9 +405,15 @@ FGEnvironment::set_wind_from_down_fps (double d)
 }
 
 void
-FGEnvironment::set_turbulence_norm (double t)
+FGEnvironment::set_turbulence_magnitude_norm (double t)
 {
-  turbulence_norm = t;
+  turbulence_magnitude_norm = t;
+}
+
+void
+FGEnvironment::set_turbulence_rate_hz (double r)
+{
+  turbulence_rate_hz = r;
 }
 
 void
@@ -588,9 +605,14 @@ interpolate (const FGEnvironment * env1, const FGEnvironment * env2,
                    env2->get_elevation_ft(),
                    fraction));
 
-    result->set_turbulence_norm
-        (do_interp(env1->get_turbulence_norm(),
-                   env2->get_turbulence_norm(),
+    result->set_turbulence_magnitude_norm
+        (do_interp(env1->get_turbulence_magnitude_norm(),
+                   env2->get_turbulence_magnitude_norm(),
+                   fraction));
+
+    result->set_turbulence_rate_hz
+        (do_interp(env1->get_turbulence_rate_hz(),
+                   env2->get_turbulence_rate_hz(),
                    fraction));
 }
 
index ba98d465239feee820bc2acd8e9cb83d9cb1e46b..dafea47cf03f69a1dfed7adaba24a41c2dae2db4 100644 (file)
@@ -72,7 +72,8 @@ public:
   virtual double get_wind_from_east_fps () const;
   virtual double get_wind_from_down_fps () const;
 
-  virtual double get_turbulence_norm () const;
+  virtual double get_turbulence_magnitude_norm () const;
+  virtual double get_turbulence_rate_hz () const;
 
   virtual void set_visibility_m (double v);
 
@@ -89,7 +90,8 @@ public:
   virtual void set_wind_from_east_fps (double e);
   virtual void set_wind_from_down_fps (double d);
 
-  virtual void set_turbulence_norm (double t);
+  virtual void set_turbulence_magnitude_norm (double t);
+  virtual void set_turbulence_rate_hz (double t);
 
   virtual double get_elevation_ft () const;
   virtual void set_elevation_ft (double elevation_ft);
@@ -120,7 +122,8 @@ private:
   double pressure_inhg;
   double density_slugft3;
 
-  double turbulence_norm;
+  double turbulence_magnitude_norm;
+  double turbulence_rate_hz;
 
   double wind_from_heading_deg;
   double wind_speed_kt;
index e509ee940afaee0ad618912334d238264cb9696d..1875a514d22bae3378b58e45a58f80ef4cfa7bfa 100644 (file)
@@ -106,10 +106,14 @@ FGEnvironmentMgr::bind ()
        &FGEnvironment::get_wind_from_down_fps,
        &FGEnvironment::set_wind_from_down_fps);
   fgSetArchivable("/environment/wind-from-down-fps");
-  fgTie("/environment/turbulence-norm", _environment,
-        &FGEnvironment::get_turbulence_norm,
-        &FGEnvironment::set_turbulence_norm);
-  fgSetArchivable("/environment/turbulence-norm");
+  fgTie("/environment/turbulence/magnitude-norm", _environment,
+        &FGEnvironment::get_turbulence_magnitude_norm,
+        &FGEnvironment::set_turbulence_magnitude_norm);
+  fgSetArchivable("/environment/turbulence/magnitude-norm");
+  fgTie("/environment/turbulence/rate_hz", _environment,
+        &FGEnvironment::get_turbulence_rate_hz,
+        &FGEnvironment::set_turbulence_rate_hz);
+  fgSetArchivable("/environment/turbulence/rate_hz");
 
   for (int i = 0; i < MAX_CLOUD_LAYERS; i++) {
     char buf[128];
index 26404342aeae233189b21e4ec4272038d669a9a3..717e3a4dbd1dffbddc6fdf017913400c9caa7087 100644 (file)
@@ -92,6 +92,7 @@ FGAtmosphere::FGAtmosphere(FGFDMExec* fdmex) : FGModel(fdmex)
   turbType = ttStandard;
 //   turbType = ttBerndt;
   TurbGain = 0.0;
+  TurbRate = 1.0;
   
   bind();
   Debug(0);
@@ -272,11 +273,13 @@ void FGAtmosphere::Turbulence(void)
                                 // away from the peaks
     MagnitudedAccelDt = ((MagnitudedAccelDt - Magnitude) /
                          (1 + fabs(Magnitude)));
-    MagnitudeAccel    += MagnitudedAccelDt*rate*State->Getdt();
+    MagnitudeAccel    += MagnitudedAccelDt*rate*TurbRate*State->Getdt();
     Magnitude         += MagnitudeAccel*rate*State->Getdt();
 
     vDirectiondAccelDt.Normalize();
-    vDirectionAccel += vDirectiondAccelDt*rate*State->Getdt();
+    vDirectiondAccelDt(eY) *= vDirectiondAccelDt(eY);
+    vDirectiondAccelDt(eZ) *= vDirectiondAccelDt(eZ);
+    vDirectionAccel += vDirectiondAccelDt*rate*TurbRate*State->Getdt();
     vDirectionAccel.Normalize();
     vDirection      += vDirectionAccel*rate*State->Getdt();
 
@@ -284,7 +287,7 @@ void FGAtmosphere::Turbulence(void)
     
                                 // Diminish turbulence within three wingspans
                                 // of the ground
-    vTurbulence = TurbGain*Magnitude * vDirection;
+    vTurbulence = TurbGain * Magnitude * vDirection;
     double HOverBMAC = Position->GetHOverBMAC();
     if (HOverBMAC < 3.0)
         vTurbulence *= (HOverBMAC / 3.0) * (HOverBMAC / 3.0);
index 0870e9bf64834f097c9c162fde4c81c1157645fb..72bdb1d395454c59dfe76b20458de8e1c6fff65d 100644 (file)
@@ -150,6 +150,7 @@ public:
   inline double GetWindPsi(void) const { return psiw; }
   
   inline void SetTurbGain(double tt) {TurbGain = tt;}
+  inline void SetTurbRate(double tt) {TurbRate = tt;}
   
   inline double GetTurbPQR(int idx) const {return vTurbPQR(idx);}
   inline FGColumnVector3& GetTurbPQR(void) {return vTurbPQR;}
@@ -176,6 +177,7 @@ private:
   
   double MagnitudedAccelDt, MagnitudeAccel, Magnitude;
   double TurbGain;
+  double TurbRate;
   FGColumnVector3 vDirectiondAccelDt;
   FGColumnVector3 vDirectionAccel;
   FGColumnVector3 vDirection;
index 3679164ef26c9f364e707ef6e689814da676ae2b..fd81aca96e950c3abbb4c8dd291287acc9c9a81d 100644 (file)
@@ -182,7 +182,8 @@ FGJSBsim::FGJSBsim( double dt )
     temperature = fgGetNode("/environment/temperature-degc",true);
     pressure = fgGetNode("/environment/pressure-inhg",true);
     density = fgGetNode("/environment/density-slugft3",true);
-    turbulence = fgGetNode("environment/turbulence-norm",true);
+    turbulence_gain = fgGetNode("/environment/turbulence/magnitude-norm",true);
+    turbulence_rate = fgGetNode("/environment/turbulence/rate-hz",true);
     
     wind_from_north= fgGetNode("/environment/wind-from-north-fps",true);
     wind_from_east = fgGetNode("/environment/wind-from-east-fps" ,true);
@@ -201,6 +202,8 @@ FGJSBsim::~FGJSBsim(void) {
 // each subsequent iteration through the EOM
 
 void FGJSBsim::init() {
+
+    double tmp;
     
     SG_LOG( SG_FLIGHT, SG_INFO, "Starting and initializing JSBsim" );
 
@@ -216,9 +219,13 @@ void FGJSBsim::init() {
                   9.0/5.0*(temperature->getDoubleValue()+273.15) );
       Atmosphere->SetExPressure(pressure->getDoubleValue()*70.726566);
       Atmosphere->SetExDensity(density->getDoubleValue());
-      Atmosphere->SetTurbGain(turbulence->getDoubleValue() *
-                              turbulence->getDoubleValue() *
-                              100.0);
+
+      tmp = turbulence_gain->getDoubleValue();
+      Atmosphere->SetTurbGain(tmp * tmp * 100.0);
+
+      tmp = turbulence_rate->getDoubleValue();
+      Atmosphere->SetTurbRate(tmp);
+
     } else {
       Atmosphere->UseInternal();
     }
@@ -364,6 +371,7 @@ FGJSBsim::update( double dt ) {
 // Convert from the FGInterface struct to the JSBsim generic_ struct
 
 bool FGJSBsim::copy_to_JSBsim() {
+    double tmp;
     unsigned int i;
 
     // copy control positions into the JSBsim structure
@@ -412,9 +420,12 @@ bool FGJSBsim::copy_to_JSBsim() {
                   9.0/5.0*(temperature->getDoubleValue()+273.15) );
     Atmosphere->SetExPressure(pressure->getDoubleValue()*70.726566);
     Atmosphere->SetExDensity(density->getDoubleValue());
-    Atmosphere->SetTurbGain(turbulence->getDoubleValue() *
-                            turbulence->getDoubleValue() *
-                            100.0);
+
+    tmp = turbulence_gain->getDoubleValue();
+    Atmosphere->SetTurbGain(tmp * tmp * 100.0);
+
+    tmp = turbulence_rate->getDoubleValue();
+    Atmosphere->SetTurbRate(tmp);
 
     Atmosphere->SetWindNED( wind_from_north->getDoubleValue(),
                             wind_from_east->getDoubleValue(),
index 2d83588ec5c24d0b53b4b052ed086a7b2a955eb6..a2751216971256a40c7d0c6caa3b74130aef24c3 100644 (file)
@@ -265,7 +265,8 @@ private:
     SGPropertyNode *temperature;
     SGPropertyNode *pressure;
     SGPropertyNode *density;
-    SGPropertyNode *turbulence;
+    SGPropertyNode *turbulence_gain;
+    SGPropertyNode *turbulence_rate;
     
     SGPropertyNode *wind_from_north;
     SGPropertyNode *wind_from_east;
index 3303778ee6c37136d6bb096954db376b0799966c..9a28333d0fe105c197b0ec3aa78ee8c16465335b 100644 (file)
@@ -995,7 +995,7 @@ fgOptWind( const char *arg )
 static int
 fgOptTurbulence( const char *arg)
 {
-    fgDefaultWeatherValue("turbulence-norm", atof(arg));
+    fgDefaultWeatherValue("turbulence/magnitude-norm", atof(arg));
     return FG_OPTIONS_OK;
 }
 
index bf759a2ef38ec2b0dfbe9bddf3e02d648dd542cd..8049297a5acc333323b66f0e1179e8ac022d0c8e 100644 (file)
@@ -180,7 +180,8 @@ void FGProps2NetCtrls( FGNetCtrls *net, bool net_byte_order ) {
 
     net->wind_speed_kt = fgGetDouble("/environment/wind-speed-kt");
     net->wind_dir_deg = fgGetDouble("/environment/wind-from-heading-deg");
-    net->turbulence_norm = fgGetDouble("/environment/turbulence-norm");
+    net->turbulence_norm =
+        fgGetDouble("/environment/turbulence/magnitude-norm");
 
     // cur_fdm_state->get_ground_elev_ft() is what we want ... this
     // reports the altitude of the aircraft.
@@ -338,7 +339,7 @@ void FGNetCtrls2Props( FGNetCtrls *net, bool net_byte_order ) {
     node = fgGetNode( "/environment", true );
     node->setDoubleValue( "wind-speed-kt", net->wind_speed_kt );
     node->setDoubleValue( "wind-from-heading-deg", net->wind_dir_deg );
-    node->setDoubleValue( "turbulence-norm", net->turbulence_norm );
+    node->setDoubleValue( "turbulence/magnitude-norm", net->turbulence_norm );
     node->setBoolValue( "magnetic-variation-deg", net->magvar );
 
     // ground elevation ???