| [1457] | 1 | #include <stdlib.h>
 | 
|---|
 | 2 | #include <math.h>
 | 
|---|
 | 3 | #undef SING
 | 
|---|
 | 4 | 
 | 
|---|
 | 5 | #include "sattypes.h"
 | 
|---|
 | 6 | #include "vector.h"
 | 
|---|
 | 7 | #include "satspec.h"
 | 
|---|
 | 8 | 
 | 
|---|
 | 9 | /*      SDP4                                               3 NOV 80 */
 | 
|---|
 | 10 | /*      SUBROUTINE SDP4(IFLAG,TSINCE)
 | 
|---|
 | 11 |       COMMON/E1/XMO,XNODEO,OMEGAO,EO,XINCL,XNO,XNDT2O,
 | 
|---|
 | 12 |      1           XNDD6O,BSTAR,X,Y,Z,XDOT,YDOT,ZDOT,EPOCH,DS50
 | 
|---|
 | 13 |       COMMON/C1/CK2,CK4,E6A,QOMS2T,S,TOTHRD,
 | 
|---|
 | 14 |      1           XJ3,XKE,XKMPER,XMNPDA,AE
 | 
|---|
 | 15 |       DOUBLE PRECISION EPOCH, DS50
 | 
|---|
 | 16 |       */
 | 
|---|
 | 17 | 
 | 
|---|
 | 18 | #define XMO     (sat->elem->se_XMO)
 | 
|---|
 | 19 | #define XNODEO  (sat->elem->se_XNODEO)
 | 
|---|
 | 20 | #define OMEGAO  (sat->elem->se_OMEGAO)
 | 
|---|
 | 21 | #define EO      (sat->elem->se_EO)
 | 
|---|
 | 22 | #define XINCL   (sat->elem->se_XINCL)
 | 
|---|
 | 23 | #define XNO     (sat->elem->se_XNO)
 | 
|---|
 | 24 | #define XNDT20  (sat->elem->se_XNDT20)
 | 
|---|
 | 25 | #define XNDD60  (sat->elem->se_XNDD60)
 | 
|---|
 | 26 | #define BSTAR   (sat->elem->se_BSTAR)
 | 
|---|
 | 27 | #define EPOCH   (sat->elem->se_EPOCH)
 | 
|---|
 | 28 | 
 | 
|---|
 | 29 | #define CK2     (5.413080e-04)
 | 
|---|
 | 30 | #define CK4     (6.209887e-07)
 | 
|---|
 | 31 | #define QOMS2T  (1.880279e-09)
 | 
|---|
 | 32 | #define S       (1.012229e+00)
 | 
|---|
 | 33 | 
 | 
|---|
 | 34 | #define AE (1.0)
 | 
|---|
 | 35 | #define DE2RA (.174532925E-1)
 | 
|---|
 | 36 | #define E6A (1.E-6)
 | 
|---|
 | 37 | #define PI (3.14159265)
 | 
|---|
 | 38 | #define PIO2 (1.57079633)
 | 
|---|
 | 39 | #define QO (120.0)
 | 
|---|
 | 40 | #define SO (78.0)
 | 
|---|
 | 41 | #define TOTHRD (.66666667)
 | 
|---|
 | 42 | #define TWOPI (6.2831853)
 | 
|---|
 | 43 | #define X3PIO2 (4.71238898)
 | 
|---|
 | 44 | #define XJ2 (1.082616E-3)
 | 
|---|
 | 45 | #define XJ3 (-.253881E-5)
 | 
|---|
 | 46 | #define XJ4 (-1.65597E-6)
 | 
|---|
 | 47 | #define XKE (.743669161E-1)
 | 
|---|
 | 48 | #define XKMPER (6378.135)
 | 
|---|
 | 49 | #define XMNPDA (1440.)
 | 
|---|
 | 50 | 
 | 
|---|
 | 51 | /* int IFLAG; */
 | 
|---|
 | 52 | 
 | 
|---|
 | 53 | #define X       (pos->sl_X)
 | 
|---|
 | 54 | #define XDOT    (pos->sl_XDOT)
 | 
|---|
 | 55 | #define Y       (pos->sl_Y)
 | 
|---|
 | 56 | #define YDOT    (pos->sl_YDOT)
 | 
|---|
 | 57 | #define Z       (pos->sl_Z)
 | 
|---|
 | 58 | #define ZDOT    (pos->sl_ZDOT)
 | 
|---|
 | 59 | 
 | 
|---|
 | 60 | /* sat->prop.sdp4-> */
 | 
|---|
 | 61 | #define AODP    (sat->prop.sdp4->sdp4_AODP)
 | 
|---|
 | 62 | #define AYCOF   (sat->prop.sdp4->sdp4_AYCOF)
 | 
