+
+ /** Converts from degrees Kelvin to degrees Fahrenheit.
+ * @param kelvin The temperature in degrees Kelvin.
+ * @return The temperature in Fahrenheit. */
+ static double KelvinToFahrenheit (double kelvin) {
+ return 1.8*kelvin - 459.4;
+ }
+
+ /** Converts from degrees Celsius to degrees Rankine.
+ * @param celsius The temperature in degrees Celsius.
+ * @return The temperature in Rankine. */
+ static double CelsiusToRankine (double celsius) {
+ return celsius * 1.8 + 491.67;
+ }
+
+ /** Converts from degrees Rankine to degrees Celsius.
+ * @param rankine The temperature in degrees Rankine.
+ * @return The temperature in Celsius. */
+ static double RankineToCelsius (double rankine) {
+ return (rankine - 491.67)/1.8;
+ }
+
+ /** Converts from degrees Kelvin to degrees Rankine.
+ * @param kelvin The temperature in degrees Kelvin.
+ * @return The temperature in Rankine. */
+ static double KelvinToRankine (double kelvin) {
+ return kelvin * 1.8;
+ }
+
+ /** Converts from degrees Rankine to degrees Kelvin.
+ * @param rankine The temperature in degrees Rankine.
+ * @return The temperature in Kelvin. */
+ static double RankineToKelvin (double rankine) {
+ return rankine/1.8;
+ }
+
+ /** Converts from degrees Fahrenheit to degrees Celsius.
+ * @param fahrenheit The temperature in degrees Fahrenheit.
+ * @return The temperature in Celsius. */
+ static double FahrenheitToCelsius (double fahrenheit) {
+ return (fahrenheit - 32.0)/1.8;
+ }
+
+ /** Converts from degrees Celsius to degrees Fahrenheit.
+ * @param celsius The temperature in degrees Celsius.
+ * @return The temperature in Fahrenheit. */
+ static double CelsiusToFahrenheit (double celsius) {
+ return celsius * 1.8 + 32.0;
+ }
+
+ /** Converts from degrees Celsius to degrees Kelvin
+ * @param celsius The temperature in degrees Celsius.
+ * @return The temperature in Kelvin. */
+ static double CelsiusToKelvin (double celsius) {
+ return celsius + 273.15;
+ }
+
+ /** Converts from degrees Kelvin to degrees Celsius
+ * @param celsius The temperature in degrees Kelvin.
+ * @return The temperature in Celsius. */
+ static double KelvinToCelsius (double kelvin) {
+ return kelvin - 273.15;
+ }
+
+ /** Finite precision comparison.
+ @param a first value to compare
+ @param b second value to compare
+ @return if the two values can be considered equal up to roundoff */
+ static bool EqualToRoundoff(double a, double b) {
+ double eps = 2.0*DBL_EPSILON;
+ return fabs(a - b) <= eps*max(fabs(a), fabs(b));
+ }
+
+ /** Finite precision comparison.
+ @param a first value to compare
+ @param b second value to compare
+ @return if the two values can be considered equal up to roundoff */
+ static bool EqualToRoundoff(float a, float b) {
+ float eps = 2.0*FLT_EPSILON;
+ return fabs(a - b) <= eps*max(fabs(a), fabs(b));
+ }
+
+ /** Finite precision comparison.
+ @param a first value to compare
+ @param b second value to compare
+ @return if the two values can be considered equal up to roundoff */
+ static bool EqualToRoundoff(float a, double b) {
+ return EqualToRoundoff(a, (float)b);
+ }
+
+ /** Finite precision comparison.
+ @param a first value to compare
+ @param b second value to compare
+ @return if the two values can be considered equal up to roundoff */
+ static bool EqualToRoundoff(double a, float b) {
+ return EqualToRoundoff((float)a, b);
+ }
+
+ /** Constrain a value between a minimum and a maximum value.
+ */
+ static double Constrain(double min, double value, double max) {
+ return value<min?(min):(value>max?(max):(value));
+ }
+
+protected:
+ static Message localMsg;
+
+ static std::queue <Message> Messages;
+
+ void Debug(int from) {};
+
+ static unsigned int messageId;
+
+ static const double radtodeg;
+ static const double degtorad;
+ static const double hptoftlbssec;
+ static const double psftoinhg;
+ static const double psftopa;
+ static const double fpstokts;
+ static const double ktstofps;
+ static const double inchtoft;
+ static const double in3tom3;
+ static const double m3toft3;
+ static const double inhgtopa;
+ static const double fttom;
+ static double Reng; // Specific Gas Constant,ft^2/(sec^2*R)
+ static const double SHRatio;
+ static const double lbtoslug;
+ static const double slugtolb;
+ static const double kgtolb;
+ static const double kgtoslug;
+ static const string needed_cfg_version;
+ static const string JSBSim_version;
+
+ static string CreateIndexedPropertyName(string Property, int index)
+ {
+ std::stringstream str;
+ str << index;
+ string tmp;
+ str >> tmp;
+ return Property + "[" + tmp + "]";
+ }
+
+public:
+/// Moments L, M, N
+enum {eL = 1, eM, eN };
+/// Rates P, Q, R
+enum {eP = 1, eQ, eR };
+/// Velocities U, V, W
+enum {eU = 1, eV, eW };
+/// Positions X, Y, Z
+enum {eX = 1, eY, eZ };
+/// Euler angles Phi, Theta, Psi
+enum {ePhi = 1, eTht, ePsi };
+/// Stability axis forces, Drag, Side force, Lift
+enum {eDrag = 1, eSide, eLift };
+/// Local frame orientation Roll, Pitch, Yaw
+enum {eRoll = 1, ePitch, eYaw };
+/// Local frame position North, East, Down
+enum {eNorth = 1, eEast, eDown };
+/// Locations Radius, Latitude, Longitude
+enum {eLat = 1, eLong, eRad };
+/// Conversion specifiers
+enum {inNone = 0, inDegrees, inRadians, inMeters, inFeet };
+