Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
sgp4sdp4.c
00001 /* 00002 * Unit SGP4SDP4 00003 * Author: Dr TS Kelso 00004 * Original Version: 1991 Oct 30 00005 * Current Revision: 1992 Sep 03 00006 * Version: 1.50 00007 * Copyright: 1991-1992, All Rights Reserved 00008 * 00009 * Ported to C by: Neoklis Kyriazis April 10 2001 00010 */ 00011 00012 #include "sgp4sdp4.h" 00013 00014 /* SGP4 */ 00015 /* This function is used to calculate the position and velocity */ 00016 /* of near-earth (period < 225 minutes) satellites. tsince is */ 00017 /* time since epoch in minutes, tle is a pointer to a tle_t */ 00018 /* structure with Keplerian orbital elements and pos and vel */ 00019 /* are vector_t structures returning ECI satellite position and */ 00020 /* velocity. Use Convert_Sat_State() to convert to km and km/s.*/ 00021 void 00022 SGP4(double tsince, tle_t *tle, vector_t *pos, vector_t *vel, double* phase) 00023 { 00024 static double 00025 aodp,aycof,c1,c4,c5,cosio,d2,d3,d4,delmo,omgcof, 00026 eta,omgdot,sinio,xnodp,sinmo,t2cof,t3cof,t4cof,t5cof, 00027 x1mth2,x3thm1,x7thm1,xmcof,xmdot,xnodcf,xnodot,xlcof; 00028 00029 double 00030 cosuk,sinuk,rfdotk,vx,vy,vz,ux,uy,uz,xmy,xmx, 00031 cosnok,sinnok,cosik,sinik,rdotk,xinck,xnodek,uk, 00032 rk,cos2u,sin2u,u,sinu,cosu,betal,rfdot,rdot,r,pl, 00033 elsq,esine,ecose,epw,cosepw,x1m5th,xhdot1,tfour, 00034 sinepw,capu,ayn,xlt,aynl,xll,axn,xn,beta,xl,e,a, 00035 tcube,delm,delomg,templ,tempe,tempa,xnode,tsq,xmp, 00036 omega,xnoddf,omgadf,xmdf,a1,a3ovk2,ao,betao,betao2, 00037 c1sq,c2,c3,coef,coef1,del1,delo,eeta,eosq,etasq, 00038 perige,pinvsq,psisq,qoms24,s4,temp,temp1,temp2, 00039 temp3,temp4,temp5,temp6,theta2,theta4,tsi; 00040 00041 int i; 00042 00043 /* Initialization */ 00044 if (isFlagClear(SGP4_INITIALIZED_FLAG)) 00045 { 00046 SetFlag(SGP4_INITIALIZED_FLAG); 00047 00048 /* Recover original mean motion (xnodp) and */ 00049 /* semimajor axis (aodp) from input elements. */ 00050 a1 = pow(xke/tle->xno,tothrd); 00051 cosio = cos(tle->xincl); 00052 theta2 = cosio*cosio; 00053 x3thm1 = 3*theta2-1.0; 00054 eosq = tle->eo*tle->eo; 00055 betao2 = 1-eosq; 00056 betao = sqrt(betao2); 00057 del1 = 1.5*ck2*x3thm1/(a1*a1*betao*betao2); 00058 ao = a1*(1-del1*(0.5*tothrd+del1*(1+134/81*del1))); 00059 delo = 1.5*ck2*x3thm1/(ao*ao*betao*betao2); 00060 xnodp = tle->xno/(1+delo); 00061 aodp = ao/(1-delo); 00062 00063 /* For perigee less than 220 kilometers, the "simple" flag is set */ 00064 /* and the equations are truncated to linear variation in sqrt a */ 00065 /* and quadratic variation in mean anomaly. Also, the c3 term, */ 00066 /* the delta omega term, and the delta m term are dropped. */ 00067 if((aodp*(1-tle->eo)/ae) < (220/xkmper+ae)) 00068 SetFlag(SIMPLE_FLAG); 00069 else 00070 ClearFlag(SIMPLE_FLAG); 00071 00072 /* For perigee below 156 km, the */ 00073 /* values of s and qoms2t are altered. */ 00074 s4 = __s__; 00075 qoms24 = qoms2t; 00076 perige = (aodp*(1-tle->eo)-ae)*xkmper; 00077 if(perige < 156) 00078 { 00079 if(perige <= 98) 00080 s4 = 20; 00081 else 00082 s4 = perige-78; 00083 qoms24 = pow((120-s4)*ae/xkmper,4); 00084 s4 = s4/xkmper+ae; 00085 }; /* End of if(perige <= 98) */ 00086 00087 pinvsq = 1/(aodp*aodp*betao2*betao2); 00088 tsi = 1/(aodp-s4); 00089 eta = aodp*tle->eo*tsi; 00090 etasq = eta*eta; 00091 eeta = tle->eo*eta; 00092 psisq = fabs(1-etasq); 00093 coef = qoms24*pow(tsi,4); 00094 coef1 = coef/pow(psisq,3.5); 00095 c2 = coef1*xnodp*(aodp*(1+1.5*etasq+eeta*(4+etasq))+ 00096 0.75*ck2*tsi/psisq*x3thm1*(8+3*etasq*(8+etasq))); 00097 c1 = tle->bstar*c2; 00098 sinio = sin(tle->xincl); 00099 a3ovk2 = -xj3/ck2*pow(ae,3); 00100 c3 = coef*tsi*a3ovk2*xnodp*ae*sinio/tle->eo; 00101 x1mth2 = 1-theta2; 00102 c4 = 2*xnodp*coef1*aodp*betao2*(eta*(2+0.5*etasq)+ 00103 tle->eo*(0.5+2*etasq)-2*ck2*tsi/(aodp*psisq)* 00104 (-3*x3thm1*(1-2*eeta+etasq*(1.5-0.5*eeta))+0.75* 00105 x1mth2*(2*etasq-eeta*(1+etasq))*cos(2*tle->omegao))); 00106 c5 = 2*coef1*aodp*betao2*(1+2.75*(etasq+eeta)+eeta*etasq); 00107 theta4 = theta2*theta2; 00108 temp1 = 3*ck2*pinvsq*xnodp; 00109 temp2 = temp1*ck2*pinvsq; 00110 temp3 = 1.25*ck4*pinvsq*pinvsq*xnodp; 00111 xmdot = xnodp+0.5*temp1*betao*x3thm1+ 00112 0.0625*temp2*betao*(13-78*theta2+137*theta4); 00113 x1m5th = 1-5*theta2; 00114 omgdot = -0.5*temp1*x1m5th+0.0625*temp2*(7-114*theta2+ 00115 395*theta4)+temp3*(3-36*theta2+49*theta4); 00116 xhdot1 = -temp1*cosio; 00117 xnodot = xhdot1+(0.5*temp2*(4-19*theta2)+ 00118 2*temp3*(3-7*theta2))*cosio; 00119 omgcof = tle->bstar*c3*cos(tle->omegao); 00120 xmcof = -tothrd*coef*tle->bstar*ae/eeta; 00121 xnodcf = 3.5*betao2*xhdot1*c1; 00122 t2cof = 1.5*c1; 00123 xlcof = 0.125*a3ovk2*sinio*(3+5*cosio)/(1+cosio); 00124 aycof = 0.25*a3ovk2*sinio; 00125 delmo = pow(1+eta*cos(tle->xmo),3); 00126 sinmo = sin(tle->xmo); 00127 x7thm1 = 7*theta2-1; 00128 if (isFlagClear(SIMPLE_FLAG)) 00129 { 00130 c1sq = c1*c1; 00131 d2 = 4*aodp*tsi*c1sq; 00132 temp = d2*tsi*c1/3; 00133 d3 = (17*aodp+s4)*temp; 00134 d4 = 0.5*temp*aodp*tsi*(221*aodp+31*s4)*c1; 00135 t3cof = d2+2*c1sq; 00136 t4cof = 0.25*(3*d3+c1*(12*d2+10*c1sq)); 00137 t5cof = 0.2*(3*d4+12*c1*d3+6*d2*d2+15*c1sq*(2*d2+c1sq)); 00138 }; /* End of if (isFlagClear(SIMPLE_FLAG)) */ 00139 }; /* End of SGP4() initialization */ 00140 00141 /* Update for secular gravity and atmospheric drag. */ 00142 xmdf = tle->xmo+xmdot*tsince; 00143 omgadf = tle->omegao+omgdot*tsince; 00144 xnoddf = tle->xnodeo+xnodot*tsince; 00145 omega = omgadf; 00146 xmp = xmdf; 00147 tsq = tsince*tsince; 00148 xnode = xnoddf+xnodcf*tsq; 00149 tempa = 1-c1*tsince; 00150 tempe = tle->bstar*c4*tsince; 00151 templ = t2cof*tsq; 00152 if (isFlagClear(SIMPLE_FLAG)) 00153 { 00154 delomg = omgcof*tsince; 00155 delm = xmcof*(pow(1+eta*cos(xmdf),3)-delmo); 00156 temp = delomg+delm; 00157 xmp = xmdf+temp; 00158 omega = omgadf-temp; 00159 tcube = tsq*tsince; 00160 tfour = tsince*tcube; 00161 tempa = tempa-d2*tsq-d3*tcube-d4*tfour; 00162 tempe = tempe+tle->bstar*c5*(sin(xmp)-sinmo); 00163 templ = templ+t3cof*tcube+tfour*(t4cof+tsince*t5cof); 00164 }; /* End of if (isFlagClear(SIMPLE_FLAG)) */ 00165 00166 a = aodp*pow(tempa,2); 00167 e = tle->eo-tempe; 00168 xl = xmp+omega+xnode+xnodp*templ; 00169 beta = sqrt(1-e*e); 00170 xn = xke/pow(a,1.5); 00171 00172 /* Long period periodics */ 00173 axn = e*cos(omega); 00174 temp = 1/(a*beta*beta); 00175 xll = temp*xlcof*axn; 00176 aynl = temp*aycof; 00177 xlt = xl+xll; 00178 ayn = e*sin(omega)+aynl; 00179 00180 /* Solve Kepler's' Equation */ 00181 capu = FMod2p(xlt-xnode); 00182 temp2 = capu; 00183 00184 i = 0; 00185 do 00186 { 00187 sinepw = sin(temp2); 00188 cosepw = cos(temp2); 00189 temp3 = axn*sinepw; 00190 temp4 = ayn*cosepw; 00191 temp5 = axn*cosepw; 00192 temp6 = ayn*sinepw; 00193 epw = (capu-temp4+temp3-temp2)/(1-temp5-temp6)+temp2; 00194 if(fabs(epw-temp2) <= e6a) break; 00195 temp2 = epw; 00196 } 00197 while( i++ < 10 ); 00198 00199 /* Short period preliminary quantities */ 00200 ecose = temp5+temp6; 00201 esine = temp3-temp4; 00202 elsq = axn*axn+ayn*ayn; 00203 temp = 1-elsq; 00204 pl = a*temp; 00205 r = a*(1-ecose); 00206 temp1 = 1/r; 00207 rdot = xke*sqrt(a)*esine*temp1; 00208 rfdot = xke*sqrt(pl)*temp1; 00209 temp2 = a*temp1; 00210 betal = sqrt(temp); 00211 temp3 = 1/(1+betal); 00212 cosu = temp2*(cosepw-axn+ayn*esine*temp3); 00213 sinu = temp2*(sinepw-ayn-axn*esine*temp3); 00214 u = AcTan(sinu, cosu); 00215 sin2u = 2*sinu*cosu; 00216 cos2u = 2*cosu*cosu-1; 00217 temp = 1/pl; 00218 temp1 = ck2*temp; 00219 temp2 = temp1*temp; 00220 00221 /* Update for short periodics */ 00222 rk = r*(1-1.5*temp2*betal*x3thm1)+0.5*temp1*x1mth2*cos2u; 00223 uk = u-0.25*temp2*x7thm1*sin2u; 00224 xnodek = xnode+1.5*temp2*cosio*sin2u; 00225 xinck = tle->xincl+1.5*temp2*cosio*sinio*cos2u; 00226 rdotk = rdot-xn*temp1*x1mth2*sin2u; 00227 rfdotk = rfdot+xn*temp1*(x1mth2*cos2u+1.5*x3thm1); 00228 00229 /* Orientation vectors */ 00230 sinuk = sin(uk); 00231 cosuk = cos(uk); 00232 sinik = sin(xinck); 00233 cosik = cos(xinck); 00234 sinnok = sin(xnodek); 00235 cosnok = cos(xnodek); 00236 xmx = -sinnok*cosik; 00237 xmy = cosnok*cosik; 00238 ux = xmx*sinuk+cosnok*cosuk; 00239 uy = xmy*sinuk+sinnok*cosuk; 00240 uz = sinik*sinuk; 00241 vx = xmx*cosuk-cosnok*sinuk; 00242 vy = xmy*cosuk-sinnok*sinuk; 00243 vz = sinik*cosuk; 00244 00245 /* Position and velocity */ 00246 pos->x = rk*ux; 00247 pos->y = rk*uy; 00248 pos->z = rk*uz; 00249 vel->x = rdotk*ux+rfdotk*vx; 00250 vel->y = rdotk*uy+rfdotk*vy; 00251 vel->z = rdotk*uz+rfdotk*vz; 00252 00253 *phase = xlt-xnode-omgadf+twopi; 00254 if(*phase < 0) *phase += twopi; 00255 *phase = FMod2p(*phase); 00256 00257 tle->omegao1=omega; 00258 tle->xincl1=xinck; 00259 tle->xnodeo1=xnodek; 00260 00261 } /*SGP4*/ 00262 00263 /*------------------------------------------------------------------*/ 00264 00265 /* SDP4 */ 00266 /* This function is used to calculate the position and velocity */ 00267 /* of deep-space (period > 225 minutes) satellites. tsince is */ 00268 /* time since epoch in minutes, tle is a pointer to a tle_t */ 00269 /* structure with Keplerian orbital elements and pos and vel */ 00270 /* are vector_t structures returning ECI satellite position and */ 00271 /* velocity. Use Convert_Sat_State() to convert to km and km/s. */ 00272 void 00273 SDP4(double tsince, tle_t *tle, vector_t *pos, vector_t *vel, double* phase) 00274 { 00275 int i; 00276 00277 static double 00278 x3thm1,c1,x1mth2,c4,xnodcf,t2cof,xlcof,aycof,x7thm1; 00279 00280 double 00281 a,axn,ayn,aynl,beta,betal,capu,cos2u,cosepw,cosik, 00282 cosnok,cosu,cosuk,ecose,elsq,epw,esine,pl,theta4, 00283 rdot,rdotk,rfdot,rfdotk,rk,sin2u,sinepw,sinik, 00284 sinnok,sinu,sinuk,tempe,templ,tsq,u,uk,ux,uy,uz, 00285 vx,vy,vz,xinck,xl,xlt,xmam,xmdf,xmx,xmy,xnoddf, 00286 xnodek,xll,a1,a3ovk2,ao,c2,coef,coef1,x1m5th, 00287 xhdot1,del1,r,delo,eeta,eta,etasq,perige, 00288 psisq,tsi,qoms24,s4,pinvsq,temp,tempa,temp1, 00289 temp2,temp3,temp4,temp5,temp6; 00290 00291 static deep_arg_t deep_arg; 00292 00293 /* Initialization */ 00294 if (isFlagClear(SDP4_INITIALIZED_FLAG)) 00295 { 00296 SetFlag(SDP4_INITIALIZED_FLAG); 00297 00298 /* Recover original mean motion (xnodp) and */ 00299 /* semimajor axis (aodp) from input elements. */ 00300 a1 = pow(xke/tle->xno,tothrd); 00301 deep_arg.cosio = cos(tle->xincl); 00302 deep_arg.theta2 = deep_arg.cosio*deep_arg.cosio; 00303 x3thm1 = 3*deep_arg.theta2-1; 00304 deep_arg.eosq = tle->eo*tle->eo; 00305 deep_arg.betao2 = 1-deep_arg.eosq; 00306 deep_arg.betao = sqrt(deep_arg.betao2); 00307 del1 = 1.5*ck2*x3thm1/(a1*a1*deep_arg.betao*deep_arg.betao2); 00308 ao = a1*(1-del1*(0.5*tothrd+del1*(1+134/81*del1))); 00309 delo = 1.5*ck2*x3thm1/(ao*ao*deep_arg.betao*deep_arg.betao2); 00310 deep_arg.xnodp = tle->xno/(1+delo); 00311 deep_arg.aodp = ao/(1-delo); 00312 00313 /* For perigee below 156 km, the values */ 00314 /* of s and qoms2t are altered. */ 00315 s4 = __s__; 00316 qoms24 = qoms2t; 00317 perige = (deep_arg.aodp*(1-tle->eo)-ae)*xkmper; 00318 if(perige < 156) 00319 { 00320 if(perige <= 98) 00321 s4 = 20; 00322 else 00323 s4 = perige-78; 00324 qoms24 = pow((120-s4)*ae/xkmper,4); 00325 s4 = s4/xkmper+ae; 00326 } 00327 pinvsq = 1/(deep_arg.aodp*deep_arg.aodp* 00328 deep_arg.betao2*deep_arg.betao2); 00329 deep_arg.sing = sin(tle->omegao); 00330 deep_arg.cosg = cos(tle->omegao); 00331 tsi = 1/(deep_arg.aodp-s4); 00332 eta = deep_arg.aodp*tle->eo*tsi; 00333 etasq = eta*eta; 00334 eeta = tle->eo*eta; 00335 psisq = fabs(1-etasq); 00336 coef = qoms24*pow(tsi,4); 00337 coef1 = coef/pow(psisq,3.5); 00338 c2 = coef1*deep_arg.xnodp*(deep_arg.aodp*(1+1.5*etasq+eeta* 00339 (4+etasq))+0.75*ck2*tsi/psisq*x3thm1*(8+3*etasq*(8+etasq))); 00340 c1 = tle->bstar*c2; 00341 deep_arg.sinio = sin(tle->xincl); 00342 a3ovk2 = -xj3/ck2*pow(ae,3); 00343 x1mth2 = 1-deep_arg.theta2; 00344 c4 = 2*deep_arg.xnodp*coef1*deep_arg.aodp*deep_arg.betao2* 00345 (eta*(2+0.5*etasq)+tle->eo*(0.5+2*etasq)-2*ck2*tsi/ 00346 (deep_arg.aodp*psisq)*(-3*x3thm1*(1-2*eeta+etasq* 00347 (1.5-0.5*eeta))+0.75*x1mth2*(2*etasq-eeta*(1+etasq))* 00348 cos(2*tle->omegao))); 00349 theta4 = deep_arg.theta2*deep_arg.theta2; 00350 temp1 = 3*ck2*pinvsq*deep_arg.xnodp; 00351 temp2 = temp1*ck2*pinvsq; 00352 temp3 = 1.25*ck4*pinvsq*pinvsq*deep_arg.xnodp; 00353 deep_arg.xmdot = deep_arg.xnodp+0.5*temp1*deep_arg.betao* 00354 x3thm1+0.0625*temp2*deep_arg.betao* 00355 (13-78*deep_arg.theta2+137*theta4); 00356 x1m5th = 1-5*deep_arg.theta2; 00357 deep_arg.omgdot = -0.5*temp1*x1m5th+0.0625*temp2* 00358 (7-114*deep_arg.theta2+395*theta4)+ 00359 temp3*(3-36*deep_arg.theta2+49*theta4); 00360 xhdot1 = -temp1*deep_arg.cosio; 00361 deep_arg.xnodot = xhdot1+(0.5*temp2*(4-19*deep_arg.theta2)+ 00362 2*temp3*(3-7*deep_arg.theta2))*deep_arg.cosio; 00363 xnodcf = 3.5*deep_arg.betao2*xhdot1*c1; 00364 t2cof = 1.5*c1; 00365 xlcof = 0.125*a3ovk2*deep_arg.sinio*(3+5*deep_arg.cosio)/ 00366 (1+deep_arg.cosio); 00367 aycof = 0.25*a3ovk2*deep_arg.sinio; 00368 x7thm1 = 7*deep_arg.theta2-1; 00369 00370 /* initialize Deep() */ 00371 Deep(dpinit, tle, &deep_arg); 00372 }; /*End of SDP4() initialization */ 00373 00374 /* Update for secular gravity and atmospheric drag */ 00375 xmdf = tle->xmo+deep_arg.xmdot*tsince; 00376 deep_arg.omgadf = tle->omegao+deep_arg.omgdot*tsince; 00377 xnoddf = tle->xnodeo+deep_arg.xnodot*tsince; 00378 tsq = tsince*tsince; 00379 deep_arg.xnode = xnoddf+xnodcf*tsq; 00380 tempa = 1-c1*tsince; 00381 tempe = tle->bstar*c4*tsince; 00382 templ = t2cof*tsq; 00383 deep_arg.xn = deep_arg.xnodp; 00384 00385 /* Update for deep-space secular effects */ 00386 deep_arg.xll = xmdf; 00387 deep_arg.t = tsince; 00388 00389 Deep(dpsec, tle, &deep_arg); 00390 00391 xmdf = deep_arg.xll; 00392 a = pow(xke/deep_arg.xn,tothrd)*tempa*tempa; 00393 deep_arg.em = deep_arg.em-tempe; 00394 xmam = xmdf+deep_arg.xnodp*templ; 00395 00396 /* Update for deep-space periodic effects */ 00397 deep_arg.xll = xmam; 00398 00399 Deep(dpper, tle, &deep_arg); 00400 00401 xmam = deep_arg.xll; 00402 xl = xmam+deep_arg.omgadf+deep_arg.xnode; 00403 beta = sqrt(1-deep_arg.em*deep_arg.em); 00404 deep_arg.xn = xke/pow(a,1.5); 00405 00406 /* Long period periodics */ 00407 axn = deep_arg.em*cos(deep_arg.omgadf); 00408 temp = 1/(a*beta*beta); 00409 xll = temp*xlcof*axn; 00410 aynl = temp*aycof; 00411 xlt = xl+xll; 00412 ayn = deep_arg.em*sin(deep_arg.omgadf)+aynl; 00413 00414 /* Solve Kepler's Equation */ 00415 capu = FMod2p(xlt-deep_arg.xnode); 00416 temp2 = capu; 00417 00418 i = 0; 00419 do 00420 { 00421 sinepw = sin(temp2); 00422 cosepw = cos(temp2); 00423 temp3 = axn*sinepw; 00424 temp4 = ayn*cosepw; 00425 temp5 = axn*cosepw; 00426 temp6 = ayn*sinepw; 00427 epw = (capu-temp4+temp3-temp2)/(1-temp5-temp6)+temp2; 00428 if(fabs(epw-temp2) <= e6a) break; 00429 temp2 = epw; 00430 } 00431 while( i++ < 10 ); 00432 00433 /* Short period preliminary quantities */ 00434 ecose = temp5+temp6; 00435 esine = temp3-temp4; 00436 elsq = axn*axn+ayn*ayn; 00437 temp = 1-elsq; 00438 pl = a*temp; 00439 r = a*(1-ecose); 00440 temp1 = 1/r; 00441 rdot = xke*sqrt(a)*esine*temp1; 00442 rfdot = xke*sqrt(pl)*temp1; 00443 temp2 = a*temp1; 00444 betal = sqrt(temp); 00445 temp3 = 1/(1+betal); 00446 cosu = temp2*(cosepw-axn+ayn*esine*temp3); 00447 sinu = temp2*(sinepw-ayn-axn*esine*temp3); 00448 u = AcTan(sinu,cosu); 00449 sin2u = 2*sinu*cosu; 00450 cos2u = 2*cosu*cosu-1; 00451 temp = 1/pl; 00452 temp1 = ck2*temp; 00453 temp2 = temp1*temp; 00454 00455 /* Update for short periodics */ 00456 rk = r*(1-1.5*temp2*betal*x3thm1)+0.5*temp1*x1mth2*cos2u; 00457 uk = u-0.25*temp2*x7thm1*sin2u; 00458 xnodek = deep_arg.xnode+1.5*temp2*deep_arg.cosio*sin2u; 00459 xinck = deep_arg.xinc+1.5*temp2*deep_arg.cosio*deep_arg.sinio*cos2u; 00460 rdotk = rdot-deep_arg.xn*temp1*x1mth2*sin2u; 00461 rfdotk = rfdot+deep_arg.xn*temp1*(x1mth2*cos2u+1.5*x3thm1); 00462 00463 /* Orientation vectors */ 00464 sinuk = sin(uk); 00465 cosuk = cos(uk); 00466 sinik = sin(xinck); 00467 cosik = cos(xinck); 00468 sinnok = sin(xnodek); 00469 cosnok = cos(xnodek); 00470 xmx = -sinnok*cosik; 00471 xmy = cosnok*cosik; 00472 ux = xmx*sinuk+cosnok*cosuk; 00473 uy = xmy*sinuk+sinnok*cosuk; 00474 uz = sinik*sinuk; 00475 vx = xmx*cosuk-cosnok*sinuk; 00476 vy = xmy*cosuk-sinnok*sinuk; 00477 vz = sinik*cosuk; 00478 00479 /* Position and velocity */ 00480 pos->x = rk*ux; 00481 pos->y = rk*uy; 00482 pos->z = rk*uz; 00483 vel->x = rdotk*ux+rfdotk*vx; 00484 vel->y = rdotk*uy+rfdotk*vy; 00485 vel->z = rdotk*uz+rfdotk*vz; 00486 00487 /* Phase in rads */ 00488 *phase = xlt-deep_arg.xnode-deep_arg.omgadf+twopi; 00489 if(*phase < 0) *phase += twopi; 00490 *phase = FMod2p(*phase); 00491 00492 tle->omegao1=deep_arg.omgadf; 00493 tle->xincl1=deep_arg.xinc; 00494 tle->xnodeo1=deep_arg.xnode; 00495 } /* SDP4 */ 00496 00497 /*------------------------------------------------------------------*/ 00498 00499 /* DEEP */ 00500 /* This function is used by SDP4 to add lunar and solar */ 00501 /* perturbation effects to deep-space orbit objects. */ 00502 void 00503 Deep(int ientry, tle_t *tle, deep_arg_t *deep_arg) 00504 { 00505 static double 00506 thgr,xnq,xqncl,omegaq,zmol,zmos,savtsn,ee2,e3,xi2, 00507 xl2,xl3,xl4,xgh2,xgh3,xgh4,xh2,xh3,sse,ssi,ssg,xi3, 00508 se2,si2,sl2,sgh2,sh2,se3,si3,sl3,sgh3,sh3,sl4,sgh4, 00509 ssl,ssh,d3210,d3222,d4410,d4422,d5220,d5232,d5421, 00510 d5433,del1,del2,del3,fasx2,fasx4,fasx6,xlamo,xfact, 00511 xni,atime,stepp,stepn,step2,preep,pl,sghs,xli, 00512 d2201,d2211,sghl,sh1,pinc,pe,shs,zsingl,zcosgl, 00513 zsinhl,zcoshl,zsinil,zcosil; 00514 00515 double 00516 a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,ainv2,alfdp,aqnv, 00517 sgh,sini2,sinis,sinok,sh,si,sil,day,betdp,dalf, 00518 bfact,c,cc,cosis,cosok,cosq,ctem,f322,zx,zy, 00519 dbet,dls,eoc,eq,f2,f220,f221,f3,f311,f321,xnoh, 00520 f330,f441,f442,f522,f523,f542,f543,g200,g201, 00521 g211,pgh,ph,s1,s2,s3,s4,s5,s6,s7,se,sel,ses,xls, 00522 g300,g310,g322,g410,g422,g520,g521,g532,g533,gam, 00523 sinq,sinzf,sis,sl,sll,sls,stem,temp,temp1,x1,x2, 00524 x2li,x2omi,x3,x4,x5,x6,x7,x8,xl,xldot,xmao,xnddt, 00525 xndot,xno2,xnodce,xnoi,xomi,xpidot,z1,z11,z12,z13, 00526 z2,z21,z22,z23,z3,z31,z32,z33,ze,zf,zm,/* zmo, (see below) */zn, 00527 zsing,zsinh,zsini,zcosg,zcosh,zcosi,delt=0,ft=0; 00528 00529 /* Compiler complains defined but not used. I never like to 00530 edit other peoples libraries but I also dislike compiler 00531 warnings. AjK, 7th Sep 2010. */ 00532 double zmo __attribute__((unused)); 00533 00534 switch(ientry) 00535 { 00536 case dpinit : /* Entrance for deep space initialization */ 00537 thgr = ThetaG(tle->epoch, deep_arg); 00538 eq = tle->eo; 00539 xnq = deep_arg->xnodp; 00540 aqnv = 1/deep_arg->aodp; 00541 xqncl = tle->xincl; 00542 xmao = tle->xmo; 00543 xpidot = deep_arg->omgdot+deep_arg->xnodot; 00544 sinq = sin(tle->xnodeo); 00545 cosq = cos(tle->xnodeo); 00546 omegaq = tle->omegao; 00547 00548 /* Initialize lunar solar terms */ 00549 day = deep_arg->ds50+18261.5; /*Days since 1900 Jan 0.5*/ 00550 if (day != preep) 00551 { 00552 preep = day; 00553 xnodce = 4.5236020-9.2422029E-4*day; 00554 stem = sin(xnodce); 00555 ctem = cos(xnodce); 00556 zcosil = 0.91375164-0.03568096*ctem; 00557 zsinil = sqrt(1-zcosil*zcosil); 00558 zsinhl = 0.089683511*stem/zsinil; 00559 zcoshl = sqrt(1-zsinhl*zsinhl); 00560 c = 4.7199672+0.22997150*day; 00561 gam = 5.8351514+0.0019443680*day; 00562 zmol = FMod2p(c-gam); 00563 zx = 0.39785416*stem/zsinil; 00564 zy = zcoshl*ctem+0.91744867*zsinhl*stem; 00565 zx = AcTan(zx,zy); 00566 zx = gam+zx-xnodce; 00567 zcosgl = cos(zx); 00568 zsingl = sin(zx); 00569 zmos = 6.2565837+0.017201977*day; 00570 zmos = FMod2p(zmos); 00571 } /* End if(day != preep) */ 00572 00573 /* Do solar terms */ 00574 savtsn = 1E20; 00575 zcosg = zcosgs; 00576 zsing = zsings; 00577 zcosi = zcosis; 00578 zsini = zsinis; 00579 zcosh = cosq; 00580 zsinh = sinq; 00581 cc = c1ss; 00582 zn = zns; 00583 ze = zes; 00584 zmo = zmos; 00585 xnoi = 1/xnq; 00586 00587 /* Loop breaks when Solar terms are done a second */ 00588 /* time, after Lunar terms are initialized */ 00589 for(;;) 00590 { 00591 /* Solar terms done again after Lunar terms are done */ 00592 a1 = zcosg*zcosh+zsing*zcosi*zsinh; 00593 a3 = -zsing*zcosh+zcosg*zcosi*zsinh; 00594 a7 = -zcosg*zsinh+zsing*zcosi*zcosh; 00595 a8 = zsing*zsini; 00596 a9 = zsing*zsinh+zcosg*zcosi*zcosh; 00597 a10 = zcosg*zsini; 00598 a2 = deep_arg->cosio*a7+ deep_arg->sinio*a8; 00599 a4 = deep_arg->cosio*a9+ deep_arg->sinio*a10; 00600 a5 = -deep_arg->sinio*a7+ deep_arg->cosio*a8; 00601 a6 = -deep_arg->sinio*a9+ deep_arg->cosio*a10; 00602 x1 = a1*deep_arg->cosg+a2*deep_arg->sing; 00603 x2 = a3*deep_arg->cosg+a4*deep_arg->sing; 00604 x3 = -a1*deep_arg->sing+a2*deep_arg->cosg; 00605 x4 = -a3*deep_arg->sing+a4*deep_arg->cosg; 00606 x5 = a5*deep_arg->sing; 00607 x6 = a6*deep_arg->sing; 00608 x7 = a5*deep_arg->cosg; 00609 x8 = a6*deep_arg->cosg; 00610 z31 = 12*x1*x1-3*x3*x3; 00611 z32 = 24*x1*x2-6*x3*x4; 00612 z33 = 12*x2*x2-3*x4*x4; 00613 z1 = 3*(a1*a1+a2*a2)+z31*deep_arg->eosq; 00614 z2 = 6*(a1*a3+a2*a4)+z32*deep_arg->eosq; 00615 z3 = 3*(a3*a3+a4*a4)+z33*deep_arg->eosq; 00616 z11 = -6*a1*a5+deep_arg->eosq*(-24*x1*x7-6*x3*x5); 00617 z12 = -6*(a1*a6+a3*a5)+ deep_arg->eosq* 00618 (-24*(x2*x7+x1*x8)-6*(x3*x6+x4*x5)); 00619 z13 = -6*a3*a6+deep_arg->eosq*(-24*x2*x8-6*x4*x6); 00620 z21 = 6*a2*a5+deep_arg->eosq*(24*x1*x5-6*x3*x7); 00621 z22 = 6*(a4*a5+a2*a6)+ deep_arg->eosq* 00622 (24*(x2*x5+x1*x6)-6*(x4*x7+x3*x8)); 00623 z23 = 6*a4*a6+deep_arg->eosq*(24*x2*x6-6*x4*x8); 00624 z1 = z1+z1+deep_arg->betao2*z31; 00625 z2 = z2+z2+deep_arg->betao2*z32; 00626 z3 = z3+z3+deep_arg->betao2*z33; 00627 s3 = cc*xnoi; 00628 s2 = -0.5*s3/deep_arg->betao; 00629 s4 = s3*deep_arg->betao; 00630 s1 = -15*eq*s4; 00631 s5 = x1*x3+x2*x4; 00632 s6 = x2*x3+x1*x4; 00633 s7 = x2*x4-x1*x3; 00634 se = s1*zn*s5; 00635 si = s2*zn*(z11+z13); 00636 sl = -zn*s3*(z1+z3-14-6*deep_arg->eosq); 00637 sgh = s4*zn*(z31+z33-6); 00638 sh = -zn*s2*(z21+z23); 00639 if (xqncl < 5.2359877E-2) sh = 0; 00640 ee2 = 2*s1*s6; 00641 e3 = 2*s1*s7; 00642 xi2 = 2*s2*z12; 00643 xi3 = 2*s2*(z13-z11); 00644 xl2 = -2*s3*z2; 00645 xl3 = -2*s3*(z3-z1); 00646 xl4 = -2*s3*(-21-9*deep_arg->eosq)*ze; 00647 xgh2 = 2*s4*z32; 00648 xgh3 = 2*s4*(z33-z31); 00649 xgh4 = -18*s4*ze; 00650 xh2 = -2*s2*z22; 00651 xh3 = -2*s2*(z23-z21); 00652 00653 if(isFlagSet(LUNAR_TERMS_DONE_FLAG)) break; 00654 00655 /* Do lunar terms */ 00656 sse = se; 00657 ssi = si; 00658 ssl = sl; 00659 ssh = sh/deep_arg->sinio; 00660 ssg = sgh-deep_arg->cosio*ssh; 00661 se2 = ee2; 00662 si2 = xi2; 00663 sl2 = xl2; 00664 sgh2 = xgh2; 00665 sh2 = xh2; 00666 se3 = e3; 00667 si3 = xi3; 00668 sl3 = xl3; 00669 sgh3 = xgh3; 00670 sh3 = xh3; 00671 sl4 = xl4; 00672 sgh4 = xgh4; 00673 zcosg = zcosgl; 00674 zsing = zsingl; 00675 zcosi = zcosil; 00676 zsini = zsinil; 00677 zcosh = zcoshl*cosq+zsinhl*sinq; 00678 zsinh = sinq*zcoshl-cosq*zsinhl; 00679 zn = znl; 00680 cc = c1l; 00681 ze = zel; 00682 zmo = zmol; 00683 SetFlag(LUNAR_TERMS_DONE_FLAG); 00684 } /* End of for(;;) */ 00685 00686 sse = sse+se; 00687 ssi = ssi+si; 00688 ssl = ssl+sl; 00689 ssg = ssg+sgh-deep_arg->cosio/deep_arg->sinio*sh; 00690 ssh = ssh+sh/deep_arg->sinio; 00691 00692 /* Geopotential resonance initialization for 12 hour orbits */ 00693 ClearFlag(RESONANCE_FLAG); 00694 ClearFlag(SYNCHRONOUS_FLAG); 00695 00696 if( !((xnq < 0.0052359877) && (xnq > 0.0034906585)) ) 00697 { 00698 if( (xnq < 0.00826) || (xnq > 0.00924) ) return; 00699 if (eq < 0.5) return; 00700 SetFlag(RESONANCE_FLAG); 00701 eoc = eq*deep_arg->eosq; 00702 g201 = -0.306-(eq-0.64)*0.440; 00703 if (eq <= 0.65) 00704 { 00705 g211 = 3.616-13.247*eq+16.290*deep_arg->eosq; 00706 g310 = -19.302+117.390*eq-228.419* 00707 deep_arg->eosq+156.591*eoc; 00708 g322 = -18.9068+109.7927*eq-214.6334* 00709 deep_arg->eosq+146.5816*eoc; 00710 g410 = -41.122+242.694*eq-471.094* 00711 deep_arg->eosq+313.953*eoc; 00712 g422 = -146.407+841.880*eq-1629.014* 00713 deep_arg->eosq+1083.435*eoc; 00714 g520 = -532.114+3017.977*eq-5740* 00715 deep_arg->eosq+3708.276*eoc; 00716 } 00717 else 00718 { 00719 g211 = -72.099+331.819*eq-508.738* 00720 deep_arg->eosq+266.724*eoc; 00721 g310 = -346.844+1582.851*eq-2415.925* 00722 deep_arg->eosq+1246.113*eoc; 00723 g322 = -342.585+1554.908*eq-2366.899* 00724 deep_arg->eosq+1215.972*eoc; 00725 g410 = -1052.797+4758.686*eq-7193.992* 00726 deep_arg->eosq+3651.957*eoc; 00727 g422 = -3581.69+16178.11*eq-24462.77* 00728 deep_arg->eosq+ 12422.52*eoc; 00729 if (eq <= 0.715) 00730 g520 = 1464.74-4664.75*eq+3763.64*deep_arg->eosq; 00731 else 00732 g520 = -5149.66+29936.92*eq-54087.36* 00733 deep_arg->eosq+31324.56*eoc; 00734 } /* End if (eq <= 0.65) */ 00735 00736 if (eq < 0.7) 00737 { 00738 g533 = -919.2277+4988.61*eq-9064.77* 00739 deep_arg->eosq+5542.21*eoc; 00740 g521 = -822.71072+4568.6173*eq-8491.4146* 00741 deep_arg->eosq+5337.524*eoc; 00742 g532 = -853.666+4690.25*eq-8624.77* 00743 deep_arg->eosq+ 5341.4*eoc; 00744 } 00745 else 00746 { 00747 g533 = -37995.78+161616.52*eq-229838.2* 00748 deep_arg->eosq+109377.94*eoc; 00749 g521 = -51752.104+218913.95*eq-309468.16* 00750 deep_arg->eosq+146349.42*eoc; 00751 g532 = -40023.88+170470.89*eq-242699.48* 00752 deep_arg->eosq+115605.82*eoc; 00753 } /* End if (eq <= 0.7) */ 00754 00755 sini2 = deep_arg->sinio*deep_arg->sinio; 00756 f220 = 0.75*(1+2*deep_arg->cosio+deep_arg->theta2); 00757 f221 = 1.5*sini2; 00758 f321 = 1.875*deep_arg->sinio*(1-2*\ 00759 deep_arg->cosio-3*deep_arg->theta2); 00760 f322 = -1.875*deep_arg->sinio*(1+2* 00761 deep_arg->cosio-3*deep_arg->theta2); 00762 f441 = 35*sini2*f220; 00763 f442 = 39.3750*sini2*sini2; 00764 f522 = 9.84375*deep_arg->sinio*(sini2*(1-2*deep_arg->cosio-5* 00765 deep_arg->theta2)+0.33333333*(-2+4*deep_arg->cosio+ 00766 6*deep_arg->theta2)); 00767 f523 = deep_arg->sinio*(4.92187512*sini2*(-2-4* 00768 deep_arg->cosio+10*deep_arg->theta2)+6.56250012 00769 *(1+2*deep_arg->cosio-3*deep_arg->theta2)); 00770 f542 = 29.53125*deep_arg->sinio*(2-8* 00771 deep_arg->cosio+deep_arg->theta2* 00772 (-12+8*deep_arg->cosio+10*deep_arg->theta2)); 00773 f543 = 29.53125*deep_arg->sinio*(-2-8*deep_arg->cosio+ 00774 deep_arg->theta2*(12+8*deep_arg->cosio-10* 00775 deep_arg->theta2)); 00776 xno2 = xnq*xnq; 00777 ainv2 = aqnv*aqnv; 00778 temp1 = 3*xno2*ainv2; 00779 temp = temp1*root22; 00780 d2201 = temp*f220*g201; 00781 d2211 = temp*f221*g211; 00782 temp1 = temp1*aqnv; 00783 temp = temp1*root32; 00784 d3210 = temp*f321*g310; 00785 d3222 = temp*f322*g322; 00786 temp1 = temp1*aqnv; 00787 temp = 2*temp1*root44; 00788 d4410 = temp*f441*g410; 00789 d4422 = temp*f442*g422; 00790 temp1 = temp1*aqnv; 00791 temp = temp1*root52; 00792 d5220 = temp*f522*g520; 00793 d5232 = temp*f523*g532; 00794 temp = 2*temp1*root54; 00795 d5421 = temp*f542*g521; 00796 d5433 = temp*f543*g533; 00797 xlamo = xmao+tle->xnodeo+tle->xnodeo-thgr-thgr; 00798 bfact = deep_arg->xmdot+deep_arg->xnodot+ 00799 deep_arg->xnodot-thdt-thdt; 00800 bfact = bfact+ssl+ssh+ssh; 00801 } /* if( !(xnq < 0.0052359877) && (xnq > 0.0034906585) ) */ 00802 else 00803 { 00804 SetFlag(RESONANCE_FLAG); 00805 SetFlag(SYNCHRONOUS_FLAG); 00806 /* Synchronous resonance terms initialization */ 00807 g200 = 1+deep_arg->eosq*(-2.5+0.8125*deep_arg->eosq); 00808 g310 = 1+2*deep_arg->eosq; 00809 g300 = 1+deep_arg->eosq*(-6+6.60937*deep_arg->eosq); 00810 f220 = 0.75*(1+deep_arg->cosio)*(1+deep_arg->cosio); 00811 f311 = 0.9375*deep_arg->sinio*deep_arg->sinio* 00812 (1+3*deep_arg->cosio)-0.75*(1+deep_arg->cosio); 00813 f330 = 1+deep_arg->cosio; 00814 f330 = 1.875*f330*f330*f330; 00815 del1 = 3*xnq*xnq*aqnv*aqnv; 00816 del2 = 2*del1*f220*g200*q22; 00817 del3 = 3*del1*f330*g300*q33*aqnv; 00818 del1 = del1*f311*g310*q31*aqnv; 00819 fasx2 = 0.13130908; 00820 fasx4 = 2.8843198; 00821 fasx6 = 0.37448087; 00822 xlamo = xmao+tle->xnodeo+tle->omegao-thgr; 00823 bfact = deep_arg->xmdot+xpidot-thdt; 00824 bfact = bfact+ssl+ssg+ssh; 00825 } /* End if( !(xnq < 0.0052359877) && (xnq > 0.0034906585) ) */ 00826 00827 xfact = bfact-xnq; 00828 00829 /* Initialize integrator */ 00830 xli = xlamo; 00831 xni = xnq; 00832 atime = 0; 00833 stepp = 720; 00834 stepn = -720; 00835 step2 = 259200; 00836 /* End case dpinit: */ 00837 return; 00838 00839 case dpsec: /* Entrance for deep space secular effects */ 00840 deep_arg->xll = deep_arg->xll+ssl*deep_arg->t; 00841 deep_arg->omgadf = deep_arg->omgadf+ssg*deep_arg->t; 00842 deep_arg->xnode = deep_arg->xnode+ssh*deep_arg->t; 00843 deep_arg->em = tle->eo+sse*deep_arg->t; 00844 deep_arg->xinc = tle->xincl+ssi*deep_arg->t; 00845 if (deep_arg->xinc < 0) 00846 { 00847 deep_arg->xinc = -deep_arg->xinc; 00848 deep_arg->xnode = deep_arg->xnode + pi; 00849 deep_arg->omgadf = deep_arg->omgadf-pi; 00850 } 00851 if( isFlagClear(RESONANCE_FLAG) ) return; 00852 00853 do 00854 { 00855 if( (atime == 0) || 00856 ((deep_arg->t >= 0) && (atime < 0)) || 00857 ((deep_arg->t < 0) && (atime >= 0)) ) 00858 { 00859 /* Epoch restart */ 00860 if( deep_arg->t >= 0 ) 00861 delt = stepp; 00862 else 00863 delt = stepn; 00864 00865 atime = 0; 00866 xni = xnq; 00867 xli = xlamo; 00868 } 00869 else 00870 { 00871 if( fabs(deep_arg->t) >= fabs(atime) ) 00872 { 00873 if ( deep_arg->t > 0 ) 00874 delt = stepp; 00875 else 00876 delt = stepn; 00877 } 00878 } 00879 00880 do 00881 { 00882 if ( fabs(deep_arg->t-atime) >= stepp ) 00883 { 00884 SetFlag(DO_LOOP_FLAG); 00885 ClearFlag(EPOCH_RESTART_FLAG); 00886 } 00887 else 00888 { 00889 ft = deep_arg->t-atime; 00890 ClearFlag(DO_LOOP_FLAG); 00891 } 00892 00893 if( fabs(deep_arg->t) < fabs(atime) ) 00894 { 00895 if (deep_arg->t >= 0) 00896 delt = stepn; 00897 else 00898 delt = stepp; 00899 SetFlag(DO_LOOP_FLAG | EPOCH_RESTART_FLAG); 00900 } 00901 00902 /* Dot terms calculated */ 00903 if( isFlagSet(SYNCHRONOUS_FLAG) ) 00904 { 00905 xndot = del1*sin(xli-fasx2)+del2*sin(2*(xli-fasx4)) 00906 +del3*sin(3*(xli-fasx6)); 00907 xnddt = del1*cos(xli-fasx2)+2*del2*cos(2*(xli-fasx4)) 00908 +3*del3*cos(3*(xli-fasx6)); 00909 } 00910 else 00911 { 00912 xomi = omegaq+deep_arg->omgdot*atime; 00913 x2omi = xomi+xomi; 00914 x2li = xli+xli; 00915 xndot = d2201*sin(x2omi+xli-g22) 00916 +d2211*sin(xli-g22) 00917 +d3210*sin(xomi+xli-g32) 00918 +d3222*sin(-xomi+xli-g32) 00919 +d4410*sin(x2omi+x2li-g44) 00920 +d4422*sin(x2li-g44) 00921 +d5220*sin(xomi+xli-g52) 00922 +d5232*sin(-xomi+xli-g52) 00923 +d5421*sin(xomi+x2li-g54) 00924 +d5433*sin(-xomi+x2li-g54); 00925 xnddt = d2201*cos(x2omi+xli-g22) 00926 +d2211*cos(xli-g22) 00927 +d3210*cos(xomi+xli-g32) 00928 +d3222*cos(-xomi+xli-g32) 00929 +d5220*cos(xomi+xli-g52) 00930 +d5232*cos(-xomi+xli-g52) 00931 +2*(d4410*cos(x2omi+x2li-g44) 00932 +d4422*cos(x2li-g44) 00933 +d5421*cos(xomi+x2li-g54) 00934 +d5433*cos(-xomi+x2li-g54)); 00935 } /* End of if (isFlagSet(SYNCHRONOUS_FLAG)) */ 00936 00937 xldot = xni+xfact; 00938 xnddt = xnddt*xldot; 00939 00940 if(isFlagSet(DO_LOOP_FLAG)) 00941 { 00942 xli = xli+xldot*delt+xndot*step2; 00943 xni = xni+xndot*delt+xnddt*step2; 00944 atime = atime+delt; 00945 } 00946 } 00947 while(isFlagSet(DO_LOOP_FLAG) && isFlagClear(EPOCH_RESTART_FLAG)); 00948 } 00949 while(isFlagSet(DO_LOOP_FLAG) && isFlagSet(EPOCH_RESTART_FLAG)); 00950 00951 deep_arg->xn = xni+xndot*ft+xnddt*ft*ft*0.5; 00952 xl = xli+xldot*ft+xndot*ft*ft*0.5; 00953 temp = -deep_arg->xnode+thgr+deep_arg->t*thdt; 00954 00955 if (isFlagClear(SYNCHRONOUS_FLAG)) 00956 deep_arg->xll = xl+temp+temp; 00957 else 00958 deep_arg->xll = xl-deep_arg->omgadf+temp; 00959 00960 return; 00961 /*End case dpsec: */ 00962 00963 case dpper: /* Entrance for lunar-solar periodics */ 00964 sinis = sin(deep_arg->xinc); 00965 cosis = cos(deep_arg->xinc); 00966 if (fabs(savtsn-deep_arg->t) >= 30) 00967 { 00968 savtsn = deep_arg->t; 00969 zm = zmos+zns*deep_arg->t; 00970 zf = zm+2*zes*sin(zm); 00971 sinzf = sin(zf); 00972 f2 = 0.5*sinzf*sinzf-0.25; 00973 f3 = -0.5*sinzf*cos(zf); 00974 ses = se2*f2+se3*f3; 00975 sis = si2*f2+si3*f3; 00976 sls = sl2*f2+sl3*f3+sl4*sinzf; 00977 sghs = sgh2*f2+sgh3*f3+sgh4*sinzf; 00978 shs = sh2*f2+sh3*f3; 00979 zm = zmol+znl*deep_arg->t; 00980 zf = zm+2*zel*sin(zm); 00981 sinzf = sin(zf); 00982 f2 = 0.5*sinzf*sinzf-0.25; 00983 f3 = -0.5*sinzf*cos(zf); 00984 sel = ee2*f2+e3*f3; 00985 sil = xi2*f2+xi3*f3; 00986 sll = xl2*f2+xl3*f3+xl4*sinzf; 00987 sghl = xgh2*f2+xgh3*f3+xgh4*sinzf; 00988 sh1 = xh2*f2+xh3*f3; 00989 pe = ses+sel; 00990 pinc = sis+sil; 00991 pl = sls+sll; 00992 } 00993 00994 pgh = sghs+sghl; 00995 ph = shs+sh1; 00996 deep_arg->xinc = deep_arg->xinc+pinc; 00997 deep_arg->em = deep_arg->em+pe; 00998 00999 if (xqncl >= 0.2) 01000 { 01001 /* Apply periodics directly */ 01002 ph = ph/deep_arg->sinio; 01003 pgh = pgh-deep_arg->cosio*ph; 01004 deep_arg->omgadf = deep_arg->omgadf+pgh; 01005 deep_arg->xnode = deep_arg->xnode+ph; 01006 deep_arg->xll = deep_arg->xll+pl; 01007 } 01008 else 01009 { 01010 /* Apply periodics with Lyddane modification */ 01011 sinok = sin(deep_arg->xnode); 01012 cosok = cos(deep_arg->xnode); 01013 alfdp = sinis*sinok; 01014 betdp = sinis*cosok; 01015 dalf = ph*cosok+pinc*cosis*sinok; 01016 dbet = -ph*sinok+pinc*cosis*cosok; 01017 alfdp = alfdp+dalf; 01018 betdp = betdp+dbet; 01019 deep_arg->xnode = FMod2p(deep_arg->xnode); 01020 xls = deep_arg->xll+deep_arg->omgadf+cosis*deep_arg->xnode; 01021 dls = pl+pgh-pinc*deep_arg->xnode*sinis; 01022 xls = xls+dls; 01023 xnoh = deep_arg->xnode; 01024 deep_arg->xnode = AcTan(alfdp,betdp); 01025 01026 /* This is a patch to Lyddane modification */ 01027 /* suggested by Rob Matson. */ 01028 if(fabs(xnoh-deep_arg->xnode) > pi) 01029 { 01030 if(deep_arg->xnode < xnoh) 01031 deep_arg->xnode +=twopi; 01032 else 01033 deep_arg->xnode -=twopi; 01034 } 01035 01036 deep_arg->xll = deep_arg->xll+pl; 01037 deep_arg->omgadf = xls-deep_arg->xll-cos(deep_arg->xinc)* 01038 deep_arg->xnode; 01039 } /* End case dpper: */ 01040 return; 01041 01042 } /* End switch(ientry) */ 01043 01044 } /* End of Deep() */ 01045 01046 /*------------------------------------------------------------------*/ 01047 01048 /* Functions for testing and setting/clearing flags */ 01049 01050 /* An int variable holding the single-bit flags */ 01051 static int Flags = 0; 01052 01053 int 01054 isFlagSet(int flag) 01055 { 01056 return (Flags & flag); 01057 } 01058 01059 int 01060 isFlagClear(int flag) 01061 { 01062 return (~Flags & flag); 01063 } 01064 01065 void 01066 SetFlag(int flag) 01067 { 01068 Flags |= flag; 01069 } 01070 01071 void 01072 ClearFlag(int flag) 01073 { 01074 Flags &= ~flag; 01075 } 01076 01077 /*------------------------------------------------------------------*/
Generated on Tue Jul 12 2022 18:05:35 by
1.7.2