Remove the old WeatherCM module.
This commit is contained in:
parent
74ae756473
commit
25290c4467
48 changed files with 10 additions and 5966 deletions
19
configure.ac
19
configure.ac
|
@ -70,18 +70,6 @@ fi
|
||||||
AM_CONDITIONAL(ENABLE_MPLAYER_AS, test "x$with_multiplayer" != "xno")
|
AM_CONDITIONAL(ENABLE_MPLAYER_AS, test "x$with_multiplayer" != "xno")
|
||||||
|
|
||||||
|
|
||||||
# Specify if we want to use WeatherCM instead of FGEnvironment.
|
|
||||||
# default to with_weathercm=no
|
|
||||||
AC_ARG_WITH(weathercm, [ --with-weathercm Use WeatherCM instead of FGEnvironment])
|
|
||||||
if test "x$with_weathercm" = "xyes" ; then
|
|
||||||
echo "Building with WeatherCM"
|
|
||||||
AC_DEFINE([FG_WEATHERCM], 1,
|
|
||||||
[Define to build with Christian Mayer's weather code])
|
|
||||||
else
|
|
||||||
echo "Building with FGEnvironment"
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(ENABLE_WEATHERCM, test "x$with_weathercm" = "xyes")
|
|
||||||
|
|
||||||
dnl Thread related checks
|
dnl Thread related checks
|
||||||
AC_ARG_WITH(threads, [ --with-threads Include tile loading threads [default=no]])
|
AC_ARG_WITH(threads, [ --with-threads Include tile loading threads [default=no]])
|
||||||
if test "x$with_threads" = "xyes"; then
|
if test "x$with_threads" = "xyes"; then
|
||||||
|
@ -522,7 +510,6 @@ AC_CONFIG_FILES([ \
|
||||||
src/Sound/Makefile \
|
src/Sound/Makefile \
|
||||||
src/Systems/Makefile \
|
src/Systems/Makefile \
|
||||||
src/Time/Makefile \
|
src/Time/Makefile \
|
||||||
src/WeatherCM/Makefile \
|
|
||||||
tests/Makefile \
|
tests/Makefile \
|
||||||
utils/Makefile \
|
utils/Makefile \
|
||||||
utils/TerraSync/Makefile \
|
utils/TerraSync/Makefile \
|
||||||
|
@ -548,12 +535,6 @@ fi
|
||||||
echo -n "Automake version: "
|
echo -n "Automake version: "
|
||||||
automake --version | head -1
|
automake --version | head -1
|
||||||
|
|
||||||
if test "x$with_weathercm" != "x"; then
|
|
||||||
echo "WeatherCM instead of FGEnvironment: $with_weathercm"
|
|
||||||
else
|
|
||||||
echo "Using FGEnvironment"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$with_multiplayer" != "xno"; then
|
if test "x$with_multiplayer" != "xno"; then
|
||||||
echo "Building with multiplayer support"
|
echo "Building with multiplayer support"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -34,12 +34,8 @@
|
||||||
# include <dirent.h> // for directory reading
|
# include <dirent.h> // for directory reading
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
# include <WeatherCM/FGLocalWeatherDatabase.h>
|
|
||||||
#else
|
|
||||||
#include <Environment/environment_mgr.hxx>
|
#include <Environment/environment_mgr.hxx>
|
||||||
#include <Environment/environment.hxx>
|
#include <Environment/environment.hxx>
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "AIMgr.hxx"
|
#include "AIMgr.hxx"
|
||||||
#include "AILocalTraffic.hxx"
|
#include "AILocalTraffic.hxx"
|
||||||
|
@ -379,19 +375,10 @@ void FGAIMgr::GenerateSimpleAirportTraffic(string ident, double min_dist) {
|
||||||
|
|
||||||
// Check that the visibility is OK for IFR operation.
|
// Check that the visibility is OK for IFR operation.
|
||||||
double visibility;
|
double visibility;
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
//sgVec3 position = { aptpos.lat(), aptpos.lon(), aptpos.elev() };
|
|
||||||
//FGPhysicalProperty stationweather = WeatherDatabase->get(position);
|
|
||||||
#else
|
|
||||||
FGEnvironment stationweather =
|
FGEnvironment stationweather =
|
||||||
((FGEnvironmentMgr *)globals->get_subsystem("environment"))
|
((FGEnvironmentMgr *)globals->get_subsystem("environment"))
|
||||||
->getEnvironment(aptpos.lat(), aptpos.lon(), aptpos.elev()); // TODO - check whether this should take ft or m for elev.
|
->getEnvironment(aptpos.lat(), aptpos.lon(), aptpos.elev()); // TODO - check whether this should take ft or m for elev.
|
||||||
#endif
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
visibility = fgGetDouble("/environment/visibility-m");
|
|
||||||
#else
|
|
||||||
visibility = stationweather.get_visibility_m();
|
visibility = stationweather.get_visibility_m();
|
||||||
#endif
|
|
||||||
// Technically we can do VFR down to 1 mile (1600m) but that's pretty murky!
|
// Technically we can do VFR down to 1 mile (1600m) but that's pretty murky!
|
||||||
//cout << "vis = " << visibility << '\n';
|
//cout << "vis = " << visibility << '\n';
|
||||||
if(visibility < 3000) return;
|
if(visibility < 3000) return;
|
||||||
|
|
|
@ -28,12 +28,8 @@
|
||||||
#include <simgear/math/polar3d.hxx>
|
#include <simgear/math/polar3d.hxx>
|
||||||
#include <simgear/misc/sg_path.hxx>
|
#include <simgear/misc/sg_path.hxx>
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
# include <WeatherCM/FGLocalWeatherDatabase.h>
|
|
||||||
#else
|
|
||||||
#include <Environment/environment_mgr.hxx>
|
#include <Environment/environment_mgr.hxx>
|
||||||
#include <Environment/environment.hxx>
|
#include <Environment/environment.hxx>
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include <GUI/gui.h>
|
#include <GUI/gui.h>
|
||||||
|
@ -555,37 +551,11 @@ double FGApproach::round_alt( const bool hl, double alt ) {
|
||||||
void FGApproach::get_active_runway() {
|
void FGApproach::get_active_runway() {
|
||||||
//cout << "Entering FGApproach::get_active_runway()\n";
|
//cout << "Entering FGApproach::get_active_runway()\n";
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
sgVec3 position = { lat, lon, elev };
|
|
||||||
FGPhysicalProperty stationweather = WeatherDatabase->get(position);
|
|
||||||
#else
|
|
||||||
FGEnvironment stationweather =
|
FGEnvironment stationweather =
|
||||||
((FGEnvironmentMgr *)globals->get_subsystem("environment"))
|
((FGEnvironmentMgr *)globals->get_subsystem("environment"))
|
||||||
->getEnvironment(lat, lon, elev);
|
->getEnvironment(lat, lon, elev);
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
//Set the heading to into the wind
|
|
||||||
double wind_x = stationweather.Wind[0];
|
|
||||||
double wind_y = stationweather.Wind[1];
|
|
||||||
|
|
||||||
double speed = sqrt( wind_x*wind_x + wind_y*wind_y ) * SG_METER_TO_NM / (60.0*60.0);
|
|
||||||
double hdg;
|
|
||||||
|
|
||||||
//If no wind use 270degrees
|
|
||||||
if(speed == 0) {
|
|
||||||
hdg = 270;
|
|
||||||
} else {
|
|
||||||
// //normalize the wind to get the direction
|
|
||||||
//wind_x /= speed; wind_y /= speed;
|
|
||||||
|
|
||||||
hdg = - atan2 ( wind_x, wind_y ) * SG_RADIANS_TO_DEGREES ;
|
|
||||||
if (hdg < 0.0)
|
|
||||||
hdg += 360.0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
double hdg = stationweather.get_wind_from_heading_deg();
|
double hdg = stationweather.get_wind_from_heading_deg();
|
||||||
#endif
|
|
||||||
|
|
||||||
FGRunway runway;
|
FGRunway runway;
|
||||||
if ( globals->get_runways()->search( ident, int(hdg), &runway) ) {
|
if ( globals->get_runways()->search( ident, int(hdg), &runway) ) {
|
||||||
|
|
|
@ -36,12 +36,8 @@ SG_USING_STD(cout);
|
||||||
|
|
||||||
#include <simgear/misc/sg_path.hxx>
|
#include <simgear/misc/sg_path.hxx>
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
# include <WeatherCM/FGLocalWeatherDatabase.h>
|
|
||||||
#else
|
|
||||||
#include <Environment/environment_mgr.hxx>
|
#include <Environment/environment_mgr.hxx>
|
||||||
#include <Environment/environment.hxx>
|
#include <Environment/environment.hxx>
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <Main/fg_props.hxx>
|
#include <Main/fg_props.hxx>
|
||||||
#include <Main/globals.hxx>
|
#include <Main/globals.hxx>
|
||||||
|
@ -102,14 +98,9 @@ void FGATIS::UpdateTransmission() {
|
||||||
int hours;
|
int hours;
|
||||||
// int minutes;
|
// int minutes;
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
sgVec3 position = { lat, lon, elev };
|
|
||||||
FGPhysicalProperty stationweather = WeatherDatabase->get(position);
|
|
||||||
#else
|
|
||||||
FGEnvironment stationweather =
|
FGEnvironment stationweather =
|
||||||
((FGEnvironmentMgr *)globals->get_subsystem("environment"))
|
((FGEnvironmentMgr *)globals->get_subsystem("environment"))
|
||||||
->getEnvironment(lat, lon, elev);
|
->getEnvironment(lat, lon, elev);
|
||||||
#endif
|
|
||||||
|
|
||||||
transmission = "";
|
transmission = "";
|
||||||
|
|
||||||
|
@ -139,11 +130,7 @@ void FGATIS::UpdateTransmission() {
|
||||||
|
|
||||||
// Get the temperature
|
// Get the temperature
|
||||||
int temp;
|
int temp;
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
temp = int(stationweather.Temperature - 273.15);
|
|
||||||
#else
|
|
||||||
temp = (int)stationweather.get_temperature_degc();
|
temp = (int)stationweather.get_temperature_degc();
|
||||||
#endif
|
|
||||||
|
|
||||||
// HACK ALERT - at the moment the new environment subsystem returns bogus temperatures
|
// HACK ALERT - at the moment the new environment subsystem returns bogus temperatures
|
||||||
// FIXME - take out this hack when this gets fixed upstream
|
// FIXME - take out this hack when this gets fixed upstream
|
||||||
|
@ -162,11 +149,7 @@ void FGATIS::UpdateTransmission() {
|
||||||
transmission += " degrees_Celsius";
|
transmission += " degrees_Celsius";
|
||||||
|
|
||||||
// Get the visibility
|
// Get the visibility
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
visibility = fgGetDouble("/environment/visibility-m");
|
|
||||||
#else
|
|
||||||
visibility = stationweather.get_visibility_m();
|
visibility = stationweather.get_visibility_m();
|
||||||
#endif
|
|
||||||
sprintf(buf, "%i", int(visibility/1600));
|
sprintf(buf, "%i", int(visibility/1600));
|
||||||
transmission += " / Visibility ";
|
transmission += " / Visibility ";
|
||||||
tempstr1 = buf;
|
tempstr1 = buf;
|
||||||
|
@ -198,48 +181,9 @@ void FGATIS::UpdateTransmission() {
|
||||||
|
|
||||||
// Get the pressure / altimeter
|
// Get the pressure / altimeter
|
||||||
|
|
||||||
#ifndef FG_WEATHERCM
|
|
||||||
double altimeter = stationweather.get_pressure_sea_level_inhg();
|
|
||||||
sprintf(buf, "%.2f", altimeter);
|
|
||||||
transmission += " / Altimeter ";
|
|
||||||
tempstr1 = buf;
|
|
||||||
transmission += ConvertNumToSpokenDigits(tempstr1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Based on the airport-id and wind get the active runway
|
// Based on the airport-id and wind get the active runway
|
||||||
//FGRunway *r;
|
//FGRunway *r;
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
//Set the heading to into the wind
|
|
||||||
double wind_x = stationweather.Wind[0];
|
|
||||||
double wind_y = stationweather.Wind[1];
|
|
||||||
|
|
||||||
double speed = sqrt( wind_x*wind_x + wind_y*wind_y ) * SG_METER_TO_NM / (60.0*60.0);
|
|
||||||
double hdg;
|
|
||||||
|
|
||||||
//If no wind use 270degrees
|
|
||||||
if(speed == 0) {
|
|
||||||
hdg = 270;
|
|
||||||
transmission += " / Winds_light_and_variable";
|
|
||||||
} else {
|
|
||||||
// //normalize the wind to get the direction
|
|
||||||
//wind_x /= speed; wind_y /= speed;
|
|
||||||
|
|
||||||
hdg = - atan2 ( wind_x, wind_y ) * SG_RADIANS_TO_DEGREES ;
|
|
||||||
if (hdg < 0.0)
|
|
||||||
hdg += 360.0;
|
|
||||||
|
|
||||||
//add a description of the wind to the transmission
|
|
||||||
char buf5[10];
|
|
||||||
char buf6[10];
|
|
||||||
sprintf(buf5, "%i", int(speed));
|
|
||||||
sprintf(buf6, "%i", int(hdg));
|
|
||||||
tempstr1 = buf5;
|
|
||||||
tempstr2 = buf6;
|
|
||||||
transmission = transmission + " / Winds " + ConvertNumToSpokenDigits(tempstr1) + " knots from "
|
|
||||||
+ ConvertNumToSpokenDigits(tempstr2) + " degrees";
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
double speed = stationweather.get_wind_speed_kt();
|
double speed = stationweather.get_wind_speed_kt();
|
||||||
double hdg = stationweather.get_wind_from_heading_deg();
|
double hdg = stationweather.get_wind_from_heading_deg();
|
||||||
if (speed == 0) {
|
if (speed == 0) {
|
||||||
|
@ -257,7 +201,6 @@ void FGATIS::UpdateTransmission() {
|
||||||
transmission = transmission + " / Winds " + ConvertNumToSpokenDigits(tempstr1) + " knots from "
|
transmission = transmission + " / Winds " + ConvertNumToSpokenDigits(tempstr1) + " knots from "
|
||||||
+ ConvertNumToSpokenDigits(tempstr2) + " degrees";
|
+ ConvertNumToSpokenDigits(tempstr2) + " degrees";
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
string rwy_no = globals->get_runways()->search(ident, int(hdg));
|
string rwy_no = globals->get_runways()->search(ident, int(hdg));
|
||||||
if(rwy_no != "NN") {
|
if(rwy_no != "NN") {
|
||||||
|
|
|
@ -45,9 +45,6 @@ HISTORY
|
||||||
#include <simgear/constants.h>
|
#include <simgear/constants.h>
|
||||||
|
|
||||||
#include <Aircraft/aircraft.hxx>
|
#include <Aircraft/aircraft.hxx>
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
# include <WeatherCM/FGLocalWeatherDatabase.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "BalloonSim.h"
|
#include "BalloonSim.h"
|
||||||
|
|
||||||
|
@ -171,35 +168,10 @@ void balloon::update()
|
||||||
/* later, but currently was my main concern to get it going... */
|
/* later, but currently was my main concern to get it going... */
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
sgVec3 v;
|
|
||||||
|
|
||||||
FGPhysicalProperty wdbpos = WeatherDatabase->get(position);
|
|
||||||
|
|
||||||
//get the current wind velocity and store it in v
|
|
||||||
//Point3D temp = wdbpos.Wind;
|
|
||||||
//sgSetVec3(v, temp.x(), temp.y(), temp.z());
|
|
||||||
sgCopyVec3(v, wdbpos.Wind );
|
|
||||||
|
|
||||||
sgSubVec3(v, velocity);
|
|
||||||
float speed = sgLengthVec3(v);
|
|
||||||
|
|
||||||
// calculate the density of the gas inside
|
|
||||||
double rho = wdbpos.AirPressure / (287.14 * T);
|
|
||||||
|
|
||||||
// calculate the mass of the air
|
|
||||||
double mAir = rho * balloon_envelope_volume;
|
|
||||||
|
|
||||||
// loss of energy by cooling down:
|
|
||||||
float k = 1.0 / (1.0/4.8 + 1.0/(4.8+3.4*speed) + l_of_the_envelope/lambda);
|
|
||||||
float Q = k * balloon_envelope_area * (dt/3600.0) * (wdbpos.Temperature - T); //(dt/3600.0) = time since last call in hours
|
|
||||||
|
|
||||||
#else
|
|
||||||
// I realy don't think there is a solution for this without WeatherCM
|
// I realy don't think there is a solution for this without WeatherCM
|
||||||
// but this is a hack, and it's working -- EMH
|
// but this is a hack, and it's working -- EMH
|
||||||
double mAir = 0;
|
double mAir = 0;
|
||||||
float Q = 0;
|
float Q = 0;
|
||||||
#endif
|
|
||||||
|
|
||||||
// gain of energy by heating:
|
// gain of energy by heating:
|
||||||
if (fuel_left > 0.0) //but only with some fuel left ;-)
|
if (fuel_left > 0.0) //but only with some fuel left ;-)
|
||||||
|
@ -228,10 +200,6 @@ void balloon::update()
|
||||||
sgVec3 fTotal, fFriction, fLift;
|
sgVec3 fTotal, fFriction, fLift;
|
||||||
|
|
||||||
sgScaleVec3(fTotal, gravity_vector, mTotal);
|
sgScaleVec3(fTotal, gravity_vector, mTotal);
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
sgScaleVec3(fFriction, v, cw_envelope * wind_facing_area_of_balloon * WeatherDatabase->getAirDensity(position) * speed / 2.0); //wind resistance
|
|
||||||
sgScaleVec3(fLift, gravity_vector, -balloon_envelope_volume * wdbpos.AirPressure / (287.14 * wdbpos.Temperature));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
sgAddVec3(fTotal, fLift);
|
sgAddVec3(fTotal, fLift);
|
||||||
sgAddVec3(fTotal, fFriction);
|
sgAddVec3(fTotal, fFriction);
|
||||||
|
|
|
@ -250,9 +250,6 @@ void FGJSBsim::init()
|
||||||
// Explicitly call the superclass's
|
// Explicitly call the superclass's
|
||||||
// init method first.
|
// init method first.
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
Atmosphere->UseInternal();
|
|
||||||
#else
|
|
||||||
if (fgGetBool("/environment/params/control-fdm-atmosphere")) {
|
if (fgGetBool("/environment/params/control-fdm-atmosphere")) {
|
||||||
Atmosphere->UseExternal();
|
Atmosphere->UseExternal();
|
||||||
Atmosphere->SetExTemperature(
|
Atmosphere->SetExTemperature(
|
||||||
|
@ -269,7 +266,6 @@ void FGJSBsim::init()
|
||||||
} else {
|
} else {
|
||||||
Atmosphere->UseInternal();
|
Atmosphere->UseInternal();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
fgic->SetVnorthFpsIC( wind_from_north->getDoubleValue() );
|
fgic->SetVnorthFpsIC( wind_from_north->getDoubleValue() );
|
||||||
fgic->SetVeastFpsIC( wind_from_east->getDoubleValue() );
|
fgic->SetVeastFpsIC( wind_from_east->getDoubleValue() );
|
||||||
|
|
|
@ -1,9 +1,3 @@
|
||||||
if ENABLE_WEATHERCM
|
|
||||||
WEATHER_LIBS = $(top_builddir)/src/WeatherCM/libWeatherCM.a
|
|
||||||
else
|
|
||||||
WEATHER_LIBS = $(top_builddir)/src/Environment/libEnvironment.a
|
|
||||||
endif
|
|
||||||
|
|
||||||
if ENABLE_MPLAYER_AS
|
if ENABLE_MPLAYER_AS
|
||||||
MPLAYER_LIBS = $(top_builddir)/src/MultiPlayer/libMultiPlayer.a
|
MPLAYER_LIBS = $(top_builddir)/src/MultiPlayer/libMultiPlayer.a
|
||||||
else
|
else
|
||||||
|
@ -82,7 +76,7 @@ fgfs_LDADD = \
|
||||||
$(top_builddir)/src/Replay/libReplay.a \
|
$(top_builddir)/src/Replay/libReplay.a \
|
||||||
$(top_builddir)/src/Systems/libSystems.a \
|
$(top_builddir)/src/Systems/libSystems.a \
|
||||||
$(top_builddir)/src/Time/libTime.a \
|
$(top_builddir)/src/Time/libTime.a \
|
||||||
$(WEATHER_LIBS) \
|
$(top_builddir)/src/Environment/libEnvironment.a \
|
||||||
$(CLOUD3D_LIBS) \
|
$(CLOUD3D_LIBS) \
|
||||||
-lsgroute -lsgsky -lsgsound -lsgephem -lsgmaterial -lsgtgdb -lsgmodel \
|
-lsgroute -lsgsky -lsgsound -lsgephem -lsgmaterial -lsgtgdb -lsgmodel \
|
||||||
-lsgtiming -lsgio -lsgscreen -lsgmath -lsgbucket -lsgprops -lsgdebug \
|
-lsgtiming -lsgio -lsgscreen -lsgmath -lsgbucket -lsgprops -lsgdebug \
|
||||||
|
|
|
@ -119,11 +119,7 @@
|
||||||
#include <MultiPlayer/multiplayrxmgr.hxx>
|
#include <MultiPlayer/multiplayrxmgr.hxx>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
# include <WeatherCM/FGLocalWeatherDatabase.h>
|
|
||||||
#else
|
|
||||||
#include <Environment/environment_mgr.hxx>
|
#include <Environment/environment_mgr.hxx>
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "fg_init.hxx"
|
#include "fg_init.hxx"
|
||||||
#include "fg_io.hxx"
|
#include "fg_io.hxx"
|
||||||
|
@ -1553,49 +1549,7 @@ bool fgInitSubsystems() {
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Initialize the weather modeling subsystem
|
// Initialize the weather modeling subsystem
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
// Initialize the WeatherDatabase
|
|
||||||
SG_LOG(SG_GENERAL, SG_INFO, "Creating LocalWeatherDatabase");
|
|
||||||
sgVec3 position;
|
|
||||||
sgSetVec3( position, current_aircraft.fdm_state->get_Latitude(),
|
|
||||||
current_aircraft.fdm_state->get_Longitude(),
|
|
||||||
current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER );
|
|
||||||
double init_vis = fgGetDouble("/environment/visibility-m");
|
|
||||||
|
|
||||||
FGLocalWeatherDatabase::DatabaseWorkingType working_type;
|
|
||||||
|
|
||||||
if (!strcmp(fgGetString("/environment/weather/working-type"), "internet"))
|
|
||||||
{
|
|
||||||
working_type = FGLocalWeatherDatabase::use_internet;
|
|
||||||
} else {
|
|
||||||
working_type = FGLocalWeatherDatabase::default_mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( init_vis > 0 ) {
|
|
||||||
FGLocalWeatherDatabase::theFGLocalWeatherDatabase =
|
|
||||||
new FGLocalWeatherDatabase( position,
|
|
||||||
globals->get_fg_root(),
|
|
||||||
working_type,
|
|
||||||
init_vis );
|
|
||||||
} else {
|
|
||||||
FGLocalWeatherDatabase::theFGLocalWeatherDatabase =
|
|
||||||
new FGLocalWeatherDatabase( position,
|
|
||||||
globals->get_fg_root(),
|
|
||||||
working_type );
|
|
||||||
}
|
|
||||||
|
|
||||||
// cout << theFGLocalWeatherDatabase << endl;
|
|
||||||
// cout << "visibility = "
|
|
||||||
// << theFGLocalWeatherDatabase->getWeatherVisibility() << endl;
|
|
||||||
|
|
||||||
WeatherDatabase = FGLocalWeatherDatabase::theFGLocalWeatherDatabase;
|
|
||||||
|
|
||||||
// register the periodic update of the weather
|
|
||||||
globals->get_event_mgr()->add( "weather update",
|
|
||||||
&fgUpdateWeatherDatabase, 30000);
|
|
||||||
#else
|
|
||||||
globals->add_subsystem("environment", new FGEnvironmentMgr);
|
globals->add_subsystem("environment", new FGEnvironmentMgr);
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -37,11 +37,7 @@
|
||||||
#include <Aircraft/aircraft.hxx>
|
#include <Aircraft/aircraft.hxx>
|
||||||
#include <Time/tmp.hxx>
|
#include <Time/tmp.hxx>
|
||||||
#include <FDM/UIUCModel/uiuc_aircraftdir.h>
|
#include <FDM/UIUCModel/uiuc_aircraftdir.h>
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
# include <WeatherCM/FGLocalWeatherDatabase.h>
|
|
||||||
#else
|
|
||||||
#include <Environment/environment.hxx>
|
#include <Environment/environment.hxx>
|
||||||
#endif // FG_WEATHERCM
|
|
||||||
|
|
||||||
#include <GUI/gui.h>
|
#include <GUI/gui.h>
|
||||||
|
|
||||||
|
@ -51,12 +47,6 @@
|
||||||
SG_USING_STD(istream);
|
SG_USING_STD(istream);
|
||||||
SG_USING_STD(ostream);
|
SG_USING_STD(ostream);
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
static double getWindNorth ();
|
|
||||||
static double getWindEast ();
|
|
||||||
static double getWindDown ();
|
|
||||||
#endif // FG_WEATHERCM
|
|
||||||
|
|
||||||
static bool winding_ccw = true; // FIXME: temporary
|
static bool winding_ccw = true; // FIXME: temporary
|
||||||
|
|
||||||
static bool fdm_data_logging = false; // FIXME: temporary
|
static bool fdm_data_logging = false; // FIXME: temporary
|
||||||
|
@ -383,95 +373,6 @@ getHeadingMag ()
|
||||||
return magheading;
|
return magheading;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the current visibility (meters).
|
|
||||||
*/
|
|
||||||
static double
|
|
||||||
getVisibility ()
|
|
||||||
{
|
|
||||||
return WeatherDatabase->getWeatherVisibility();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the current visibility (meters).
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setVisibility (double visibility)
|
|
||||||
{
|
|
||||||
WeatherDatabase->setWeatherVisibility(visibility);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the current wind north velocity (feet/second).
|
|
||||||
*/
|
|
||||||
static double
|
|
||||||
getWindNorth ()
|
|
||||||
{
|
|
||||||
return current_aircraft.fdm_state->get_V_north_airmass();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the current wind north velocity (feet/second).
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setWindNorth (double speed)
|
|
||||||
{
|
|
||||||
current_aircraft.fdm_state
|
|
||||||
->set_Velocities_Local_Airmass(speed, getWindEast(), getWindDown());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the current wind east velocity (feet/second).
|
|
||||||
*/
|
|
||||||
static double
|
|
||||||
getWindEast ()
|
|
||||||
{
|
|
||||||
return current_aircraft.fdm_state->get_V_east_airmass();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the current wind east velocity (feet/second).
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setWindEast (double speed)
|
|
||||||
{
|
|
||||||
SG_LOG(SG_GENERAL, SG_INFO,, "Set wind-east to " << speed );
|
|
||||||
current_aircraft.fdm_state->set_Velocities_Local_Airmass(getWindNorth(),
|
|
||||||
speed,
|
|
||||||
getWindDown());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the current wind down velocity (feet/second).
|
|
||||||
*/
|
|
||||||
static double
|
|
||||||
getWindDown ()
|
|
||||||
{
|
|
||||||
return current_aircraft.fdm_state->get_V_down_airmass();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the current wind down velocity (feet/second).
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setWindDown (double speed)
|
|
||||||
{
|
|
||||||
current_aircraft.fdm_state->set_Velocities_Local_Airmass(getWindNorth(),
|
|
||||||
getWindEast(),
|
|
||||||
speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // FG_WEATHERCM
|
|
||||||
|
|
||||||
static long
|
static long
|
||||||
getWarp ()
|
getWarp ()
|
||||||
{
|
{
|
||||||
|
@ -584,18 +485,6 @@ FGProperties::bind ()
|
||||||
// Orientation
|
// Orientation
|
||||||
fgTie("/orientation/heading-magnetic-deg", getHeadingMag);
|
fgTie("/orientation/heading-magnetic-deg", getHeadingMag);
|
||||||
|
|
||||||
// Environment
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
fgTie("/environment/visibility-m", getVisibility, setVisibility);
|
|
||||||
fgSetArchivable("/environment/visibility-m");
|
|
||||||
fgTie("/environment/wind-from-north-fps", getWindNorth, setWindNorth);
|
|
||||||
fgSetArchivable("/environment/wind-from-north-fps");
|
|
||||||
fgTie("/environment/wind-from-east-fps", getWindEast, setWindEast);
|
|
||||||
fgSetArchivable("/environment/wind-from-east-fps");
|
|
||||||
fgTie("/environment/wind-from-down-fps", getWindDown, setWindDown);
|
|
||||||
fgSetArchivable("/environment/wind-from-down-fps");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fgTie("/environment/magnetic-variation-deg", getMagVar);
|
fgTie("/environment/magnetic-variation-deg", getMagVar);
|
||||||
fgTie("/environment/magnetic-dip-deg", getMagDip);
|
fgTie("/environment/magnetic-dip-deg", getMagDip);
|
||||||
|
|
||||||
|
@ -625,13 +514,6 @@ FGProperties::unbind ()
|
||||||
fgUntie("/orientation/heading-magnetic-deg");
|
fgUntie("/orientation/heading-magnetic-deg");
|
||||||
|
|
||||||
// Environment
|
// Environment
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
fgUntie("/environment/visibility-m");
|
|
||||||
fgUntie("/environment/wind-from-north-fps");
|
|
||||||
fgUntie("/environment/wind-from-east-fps");
|
|
||||||
fgUntie("/environment/wind-from-down-fps");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fgUntie("/environment/magnetic-variation-deg");
|
fgUntie("/environment/magnetic-variation-deg");
|
||||||
fgUntie("/environment/magnetic-dip-deg");
|
fgUntie("/environment/magnetic-dip-deg");
|
||||||
|
|
||||||
|
|
|
@ -119,10 +119,6 @@ glPointParameterfvProc glPointParameterfvPtr = 0;
|
||||||
bool glPointParameterIsSupported = false;
|
bool glPointParameterIsSupported = false;
|
||||||
|
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
# include <WeatherCM/FGLocalWeatherDatabase.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef macintosh
|
#ifdef macintosh
|
||||||
# include <console.h> // -dw- for command line dialog
|
# include <console.h> // -dw- for command line dialog
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -98,18 +98,6 @@ fgSetupWind (double min_hdg, double max_hdg, double speed, double gust)
|
||||||
min_hdg);
|
min_hdg);
|
||||||
fgSetDouble("/environment/config/aloft/entry[2]/wind-speed-kt",
|
fgSetDouble("/environment/config/aloft/entry[2]/wind-speed-kt",
|
||||||
speed);
|
speed);
|
||||||
|
|
||||||
#ifdef FG_WEATHERCM
|
|
||||||
// convert to fps
|
|
||||||
speed *= SG_NM_TO_METER * SG_METER_TO_FEET * (1.0/3600);
|
|
||||||
while (min_hdg > 360)
|
|
||||||
min_hdg -= 360;
|
|
||||||
while (min_hdg <= 0)
|
|
||||||
min_hdg += 360;
|
|
||||||
min_hdg *= SGD_DEGREES_TO_RADIANS;
|
|
||||||
fgSetDouble("/environment/wind-from-north-fps", speed * cos(dir));
|
|
||||||
fgSetDouble("/environment/wind-from-east-fps", speed * sin(dir));
|
|
||||||
#endif // FG_WEATHERCM
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,3 @@
|
||||||
if ENABLE_WEATHERCM
|
|
||||||
WEATHER_DIR = WeatherCM
|
|
||||||
else
|
|
||||||
WEATHER_DIR = Environment
|
|
||||||
endif
|
|
||||||
|
|
||||||
if ENABLE_MPLAYER_AS
|
if ENABLE_MPLAYER_AS
|
||||||
MPLAYER_DIRS = MultiPlayer
|
MPLAYER_DIRS = MultiPlayer
|
||||||
else
|
else
|
||||||
|
@ -18,6 +12,7 @@ SUBDIRS = \
|
||||||
Autopilot \
|
Autopilot \
|
||||||
Cockpit \
|
Cockpit \
|
||||||
Controls \
|
Controls \
|
||||||
|
Environment \
|
||||||
FDM \
|
FDM \
|
||||||
GUI \
|
GUI \
|
||||||
Input \
|
Input \
|
||||||
|
@ -34,5 +29,4 @@ SUBDIRS = \
|
||||||
Sound \
|
Sound \
|
||||||
Systems \
|
Systems \
|
||||||
Time \
|
Time \
|
||||||
$(WEATHER_DIR) \
|
|
||||||
Main
|
Main
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
.deps
|
|
||||||
Makefile
|
|
||||||
Makefile.in
|
|
|
@ -1,49 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGAirPressureItem.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
Called by: FGMicroWeather
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Operator< definition for the item
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGAirPressureItem.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/********************************** CODE ************************************/
|
|
||||||
/****************************************************************************/
|
|
|
@ -1,130 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGAirPressureItem.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Air pressure item that is stored in the micro weather class
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
08.06.1999 Christian Mayer Added international air preasure formula
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
15.12.1999 Christian Mayer changed the air pressure calculation to a much
|
|
||||||
more realistic formula. But as I need for that
|
|
||||||
the temperature I moved the code to
|
|
||||||
FGPhysicalProperties
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGAirPressureItem_H
|
|
||||||
#define FGAirPressureItem_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGAirPressureItem;
|
|
||||||
FGAirPressureItem operator-(const FGAirPressureItem& arg);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/* NOTE: The value stored in 'value' is the air preasure that we'd have at */
|
|
||||||
/* an altitude of 0.0 The correct airpreasure at the stored altitude */
|
|
||||||
/* gets calulated in FGPhyiscalProperties as I need to know the */
|
|
||||||
/* temperatures at the different altitudes for that. */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGAirPressureItem
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
WeatherPrecision value; //that's the airpressure at 0 metres
|
|
||||||
|
|
||||||
protected:
|
|
||||||
public:
|
|
||||||
|
|
||||||
FGAirPressureItem(const WeatherPrecision v) {value = v; }
|
|
||||||
FGAirPressureItem() {value = FG_WEATHER_DEFAULT_AIRPRESSURE;}
|
|
||||||
|
|
||||||
WeatherPrecision getValue() const
|
|
||||||
{
|
|
||||||
return value;
|
|
||||||
};
|
|
||||||
|
|
||||||
void setValue(WeatherPrecision p)
|
|
||||||
{
|
|
||||||
value = p;
|
|
||||||
};
|
|
||||||
|
|
||||||
FGAirPressureItem& operator*=(const WeatherPrecision arg);
|
|
||||||
FGAirPressureItem& operator+=(const FGAirPressureItem& arg);
|
|
||||||
FGAirPressureItem& operator-=(const FGAirPressureItem& arg);
|
|
||||||
|
|
||||||
friend FGAirPressureItem operator-(const FGAirPressureItem& arg);
|
|
||||||
};
|
|
||||||
|
|
||||||
inline FGAirPressureItem& FGAirPressureItem::operator*= (const WeatherPrecision arg)
|
|
||||||
{
|
|
||||||
value *= arg;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGAirPressureItem& FGAirPressureItem::operator+= (const FGAirPressureItem& arg)
|
|
||||||
{
|
|
||||||
value += arg.value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGAirPressureItem& FGAirPressureItem::operator-= (const FGAirPressureItem& arg)
|
|
||||||
{
|
|
||||||
value -= arg.value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGAirPressureItem operator-(const FGAirPressureItem& arg)
|
|
||||||
{
|
|
||||||
return FGAirPressureItem(-arg.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGAirPressureItem_H*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,67 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGCloud.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Header for the cloud class
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGCloud_H
|
|
||||||
#define FGCloud_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGWeatherFeature.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGCloud:FGWeatherFeature
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
protected:
|
|
||||||
public:
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGCloud_H*/
|
|
|
@ -1,51 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGCloudItem.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
Called by: FGMicroWeather
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Operator< definition for the item
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
09.10.1999 Christian Mayer changed CloudItem on Durks request
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGCloudItem.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/********************************** CODE ************************************/
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
|
@ -1,77 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGCloudItem.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Cloud item that is stored in the micro weather class
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
09.10.1999 Christian Mayer changed CloudItem on Durks request
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGCloudItem_H
|
|
||||||
#define FGCloudItem_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGCloudItem
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
WeatherPrecision thickness;
|
|
||||||
WeatherPrecision density;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
public:
|
|
||||||
|
|
||||||
FGCloudItem(const WeatherPrecision t, const WeatherPrecision d) {thickness = t; density = d;}
|
|
||||||
FGCloudItem() {thickness = 0.0; density = 0.0;}
|
|
||||||
|
|
||||||
WeatherPrecision getThickness(void) const { return thickness; }
|
|
||||||
WeatherPrecision getDensity (void) const { return density; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGCloudItem_H*/
|
|
|
@ -1,446 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGLocalWeatherDatabase.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
Called by: main program
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Database for the local weather
|
|
||||||
This database is the only one that gets called from FG
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
14.12.1999 Christian Mayer Changed the internal structure to use Dave
|
|
||||||
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
|
|
||||||
18.07.2001 Christian Mayer Added the posibility to limit the amount of
|
|
||||||
stations for a faster init.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
#include <simgear/constants.h>
|
|
||||||
|
|
||||||
#include <Aircraft/aircraft.hxx>
|
|
||||||
#include <Main/fg_props.hxx>
|
|
||||||
|
|
||||||
#include "FGLocalWeatherDatabase.h"
|
|
||||||
|
|
||||||
#include "FGWeatherParse.h"
|
|
||||||
|
|
||||||
#include "FGWeatherUtils.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/********************************** CODE ************************************/
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
FGLocalWeatherDatabase* FGLocalWeatherDatabase::theFGLocalWeatherDatabase = 0;
|
|
||||||
FGLocalWeatherDatabase *WeatherDatabase;
|
|
||||||
|
|
||||||
void FGLocalWeatherDatabase::init( const WeatherPrecision visibility,
|
|
||||||
const DatabaseWorkingType type,
|
|
||||||
const string &root )
|
|
||||||
{
|
|
||||||
cerr << "Initializing FGLocalWeatherDatabase\n";
|
|
||||||
cerr << "-----------------------------------\n";
|
|
||||||
|
|
||||||
if (theFGLocalWeatherDatabase)
|
|
||||||
{
|
|
||||||
cerr << "Error: only one local weather allowed";
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
setWeatherVisibility(visibility);
|
|
||||||
|
|
||||||
DatabaseStatus = type;
|
|
||||||
database_logic = 0; //just get sure...
|
|
||||||
|
|
||||||
Thunderstorm = false;
|
|
||||||
//I don't need to set theThunderstorm as Thunderstorm == false
|
|
||||||
|
|
||||||
switch(DatabaseStatus)
|
|
||||||
{
|
|
||||||
case use_global:
|
|
||||||
{
|
|
||||||
cerr << "Error: there's no global database anymore!\n";
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case use_internet:
|
|
||||||
{
|
|
||||||
FGWeatherParse *parsed_data = new FGWeatherParse();
|
|
||||||
sgVec2 *p;
|
|
||||||
unsigned int *f;
|
|
||||||
string path_to_weather = root + "/weather/current.txt.gz";
|
|
||||||
parsed_data->input( path_to_weather.c_str() );
|
|
||||||
unsigned int n = parsed_data->stored_stations();
|
|
||||||
int m = fgGetInt("/environment/weather/max-stations", -1);
|
|
||||||
|
|
||||||
if ( ( m < 0 ) || ( m > n ) )
|
|
||||||
{
|
|
||||||
m = n;
|
|
||||||
|
|
||||||
p = new sgVec2[n];
|
|
||||||
f = new unsigned int[n];
|
|
||||||
|
|
||||||
// fill the database
|
|
||||||
for (unsigned int i = 0; i < n; i++)
|
|
||||||
{
|
|
||||||
f[i] = i;
|
|
||||||
database_data[i] = parsed_data->getFGPhysicalProperties(i);
|
|
||||||
parsed_data->getPosition(i, p[i]);
|
|
||||||
|
|
||||||
if ( (i%100) == 0)
|
|
||||||
cerr << ".";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ // we have to limit the amount of stations
|
|
||||||
|
|
||||||
//store the "distance" between the station and the current
|
|
||||||
//position. As the distance is calculated from the lat/lon
|
|
||||||
//values it's not worth much - but it's good enough for
|
|
||||||
//comparison
|
|
||||||
map<float, unsigned int> squared_distance;
|
|
||||||
sgVec2 cur_pos;
|
|
||||||
|
|
||||||
cur_pos[0] = cache->last_known_position[0];
|
|
||||||
cur_pos[1] = cache->last_known_position[1];
|
|
||||||
|
|
||||||
unsigned int i;
|
|
||||||
for( i = 0; i < n; i++ )
|
|
||||||
{
|
|
||||||
sgVec2 pos;
|
|
||||||
parsed_data->getPosition(i, pos);
|
|
||||||
squared_distance[sgDistanceSquaredVec2(cur_pos, pos)] = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = new sgVec2 [m];
|
|
||||||
f = new unsigned int[m];
|
|
||||||
|
|
||||||
map<float, unsigned int>::const_iterator ci;
|
|
||||||
ci = squared_distance.begin();
|
|
||||||
|
|
||||||
// fill the database
|
|
||||||
for ( i = 0; i < m; i++ )
|
|
||||||
{
|
|
||||||
f[i] = i;
|
|
||||||
database_data.push_back( parsed_data->getFGPhysicalProperties(ci->second) );
|
|
||||||
parsed_data->getPosition(ci->second, p[i]);
|
|
||||||
|
|
||||||
if ( (i%100) == 0)
|
|
||||||
cerr << ".";
|
|
||||||
|
|
||||||
ci++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// free the memory of the parsed data to ease the required memory
|
|
||||||
// for the very memory consuming spherical interpolation
|
|
||||||
delete parsed_data;
|
|
||||||
|
|
||||||
//and finally init the interpolation
|
|
||||||
cerr << "\nInitialiating Interpolation. (2-3 minutes on a PII-350 for ca. 3500 stations)\n";
|
|
||||||
database_logic = new SphereInterpolate(m, p, f);
|
|
||||||
|
|
||||||
//and free my allocations:
|
|
||||||
delete[] p;
|
|
||||||
delete[] f;
|
|
||||||
cerr << "Finished weather init.\n";
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case distant:
|
|
||||||
cerr << "FGLocalWeatherDatabase error: Distant database isn't implemented yet!\n";
|
|
||||||
cerr << " using random mode instead!\n";
|
|
||||||
case random:
|
|
||||||
case manual:
|
|
||||||
case default_mode:
|
|
||||||
{
|
|
||||||
double x[2] = {0.0, 0.0}; //make an standard weather that's the same at the whole world
|
|
||||||
double y[2] = {0.0, 0.0}; //make an standard weather that's the same at the whole world
|
|
||||||
double z[2] = {1.0, -1.0}; //make an standard weather that's the same at the whole world
|
|
||||||
unsigned int f[2] = {0, 0};
|
|
||||||
database_data.push_back( FGPhysicalProperties() ); // == database_date[0]
|
|
||||||
database_logic = new SphereInterpolate(2,x,y,z,f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
cerr << "FGLocalWeatherDatabase error: Unknown database type specified!\n";
|
|
||||||
};
|
|
||||||
|
|
||||||
cache->latitude_deg = fgGetNode("/position/latitude-deg" );
|
|
||||||
cache->longitude_deg = fgGetNode("/position/longitude-deg");
|
|
||||||
cache->altitude_ft = fgGetNode("/position/altitude-ft" );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGLocalWeatherDatabase::bind()
|
|
||||||
{
|
|
||||||
fgTie("/environment/weather/wind-north-mps", this, &FGLocalWeatherDatabase::get_wind_north);
|
|
||||||
fgTie("/environment/weather/wind-east-mps", this, &FGLocalWeatherDatabase::get_wind_east);
|
|
||||||
fgTie("/environment/weather/wind-up-mps", this, &FGLocalWeatherDatabase::get_wind_up);
|
|
||||||
fgTie("/environment/weather/temperature-K", this, &FGLocalWeatherDatabase::get_temperature);
|
|
||||||
fgTie("/environment/weather/air-pressure-Pa", this, &FGLocalWeatherDatabase::get_air_pressure);
|
|
||||||
fgTie("/environment/weather/vapor-pressure-Pa", this, &FGLocalWeatherDatabase::get_vapor_pressure);
|
|
||||||
fgTie("/environment/weather/air-density", this, &FGLocalWeatherDatabase::get_air_density);
|
|
||||||
|
|
||||||
|
|
||||||
SGPropertyNode * station_nodes = fgGetNode("/environment/weather");
|
|
||||||
if (station_nodes == 0) {
|
|
||||||
cerr << "No weatherstations (/environment/weather)!!";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
for(vector<FGPhysicalProperties>::iterator it = database_data.begin(); it != database_data.end(); it++)
|
|
||||||
{
|
|
||||||
SGPropertyNode * station = station_nodes->getNode("station", index, true);
|
|
||||||
|
|
||||||
station -> tie("air-pressure-Pa",
|
|
||||||
SGRawValueMethods<FGAirPressureItem,WeatherPrecision>(
|
|
||||||
database_data[0].AirPressure,
|
|
||||||
&FGAirPressureItem::getValue,
|
|
||||||
&FGAirPressureItem::setValue)
|
|
||||||
,false);
|
|
||||||
|
|
||||||
int i;
|
|
||||||
for( i = 0; i < database_data[index].Wind.size(); i++)
|
|
||||||
{
|
|
||||||
SGPropertyNode * wind = station->getNode("wind", i, true);
|
|
||||||
wind -> tie("north-mps",
|
|
||||||
SGRawValueMethodsIndexed<FGPhysicalProperties,WeatherPrecision>(
|
|
||||||
database_data[index], i,
|
|
||||||
&FGPhysicalProperties::getWind_x,
|
|
||||||
&FGPhysicalProperties::setWind_x)
|
|
||||||
,false);
|
|
||||||
wind -> tie("east-mps",
|
|
||||||
SGRawValueMethodsIndexed<FGPhysicalProperties,WeatherPrecision>(
|
|
||||||
database_data[index], i,
|
|
||||||
&FGPhysicalProperties::getWind_y,
|
|
||||||
&FGPhysicalProperties::setWind_y)
|
|
||||||
,false);
|
|
||||||
wind -> tie("up-mps",
|
|
||||||
SGRawValueMethodsIndexed<FGPhysicalProperties,WeatherPrecision>(
|
|
||||||
database_data[index], i,
|
|
||||||
&FGPhysicalProperties::getWind_z,
|
|
||||||
&FGPhysicalProperties::setWind_z)
|
|
||||||
,false);
|
|
||||||
wind -> tie("altitude-m",
|
|
||||||
SGRawValueMethodsIndexed<FGPhysicalProperties,WeatherPrecision>(
|
|
||||||
database_data[index], i,
|
|
||||||
&FGPhysicalProperties::getWind_a,
|
|
||||||
&FGPhysicalProperties::setWind_a)
|
|
||||||
,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
for( i = 0; i < database_data[index].Temperature.size(); i++)
|
|
||||||
{
|
|
||||||
SGPropertyNode * temperature = station->getNode("temperature", i, true);
|
|
||||||
temperature -> tie("value-K",
|
|
||||||
SGRawValueMethodsIndexed<FGPhysicalProperties,WeatherPrecision>(
|
|
||||||
database_data[index], i,
|
|
||||||
&FGPhysicalProperties::getTemperature_x,
|
|
||||||
&FGPhysicalProperties::setTemperature_x)
|
|
||||||
,false);
|
|
||||||
temperature -> tie("altitude-m",
|
|
||||||
SGRawValueMethodsIndexed<FGPhysicalProperties,WeatherPrecision>(
|
|
||||||
database_data[index], i,
|
|
||||||
&FGPhysicalProperties::getTemperature_a,
|
|
||||||
&FGPhysicalProperties::setTemperature_a)
|
|
||||||
,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
for( i = 0; i < database_data[index].VaporPressure.size(); i++)
|
|
||||||
{
|
|
||||||
SGPropertyNode * vaporpressure = station->getNode("vapor-pressure", i, true);
|
|
||||||
vaporpressure -> tie("value-Pa",
|
|
||||||
SGRawValueMethodsIndexed<FGPhysicalProperties,WeatherPrecision>(
|
|
||||||
database_data[index], i,
|
|
||||||
&FGPhysicalProperties::getVaporPressure_x,
|
|
||||||
&FGPhysicalProperties::setVaporPressure_x)
|
|
||||||
,false);
|
|
||||||
vaporpressure -> tie("altitude-m",
|
|
||||||
SGRawValueMethodsIndexed<FGPhysicalProperties,WeatherPrecision>(
|
|
||||||
database_data[index], i,
|
|
||||||
&FGPhysicalProperties::getVaporPressure_a,
|
|
||||||
&FGPhysicalProperties::setVaporPressure_a)
|
|
||||||
,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGLocalWeatherDatabase::unbind()
|
|
||||||
{
|
|
||||||
fgUntie("/environment/weather/wind-north-mps");
|
|
||||||
fgUntie("/environment/weather/wind-east-mps");
|
|
||||||
fgUntie("/environment/weather/wind-up-mps");
|
|
||||||
fgUntie("/environment/weather/temperature-K");
|
|
||||||
fgUntie("/environment/weather/air-pressure-Pa");
|
|
||||||
fgUntie("/environment/weather/vapor-pressure-Pa");
|
|
||||||
fgUntie("/environment/weather/air-density");
|
|
||||||
}
|
|
||||||
|
|
||||||
FGLocalWeatherDatabase::~FGLocalWeatherDatabase()
|
|
||||||
{
|
|
||||||
//Tidying up:
|
|
||||||
delete database_logic;
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* reset the whole database */
|
|
||||||
/****************************************************************************/
|
|
||||||
void FGLocalWeatherDatabase::reset(const DatabaseWorkingType type)
|
|
||||||
{
|
|
||||||
cerr << "FGLocalWeatherDatabase::reset isn't supported yet\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* update the database. Since the last call we had dt seconds */
|
|
||||||
/****************************************************************************/
|
|
||||||
void FGLocalWeatherDatabase::update(const WeatherPrecision dt)
|
|
||||||
{
|
|
||||||
//if (DatabaseStatus==use_global)
|
|
||||||
// global->update(dt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGLocalWeatherDatabase::update(const sgVec3& p) //position has changed
|
|
||||||
{
|
|
||||||
//uncomment this when you are using the GlobalDatabase
|
|
||||||
/*
|
|
||||||
cerr << "****\nupdate(p) inside\n";
|
|
||||||
cerr << "Parameter: " << p[0] << "/" << p[1] << "/" << p[2] << "\n";
|
|
||||||
cerr << FGPhysicalProperties2D(get(p2d), p2d);
|
|
||||||
cerr << "****\n";
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGLocalWeatherDatabase::update(const sgVec3& p, const WeatherPrecision dt) //time and/or position has changed
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* Get the physical properties on the specified point p out of the database */
|
|
||||||
/****************************************************************************/
|
|
||||||
FGPhysicalProperty FGLocalWeatherDatabase::get(const sgVec3& p) const
|
|
||||||
{
|
|
||||||
// check for bogous altitudes. Dunno why, but FGFS want's to know the
|
|
||||||
// weather at an altitude of roughly -3000 meters...
|
|
||||||
if (p[2] < -500.0f)
|
|
||||||
return FGPhysicalProperty(DatabaseEvaluate(p), -500.0f);
|
|
||||||
|
|
||||||
return FGPhysicalProperty(DatabaseEvaluate(p), p[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef macintosh
|
|
||||||
/* fix a problem with mw compilers in that they don't know the
|
|
||||||
difference between the next two methods. Since the first one
|
|
||||||
doesn't seem to be used anywhere, I commented it out. This is
|
|
||||||
supposed to be fixed in the forthcoming CodeWarrior Release
|
|
||||||
6. */
|
|
||||||
#else
|
|
||||||
FGPhysicalProperties FGLocalWeatherDatabase::get(const sgVec2& p) const
|
|
||||||
{
|
|
||||||
return DatabaseEvaluate(p);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
WeatherPrecision FGLocalWeatherDatabase::getAirDensity(const sgVec3& p) const
|
|
||||||
{
|
|
||||||
FGPhysicalProperty dummy(DatabaseEvaluate(p), p[2]);
|
|
||||||
|
|
||||||
return
|
|
||||||
(dummy.AirPressure*FG_WEATHER_DEFAULT_AIRDENSITY*FG_WEATHER_DEFAULT_TEMPERATURE) /
|
|
||||||
(dummy.Temperature*FG_WEATHER_DEFAULT_AIRPRESSURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FGLocalWeatherDatabase::setSnowRainIntensity(const WeatherPrecision x, const sgVec2& p)
|
|
||||||
{
|
|
||||||
/* not supported yet */
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGLocalWeatherDatabase::setSnowRainType(const SnowRainType x, const sgVec2& p)
|
|
||||||
{
|
|
||||||
/* not supported yet */
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGLocalWeatherDatabase::setLightningProbability(const WeatherPrecision x, const sgVec2& p)
|
|
||||||
{
|
|
||||||
/* not supported yet */
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGLocalWeatherDatabase::setProperties(const FGPhysicalProperties2D& x)
|
|
||||||
{
|
|
||||||
/* not supported yet */
|
|
||||||
}
|
|
||||||
|
|
||||||
void fgUpdateWeatherDatabase(void)
|
|
||||||
{
|
|
||||||
sgVec3 position;
|
|
||||||
|
|
||||||
sgSetVec3(position,
|
|
||||||
current_aircraft.fdm_state->get_Latitude(),
|
|
||||||
current_aircraft.fdm_state->get_Longitude(),
|
|
||||||
current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER);
|
|
||||||
|
|
||||||
WeatherDatabase->update( position );
|
|
||||||
|
|
||||||
// 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(porperty.Wind[1]*MSTOFPS,
|
|
||||||
porperty.Wind[0]*MSTOFPS,
|
|
||||||
porperty.Wind[2]*MSTOFPS); */
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,357 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGLocalWeatherDatabase.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Database for the local weather
|
|
||||||
This database is the only one that gets called from FG
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
30.06.1999 Christian Mayer STL portability
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
14.12.1999 Christian Mayer Changed the internal structure to use Dave
|
|
||||||
Eberly's spherical interpolation code. This
|
|
||||||
stops our dependancy on the (ugly) voronoi
|
|
||||||
code and simplyfies the code structure a lot.
|
|
||||||
18.07.2001 Christian Mayer Added the posibility to limit the amount of
|
|
||||||
stations for a faster init.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGLocalWeatherDatabase_H
|
|
||||||
#define FGLocalWeatherDatabase_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include <vector>
|
|
||||||
#include STL_STRING
|
|
||||||
|
|
||||||
#include <plib/sg.h>
|
|
||||||
|
|
||||||
#include <Main/fgfs.hxx>
|
|
||||||
|
|
||||||
#include <simgear/constants.h>
|
|
||||||
#include <simgear/props/props.hxx>
|
|
||||||
|
|
||||||
#include "sphrintp.h"
|
|
||||||
|
|
||||||
#include "FGPhysicalProperties.h"
|
|
||||||
#include "FGPhysicalProperty.h"
|
|
||||||
|
|
||||||
#include "FGWeatherFeature.h"
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
#include "FGThunderstorm.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
SG_USING_STD(vector);
|
|
||||||
SG_USING_STD(string);
|
|
||||||
SG_USING_NAMESPACE(std);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
struct _FGLocalWeatherDatabaseCache
|
|
||||||
{
|
|
||||||
sgVec3 last_known_position;
|
|
||||||
//sgVec3 current_position;
|
|
||||||
SGPropertyNode *latitude_deg;
|
|
||||||
SGPropertyNode *longitude_deg;
|
|
||||||
SGPropertyNode *altitude_ft;
|
|
||||||
FGPhysicalProperty last_known_property;
|
|
||||||
};
|
|
||||||
|
|
||||||
class FGLocalWeatherDatabase : public FGSubsystem
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
protected:
|
|
||||||
SphereInterpolate *database_logic;
|
|
||||||
vector<FGPhysicalProperties> database_data;
|
|
||||||
#ifndef macintosh
|
|
||||||
FGPhysicalProperties DatabaseEvaluate(const sgVec2& p) const
|
|
||||||
{
|
|
||||||
sgVec2 p_converted = {p[0]*(SGD_2PI/360.0),
|
|
||||||
p[1]*(SGD_2PI/360.0)};
|
|
||||||
EvaluateData d = database_logic->Evaluate(p_converted);
|
|
||||||
return database_data[d.index[0]]*d.percentage[0] +
|
|
||||||
database_data[d.index[1]]*d.percentage[1] +
|
|
||||||
database_data[d.index[2]]*d.percentage[2] ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
FGPhysicalProperties DatabaseEvaluate(const sgVec3& p) const
|
|
||||||
{
|
|
||||||
sgVec3 p_converted = {p[0]*(SGD_2PI/360.0),
|
|
||||||
p[1]*(SGD_2PI/360.0),
|
|
||||||
p[2] };
|
|
||||||
EvaluateData d = database_logic->Evaluate(p_converted);
|
|
||||||
return database_data[d.index[0]]*d.percentage[0] +
|
|
||||||
database_data[d.index[1]]*d.percentage[1] +
|
|
||||||
database_data[d.index[2]]*d.percentage[2] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef vector<sgVec2> pointVector;
|
|
||||||
typedef vector<pointVector> tileVector;
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* make tiles out of points on a 2D plane */
|
|
||||||
/************************************************************************/
|
|
||||||
WeatherPrecision WeatherVisibility; //how far do I need to simulate the
|
|
||||||
//local weather? Unit: metres
|
|
||||||
|
|
||||||
_FGLocalWeatherDatabaseCache *cache;
|
|
||||||
inline void check_cache_for_update(void) const;
|
|
||||||
|
|
||||||
bool Thunderstorm; //is there a thunderstorm near by?
|
|
||||||
FGThunderstorm *theThunderstorm; //pointer to the thunderstorm.
|
|
||||||
|
|
||||||
public:
|
|
||||||
/************************************************************************/
|
|
||||||
/* for tieing them to the property system */
|
|
||||||
/************************************************************************/
|
|
||||||
inline WeatherPrecision get_wind_north() const;
|
|
||||||
inline WeatherPrecision get_wind_east() const;
|
|
||||||
inline WeatherPrecision get_wind_up() const;
|
|
||||||
inline WeatherPrecision get_temperature() const;
|
|
||||||
inline WeatherPrecision get_air_pressure() const;
|
|
||||||
inline WeatherPrecision get_vapor_pressure() const;
|
|
||||||
inline WeatherPrecision get_air_density() const;
|
|
||||||
|
|
||||||
static FGLocalWeatherDatabase *theFGLocalWeatherDatabase;
|
|
||||||
|
|
||||||
enum DatabaseWorkingType {
|
|
||||||
use_global, //use global database for data !!obsolete!!
|
|
||||||
use_internet, //use the weather data that came from the internet
|
|
||||||
manual, //use only user inputs
|
|
||||||
distant, //use distant information, e.g. like LAN when used in
|
|
||||||
//a multiplayer environment
|
|
||||||
random, //generate weather randomly
|
|
||||||
default_mode //use only default values
|
|
||||||
};
|
|
||||||
|
|
||||||
DatabaseWorkingType DatabaseStatus;
|
|
||||||
|
|
||||||
void init( const WeatherPrecision visibility,
|
|
||||||
const DatabaseWorkingType type,
|
|
||||||
const string &root );
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* Constructor and Destructor */
|
|
||||||
/************************************************************************/
|
|
||||||
FGLocalWeatherDatabase(
|
|
||||||
const sgVec3& position,
|
|
||||||
const string& root,
|
|
||||||
const DatabaseWorkingType type = PREFERED_WORKING_TYPE,
|
|
||||||
const WeatherPrecision visibility = DEFAULT_WEATHER_VISIBILITY)
|
|
||||||
{
|
|
||||||
cache = new _FGLocalWeatherDatabaseCache;
|
|
||||||
sgCopyVec3( cache->last_known_position, position );
|
|
||||||
|
|
||||||
init( visibility, type, root );
|
|
||||||
|
|
||||||
theFGLocalWeatherDatabase = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
FGLocalWeatherDatabase(
|
|
||||||
const WeatherPrecision position_lat,
|
|
||||||
const WeatherPrecision position_lon,
|
|
||||||
const WeatherPrecision position_alt,
|
|
||||||
const string& root,
|
|
||||||
const DatabaseWorkingType type = PREFERED_WORKING_TYPE,
|
|
||||||
const WeatherPrecision visibility = DEFAULT_WEATHER_VISIBILITY)
|
|
||||||
{
|
|
||||||
cache = new _FGLocalWeatherDatabaseCache;
|
|
||||||
sgSetVec3( cache->last_known_position, position_lat, position_lon, position_alt );
|
|
||||||
|
|
||||||
init( visibility, type, root );
|
|
||||||
|
|
||||||
theFGLocalWeatherDatabase = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
~FGLocalWeatherDatabase();
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* reset the whole database */
|
|
||||||
/************************************************************************/
|
|
||||||
void reset(const DatabaseWorkingType type = PREFERED_WORKING_TYPE);
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* update the database. Since the last call we had dt seconds */
|
|
||||||
/************************************************************************/
|
|
||||||
void update(const WeatherPrecision dt); //time has changed
|
|
||||||
void update(const sgVec3& p); //position has changed
|
|
||||||
void update(const sgVec3& p, const WeatherPrecision dt); //time and/or position has changed
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* define methods requited for FGSubsystem */
|
|
||||||
/************************************************************************/
|
|
||||||
virtual void init () { /* do nothing; that's done in the constructor */ };
|
|
||||||
virtual void bind ();
|
|
||||||
virtual void unbind ();
|
|
||||||
virtual void update (int dt) { update((float) dt); };
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* Get the physical properties on the specified point p */
|
|
||||||
/************************************************************************/
|
|
||||||
#ifdef macintosh
|
|
||||||
/* fix a problem with mw compilers in that they don't know the
|
|
||||||
difference between the next two methods. Since the first one
|
|
||||||
doesn't seem to be used anywhere, I commented it out. This is
|
|
||||||
supposed to be fixed in the forthcoming CodeWarrior Release
|
|
||||||
6. */
|
|
||||||
#else
|
|
||||||
FGPhysicalProperties get(const sgVec2& p) const;
|
|
||||||
#endif
|
|
||||||
FGPhysicalProperty get(const sgVec3& p) const;
|
|
||||||
|
|
||||||
WeatherPrecision getAirDensity(const sgVec3& p) const;
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* Add a weather feature at the point p and surrounding area */
|
|
||||||
/************************************************************************/
|
|
||||||
// !! Adds aren't supported anymore !!
|
|
||||||
|
|
||||||
void setSnowRainIntensity (const WeatherPrecision x, const sgVec2& p);
|
|
||||||
void setSnowRainType (const SnowRainType x, const sgVec2& p);
|
|
||||||
void setLightningProbability(const WeatherPrecision x, const sgVec2& p);
|
|
||||||
|
|
||||||
void setProperties(const FGPhysicalProperties2D& x); //change a property
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* get/set weather visibility */
|
|
||||||
/************************************************************************/
|
|
||||||
void setWeatherVisibility(const WeatherPrecision visibility);
|
|
||||||
WeatherPrecision getWeatherVisibility(void) const;
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* figure out if there's a thunderstorm that has to be taken care of */
|
|
||||||
/************************************************************************/
|
|
||||||
void updateThunderstorm(const float dt)
|
|
||||||
{
|
|
||||||
if (Thunderstorm == false)
|
|
||||||
return;
|
|
||||||
|
|
||||||
theThunderstorm->update( dt );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
extern FGLocalWeatherDatabase *WeatherDatabase;
|
|
||||||
void fgUpdateWeatherDatabase(void);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* get/set weather visibility */
|
|
||||||
/****************************************************************************/
|
|
||||||
void inline FGLocalWeatherDatabase::setWeatherVisibility(const WeatherPrecision visibility)
|
|
||||||
{
|
|
||||||
if (visibility >= MINIMUM_WEATHER_VISIBILITY)
|
|
||||||
WeatherVisibility = visibility;
|
|
||||||
else
|
|
||||||
WeatherVisibility = MINIMUM_WEATHER_VISIBILITY;
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision inline FGLocalWeatherDatabase::getWeatherVisibility(void) const
|
|
||||||
{
|
|
||||||
return WeatherVisibility;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void FGLocalWeatherDatabase::check_cache_for_update(void) const
|
|
||||||
{
|
|
||||||
if ( ( cache->last_known_position[0] == cache->latitude_deg->getFloatValue() ) &&
|
|
||||||
( cache->last_known_position[1] == cache->longitude_deg->getFloatValue() ) &&
|
|
||||||
( cache->last_known_position[2] == cache->altitude_ft->getFloatValue() * SG_FEET_TO_METER ) )
|
|
||||||
return; //nothing to do
|
|
||||||
|
|
||||||
sgVec3 position = { cache->latitude_deg->getFloatValue(),
|
|
||||||
cache->longitude_deg->getFloatValue(),
|
|
||||||
cache->altitude_ft->getFloatValue() * SG_FEET_TO_METER };
|
|
||||||
|
|
||||||
sgCopyVec3(cache->last_known_position, position);
|
|
||||||
cache->last_known_property = get(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision FGLocalWeatherDatabase::get_wind_north() const
|
|
||||||
{
|
|
||||||
check_cache_for_update();
|
|
||||||
|
|
||||||
return cache->last_known_property.Wind[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision FGLocalWeatherDatabase::get_wind_east() const
|
|
||||||
{
|
|
||||||
check_cache_for_update();
|
|
||||||
|
|
||||||
return cache->last_known_property.Wind[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision FGLocalWeatherDatabase::get_wind_up() const
|
|
||||||
{
|
|
||||||
check_cache_for_update();
|
|
||||||
|
|
||||||
return cache->last_known_property.Wind[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision FGLocalWeatherDatabase::get_temperature() const
|
|
||||||
{
|
|
||||||
check_cache_for_update();
|
|
||||||
|
|
||||||
return cache->last_known_property.Temperature;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision FGLocalWeatherDatabase::get_air_pressure() const
|
|
||||||
{
|
|
||||||
check_cache_for_update();
|
|
||||||
|
|
||||||
return cache->last_known_property.AirPressure;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision FGLocalWeatherDatabase::get_vapor_pressure() const
|
|
||||||
{
|
|
||||||
check_cache_for_update();
|
|
||||||
|
|
||||||
return cache->last_known_property.VaporPressure;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision FGLocalWeatherDatabase::get_air_density() const
|
|
||||||
{
|
|
||||||
// check_for_update();
|
|
||||||
// not required, as the called functions will do that
|
|
||||||
|
|
||||||
return (get_air_pressure()*FG_WEATHER_DEFAULT_AIRDENSITY*FG_WEATHER_DEFAULT_TEMPERATURE) /
|
|
||||||
(get_temperature()*FG_WEATHER_DEFAULT_AIRPRESSURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGLocalWeatherDatabase_H*/
|
|
|
@ -1,322 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGPhysicalProperties.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
Called by: main program
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Initialice the FGPhysicalProperties struct to something sensible(?)
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
29.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGPhysicalProperties.h"
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
|
|
||||||
#include "FGWeatherUtils.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/********************************** CODE ************************************/
|
|
||||||
/****************************************************************************/
|
|
||||||
FGPhysicalProperties::FGPhysicalProperties()
|
|
||||||
{
|
|
||||||
sgVec3 zero;
|
|
||||||
sgZeroVec3( zero );
|
|
||||||
/************************************************************************/
|
|
||||||
/* This standart constructor fills the class with a standard weather */
|
|
||||||
/************************************************************************/
|
|
||||||
|
|
||||||
Wind[-1000.0] = FGWindItem(zero); //no Wind by default
|
|
||||||
Wind[10000.0] = FGWindItem(zero); //no Wind by default
|
|
||||||
|
|
||||||
Turbulence[-1000.0] = FGTurbulenceItem(zero); //no Turbulence by default
|
|
||||||
Turbulence[10000.0] = FGTurbulenceItem(zero); //no Turbulence by default
|
|
||||||
|
|
||||||
//Initialice with the CINA atmosphere
|
|
||||||
Temperature[ 0.0] = +15.0 + 273.16;
|
|
||||||
Temperature[11000.0] = -56.5 + 273.16;
|
|
||||||
Temperature[20000.0] = -56.5 + 273.16;
|
|
||||||
|
|
||||||
AirPressure = FGAirPressureItem(101325.0);
|
|
||||||
|
|
||||||
VaporPressure[-1000.0] = FG_WEATHER_DEFAULT_VAPORPRESSURE; //in Pa (I *only* accept SI!)
|
|
||||||
VaporPressure[10000.0] = FG_WEATHER_DEFAULT_VAPORPRESSURE; //in Pa (I *only* accept SI!)
|
|
||||||
|
|
||||||
//Clouds.insert(FGCloudItem()) => none
|
|
||||||
SnowRainIntensity = 0.0;
|
|
||||||
snowRainType = Rain;
|
|
||||||
LightningProbability = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
The Methods:
|
|
||||||
|
|
||||||
WeatherPrecision getWind_x( int number ) const;
|
|
||||||
WeatherPrecision getWind_y( int number ) const;
|
|
||||||
WeatherPrecision getWind_z( int number ) const;
|
|
||||||
WeatherPrecision getWind_a( int number ) const;
|
|
||||||
void setWind_x( int number, WeatherPrecision x);
|
|
||||||
void setWind_y( int number, WeatherPrecision y);
|
|
||||||
void setWind_z( int number, WeatherPrecision z);
|
|
||||||
void setWind_a( int number, WeatherPrecision a);
|
|
||||||
WeatherPrecision getTurbulence_x( int number ) const;
|
|
||||||
WeatherPrecision getTurbulence_y( int number ) const;
|
|
||||||
WeatherPrecision getTurbulence_z( int number ) const;
|
|
||||||
WeatherPrecision getTurbulence_a( int number ) const;
|
|
||||||
void setTurbulence_x( int number, WeatherPrecision x);
|
|
||||||
void setTurbulence_y( int number, WeatherPrecision y);
|
|
||||||
void setTurbulence_z( int number, WeatherPrecision z);
|
|
||||||
void setTurbulence_a( int number, WeatherPrecision a);
|
|
||||||
WeatherPrecision getTemperature_x( int number ) const;
|
|
||||||
WeatherPrecision getTemperature_a( int number ) const;
|
|
||||||
void setTemperature_x( int number, WeatherPrecision x);
|
|
||||||
void setTemperature_a( int number, WeatherPrecision a);
|
|
||||||
WeatherPrecision getVaporPressure_x( int number ) const;
|
|
||||||
WeatherPrecision getVaporPressure_a( int number ) const;
|
|
||||||
void setVaporPressure_x( int number, WeatherPrecision x);
|
|
||||||
void setVaporPressure_a( int number, WeatherPrecision a);
|
|
||||||
|
|
||||||
are in the extra file FGPhysicalProperties_bind.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
unsigned int FGPhysicalProperties::getNumberOfCloudLayers(void) const
|
|
||||||
{
|
|
||||||
return Clouds.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
FGCloudItem FGPhysicalProperties::getCloudLayer(unsigned int nr) const
|
|
||||||
{
|
|
||||||
map<WeatherPrecision,FGCloudItem>::const_iterator CloudsIt = Clouds.begin();
|
|
||||||
|
|
||||||
//set the iterator to the 'nr'th entry
|
|
||||||
for (; nr > 0; nr--)
|
|
||||||
CloudsIt++;
|
|
||||||
|
|
||||||
return CloudsIt->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p )
|
|
||||||
{
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem >::const_iterator wind_iterator;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::const_iterator turbulence_iterator;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::const_iterator scalar_iterator;
|
|
||||||
|
|
||||||
out << "Position: (" << p.p[0] << ", " << p.p[1] << ", " << p.p[2] << ")\n";
|
|
||||||
|
|
||||||
out << "Stored Wind: ";
|
|
||||||
for (wind_iterator WindIt = p.Wind.begin();
|
|
||||||
WindIt != p.Wind.end();
|
|
||||||
WindIt++)
|
|
||||||
out << "(" << WindIt->second.x() << ", " << WindIt->second.y() << ", " << WindIt->second.z() << ") m/s at (" << WindIt->first << ") m; ";
|
|
||||||
out << "\n";
|
|
||||||
|
|
||||||
out << "Stored Turbulence: ";
|
|
||||||
for (turbulence_iterator TurbulenceIt = p.Turbulence.begin();
|
|
||||||
TurbulenceIt != p.Turbulence.end();
|
|
||||||
TurbulenceIt++)
|
|
||||||
out << "(" << TurbulenceIt->second.x() << ", " << TurbulenceIt->second.y() << ", " << TurbulenceIt->second.z() << ") m/s at (" << TurbulenceIt->first << ") m; ";
|
|
||||||
out << "\n";
|
|
||||||
|
|
||||||
out << "Stored Temperature: ";
|
|
||||||
for (scalar_iterator TemperatureIt = p.Temperature.begin();
|
|
||||||
TemperatureIt != p.Temperature.end();
|
|
||||||
TemperatureIt++)
|
|
||||||
out << Kelvin2Celsius(TemperatureIt->second) << " degC at " << TemperatureIt->first << "m; ";
|
|
||||||
out << "\n";
|
|
||||||
|
|
||||||
out << "Stored AirPressure: ";
|
|
||||||
out << p.AirPressure.getValue()/100.0 << " hPa at " << 0.0 << "m; ";
|
|
||||||
out << "\n";
|
|
||||||
|
|
||||||
out << "Stored VaporPressure: ";
|
|
||||||
for (scalar_iterator VaporPressureIt = p.VaporPressure.begin();
|
|
||||||
VaporPressureIt != p.VaporPressure.end();
|
|
||||||
VaporPressureIt++)
|
|
||||||
out << VaporPressureIt->second/100.0 << " hPa at " << VaporPressureIt->first << "m; ";
|
|
||||||
out << "\n";
|
|
||||||
|
|
||||||
return out << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline double F(const WeatherPrecision factor, const WeatherPrecision a, const WeatherPrecision b, const WeatherPrecision r, const WeatherPrecision x)
|
|
||||||
{
|
|
||||||
const double c = 1.0 / (-b + a * r);
|
|
||||||
return factor * c * ( 1.0 / (r + x) + a * c * log(fabs((r + x) * (b + a * x))) );
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::AirPressureAt(const WeatherPrecision x) const
|
|
||||||
{
|
|
||||||
const double rho0 = (AirPressure.getValue()*FG_WEATHER_DEFAULT_AIRDENSITY*FG_WEATHER_DEFAULT_TEMPERATURE)/(TemperatureAt(0)*FG_WEATHER_DEFAULT_AIRPRESSURE);
|
|
||||||
const double G = 6.673e-11; //Gravity; in m^3 kg^-1 s^-2
|
|
||||||
const double m = 5.977e24; //mass of the earth in kg
|
|
||||||
const double r = 6368e3; //radius of the earth in metres
|
|
||||||
const double factor = -(rho0 * TemperatureAt(0) * G * m) / AirPressure.getValue();
|
|
||||||
|
|
||||||
double a, b, FF = 0.0;
|
|
||||||
|
|
||||||
//ok, integrate from 0 to a now.
|
|
||||||
if (Temperature.size() < 2)
|
|
||||||
{ //take care of the case that there aren't enough points
|
|
||||||
//actually this should be impossible...
|
|
||||||
|
|
||||||
if (Temperature.size() == 0)
|
|
||||||
{
|
|
||||||
cerr << "ERROR in FGPhysicalProperties: Air pressure at " << x << " metres altiude requested,\n";
|
|
||||||
cerr << " but there isn't enough data stored! No temperature is aviable!\n";
|
|
||||||
return FG_WEATHER_DEFAULT_AIRPRESSURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//ok, I've got only one point. So I'm assuming that that temperature is
|
|
||||||
//the same for all altitudes.
|
|
||||||
a = 1;
|
|
||||||
b = TemperatureAt(0);
|
|
||||||
FF += F(factor, a, b, r, x );
|
|
||||||
FF -= F(factor, a, b, r, 0.0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ //I've got at least two entries now
|
|
||||||
|
|
||||||
//integrate 'backwards' by integrating the strip ]n,x] first, then ]n-1,n] ... to [0,n-m]
|
|
||||||
|
|
||||||
if (x>=0.0)
|
|
||||||
{
|
|
||||||
map<WeatherPrecision, WeatherPrecision>::const_iterator temp2 = Temperature.upper_bound(x);
|
|
||||||
map<WeatherPrecision, WeatherPrecision>::const_iterator temp1 = temp2; temp1--;
|
|
||||||
|
|
||||||
if (temp1->first == x)
|
|
||||||
{ //ignore that interval
|
|
||||||
temp1--; temp2--;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool first_pass = true;
|
|
||||||
while(true)
|
|
||||||
{
|
|
||||||
if (temp2 == Temperature.end())
|
|
||||||
{
|
|
||||||
//temp2 doesn't exist. So cheat by assuming that the slope is the
|
|
||||||
//same as between the two earlier temperatures
|
|
||||||
temp1--; temp2--;
|
|
||||||
a = (temp2->second - temp1->second)/(temp2->first - temp1->first);
|
|
||||||
b = temp1->second - a * temp1->first;
|
|
||||||
temp1++; temp2++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
a = (temp2->second - temp1->second)/(temp2->first - temp1->first);
|
|
||||||
b = temp1->second - a * temp1->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (first_pass)
|
|
||||||
{
|
|
||||||
|
|
||||||
FF += F(factor, a, b, r, x);
|
|
||||||
first_pass = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FF += F(factor, a, b, r, temp2->first);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (temp1->first>0.0)
|
|
||||||
{
|
|
||||||
FF -= F(factor, a, b, r, temp1->first);
|
|
||||||
temp1--; temp2--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FF -= F(factor, a, b, r, 0.0);
|
|
||||||
return AirPressure.getValue() * exp(FF);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ //ok x is smaller than 0.0, so do everything in reverse
|
|
||||||
map<WeatherPrecision, WeatherPrecision>::const_iterator temp2 = Temperature.upper_bound(x);
|
|
||||||
map<WeatherPrecision, WeatherPrecision>::const_iterator temp1 = temp2; temp1--;
|
|
||||||
|
|
||||||
bool first_pass = true;
|
|
||||||
while(true)
|
|
||||||
{
|
|
||||||
if (temp2 == Temperature.begin())
|
|
||||||
{
|
|
||||||
//temp1 doesn't exist. So cheat by assuming that the slope is the
|
|
||||||
//same as between the two earlier temperatures
|
|
||||||
temp1 = Temperature.begin(); temp2++;
|
|
||||||
a = (temp2->second - temp1->second)/(temp2->first - temp1->first);
|
|
||||||
b = temp1->second - a * temp1->first;
|
|
||||||
temp2--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
a = (temp2->second - temp1->second)/(temp2->first - temp1->first);
|
|
||||||
b = temp1->second - a * temp1->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (first_pass)
|
|
||||||
{
|
|
||||||
|
|
||||||
FF += F(factor, a, b, r, x);
|
|
||||||
first_pass = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FF += F(factor, a, b, r, temp2->first);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (temp2->first<0.0)
|
|
||||||
{
|
|
||||||
FF -= F(factor, a, b, r, temp1->first);
|
|
||||||
|
|
||||||
if (temp2 == Temperature.begin())
|
|
||||||
{
|
|
||||||
temp1 = Temperature.begin(); temp2++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
temp1++; temp2++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FF -= F(factor, a, b, r, 0.0);
|
|
||||||
return AirPressure.getValue() * exp(FF);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return AirPressure.getValue() * exp(FF);
|
|
||||||
}
|
|
|
@ -1,416 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGPhysicalProperties.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Define the simulated physical properties of the weather
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer Changed struct to class
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
30.06.1999 Christian Mayer STL portability
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
15.12.1999 Christian Mayer changed the air pressure calculation to a much
|
|
||||||
more realistic formula. But as I need for that
|
|
||||||
the temperature I moved the code to
|
|
||||||
FGPhysicalProperties
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGPhysicalProperties_H
|
|
||||||
#define FGPhysicalProperties_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_WINDOWS_H
|
|
||||||
# include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include STL_IOSTREAM
|
|
||||||
#include <vector>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#include <plib/sg.h>
|
|
||||||
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
|
|
||||||
#include "FGAirPressureItem.h"
|
|
||||||
#include "FGWindItem.h"
|
|
||||||
#include "FGTurbulenceItem.h"
|
|
||||||
|
|
||||||
#include "FGCloudItem.h"
|
|
||||||
#include "FGSnowRain.h"
|
|
||||||
|
|
||||||
SG_USING_STD(vector);
|
|
||||||
SG_USING_STD(map);
|
|
||||||
SG_USING_NAMESPACE(std);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* FOREWARD DEFINITIONS */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGPhysicalProperties2D;
|
|
||||||
ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p );
|
|
||||||
|
|
||||||
class FGPhysicalProperties
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef WeatherPrecision Altitude;
|
|
||||||
|
|
||||||
map<Altitude,FGWindItem> Wind; //all Wind vectors
|
|
||||||
map<Altitude,FGTurbulenceItem> Turbulence; //all Turbulence vectors
|
|
||||||
map<Altitude,WeatherPrecision> Temperature; //in deg. Kelvin (I *only* accept SI!)
|
|
||||||
FGAirPressureItem AirPressure; //in Pascal (I *only* accept SI!)
|
|
||||||
map<Altitude,WeatherPrecision> VaporPressure; //in Pascal (I *only* accept SI!)
|
|
||||||
|
|
||||||
map<Altitude,FGCloudItem> Clouds; //amount of covering and type
|
|
||||||
|
|
||||||
WeatherPrecision SnowRainIntensity; //this also stands for hail, snow,...
|
|
||||||
SnowRainType snowRainType;
|
|
||||||
WeatherPrecision LightningProbability; //in lightnings per second
|
|
||||||
|
|
||||||
FGPhysicalProperties(); //consructor to fill it with FG standart weather
|
|
||||||
|
|
||||||
//return values at specified altitudes
|
|
||||||
void WindAt (sgVec3 ret, const WeatherPrecision a) const;
|
|
||||||
void TurbulenceAt (sgVec3 ret, const WeatherPrecision a) const;
|
|
||||||
WeatherPrecision TemperatureAt (const WeatherPrecision a) const;
|
|
||||||
WeatherPrecision AirPressureAt (const WeatherPrecision x) const; //x is used here instead of a on purpose
|
|
||||||
WeatherPrecision VaporPressureAt(const WeatherPrecision a) const;
|
|
||||||
|
|
||||||
//for easier access to the cloud stuff:
|
|
||||||
unsigned int getNumberOfCloudLayers(void) const;
|
|
||||||
FGCloudItem getCloudLayer(unsigned int nr) const;
|
|
||||||
|
|
||||||
FGPhysicalProperties& operator = ( const FGPhysicalProperties& p );
|
|
||||||
FGPhysicalProperties& operator *= ( const WeatherPrecision d );
|
|
||||||
FGPhysicalProperties& operator += ( const FGPhysicalProperties& p );
|
|
||||||
FGPhysicalProperties& operator -= ( const FGPhysicalProperties& p );
|
|
||||||
|
|
||||||
//for easy binding to the property system
|
|
||||||
WeatherPrecision getWind_x( int number ) const;
|
|
||||||
WeatherPrecision getWind_y( int number ) const;
|
|
||||||
WeatherPrecision getWind_z( int number ) const;
|
|
||||||
WeatherPrecision getWind_a( int number ) const;
|
|
||||||
void setWind_x( int number, WeatherPrecision x);
|
|
||||||
void setWind_y( int number, WeatherPrecision y);
|
|
||||||
void setWind_z( int number, WeatherPrecision z);
|
|
||||||
void setWind_a( int number, WeatherPrecision a);
|
|
||||||
WeatherPrecision getTurbulence_x( int number ) const;
|
|
||||||
WeatherPrecision getTurbulence_y( int number ) const;
|
|
||||||
WeatherPrecision getTurbulence_z( int number ) const;
|
|
||||||
WeatherPrecision getTurbulence_a( int number ) const;
|
|
||||||
void setTurbulence_x( int number, WeatherPrecision x);
|
|
||||||
void setTurbulence_y( int number, WeatherPrecision y);
|
|
||||||
void setTurbulence_z( int number, WeatherPrecision z);
|
|
||||||
void setTurbulence_a( int number, WeatherPrecision a);
|
|
||||||
WeatherPrecision getTemperature_x( int number ) const;
|
|
||||||
WeatherPrecision getTemperature_a( int number ) const;
|
|
||||||
void setTemperature_x( int number, WeatherPrecision x);
|
|
||||||
void setTemperature_a( int number, WeatherPrecision a);
|
|
||||||
WeatherPrecision getVaporPressure_x( int number ) const;
|
|
||||||
WeatherPrecision getVaporPressure_a( int number ) const;
|
|
||||||
void setVaporPressure_x( int number, WeatherPrecision x);
|
|
||||||
void setVaporPressure_a( int number, WeatherPrecision a);
|
|
||||||
};
|
|
||||||
|
|
||||||
class FGPhysicalProperties2D : public FGPhysicalProperties
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
sgVec2 p; //position of the property (lat/lon)
|
|
||||||
friend ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p );
|
|
||||||
|
|
||||||
FGPhysicalProperties2D() {}
|
|
||||||
|
|
||||||
FGPhysicalProperties2D(const FGPhysicalProperties& prop, const sgVec2& pos)
|
|
||||||
{
|
|
||||||
Wind = prop.Wind;
|
|
||||||
Turbulence = prop.Turbulence;
|
|
||||||
Temperature = prop.Temperature;
|
|
||||||
AirPressure = prop.AirPressure;
|
|
||||||
VaporPressure = prop.VaporPressure;
|
|
||||||
sgCopyVec2(p, pos);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef vector<FGPhysicalProperties> FGPhysicalPropertiesVector;
|
|
||||||
typedef FGPhysicalPropertiesVector::iterator FGPhysicalPropertiesVectorIt;
|
|
||||||
typedef FGPhysicalPropertiesVector::const_iterator FGPhysicalPropertiesVectorConstIt;
|
|
||||||
|
|
||||||
typedef vector<FGPhysicalProperties2D> FGPhysicalProperties2DVector;
|
|
||||||
typedef FGPhysicalProperties2DVector::iterator FGPhysicalProperties2DVectorIt;
|
|
||||||
typedef FGPhysicalProperties2DVector::const_iterator FGPhysicalProperties2DVectorConstIt;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline FGPhysicalProperties& FGPhysicalProperties::operator = ( const FGPhysicalProperties& p )
|
|
||||||
{
|
|
||||||
Wind = p.Wind;
|
|
||||||
Turbulence = p.Turbulence;
|
|
||||||
Temperature = p.Temperature;
|
|
||||||
AirPressure = p.AirPressure;
|
|
||||||
VaporPressure = p.VaporPressure;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperties& FGPhysicalProperties::operator *= ( const WeatherPrecision d )
|
|
||||||
{
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem >::iterator wind_iterator;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::iterator turbulence_iterator;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::iterator scalar_iterator;
|
|
||||||
|
|
||||||
for (wind_iterator WindIt = Wind.begin();
|
|
||||||
WindIt != Wind.end();
|
|
||||||
WindIt++)
|
|
||||||
WindIt->second*= d;
|
|
||||||
|
|
||||||
for (turbulence_iterator TurbulenceIt = Turbulence.begin();
|
|
||||||
TurbulenceIt != Turbulence.end();
|
|
||||||
TurbulenceIt++)
|
|
||||||
TurbulenceIt->second *= d;
|
|
||||||
|
|
||||||
for (scalar_iterator TemperatureIt = Temperature.begin();
|
|
||||||
TemperatureIt != Temperature.end();
|
|
||||||
TemperatureIt++)
|
|
||||||
TemperatureIt->second *= d;
|
|
||||||
|
|
||||||
AirPressure *= d;
|
|
||||||
|
|
||||||
for (scalar_iterator VaporPressureIt = VaporPressure.begin();
|
|
||||||
VaporPressureIt != VaporPressure.end();
|
|
||||||
VaporPressureIt++)
|
|
||||||
VaporPressureIt->second *= d;
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperties& FGPhysicalProperties::operator += (const FGPhysicalProperties& p)
|
|
||||||
{
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem >::const_iterator wind_iterator;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::const_iterator turbulence_iterator;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::const_iterator scalar_iterator;
|
|
||||||
|
|
||||||
for (wind_iterator WindIt = p.Wind.begin();
|
|
||||||
WindIt != p.Wind.end();
|
|
||||||
WindIt++)
|
|
||||||
if (!Wind.insert(*WindIt).second) //when it's not inserted => it's already existing
|
|
||||||
Wind[WindIt->first] += WindIt->second; //=> add the value
|
|
||||||
|
|
||||||
for (turbulence_iterator TurbulenceIt = p.Turbulence.begin();
|
|
||||||
TurbulenceIt != p.Turbulence.end();
|
|
||||||
TurbulenceIt++)
|
|
||||||
if (!Turbulence.insert(*TurbulenceIt).second)
|
|
||||||
Turbulence[TurbulenceIt->first] += TurbulenceIt->second;
|
|
||||||
|
|
||||||
for (scalar_iterator TemperatureIt = p.Temperature.begin();
|
|
||||||
TemperatureIt != p.Temperature.end();
|
|
||||||
TemperatureIt++)
|
|
||||||
if (!Temperature.insert(*TemperatureIt).second)
|
|
||||||
Temperature[TemperatureIt->first] += TemperatureIt->second;
|
|
||||||
|
|
||||||
AirPressure += p.AirPressure.getValue();
|
|
||||||
|
|
||||||
for (scalar_iterator VaporPressureIt = p.VaporPressure.begin();
|
|
||||||
VaporPressureIt != p.VaporPressure.end();
|
|
||||||
VaporPressureIt++)
|
|
||||||
if (!VaporPressure.insert(*VaporPressureIt).second)
|
|
||||||
VaporPressure[VaporPressureIt->first] += VaporPressureIt->second;
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// slightly modified version that also makes the Mac happy
|
|
||||||
inline FGPhysicalProperties& FGPhysicalProperties::operator -= (const FGPhysicalProperties& p)
|
|
||||||
{
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem>::const_iterator wind_iterator;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::const_iterator turbulence_iterator;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::const_iterator scalar_iterator;
|
|
||||||
|
|
||||||
// types to replace make_pair
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem>::value_type wind_type;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::value_type turb_type;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::value_type weather_type;
|
|
||||||
|
|
||||||
for (wind_iterator WindIt = p.Wind.begin();
|
|
||||||
WindIt != p.Wind.end();
|
|
||||||
WindIt++)
|
|
||||||
if (!Wind.insert( wind_type(WindIt->first, -WindIt->second) ).second)
|
|
||||||
// when it's not inserted => it's already existing
|
|
||||||
Wind[WindIt->first] -= WindIt->second; //=> substract the value
|
|
||||||
|
|
||||||
for (turbulence_iterator TurbulenceIt = p.Turbulence.begin();
|
|
||||||
TurbulenceIt != p.Turbulence.end();
|
|
||||||
TurbulenceIt++)
|
|
||||||
if (!Turbulence.insert( turb_type(TurbulenceIt->first, -TurbulenceIt->second) ).second)
|
|
||||||
Turbulence[TurbulenceIt->first] -= TurbulenceIt->second;
|
|
||||||
|
|
||||||
for (scalar_iterator TemperatureIt = p.Temperature.begin();
|
|
||||||
TemperatureIt != p.Temperature.end();
|
|
||||||
TemperatureIt++)
|
|
||||||
if (!Temperature.insert( weather_type(TemperatureIt->first, -TemperatureIt->second) ).second)
|
|
||||||
Temperature[TemperatureIt->first] -= TemperatureIt->second;
|
|
||||||
|
|
||||||
AirPressure -= p.AirPressure.getValue();
|
|
||||||
|
|
||||||
for (scalar_iterator VaporPressureIt = p.VaporPressure.begin();
|
|
||||||
VaporPressureIt != p.VaporPressure.end();
|
|
||||||
VaporPressureIt++)
|
|
||||||
if (!VaporPressure.insert( weather_type(VaporPressureIt->first, -VaporPressureIt->second) ).second)
|
|
||||||
VaporPressure[VaporPressureIt->first] -= VaporPressureIt->second;
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0 // old version
|
|
||||||
inline FGPhysicalProperties& FGPhysicalProperties::operator -= (const FGPhysicalProperties& p)
|
|
||||||
{
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem >::const_iterator wind_iterator;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::const_iterator turbulence_iterator;
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::const_iterator scalar_iterator;
|
|
||||||
|
|
||||||
for (wind_iterator WindIt = p.Wind.begin();
|
|
||||||
WindIt != p.Wind.end();
|
|
||||||
WindIt++)
|
|
||||||
if (!Wind.insert( make_pair(WindIt->first, -WindIt->second) ).second) //when it's not inserted => it's already existing
|
|
||||||
Wind[WindIt->first] -= WindIt->second; //=> substract the value
|
|
||||||
|
|
||||||
for (turbulence_iterator TurbulenceIt = p.Turbulence.begin();
|
|
||||||
TurbulenceIt != p.Turbulence.end();
|
|
||||||
TurbulenceIt++)
|
|
||||||
if (!Turbulence.insert( make_pair(TurbulenceIt->first, -TurbulenceIt->second) ).second)
|
|
||||||
Turbulence[TurbulenceIt->first] -= TurbulenceIt->second;
|
|
||||||
|
|
||||||
for (scalar_iterator TemperatureIt = p.Temperature.begin();
|
|
||||||
TemperatureIt != p.Temperature.end();
|
|
||||||
TemperatureIt++)
|
|
||||||
if (!Temperature.insert( make_pair(TemperatureIt->first, -TemperatureIt->second) ).second)
|
|
||||||
Temperature[TemperatureIt->first] -= TemperatureIt->second;
|
|
||||||
|
|
||||||
AirPressure -= p.AirPressure.getValue();
|
|
||||||
|
|
||||||
for (scalar_iterator VaporPressureIt = p.VaporPressure.begin();
|
|
||||||
VaporPressureIt != p.VaporPressure.end();
|
|
||||||
VaporPressureIt++)
|
|
||||||
if (!VaporPressure.insert( make_pair(VaporPressureIt->first, -VaporPressureIt->second) ).second)
|
|
||||||
VaporPressure[VaporPressureIt->first] -= VaporPressureIt->second;
|
|
||||||
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
inline void FGPhysicalProperties::WindAt(sgVec3 ret, const WeatherPrecision a) const
|
|
||||||
{
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem>::const_iterator vector_iterator;
|
|
||||||
|
|
||||||
vector_iterator it = Wind.lower_bound(a);
|
|
||||||
vector_iterator it2 = it;
|
|
||||||
it--;
|
|
||||||
|
|
||||||
//now I've got it->alt < a < it2->alt so I can interpolate
|
|
||||||
sgSubVec3(ret, *it2->second.getValue(), *it->second.getValue());
|
|
||||||
sgScaleVec3(ret, (a - it2->first) / (it2->first - it->first));
|
|
||||||
sgAddVec3(ret, *it2->second.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void FGPhysicalProperties::TurbulenceAt(sgVec3 ret, const WeatherPrecision a) const
|
|
||||||
{
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::const_iterator vector_iterator;
|
|
||||||
|
|
||||||
vector_iterator it = Turbulence.lower_bound(a);
|
|
||||||
vector_iterator it2 = it;
|
|
||||||
it--;
|
|
||||||
|
|
||||||
//now I've got it->alt < a < it2->alt so I can interpolate
|
|
||||||
sgSubVec3(ret, *it2->second.getValue(), *it->second.getValue());
|
|
||||||
sgScaleVec3(ret, (a - it2->first) / (it2->first - it->first));
|
|
||||||
sgAddVec3(ret, *it2->second.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision FGPhysicalProperties::TemperatureAt(const WeatherPrecision a) const
|
|
||||||
{
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::const_iterator scalar_iterator;
|
|
||||||
|
|
||||||
scalar_iterator it = Temperature.lower_bound(a);
|
|
||||||
scalar_iterator it2 = it;
|
|
||||||
it--;
|
|
||||||
|
|
||||||
//now I've got it->alt < a < it2->alt so I can interpolate
|
|
||||||
return ( (it2->second - it->second)/(it2->first - it->first) ) * (a - it2->first) + it2->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
//inline WeatherPrecision FGPhysicalProperties::AirPressureAt(const WeatherPrecision x) const
|
|
||||||
//moved to FGPhysicalProperties.cpp as it got too complex to inline
|
|
||||||
|
|
||||||
inline WeatherPrecision FGPhysicalProperties::VaporPressureAt(const WeatherPrecision a) const
|
|
||||||
{
|
|
||||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::const_iterator scalar_iterator;
|
|
||||||
|
|
||||||
scalar_iterator it = VaporPressure.lower_bound(a);
|
|
||||||
scalar_iterator it2 = it;
|
|
||||||
it--;
|
|
||||||
|
|
||||||
//now I've got it->alt < a < it2->alt so I can interpolate
|
|
||||||
return ( (it2->second - it->second)/(it2->first - it->first) ) * (a - it2->first) + it2->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline FGPhysicalProperties operator * (FGPhysicalProperties a, const WeatherPrecision b)
|
|
||||||
{
|
|
||||||
return a *= b;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperties operator * (const WeatherPrecision b, FGPhysicalProperties a)
|
|
||||||
{
|
|
||||||
return a *= b;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperties operator + (FGPhysicalProperties a, const FGPhysicalProperties& b)
|
|
||||||
{
|
|
||||||
return a += b;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperties operator - (FGPhysicalProperties a, const FGPhysicalProperties& b)
|
|
||||||
{
|
|
||||||
return a -= b;
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGPhysicalProperties_H*/
|
|
||||||
|
|
|
@ -1,480 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGPhysicalProperties_bind.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 15.03.02
|
|
||||||
Called by: main program
|
|
||||||
|
|
||||||
-------- Copyright (C) 2002 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Initialice the FGPhysicalProperties struct to something sensible(?)
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
15.03.2002 Christian Mayer Created
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#include "FGPhysicalProperties.h"
|
|
||||||
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::getWind_x( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= Wind.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Wind.size() << " entries for wind, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGWindItem>::const_iterator it = Wind.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->second.x();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setWind_x( int number, WeatherPrecision x)
|
|
||||||
{
|
|
||||||
if (number >= Wind.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Wind.size() << " entries for wind, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGWindItem>::iterator it = Wind.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->second.x( x );
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::getWind_y( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= Wind.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Wind.size() << " entries for wind, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGWindItem>::const_iterator it = Wind.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->second.y();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setWind_y( int number, WeatherPrecision y)
|
|
||||||
{
|
|
||||||
if (number >= Wind.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Wind.size() << " entries for wind, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGWindItem>::iterator it = Wind.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->second.y( y );
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::getWind_z( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= Wind.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Wind.size() << " entries for wind, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGWindItem>::const_iterator it = Wind.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->second.z();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setWind_z( int number, WeatherPrecision z)
|
|
||||||
{
|
|
||||||
if (number >= Wind.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Wind.size() << " entries for wind, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGWindItem>::iterator it = Wind.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->second.z( z );
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::getWind_a( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= Wind.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Wind.size() << " entries for wind, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGWindItem>::const_iterator it = Wind.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setWind_a( int number, WeatherPrecision a)
|
|
||||||
{
|
|
||||||
if (number >= Wind.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Wind.size() << " entries for wind, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGWindItem>::iterator it = Wind.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::getTurbulence_x( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= Turbulence.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Turbulence.size() << " entries for Turbulence, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGTurbulenceItem>::const_iterator it = Turbulence.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->second.x();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setTurbulence_x( int number, WeatherPrecision x)
|
|
||||||
{
|
|
||||||
if (number >= Turbulence.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Turbulence.size() << " entries for Turbulence, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGTurbulenceItem>::iterator it = Turbulence.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->second.x( x );
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::getTurbulence_y( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= Turbulence.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Turbulence.size() << " entries for Turbulence, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGTurbulenceItem>::const_iterator it = Turbulence.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->second.y();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setTurbulence_y( int number, WeatherPrecision y)
|
|
||||||
{
|
|
||||||
if (number >= Turbulence.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Turbulence.size() << " entries for Turbulence, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGTurbulenceItem>::iterator it = Turbulence.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->second.y( y );
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::getTurbulence_z( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= Turbulence.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Turbulence.size() << " entries for Turbulence, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGTurbulenceItem>::const_iterator it = Turbulence.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->second.z();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setTurbulence_z( int number, WeatherPrecision z)
|
|
||||||
{
|
|
||||||
if (number >= Turbulence.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Turbulence.size() << " entries for Turbulence, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGTurbulenceItem>::iterator it = Turbulence.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->second.z( z );
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::getTurbulence_a( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= Turbulence.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Turbulence.size() << " entries for Turbulence, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGTurbulenceItem>::const_iterator it = Turbulence.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setTurbulence_a( int number, WeatherPrecision a)
|
|
||||||
{
|
|
||||||
if (number >= Turbulence.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Turbulence.size() << " entries for Turbulence, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,FGTurbulenceItem>::iterator it = Turbulence.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::getTemperature_x( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= Temperature.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Temperature.size() << " entries for Temperature, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,WeatherPrecision>::const_iterator it = Temperature.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setTemperature_x( int number, WeatherPrecision x)
|
|
||||||
{
|
|
||||||
if (number >= Temperature.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Temperature.size() << " entries for Temperature, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,WeatherPrecision>::iterator it = Temperature.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->second = x;
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::getTemperature_a( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= Temperature.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Temperature.size() << " entries for Temperature, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,WeatherPrecision>::const_iterator it = Temperature.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setTemperature_a( int number, WeatherPrecision a)
|
|
||||||
{
|
|
||||||
if (number >= Temperature.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Temperature.size() << " entries for Temperature, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,WeatherPrecision>::iterator it = Temperature.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->first;
|
|
||||||
}
|
|
||||||
WeatherPrecision FGPhysicalProperties::getVaporPressure_x( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= VaporPressure.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << VaporPressure.size() << " entries for VaporPressure, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,WeatherPrecision>::const_iterator it = VaporPressure.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setVaporPressure_x( int number, WeatherPrecision x)
|
|
||||||
{
|
|
||||||
if (number >= VaporPressure.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << Temperature.size() << " entries for VaporPressure, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,WeatherPrecision>::iterator it = VaporPressure.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->second = x;
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherPrecision FGPhysicalProperties::getVaporPressure_a( int number ) const
|
|
||||||
{
|
|
||||||
if (number >= VaporPressure.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << VaporPressure.size() << " entries for VaporPressure, but number " << number << " got requested!\n";
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,WeatherPrecision>::const_iterator it = VaporPressure.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGPhysicalProperties::setVaporPressure_a( int number, WeatherPrecision a)
|
|
||||||
{
|
|
||||||
if (number >= VaporPressure.size())
|
|
||||||
{
|
|
||||||
cerr << "Error: There are " << VaporPressure.size() << " entries for VaporPressure, but number " << number << " got requested!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
map<Altitude,WeatherPrecision>::iterator it = VaporPressure.begin();
|
|
||||||
|
|
||||||
while( number > 0)
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
number--;
|
|
||||||
}
|
|
||||||
|
|
||||||
it->first;
|
|
||||||
}
|
|
|
@ -1,71 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGPhysicalProperty.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
Called by: main program
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Initialice the FGPhysicalProperty struct to something sensible(?)
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
29.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
#include "FGPhysicalProperty.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/********************************** CODE ************************************/
|
|
||||||
/****************************************************************************/
|
|
||||||
FGPhysicalProperty::FGPhysicalProperty()
|
|
||||||
{
|
|
||||||
sgZeroVec3(Wind); //Wind vector
|
|
||||||
|
|
||||||
sgZeroVec3(Turbulence); //Turbulence vector
|
|
||||||
|
|
||||||
Temperature = FG_WEATHER_DEFAULT_TEMPERATURE; //a nice warm day
|
|
||||||
AirPressure = FG_WEATHER_DEFAULT_AIRPRESSURE; //mbar, that's ground level
|
|
||||||
VaporPressure = FG_WEATHER_DEFAULT_VAPORPRESSURE; //that gives about 50% relatvie humidity
|
|
||||||
}
|
|
||||||
|
|
||||||
FGPhysicalProperty::FGPhysicalProperty(const FGPhysicalProperties& p, const WeatherPrecision altitude)
|
|
||||||
{
|
|
||||||
p.WindAt(Wind, altitude);
|
|
||||||
p.TurbulenceAt(Turbulence, altitude);
|
|
||||||
Temperature = p.TemperatureAt(altitude);
|
|
||||||
AirPressure = p.AirPressureAt(altitude);
|
|
||||||
VaporPressure = p.VaporPressureAt(altitude);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,222 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGPhysicalProperty.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Define the simulated physical property of the weather in one point
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer Changed struct to class
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
30.06.1999 Christian Mayer STL portability
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGPhysicalProperty_H
|
|
||||||
#define FGPhysicalProperty_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_WINDOWS_H
|
|
||||||
# include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include <plib/sg.h>
|
|
||||||
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
#include "FGPhysicalProperties.h"
|
|
||||||
|
|
||||||
SG_USING_STD(vector);
|
|
||||||
SG_USING_NAMESPACE(std);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* used for output: */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGPhysicalProperty;
|
|
||||||
bool operator == (const FGPhysicalProperty& a, const FGPhysicalProperty& b); // p1 == p2?
|
|
||||||
|
|
||||||
class FGPhysicalProperty
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
protected:
|
|
||||||
public:
|
|
||||||
sgVec3 Wind; //Wind vector
|
|
||||||
sgVec3 Turbulence; //Turbulence vector
|
|
||||||
WeatherPrecision Temperature; //in deg. Kelvin (I *only* accept SI!)
|
|
||||||
WeatherPrecision AirPressure; //in Pascal (I *only* accept SI!)
|
|
||||||
WeatherPrecision VaporPressure; //in Pascal (I *only* accept SI!)
|
|
||||||
|
|
||||||
FGPhysicalProperty(); //consructor to fill it with FG standart weather
|
|
||||||
FGPhysicalProperty(const FGPhysicalProperties& p, const WeatherPrecision altitude);
|
|
||||||
|
|
||||||
//allow calculations for easier handling such as interpolating
|
|
||||||
FGPhysicalProperty& operator = ( const FGPhysicalProperty& p ); // assignment of a FGPhysicalProperty
|
|
||||||
FGPhysicalProperty& operator += ( const FGPhysicalProperty& p ); // incrementation by a FGPhysicalProperty
|
|
||||||
FGPhysicalProperty& operator -= ( const FGPhysicalProperty& p ); // decrementation by a FGPhysicalProperty
|
|
||||||
FGPhysicalProperty& operator *= ( const double d ); // multiplication by a constant
|
|
||||||
FGPhysicalProperty& operator /= ( const double d ); // division by a constant
|
|
||||||
|
|
||||||
friend FGPhysicalProperty operator - (const FGPhysicalProperty& p); // -p1
|
|
||||||
friend bool operator == (const FGPhysicalProperty& a, const FGPhysicalProperty& b); // p1 == p2?
|
|
||||||
};
|
|
||||||
|
|
||||||
class FGPhysicalProperty3D : public FGPhysicalProperty
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
protected:
|
|
||||||
public:
|
|
||||||
sgVec3 p; //position of the property (lat/lon/alt)
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef vector<FGPhysicalProperty> FGPhysicalPropertyVector;
|
|
||||||
typedef FGPhysicalPropertyVector::iterator FGPhysicalPropertyVectorIt;
|
|
||||||
typedef FGPhysicalPropertyVector::const_iterator FGPhysicalPropertyVectorConstIt;
|
|
||||||
|
|
||||||
typedef vector<FGPhysicalProperty3D> FGPhysicalProperty3DVector;
|
|
||||||
typedef FGPhysicalProperty3DVector::iterator FGPhysicalProperty3DVectorIt;
|
|
||||||
typedef FGPhysicalProperty3DVector::const_iterator FGPhysicalProperty3DVectorConstIt;
|
|
||||||
|
|
||||||
inline FGPhysicalProperty& FGPhysicalProperty::operator = ( const FGPhysicalProperty& p )
|
|
||||||
{
|
|
||||||
sgCopyVec3(Wind, p.Wind);
|
|
||||||
sgCopyVec3(Turbulence, p.Turbulence);
|
|
||||||
Temperature = p.Temperature;
|
|
||||||
AirPressure = p.AirPressure;
|
|
||||||
VaporPressure = p.VaporPressure;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperty& FGPhysicalProperty::operator += ( const FGPhysicalProperty& p )
|
|
||||||
{
|
|
||||||
sgAddVec3(Wind, p.Wind);
|
|
||||||
sgAddVec3(Turbulence, p.Turbulence);
|
|
||||||
Temperature += p.Temperature;
|
|
||||||
AirPressure += p.AirPressure;
|
|
||||||
VaporPressure += p.VaporPressure;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperty& FGPhysicalProperty::operator -= ( const FGPhysicalProperty& p )
|
|
||||||
{
|
|
||||||
sgSubVec3(Wind, p.Wind);
|
|
||||||
sgSubVec3(Turbulence, p.Turbulence);
|
|
||||||
Temperature -= p.Temperature;
|
|
||||||
AirPressure -= p.AirPressure;
|
|
||||||
VaporPressure -= p.VaporPressure;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperty& FGPhysicalProperty::operator *= ( const double d )
|
|
||||||
{
|
|
||||||
sgScaleVec3(Wind, d);
|
|
||||||
sgScaleVec3(Turbulence, d);
|
|
||||||
Temperature *= d;
|
|
||||||
AirPressure *= d;
|
|
||||||
VaporPressure *= d;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperty& FGPhysicalProperty::operator /= ( const double d )
|
|
||||||
{
|
|
||||||
sgScaleVec3(Wind, 1.0 / d);
|
|
||||||
sgScaleVec3(Turbulence, 1.0 / d);
|
|
||||||
Temperature /= d;
|
|
||||||
AirPressure /= d;
|
|
||||||
VaporPressure /= d;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperty operator - (const FGPhysicalProperty& p)
|
|
||||||
{
|
|
||||||
FGPhysicalProperty x;
|
|
||||||
sgNegateVec3(x.Wind, p.Wind);
|
|
||||||
sgNegateVec3(x.Turbulence, p.Turbulence);
|
|
||||||
x.Temperature = -p.Temperature;
|
|
||||||
x.AirPressure = -p.AirPressure;
|
|
||||||
x.VaporPressure = -p.VaporPressure;
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator == (const FGPhysicalProperty& a, const FGPhysicalProperty& b)
|
|
||||||
{
|
|
||||||
return (
|
|
||||||
sgEqualVec3(a.Wind, b.Wind) &&
|
|
||||||
sgEqualVec3(a.Turbulence, b.Turbulence) &&
|
|
||||||
(a.Temperature == b.Temperature) &&
|
|
||||||
(a.AirPressure == b.AirPressure) &&
|
|
||||||
(a.VaporPressure == b.VaporPressure));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator != (const FGPhysicalProperty& a, const FGPhysicalProperty& b)
|
|
||||||
{
|
|
||||||
return !(a == b);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperty operator + (const FGPhysicalProperty& a, const FGPhysicalProperty& b)
|
|
||||||
{
|
|
||||||
return FGPhysicalProperty(a) += b;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperty operator - (const FGPhysicalProperty& a, const FGPhysicalProperty& b)
|
|
||||||
{
|
|
||||||
return FGPhysicalProperty(a) -= b;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperty operator * (const FGPhysicalProperty& a, const WeatherPrecision b)
|
|
||||||
{
|
|
||||||
return FGPhysicalProperty(a) *= b;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperty operator * (const WeatherPrecision b, const FGPhysicalProperty& a)
|
|
||||||
{
|
|
||||||
return FGPhysicalProperty(a) *= b;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGPhysicalProperty operator / (const FGPhysicalProperty& a, const WeatherPrecision b)
|
|
||||||
{
|
|
||||||
return FGPhysicalProperty(a) *= (1.0/b);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGPhysicalProperty_H*/
|
|
|
@ -1,75 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGSnowRain.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Header for the rain/snow/hail/... class
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGSnowRain_H
|
|
||||||
#define FGSnowRain_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGWeatherFeature.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
enum SnowRainType
|
|
||||||
{
|
|
||||||
Rain,
|
|
||||||
Snow,
|
|
||||||
Hail,
|
|
||||||
|
|
||||||
usedRainSnowTypes
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGSnowRain:FGWeatherFeature
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
protected:
|
|
||||||
public:
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGSnowRain_H*/
|
|
|
@ -1,52 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGTemperatureItem.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
Called by: FGMicroWeather
|
|
||||||
|
|
||||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Operator< definition for the item
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGTemperatureItem.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/********************************** CODE ************************************/
|
|
||||||
/****************************************************************************/
|
|
||||||
bool operator<(const FGTemperatureItem& arg1, const FGTemperatureItem& arg2 )
|
|
||||||
{
|
|
||||||
return arg1.alt < arg2.alt;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,118 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGTemperatureItem.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Temperature item that is stored in the micro weather class
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
10.10.1999 Christian Mayer added mutable for gcc 2.95 portability
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGTemperatureItem_H
|
|
||||||
#define FGTemperatureItem_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
|
|
||||||
// for the case that mutable isn't supported:
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGTemperatureItem;
|
|
||||||
FGTemperatureItem operator-(const FGTemperatureItem& arg);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGTemperatureItem
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
mutable WeatherPrecision value;
|
|
||||||
WeatherPrecision alt;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
public:
|
|
||||||
|
|
||||||
FGTemperatureItem(const WeatherPrecision& a, const WeatherPrecision& v) {alt = a; value = v;}
|
|
||||||
FGTemperatureItem(const WeatherPrecision& v) {alt = 0.0; value = v;}
|
|
||||||
FGTemperatureItem() {alt = 0.0; value = (WeatherPrecision)FG_WEATHER_DEFAULT_TEMPERATURE;}
|
|
||||||
|
|
||||||
WeatherPrecision getValue() const { return value; };
|
|
||||||
WeatherPrecision getAlt() const { return alt; };
|
|
||||||
|
|
||||||
void setAlt (WeatherPrecision x) { alt = x; }
|
|
||||||
void setValue(WeatherPrecision x) { value = x; }
|
|
||||||
|
|
||||||
FGTemperatureItem& operator*= (const WeatherPrecision& arg);
|
|
||||||
FGTemperatureItem& operator+= (const FGTemperatureItem& arg);
|
|
||||||
FGTemperatureItem& operator-= (const FGTemperatureItem& arg);
|
|
||||||
|
|
||||||
friend bool operator<(const FGTemperatureItem& arg1, const FGTemperatureItem& arg2 );
|
|
||||||
friend FGTemperatureItem operator-(const FGTemperatureItem& arg);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
inline FGTemperatureItem& FGTemperatureItem::operator*= (const WeatherPrecision& arg)
|
|
||||||
{
|
|
||||||
value *= arg;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGTemperatureItem& FGTemperatureItem::operator+= (const FGTemperatureItem& arg)
|
|
||||||
{
|
|
||||||
value += arg.value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
inline FGTemperatureItem& FGTemperatureItem::operator-= (const FGTemperatureItem& arg)
|
|
||||||
{
|
|
||||||
value -= arg.value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline FGTemperatureItem operator-(const FGTemperatureItem& arg)
|
|
||||||
{
|
|
||||||
return FGTemperatureItem(arg.alt, -arg.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGTemperatureItem_H*/
|
|
|
@ -1,117 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGThunderstorm.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 02.11.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Function that calls other parts of fg when a lightning has happened
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
02.11.1999 Christian Mayer Created
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include <plib/sg.h>
|
|
||||||
|
|
||||||
#include "FGThunderstorm.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/********************************** CODE ************************************/
|
|
||||||
/****************************************************************************/
|
|
||||||
FGThunderstorm::FGThunderstorm(const float n, const float e, const float s, const float w, const float p, const unsigned int seed)
|
|
||||||
{
|
|
||||||
northBorder = n;
|
|
||||||
eastBorder = e;
|
|
||||||
southBorder = s;
|
|
||||||
westBorder = w;
|
|
||||||
|
|
||||||
lightningProbability = p;
|
|
||||||
currentProbability = 0.0;
|
|
||||||
|
|
||||||
switch(seed)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
//a seed of 0 means that I have to initialize the seed myself
|
|
||||||
srand( (unsigned)time( NULL ) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
//a seed of 1 means that I must not initialize the seed
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
//any other seed means that I have to initialize with that seed
|
|
||||||
srand( seed );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FGThunderstorm::~FGThunderstorm(void)
|
|
||||||
{
|
|
||||||
//I don't need to do anything
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGThunderstorm::update(const float dt)
|
|
||||||
{
|
|
||||||
//increase currentProbability by a value x that's 0.5 dt <= x <= 1.5 dt
|
|
||||||
currentProbability += dt * ( 0.5 - (float(rand())/RAND_MAX) );
|
|
||||||
|
|
||||||
if (currentProbability > lightningProbability)
|
|
||||||
{ //ok, I've got a lightning now
|
|
||||||
|
|
||||||
//figure out where the lightning is:
|
|
||||||
sgVec2 lightningPosition;
|
|
||||||
sgSetVec2(
|
|
||||||
lightningPosition,
|
|
||||||
southBorder + (northBorder - southBorder)*(float(rand())/RAND_MAX),
|
|
||||||
westBorder + (eastBorder - westBorder )*(float(rand())/RAND_MAX)
|
|
||||||
);
|
|
||||||
|
|
||||||
//call OpenGl:
|
|
||||||
/* ... */
|
|
||||||
|
|
||||||
//call Sound:
|
|
||||||
/* ... */
|
|
||||||
|
|
||||||
//call Radio module:
|
|
||||||
/* ... */
|
|
||||||
|
|
||||||
currentProbability = 0.0; //and begin again
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGThunderstorm.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 02.11.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Header for the thunderstom class
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
02.11.1999 Christian Mayer Created
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGThunderstorm_H
|
|
||||||
#define FGThunderstorm_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGThunderstorm
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
protected:
|
|
||||||
float northBorder;
|
|
||||||
float eastBorder;
|
|
||||||
float southBorder;
|
|
||||||
float westBorder;
|
|
||||||
|
|
||||||
float lightningProbability; //in lightnings per second
|
|
||||||
float currentProbability; //=0.0 directly after a lightning stroke and
|
|
||||||
//gets increased over the time until it's
|
|
||||||
//bigger than lightningProbability. When that
|
|
||||||
//happens we've got a new lightning
|
|
||||||
|
|
||||||
public:
|
|
||||||
FGThunderstorm(const float n, const float e, const float s, const float w, const float p, const unsigned int seed = 0);
|
|
||||||
~FGThunderstorm(void);
|
|
||||||
|
|
||||||
void update(const float dt);
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGThunderstorm_H*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGTurbulenceItem.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
Called by: FGMicroWeather
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Operator< definition for the item
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGTurbulenceItem.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/********************************** CODE ************************************/
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
|
@ -1,142 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGTurbulenceItem.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
turbulence item that gets stored in the micro weather class
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
21.12.1999 Christian Mayer Added a fix for compatibility to gcc 2.8 which
|
|
||||||
suggested by Oliver Delise
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGTurbulenceItem_H
|
|
||||||
#define FGTurbulenceItem_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_WINDOWS_H
|
|
||||||
# include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <plib/sg.h>
|
|
||||||
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGTurbulenceItem;
|
|
||||||
FGTurbulenceItem operator-(const FGTurbulenceItem& arg);
|
|
||||||
|
|
||||||
#if ( __GNU_C__ == 2 && __GNU_MAJOR__ < 9 )
|
|
||||||
# define const_sgVec3 const sgVec3
|
|
||||||
#else
|
|
||||||
# define const_sgVec3 const sgVec3&
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGTurbulenceItem
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
sgVec3 value;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
public:
|
|
||||||
FGTurbulenceItem(const_sgVec3 v) { sgCopyVec3(value, v);}
|
|
||||||
FGTurbulenceItem() { sgZeroVec3(value); }
|
|
||||||
|
|
||||||
void getValue(sgVec3 ret) const { sgCopyVec3(ret, value); };
|
|
||||||
const sgVec3* getValue(void) const { return &value; };
|
|
||||||
|
|
||||||
WeatherPrecision x(void) const { return value[0]; };
|
|
||||||
WeatherPrecision y(void) const { return value[1]; };
|
|
||||||
WeatherPrecision z(void) const { return value[2]; };
|
|
||||||
|
|
||||||
void x(const WeatherPrecision x) { value[0] = x; };
|
|
||||||
void y(const WeatherPrecision y) { value[1] = y; };
|
|
||||||
void z(const WeatherPrecision z) { value[2] = z; };
|
|
||||||
|
|
||||||
FGTurbulenceItem& operator*= (const WeatherPrecision arg);
|
|
||||||
FGTurbulenceItem& operator+= (const FGTurbulenceItem& arg);
|
|
||||||
FGTurbulenceItem& operator-= (const FGTurbulenceItem& arg);
|
|
||||||
|
|
||||||
friend FGTurbulenceItem operator-(const FGTurbulenceItem& arg);
|
|
||||||
};
|
|
||||||
|
|
||||||
inline FGTurbulenceItem& FGTurbulenceItem::operator*= (const WeatherPrecision arg)
|
|
||||||
{
|
|
||||||
sgScaleVec3(value, arg);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGTurbulenceItem& FGTurbulenceItem::operator+= (const FGTurbulenceItem& arg)
|
|
||||||
{
|
|
||||||
sgAddVec3(value, *arg.getValue());
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGTurbulenceItem& FGTurbulenceItem::operator-= (const FGTurbulenceItem& arg)
|
|
||||||
{
|
|
||||||
sgSubVec3(value, *arg.getValue());
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGTurbulenceItem operator-(const FGTurbulenceItem& arg)
|
|
||||||
{
|
|
||||||
sgVec3 temp;
|
|
||||||
|
|
||||||
sgNegateVec3(temp, *arg.getValue());
|
|
||||||
|
|
||||||
return FGTurbulenceItem(temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGTurbulenceItem_H*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGVaporPressureItem.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
Called by: FGMicroWeather
|
|
||||||
|
|
||||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Operator< definition for the item
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGVaporPressureItem.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/********************************** CODE ************************************/
|
|
||||||
/****************************************************************************/
|
|
||||||
bool operator<(const FGVaporPressureItem& arg1, const FGVaporPressureItem& arg2 )
|
|
||||||
{
|
|
||||||
return arg1.alt < arg2.alt;
|
|
||||||
}
|
|
|
@ -1,111 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGVaporPressureItem.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Vapor pressure item that is stored in the micro weather class
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
10.10.1999 Christian Mayer added mutable for gcc 2.95 portability
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGVaporPressureItem_H
|
|
||||||
#define FGVaporPressureItem_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
|
|
||||||
//for the case that mutable isn't supported:
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGVaporPressureItem;
|
|
||||||
FGVaporPressureItem operator-(const FGVaporPressureItem& arg);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGVaporPressureItem
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
mutable WeatherPrecision value;
|
|
||||||
WeatherPrecision alt;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
public:
|
|
||||||
|
|
||||||
FGVaporPressureItem(const WeatherPrecision& a, const WeatherPrecision& v) {alt = a; value = v;}
|
|
||||||
FGVaporPressureItem(const WeatherPrecision& v) {alt = 0.0; value = v;}
|
|
||||||
FGVaporPressureItem() {alt = 0.0; value = FG_WEATHER_DEFAULT_VAPORPRESSURE;}
|
|
||||||
|
|
||||||
WeatherPrecision getValue() const { return value; };
|
|
||||||
WeatherPrecision getAlt() const { return alt; };
|
|
||||||
|
|
||||||
FGVaporPressureItem& operator*= (const WeatherPrecision& arg);
|
|
||||||
FGVaporPressureItem& operator+= (const FGVaporPressureItem& arg);
|
|
||||||
FGVaporPressureItem& operator-= (const FGVaporPressureItem& arg);
|
|
||||||
|
|
||||||
friend bool operator<(const FGVaporPressureItem& arg1, const FGVaporPressureItem& arg2 );
|
|
||||||
friend FGVaporPressureItem operator-(const FGVaporPressureItem& arg);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
inline FGVaporPressureItem& FGVaporPressureItem::operator*= (const WeatherPrecision& arg)
|
|
||||||
{
|
|
||||||
value *= arg;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
inline FGVaporPressureItem& FGVaporPressureItem::operator+= (const FGVaporPressureItem& arg)
|
|
||||||
{
|
|
||||||
value += arg.value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGVaporPressureItem& FGVaporPressureItem::operator-= (const FGVaporPressureItem& arg)
|
|
||||||
{
|
|
||||||
value -= arg.value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGVaporPressureItem operator-(const FGVaporPressureItem& arg)
|
|
||||||
{
|
|
||||||
return FGVaporPressureItem(arg.alt, -arg.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGVaporPressureItem_H*/
|
|
|
@ -1,73 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGWeatherDefs.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
definitions uses in most weather classes
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGWeatherDefs_H
|
|
||||||
#define FGWeatherDefs_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
typedef double WeatherPrecision;
|
|
||||||
|
|
||||||
//set the minimum visibility to get a at least half way realistic weather
|
|
||||||
#define MINIMUM_WEATHER_VISIBILITY 10.0 /* metres */
|
|
||||||
#define DEFAULT_WEATHER_VISIBILITY 32000.0 /* metres */
|
|
||||||
//prefered way the database is working
|
|
||||||
#define PREFERED_WORKING_TYPE default_mode
|
|
||||||
// #define PREFERED_WORKING_TYPE use_internet
|
|
||||||
|
|
||||||
#define FG_WEATHER_DEFAULT_TEMPERATURE (15.0+273.16) /*15°C or 288.16°K*/
|
|
||||||
#define FG_WEATHER_DEFAULT_VAPORPRESSURE (0.0) /*in Pascal 1 Pa = N/m^2*/
|
|
||||||
#define FG_WEATHER_DEFAULT_AIRPRESSURE (1013.25*100.0) /*in Pascal 1 Pa = N/m^2*/
|
|
||||||
#define FG_WEATHER_DEFAULT_AIRDENSITY (1.22501) /*in kg/m^3*/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGWeatherDefs_H*/
|
|
|
@ -1,89 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGWeatherFeature.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Abstract class that every weather feature, such as wind layers, are derivated
|
|
||||||
from
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
30.06.1999 Christian Mayer STL portability
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGWeatherFeature_H
|
|
||||||
#define FGWeatherFeature_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
|
|
||||||
#include <plib/sg.h>
|
|
||||||
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
enum LayerType {
|
|
||||||
fgWind,
|
|
||||||
fgTurbulence,
|
|
||||||
fgTemperature,
|
|
||||||
fgAirDensity,
|
|
||||||
fgCloud,
|
|
||||||
fgRain
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGWeatherFeature
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
protected:
|
|
||||||
sgVec3 position; //middle of the feature in lat/lon/alt
|
|
||||||
WeatherPrecision minSize; //smalest size of the feature
|
|
||||||
//=> a disk is specifies
|
|
||||||
|
|
||||||
LayerType FeatureType;
|
|
||||||
|
|
||||||
public:
|
|
||||||
LayerType getFeature(void) const { return FeatureType; }
|
|
||||||
bool isFeature(const LayerType& f) const { return (f == FeatureType); }
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGWeatherFeature_H*/
|
|
|
@ -1,174 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGWeatherParse.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
Called by: FGMicroWeather
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Parse the weather that can be downloaded from
|
|
||||||
|
|
||||||
http://129.13.102.67/out/flight/yymmddhhdata.txt.gz
|
|
||||||
|
|
||||||
where yy stands for the year, mm for the month, dd for the day and hh for the
|
|
||||||
hour.
|
|
||||||
The columns are explained at
|
|
||||||
|
|
||||||
http://129.13.102.67/out/flight/kopf.txt
|
|
||||||
|
|
||||||
and a list of the stations can be found at
|
|
||||||
|
|
||||||
http://129.13.102.67/out/flight/wmoconv.txt.gz
|
|
||||||
|
|
||||||
Many thanks to Georg Mueller (Georg.Mueller@imk.fzk.de) of the
|
|
||||||
|
|
||||||
Institut fuer Meteorologie und Klimaforschung, Universitaet Karlsruhe
|
|
||||||
|
|
||||||
for makeking such a service aviable.
|
|
||||||
You can also visit his homepage at http://www.wetterzentrale.de
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
18.10.1999 Christian Mayer Created
|
|
||||||
14.12.1999 Christian Mayer minor internal changes
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include <simgear/constants.h>
|
|
||||||
|
|
||||||
#include "FGWeatherParse.h"
|
|
||||||
#include "FGWeatherUtils.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/********************************** CODE ************************************/
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
FGWeatherParse::FGWeatherParse()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
FGWeatherParse::~FGWeatherParse()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGWeatherParse::input(const char *file)
|
|
||||||
{
|
|
||||||
unsigned int nr = 0;
|
|
||||||
|
|
||||||
sg_gzifstream in;
|
|
||||||
|
|
||||||
cerr << "Parsing \"" << file << "\" for weather datas:\n";
|
|
||||||
|
|
||||||
in.open( file );
|
|
||||||
|
|
||||||
if (! in.is_open() )
|
|
||||||
{
|
|
||||||
cerr << "Couldn't find that file!\nExiting...\n";
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool skip = false;
|
|
||||||
while ( in )
|
|
||||||
{
|
|
||||||
entry temp;
|
|
||||||
|
|
||||||
in >> temp.year;
|
|
||||||
in >> temp.month;
|
|
||||||
in >> temp.day;
|
|
||||||
in >> temp.hour;
|
|
||||||
in >> temp.station_number;
|
|
||||||
in >> temp.lat;
|
|
||||||
in >> temp.lon;
|
|
||||||
in >> temp.x_wind;
|
|
||||||
in >> temp.y_wind;
|
|
||||||
in >> temp.temperature;
|
|
||||||
in >> temp.dewpoint;
|
|
||||||
in >> temp.airpressure;
|
|
||||||
in >> temp.airpressure_history[0];
|
|
||||||
in >> temp.airpressure_history[1];
|
|
||||||
in >> temp.airpressure_history[2];
|
|
||||||
in >> temp.airpressure_history[3];
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < weather_station.size(); i++)
|
|
||||||
{
|
|
||||||
if ((weather_station[i].lat == temp.lat) && (weather_station[i].lon == temp.lon))
|
|
||||||
{
|
|
||||||
// Two weatherstations are at the same positon
|
|
||||||
// => averageing both
|
|
||||||
|
|
||||||
// just taking care of the stuff that metters for us
|
|
||||||
weather_station[i].x_wind += temp.x_wind; weather_station[i].x_wind *= 0.5;
|
|
||||||
weather_station[i].y_wind += temp.y_wind; weather_station[i].y_wind *= 0.5;
|
|
||||||
weather_station[i].temperature += temp.temperature; weather_station[i].temperature *= 0.5;
|
|
||||||
weather_station[i].dewpoint += temp.dewpoint; weather_station[i].dewpoint *= 0.5;
|
|
||||||
weather_station[i].airpressure += temp.airpressure; weather_station[i].airpressure *= 0.5;
|
|
||||||
|
|
||||||
skip = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (skip == false)
|
|
||||||
weather_station.push_back( temp );
|
|
||||||
|
|
||||||
skip = false;
|
|
||||||
|
|
||||||
// output a point to ease the waiting
|
|
||||||
if ( ((nr++)%100) == 0 )
|
|
||||||
cerr << ".";
|
|
||||||
}
|
|
||||||
|
|
||||||
cerr << "\n" << nr << " stations read\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FGPhysicalProperties FGWeatherParse::getFGPhysicalProperties(const unsigned int nr) const
|
|
||||||
{
|
|
||||||
FGPhysicalProperties ret_val;
|
|
||||||
|
|
||||||
//chache this entry
|
|
||||||
entry this_entry = weather_station[nr];
|
|
||||||
|
|
||||||
ret_val.Wind[-1000.0] = FGWindItem(this_entry.x_wind, this_entry.y_wind, 0.0);
|
|
||||||
ret_val.Wind[10000.0] = FGWindItem(this_entry.x_wind, this_entry.y_wind, 0.0);
|
|
||||||
ret_val.Temperature[0.0] = Celsius( this_entry.temperature );
|
|
||||||
ret_val.AirPressure = FGAirPressureItem( this_entry.airpressure * 10.0 ); //*10 to go from 10 hPa to Pa
|
|
||||||
|
|
||||||
//I have the dewpoint and the temperature, so I can get the vapor pressure
|
|
||||||
ret_val.VaporPressure[-1000.0] = sat_vp( this_entry.dewpoint );
|
|
||||||
ret_val.VaporPressure[10000.0] = sat_vp( this_entry.dewpoint );
|
|
||||||
|
|
||||||
//I've got no ideas about clouds...
|
|
||||||
//ret_val.Clouds[0] = 0.0;
|
|
||||||
|
|
||||||
return ret_val;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FGWeatherParse::getPosition(const unsigned int nr, sgVec2 pos) const
|
|
||||||
{
|
|
||||||
//set the position of the station
|
|
||||||
sgSetVec2( pos, weather_station[nr].lat * SGD_DEGREES_TO_RADIANS, weather_station[nr].lon * SGD_DEGREES_TO_RADIANS );
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,134 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGWeatherParse.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Parse the weather that can be downloaded from
|
|
||||||
|
|
||||||
http://129.13.102.67/out/flight/yymmddhhdata.txt.gz
|
|
||||||
|
|
||||||
where yy stands for the year, mm for the month, dd for the day and hh for the
|
|
||||||
hour.
|
|
||||||
The columns are explained at
|
|
||||||
|
|
||||||
http://129.13.102.67/out/flight/kopf.txt
|
|
||||||
|
|
||||||
and a list of the stations can be found at
|
|
||||||
|
|
||||||
http://129.13.102.67/out/flight/wmoconv.txt.gz
|
|
||||||
|
|
||||||
Many thanks to Georg Mueller (Georg.Mueller@imk.fzk.de) of the
|
|
||||||
|
|
||||||
Institut fuer Meteorologie und Klimaforschung, Universitaet Karlsruhe
|
|
||||||
|
|
||||||
for makeking such a service aviable.
|
|
||||||
You can also visit his homepage at http://www.wetterzentrale.de
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
18.10.1999 Christian Mayer Created
|
|
||||||
14.12.1999 Christian Mayer minor internal changes
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGWeatherParse_H
|
|
||||||
#define FGWeatherParse_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include <simgear/misc/sgstream.hxx>
|
|
||||||
|
|
||||||
#include "FGPhysicalProperties.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
SG_USING_STD(vector);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGWeatherParse
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
struct entry;
|
|
||||||
|
|
||||||
private:
|
|
||||||
vector<entry> weather_station;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
public:
|
|
||||||
/************************************************************************/
|
|
||||||
/* A line (i.e. entry) in the data file looks like: */
|
|
||||||
/* yyyy mm dd hh XXXXX BBBBB LLLLLL UUUUU VVVVV TTTTT DDDDD PPPPP pppp */
|
|
||||||
/************************************************************************/
|
|
||||||
struct entry
|
|
||||||
{
|
|
||||||
int year; // The yyyy
|
|
||||||
int month; // The mm
|
|
||||||
int day; // The dd
|
|
||||||
int hour; // The hh
|
|
||||||
unsigned int station_number; // The XXXXX
|
|
||||||
float lat; // The BBBBBB negative = south
|
|
||||||
float lon; // The LLLLLLL negative = west
|
|
||||||
float x_wind; // The UUUUU negative = to the weat
|
|
||||||
float y_wind; // The VVVVV negative = to the south
|
|
||||||
float temperature; // The TTTTT in degC
|
|
||||||
float dewpoint; // The DDDDD in degC
|
|
||||||
float airpressure; // The PPPPP in hPa
|
|
||||||
float airpressure_history[4]; // The pppp in hPa
|
|
||||||
};
|
|
||||||
|
|
||||||
FGWeatherParse();
|
|
||||||
~FGWeatherParse();
|
|
||||||
|
|
||||||
void input(const char *file);
|
|
||||||
|
|
||||||
unsigned int stored_stations(void) const
|
|
||||||
{
|
|
||||||
return weather_station.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
entry getEntry(const unsigned int nr) const
|
|
||||||
{
|
|
||||||
return weather_station[nr];
|
|
||||||
}
|
|
||||||
|
|
||||||
FGPhysicalProperties getFGPhysicalProperties(const unsigned int nr) const;
|
|
||||||
void getPosition(const unsigned int nr, sgVec2 pos) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGWeatherParse_H*/
|
|
|
@ -1,224 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGWeatherUtils.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Utilities for the weather calculation like converting formulas
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
02.06.1999 Christian Mayer Created
|
|
||||||
08.06.1999 Christian Mayer Changed sat_vp
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
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
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGWeatherUtils_H
|
|
||||||
#define FGWeatherUtils_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/*assuming as given: */
|
|
||||||
/* */
|
|
||||||
/* t: temperature in °C */
|
|
||||||
/* p: preasure in mbar */
|
|
||||||
/* //abs_hum: absoloute humidity in g/m^3, */
|
|
||||||
/* act_vp: actual vapor pressure pascal */
|
|
||||||
/* */
|
|
||||||
/* Calculated vaues: */
|
|
||||||
/* //max_hum: maximum of humidity in g/m^3, */
|
|
||||||
/* sat_vp: saturated vapor pressure in pascal */
|
|
||||||
/* rel_hum: relative humidity in % */
|
|
||||||
/* dp: dew point in °C */
|
|
||||||
/* wb: approximate wetbulp in °C */
|
|
||||||
/* */
|
|
||||||
/* 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 */
|
|
||||||
/* 'normal' temperatures, I've kept it in °C */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#define SAT_VP_CONST1 610.483125
|
|
||||||
#define SAT_VP_CONST2 7.444072452
|
|
||||||
#define SAT_VP_CONST3 235.3120919
|
|
||||||
|
|
||||||
inline WeatherPrecision sat_vp(const WeatherPrecision temp)
|
|
||||||
{
|
|
||||||
//old:
|
|
||||||
//return 6.112 * pow( 10, (7.5*dp)/(237.7+dp) ); //in mbar
|
|
||||||
|
|
||||||
//new:
|
|
||||||
//advantages: return the result as SI unit pascal and the constants
|
|
||||||
//are choosen that the correct results are returned for 0°C, 20°C and
|
|
||||||
//100°C. By 100°C I'm now returning a preasure of 1013.25 hPa
|
|
||||||
return SAT_VP_CONST1 * pow( 10, (SAT_VP_CONST2*temp)/(SAT_VP_CONST3+temp) ); //in pascal
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision rel_hum(const WeatherPrecision act_vp, const WeatherPrecision sat_vp)
|
|
||||||
{
|
|
||||||
return (act_vp / sat_vp) * 100; //in %
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision dp(const WeatherPrecision sat_vp)
|
|
||||||
{
|
|
||||||
return (SAT_VP_CONST3*log10(sat_vp/SAT_VP_CONST1))/(SAT_VP_CONST2-log10(sat_vp/SAT_VP_CONST1)); //in °C
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision wb(const WeatherPrecision t, const WeatherPrecision p, const WeatherPrecision dp)
|
|
||||||
{
|
|
||||||
WeatherPrecision e = sat_vp(dp);
|
|
||||||
WeatherPrecision tcur, tcvp, peq, diff;
|
|
||||||
WeatherPrecision tmin, tmax;
|
|
||||||
|
|
||||||
if (t > dp)
|
|
||||||
{
|
|
||||||
tmax = t;
|
|
||||||
tmin = dp;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tmax = dp;
|
|
||||||
tmin = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
tcur=(tmax+tmin)/2;
|
|
||||||
tcvp=sat_vp(tcur);
|
|
||||||
|
|
||||||
peq = 0.000660*(1+0.00155*tcur)*p*(t-tcur);
|
|
||||||
|
|
||||||
diff = peq-tcvp+e;
|
|
||||||
|
|
||||||
if (fabs(diff) < 0.01)
|
|
||||||
return tcur; //in °C
|
|
||||||
|
|
||||||
if (diff < 0)
|
|
||||||
tmax=tcur;
|
|
||||||
else
|
|
||||||
tmin=tcur;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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.15; //Kelvin
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision Fahrenheit (const WeatherPrecision fahrenheit)
|
|
||||||
{
|
|
||||||
return (fahrenheit * 9.0 / 5.0) + 32.0 + 273.15; //Kelvin
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision Kelvin2Celsius (const WeatherPrecision kelvin)
|
|
||||||
{
|
|
||||||
return kelvin - 273.15; //Celsius
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision Kelvin2Fahrenheit (const WeatherPrecision kelvin)
|
|
||||||
{
|
|
||||||
return ((kelvin - 273.15) * 9.0 / 5.0) + 32.0; //Fahrenheit
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision Celsius2Fahrenheit (const WeatherPrecision celsius)
|
|
||||||
{
|
|
||||||
return (celsius * 9.0 / 5.0) + 32.0; //Fahrenheit
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision Fahrenheit2Celsius (const WeatherPrecision fahrenheit)
|
|
||||||
{
|
|
||||||
return (fahrenheit - 32.0) * 5.0 / 9.0; //Celsius
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision Torr2Pascal (const WeatherPrecision torr)
|
|
||||||
{
|
|
||||||
return (101325.0/760.0)*torr; //Pascal
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision Rankine2Kelvin (const WeatherPrecision Rankine)
|
|
||||||
{
|
|
||||||
return (5.0 / 9.0) * Rankine; //Kelvin
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision JSBsim2SIdensity (const WeatherPrecision JSBsim)
|
|
||||||
{
|
|
||||||
return JSBsim / 0.0019403203; //kg / cubic metres
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision psf2Pascal (const WeatherPrecision psf)
|
|
||||||
{
|
|
||||||
return psf / 0.020885434; //lbs / square foot (used in JSBsim)
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision Kelvin2Rankine (const WeatherPrecision kelvin)
|
|
||||||
{
|
|
||||||
return (9.0 / 5.0) * kelvin; //Rankine (used in JSBsim)
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision SIdensity2JSBsim (const WeatherPrecision SIdensity)
|
|
||||||
{
|
|
||||||
return 0.0019403203 * SIdensity; //slug / cubic feet (used in JSBsim)
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WeatherPrecision Pascal2psf (const WeatherPrecision Pascal)
|
|
||||||
{
|
|
||||||
return 0.020885434 * Pascal; //lbs / square feet (used in JSBsim)
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGWeatherUtils_H*/
|
|
|
@ -1,67 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGWeatherVectorWrap.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
make a wraper for an sgVec2 vector so that it can be used in a STL container
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
18.10.1999 Christian Mayer Created
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
21.12.1999 Christian Mayer Added a fix for compatibility to gcc 2.8 which
|
|
||||||
suggested by Oliver Delise
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGWeatherVectorWrap_H
|
|
||||||
#define FGWeatherVectorWrap_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include <sg.h>
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#if ( __GNU_C__ == 2 && __GNU_MAJOR__ < 9 )
|
|
||||||
# define const_sgVec2 const sgVec2
|
|
||||||
#else
|
|
||||||
# define const_sgVec2 const sgVec2&
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct sgVec2Wrap
|
|
||||||
{
|
|
||||||
sgVec2 p;
|
|
||||||
|
|
||||||
sgVec2Wrap();
|
|
||||||
sgVec2Wrap( const_sgVec2 src ) { sgCopyVec2( p, src ); }
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*FGWeatherVectorWrap_H*/
|
|
|
@ -1,50 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Module: FGWindItem.cpp
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
Called by: FGMicroWeather
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Operator< definition for the item
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
#include "FGWindItem.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/********************************** CODE ************************************/
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
|
@ -1,142 +0,0 @@
|
||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Header: FGWindItem.h
|
|
||||||
Author: Christian Mayer
|
|
||||||
Date started: 28.05.99
|
|
||||||
|
|
||||||
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.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., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
FUNCTIONAL DESCRIPTION
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
wind item that gets stored in the micro weather class
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
28.05.1999 Christian Mayer Created
|
|
||||||
16.06.1999 Durk Talsma Portability for Linux
|
|
||||||
20.06.1999 Christian Mayer added lots of consts
|
|
||||||
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
|
|
||||||
suggestion
|
|
||||||
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
|
|
||||||
and lots of wee code cleaning
|
|
||||||
21.12.1999 Christian Mayer Added a fix for compatibility to gcc 2.8 which
|
|
||||||
suggested by Oliver Delise
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* SENTRY */
|
|
||||||
/****************************************************************************/
|
|
||||||
#ifndef FGWindItem_H
|
|
||||||
#define FGWindItem_H
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* INCLUDES */
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_WINDOWS_H
|
|
||||||
# include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <plib/sg.h>
|
|
||||||
|
|
||||||
#include "FGWeatherDefs.h"
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* DEFINES */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGWindItem;
|
|
||||||
FGWindItem operator-(const FGWindItem& arg);
|
|
||||||
|
|
||||||
#if ( __GNU_C__ == 2 && __GNU_MAJOR__ < 9 )
|
|
||||||
# define const_sgVec3 const sgVec3
|
|
||||||
#else
|
|
||||||
# define const_sgVec3 const sgVec3&
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* CLASS DECLARATION */
|
|
||||||
/****************************************************************************/
|
|
||||||
class FGWindItem
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
sgVec3 value;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
public:
|
|
||||||
|
|
||||||
FGWindItem(const_sgVec3 v) { sgCopyVec3(value, v); }
|
|
||||||
FGWindItem(const WeatherPrecision x, const WeatherPrecision y, const WeatherPrecision z)
|
|
||||||
{ sgSetVec3 (value, x, y, z); }
|
|
||||||
FGWindItem() { sgZeroVec3(value); }
|
|
||||||
|
|
||||||
void getValue(sgVec3 ret) const { sgCopyVec3(ret, value); };
|
|
||||||
const sgVec3* getValue(void) const { return &value; };
|
|
||||||
|
|
||||||
WeatherPrecision x(void) const { return value[0]; };
|
|
||||||
WeatherPrecision y(void) const { return value[1]; };
|
|
||||||
WeatherPrecision z(void) const { return value[2]; };
|
|
||||||
|
|
||||||
void x(const WeatherPrecision x) { value[0] = x; };
|
|
||||||
void y(const WeatherPrecision y) { value[1] = y; };
|
|
||||||
void z(const WeatherPrecision z) { value[2] = z; };
|
|
||||||
|
|
||||||
FGWindItem& operator*= (const WeatherPrecision arg);
|
|
||||||
FGWindItem& operator+= (const FGWindItem& arg);
|
|
||||||
FGWindItem& operator-= (const FGWindItem& arg);
|
|
||||||
|
|
||||||
friend FGWindItem operator-(const FGWindItem& arg);
|
|
||||||
};
|
|
||||||
|
|
||||||
inline FGWindItem& FGWindItem::operator*= (const WeatherPrecision arg)
|
|
||||||
{
|
|
||||||
sgScaleVec3(value, arg);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGWindItem& FGWindItem::operator+= (const FGWindItem& arg)
|
|
||||||
{
|
|
||||||
sgAddVec3(value, *arg.getValue());
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline FGWindItem& FGWindItem::operator-= (const FGWindItem& arg)
|
|
||||||
{
|
|
||||||
sgSubVec3(value, *arg.getValue());
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline FGWindItem operator-(const FGWindItem& arg)
|
|
||||||
{
|
|
||||||
sgVec3 temp;
|
|
||||||
|
|
||||||
sgNegateVec3(temp, *arg.getValue());
|
|
||||||
|
|
||||||
return FGWindItem(temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
#endif /*FGWindItem_H*/
|
|
|
@ -1,22 +0,0 @@
|
||||||
noinst_LIBRARIES = libWeatherCM.a
|
|
||||||
|
|
||||||
libWeatherCM_a_SOURCES = \
|
|
||||||
FGAirPressureItem.cpp FGAirPressureItem.h \
|
|
||||||
FGCloud.h FGCloudItem.cpp FGCloudItem.h \
|
|
||||||
FGLocalWeatherDatabase.cpp FGLocalWeatherDatabase.h \
|
|
||||||
FGPhysicalProperties.cpp FGPhysicalProperties.h \
|
|
||||||
FGPhysicalProperties_bind.cpp \
|
|
||||||
FGPhysicalProperty.cpp FGPhysicalProperty.h \
|
|
||||||
FGSnowRain.h \
|
|
||||||
FGTemperatureItem.cpp FGTemperatureItem.h \
|
|
||||||
FGThunderstorm.cpp FGThunderstorm.h \
|
|
||||||
FGTurbulenceItem.cpp FGTurbulenceItem.h \
|
|
||||||
FGVaporPressureItem.cpp FGVaporPressureItem.h \
|
|
||||||
FGWeatherDefs.h FGWeatherFeature.h FGWeatherUtils.h \
|
|
||||||
FGWeatherParse.cpp FGWeatherParse.h \
|
|
||||||
FGWeatherVectorWrap.h \
|
|
||||||
FGWindItem.cpp FGWindItem.h \
|
|
||||||
linintp2.cpp linintp2.h \
|
|
||||||
sphrintp.cpp sphrintp.h
|
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src
|
|
|
@ -1,212 +0,0 @@
|
||||||
The formula p(x) for calculating the air pressure at a given altitude
|
|
||||||
---------------------------------------------------------------------
|
|
||||||
|
|
||||||
Well known is the baromertic(?) formula
|
|
||||||
|
|
||||||
rho0
|
|
||||||
------ * g * x
|
|
||||||
p0
|
|
||||||
p(x) = p0 * e
|
|
||||||
|
|
||||||
with p0 being the airpressure and rho0 being the air density at an altitude of
|
|
||||||
0 metres above sea level and g being the gravity constant of 9.81 m/sq. sec
|
|
||||||
|
|
||||||
This formula can easily be derivated when you know, that:
|
|
||||||
|
|
||||||
* the pressure difference is
|
|
||||||
|
|
||||||
dp = - rho * g * dx
|
|
||||||
|
|
||||||
* Boyle-Mariotte says:
|
|
||||||
|
|
||||||
p0 : p = rho0 : rho
|
|
||||||
|
|
||||||
Combinig the terms and changing them around I get:
|
|
||||||
|
|
||||||
dp [ rho0 ]
|
|
||||||
-- = - rho * g = - [ ------ * p(x) ] * g
|
|
||||||
dx [ p0 ]
|
|
||||||
|
|
||||||
rho0
|
|
||||||
p'(x) = - ------ * p(x) * g
|
|
||||||
p0
|
|
||||||
|
|
||||||
Solving that differential equation and knowing that p(0) = p0 I get:
|
|
||||||
|
|
||||||
rho0
|
|
||||||
- ------ * g * x
|
|
||||||
p0
|
|
||||||
p(x) = p0 * e
|
|
||||||
|
|
||||||
q.e.d.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
The problem with that equation is that it doesn't take different temperatures
|
|
||||||
at different altitudes into account. And the inaccuracies due to it are huge.
|
|
||||||
That's why this formula is only used in very low altitudes.
|
|
||||||
|
|
||||||
So to get a usefull formula for FlightGear I need to extend it. And as I'm
|
|
||||||
already 'recreating' that formula I'm taking the change in g into account, too.
|
|
||||||
This doesn't make such a dramatic difference to the result as the inclusion of
|
|
||||||
temperature change does, but it doesn't complicate the final formula too much.
|
|
||||||
|
|
||||||
So I get three formulas that I'm combining in the end:
|
|
||||||
|
|
||||||
* the change of g with the altitude:
|
|
||||||
|
|
||||||
G * m
|
|
||||||
g(x) = -----------
|
|
||||||
(x + r)^2
|
|
||||||
G is the universal gravity constant(?) and is 6.673e-11 m^3 kg^-1 s^-2
|
|
||||||
m is the mass of the earth and is 5.977e24 kg
|
|
||||||
r is the radius of the earth and is 6368 km
|
|
||||||
|
|
||||||
* The pressure difference stays the same:
|
|
||||||
|
|
||||||
dp = - rho * g(x) * dx
|
|
||||||
|
|
||||||
* If I combine Boyle-Mariotte with Gay-Lussac I get:
|
|
||||||
|
|
||||||
rho0 * T0 p
|
|
||||||
rho = ----------- * ---
|
|
||||||
p0 T
|
|
||||||
|
|
||||||
Combining the terms again I get this time:
|
|
||||||
|
|
||||||
dp [ rho0 * T0 p(x) ]
|
|
||||||
-- = - rho * g(x) = - [ ----------- * ------ ] * g(x)
|
|
||||||
dx [ p0 T(x) ]
|
|
||||||
|
|
||||||
rho0 * T0 p(x) * g(x)
|
|
||||||
p'(x) = - ----------- * -------------
|
|
||||||
p0 T(x)
|
|
||||||
|
|
||||||
This DE isn't that easy to solve as the one above, it by looking into the right
|
|
||||||
books you'll see the general solution for:
|
|
||||||
|
|
||||||
y' + f(x)*y = 0
|
|
||||||
|
|
||||||
is
|
|
||||||
x
|
|
||||||
/\
|
|
||||||
- | f(x) dx
|
|
||||||
\/
|
|
||||||
n
|
|
||||||
y = m * e
|
|
||||||
|
|
||||||
and P(m,n) will be a point on the graph.
|
|
||||||
|
|
||||||
For q = n = 0 metres altitude we get y = m. As y is p(x) we know that m has to
|
|
||||||
be p0.
|
|
||||||
|
|
||||||
So our final formuala is
|
|
||||||
|
|
||||||
ho0 * T0 g(x)
|
|
||||||
f1(x) = ----------- * ------
|
|
||||||
p0 T(x)
|
|
||||||
|
|
||||||
|
|
||||||
x x
|
|
||||||
/\ /\
|
|
||||||
- | f1(x) dx | f(x) dx
|
|
||||||
\/ \/
|
|
||||||
0 0 F(x) - F(0)
|
|
||||||
p(x) = p0 * e = p0 * e = p0 * e
|
|
||||||
|
|
||||||
The only disturbing thing we've got left is the integral. Luckily there is a
|
|
||||||
great service at http://integrals.wolfram.com/ that helps me doing it :-)
|
|
||||||
|
|
||||||
But the f(x) is still too general so I'm substituting:
|
|
||||||
|
|
||||||
rho0 * T0 * G * m
|
|
||||||
f(x) = - -----------------------
|
|
||||||
p0 * (x + r)^2 * T(x)
|
|
||||||
|
|
||||||
but even that isn't good enough. But as I'm linearily interpolating between
|
|
||||||
two different temperatures I can say that T(x) = a*x + b for the x inbetween
|
|
||||||
two different stored temperatures. So I just need to integrate every pice
|
|
||||||
independandly. But anyway, I get:
|
|
||||||
|
|
||||||
rho0 * T0 * G * m
|
|
||||||
f(x) = - ------------------------------
|
|
||||||
p0 * (x + r)^2 * (a * x + b)
|
|
||||||
|
|
||||||
Integrating that I get:
|
|
||||||
|
|
||||||
rho0 * T0 * G * m [ 1
|
|
||||||
F(x) = - ------------------- * [ ------------------------ -
|
|
||||||
p0 [ (-b + a * r) * (r + x)
|
|
||||||
|
|
||||||
|
|
||||||
a * log|r + x| a * log|b + a * x| ]
|
|
||||||
---------------- + -------------------- ]
|
|
||||||
(b - a * r)^2 (b - a * r)^2 ]
|
|
||||||
|
|
||||||
To lower the computional cost I can transfere the equation.
|
|
||||||
|
|
||||||
* I'm defining
|
|
||||||
|
|
||||||
rho0 * T0 * G * m
|
|
||||||
factor = - -------------------
|
|
||||||
p0
|
|
||||||
1
|
|
||||||
c = --------------
|
|
||||||
(-b + a * r)
|
|
||||||
|
|
||||||
* now I can write
|
|
||||||
|
|
||||||
[ c ]
|
|
||||||
F(x) = factor * [ --------- - a * c * c * [log|r + x| + log|b + a * x|] ]
|
|
||||||
[ (r + x) ]
|
|
||||||
|
|
||||||
* and simplyfy it to
|
|
||||||
|
|
||||||
[ 1 ]
|
|
||||||
F(x) = factor * c * [ --------- - a * c * log|(r + x) * (b + a * x)| ]
|
|
||||||
[ (r + x) ]
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
The following table shows quite nicely how accurate my formula is:
|
|
||||||
|
|
||||||
Altitude[m] | Airpressure [hPa] | Error [%]
|
|
||||||
| Official | My formula |
|
|
||||||
------------+---------------+---------------+---------------
|
|
||||||
-200 | 1037.51 | 1037.24 | 0.0260
|
|
||||||
-100 | 1025.32 | 1025.19 | 0.0127
|
|
||||||
0 | 1013.25 | 1013.25 | 0.0
|
|
||||||
500 | 954.59 | 955.224 | 0.0664
|
|
||||||
1000 | 898.70 | 899.912 | 0.1349
|
|
||||||
2000 | 794.88 | 797.042 | 0.2720
|
|
||||||
3000 | 700.99 | 703.885 | 0.4130
|
|
||||||
4000 | 616.28 | 619.727 | 0.5593
|
|
||||||
5000 | 540.07 | 543.89 | 0.7073
|
|
||||||
6000 | 471.67 | 475.731 | 0.8610
|
|
||||||
7000 | 410.46 | 414.643 | 1.0191
|
|
||||||
8000 | 355.84 | 360.054 | 1.1842
|
|
||||||
9000 | 307.27 | 311.422 | 1.3513
|
|
||||||
10000 | 264.21 | 268.238 | 1.5245
|
|
||||||
20000 | 54.670/55.3 | 55.7971 | 2.0616/0.8989
|
|
||||||
30000 | 11.8 | 11.3149 | 1.5441
|
|
||||||
40000 | 3.0 | 2.74665 | 18.9703
|
|
||||||
50000 | 0.88 | 0.753043 | 41.9183
|
|
||||||
60000 | 0.257 | 0.221907 | 57.9802
|
|
||||||
70000 | 0.0602 | 0.0530785 | 61.9153
|
|
||||||
80000 | 0.0101 | 0.00905461 | 51.5725
|
|
||||||
100000 | 2.14e-4 | 2.03984e-4 | 5.5131
|
|
||||||
|
|
||||||
The official values are from the CINA atmosphere which assumes a air pressure
|
|
||||||
of 1013.25 hPa and a temperature of 15 degC at sea level and a temperature
|
|
||||||
gradient of -6.5 deg/km. The CINA atmosphere gives only values for altiudes
|
|
||||||
up to 20 km. The values for 20 km and above are from the 1959 ARDC atmosphere.
|
|
||||||
That's why I've got two values at 20000 metres.
|
|
||||||
The temperature changes dramtically in the altitudes over 20 km which I didn't
|
|
||||||
take care of in my calculations which explains the huge errors at that altitude
|
|
||||||
range. But you can see nicely that the values are at least quite close to the
|
|
||||||
official values.
|
|
||||||
Using a better temperature model for the altitudes above 20 km should
|
|
||||||
dramatically increase the accuracy there.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,549 +0,0 @@
|
||||||
/*
|
|
||||||
WARNING - Do not remove this header.
|
|
||||||
|
|
||||||
This code is a templated version of the 'magic-software' spherical
|
|
||||||
interpolation code by Dave Eberly. The original (un-hacked) code can be
|
|
||||||
obtained from here: http://www.magic-software.com/gr_appr.htm
|
|
||||||
This code is derived from linintp2.h/cpp and sphrintp.h/cpp.
|
|
||||||
|
|
||||||
Dave Eberly says that the conditions for use are:
|
|
||||||
|
|
||||||
* You may distribute the original source code to others at no charge.
|
|
||||||
|
|
||||||
* You may modify the original source code and distribute it to others at
|
|
||||||
no charge. The modified code must be documented to indicate that it is
|
|
||||||
not part of the original package.
|
|
||||||
|
|
||||||
* You may use this code for non-commercial purposes. You may also
|
|
||||||
incorporate this code into commercial packages. However, you may not
|
|
||||||
sell any of your source code which contains my original and/or modified
|
|
||||||
source code. In such a case, you need to factor out my code and freely
|
|
||||||
distribute it.
|
|
||||||
|
|
||||||
* The original code comes with absolutely no warranty and no guarantee is
|
|
||||||
made that the code is bug-free.
|
|
||||||
|
|
||||||
This does not seem incompatible with GPL - so this modified version
|
|
||||||
is hereby placed under GPL along with the rest of FlightGear.
|
|
||||||
|
|
||||||
Christian Mayer
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
#include STL_IOSTREAM
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
|
||||||
|
|
||||||
#include <float.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "linintp2.h"
|
|
||||||
|
|
||||||
SG_USING_NAMESPACE(std);
|
|
||||||
SG_USING_STD(cout);
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
mgcLinInterp2D::mgcLinInterp2D (int _numPoints, double* x, double* y,
|
|
||||||
unsigned int* _f)
|
|
||||||
{
|
|
||||||
if ( (numPoints = _numPoints) < 3 )
|
|
||||||
{
|
|
||||||
point = 0;
|
|
||||||
edge = 0;
|
|
||||||
triangle = 0;
|
|
||||||
numTriangles = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 20%] allocating memory");
|
|
||||||
|
|
||||||
point = new double*[numPoints];
|
|
||||||
tmppoint = new double*[numPoints+3];
|
|
||||||
f = new unsigned int[numPoints];
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < numPoints; i++)
|
|
||||||
point[i] = new double[2];
|
|
||||||
for (i = 0; i < numPoints+3; i++)
|
|
||||||
tmppoint[i] = new double[2];
|
|
||||||
for (i = 0; i < numPoints; i++)
|
|
||||||
{
|
|
||||||
point[i][0] = tmppoint[i][0] = x[i];
|
|
||||||
point[i][1] = tmppoint[i][1] = y[i];
|
|
||||||
|
|
||||||
f[i] = _f[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 30%] creating delaunay diagram");
|
|
||||||
|
|
||||||
Delaunay2D();
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
mgcLinInterp2D::~mgcLinInterp2D ()
|
|
||||||
{
|
|
||||||
if ( numPoints < 3 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if ( point )
|
|
||||||
{
|
|
||||||
for (i = 0; i < numPoints; i++)
|
|
||||||
delete[] point[i];
|
|
||||||
delete[] point;
|
|
||||||
}
|
|
||||||
if ( tmppoint )
|
|
||||||
{
|
|
||||||
for (i = 0; i < numPoints+3; i++)
|
|
||||||
delete[] tmppoint[i];
|
|
||||||
delete[] tmppoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete[] f;
|
|
||||||
delete[] edge;
|
|
||||||
delete[] triangle;
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
void mgcLinInterp2D::ComputeBarycenter (Vertex& v0, Vertex& v1, Vertex& v2,
|
|
||||||
Vertex& ver, double c[3])
|
|
||||||
{
|
|
||||||
double a0 = v0.x-v2.x;
|
|
||||||
double b0 = v0.y-v2.y;
|
|
||||||
double a1 = v1.x-v2.x;
|
|
||||||
double b1 = v1.y-v2.y;
|
|
||||||
double a2 = ver.x-v2.x;
|
|
||||||
double b2 = ver.y-v2.y;
|
|
||||||
|
|
||||||
double m00 = a0*a0+b0*b0;
|
|
||||||
double m01 = a0*a1+b0*b1;
|
|
||||||
double m11 = a1*a1+b1*b1;
|
|
||||||
double r0 = a2*a0+b2*b0;
|
|
||||||
double r1 = a2*a1+b2*b1;
|
|
||||||
double det = m00*m11-m01*m01;
|
|
||||||
|
|
||||||
c[0] = (m11*r0-m01*r1)/det;
|
|
||||||
c[1] = (m00*r1-m01*r0)/det;
|
|
||||||
c[2] = 1-c[0]-c[1];
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
int mgcLinInterp2D::InTriangle (Vertex& v0, Vertex& v1, Vertex& v2,
|
|
||||||
Vertex& test)
|
|
||||||
{
|
|
||||||
const double eps = 1e-08;
|
|
||||||
double tx, ty, nx, ny;
|
|
||||||
|
|
||||||
// test against normal to first edge
|
|
||||||
tx = test.x - v0.x;
|
|
||||||
ty = test.y - v0.y;
|
|
||||||
nx = v0.y - v1.y;
|
|
||||||
ny = v1.x - v0.x;
|
|
||||||
if ( tx*nx + ty*ny < -eps )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// test against normal to second edge
|
|
||||||
tx = test.x - v1.x;
|
|
||||||
ty = test.y - v1.y;
|
|
||||||
nx = v1.y - v2.y;
|
|
||||||
ny = v2.x - v1.x;
|
|
||||||
if ( tx*nx + ty*ny < -eps )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// test against normal to third edge
|
|
||||||
tx = test.x - v2.x;
|
|
||||||
ty = test.y - v2.y;
|
|
||||||
nx = v2.y - v0.y;
|
|
||||||
ny = v0.x - v2.x;
|
|
||||||
if ( tx*nx + ty*ny < -eps )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
int mgcLinInterp2D::Evaluate (double x, double y, EvaluateData& F)
|
|
||||||
{
|
|
||||||
Vertex ver = { x, y };
|
|
||||||
// determine which triangle contains the target point
|
|
||||||
|
|
||||||
int i;
|
|
||||||
Vertex v0, v1, v2;
|
|
||||||
for (i = 0; i < numTriangles; i++)
|
|
||||||
{
|
|
||||||
Triangle& t = triangle[i];
|
|
||||||
v0.x = point[t.vertex[0]][0];
|
|
||||||
v0.y = point[t.vertex[0]][1];
|
|
||||||
v1.x = point[t.vertex[1]][0];
|
|
||||||
v1.y = point[t.vertex[1]][1];
|
|
||||||
v2.x = point[t.vertex[2]][0];
|
|
||||||
v2.y = point[t.vertex[2]][1];
|
|
||||||
|
|
||||||
if ( InTriangle(v0,v1,v2,ver) )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( i == numTriangles ) // point is outside interpolation region
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Triangle& t = triangle[i]; // (x,y) is in this triangle
|
|
||||||
|
|
||||||
// compute barycentric coordinates with respect to subtriangle
|
|
||||||
double bary[3];
|
|
||||||
ComputeBarycenter(v0,v1,v2,ver,bary);
|
|
||||||
|
|
||||||
// compute barycentric combination of function values at vertices
|
|
||||||
F.index[0] = f[t.vertex[0]];
|
|
||||||
F.index[1] = f[t.vertex[1]];
|
|
||||||
F.index[2] = f[t.vertex[2]];
|
|
||||||
F.percentage[0] = bary[0];
|
|
||||||
F.percentage[1] = bary[1];
|
|
||||||
F.percentage[2] = bary[2];
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
int mgcLinInterp2D::Delaunay2D ()
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
const double EPSILON = 1e-12;
|
|
||||||
const int TSIZE = 75;
|
|
||||||
const double RANGE = 10.0;
|
|
||||||
|
|
||||||
xmin = tmppoint[0][0];
|
|
||||||
xmax = xmin;
|
|
||||||
ymin = tmppoint[0][1];
|
|
||||||
ymax = ymin;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < numPoints; i++)
|
|
||||||
{
|
|
||||||
double value = tmppoint[i][0];
|
|
||||||
if ( xmax < value )
|
|
||||||
xmax = value;
|
|
||||||
if ( xmin > value )
|
|
||||||
xmin = value;
|
|
||||||
|
|
||||||
value = tmppoint[i][1];
|
|
||||||
if ( ymax < value )
|
|
||||||
ymax = value;
|
|
||||||
if ( ymin > value )
|
|
||||||
ymin = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
double xrange = xmax-xmin, yrange = ymax-ymin;
|
|
||||||
double maxrange = xrange;
|
|
||||||
if ( maxrange < yrange )
|
|
||||||
maxrange = yrange;
|
|
||||||
|
|
||||||
// need to scale the data later to do a correct triangle count
|
|
||||||
double maxrange2 = maxrange*maxrange;
|
|
||||||
|
|
||||||
// tweak the points by very small random numbers
|
|
||||||
double bgs = EPSILON*maxrange;
|
|
||||||
srand(367);
|
|
||||||
for (i = 0; i < numPoints; i++)
|
|
||||||
{
|
|
||||||
tmppoint[i][0] += bgs*(0.5 - rand()/double(RAND_MAX));
|
|
||||||
tmppoint[i][1] += bgs*(0.5 - rand()/double(RAND_MAX));
|
|
||||||
}
|
|
||||||
|
|
||||||
double wrk[2][3] =
|
|
||||||
{
|
|
||||||
{ 5*RANGE, -RANGE, -RANGE },
|
|
||||||
{ -RANGE, 5*RANGE, -RANGE }
|
|
||||||
};
|
|
||||||
for (i = 0; i < 3; i++)
|
|
||||||
{
|
|
||||||
tmppoint[numPoints+i][0] = xmin+xrange*wrk[0][i];
|
|
||||||
tmppoint[numPoints+i][1] = ymin+yrange*wrk[1][i];
|
|
||||||
}
|
|
||||||
|
|
||||||
int i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i11;
|
|
||||||
int nts, ii[3];
|
|
||||||
double xx;
|
|
||||||
|
|
||||||
int tsz = 2*TSIZE;
|
|
||||||
int** tmp = new int*[tsz+1];
|
|
||||||
tmp[0] = new int[2*(tsz+1)];
|
|
||||||
for (i0 = 1; i0 < tsz+1; i0++)
|
|
||||||
tmp[i0] = tmp[0] + 2*i0;
|
|
||||||
i1 = 2*(numPoints + 2);
|
|
||||||
|
|
||||||
int* id = new int[i1];
|
|
||||||
for (i0 = 0; i0 < i1; i0++)
|
|
||||||
id[i0] = i0;
|
|
||||||
|
|
||||||
int** a3s = new int*[i1];
|
|
||||||
a3s[0] = new int[3*i1];
|
|
||||||
for (i0 = 1; i0 < i1; i0++)
|
|
||||||
a3s[i0] = a3s[0] + 3*i0;
|
|
||||||
a3s[0][0] = numPoints;
|
|
||||||
a3s[0][1] = numPoints+1;
|
|
||||||
a3s[0][2] = numPoints+2;
|
|
||||||
|
|
||||||
double** ccr = new double*[i1]; // circumscribed centers and radii
|
|
||||||
ccr[0] = new double[3*i1];
|
|
||||||
for (i0 = 1; i0 < i1; i0++)
|
|
||||||
ccr[i0] = ccr[0] + 3*i0;
|
|
||||||
ccr[0][0] = 0.0;
|
|
||||||
ccr[0][1] = 0.0;
|
|
||||||
ccr[0][2] = FLT_MAX;
|
|
||||||
|
|
||||||
nts = 1; // number of triangles
|
|
||||||
i4 = 1;
|
|
||||||
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 40%] create triangulation");
|
|
||||||
|
|
||||||
// compute triangulation
|
|
||||||
for (i0 = 0; i0 < numPoints; i0++)
|
|
||||||
{
|
|
||||||
i1 = i7 = -1;
|
|
||||||
i9 = 0;
|
|
||||||
for (i11 = 0; i11 < nts; i11++)
|
|
||||||
{
|
|
||||||
i1++;
|
|
||||||
while ( a3s[i1][0] < 0 )
|
|
||||||
i1++;
|
|
||||||
xx = ccr[i1][2];
|
|
||||||
for (i2 = 0; i2 < 2; i2++)
|
|
||||||
{
|
|
||||||
double z = tmppoint[i0][i2]-ccr[i1][i2];
|
|
||||||
xx -= z*z;
|
|
||||||
if ( xx < 0 )
|
|
||||||
goto Corner3;
|
|
||||||
}
|
|
||||||
i9--;
|
|
||||||
i4--;
|
|
||||||
id[i4] = i1;
|
|
||||||
for (i2 = 0; i2 < 3; i2++)
|
|
||||||
{
|
|
||||||
ii[0] = 0;
|
|
||||||
if (ii[0] == i2)
|
|
||||||
ii[0]++;
|
|
||||||
for (i3 = 1; i3 < 2; i3++)
|
|
||||||
{
|
|
||||||
ii[i3] = ii[i3-1] + 1;
|
|
||||||
if (ii[i3] == i2)
|
|
||||||
ii[i3]++;
|
|
||||||
}
|
|
||||||
if ( i7 > 1 )
|
|
||||||
{
|
|
||||||
i8 = i7;
|
|
||||||
for (i3 = 0; i3 <= i8; i3++)
|
|
||||||
{
|
|
||||||
for (i5 = 0; i5 < 2; i5++)
|
|
||||||
if ( a3s[i1][ii[i5]] != tmp[i3][i5] )
|
|
||||||
goto Corner1;
|
|
||||||
for (i6 = 0; i6 < 2; i6++)
|
|
||||||
tmp[i3][i6] = tmp[i8][i6];
|
|
||||||
i7--;
|
|
||||||
goto Corner2;
|
|
||||||
Corner1:;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( ++i7 > tsz )
|
|
||||||
{
|
|
||||||
// temporary storage exceeded, increase TSIZE
|
|
||||||
result = 0;
|
|
||||||
goto ExitDelaunay;
|
|
||||||
}
|
|
||||||
for (i3 = 0; i3 < 2; i3++)
|
|
||||||
tmp[i7][i3] = a3s[i1][ii[i3]];
|
|
||||||
Corner2:;
|
|
||||||
}
|
|
||||||
a3s[i1][0] = -1;
|
|
||||||
Corner3:;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i1 = 0; i1 <= i7; i1++)
|
|
||||||
{
|
|
||||||
for (i2 = 0; i2 < 2; i2++)
|
|
||||||
for (wrk[i2][2] = 0, i3 = 0; i3 < 2; i3++)
|
|
||||||
{
|
|
||||||
wrk[i2][i3] = tmppoint[tmp[i1][i2]][i3]-tmppoint[i0][i3];
|
|
||||||
wrk[i2][2] +=
|
|
||||||
0.5*wrk[i2][i3]*(tmppoint[tmp[i1][i2]][i3]+
|
|
||||||
tmppoint[i0][i3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
xx = wrk[0][0]*wrk[1][1]-wrk[1][0]*wrk[0][1];
|
|
||||||
ccr[id[i4]][0] = (wrk[0][2]*wrk[1][1]-wrk[1][2]*wrk[0][1])/xx;
|
|
||||||
ccr[id[i4]][1] = (wrk[0][0]*wrk[1][2]-wrk[1][0]*wrk[0][2])/xx;
|
|
||||||
|
|
||||||
for (ccr[id[i4]][2] = 0, i2 = 0; i2 < 2; i2++)
|
|
||||||
{
|
|
||||||
double z = tmppoint[i0][i2]-ccr[id[i4]][i2];
|
|
||||||
ccr[id[i4]][2] += z*z;
|
|
||||||
a3s[id[i4]][i2] = tmp[i1][i2];
|
|
||||||
}
|
|
||||||
|
|
||||||
a3s[id[i4]][2] = i0;
|
|
||||||
i4++;
|
|
||||||
i9++;
|
|
||||||
}
|
|
||||||
nts += i9;
|
|
||||||
}
|
|
||||||
|
|
||||||
// count the number of triangles
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 50%] count the number of triangles");
|
|
||||||
|
|
||||||
numTriangles = 0;
|
|
||||||
i0 = -1;
|
|
||||||
for (i11 = 0; i11 < nts; i11++)
|
|
||||||
{
|
|
||||||
i0++;
|
|
||||||
while ( a3s[i0][0] < 0 )
|
|
||||||
i0++;
|
|
||||||
if ( a3s[i0][0] < numPoints )
|
|
||||||
{
|
|
||||||
for (i1 = 0; i1 < 2; i1++)
|
|
||||||
for (i2 = 0; i2 < 2; i2++)
|
|
||||||
wrk[i1][i2] =
|
|
||||||
tmppoint[a3s[i0][i1]][i2]-tmppoint[a3s[i0][2]][i2];
|
|
||||||
|
|
||||||
if ( fabs(wrk[0][0]*wrk[1][1]-wrk[0][1]*wrk[1][0]) > EPSILON*maxrange2 )
|
|
||||||
numTriangles++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// create the triangles
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 60%] create the triangles");
|
|
||||||
|
|
||||||
triangle = new Triangle[numTriangles];
|
|
||||||
|
|
||||||
numTriangles = 0;
|
|
||||||
i0 = -1;
|
|
||||||
for (i11 = 0; i11 < nts; i11++)
|
|
||||||
{
|
|
||||||
i0++;
|
|
||||||
while ( a3s[i0][0] < 0 )
|
|
||||||
i0++;
|
|
||||||
if ( a3s[i0][0] < numPoints )
|
|
||||||
{
|
|
||||||
for (i1 = 0; i1 < 2; i1++)
|
|
||||||
for (i2 = 0; i2 < 2; i2++)
|
|
||||||
wrk[i1][i2] =
|
|
||||||
tmppoint[a3s[i0][i1]][i2]-tmppoint[a3s[i0][2]][i2];
|
|
||||||
xx = wrk[0][0]*wrk[1][1]-wrk[0][1]*wrk[1][0];
|
|
||||||
if ( fabs(xx) > EPSILON*maxrange2 )
|
|
||||||
{
|
|
||||||
int delta = xx < 0 ? 1 : 0;
|
|
||||||
Triangle& tri = triangle[numTriangles];
|
|
||||||
tri.vertex[0] = a3s[i0][0];
|
|
||||||
tri.vertex[1] = a3s[i0][1+delta];
|
|
||||||
tri.vertex[2] = a3s[i0][2-delta];
|
|
||||||
tri.adj[0] = -1;
|
|
||||||
tri.adj[1] = -1;
|
|
||||||
tri.adj[2] = -1;
|
|
||||||
numTriangles++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// build edge table
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 70%] build the edge table");
|
|
||||||
|
|
||||||
numEdges = 0;
|
|
||||||
edge = new Edge[3*numTriangles];
|
|
||||||
|
|
||||||
int j, j0, j1;
|
|
||||||
for (i = 0; i < numTriangles; i++)
|
|
||||||
{
|
|
||||||
if ( (i%500) == 0)
|
|
||||||
SG_LOG(SG_MATH, SG_BULK, "[ 7" << 10*i/numTriangles << "%] build the edge table");
|
|
||||||
|
|
||||||
Triangle& t = triangle[i];
|
|
||||||
|
|
||||||
for (j0 = 0, j1 = 1; j0 < 3; j0++, j1 = (j1+1)%3)
|
|
||||||
{
|
|
||||||
for (j = 0; j < numEdges; j++)
|
|
||||||
{
|
|
||||||
Edge& e = edge[j];
|
|
||||||
if ( (t.vertex[j0] == e.vertex[0]
|
|
||||||
&& t.vertex[j1] == e.vertex[1])
|
|
||||||
|| (t.vertex[j0] == e.vertex[1]
|
|
||||||
&& t.vertex[j1] == e.vertex[0]) )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ( j == numEdges ) // add edge to table
|
|
||||||
{
|
|
||||||
edge[j].vertex[0] = t.vertex[j0];
|
|
||||||
edge[j].vertex[1] = t.vertex[j1];
|
|
||||||
edge[j].triangle[0] = i;
|
|
||||||
edge[j].index[0] = j0;
|
|
||||||
edge[j].triangle[1] = -1;
|
|
||||||
numEdges++;
|
|
||||||
}
|
|
||||||
else // edge already exists, add triangle to table
|
|
||||||
{
|
|
||||||
edge[j].triangle[1] = i;
|
|
||||||
edge[j].index[1] = j0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// establish links between adjacent triangles
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 80%] establishing links between adjacent triangles");
|
|
||||||
|
|
||||||
for (i = 0; i < numEdges; i++)
|
|
||||||
{
|
|
||||||
if ( edge[i].triangle[1] != -1 )
|
|
||||||
{
|
|
||||||
j0 = edge[i].triangle[0];
|
|
||||||
j1 = edge[i].triangle[1];
|
|
||||||
triangle[j0].adj[edge[i].index[0]] = j1;
|
|
||||||
triangle[j1].adj[edge[i].index[1]] = j0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result = 1;
|
|
||||||
|
|
||||||
ExitDelaunay:;
|
|
||||||
delete[] tmp[0];
|
|
||||||
delete[] tmp;
|
|
||||||
delete[] id;
|
|
||||||
delete[] a3s[0];
|
|
||||||
delete[] a3s;
|
|
||||||
delete[] ccr[0];
|
|
||||||
delete[] ccr;
|
|
||||||
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 90%] finsishes delauney triangulation");
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
void mgcLinInterp2D::GetPoint (int i, double& x, double& y)
|
|
||||||
{
|
|
||||||
// assumes i is valid [can use PointCount() before passing i]
|
|
||||||
x = point[i][0];
|
|
||||||
y = point[i][1];
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
void mgcLinInterp2D::GetEdge (int i, double& x0, double& y0, double& x1,
|
|
||||||
double& y1)
|
|
||||||
{
|
|
||||||
// assumes i is valid [can use EdgeCount() before passing i]
|
|
||||||
int v0 = edge[i].vertex[0], v1 = edge[i].vertex[1];
|
|
||||||
|
|
||||||
x0 = point[v0][0];
|
|
||||||
y0 = point[v0][1];
|
|
||||||
x1 = point[v1][0];
|
|
||||||
y1 = point[v1][1];
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
void mgcLinInterp2D::GetTriangle (int i, double& x0, double& y0, double& x1,
|
|
||||||
double& y1, double& x2, double& y2)
|
|
||||||
{
|
|
||||||
// assumes i is valid [can use TriangleCount() before passing i]
|
|
||||||
int v0 = triangle[i].vertex[0];
|
|
||||||
int v1 = triangle[i].vertex[1];
|
|
||||||
int v2 = triangle[i].vertex[2];
|
|
||||||
|
|
||||||
x0 = point[v0][0];
|
|
||||||
y0 = point[v0][1];
|
|
||||||
x1 = point[v1][0];
|
|
||||||
y1 = point[v1][1];
|
|
||||||
x2 = point[v2][0];
|
|
||||||
y2 = point[v2][1];
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
|
@ -1,113 +0,0 @@
|
||||||
/*
|
|
||||||
WARNING - Do not remove this header.
|
|
||||||
|
|
||||||
This code is a templated version of the 'magic-software' spherical
|
|
||||||
interpolation code by Dave Eberly. The original (un-hacked) code can be
|
|
||||||
obtained from here: http://www.magic-software.com/gr_appr.htm
|
|
||||||
This code is derived from linintp2.h/cpp and sphrintp.h/cpp.
|
|
||||||
|
|
||||||
Dave Eberly says that the conditions for use are:
|
|
||||||
|
|
||||||
* You may distribute the original source code to others at no charge.
|
|
||||||
|
|
||||||
* You may modify the original source code and distribute it to others at
|
|
||||||
no charge. The modified code must be documented to indicate that it is
|
|
||||||
not part of the original package.
|
|
||||||
|
|
||||||
* You may use this code for non-commercial purposes. You may also
|
|
||||||
incorporate this code into commercial packages. However, you may not
|
|
||||||
sell any of your source code which contains my original and/or modified
|
|
||||||
source code. In such a case, you need to factor out my code and freely
|
|
||||||
distribute it.
|
|
||||||
|
|
||||||
* The original code comes with absolutely no warranty and no guarantee is
|
|
||||||
made that the code is bug-free.
|
|
||||||
|
|
||||||
This does not seem incompatible with GPL - so this modified version
|
|
||||||
is hereby placed under GPL along with the rest of FlightGear.
|
|
||||||
|
|
||||||
Christian Mayer
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef LININTP2_H
|
|
||||||
#define LININTP2_H
|
|
||||||
|
|
||||||
struct EvaluateData
|
|
||||||
{
|
|
||||||
unsigned int index[3];
|
|
||||||
double percentage[3];
|
|
||||||
};
|
|
||||||
|
|
||||||
class mgcLinInterp2D
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
mgcLinInterp2D (int _numPoints, double* x, double* y, unsigned int* _f);
|
|
||||||
|
|
||||||
~mgcLinInterp2D ();
|
|
||||||
|
|
||||||
double XMin () { return xmin; }
|
|
||||||
double XMax () { return xmax; }
|
|
||||||
double XRange () { return xmax-xmin; }
|
|
||||||
double YMin () { return ymin; }
|
|
||||||
double YMax () { return ymax; }
|
|
||||||
double YRange () { return ymax-ymin; }
|
|
||||||
|
|
||||||
int PointCount () { return numPoints; }
|
|
||||||
void GetPoint (int i, double& x, double& y);
|
|
||||||
|
|
||||||
int EdgeCount () { return numEdges; }
|
|
||||||
void GetEdge (int i, double& x0, double& y0, double& x1, double& y1);
|
|
||||||
|
|
||||||
int TriangleCount () { return numTriangles; }
|
|
||||||
void GetTriangle (int i, double& x0, double& y0, double& x1, double& y1,
|
|
||||||
double& x2, double& y2);
|
|
||||||
|
|
||||||
int Evaluate (double x, double y, EvaluateData& F);
|
|
||||||
|
|
||||||
private:
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
double x, y;
|
|
||||||
}
|
|
||||||
Vertex;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int vertex[3]; // listed in counterclockwise order
|
|
||||||
|
|
||||||
int adj[3];
|
|
||||||
// adj[0] points to triangle sharing edge (vertex[0],vertex[1])
|
|
||||||
// adj[1] points to triangle sharing edge (vertex[1],vertex[2])
|
|
||||||
// adj[2] points to triangle sharing edge (vertex[2],vertex[0])
|
|
||||||
}
|
|
||||||
Triangle;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int vertex[2];
|
|
||||||
int triangle[2];
|
|
||||||
int index[2];
|
|
||||||
}
|
|
||||||
Edge;
|
|
||||||
|
|
||||||
int numPoints;
|
|
||||||
double** point;
|
|
||||||
double** tmppoint;
|
|
||||||
unsigned int* f;
|
|
||||||
|
|
||||||
double xmin, xmax, ymin, ymax;
|
|
||||||
|
|
||||||
|
|
||||||
int numEdges;
|
|
||||||
Edge* edge;
|
|
||||||
|
|
||||||
int numTriangles;
|
|
||||||
Triangle* triangle;
|
|
||||||
|
|
||||||
int Delaunay2D ();
|
|
||||||
void ComputeBarycenter (Vertex& v0, Vertex& v1, Vertex& v2, Vertex& ver,
|
|
||||||
double c[3]);
|
|
||||||
int InTriangle (Vertex& v0, Vertex& v1, Vertex& v2, Vertex& test);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,173 +0,0 @@
|
||||||
/*
|
|
||||||
WARNING - Do not remove this header.
|
|
||||||
|
|
||||||
This code is a templated version of the 'magic-software' spherical
|
|
||||||
interpolation code by Dave Eberly. The original (un-hacked) code can be
|
|
||||||
obtained from here: http://www.magic-software.com/gr_appr.htm
|
|
||||||
This code is derived from linintp2.h/cpp and sphrintp.h/cpp.
|
|
||||||
|
|
||||||
Dave Eberly says that the conditions for use are:
|
|
||||||
|
|
||||||
* You may distribute the original source code to others at no charge.
|
|
||||||
|
|
||||||
* You may modify the original source code and distribute it to others at
|
|
||||||
no charge. The modified code must be documented to indicate that it is
|
|
||||||
not part of the original package.
|
|
||||||
|
|
||||||
* You may use this code for non-commercial purposes. You may also
|
|
||||||
incorporate this code into commercial packages. However, you may not
|
|
||||||
sell any of your source code which contains my original and/or modified
|
|
||||||
source code. In such a case, you need to factor out my code and freely
|
|
||||||
distribute it.
|
|
||||||
|
|
||||||
* The original code comes with absolutely no warranty and no guarantee is
|
|
||||||
made that the code is bug-free.
|
|
||||||
|
|
||||||
This does not seem incompatible with GPL - so this modified version
|
|
||||||
is hereby placed under GPL along with the rest of FlightGear.
|
|
||||||
|
|
||||||
Christian Mayer
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
#include STL_IOSTREAM
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
#include "sphrintp.h"
|
|
||||||
|
|
||||||
SG_USING_NAMESPACE(std);
|
|
||||||
SG_USING_STD(cout);
|
|
||||||
|
|
||||||
|
|
||||||
static const double PI = 4.0*atan(1.0);
|
|
||||||
static const double TWOPI = 2.0*PI;
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
SphereInterpolate::SphereInterpolate (int n, const double* x,
|
|
||||||
const double* y, const double* z,
|
|
||||||
const unsigned int* f)
|
|
||||||
{
|
|
||||||
// Assumes (x[i],y[i],z[i]) is unit length for all 0 <= i < n.
|
|
||||||
// For complete spherical coverage, include the two antipodal points
|
|
||||||
// (0,0,1,f(0,0,1)) and (0,0,-1,f(0,0,-1)) in the data set.
|
|
||||||
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "Initialising spherical interpolator.");
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 0%] Allocating memory");
|
|
||||||
|
|
||||||
theta = new double[3*n];
|
|
||||||
phi = new double[3*n];
|
|
||||||
func = new unsigned int[3*n];
|
|
||||||
|
|
||||||
// convert data to spherical coordinates
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
{
|
|
||||||
GetSphericalCoords(x[i],y[i],z[i],theta[i],phi[i]);
|
|
||||||
func[i] = f[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// use periodicity to get wrap-around in the Delaunay triangulation
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 10%] copying vertices for wrap-aroundr");
|
|
||||||
int j, k;
|
|
||||||
for (i = 0, j = n, k = 2*n; i < n; i++, j++, k++)
|
|
||||||
{
|
|
||||||
theta[j] = theta[i]+TWOPI;
|
|
||||||
theta[k] = theta[i]-TWOPI;
|
|
||||||
phi[j] = phi[i];
|
|
||||||
phi[k] = phi[i];
|
|
||||||
func[j] = func[i];
|
|
||||||
func[k] = func[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
pInterp = new mgcLinInterp2D(3*n,theta,phi,func);
|
|
||||||
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[100%] Finished initialising spherical interpolator.");
|
|
||||||
}
|
|
||||||
|
|
||||||
SphereInterpolate::SphereInterpolate (int n, const sgVec2* p, const unsigned int* f)
|
|
||||||
{
|
|
||||||
// Assumes (x[i],y[i],z[i]) is unit length for all 0 <= i < n.
|
|
||||||
// For complete spherical coverage, include the two antipodal points
|
|
||||||
// (0,0,1,f(0,0,1)) and (0,0,-1,f(0,0,-1)) in the data set.
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "Initialising spherical interpolator.");
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 0%] Allocating memory");
|
|
||||||
|
|
||||||
theta = new double[3*n];
|
|
||||||
phi = new double[3*n];
|
|
||||||
func = new unsigned int[3*n];
|
|
||||||
|
|
||||||
// convert data to spherical coordinates
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[ 10%] copying vertices for wrap-around");
|
|
||||||
|
|
||||||
int i, j, k;
|
|
||||||
for (i = 0, j = n, k = 2*n; i < n; i++, j++, k++)
|
|
||||||
{
|
|
||||||
phi[i] = p[i][0];
|
|
||||||
theta[i] = p[i][1];
|
|
||||||
func[i] = f[i];
|
|
||||||
|
|
||||||
// use periodicity to get wrap-around in the Delaunay triangulation
|
|
||||||
phi[j] = phi[i];
|
|
||||||
phi[k] = phi[i];
|
|
||||||
theta[j] = theta[i]+TWOPI;
|
|
||||||
theta[k] = theta[i]-TWOPI;
|
|
||||||
func[j] = func[i];
|
|
||||||
func[k] = func[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
pInterp = new mgcLinInterp2D(3*n,theta,phi,func);
|
|
||||||
|
|
||||||
SG_LOG(SG_MATH, SG_DEBUG, "[100%] Finished initialising spherical interpolator.");
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
SphereInterpolate::~SphereInterpolate ()
|
|
||||||
{
|
|
||||||
delete pInterp;
|
|
||||||
delete[] theta;
|
|
||||||
delete[] phi;
|
|
||||||
delete[] func;
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
void SphereInterpolate::GetSphericalCoords (const double x, const double y, const double z,
|
|
||||||
double& thetaAngle,
|
|
||||||
double& phiAngle) const
|
|
||||||
{
|
|
||||||
// Assumes (x,y,z) is unit length. Returns -PI <= thetaAngle <= PI
|
|
||||||
// and 0 <= phiAngle <= PI.
|
|
||||||
|
|
||||||
if ( z < 1.0f )
|
|
||||||
{
|
|
||||||
if ( z > -1.0f )
|
|
||||||
{
|
|
||||||
thetaAngle = atan2(y,x);
|
|
||||||
phiAngle = acos(z);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
thetaAngle = -PI;
|
|
||||||
phiAngle = PI;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
thetaAngle = -PI;
|
|
||||||
phiAngle = 0.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
int SphereInterpolate::Evaluate (const double x, const double y, const double z, EvaluateData& f) const
|
|
||||||
{
|
|
||||||
// assumes (x,y,z) is unit length
|
|
||||||
|
|
||||||
double thetaAngle, phiAngle;
|
|
||||||
GetSphericalCoords(x,y,z,thetaAngle,phiAngle);
|
|
||||||
return pInterp->Evaluate(thetaAngle,phiAngle,f);
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
int SphereInterpolate::Evaluate (const double thetaAngle, const double phiAngle, EvaluateData& f) const
|
|
||||||
{
|
|
||||||
return pInterp->Evaluate(thetaAngle,phiAngle,f);
|
|
||||||
}
|
|
||||||
//---------------------------------------------------------------------------
|
|
|
@ -1,99 +0,0 @@
|
||||||
/*
|
|
||||||
WARNING - Do not remove this header.
|
|
||||||
|
|
||||||
This code is a templated version of the 'magic-software' spherical
|
|
||||||
interpolation code by Dave Eberly. The original (un-hacked) code can be
|
|
||||||
obtained from here: http://www.magic-software.com/gr_appr.htm
|
|
||||||
This code is derived from linintp2.h/cpp and sphrintp.h/cpp.
|
|
||||||
|
|
||||||
Dave Eberly says that the conditions for use are:
|
|
||||||
|
|
||||||
* You may distribute the original source code to others at no charge.
|
|
||||||
|
|
||||||
* You may modify the original source code and distribute it to others at
|
|
||||||
no charge. The modified code must be documented to indicate that it is
|
|
||||||
not part of the original package.
|
|
||||||
|
|
||||||
* You may use this code for non-commercial purposes. You may also
|
|
||||||
incorporate this code into commercial packages. However, you may not
|
|
||||||
sell any of your source code which contains my original and/or modified
|
|
||||||
source code. In such a case, you need to factor out my code and freely
|
|
||||||
distribute it.
|
|
||||||
|
|
||||||
* The original code comes with absolutely no warranty and no guarantee is
|
|
||||||
made that the code is bug-free.
|
|
||||||
|
|
||||||
This does not seem incompatible with GPL - so this modified version
|
|
||||||
is hereby placed under GPL along with the rest of FlightGear.
|
|
||||||
|
|
||||||
Christian Mayer
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SPHRINTP_H
|
|
||||||
#define SPHRINTP_H
|
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
|
||||||
#include STL_IOSTREAM
|
|
||||||
|
|
||||||
#include "linintp2.h"
|
|
||||||
#include <plib/sg.h>
|
|
||||||
|
|
||||||
SG_USING_NAMESPACE(std);
|
|
||||||
SG_USING_STD(cout);
|
|
||||||
|
|
||||||
|
|
||||||
class SphereInterpolate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SphereInterpolate (int n, const double* x, const double* y,
|
|
||||||
const double* z, const unsigned int* f);
|
|
||||||
SphereInterpolate (int n, const sgVec2* p, const unsigned int* f);
|
|
||||||
|
|
||||||
~SphereInterpolate ();
|
|
||||||
|
|
||||||
void GetSphericalCoords (const double x, const double y, const double z,
|
|
||||||
double& thetaAngle, double& phiAngle) const;
|
|
||||||
|
|
||||||
int Evaluate (const double x, const double y, const double z, EvaluateData& f) const;
|
|
||||||
int Evaluate (const double thetaAngle, const double phiAngle, EvaluateData& f) const;
|
|
||||||
|
|
||||||
#ifndef macintosh
|
|
||||||
// CodeWarrior doesn't know the differece between sgVec2 and
|
|
||||||
// sgVec3, so I commented this out for Mac builds. This change is
|
|
||||||
// related to a similar change in FGLocalWeatherDatabase module.
|
|
||||||
|
|
||||||
EvaluateData Evaluate(const sgVec2& p) const
|
|
||||||
{
|
|
||||||
EvaluateData retval;
|
|
||||||
Evaluate(p[1], p[0], retval);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
EvaluateData Evaluate(const sgVec3& p) const
|
|
||||||
{
|
|
||||||
EvaluateData retval;
|
|
||||||
if (!Evaluate(p[1], p[0], retval))
|
|
||||||
{
|
|
||||||
cout << "Error during spherical interpolation. Point ("
|
|
||||||
<< p[0] << "/" << p[1] << "/" << p[2] << ") was in no triangle\n";
|
|
||||||
retval.index[0] = 0; //fake something
|
|
||||||
retval.index[1] = 0;
|
|
||||||
retval.index[2] = 0;
|
|
||||||
retval.percentage[0] = 1.0;
|
|
||||||
retval.percentage[1] = 0.0;
|
|
||||||
retval.percentage[2] = 0.0;
|
|
||||||
}
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int numPoints;
|
|
||||||
double* theta;
|
|
||||||
double* phi;
|
|
||||||
unsigned int* func;
|
|
||||||
mgcLinInterp2D* pInterp;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in a new issue