00001 #pragma ident "$Id: RelativityEffect.cpp 2457 2010-08-18 14:20:12Z coandrei $"
00002
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 "RelativityEffect.hpp"
00033 #include "ASConstant.hpp"
00034
00035 namespace gpstk
00036 {
00037
00038 void RelativityEffect::doCompute(UTCTime utc, EarthBody& rb, Spacecraft& sc)
00039 {
00040
00041
00042
00043
00044
00045 const double GM = ASConstant::GM_Earth;
00046 const double C = ASConstant::SPEED_OF_LIGHT;
00047
00048 Vector<double> r = sc.R();
00049 Vector<double> v = sc.V();
00050
00051 double beta = 1.0;
00052 double gama = 1.0;
00053
00054 double c2 = C * C;
00055 double r2 = dot(r,r);
00056 double v2 = dot(v,v);
00057
00058 double r_mag = norm(r);
00059 double r3 = r2 * r_mag;
00060
00061 double p = GM/c2/r3;
00062
00063
00064 a.resize(3,0.0);
00065
00066 double pr = 2.0 * (beta + gama) * GM / r_mag - gama * v2;
00067 double pv = 2.0 * (1.0 + gama) * dot(r,v);
00068
00069 a = p * ( pr * r + pv * v );
00070
00071
00072 da_dr.resize(3,3,0.0);
00073
00074 double prr = -(GM/r_mag)*(GM/r_mag)*(2.0*(beta+gama)/c2);
00075 double pvv = (GM/r3)*(2.0*(1.0+gama)/c2);
00076 double par = -3.0/r2;
00077 double ppr = (GM/r3)*((GM/r_mag)*(2.0*(beta+gama)/c2)-gama*v2/c2);
00078
00079 for(int i=0; i<3; i++)
00080 {
00081 for(int j=0; j<3; j++)
00082 {
00083 double det = (i == j) ? 1.0 : 0.0;
00084
00085 da_dr(i,j) = prr*r(i)*r(j)
00086 + pvv*v(i)*v(j)
00087 + par*a(i)*r(j)
00088 + ppr*det;
00089 }
00090 }
00091
00092
00093 da_dv.resize(3,3,0.0);
00094
00095 double prv = -(GM/r3)*(2.0*gama/c2);
00096 double pvr = (GM/r3)*(2.0*(1.0+gama)/c2);
00097 double ppv = pvr*dot(r,v);
00098
00099 for(int i=0;i<3;i++)
00100 {
00101 for(int j=0;j<3;j++)
00102 {
00103 double det = (i == j) ? 1.0 : 0.0;
00104
00105 da_dr(i,j) = prv*r(i)*v(j)
00106 + pvr*v(i)*r(j)
00107 + ppv*det;
00108 }
00109 }
00110
00111
00112
00113
00114 }
00115
00116
00117 }
00118
00119
00120
00121