X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FWeatherCM%2FFGPhysicalProperties.h;h=2e39d5b6b82d5d557eeba91d16fb5a41ab3915da;hb=8199ece7dcca6b45237fab8647205effa6e38bcf;hp=0795d4d51b3a86a85e9163d3eb62023f65f34d7d;hpb=b645c8cf7e4aecc006b0d90a0ff7b4b0ad95cc62;p=flightgear.git diff --git a/src/WeatherCM/FGPhysicalProperties.h b/src/WeatherCM/FGPhysicalProperties.h index 0795d4d51..2e39d5b6b 100644 --- a/src/WeatherCM/FGPhysicalProperties.h +++ b/src/WeatherCM/FGPhysicalProperties.h @@ -1,10 +1,10 @@ -/*******-*- Mode: C++ -*-************************************************************ +/***************************************************************************** Header: FGPhysicalProperties.h Author: Christian Mayer Date started: 28.05.99 - ---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ---------- + -------- 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 @@ -34,6 +34,14 @@ HISTORY 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 *****************************************************************************/ /****************************************************************************/ @@ -45,111 +53,130 @@ HISTORY /****************************************************************************/ /* INCLUDES */ /****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef HAVE_WINDOWS_H +# include +#endif + +#include STL_IOSTREAM #include -#include +#include -FG_USING_STD(vector); -FG_USING_STD(set); -FG_USING_NAMESPACE(std); +#include -#include -#include #include "FGWeatherDefs.h" +#include "FGAirPressureItem.h" #include "FGWindItem.h" #include "FGTurbulenceItem.h" -#include "FGTemperatureItem.h" -#include "FGAirPressureItem.h" -#include "FGVaporPressureItem.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: - set Wind; //all Wind vectors - set Turbulence; //all Turbulence vectors - set Temperature; //in deg. Kelvin (I *only* accept SI!) - FGAirPressureItem AirPressure; //in Pascal (I *only* accept SI!) - set VaporPressure; //in Pascal (I *only* accept SI!) + typedef WeatherPrecision Altitude; + + map Wind; //all Wind vectors + map Turbulence; //all Turbulence vectors + map Temperature; //in deg. Kelvin (I *only* accept SI!) + FGAirPressureItem AirPressure; //in Pascal (I *only* accept SI!) + map VaporPressure; //in Pascal (I *only* accept SI!) + + map Clouds; //amount of covering and type - set Clouds; //amount of covering and type - WeatherPrecition SnowRainIntensity; //this also stands for hail, snow,... - SnowRainType snowRainType; - WeatherPrecition LightningProbability; + 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 - Point3D WindAt(const WeatherPrecition& a) const; - Point3D TurbulenceAt(const WeatherPrecition& a) const; - WeatherPrecition TemperatureAt(const WeatherPrecition& a) const; - WeatherPrecition AirPressureAt(const WeatherPrecition& a) const; - WeatherPrecition VaporPressureAt(const WeatherPrecition& a) const; + 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 WeatherPrecition& d ); - FGPhysicalProperties& operator += ( const FGPhysicalProperties& p); - FGPhysicalProperties& operator -= ( const FGPhysicalProperties& p); + 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); }; -typedef vector FGPhysicalPropertiesVector; -typedef FGPhysicalPropertiesVector::iterator FGPhysicalPropertiesVectorIt; -typedef FGPhysicalPropertiesVector::const_iterator FGPhysicalPropertiesVectorConstIt; - -class FGPhysicalProperties2D; -ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p ); - class FGPhysicalProperties2D : public FGPhysicalProperties { public: - Point2D p; //position of the property (lat/lon) + sgVec2 p; //position of the property (lat/lon) friend ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p ); FGPhysicalProperties2D() {} - FGPhysicalProperties2D(const FGPhysicalProperties& prop, const Point2D& pos) + FGPhysicalProperties2D(const FGPhysicalProperties& prop, const sgVec2& pos) { - Wind = prop.Wind; Turbulence = prop.Turbulence; Temperature = prop.Temperature; - AirPressure = prop.AirPressure; VaporPressure = prop.VaporPressure; p = pos; + Wind = prop.Wind; + Turbulence = prop.Turbulence; + Temperature = prop.Temperature; + AirPressure = prop.AirPressure; + VaporPressure = prop.VaporPressure; + sgCopyVec2(p, pos); } }; -typedef vector FGPhysicalProperties2DVector; -typedef FGPhysicalProperties2DVector::iterator FGPhysicalProperties2DVectorIt; +typedef vector FGPhysicalPropertiesVector; +typedef FGPhysicalPropertiesVector::iterator FGPhysicalPropertiesVectorIt; +typedef FGPhysicalPropertiesVector::const_iterator FGPhysicalPropertiesVectorConstIt; + +typedef vector FGPhysicalProperties2DVector; +typedef FGPhysicalProperties2DVector::iterator FGPhysicalProperties2DVectorIt; typedef FGPhysicalProperties2DVector::const_iterator FGPhysicalProperties2DVectorConstIt; -inline ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p ) -{ - out << "Position: " << p.p << "\nStored Wind: "; - for (set::const_iterator WindIt = p.Wind.begin(); WindIt != p.Wind.end(); WindIt++) - out << "(" << WindIt->getValue() << ") at " << WindIt->getAlt() << "m; "; - - out << "\nStored Turbulence: "; - for (set::const_iterator TurbulenceIt = p.Turbulence.begin(); - TurbulenceIt != p.Turbulence.end(); - TurbulenceIt++) - out << "(" << TurbulenceIt->getValue() << ") at " << TurbulenceIt->getAlt() << "m; "; - - out << "\nStored Temperature: "; - for (set::const_iterator TemperatureIt = p.Temperature.begin(); - TemperatureIt != p.Temperature.end(); - TemperatureIt++) - out << TemperatureIt->getValue() << " at " << TemperatureIt->getAlt() << "m; "; - - out << "\nStored AirPressure: "; - out << p.AirPressure.getValue(0) << " at " << 0 << "m; "; - - out << "\nStored VaporPressure: "; - for (set::const_iterator VaporPressureIt = p.VaporPressure.begin(); - VaporPressureIt != p.VaporPressure.end(); - VaporPressureIt++) - out << VaporPressureIt->getValue() << " at " << VaporPressureIt->getAlt() << "m; "; - - return out << "\n"; -} inline FGPhysicalProperties& FGPhysicalProperties::operator = ( const FGPhysicalProperties& p ) @@ -162,183 +189,226 @@ inline FGPhysicalProperties& FGPhysicalProperties::operator = ( const FGPhysical return *this; } -inline FGPhysicalProperties& FGPhysicalProperties::operator *= ( const WeatherPrecition& d ) +inline FGPhysicalProperties& FGPhysicalProperties::operator *= ( const WeatherPrecision d ) { + typedef map::iterator wind_iterator; + typedef map::iterator turbulence_iterator; + typedef map::iterator scalar_iterator; - for (set::iterator WindIt = Wind.begin(); - WindIt != Wind.end(); - WindIt++) - *WindIt *= d; + for (wind_iterator WindIt = Wind.begin(); + WindIt != Wind.end(); + WindIt++) + WindIt->second*= d; - for (set::iterator TurbulenceIt = Turbulence.begin(); - TurbulenceIt != Turbulence.end(); - TurbulenceIt++) - *TurbulenceIt *= d; + for (turbulence_iterator TurbulenceIt = Turbulence.begin(); + TurbulenceIt != Turbulence.end(); + TurbulenceIt++) + TurbulenceIt->second *= d; - for (set::iterator TemperatureIt = Temperature.begin(); - TemperatureIt != Temperature.end(); - TemperatureIt++) - *TemperatureIt *= d; + for (scalar_iterator TemperatureIt = Temperature.begin(); + TemperatureIt != Temperature.end(); + TemperatureIt++) + TemperatureIt->second *= d; AirPressure *= d; - for (set::iterator VaporPressureIt = VaporPressure.begin(); - VaporPressureIt != VaporPressure.end(); - VaporPressureIt++) - *VaporPressureIt *= d; + for (scalar_iterator VaporPressureIt = VaporPressure.begin(); + VaporPressureIt != VaporPressure.end(); + VaporPressureIt++) + VaporPressureIt->second *= d; return *this; } inline FGPhysicalProperties& FGPhysicalProperties::operator += (const FGPhysicalProperties& p) { - for (set::const_iterator WindIt = p.Wind.begin(); - WindIt != p.Wind.end(); - WindIt++ ) - if (WindIt != Wind.upper_bound( FGWindItem(WindIt->getAlt(), Point3D(0)) )) - Wind.insert(*WindIt); - else - *(Wind.upper_bound( FGWindItem(WindIt->getAlt(), Point3D(0))) ) += WindIt->getValue(); + typedef map::const_iterator wind_iterator; + typedef map::const_iterator turbulence_iterator; + typedef map::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 (set::const_iterator TurbulenceIt = p.Turbulence.begin(); - TurbulenceIt != p.Turbulence.end(); - TurbulenceIt++) - if (TurbulenceIt != Turbulence.upper_bound( FGTurbulenceItem(TurbulenceIt->getAlt(), Point3D(0)) )) - Turbulence.insert(*TurbulenceIt); - else - *(Turbulence.upper_bound( FGTurbulenceItem(TurbulenceIt->getAlt(), Point3D(0)) )) += TurbulenceIt->getValue(); + 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; - for (set::const_iterator TemperatureIt = p.Temperature.begin(); - TemperatureIt != p.Temperature.end(); - TemperatureIt++) - if (TemperatureIt != Temperature.upper_bound( FGTemperatureItem(TemperatureIt->getAlt(), 0.0) )) - Temperature.insert(*TemperatureIt); - else - *(Temperature.upper_bound( FGTemperatureItem(TemperatureIt->getAlt(), 0.0) )) += TemperatureIt->getValue(); + AirPressure += p.AirPressure.getValue(); - AirPressure += p.AirPressure.getValue(0.0); - - for (set::const_iterator VaporPressureIt = p.VaporPressure.begin(); - VaporPressureIt != p.VaporPressure.end(); - VaporPressureIt++) - if (VaporPressureIt != VaporPressure.upper_bound( FGVaporPressureItem(VaporPressureIt->getAlt(), 0.0) )) - VaporPressure.insert(*VaporPressureIt); - else - *(VaporPressure.upper_bound( FGVaporPressureItem(VaporPressureIt->getAlt(), 0.0) )) += VaporPressureIt->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::const_iterator wind_iterator; + typedef map::const_iterator turbulence_iterator; + typedef map::const_iterator scalar_iterator; + + // types to replace make_pair + typedef map::value_type wind_type; + typedef map::value_type turb_type; + typedef map::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; - for (set::const_iterator WindIt = p.Wind.begin(); - WindIt != p.Wind.end(); - WindIt++) - if (WindIt != Wind.upper_bound( FGWindItem(WindIt->getAlt(), Point3D(0)) )) - Wind.insert(-(*WindIt)); - else - *(Wind.upper_bound( FGWindItem(WindIt->getAlt(), Point3D(0)) )) -= WindIt->getValue(); + return *this; +} + +#if 0 // old version +inline FGPhysicalProperties& FGPhysicalProperties::operator -= (const FGPhysicalProperties& p) +{ + typedef map::const_iterator wind_iterator; + typedef map::const_iterator turbulence_iterator; + typedef map::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 (set::const_iterator TurbulenceIt = p.Turbulence.begin(); - TurbulenceIt != p.Turbulence.end(); - TurbulenceIt++) - if (TurbulenceIt != Turbulence.upper_bound( FGTurbulenceItem(TurbulenceIt->getAlt(), Point3D(0)) )) - Turbulence.insert(-(*TurbulenceIt)); - else - *(Turbulence.upper_bound( FGTurbulenceItem(TurbulenceIt->getAlt(), Point3D(0)) )) -= TurbulenceIt->getValue(); + 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 (set::const_iterator TemperatureIt = p.Temperature.begin(); - TemperatureIt != p.Temperature.end(); - TemperatureIt++) - if (TemperatureIt != Temperature.upper_bound( FGTemperatureItem(TemperatureIt->getAlt(), 0.0) )) - Temperature.insert(-(*TemperatureIt)); - else - *(Temperature.upper_bound( FGTemperatureItem(TemperatureIt->getAlt(), 0.0) )) -= TemperatureIt->getValue(); + 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(0.0); + AirPressure -= p.AirPressure.getValue(); - for (set::const_iterator VaporPressureIt = p.VaporPressure.begin(); - VaporPressureIt != p.VaporPressure.end(); - VaporPressureIt++) - if (VaporPressureIt != VaporPressure.upper_bound( FGVaporPressureItem(VaporPressureIt->getAlt(), 0.0) )) - VaporPressure.insert(-(*VaporPressureIt)); - else - *(VaporPressure.upper_bound( FGVaporPressureItem(VaporPressureIt->getAlt(), 0.0) )) -= VaporPressureIt->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 Point3D FGPhysicalProperties::WindAt(const WeatherPrecition& a) const +inline void FGPhysicalProperties::WindAt(sgVec3 ret, const WeatherPrecision a) const { - set::const_iterator it = Wind.lower_bound(FGWindItem(a, Point3D(0))); - set::const_iterator it2 = it; + typedef map::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 - return ( (it2->getValue() - it->getValue())/(it2->getAlt() - it->getAlt()) )* - (a - it2->getAlt()) + - it2->getValue(); + sgSubVec3(ret, *it2->second.getValue(), *it->second.getValue()); + sgScaleVec3(ret, (a - it2->first) / (it2->first - it->first)); + sgAddVec3(ret, *it2->second.getValue()); } -inline Point3D FGPhysicalProperties::TurbulenceAt(const WeatherPrecition& a) const +inline void FGPhysicalProperties::TurbulenceAt(sgVec3 ret, const WeatherPrecision a) const { - set::const_iterator it = Turbulence.lower_bound(FGTurbulenceItem(a, Point3D(0))); - set::const_iterator it2 = it; + typedef map::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 - return ( (it2->getValue() - it->getValue() )/(it2->getAlt() - it->getAlt()) )* - (a - it2->getAlt())+ it2->getValue(); + sgSubVec3(ret, *it2->second.getValue(), *it->second.getValue()); + sgScaleVec3(ret, (a - it2->first) / (it2->first - it->first)); + sgAddVec3(ret, *it2->second.getValue()); } -inline WeatherPrecition FGPhysicalProperties::TemperatureAt(const WeatherPrecition& a) const +inline WeatherPrecision FGPhysicalProperties::TemperatureAt(const WeatherPrecision a) const { - set::const_iterator it = Temperature.lower_bound(FGTemperatureItem(a, 0)); - set::const_iterator it2 = it; + typedef map::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->getValue() - it->getValue()) / (it2->getAlt() - it->getAlt()) )* - (a - it2->getAlt() )+ it2->getValue(); + return ( (it2->second - it->second)/(it2->first - it->first) ) * (a - it2->first) + it2->second; } -inline WeatherPrecition FGPhysicalProperties::AirPressureAt(const WeatherPrecition& a) const -{ - return AirPressure.getValue(a); -} +//inline WeatherPrecision FGPhysicalProperties::AirPressureAt(const WeatherPrecision x) const +//moved to FGPhysicalProperties.cpp as it got too complex to inline -inline WeatherPrecition FGPhysicalProperties::VaporPressureAt(const WeatherPrecition& a) const +inline WeatherPrecision FGPhysicalProperties::VaporPressureAt(const WeatherPrecision a) const { - set::const_iterator it = VaporPressure.lower_bound(FGVaporPressureItem(a, 0)); - set::const_iterator it2 = it; + typedef map::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->getValue() - it->getValue() ) / (it2->getAlt() - it->getAlt() ) ) * - (a - it2->getAlt() )+ it2->getValue(); + return ( (it2->second - it->second)/(it2->first - it->first) ) * (a - it2->first) + it2->second; } -inline FGPhysicalProperties operator * (const FGPhysicalProperties& a, const WeatherPrecition& b) +inline FGPhysicalProperties operator * (FGPhysicalProperties a, const WeatherPrecision b) { - return FGPhysicalProperties(a) *= b; + return a *= b; } -inline FGPhysicalProperties operator * (const WeatherPrecition& b, const FGPhysicalProperties& a) +inline FGPhysicalProperties operator * (const WeatherPrecision b, FGPhysicalProperties a) { - return FGPhysicalProperties(a) *= b; + return a *= b; } -inline FGPhysicalProperties operator + (const FGPhysicalProperties& a, const FGPhysicalProperties& b) +inline FGPhysicalProperties operator + (FGPhysicalProperties a, const FGPhysicalProperties& b) { - return FGPhysicalProperties(a) += (FGPhysicalProperties)b; + return a += b; } -inline FGPhysicalProperties operator - (const FGPhysicalProperties& a, const FGPhysicalProperties& b) +inline FGPhysicalProperties operator - (FGPhysicalProperties a, const FGPhysicalProperties& b) { - return FGPhysicalProperties(a) -= (FGPhysicalProperties)b; + return a -= b; } /****************************************************************************/