|---|
 | 63 | #define BETAO   (sat->prop.sdp4->sdp4_BETAO)
 | 
|---|
 | 64 | #define BETAO2  (sat->prop.sdp4->sdp4_BETAO2)
 | 
|---|
 | 65 | #define C1      (sat->prop.sdp4->sdp4_C1)
 | 
|---|
 | 66 | #define C4      (sat->prop.sdp4->sdp4_C4)
 | 
|---|
 | 67 | #define COSG    (sat->prop.sdp4->sdp4_COSG)
 | 
|---|
 | 68 | #define COSIO   (sat->prop.sdp4->sdp4_COSIO)
 | 
|---|
 | 69 | #define EOSQ    (sat->prop.sdp4->sdp4_EOSQ)
 | 
|---|
 | 70 | #define OMGDOT  (sat->prop.sdp4->sdp4_OMGDOT)
 | 
|---|
 | 71 | #define SING    (sat->prop.sdp4->sdp4_SING)
 | 
|---|
 | 72 | #define SINIO   (sat->prop.sdp4->sdp4_SINIO)
 | 
|---|
 | 73 | #define T2COF   (sat->prop.sdp4->sdp4_T2COF)
 | 
|---|
 | 74 | #define THETA2  (sat->prop.sdp4->sdp4_THETA2)
 | 
|---|
 | 75 | #define X1MTH2  (sat->prop.sdp4->sdp4_X1MTH2)
 | 
|---|
 | 76 | #define X3THM1  (sat->prop.sdp4->sdp4_X3THM1)
 | 
|---|
 | 77 | #define X7THM1  (sat->prop.sdp4->sdp4_X7THM1)
 | 
|---|
 | 78 | #define XLCOF   (sat->prop.sdp4->sdp4_XLCOF)
 | 
|---|
 | 79 | #define XMDOT   (sat->prop.sdp4->sdp4_XMDOT)
 | 
|---|
 | 80 | #define XNODCF  (sat->prop.sdp4->sdp4_XNODCF)
 | 
|---|
 | 81 | #define XNODOT  (sat->prop.sdp4->sdp4_XNODOT)
 | 
|---|
 | 82 | #define XNODP   (sat->prop.sdp4->sdp4_XNODP)
 | 
|---|
 | 83 | 
 | 
|---|
 | 84 | #define XMDF_seco   (sat->prop.sdp4->sdp4_XMDF_seco)
 | 
|---|
 | 85 | #define OMGADF_seco (sat->prop.sdp4->sdp4_OMGADF_seco)
 | 
|---|
 | 86 | #define XNODE_seco  (sat->prop.sdp4->sdp4_XNODE_seco)
 | 
|---|
 | 87 | #define EM_seco     (sat->prop.sdp4->sdp4_EM_seco)
 | 
|---|
 | 88 | #define XINC_seco   (sat->prop.sdp4->sdp4_XINC_seco)
 | 
|---|
 | 89 | #define XN_seco     (sat->prop.sdp4->sdp4_XN_seco)
 | 
|---|
 | 90 | 
 | 
|---|
 | 91 | #define E_pero      (sat->prop.sdp4->sdp4_E_pero)
 | 
|---|
 | 92 | #define XINC_pero   (sat->prop.sdp4->sdp4_XINC_pero)
 | 
|---|
 | 93 | #define OMGADF_pero (sat->prop.sdp4->sdp4_OMGADF_pero)
 | 
|---|
 | 94 | #define XNODE_pero  (sat->prop.sdp4->sdp4_XNODE_pero)
 | 
|---|
 | 95 | #define XMAM_pero   (sat->prop.sdp4->sdp4_XMAM_pero)
 | 
|---|
 | 96 | 
 | 
|---|
 | 97 | void
 | 
|---|
 | 98 | sdp4 (sat, pos, dpos, TSINCE)
 | 
|---|
 | 99 | SatData *sat;
 | 
|---|
 | 100 | Vec3 *pos;
 | 
|---|
 | 101 | Vec3 *dpos;
 | 
|---|
 | 102 | double TSINCE;
 | 
