def prenut(epoch, mjd): """ Form the matrix of precession and nutation (IAU1976/fk5) Inputs: - epoch Julian Epoch for mean coordinates - mjd Modified Julian Date (jd-2400000.5) for true coordinates Returns: - pnMat the combined precession/nutation matrix, a 3x3 numpy.array. Notes: - The epoch and MJD are TDB (loosely ET). - The matrix is in the sense V(true) = pnMat * V(mean) """ precMat = prec(epoch, epj(mjd)) # Nutation nutMat = nut(mjd) # Combine the matrices: pn = N x P return numpy.dot(nutMat, precMat)
def evp(tdb, deqx = 0.0): """ Barycentric and heliocentric velocity and position of the Earth Inputs: - tdb TDB date (loosely et) as a Modified Julian Date - deqx Julian Epoch (e.g. 2000.0) of mean equator and equinox of the vectors returned. If deqx <= 0.0, all vectors are referred to the mean equator and equinox (fk5) of epoch date. Returns a tuple consisting of (all numpy.array(3)): - Barycentric velocity of Earth (au/s) - Barycentric position of Earth (au) - Heliocentric velocity of Earth (au/s) - Heliocentric position of Earth (au) Accuracy: The maximum deviations from the JPL DE96 ephemeris are as follows: barycentric velocity 0.42 m/s barycentric position 6900 km heliocentric velocity 0.42 m/s heliocentric position 1600 km This routine is adapted from the barvel and barcor subroutines of P.Stumpff, which are described in Astron. Astrophys. Suppl. Ser. 41, 1-8 (1980). Most of the changes are merely cosmetic and do not affect the results at all. However, some adjustments have been made so as to give results that refer to the new (IAU 1976 'fk5') equinox and precession, although the differences these changes make relative to the results from Stumpff's original 'fk4' version are smaller than the inherent accuracy of the algorithm. One minor shortcoming in the original routines that has not been corrected is that better numerical accuracy could be achieved if the various polynomial evaluations were nested. Note also that one of Stumpff's precession constants differs by 0.001 arcsec from the value given in the Explanatory Supplement to the A.E. """ # note: in the original code, E was a shortcut for sorbel[0] # and G was a shortcut for forbel[0] # time arguments t = (tdb-15019.5)/36525.0 tsq = t*t # Values of all elements for the instant date forbel = [0.0]*7 for k in range(8): dlocal = fmod(DCFEL[k,0]+t*DCFEL[k,1]+tsq*DCFEL[k,2], TWOPI) if k == 0: dml = dlocal else: forbel[k-1] = dlocal deps = fmod(DCEPS[0]+t*DCEPS[1]+tsq*DCEPS[2], TWOPI) sorbel = [fmod(CCSEL[k,0]+t*CCSEL[k,1]+tsq*CCSEL[k,2], TWOPI) for k in range(17)] # Secular perturbations in longitude sn = [sin(fmod(CCSEC[k,1]+t*CCSEC[k,2], TWOPI)) for k in range(4)] # Periodic perturbations of the emb (Earth-Moon barycentre) pertl = CCSEC[0,0] *sn[0] +CCSEC[1,0]*sn[1]+ \ (CCSEC[2,0]+t*CCSEC3)*sn[2] +CCSEC[3,0]*sn[3] pertld = 0.0 pertr = 0.0 pertrd = 0.0 for k in range(15): A = fmod(DCARGS[k,0]+t*DCARGS[k,1], TWOPI) cosa = cos(A) sina = sin(A) pertl = pertl + CCAMPS[k,0]*cosa+CCAMPS[k,1]*sina pertr = pertr + CCAMPS[k,2]*cosa+CCAMPS[k,3]*sina if k < 11: pertld = pertld+ \ (CCAMPS[k,1]*cosa-CCAMPS[k,0]*sina)*CCAMPS[k,4] pertrd = pertrd+ \ (CCAMPS[k,3]*cosa-CCAMPS[k,2]*sina)*CCAMPS[k,4] # Elliptic part of the motion of the emb esq = sorbel[0]*sorbel[0] dparam = 1.0-esq param = dparam twoe = sorbel[0]+sorbel[0] twog = forbel[0]+forbel[0] phi = twoe*((1.0-esq*0.125)*sin(forbel[0])+sorbel[0]*0.625*sin(twog) \ +esq*0.5416667*sin(forbel[0]+twog) ) F = forbel[0]+phi sinf = sin(F) cosf = cos(F) dpsi = dparam/(1.0+(sorbel[0]*cosf)) phid = twoe*CCSGD*((1.0+esq*1.5)*cosf+sorbel[0]*(1.25-sinf*sinf*0.5)) psid = CCSGD*sorbel[0]*sinf/sqrt(param) # Perturbed heliocentric motion of the emb d1pdro = 1.0+pertr drd = d1pdro*(psid+dpsi*pertrd) drld = d1pdro*dpsi*(DCSLD+phid+pertld) dtl = fmod(dml+phi+pertl, TWOPI) dsinls = sin(dtl) dcosls = cos(dtl) dxhd = drd*dcosls-drld*dsinls dyhd = drd*dsinls+drld*dcosls # Influence of eccentricity, evection and variation on the # geocentric motion of the Moon pertl = 0.0 pertld = 0.0 pertp = 0.0 pertpd = 0.0 for k in range(3): A = fmod(DCARGM[k,0]+t*DCARGM[k,1], TWOPI) sina = sin(A) cosa = cos(A) pertl = pertl +CCAMPM[k,0]*sina pertld = pertld+CCAMPM[k,1]*cosa pertp = pertp +CCAMPM[k,2]*cosa pertpd = pertpd-CCAMPM[k,3]*sina # Heliocentric motion of the Earth tl = forbel[1]+pertl sinlm = sin(tl) coslm = cos(tl) sigma = CCKM/(1.0+pertp) A = sigma*(CCMLD+pertld) B = sigma*pertpd dxhd = dxhd+(A*sinlm)+(B*coslm) dyhd = dyhd-(A*coslm)+(B*sinlm) dzhd = -(sigma*CCFDI*cos(forbel[2])) # Barycentric motion of the Earth dxbd = dxhd*DC1MME dybd = dyhd*DC1MME dzbd = dzhd*DC1MME sinlp = [0.0] * 4 coslp = [0.0] * 4 for k in range(4): plon = forbel[k+3] pomg = sorbel[k+1] pecc = sorbel[k+9] tl = fmod(plon+2.0*pecc*sin(plon-pomg), TWOPI) sinlp[k] = sin(tl) coslp[k] = cos(tl) dxbd = dxbd+(CCPAMV[k]*(sinlp[k]+pecc*sin(pomg))) dybd = dybd-(CCPAMV[k]*(coslp[k]+pecc*cos(pomg))) dzbd = dzbd-(CCPAMV[k]*sorbel[k+13]*cos(plon-sorbel[k+5])) # Transition to mean equator of date dcosep = cos(deps) dsinep = sin(deps) dyahd = dcosep*dyhd-dsinep*dzhd dzahd = dsinep*dyhd+dcosep*dzhd dyabd = dcosep*dybd-dsinep*dzbd dzabd = dsinep*dybd+dcosep*dzbd # Heliocentric coordinates of the Earth dr = dpsi*d1pdro flatm = CCIM*sin(forbel[2]) A = sigma*cos(flatm) dxh = dr*dcosls-(A*coslm) dyh = dr*dsinls-(A*sinlm) dzh = -(sigma*sin(flatm)) # Barycentric coordinates of the Earth dxb = dxh*DC1MME dyb = dyh*DC1MME dzb = dzh*DC1MME for k in range(4): flat = sorbel[k+13]*sin(forbel[k+3]-sorbel[k+5]) A = CCPAM[k]*(1.0-sorbel[k+9]*cos(forbel[k+3]-sorbel[k+1])) B = A*cos(flat) dxb = dxb-(B*coslp[k]) dyb = dyb-(B*sinlp[k]) dzb = dzb-(A*sin(flat)) # Transition to mean equator of date dyah = dcosep*dyh-dsinep*dzh dzah = dsinep*dyh+dcosep*dzh dyab = dcosep*dyb-dsinep*dzb dzab = dsinep*dyb+dcosep*dzb # Copy result components into vectors, correcting for fk4 equinox depj=epj(tdb) deqcor = DS2R*(0.035+0.00085*(depj-B1950)) helVel = numpy.array(( dxhd-deqcor*dyahd, dyahd+deqcor*dxhd, dzahd, )) barVel = numpy.array(( dxbd-deqcor*dyabd, dyabd+deqcor*dxbd, dzabd, )) helPos = numpy.array(( dxh-deqcor*dyah, dyah+deqcor*dxh, dzah, )) barPos = numpy.array(( dxb-deqcor*dyab, dyab+deqcor*dxb, dzab, )) # Was precession to another equinox requested? if deqx > 0.0: # Yes: compute precession matrix from mjd date to Julian epoch deqx dprema = prec(depj,deqx) # Rotate helVel helVel = numpy.dot(dprema, helVel) # Rotate barVel barVel = numpy.dot(dprema, barVel) # Rotate helPos helPos = numpy.dot(dprema, helPos) # Rotate barPos barPos = numpy.dot(dprema, barPos) return (barVel, barPos, helVel, helPos)
def pree(): prec.prec()