//------------------------------------------------------------------------------ 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); } }
//------------------------------------------------------------------------------ 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; }