00001 #pragma ident "$Id: SunPosition.cpp 1161 2008-03-27 17:16:22Z ckiesch $"
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 "SunPosition.hpp"
00033
00034
00035 namespace gpstk
00036 {
00037
00038
00039
00040 const DayTime SunPosition::initialTime(1900, 3, 1, 0, 0, 0.0);
00041
00042
00043 const DayTime SunPosition::finalTime(2100, 2, 28, 0, 0, 0.0);
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 Triple SunPosition::getPosition(const DayTime& t) const
00054 throw(InvalidRequest)
00055 {
00056
00057
00058 if ( (t < SunPosition::initialTime) ||
00059 (t > SunPosition::finalTime) )
00060 {
00061 InvalidRequest ir("Provided epoch is out of bounds.");
00062 GPSTK_THROW(ir);
00063 }
00064
00065
00066 Triple res;
00067
00068 res = SunPosition::getPositionCIS(t);
00069 res = CIS2CTS(res, t);
00070
00071 return res;
00072 }
00073
00074
00075
00076
00077
00078
00079
00080 Triple SunPosition::getPositionCIS(const DayTime& t) const
00081 throw(InvalidRequest)
00082 {
00083
00084
00085 if ( (t < SunPosition::initialTime) ||
00086 (t > SunPosition::finalTime) )
00087 {
00088 InvalidRequest ir("Provided epoch is out of bounds.");
00089 GPSTK_THROW(ir);
00090 }
00091
00092
00093 int y(t.year());
00094 int doy(t.DOY());
00095 double fd( (t.secOfDay()/86400.0 ) );
00096 int years( (y - 1900) );
00097 int iy4( ( ((y%4)+4)%4 ) );
00098
00099
00100 double yearfrac = ( ( static_cast<double>(4*(doy-1/(iy4+1))
00101 - iy4 - 2) + 4.0 * fd ) / 1461.0 );
00102
00103 double time(years+yearfrac);
00104
00105
00106 double elm( fmod((4.881628 + TWO_PI*yearfrac +
00107 0.0001342*time), TWO_PI) );
00108
00109
00110 double gamma(4.90823 + 0.00030005*time);
00111
00112
00113 double em(elm-gamma);
00114
00115
00116 double eps0(0.40931975 - 2.27e-6*time);
00117
00118
00119 double e(0.016751 - 4.2e-7*time);
00120 double esq(e*e);
00121
00122
00123 double v(em + 2.0*e*std::sin(em) + 1.25*esq*std::sin(2.0*em));
00124
00125
00126 double elt(v+gamma);
00127
00128
00129 double r( (1.0 - esq)/(1.0 + e*std::cos(v)) );
00130
00131
00132 double elmm( fmod((4.72 + 83.9971*time),TWO_PI) );
00133
00134
00135 double coselt(std::cos(elt));
00136 double sineps(std::sin(eps0));
00137 double coseps(std::cos(eps0));
00138 double w1(-r*std::sin(elt));
00139 double selmm(std::sin(elmm));
00140 double celmm(std::cos(elmm));
00141
00142 Triple result;
00143
00144
00145 result.theArray[0] = (r*coselt+MeanEarthMoonBary*celmm)*AU_CONST;
00146 result.theArray[1] = (MeanEarthMoonBary*selmm-w1)*coseps*AU_CONST;
00147 result.theArray[2] = (-w1*sineps)*AU_CONST;
00148
00149 return result;
00150 }
00151
00152
00153 }