1 #ifndef _SGP4h_
2 #define _SGP4h_
3 /*     ----------------------------------------------------------------
4 *
5 *                                 SGP4.h
6 *
7 *    this file contains the sgp4 procedures for analytical propagation
8 *    of a satellite. the code was originally released in the 1980 and 1986
9 *    spacetrack papers. a detailed discussion of the theory and history
10 *    may be found in the 2006 aiaa paper by vallado, crawford, hujsak,
11 *    and kelso.
12 *
13 *    current :
14 *              12 mar 20  david vallado
15 *                           chg satnum to string for alpha 5 or 9-digit
16 *    changes :
17 *               7 dec 15  david vallado
18 *                           fix jd, jdfrac
19 *               3 nov 14  david vallado
20 *                           update to msvs2013 c++
21 *              30 Dec 11  david vallado
22 *                           consolidate updated code version
23 *              30 Aug 10  david vallado
24 *                           delete unused variables in initl
25 *                           replace pow inetger 2, 3 with multiplies for speed
26 *               3 Nov 08  david vallado
27 *                           put returns in for error codes
28 *              29 sep 08  david vallado
29 *                           fix atime for faster operation in dspace
30 *                           add operationmode for afspc (a) or improved (i)
31 *                           performance mode
32 *              20 apr 07  david vallado
33 *                           misc fixes for constants
34 *              11 aug 06  david vallado
35 *                           chg lyddane choice back to strn3, constants, misc doc
36 *              15 dec 05  david vallado
37 *                           misc fixes
38 *              26 jul 05  david vallado
39 *                           fixes for paper
40 *                           note that each fix is preceded by a
41 *                           comment with "sgp4fix" and an explanation of
42 *                           what was changed
43 *              10 aug 04  david vallado
44 *                           2nd printing baseline working
45 *              14 may 01  david vallado
46 *                           2nd edition baseline
47 *                     80  norad
48 *                           original baseline
49 *       ----------------------------------------------------------------      */
50 
51 #pragma once
52 
53 #include <math.h>
54 #include <stdio.h>
55 #include <string.h>
56 #include <iostream>
57 
58 #define SGP4Version  "SGP4 Version 2020-07-13"
59 
60 // -------------------------- structure declarations ----------------------------
61 typedef enum
62 {
63   wgs72old,
64   wgs72,
65   wgs84
66 } gravconsttype;
67 
68 typedef struct elsetrec
69 {
70   char      satnum[6];
71   int       epochyr, epochtynumrev;
72   int       error;
73   char      operationmode;
74   char      init, method;
75 
76   /* Near Earth */
77   int    isimp;
78   double aycof  , con41  , cc1    , cc4      , cc5    , d2      , d3   , d4    ,
79          delmo  , eta    , argpdot, omgcof   , sinmao , t       , t2cof, t3cof ,
80          t4cof  , t5cof  , x1mth2 , x7thm1   , mdot   , nodedot, xlcof , xmcof ,
81          nodecf;
82 
83   /* Deep Space */
84   int    irez;
85   double d2201  , d2211  , d3210  , d3222    , d4410  , d4422   , d5220 , d5232 ,
86          d5421  , d5433  , dedt   , del1     , del2   , del3    , didt  , dmdt  ,
87          dnodt  , domdt  , e3     , ee2      , peo    , pgho    , pho   , pinco ,
88          plo    , se2    , se3    , sgh2     , sgh3   , sgh4    , sh2   , sh3   ,
89          si2    , si3    , sl2    , sl3      , sl4    , gsto    , xfact , xgh2  ,
90          xgh3   , xgh4   , xh2    , xh3      , xi2    , xi3     , xl2   , xl3   ,
91          xl4    , xlamo  , zmol   , zmos     , atime  , xli     , xni;
92 
93   double a, altp, alta, epochdays, jdsatepoch, jdsatepochF, nddot, ndot,
94 	     bstar, rcse, inclo, nodeo, ecco, argpo, mo, no_kozai;
95   // sgp4fix add new variables from tle
96   char  classification, intldesg[11];
97   int   ephtype;
98   long  elnum    , revnum;
99   // sgp4fix add unkozai'd variable
100   double no_unkozai;
101   // sgp4fix add singly averaged variables
102   double am     , em     , im     , Om       , om     , mm      , nm;
103   // sgp4fix add constant parameters to eliminate mutliple calls during execution
104   double tumin, mus, radiusearthkm, xke, j2, j3, j4, j3oj2;
105 
106   //       Additional elements to capture relevant TLE and object information:
107   long dia_mm; // RSO dia in mm
108   double period_sec; // Period in seconds
109   unsigned char active; // "Active S/C" flag (0=n, 1=y)
110   unsigned char not_orbital; // "Orbiting S/C" flag (0=n, 1=y)
111   double rcs_m2; // "RCS (m^2)" storage
112 
113 } elsetrec;
114 
115 
116 namespace SGP4Funcs
117 {
118 
119 	//	public class SGP4Class
120 	//	{
121 
122 	bool sgp4init
123 		(
124 		gravconsttype whichconst, char opsmode, const char satn[9], const double epoch,
125 		const double xbstar, const double xndot, const double xnddot, const double xecco, const double xargpo,
126 		const double xinclo, const double xmo, const double xno,
127 		const double xnodeo, elsetrec& satrec
128 		);
129 
130 	bool sgp4
131 		(
132 		// no longer need gravconsttype whichconst, all data contained in satrec
133 		elsetrec& satrec, double tsince,
134 		double r[3], double v[3]
135 		);
136 
137 	void getgravconst
138 		(
139 		gravconsttype whichconst,
140 		double& tumin,
141 		double& mus,
142 		double& radiusearthkm,
143 		double& xke,
144 		double& j2,
145 		double& j3,
146 		double& j4,
147 		double& j3oj2
148 		);
149 
150 	// older sgp4io methods
151 	void twoline2rv
152 		(
153 		char      longstr1[130], char longstr2[130],
154 		char      typerun, char typeinput, char opsmode,
155 		gravconsttype       whichconst,
156 		double& startmfe, double& stopmfe, double& deltamin,
157 		elsetrec& satrec
158 		);
159 
160 	// older sgp4ext methods
161 	double  gstime_SGP4
162 		(
163 		double jdut1
164 		);
165 
166 	double  sgn_SGP4
167 		(
168 		double x
169 		);
170 
171 	double  mag_SGP4
172 		(
173 		double x[3]
174 		);
175 
176 	void    cross_SGP4
177 		(
178 		double vec1[3], double vec2[3], double outvec[3]
179 		);
180 
181 	double  dot_SGP4
182 		(
183 		double x[3], double y[3]
184 		);
185 
186 	double  angle_SGP4
187 		(
188 		double vec1[3],
189 		double vec2[3]
190 		);
191 
192 	void    newtonnu_SGP4
193 		(
194 		double ecc, double nu,
195 		double& e0, double& m
196 		);
197 
198 	double  asinh_SGP4
199 		(
200 		double xval
201 		);
202 
203 	void    rv2coe_SGP4
204 		(
205 		double r[3], double v[3], double mus,
206 		double& p, double& a, double& ecc, double& incl, double& omega, double& argp,
207 		double& nu, double& m, double& arglat, double& truelon, double& lonper
208 		);
209 
210 	void    jday_SGP4
211 		(
212 		int year, int mon, int day, int hr, int minute, double sec,
213 		double& jd, double& jdFrac
214 		);
215 
216 	void    days2mdhms_SGP4
217 		(
218 		int year, double days,
219 		int& mon, int& day, int& hr, int& minute, double& sec
220 		);
221 
222 	void    invjday_SGP4
223 		(
224 		double jd, double jdFrac,
225 		int& year, int& mon, int& day,
226 		int& hr, int& minute, double& sec
227 		);
228 
229 
230 }  // namespace
231 
232 #endif
233