-/*******************************************************************************
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Module: FGUtility.cpp
Author: Jon Berndt
--------------------------------------------------------------------------------
01/09/99 JSB Created
-********************************************************************************
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINES
-*******************************************************************************/
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-/*******************************************************************************
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
INCLUDES
-*******************************************************************************/
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#ifdef FGFS
-# include <Include/compiler.h>
-# ifdef FG_HAVE_STD_INCLUDES
+# include <simgear/compiler.h>
+# ifdef SG_HAVE_STD_INCLUDES
# include <cmath>
# else
# include <math.h>
# endif
#else
-# include <cmath>
+# if defined(sgi) && !defined(__GNUC__)
+# include <math.h>
+# else
+# include <cmath>
+# endif
#endif
#include "FGUtility.h"
#include "FGState.h"
#include "FGFDMExec.h"
-/*******************************************************************************
-************************************ CODE **************************************
-*******************************************************************************/
+namespace JSBSim {
+
+static const char *IdSrc = "$Id$";
+static const char *IdHdr = ID_UTILITY;
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS IMPLEMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
FGUtility::FGUtility()
{
- // Move constant stuff to here (if any) so it won't take CPU time
- // in the methods below.
- SeaLevelR = EARTHRAD * ECCENT;
+ Debug(0);
}
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FGUtility::~FGUtility()
{
+ Debug(1);
}
-
-float FGUtility::ToGeodetic()
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+// The bitmasked value choices are as follows:
+// unset: In this case (the default) JSBSim would only print
+// out the normally expected messages, essentially echoing
+// the config files as they are read. If the environment
+// variable is not set, debug_lvl is set to 1 internally
+// 0: This requests JSBSim not to output any messages
+// whatsoever.
+// 1: This value explicity requests the normal JSBSim
+// startup messages
+// 2: This value asks for a message to be printed out when
+// a class is instantiated
+// 4: When this value is set, a message is displayed when a
+// FGModel object executes its Run() method
+// 8: When this value is set, various runtime state variables
+// are printed out periodically
+// 16: When set various parameters are sanity checked and
+// a message is printed out when they go out of bounds
+
+void FGUtility::Debug(int from)
{
- float Latitude, Radius, Altitude;
- float tanLat, xAlpha, muAlpha, sinmuAlpha, denom, rhoAlpha, dMu;
- float lPoint, lambdaSL, sinlambdaSL, dLambda, rAlpha;
-
- Latitude = State->Getlatitude();
- Radius = State->Geth() + EARTHRAD;
-
- if (( M_PI_2 - Latitude < ONESECOND) ||
- ( M_PI_2 + Latitude < ONESECOND)) { // Near a pole
- } else {
- tanLat = tan(Latitude);
- xAlpha = ECCENT*EARTHRAD /
- sqrt(tanLat*tanLat + ECCENTSQRD);
- muAlpha = atan2(sqrt(EARTHRADSQRD - xAlpha*xAlpha), ECCENT*xAlpha);
-
- if (Latitude < 0.0) muAlpha = -muAlpha;
-
- sinmuAlpha = sin(muAlpha);
- dLambda = muAlpha - Latitude;
- rAlpha = xAlpha / cos(Latitude);
- lPoint = Radius - rAlpha;
- Altitude = lPoint*cos(dLambda);
- denom = sqrt(1-EPS*EPS*sinmuAlpha*sinmuAlpha);
- rhoAlpha = EARTHRAD*(1.0 - EPS) / (denom*denom*denom);
- dMu = atan2(lPoint*sin(dLambda),rhoAlpha + Altitude);
- State->SetGeodeticLat(muAlpha - dMu);
- lambdaSL = atan(ECCENTSQRD*tan(muAlpha - dMu));
- sinlambdaSL = sin(lambdaSL);
- SeaLevelR = sqrt(EARTHRADSQRD / (1 + INVECCENTSQRDM1* sinlambdaSL*sinlambdaSL));
- }
- return 0.0;
-}
+ if (debug_lvl <= 0) return;
+ if (debug_lvl & 1) { // Standard console startup message output
+ if (from == 0) { // Constructor
-float FGUtility:: FromGeodetic()
-{
- float lambdaSL, sinlambdaSL, coslambdaSL, sinMu, cosMu, py, px;
- float Altitude, SeaLevelR, Radius;
-
- Radius = State->Geth() + EARTHRAD;
- lambdaSL = atan(ECCENTSQRD*tan(State->GetGeodeticLat()));
- sinlambdaSL = sin(lambdaSL);
- coslambdaSL = cos(lambdaSL);
- sinMu = sin(State->GetGeodeticLat());
- cosMu = cos(State->GetGeodeticLat());
- SeaLevelR = sqrt(EARTHRADSQRD /
- (1 + INVECCENTSQRDM1*sinlambdaSL*sinlambdaSL));
- Altitude = Radius - SeaLevelR;
- px = SeaLevelR*coslambdaSL + Altitude*cosMu;
- py = SeaLevelR*sinlambdaSL + Altitude*sinMu;
- State->Setlatitude(atan2(py,px));
- return 0.0;
+ }
+ }
+ if (debug_lvl & 2 ) { // Instantiation/Destruction notification
+ if (from == 0) cout << "Instantiated: FGUtility" << endl;
+ if (from == 1) cout << "Destroyed: FGUtility" << endl;
+ }
+ if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
+ }
+ if (debug_lvl & 8 ) { // Runtime state variables
+ }
+ if (debug_lvl & 16) { // Sanity checking
+ }
+ if (debug_lvl & 64) {
+ if (from == 0) { // Constructor
+ cout << IdSrc << endl;
+ cout << IdHdr << endl;
+ }
+ }
+}
}
-