📄 predict.c
字号:
xmx=-sinnok*cosik;
xmy=cosnok*cosik;
ux=xmx*sinuk+cosnok*cosuk;
uy=xmy*sinuk+sinnok*cosuk;
uz=sinik*sinuk;
vx=xmx*cosuk-cosnok*sinuk;
vy=xmy*cosuk-sinnok*sinuk;
vz=sinik*cosuk;
/* Position and velocity */
pos->x=rk*ux;
pos->y=rk*uy;
pos->z=rk*uz;
vel->x=rdotk*ux+rfdotk*vx;
vel->y=rdotk*uy+rfdotk*vy;
vel->z=rdotk*uz+rfdotk*vz;
/* Phase in radians */
phase=xlt-xnode-omgadf+twopi;
if (phase<0.0)
phase+=twopi;
phase=FMod2p(phase);
}
void Deep(int ientry, tle_t * tle, deep_arg_t * deep_arg)
{
/* This function is used by SDP4 to add lunar and solar */
/* perturbation effects to deep-space orbit objects. */
static double thgr, xnq, xqncl, omegaq, zmol, zmos, savtsn, ee2, e3,
xi2, xl2, xl3, xl4, xgh2, xgh3, xgh4, xh2, xh3, sse, ssi, ssg, xi3,
se2, si2, sl2, sgh2, sh2, se3, si3, sl3, sgh3, sh3, sl4, sgh4, ssl,
ssh, d3210, d3222, d4410, d4422, d5220, d5232, d5421, d5433, del1,
del2, del3, fasx2, fasx4, fasx6, xlamo, xfact, xni, atime, stepp,
stepn, step2, preep, pl, sghs, xli, d2201, d2211, sghl, sh1, pinc,
pe, shs, zsingl, zcosgl, zsinhl, zcoshl, zsinil, zcosil;
double a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, ainv2, alfdp, aqnv,
sgh, sini2, sinis, sinok, sh, si, sil, day, betdp, dalf, bfact, c,
cc, cosis, cosok, cosq, ctem, f322, zx, zy, dbet, dls, eoc, eq, f2,
f220, f221, f3, f311, f321, xnoh, f330, f441, f442, f522, f523,
f542, f543, g200, g201, g211, pgh, ph, s1, s2, s3, s4, s5, s6, s7,
se, sel, ses, xls, g300, g310, g322, g410, g422, g520, g521, g532,
g533, gam, sinq, sinzf, sis, sl, sll, sls, stem, temp, temp1, x1,
x2, x2li, x2omi, x3, x4, x5, x6, x7, x8, xl, xldot, xmao, xnddt,
xndot, xno2, xnodce, xnoi, xomi, xpidot, z1, z11, z12, z13, z2,
z21, z22, z23, z3, z31, z32, z33, ze, zf, zm, zmo, zn, zsing,
zsinh, zsini, zcosg, zcosh, zcosi, delt=0, ft=0;
switch (ientry)
{
case dpinit: /* Entrance for deep space initialization */
thgr=ThetaG(tle->epoch,deep_arg);
eq=tle->eo;
xnq=deep_arg->xnodp;
aqnv=1/deep_arg->aodp;
xqncl=tle->xincl;
xmao=tle->xmo;
xpidot=deep_arg->omgdot+deep_arg->xnodot;
sinq=sin(tle->xnodeo);
cosq=cos(tle->xnodeo);
omegaq=tle->omegao;
/* Initialize lunar solar terms */
day=deep_arg->ds50+18261.5; /* Days since 1900 Jan 0.5 */
if (day!=preep)
{
preep=day;
xnodce=4.5236020-9.2422029E-4*day;
stem=sin(xnodce);
ctem=cos(xnodce);
zcosil=0.91375164-0.03568096*ctem;
zsinil=sqrt(1-zcosil*zcosil);
zsinhl=0.089683511*stem/zsinil;
zcoshl=sqrt(1-zsinhl*zsinhl);
c=4.7199672+0.22997150*day;
gam=5.8351514+0.0019443680*day;
zmol=FMod2p(c-gam);
zx=0.39785416*stem/zsinil;
zy=zcoshl*ctem+0.91744867*zsinhl*stem;
zx=AcTan(zx,zy);
zx=gam+zx-xnodce;
zcosgl=cos(zx);
zsingl=sin(zx);
zmos=6.2565837+0.017201977*day;
zmos=FMod2p(zmos);
}
/* Do solar terms */
savtsn=1E20;
zcosg=zcosgs;
zsing=zsings;
zcosi=zcosis;
zsini=zsinis;
zcosh=cosq;
zsinh= sinq;
cc=c1ss;
zn=zns;
ze=zes;
zmo=zmos;
xnoi=1/xnq;
/* Loop breaks when Solar terms are done a second */
/* time, after Lunar terms are initialized */
for (;;)
{
/* Solar terms done again after Lunar terms are done */
a1=zcosg*zcosh+zsing*zcosi*zsinh;
a3=-zsing*zcosh+zcosg*zcosi*zsinh;
a7=-zcosg*zsinh+zsing*zcosi*zcosh;
a8=zsing*zsini;
a9=zsing*zsinh+zcosg*zcosi*zcosh;
a10=zcosg*zsini;
a2=deep_arg->cosio*a7+deep_arg->sinio*a8;
a4=deep_arg->cosio*a9+deep_arg->sinio*a10;
a5=-deep_arg->sinio*a7+deep_arg->cosio*a8;
a6=-deep_arg->sinio*a9+deep_arg->cosio*a10;
x1=a1*deep_arg->cosg+a2*deep_arg->sing;
x2=a3*deep_arg->cosg+a4*deep_arg->sing;
x3=-a1*deep_arg->sing+a2*deep_arg->cosg;
x4=-a3*deep_arg->sing+a4*deep_arg->cosg;
x5=a5*deep_arg->sing;
x6=a6*deep_arg->sing;
x7=a5*deep_arg->cosg;
x8=a6*deep_arg->cosg;
z31=12*x1*x1-3*x3*x3;
z32=24*x1*x2-6*x3*x4;
z33=12*x2*x2-3*x4*x4;
z1=3*(a1*a1+a2*a2)+z31*deep_arg->eosq;
z2=6*(a1*a3+a2*a4)+z32*deep_arg->eosq;
z3=3*(a3*a3+a4*a4)+z33*deep_arg->eosq;
z11=-6*a1*a5+deep_arg->eosq*(-24*x1*x7-6*x3*x5);
z12=-6*(a1*a6+a3*a5)+deep_arg->eosq*(-24*(x2*x7+x1*x8)-6*(x3*x6+x4*x5));
z13=-6*a3*a6+deep_arg->eosq*(-24*x2*x8-6*x4*x6);
z21=6*a2*a5+deep_arg->eosq*(24*x1*x5-6*x3*x7);
z22=6*(a4*a5+a2*a6)+deep_arg->eosq*(24*(x2*x5+x1*x6)-6*(x4*x7+x3*x8));
z23=6*a4*a6+deep_arg->eosq*(24*x2*x6-6*x4*x8);
z1=z1+z1+deep_arg->betao2*z31;
z2=z2+z2+deep_arg->betao2*z32;
z3=z3+z3+deep_arg->betao2*z33;
s3=cc*xnoi;
s2=-0.5*s3/deep_arg->betao;
s4=s3*deep_arg->betao;
s1=-15*eq*s4;
s5=x1*x3+x2*x4;
s6=x2*x3+x1*x4;
s7=x2*x4-x1*x3;
se=s1*zn*s5;
si=s2*zn*(z11+z13);
sl=-zn*s3*(z1+z3-14-6*deep_arg->eosq);
sgh=s4*zn*(z31+z33-6);
sh=-zn*s2*(z21+z23);
if (xqncl<5.2359877E-2)
sh=0;
ee2=2*s1*s6;
e3=2*s1*s7;
xi2=2*s2*z12;
xi3=2*s2*(z13-z11);
xl2=-2*s3*z2;
xl3=-2*s3*(z3-z1);
xl4=-2*s3*(-21-9*deep_arg->eosq)*ze;
xgh2=2*s4*z32;
xgh3=2*s4*(z33-z31);
xgh4=-18*s4*ze;
xh2=-2*s2*z22;
xh3=-2*s2*(z23-z21);
if (isFlagSet(LUNAR_TERMS_DONE_FLAG))
break;
/* Do lunar terms */
sse=se;
ssi=si;
ssl=sl;
ssh=sh/deep_arg->sinio;
ssg=sgh-deep_arg->cosio*ssh;
se2=ee2;
si2=xi2;
sl2=xl2;
sgh2=xgh2;
sh2=xh2;
se3=e3;
si3=xi3;
sl3=xl3;
sgh3=xgh3;
sh3=xh3;
sl4=xl4;
sgh4=xgh4;
zcosg=zcosgl;
zsing=zsingl;
zcosi=zcosil;
zsini=zsinil;
zcosh=zcoshl*cosq+zsinhl*sinq;
zsinh=sinq*zcoshl-cosq*zsinhl;
zn=znl;
cc=c1l;
ze=zel;
zmo=zmol;
SetFlag(LUNAR_TERMS_DONE_FLAG);
}
sse=sse+se;
ssi=ssi+si;
ssl=ssl+sl;
ssg=ssg+sgh-deep_arg->cosio/deep_arg->sinio*sh;
ssh=ssh+sh/deep_arg->sinio;
/* Geopotential resonance initialization for 12 hour orbits */
ClearFlag(RESONANCE_FLAG);
ClearFlag(SYNCHRONOUS_FLAG);
if (!((xnq<0.0052359877) && (xnq>0.0034906585)))
{
if ((xnq<0.00826) || (xnq>0.00924))
return;
if (eq<0.5)
return;
SetFlag(RESONANCE_FLAG);
eoc=eq*deep_arg->eosq;
g201=-0.306-(eq-0.64)*0.440;
if (eq<=0.65)
{
g211=3.616-13.247*eq+16.290*deep_arg->eosq;
g310=-19.302+117.390*eq-228.419*deep_arg->eosq+156.591*eoc;
g322=-18.9068+109.7927*eq-214.6334*deep_arg->eosq+146.5816*eoc;
g410=-41.122+242.694*eq-471.094*deep_arg->eosq+313.953*eoc;
g422=-146.407+841.880*eq-1629.014*deep_arg->eosq+1083.435 * eoc;
g520=-532.114+3017.977*eq-5740*deep_arg->eosq+3708.276*eoc;
}
else
{
g211=-72.099+331.819*eq-508.738*deep_arg->eosq+266.724*eoc;
g310=-346.844+1582.851*eq-2415.925*deep_arg->eosq+1246.113*eoc;
g322=-342.585+1554.908*eq-2366.899*deep_arg->eosq+1215.972*eoc;
g410=-1052.797+4758.686*eq-7193.992*deep_arg->eosq+3651.957*eoc;
g422=-3581.69+16178.11*eq-24462.77*deep_arg->eosq+12422.52*eoc;
if (eq<=0.715)
g520=1464.74-4664.75*eq+3763.64*deep_arg->eosq;
else
g520=-5149.66+29936.92*eq-54087.36*deep_arg->eosq+31324.56*eoc;
}
if (eq<0.7)
{
g533=-919.2277+4988.61*eq-9064.77*deep_arg->eosq+5542.21*eoc;
g521=-822.71072+4568.6173*eq-8491.4146*deep_arg->eosq+5337.524*eoc;
g532=-853.666+4690.25*eq-8624.77*deep_arg->eosq+5341.4*eoc;
}
else
{
g533=-37995.78+161616.52*eq-229838.2*deep_arg->eosq+109377.94*eoc;
g521 =-51752.104+218913.95*eq-309468.16*deep_arg->eosq+146349.42*eoc;
g532 =-40023.88+170470.89*eq-242699.48*deep_arg->eosq+115605.82*eoc;
}
sini2=deep_arg->sinio*deep_arg->sinio;
f220=0.75*(1+2*deep_arg->cosio+deep_arg->theta2);
f221=1.5*sini2;
f321=1.875*deep_arg->sinio*(1-2*deep_arg->cosio-3*deep_arg->theta2);
f322=-1.875*deep_arg->sinio*(1+2*deep_arg->cosio-3*deep_arg->theta2);
f441=35*sini2*f220;
f442=39.3750*sini2*sini2;
f522=9.84375*deep_arg->sinio*(sini2*(1-2*deep_arg->cosio-5*deep_arg->theta2)+0.33333333*(-2+4*deep_arg->cosio+6*deep_arg->theta2));
f523=deep_arg->sinio*(4.92187512*sini2*(-2-4*deep_arg->cosio+10*deep_arg->theta2)+6.56250012*(1+2*deep_arg->cosio-3*deep_arg->theta2));
f542=29.53125*deep_arg->sinio*(2-8*deep_arg->cosio+deep_arg->theta2*(-12+8*deep_arg->cosio+10*deep_arg->theta2));
f543=29.53125*deep_arg->sinio*(-2-8*deep_arg->cosio+deep_arg->theta2*(12+8*deep_arg->cosio-10*deep_arg->theta2));
xno2=xnq*xnq;
ainv2=aqnv*aqnv;
temp1=3*xno2*ainv2;
temp=temp1*root22;
d2201=temp*f220*g201;
d2211=temp*f221*g211;
temp1=temp1*aqnv;
temp=temp1*root32;
d3210=temp*f321*g310;
d3222=temp*f322*g322;
temp1=temp1*aqnv;
temp=2*temp1*root44;
d4410=temp*f441*g410;
d4422=temp*f442*g422;
temp1=temp1*aqnv;
temp=temp1*root52;
d5220=temp*f522*g520;
d5232=temp*f523*g532;
temp=2*temp1*root54;
d5421=temp*f542*g521;
d5433=temp*f543*g533;
xlamo=xmao+tle->xnodeo+tle->xnodeo-thgr-thgr;
bfact=deep_arg->xmdot+deep_arg->xnodot+deep_arg->xnodot-thdt-thdt;
bfact=bfact+ssl+ssh+ssh;
}
else
{
SetFlag(RESONANCE_FLAG);
SetFlag(SYNCHRONOUS_FLAG);
/* Synchronous resonance terms initialization */
g200=1+deep_arg->eosq*(-2.5+0.8125*deep_arg->eosq);
g310=1+2*deep_arg->eosq;
g300=1+deep_arg->eosq*(-6+6.60937*deep_arg->eosq);
f220=0.75*(1+deep_arg->cosio)*(1+deep_arg->cosio);
f311=0.9375*deep_arg->sinio*deep_arg->sinio*(1+3*deep_arg->cosio)-0.75*(1+deep_arg->cosio);
f330=1+deep_arg->cosio;
f330=1.875*f330*f330*f330;
del1=3*xnq*xnq*aqnv*aqnv;
del2=2*del1*f220*g200*q22;
del3=3*del1*f330*g300*q33*aqnv;
del1=del1*f311*g310*q31*aqnv;
fasx2=0.13130908;
fasx4=2.8843198;
fasx6=0.37448087;
xlamo=xmao+tle->xnodeo+tle->omegao-thgr;
bfact=deep_arg->xmdot+xpidot-thdt;
bfact=bfact+ssl+ssg+ssh;
}
xfact=bfact-xnq;
/* Initialize integrator */
xli=xlamo;
xni=xnq;
atime=0;
stepp=720;
stepn=-720;
step2=259200;
return;
case dpsec: /* Entrance for deep space secular effects */
deep_arg->xll=deep_arg->xll+ssl*deep_arg->t;
deep_arg->omgadf=deep_arg->omgadf+ssg*deep_arg->t;
deep_arg->xnode=deep_arg->xnode+ssh*deep_arg->t;
deep_arg->em=tle->eo+sse*deep_arg->t;
deep_arg->xinc=tle->xincl+ssi*deep_arg->t;
if (deep_arg->xinc<0)
{
deep_arg->xinc=-deep_arg->xinc;
deep_arg->xnode=deep_arg->xnode+pi;
deep_arg->omgadf=deep_arg->omgadf-pi;
}
if (isFlagClear(RESONANCE_FLAG))
return;
do
{
if ((atime==0) || ((deep_arg->t>=0) && (atime<0)) || ((deep_arg->t<0) && (atime>=0)))
{
/* Epoch restart */
if (deep_arg->t>=0)
delt=stepp;
else
delt=stepn;
atime=0;
xni=xnq;
xli=xlamo;
}
else
{
if (fabs(deep_arg->t)>=fabs(atime))
{
if (deep_arg->t>0)
delt=stepp;
else
delt=stepn;
}
}
do
{
if (fabs(deep_arg->t-atime)>=stepp)
{
SetFlag(DO_LOOP_FLAG);
ClearFlag(EPOCH_RESTART_FLAG);
}
else
{
ft=deep_arg->t-atime;
ClearFlag(DO_LOOP_FLAG);
}
if (fabs(deep_arg->t)<fabs(atime))
{
if (deep_arg->t>=0)
delt=stepn;
else
delt=stepp;
SetFlag(DO_LOOP_FLAG | EPOCH_RESTART_FLAG);
}
/* Dot terms calculated */
if (isFlagSet(SYNCHRONOUS_FLAG))
{
xndot=del1*sin(xli-fasx2)+del2*sin(2*(xli-fasx4))+del3*sin(3*(xli-fasx6));
xnddt=del1*cos(xli-fasx2)+2*del2*cos(2*(xli-fasx4))+3*del3*cos(3*(xli-fasx6));
}
else
{
xomi=omegaq+deep_arg->omgdot*atime;
x2omi=xomi+xomi;
x2li=xli+xli;
xndot=d2201*sin(x2omi+xli-g22)+d2211*sin(xli-g22)+d3210*sin(xomi+xli-g32)+d3222*sin(-xomi+xli-g32)+d4410*sin(x2omi+x2li-g44)+d4422*sin(x2li-g44)+d5220*sin(xomi+xli-g52)+d5232*sin(-xomi+xli-g52)+d5421*sin(xomi+x2li-g54)+d5433*sin(-xomi+x2li-g54);
xnddt=d2201*cos(x2omi+xli-g22)+d2211*cos(xli-g22)+d3210*cos(xomi+xli-g32)+d3222*cos(-xomi+xli-g32)+d5220*cos(xomi+xli-g52)+d5232*cos(-xomi+xli-g52)+2*(d4410*cos(x2omi+x2li-g44)+d4422*cos(x2li-g44)+d5421*cos(xomi+x2li-g54)+d5433*cos(-xomi+x2li-g54));
}
xldot=xni+xfact;
xnddt=xnddt*xldot;
if (isFlagSet(DO_LOOP_FLAG))
{
xli=xli+xldot*delt+xndot*step2;
xni=xni+xndot*delt+xnddt*step2;
atime=atime+delt;
}
} while (isFlagSet(DO_LOOP_FLAG) && isFlagClear(EPOCH_RESTART_FLAG));
} while (isFlagSet(DO_LOOP_FLAG) && isFlagSet(EPOCH_RESTART_FLAG));
deep_arg->xn=xni+xndot*ft+xnddt*ft*ft*0.5;
xl=xli+xldot*ft+xndot*ft*ft*0.5;
temp=-deep_arg->xnode+thgr+deep_arg->t*thdt;
if (isFlagClear(SYNCHRONOUS_FLAG))
deep_arg->xll=xl+temp+temp;
else
deep_arg->xll=xl-deep_arg->omgadf+temp;
return;
case dpper: /* Entrance for lunar-solar periodics */
sinis=sin(deep_arg->xinc);
cosis=cos(deep_arg->xinc);
if (fabs(savtsn-deep_arg->t)>=30)
{
savtsn=deep_arg->t;
zm=zmos+zns*deep_arg->t;
zf=zm+2*zes*sin(zm);
sinzf=sin(zf);
f2=0.5*sinzf*sinzf-0.25;
f3=-0.5*sinzf*cos(zf);
ses=se2*f2+se3*f3;
sis=si2*f2+si3*f3;
sls=sl2*f2+sl3*f3+sl4*sinzf;
sghs=sgh2*f2+sgh3*f3+sgh4*sinzf;
shs=sh2*f2+sh3*f3;
zm=zmol+znl*deep_arg->t;
zf=zm+2*zel*sin(zm);
sinzf=sin(zf);
f2=0.5*sinzf*sinzf-0.25;
f3=-0.5*sinzf*cos(zf);
sel=ee2*f2+e3*f3;
sil=xi2*f2+xi3*f3;
sll=xl2*f2+xl3*f3+xl4*sinzf;
sghl=xgh2*f2+xgh3*f3+xgh4*sinzf;
sh1=xh2*f2+xh3*f3;
pe=ses+sel;
pinc=sis+sil;
pl=sls+sll;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -