00001 #pragma ident "$Id: SolidTides.cpp 1161 2008-03-27 17:16:22Z ckiesch $"
00002
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "SolidTides.hpp"
00032
00033
00034 namespace gpstk
00035 {
00036
00037
00038
00039 const double SolidTides::H_LOVE(0.609), SolidTides::L_LOVE(0.0852);
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 Triple SolidTides::getSolidTide(const DayTime& t,
00060 const Position& p) const
00061 throw(InvalidRequest)
00062 {
00063
00064
00065 Triple res;
00066
00067
00068 SunPosition sunPosition;
00069 MoonPosition moonPosition;
00070
00071
00072 try
00073 {
00074
00075
00076 Triple sunPos(sunPosition.getPosition(t));
00077 Triple moonPos(moonPosition.getPosition(t));
00078
00079
00080
00081 double rpRs( p.X()*sunPos.theArray[0] +
00082 p.Y()*sunPos.theArray[1] +
00083 p.Z()*sunPos.theArray[2]);
00084
00085 double Rs2(sunPos.theArray[0]*sunPos.theArray[0] +
00086 sunPos.theArray[1]*sunPos.theArray[1] +
00087 sunPos.theArray[2]*sunPos.theArray[2]);
00088
00089 double rp2( p.X()*p.X() + p.Y()*p.Y() + p.Z()*p.Z() );
00090
00091 double xy2p( p.X()*p.X() + p.Y()*p.Y() );
00092 double sqxy2p( std::sqrt(xy2p) );
00093
00094 double sqRs2(std::sqrt(Rs2));
00095
00096 double fac_s( 3.0*MU_SUN*rp2/(sqRs2*sqRs2*sqRs2*sqRs2*sqRs2) );
00097
00098 double g1sun( fac_s*(rpRs*rpRs/2.0 - rp2*Rs2/6.0) );
00099
00100 double g2sun( fac_s * rpRs * (sunPos.theArray[1]*p.X() -
00101 sunPos.theArray[0]*p.Y()) * std::sqrt(rp2)/sqxy2p );
00102
00103 double g3sun( fac_s * rpRs * ( sqxy2p* sunPos.theArray[2] -
00104 p.Z()/sqxy2p * (p.X()*sunPos.theArray[0] +
00105 p.Y()*sunPos.theArray[1]) ) );
00106
00107
00108
00109 double rpRm( p.X()*moonPos.theArray[0] +
00110 p.Y()*moonPos.theArray[1] +
00111 p.Z()*moonPos.theArray[2]);
00112
00113 double Rm2(moonPos.theArray[0]*moonPos.theArray[0] +
00114 moonPos.theArray[1]*moonPos.theArray[1] +
00115 moonPos.theArray[2]*moonPos.theArray[2]);
00116
00117 double sqRm2(std::sqrt(Rm2));
00118
00119 double fac_m( 3.0*MU_MOON*rp2/(sqRm2*sqRm2*sqRm2*sqRm2*sqRm2) );
00120
00121 double g1moon( fac_m*(rpRm*rpRm/2.0 - rp2*Rm2/6.0) );
00122
00123 double g2moon( fac_m * rpRm * (moonPos.theArray[1]*p.X() -
00124 moonPos.theArray[0]*p.Y()) * std::sqrt(rp2)/sqxy2p );
00125
00126 double g3moon( fac_m * rpRm * ( sqxy2p* moonPos.theArray[2] -
00127 p.Z()/sqxy2p * (p.X()*moonPos.theArray[0] +
00128 p.Y()*moonPos.theArray[1]) ) );
00129
00130
00131 double delta_sun1(H_LOVE*g1sun);
00132 double delta_sun2(L_LOVE*g2sun);
00133 double delta_sun3(L_LOVE*g3sun);
00134
00135
00136 double delta_moon1(H_LOVE*g1moon);
00137 double delta_moon2(L_LOVE*g2moon);
00138 double delta_moon3(L_LOVE*g3moon);
00139
00140
00141 res.theArray[0] = delta_sun1 + delta_moon1;
00142 res.theArray[1] = delta_sun2 + delta_moon2;
00143 res.theArray[2] = delta_sun3 + delta_moon3;
00144
00145 }
00146 catch(InvalidRequest& ir)
00147 {
00148 GPSTK_RETHROW(ir);
00149 }
00150
00151 return res;
00152
00153 }
00154
00155
00156 }