|---|
 | 103 | {
 | 
|---|
 | 104 |     int i;
 | 
|---|
 | 105 | 
 | 
|---|
 | 106 |     /* private temporary variables used only in init section */
 | 
|---|
 | 107 |     double A1,A3OVK2,AO,C2,COEF,COEF1,DEL1,DELO,EETA,ETA,
 | 
|---|
 | 108 |         ETASQ,PERIGE,PINVSQ,PSISQ,QOMS24,S4,THETA4,TSI,X1M5TH,XHDOT1;
 | 
|---|
 | 109 | 
 | 
|---|
 | 110 |     /* private temporary variables */
 | 
|---|
 | 111 |     double A,AXN,AYN,AYNL,BETA,BETAL,CAPU,COS2U,COSEPW,
 | 
|---|
| [1719] | 112 |         COSIK,COSNOK,COSU,COSUK,E,ECOSE,ELSQ,EM=0,EPW,ESINE,OMGADF,PL,
 | 
|---|
| [1457] | 113 |         R,RDOT,RDOTK,RFDOT,RFDOTK,RK,SIN2U,SINEPW,SINIK,SINNOK,
 | 
|---|
 | 114 |         SINU,SINUK,TEMP,TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6,TEMPA,
 | 
|---|
| [1719] | 115 |         TEMPE,TEMPL,TSQ,U,UK,UX,UY,UZ,VX,VY,VZ,XINC=0,XINCK,XL,XLL,XLT,
 | 
|---|
| [1457] | 116 |         XMAM,XMDF,XMX,XMY,XN,XNODDF,XNODE,XNODEK;
 | 
|---|
 | 117 | 
 | 
|---|
 | 118 | #if 0
 | 
|---|
 | 119 |     A1=A3OVK2=AO=C2=COEF=COEF1=DEL1=DELO=EETA=ETA = signaling_nan();
 | 
|---|
 | 120 |     ETASQ=PERIGE=PINVSQ=PSISQ=QOMS24=S4=THETA4=TSI=X1M5TH=XHDOT1 = signaling_nan();
 | 
|---|
 | 121 | 
 | 
|---|
 | 122 |      A=AXN=AYN=AYNL=BETA=BETAL=CAPU=COS2U=COSEPW = signaling_nan();
 | 
|---|
 | 123 |      COSIK=COSNOK=COSU=COSUK=E=ECOSE=ELSQ=EM=EPW=ESINE=OMGADF=PL = signaling_nan();
 | 
|---|
 | 124 |      R=RDOT=RDOTK=RFDOT=RFDOTK=RK=SIN2U=SINEPW=SINIK=SINNOK = signaling_nan();
 | 
|---|
 | 125 |      SINU=SINUK=TEMP=TEMP1=TEMP2=TEMP3=TEMP4=TEMP5=TEMP6=TEMPA = signaling_nan();
 | 
|---|
 | 126 |      TEMPE=TEMPL=TSQ=U=UK=UX=UY=UZ=VX=VY=VZ=XINC=XINCK=XL=XLL=XLT = signaling_nan();
 | 
|---|
 | 127 |      XMAM=XMDF=XMX=XMY=XN=XNODDF=XNODE=XNODEK = signaling_nan();
 | 
|---|
 | 128 | #endif
 | 
|---|
 | 129 | 
 | 
|---|
 | 130 |     if(TSINCE != 0.0 && !sat->prop.sdp4) {
 | 
|---|
 | 131 |         /*
 | 
|---|
 | 132 |          * Yes, this is a recursive call.
 | 
|---|
 | 133 |          */
 | 
|---|
 | 134 |         sdp4(sat, pos, dpos, 0.0);
 | 
|---|
 | 135 |     }
 | 
|---|
 | 136 | 
 | 
|---|
 | 137 | /*      IF  (IFLAG .EQ. 0) GO TO 100 */
 | 
|---|
 | 138 | /*    if(!IFLAG) */
 | 
|---|
 | 139 |     if(!sat->prop.sdp4) {
 | 
|---|
 | 140 |         sat->prop.sdp4 = (struct sdp4_data *) malloc(sizeof(struct sdp4_data));
 | 
|---|
 | 141 | 
 | 
|---|
 | 142 | /*      init_sdp4(sat->prop.sdp4); */
 | 
|---|
 | 143 | 
 | 
|---|
 | 144 | /*      RECOVER ORIGINAL MEAN MOTION (XNODP) AND SEMIMAJOR AXIS (AODP) */
 | 
|---|
 | 145 | /*      FROM INPUT ELEMENTS */
 | 
|---|
 | 146 | 
 | 
|---|
 | 147 |         A1=pow((XKE/XNO), TOTHRD);
 | 
|---|
 | 148 |         COSIO=cos(XINCL);
 | 
|---|
 | 149 |         THETA2=COSIO*COSIO;
 | 
|---|
 | 150 |         X3THM1=3.0 * THETA2 - 1.0;
 | 
|---|
 | 151 |         EOSQ = EO * EO;
 | 
|---|
 | 152 |         BETAO2 = 1.0 - EOSQ;
 | 
|---|
 | 153 |         BETAO = sqrt(BETAO2);
 | 
|---|
 | 154 |         DEL1 = 1.5 * CK2 * X3THM1 / (A1 * A1 * BETAO * BETAO2);
 | 
|---|
 | 155 |         AO = A1 * (1.0 - DEL1 * (0.5 * TOTHRD +
 | 
|---|
 | 156 |                                 DEL1 * (1.0 + 134.0 / 81.0 * DEL1)));
 | 
|---|
 | 157 |         DELO = 1.5 * CK2 * X3THM1 / (AO * AO * BETAO * BETAO2);
 | 
|---|
 | 158 |         XNODP = XNO / (1.0 + DELO);
 | 
|---|
 | 159 |         AODP = AO / (1.0 - DELO);
 | 
|---|
 | 160 | 
 | 
|---|
 | 161 | /*      INITIALIZATION */
 | 
|---|
 | 162 | 
 | 
|---|
 | 163 | /*      FOR PERIGEE BELOW 156 KM, THE VALUES OF
 | 
|---|
 | 164 | *      S AND QOMS2T ARE ALTERED */
 | 
|---|
 | 165 | 
 | 
|---|
 | 166 |         S4 = S;
 | 
|---|
 | 167 |         QOMS24 = QOMS2T;
 | 
|---|
 | 168 |         PERIGE = (AODP * (1.0 - EO) - AE) * XKMPER;
 | 
|---|
 | 169 | 
 | 
|---|
 | 170 | /*      IF(PERIGE .GE. 156.) GO TO 10 */
 | 
|---|
 | 171 | 
 | 
|---|
 | 172 |         if(PERIGE < 156.0) {
 | 
|---|
 | 173 |             S4 = PERIGE - 78.0;
 | 
|---|
 | 174 | 
 | 
|---|
 | 175 |             if(PERIGE <= 98.0)  { /* GO TO 9 */
 | 
|---|
 | 176 |                 S4 = 20.0;
 | 
|---|
 | 177 |             }
 | 
|---|
 | 178 | 
 | 
|---|
 | 179 |             QOMS24 = pow((120.0 - S4) * AE / XKMPER, 4.0); /* 9 */
 | 
|---|
 | 180 |             S4 = S4 / XKMPER + AE;
 | 
|---|
 | 181 |         }
 | 
|---|
 | 182 |         PINVSQ = 1.0 / (AODP * AODP * BETAO2 * BETAO2); /* 10 */
 | 
|---|
 | 183 |         SING = sin(OMEGAO);
 | 
|---|
 | 184 |         COSG = cos(OMEGAO);
 | 
|---|
 | 185 |         TSI = 1.0 / (AODP - S4);
 | 
|---|
 | 186 |         ETA = AODP * EO * TSI;
 | 
|---|
 | 187 |         ETASQ = ETA * ETA;
 | 
|---|
 | 188 |         EETA = EO * ETA;
 | 
|---|
 | 189 |         PSISQ = fabs(1.0 - ETASQ);
 | 
|---|
 | 190 |         COEF = QOMS24 * pow(TSI, 4.0);
 | 
|---|
 | 191 |         COEF1 = COEF / pow(PSISQ, 3.5);
 | 
|---|
 | 192 |         C2 = COEF1 * XNODP * (AODP * (1.0 + 1.5 * ETASQ +
 | 
|---|
 | 193 |                                       EETA * (4.0 + ETASQ)) +
 | 
|---|
 | 194 |                               .75 * CK2 * TSI / PSISQ * X3THM1 *
 | 
|---|
 | 195 |                               (8.0 + 3.0 * ETASQ * (8.0 + ETASQ)));
 | 
|---|
 | 196 |         C1 = BSTAR * C2;
 | 
|---|
 | 197 |         SINIO = sin(XINCL);
 | 
|---|
 | 198 |         A3OVK2 = -XJ3 / CK2 * AE * AE * AE; /* A3OVK2=-XJ3/CK2*AE**3; */
 | 
|---|
 | 199 |         X1MTH2 = 1.0 - THETA2;
 | 
|---|
 | 200 |         C4 = 2.0 * XNODP * COEF1 * AODP * BETAO2 *
 | 
|---|
 | 201 |             (ETA * (2.0 + .5 * ETASQ) + EO * (.5 + 2.0 * ETASQ) -
 | 
|---|
 | 202 |              2.0 * CK2 * TSI / (AODP * PSISQ) *
 | 
|---|
 | 203 |              (-3.0 * X3THM1 * (1.0 - 2.0 * EETA + ETASQ *
 | 
|---|
 | 204 |                                (1.5 - .5 * EETA)) +
 | 
|---|
 | 205 |               .75 * X1MTH2 * (2.0 * ETASQ - EETA *
 | 
|---|
 | 206 |                               (1.0 + ETASQ)) * cos(2.0 * OMEGAO)));
 | 
|---|
 | 207 |         THETA4 = THETA2 * THETA2;
 | 
|---|
 | 208 |         TEMP1 = 3.0 * CK2 * PINVSQ * XNODP;
 | 
|---|
 | 209 |         TEMP2 = TEMP1 * CK2 * PINVSQ;
 | 
|---|
 | 210 |         TEMP3 = 1.25 * CK4 * PINVSQ * PINVSQ * XNODP;
 | 
|---|
 | 211 |         XMDOT = XNODP + 0.5 * TEMP1 * BETAO * X3THM1 + .0625 * TEMP2 * BETAO *
 | 
|---|
 | 212 |             (13.0 - 78.0 * THETA2 + 137.0 * THETA4);
 | 
|---|
 | 213 |         X1M5TH=1.0 - 5.0 * THETA2;
 | 
|---|
 | 214 |         OMGDOT = -.5 * TEMP1 * X1M5TH + .0625 * TEMP2 * 
 | 
|---|
 | 215 |             (7.0 - 114.0 * THETA2 + 395.0 * THETA4) +
 | 
|---|
 | 216 |             TEMP3 * (3.0 - 36.0 * THETA2 + 49.0 * THETA4);
 | 
|---|
 | 217 |         XHDOT1 = -TEMP1 * COSIO;
 | 
|---|
 | 218 |         XNODOT = XHDOT1 + (.5 * TEMP2 * (4.0 - 19.0 * THETA2) +
 | 
|---|
 | 219 |                            2.0 * TEMP3 * (3.0 - 7.0 * THETA2)) * COSIO;
 | 
|---|
 | 220 |         XNODCF = 3.5 * BETAO2 * XHDOT1 * C1;
 | 
|---|
 | 221 |         T2COF = 1.5 * C1;
 | 
|---|
 | 222 |         XLCOF = .125 * A3OVK2 * SINIO * (3.0 + 5.0 * COSIO) / (1.0 + COSIO);
 | 
|---|
 | 223 |         AYCOF = .25 * A3OVK2 * SINIO;
 | 
|---|
 | 224 |         X7THM1 = 7.0 * THETA2 - 1.0;
 | 
|---|
 | 225 | /*   90 IFLAG=0 */
 | 
|---|
 | 226 | 
 | 
|---|
 | 227 | #ifdef SDP_DEEP_DEBUG
 | 
|---|
 | 228 |         printf("calling dpinit\n");
 | 
|---|
 | 229 |         printf("%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n",
 | 
|---|
 | 230 |                EOSQ,SINIO,COSIO,BETAO,AODP,THETA2,
 | 
|---|
 | 231 |                SING,COSG,BETAO2,XMDOT,OMGDOT,XNODOT,XNODP);
 | 
|---|
 | 232 | #endif
 | 
|---|
 | 233 |         dpinit(sat, EOSQ, SINIO, COSIO, BETAO, AODP, THETA2,
 | 
|---|
 | 234 |                SING, COSG, BETAO2, XMDOT, OMGDOT, XNODOT, XNODP);
 | 
|---|
 | 235 | 
 | 
|---|
 | 236 | /*      CALL DPINIT(EOSQ,SINIO,COSIO,BETAO,AODP,THETA2,
 | 
|---|
 | 237 |         1         SING,COSG,BETAO2,XMDOT,OMGDOT,XNODOT,XNODP) */
 | 
|---|
 | 238 | 
 | 
|---|
 | 239 | /*      UPDATE FOR SECULAR GRAVITY AND ATMOSPHERIC DRAG */
 | 
|---|
 | 240 |     }
 | 
|---|
 | 241 | 
 | 
|---|
 | 242 |     XMDF = XMO + XMDOT * TSINCE; /* 100 */
 | 
|---|
 | 243 |     OMGADF = OMEGAO + OMGDOT * TSINCE;
 | 
|---|
 | 244 |     XNODDF = XNODEO + XNODOT * TSINCE;
 | 
|---|
 | 245 |     TSQ = TSINCE * TSINCE;
 | 
|---|
 | 246 |     XNODE = XNODDF + XNODCF * TSQ;
 | 
|---|
 | 247 |     TEMPA = 1.0 - C1 * TSINCE;
 | 
|---|
 | 248 |     TEMPE = BSTAR * C4 * TSINCE;
 | 
|---|
 | 249 |     TEMPL = T2COF * TSQ;
 | 
|---|
 | 250 |     XN = XNODP;
 | 
|---|
 | 251 | 
 | 
|---|
 | 252 |     if(TSINCE == 0.0) {
 | 
|---|
 | 253 |         XMDF_seco   = XMDF;
 | 
|---|
 | 254 |         OMGADF_seco = OMGADF;
 | 
|---|
 | 255 |         XNODE_seco  = XNODE;
 | 
|---|
 | 256 |         EM_seco     = EM;
 | 
|---|
 | 257 |         XINC_seco   = XINC;
 | 
|---|
 | 258 |         XN_seco     = XN;
 | 
|---|
 | 259 |     }
 | 
|---|
 | 260 | 
 | 
|---|
 | 261 |     dpsec(sat, &XMDF, &OMGADF, &XNODE, &EM, &XINC, &XN, TSINCE);
 | 
|---|
 | 262 | 
 | 
|---|
 | 263 |     if(TSINCE == 0.0) {
 | 
|---|
 | 264 |         XMDF_seco   = XMDF - XMDF_seco;
 | 
|---|
 | 265 |         OMGADF_seco = OMGADF - OMGADF_seco;
 | 
|---|
 | 266 |         XNODE_seco  = XNODE - XNODE_seco;
 | 
|---|
 | 267 |         EM_seco     = EM - EM_seco;
 | 
|---|
 | 268 |         XINC_seco   = XINC - XINC_seco;
 | 
|---|
 | 269 |         XN_seco     = XN - XN_seco;
 | 
|---|
 | 270 | 
 | 
|---|
 | 271 | #if 0
 | 
|---|
 | 272 |         printf("XMDF_seco   = %e\n", XMDF_seco);
 | 
|---|
 | 273 |         printf("OMGADF_seco = %e\n", OMGADF_seco);
 | 
|---|
 | 274 |         printf("XNODE_seco  = %e\n", XNODE_seco);
 | 
|---|
 | 275 |         printf("EM_seco     = %e\n", EM_seco);
 | 
|---|
 | 276 |         printf("XINC_seco   = %e\n", XINC_seco);
 | 
|---|
 | 277 |         printf("XN_seco     = %e\n", XN_seco);
 | 
|---|
 | 278 | #endif
 | 
|---|
 | 279 |     }
 | 
|---|
 | 280 | 
 | 
|---|
 | 281 |     /*
 | 
|---|
 | 282 |     XMDF   -= XMDF_seco;
 | 
|---|
 | 283 |     OMGADF -= OMGADF_seco;
 | 
|---|
 | 284 |     XNODE  -= XNODE_seco;
 | 
|---|
 | 285 |     EM     -= EM_seco;
 | 
|---|
 | 286 |     XINC   -= XINC_seco;
 | 
|---|
 | 287 |     XN     -= XN_seco;
 | 
|---|
 | 288 |     */
 | 
|---|
 | 289 | 
 | 
|---|
 | 290 |     A = pow(XKE/XN, TOTHRD) * TEMPA * TEMPA;
 | 
|---|
 | 291 |     E = EM - TEMPE;
 | 
|---|
 | 292 | #ifdef SDP_DEEP_DEBUG
 | 
|---|
 | 293 |     printf("*** E = %f\n", E);
 | 
|---|
 | 294 | #endif
 | 
|---|
 | 295 |     XMAM = XMDF + XNODP * TEMPL;
 | 
|---|
 | 296 | /*      CALL DPPER(E,XINC,OMGADF,XNODE,XMAM) */
 | 
|---|
 | 297 | 
 | 
|---|
 | 298 | #ifdef SDP_DEEP_DEBUG
 | 
|---|
 | 299 |     printf("%12s %12s %12s %12s %12s\n",
 | 
|---|
 | 300 |            "E", "XINC", "OMGADF", "XNODE", "XMAM");
 | 
|---|
 | 301 |     printf("%12f %12f %12f %12f %12f\n",
 | 
|---|
 | 302 |            E, XINC, OMGADF, XNODE, XMAM);
 | 
|---|
 | 303 | #endif
 | 
|---|
 | 304 | 
 | 
|---|
 | 305 |     if(TSINCE == 0.0) {
 | 
|---|
 | 306 |         E_pero      = E;
 | 
|---|
 | 307 |         XINC_pero   = XINC;
 | 
|---|
 | 308 |         OMGADF_pero = OMGADF;
 | 
|---|
 | 309 |         XNODE_pero  = XNODE;
 | 
|---|
 | 310 |         XMAM_pero   = XMAM;
 | 
|---|
 | 311 |     }
 | 
|---|
 | 312 | 
 | 
|---|
 | 313 |     dpper(sat, &E, &XINC, &OMGADF, &XNODE, &XMAM, TSINCE);
 | 
|---|
 | 314 | 
 | 
|---|
 | 315 |     if(TSINCE == 0.0) {
 | 
|---|
 | 316 |         E_pero      = E - E_pero;
 | 
|---|
 | 317 |         XINC_pero   = XINC - XINC_pero;
 | 
|---|
 | 318 |         OMGADF_pero = OMGADF - OMGADF_pero;
 | 
|---|
 | 319 |         XNODE_pero  = XNODE - XNODE_pero;
 | 
|---|
 | 320 |         XMAM_pero   = XMAM - XMAM_pero;
 | 
|---|
 | 321 | 
 | 
|---|
 | 322 | #if 0
 | 
|---|
 | 323 |         printf("E_pero      = %e\n", E_pero);
 | 
|---|
 | 324 |         printf("XINC_pero   = %e\n", XINC_pero);
 | 
|---|
 | 325 |         printf("OMGADF_pero = %e\n", OMGADF_pero);
 | 
|---|
 | 326 |         printf("XNODE_pero  = %e\n", XNODE_pero);
 | 
|---|
 | 327 |         printf("XMAM_pero   = %e\n\n", XMAM_pero);
 | 
|---|
 | 328 | #endif
 | 
|---|
 | 329 |     }
 | 
|---|
 | 330 | 
 | 
|---|
 | 331 |     /*
 | 
|---|
 | 332 |     E      -= E_pero;
 | 
|---|
 | 333 |     XINC   -= XINC_pero;
 | 
|---|
 | 334 |     OMGADF -= OMGADF_pero;
 | 
|---|
 | 335 |     XNODE  -= XNODE_pero;
 | 
|---|
 | 336 |     XMAM   -= XMAM_pero;
 | 
|---|
 | 337 |     */
 | 
|---|
 | 338 |     XL = XMAM + OMGADF + XNODE;
 | 
|---|
 | 339 |     BETA = sqrt(1.0 - E * E);
 | 
|---|
 | 340 |     XN = XKE / pow(A, 1.5);
 | 
|---|
 | 341 | 
 | 
|---|
 | 342 | /*      LONG PERIOD PERIODICS */
 | 
|---|
 | 343 | 
 | 
|---|
 | 344 |     AXN = E * cos(OMGADF);
 | 
|---|
 | 345 |     TEMP=1./(A*BETA*BETA);
 | 
|---|
 | 346 |     XLL=TEMP*XLCOF*AXN;
 | 
|---|
 | 347 |     AYNL=TEMP*AYCOF;
 | 
|---|
 | 348 |     XLT=XL+XLL;
 | 
|---|
 | 349 |     AYN=E*sin(OMGADF)+AYNL;
 | 
|---|
 | 350 | 
 | 
|---|
 | 351 | /*      SOLVE KEPLERS EQUATION */
 | 
|---|
 | 352 | 
 | 
|---|
 | 353 |     CAPU=fmod(XLT-XNODE, TWOPI);
 | 
|---|
 | 354 |     TEMP2=CAPU;
 | 
|---|
 | 355 | /*      DO 130 I=1,10*/
 | 
|---|
 | 356 |     for(i = 1; i < 10; i++) {
 | 
|---|
 | 357 |         SINEPW=sin(TEMP2);
 | 
|---|
 | 358 |       COSEPW=cos(TEMP2);
 | 
|---|
 | 359 |       TEMP3=AXN*SINEPW;
 | 
|---|
 | 360 |       TEMP4=AYN*COSEPW;
 | 
|---|
 | 361 |       TEMP5=AXN*COSEPW;
 | 
|---|
 | 362 |       TEMP6=AYN*SINEPW;
 | 
|---|
 | 363 |       EPW=(CAPU-TEMP4+TEMP3-TEMP2)/(1.-TEMP5-TEMP6)+TEMP2;
 | 
|---|
 | 364 | /*      IF(ABS(EPW-TEMP2) .LE. E6A) GO TO 140 */
 | 
|---|
 | 365 |       if(fabs(EPW-TEMP2) <= E6A)
 | 
|---|
 | 366 |           break;
 | 
|---|
 | 367 |       TEMP2=EPW; /* 130 */
 | 
|---|
 | 368 |     }
 | 
|---|
 | 369 | 
 | 
|---|
 | 370 | /*      SHORT PERIOD PRELIMINARY QUANTITIES */
 | 
|---|
 | 371 | 
 | 
|---|
 | 372 |     ECOSE=TEMP5+TEMP6; /* 140  */
 | 
|---|
 | 373 |     ESINE=TEMP3-TEMP4;
 | 
|---|
 | 374 |     ELSQ=AXN*AXN+AYN*AYN;
 | 
|---|
 | 375 |     TEMP=1.-ELSQ;
 | 
|---|
 | 376 |     PL=A*TEMP;
 | 
|---|
 | 377 |     R=A*(1.-ECOSE);
 | 
|---|
 | 378 |     TEMP1=1./R;
 | 
|---|
 | 379 |     RDOT=XKE*sqrt(A)*ESINE*TEMP1;
 | 
|---|
 | 380 |     RFDOT=XKE*sqrt(PL)*TEMP1;
 | 
|---|
 | 381 |     TEMP2=A*TEMP1;
 | 
|---|
 | 382 |     BETAL=sqrt(TEMP);
 | 
|---|
 | 383 |     TEMP3=1./(1.+BETAL);
 | 
|---|
 | 384 |     COSU=TEMP2*(COSEPW-AXN+AYN*ESINE*TEMP3);
 | 
|---|
 | 385 |     SINU=TEMP2*(SINEPW-AYN-AXN*ESINE*TEMP3);
 | 
|---|
 | 386 |     U=actan(SINU,COSU);
 | 
|---|
 | 387 |     SIN2U=2.*SINU*COSU;
 | 
|---|
 | 388 |     COS2U=2.*COSU*COSU-1.0;
 | 
|---|
 | 389 |     TEMP=1./PL;
 | 
|---|
 | 390 |     TEMP1=CK2*TEMP;
 | 
|---|
 | 391 |     TEMP2=TEMP1*TEMP;
 | 
|---|
 | 392 | 
 | 
|---|
 | 393 | /*      UPDATE FOR SHORT PERIODICS */
 | 
|---|
 | 394 | 
 | 
|---|
 | 395 |     RK=R*(1.-1.5*TEMP2*BETAL*X3THM1)+.5*TEMP1*X1MTH2*COS2U;
 | 
|---|
 | 396 |     UK=U - .25 * TEMP2 * X7THM1 * SIN2U;
 | 
|---|
 | 397 |     XNODEK=XNODE+1.5*TEMP2*COSIO*SIN2U;
 | 
|---|
 | 398 |     XINCK=XINC+1.5*TEMP2*COSIO*SINIO*COS2U;
 | 
|---|
 | 399 |     RDOTK=RDOT-XN*TEMP1*X1MTH2*SIN2U;
 | 
|---|
 | 400 |     RFDOTK=RFDOT+XN*TEMP1*(X1MTH2*COS2U+1.5*X3THM1);
 | 
|---|
 | 401 | 
 | 
|---|
 | 402 | /*      ORIENTATION VECTORS */
 | 
|---|
 | 403 |     SINUK=sin(UK);
 | 
|---|
 | 404 |     COSUK=cos(UK);
 | 
|---|
 | 405 |     SINIK=sin(XINCK);
 | 
|---|
 | 406 |     COSIK=cos(XINCK);
 | 
|---|
 | 407 |     SINNOK=sin(XNODEK);
 | 
|---|
 | 408 |     COSNOK=cos(XNODEK);
 | 
|---|
 | 409 |     XMX=-SINNOK*COSIK;
 | 
|---|
 | 410 |     XMY=COSNOK*COSIK;
 | 
|---|
 | 411 |     UX=XMX*SINUK+COSNOK*COSUK;
 | 
|---|
 | 412 |     UY=XMY*SINUK+SINNOK*COSUK;
 | 
|---|
 | 413 |     UZ=SINIK*SINUK;
 | 
|---|
 | 414 |     VX=XMX*COSUK-COSNOK*SINUK;
 | 
|---|
 | 415 |     VY=XMY*COSUK-SINNOK*SINUK;
 | 
|---|
 | 416 |     VZ=SINIK*COSUK;
 | 
|---|
 | 417 | #if 0
 | 
|---|
 | 418 |     printf("UX = %f VX = %f RK = %f RDOTK = %f RFDOTK = %f\n",
 | 
|---|
 | 419 |            UX, VX, RK, RDOTK, RFDOTK);
 | 
|---|
 | 420 | #endif
 | 
|---|
 | 421 | /*      POSITION AND VELOCITY */
 | 
|---|
 | 422 | 
 | 
|---|
 | 423 |     pos->x = RK*UX;
 | 
|---|
 | 424 |     pos->y = RK*UY;
 | 
|---|
 | 425 |     pos->z = RK*UZ;
 | 
|---|
 | 426 |     dpos->x = RDOTK*UX+RFDOTK*VX;
 | 
|---|
 | 427 |     dpos->y = RDOTK*UY+RFDOTK*VY;
 | 
|---|
 | 428 |     dpos->z = RDOTK*UZ+RFDOTK*VZ;
 | 
|---|
 | 429 | /*      RETURN
 | 
|---|
 | 430 |       END */
 | 
|---|
 | 431 | }
 | 
|---|
 | 432 | 
 | 
|---|
 | 433 | /* For RCS Only -- Do Not Edit */
 | 
|---|
| [1719] | 434 | static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: sdp4.c,v $ $Date: 2001-10-22 12:08:28 $ $Revision: 1.2 $ $Name: not supported by cvs2svn $"};
 | 
|---|