Exemple #1
0
//------------------------------------------------------------------------------
Real EnvData::GetEnvReal(const std::string &str)
{
   //-------------------------------------------------------
   // 1. Get Spacecraft's central body (It's done in InitializeRefObjects())
   // 2. Get current time (use parameter or sc pointer?)
   // 3. Get spacecraft's position (use parameter?)
   // 4. Call GetDensity() on central body
   //-------------------------------------------------------
   
   if (mSpacecraft == NULL || mSolarSystem == NULL || mOrigin == NULL)
      InitializeRefObjects();

   if (str == "AtmosDensity")
   {
      Real a1mjd = mSpacecraft->GetRealParameter("A1Epoch");
      Rvector6 cartState = mSpacecraft->GetState().GetState();
      
//       // Rvector6 cartState = mSpacecraft->GetStateVector("Cartesian");
//       Rvector6 cartState = mSpacecraft->GetState(0);
//       Real state[6];
//       for (int i=0; i<6; i++)
//          state[i] = cartState[i];
      Real *state = (Real*)cartState.GetDataVector();
      Real density = 0.0;
      
      // Call GetDensity() on if origin is CelestialBody
      if (mOrigin->IsOfType(Gmat::CELESTIAL_BODY))
      {
         if (((CelestialBody*)mOrigin)->GetDensity(state, &density, a1mjd, 1))
         {
            #ifdef DEBUG_ENVDATA_RUN
            MessageInterface::ShowMessage
               ("EnvData::GetEnvReal() mOrigin=%s, a1mjd=%f, state=%s, density=%g\n",
                mOrigin->GetName().c_str(), a1mjd, cartState.ToString().c_str(), density);
            #endif
         }
         else
         {
            #ifdef DEBUG_ENVDATA_RUN
            MessageInterface::ShowMessage
               ("EnvData::GetEnvReal() AtmosphereModel used for %s is NULL\n",
                mOrigin->GetName().c_str());
            #endif
         }
      }
      
      return density;
   }
   else
   {
      throw ParameterException("EnvData::GetEnvReal() Unknown parameter name: " +
                               str);
   }
}
Exemple #2
0
//------------------------------------------------------------------------------
Rvector6 PointMassForce::GetDerivativesForSpacecraft(Spacecraft *sc)
{
   Rvector6 dv;

   Real *j2kState = sc->GetState().GetState();
   Real state[6];
   Real now = sc->GetEpoch();

   BuildModelState(now, state, j2kState);

   #ifdef DEBUG_FIRST_CALL
      if (!firstCallFired)
         MessageInterface::ShowMessage("Point Mass %s: Pos = [%lf %lf %lf] -> ",
               bodyName.c_str(), state[0], state[1], state[2]);
   #endif


   Real radius, r3, mu_r, rbb3, mu_rbb, a_indirect[3];

   Real relativePosition[3];
   Rvector6 bodyrv = body->GetState(now);
   Rvector6 orig = forceOrigin->GetMJ2000State(now);

   const Real *brv = bodyrv.GetDataVector(), *orv = orig.GetDataVector();
   Real rv[3];
   rv[0] = brv[0] - orv[0];
   rv[1] = brv[1] - orv[1];
   rv[2] = brv[2] - orv[2];

   // The vector from the force origin to the gravitating body
   // Precalculations for the indirect effect term
   rbb3 = rv[0]*rv[0]+rv[1]*rv[1]+rv[2]*rv[2];
   if (rbb3 != 0.0)
   {
      //rbb3 *= sqrt(rbb3);
     rbb3 = sqrt(rbb3 * rbb3 * rbb3);
      mu_rbb = mu / rbb3;
      a_indirect[0] = mu_rbb * rv[0];
      a_indirect[1] = mu_rbb * rv[1];
      a_indirect[2] = mu_rbb * rv[2];
   }
   else
      a_indirect[0] = a_indirect[1] = a_indirect[2] = 0.0;

   {
      //relativePosition[0] = rv[0] - state[0];
      //relativePosition[1] = rv[1] - state[1];
      //relativePosition[2] = rv[2] - state[2];
      relativePosition[0] = - state[0];
      relativePosition[1] = - state[1];
      relativePosition[2] = - state[2];

      r3 = relativePosition[0]*relativePosition[0] +
           relativePosition[1]*relativePosition[1] +
           relativePosition[2]*relativePosition[2];

      radius = sqrt(r3);
      r3 *= radius;
      mu_r = mu / r3;

      dv[3] = relativePosition[0] * mu_r - a_indirect[0];
      dv[4] = relativePosition[1] * mu_r - a_indirect[1];
      dv[5] = relativePosition[2] * mu_r - a_indirect[2];
      #ifdef DEBUG_DERIVATIVES_FOR_SPACECRAFT
         MessageInterface::ShowMessage("***PMF AX in GD4SC: %.12lf * %.12le -"
            " %.12le = %.12le\n", relativePosition[0], mu_r, a_indirect[0], 
            dv[3]);
      #endif
   }

   #ifdef DEBUG_FIRST_CALL
      if (!firstCallFired)
         MessageInterface::ShowMessage("Accel = [%le %le %le]\n", dv[3],
               dv[4], dv[5]);
   #endif

   return dv;
}