| 1 | #include "slalib.h" | 
|---|
| 2 | #include "slamac.h" | 
|---|
| 3 | void slaEarth ( int iy, int id, float fd, float pv[6] ) | 
|---|
| 4 | /* | 
|---|
| 5 | **  - - - - - - - - - | 
|---|
| 6 | **   s l a E a r t h | 
|---|
| 7 | **  - - - - - - - - - | 
|---|
| 8 | ** | 
|---|
| 9 | **  Approximate heliocentric position and velocity of the Earth. | 
|---|
| 10 | ** | 
|---|
| 11 | **  (single precision) | 
|---|
| 12 | ** | 
|---|
| 13 | **  Given: | 
|---|
| 14 | **     iy       int        year | 
|---|
| 15 | **     id       int        day in year (1 = Jan 1st) | 
|---|
| 16 | **     fd       float      fraction of day | 
|---|
| 17 | ** | 
|---|
| 18 | **  Returned: | 
|---|
| 19 | **     pv       float[6]   Earth position & velocity vector | 
|---|
| 20 | ** | 
|---|
| 21 | **  Notes: | 
|---|
| 22 | ** | 
|---|
| 23 | **  1  The date and time is TDB (loosely ET) in a Julian calendar | 
|---|
| 24 | **     which has been aligned to the ordinary Gregorian | 
|---|
| 25 | **     calendar for the interval 1900 March 1 to 2100 February 28. | 
|---|
| 26 | **     The year and day can be obtained by calling slaCalyd or | 
|---|
| 27 | **     slaClyd. | 
|---|
| 28 | ** | 
|---|
| 29 | **  2  The Earth heliocentric 6-vector is mean equator and equinox | 
|---|
| 30 | **     of date.  Position part, PV(1-3), is in AU;  velocity part, | 
|---|
| 31 | **     PV(4-6), is in AU/sec. | 
|---|
| 32 | ** | 
|---|
| 33 | **  3  Max/RMS errors 1950-2050: | 
|---|
| 34 | **       13/5 E-5 AU = 19200/7600 km in position | 
|---|
| 35 | **       47/26 E-10 AU/s = 0.0070/0.0039 km/s in speed | 
|---|
| 36 | ** | 
|---|
| 37 | **  4  More precise results are obtainable with the routine slaEvp. | 
|---|
| 38 | ** | 
|---|
| 39 | **  Defined in slamac.h:  D2PI, dmod | 
|---|
| 40 | ** | 
|---|
| 41 | **  Last revision:   25 April 1996 | 
|---|
| 42 | ** | 
|---|
| 43 | **  Copyright P.T.Wallace.  All rights reserved. | 
|---|
| 44 | */ | 
|---|
| 45 |  | 
|---|
| 46 | #define SPEED 1.9913e-7f    /* Mean orbital speed of Earth, AU/s */ | 
|---|
| 47 | #define REMB  3.12e-5f      /* Mean Earth:EMB distance, AU       */ | 
|---|
| 48 | #define SEMB  8.31e-11f     /* Mean Earth:EMB speed, AU/s        */ | 
|---|
| 49 |  | 
|---|
| 50 | { | 
|---|
| 51 | float yi, yf, t, elm, gam, em, elt, eps0, | 
|---|
| 52 | e, esq, v, r, elmm, coselt, sineps, coseps, w1, w2, selmm, celmm; | 
|---|
| 53 | int iy4; | 
|---|
| 54 |  | 
|---|
| 55 | /* Whole years & fraction of year, and years since J1900.0 */ | 
|---|
| 56 | yi = (float) ( iy - 1900 ); | 
|---|
| 57 | iy4 = iy >= 0 ? iy % 4 : 3 - ( - iy - 1 ) % 4; | 
|---|
| 58 | yf = ( (float) ( 4 * ( id - 1 / ( iy4 + 1 ) ) | 
|---|
| 59 | - iy4 - 2 ) + 4.0f * fd ) / 1461.0f; | 
|---|
| 60 | t = yi + yf; | 
|---|
| 61 |  | 
|---|
| 62 | /* Geometric mean longitude of Sun */ | 
|---|
| 63 | /* (cf 4.881627938+6.283319509911*t mod 2pi) */ | 
|---|
| 64 | elm = (float) dmod ( 4.881628 | 
|---|
| 65 | + D2PI * ( (double) yf ) + 0.00013420 * ( (double) t ), | 
|---|
| 66 | D2PI ); | 
|---|
| 67 |  | 
|---|
| 68 | /* Mean longitude of perihelion */ | 
|---|
| 69 | gam = 4.908230f + 3.0005e-4f * t; | 
|---|
| 70 |  | 
|---|
| 71 | /* Mean anomaly */ | 
|---|
| 72 | em = elm - gam; | 
|---|
| 73 |  | 
|---|
| 74 | /* Mean obliquity */ | 
|---|
| 75 | eps0 = 0.40931975f - 2.27e-6f * t; | 
|---|
| 76 |  | 
|---|
| 77 | /* Eccentricity */ | 
|---|
| 78 | e = 0.016751f - 4.2e-7f * t; | 
|---|
| 79 | esq = (float) ( e * e ); | 
|---|
| 80 |  | 
|---|
| 81 | /* True anomaly */ | 
|---|
| 82 | v = em + 2.0f * e * (float) sin ( (double) em ) | 
|---|
| 83 | + 1.25f * esq * (float) sin ( 2.0 * (double) em ); | 
|---|
| 84 |  | 
|---|
| 85 | /* True ecliptic longitude */ | 
|---|
| 86 | elt = v + gam; | 
|---|
| 87 |  | 
|---|
| 88 | /* True distance */ | 
|---|
| 89 | r = ( 1.0f - esq ) / ( 1.0f + e * (float) cos ( (double) v ) ); | 
|---|
| 90 |  | 
|---|
| 91 | /* Moon's mean longitude */ | 
|---|
| 92 | elmm = (float) dmod ( ( 4.72 + 83.9971 * ( (double) t ) ), D2PI ); | 
|---|
| 93 |  | 
|---|
| 94 | /* Useful functions */ | 
|---|
| 95 | coselt = (float) cos ( (double) elt ); | 
|---|
| 96 | sineps = (float) sin ( (double) eps0 ); | 
|---|
| 97 | coseps = (float) cos ( (double) eps0 ); | 
|---|
| 98 | w1 = -r * (float) sin ( (double) elt ); | 
|---|
| 99 | w2 = -SPEED * ( coselt + e * (float) cos ( (double) gam ) ); | 
|---|
| 100 | selmm = (float) sin ( (double) elmm ); | 
|---|
| 101 | celmm = (float) cos ( (double) elmm ); | 
|---|
| 102 |  | 
|---|
| 103 | /* Earth position and velocity */ | 
|---|
| 104 | pv[0] = - r * coselt - REMB * celmm; | 
|---|
| 105 | pv[1] = ( w1 - REMB * selmm ) * coseps; | 
|---|
| 106 | pv[2] = w1 * sineps; | 
|---|
| 107 | pv[3] = SPEED * ( (float) sin ( (double) elt ) + | 
|---|
| 108 | e * (float) sin ( (double) gam ) ) + SEMB * selmm; | 
|---|
| 109 | pv[4] = ( w2 - SEMB * celmm ) * coseps; | 
|---|
| 110 | pv[5] = w2 * sineps; | 
|---|
| 111 | } | 
|---|