From 61f2b98e8fc7da04981690ad2b7a810b724da252 Mon Sep 17 00:00:00 2001 From: Torsten Dreyer Date: Tue, 31 May 2011 15:28:32 +0200 Subject: [PATCH] Compute gravitational acceleration Compute gravitational acceleration based on the formula of Somigliana corrected for altitude and provide the value in property /environment/gravitational-acceleration-mps2 --- projects/VC90/FlightGear/FlightGear.vcproj | 8 ++ src/Environment/CMakeLists.txt | 1 + src/Environment/Makefile.am | 3 +- src/Environment/environment_mgr.cxx | 16 +++- src/Environment/environment_mgr.hxx | 2 +- src/Environment/gravity.cxx | 89 ++++++++++++++++++++++ src/Environment/gravity.hxx | 43 +++++++++++ 7 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 src/Environment/gravity.cxx create mode 100644 src/Environment/gravity.hxx diff --git a/projects/VC90/FlightGear/FlightGear.vcproj b/projects/VC90/FlightGear/FlightGear.vcproj index 8d70c4028..98fde43d6 100644 --- a/projects/VC90/FlightGear/FlightGear.vcproj +++ b/projects/VC90/FlightGear/FlightGear.vcproj @@ -3437,6 +3437,14 @@ RelativePath="..\..\..\src\Environment\presets.hxx" > + + + + Init(); + // FIXME: is this really part of the environment_mgr? // Initialize the longitude, latitude and altitude to the initial position // of the aircraft so that the atmospheric properties (pressure, temperature // and density) can be initialized accordingly. - _altitudeNode->setDoubleValue(fgGetDouble("/sim/presets/altitude-ft")); + _altitude_n->setDoubleValue(fgGetDouble("/sim/presets/altitude-ft")); _longitude_n->setDoubleValue(fgGetDouble("/sim/presets/longitude-deg")); _latitude_n->setDoubleValue(fgGetDouble("/sim/presets/latitude-deg")); } @@ -201,7 +203,7 @@ FGEnvironmentMgr::update (double dt) { SGSubsystemGroup::update(dt); - _environment->set_elevation_ft( _altitudeNode->getDoubleValue() ); + _environment->set_elevation_ft( _altitude_n->getDoubleValue() ); simgear::Particles::setWindFrom( _environment->get_wind_from_heading_deg(), _environment->get_wind_speed_kt() ); @@ -210,6 +212,14 @@ FGEnvironmentMgr::update (double dt) fgClouds->set_update_event( fgClouds->get_update_event()+1 ); } + + fgSetDouble( "/environment/gravitational-acceleration-mps2", + Environment::Gravity::instance()->getGravity(SGGeod::fromDegFt( + _longitude_n->getDoubleValue(), + _latitude_n->getDoubleValue(), + _altitude_n->getDoubleValue() + ))); + _positionTimeToLive -= dt; if( _positionTimeToLive <= 0.0 ) { diff --git a/src/Environment/environment_mgr.hxx b/src/Environment/environment_mgr.hxx index 67d929ec8..18b1668bc 100644 --- a/src/Environment/environment_mgr.hxx +++ b/src/Environment/environment_mgr.hxx @@ -95,7 +95,7 @@ private: FGEnvironment * _environment; // always the same, for now FGClouds *fgClouds; bool _cloudLayersDirty; - SGPropertyNode_ptr _altitudeNode; + SGPropertyNode_ptr _altitude_n; SGPropertyNode_ptr _longitude_n; SGPropertyNode_ptr _latitude_n; double _positionTimeToLive; diff --git a/src/Environment/gravity.cxx b/src/Environment/gravity.cxx new file mode 100644 index 000000000..cfeec7b04 --- /dev/null +++ b/src/Environment/gravity.cxx @@ -0,0 +1,89 @@ +// gravity.cxx -- interface for earth gravitational model +// +// Written by Torsten Dreyer, June 2011 +// +// Copyright (C) 2011 Torsten Dreyer - torsten (at) t3r _dot_ de +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// + +#include "gravity.hxx" + +#include + +namespace Environment { + +/* +http://de.wikipedia.org/wiki/Normalschwereformel +*/ +class Somigliana : public Gravity { +public: + Somigliana(); + virtual ~Somigliana(); + virtual double getGravity( const SGGeod & position ) const; +}; + +Somigliana::Somigliana() +{ +} + +Somigliana::~Somigliana() +{ +} +#include + +double Somigliana::getGravity( const SGGeod & position ) const +{ +// Geodetic Reference System 1980 parameter +#define A 6378137.0 // equatorial radius of earth +#define B 6356752.3141 // semiminor axis +#define AGA (A*9.7803267715) // A times normal gravity at equator +#define BGB (B*9.8321863685) // B times normal gravity at pole + // forumla of Somigliana + double cosphi = ::cos(position.getLatitudeRad()); + double cos2phi = cosphi*cosphi; + double sinphi = ::sin(position.getLatitudeRad()); + double sin2phi = sinphi*sinphi; + double g0 = (AGA * cos2phi + BGB * sin2phi) / sqrt( A*A*cos2phi+B*B*sin2phi ); + + static const double k1 = 3.15704e-7; + static const double k2 = 2.10269e-9; + static const double k3 = 7.37452e-14; + + double h = position.getElevationM(); + + return g0*(1-(k1-k2*sin2phi)*h+k3*h*h); +} + +static Somigliana _somigliana; + +/* --------------------- Gravity implementation --------------------- */ +Gravity * Gravity::_instance = NULL; + +Gravity::~Gravity() +{ +} + +//double Gravity::getGravity( const SGGeoc & position ) = 0; + +const Gravity * Gravity::instance() +{ + if( _instance == NULL ) + _instance = &_somigliana; + + return _instance; +} + +} // namespace diff --git a/src/Environment/gravity.hxx b/src/Environment/gravity.hxx new file mode 100644 index 000000000..d99ca1867 --- /dev/null +++ b/src/Environment/gravity.hxx @@ -0,0 +1,43 @@ +// gravity.hxx -- interface for earth gravitational model +// +// Written by Torsten Dreyer, June 2011 +// +// Copyright (C) 2011 Torsten Dreyer - torsten (at) t3r _dot_ de +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// + +#ifndef __GRAVITY_HXX +#define __GRAVITY_HXX + +#include + +namespace Environment { + +class Gravity +{ +public: + virtual ~Gravity(); + virtual double getGravity( const SGGeod & position ) const = 0; + + const static Gravity * instance(); + +private: + static Gravity * _instance; + +}; + +} // namespace +#endif // __GRAVITY_HXX -- 2.39.5