Eberly's spherical interpolation code. This
stops our dependancy on the (ugly) voronoi
code and simplyfies the code structure a lot.
+07.05.2000 Tony Peden Added functionality to get the weather data
+ on 'the bus'
+18.05.2000 Christian Mayer Minor clean-ups. Changed the code to use
+ FGWeatherUtils.h for unit conversion
*****************************************************************************/
/****************************************************************************/
/****************************************************************************/
#include <simgear/compiler.h>
#include <simgear/constants.h>
-#include <simgear/misc/fgpath.hxx>
#include <Aircraft/aircraft.hxx>
#include "FGWeatherParse.h"
+#include "FGWeatherUtils.h"
+
/****************************************************************************/
/********************************** CODE ************************************/
/****************************************************************************/
void FGLocalWeatherDatabase::init( const WeatherPrecision visibility,
const DatabaseWorkingType type,
- const string& root )
+ const string &root )
{
cerr << "Initializing FGLocalWeatherDatabase\n";
cerr << "-----------------------------------\n";
{
FGWeatherParse *parsed_data = new FGWeatherParse();
- FGPath file( root );
- file.append( "Weather" );
- file.append( "current.txt.gz" );
- parsed_data->input( file.c_str() );
+ parsed_data->input( "weather/current.gz" );
unsigned int n = parsed_data->stored_stations();
sgVec2 *p = new sgVec2 [n];
void fgUpdateWeatherDatabase(void)
{
sgVec3 position;
- sgVec3 wind;
+ sgVec3 wind;
+
+
+ sgSetVec3(position,
+ current_aircraft.fdm_state->get_Latitude(),
+ current_aircraft.fdm_state->get_Longitude(),
+ current_aircraft.fdm_state->get_Altitude() * FEET_TO_METER);
-
- sgSetVec3(position,
- current_aircraft.fdm_state->get_Latitude(),
- current_aircraft.fdm_state->get_Longitude(),
- current_aircraft.fdm_state->get_Altitude() * FEET_TO_METER);
-
WeatherDatabase->update( position );
-
- #define rho0 1.293 /*for air in normal altitudes*/
- #define PATOPSF 0.02089 // Pascals to psf
- #define KTOR 1.8 // Kelvin to degree Rankine
- #define KGMTOSGF 0.0019403 // kg/m^3 to slug/ft^3
-
-
- FGPhysicalProperty my_value = WeatherDatabase->get(position);
- current_aircraft.fdm_state->set_Static_temperature(my_value.Temperature*KTOR);
- current_aircraft.fdm_state->set_Static_pressure(my_value.AirPressure*PATOPSF);
- float density=rho0 * 273.15 * my_value.AirPressure / (101300 *my_value.Temperature )*KGMTOSGF;
- current_aircraft.fdm_state->set_Density(density*KGMTOSGF);
-
-#define KPHTOFPS 0.9113 //km/hr to ft/s
+
+ // get the data on 'the bus' for the FDM
+
+ FGPhysicalProperty porperty = WeatherDatabase->get(position);
+
+ current_aircraft.fdm_state->set_Static_temperature( Kelvin2Rankine(porperty.Temperature) );
+ current_aircraft.fdm_state->set_Static_pressure( Pascal2psf(porperty.AirPressure) );
+
+ current_aircraft.fdm_state->set_Density( SIdensity2JSBsim( Density(porperty.AirPressure, porperty.Temperature) ) );
+
#define MSTOFPS 3.2808 //m/s to ft/s
- current_aircraft.fdm_state->set_Velocities_Local_Airmass(my_value.Wind[1]*KPHTOFPS,
- my_value.Wind[0]*KPHTOFPS,
- my_value.Wind[2]*KPHTOFPS);
-
+ current_aircraft.fdm_state->set_Velocities_Local_Airmass(porperty.Wind[1]*MSTOFPS,
+ porperty.Wind[0]*MSTOFPS,
+ porperty.Wind[2]*MSTOFPS);
+
}
and lots of wee code cleaning
17.01.2000 Christian Mayer Added conversion routines make it easier for
JSBsim to use the weather database.
+18.05.2000 Christian Mayer Added function for geting the density when
+ temperature and pressure are given
*****************************************************************************/
/****************************************************************************/
/* dp: dew point in °C */
/* wb: approximate wetbulp in °C */
/* */
-/* NOTE: Pascal is the SI unit for preasure and is defined as Pa = N/m^2 */
+/* NOTE: Pascal is the SI unit for pressure and is defined as Pa = N/m^2 */
/* 1 mbar = 1 hPa = 100 Pa */
/* NOTE: °C isn't a SI unit, so I should use °K instead. But as all */
/* formulas are given in °C and the weather database only uses */
}
+// Assume that we've got an ideal gas in normal altitudes
+inline WeatherPrecision Density(const WeatherPrecision AirPressure, const WeatherPrecision Temperature )
+{
+ const float rho0 = 1.293; /*density for air in normal altitudes at 0°C and 1013 mbar*/
+
+ return rho0 * 273.15 * AirPressure / (101300.0 * Temperature);
+}
+
inline WeatherPrecision Celsius (const WeatherPrecision celsius)
{
- return celsius + 273.16; //Kelvin
+ return celsius + 273.15; //Kelvin
}
inline WeatherPrecision Fahrenheit (const WeatherPrecision fahrenheit)
{
- return (fahrenheit * 9.0 / 5.0) + 32.0 + 273.16; //Kelvin
+ return (fahrenheit * 9.0 / 5.0) + 32.0 + 273.15; //Kelvin
}
inline WeatherPrecision Kelvin2Celsius (const WeatherPrecision kelvin)
{
- return kelvin - 273.16; //Celsius
+ return kelvin - 273.15; //Celsius
}
inline WeatherPrecision Kelvin2Fahrenheit (const WeatherPrecision kelvin)
{
- return ((kelvin - 273.16) * 9.0 / 5.0) + 32.0; //Fahrenheit
+ return ((kelvin - 273.15) * 9.0 / 5.0) + 32.0; //Fahrenheit
}
inline WeatherPrecision Celsius2Fahrenheit (const WeatherPrecision celsius)