00001
00002 #pragma ident "$Id: MoonForce.cpp 2457 2010-08-18 14:20:12Z coandrei $"
00003
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "MoonForce.hpp"
00033 #include "ASConstant.hpp"
00034 #include "ReferenceFrames.hpp"
00035
00036 namespace gpstk
00037 {
00038
00039 MoonForce::MoonForce()
00040 : mu(ASConstant::GM_Moon)
00041 {}
00042
00043
00044
00045
00046
00047
00048
00049
00050 void MoonForce::doCompute(UTCTime utc, EarthBody& rb, Spacecraft& sc)
00051 {
00052
00053
00054
00055
00056
00057
00058 Vector<double> r_moon = ReferenceFrames::getJ2kPosition(utc.asTDB(), SolarSystem::Moon);
00059
00060 r_moon = r_moon * 1000.0;
00061
00062 Vector<double> d = sc.R() - r_moon;
00063 double dmag = norm(d);
00064 double dcubed = dmag * dmag *dmag;
00065
00066 Vector<double> temp1 = d / dcubed;
00067
00068 double smag = norm(r_moon);
00069 double scubed = smag * smag * smag;
00070
00071 Vector<double> temp2 = r_moon / scubed;
00072
00073 Vector<double> sum = temp1 + temp2;
00074 a = sum * (-mu);
00075
00076
00077 da_dr.resize(3,3,0.0);
00078 double muod3 = mu / dcubed;
00079 double jk = 3.0 * muod3/dmag/dmag;
00080
00081 double xx = d(0);
00082 double yy = d(1);
00083 double zz = d(2);
00084
00085 da_dr(0,0) = jk * xx * xx - muod3;
00086 da_dr(0,1) = jk * xx * yy;
00087 da_dr(0,2) = jk * xx * zz;
00088
00089 da_dr(1,0) = da_dr(0,1);
00090 da_dr(1,1) = jk * yy * yy - muod3;
00091 da_dr(1,2) = jk * yy * zz;
00092
00093 da_dr(2,0) = da_dr(0,2);
00094 da_dr(2,1) = da_dr(1,2);
00095 da_dr(2,2) = jk * zz * zz - muod3;
00096
00097
00098 da_dv.resize(3,3,0.0);
00099
00100
00101
00102
00103 }
00104
00105
00106 }
00107
00108