USGSCSM
U.S. flag

An official website of the United States government

Official websites use .gov
A .gov website belongs to an official government organization in the United States.

Secure .gov websites use HTTPS
A lock ( ) or https:// means you’ve safely connected to the .gov website. Share sensitive information only on official, secure websites.

Source code for plio.date.julian2ls

#!/usr/bin/env python
import sys
import math
import numpy as np


[docs]def zero360(angles, rad=False): """ Convert angle to base 0-360 Parameters ---------- angles : float a scalar angle to convert rad : boolean flag whether angles are in radians Returns ------- bb : float converted angle """ if rad: half = math.pi else: half = 180.0 circle = 2.0 * half ii = np.floor(angles / circle) bb = angles - circle * ii #Negative values to positive bb[bb < 0] += circle return bb
[docs]def julian2ls(date, marsyear=None, reverse=False): """ Original IDL from Hugh Keiffer Parameters ----------- date : numeric Scalar or NumPy ndarray or dates marsyear : float Mars year for use in reverse reverse : bool Reverse conversion from L_{s} to julian Returns ------- out : numeric float or array of float LsubS or Julian dates myn : float If LsubS to Mars year, return the Mars year References ----------- [1] M. Allison and M. McEwen.' A post-Pathfinder evaluation of areocentric solar coordinates with improved timing recipes for Mars seasonal/diurnal climate studies'. Plan. Space Sci., 2000, v=48, pages = {215-235}, [2] http://www.giss.nasa.gov/tools/mars24/help/algorithm.html """ if not isinstance(date, np.ndarray): date = np.asarray([date], dtype=np.float64) rec= np.array([-0.0043336633,0.0043630568,0.0039601861,0.029025116,-0.00042300026]) dj2000 = 2451545.0 # JD of epoch J2000 dj4m = 51544.50 # days offset from dj4 to djm smja = 1.523679 # semi-major axis in AU, Table 2. last digit from Ref2 meanmotion = 0.52402075 # mean motion, degrees/day. Constant in Table 2 a5 = np.array([71,57,39,37,21,20,18]) * 0.0001 tau = np.array([2.2353,2.7543,1.1177,15.7866,2.1354,2.4694,32.8493]) phi = np.array([49.409,168.173,191.837,21.736,15.704,95.528,49.095]) if reverse: #Convert from lsubs to julian lsubs = date delta_lsubs = lsubs - 250.99864 rdelta_lsubs= np.radians(delta_lsubs) dj4 = 51507.5 + 1.90826 * delta_lsubs -\ 20.42 * np.sin(rdelta_lsubs) +\ 0.72 * np.sin( 2. * rdelta_lsubs) # Eq. 14 brak = 686.9726 + 0.0043 * np.cos(rdelta_lsubs) -\ 0.0003 * np.cos(2. * rdelta_lsubs) # in brackets in Eq 14 if marsyear is None: return False ny=marsyear + 42 # orbits of mars since 1874.0 dj4 += brak * (ny - 66) # last part of Eq. 14 djtt= dj4 - dj4m # days from J2000 TT tcen = djtt / 36525.0 # julian centuries from J2000 tcor= 64.184 + tcen * (59.0 + tcen * (-51.2 + tcen * (-67.1 - tcen * 16.4))) # TT-UTC djm=djtt - tcor / 86400.0 # convert correction to days and apply out=djm # out is UTC else: #Convert from julian to lsubs if date[0] < 1.e6: #Is this the intended functionality - what if date[0] < and date [1] > djm = date else: djm = date - dj2000 tcen = djm / 36525.0 # julian centuries from J2000 tcor = 64.184 + tcen * (59.0 + tcen * (-51.2 + tcen * (-67.1 - tcen * 16.4))) # TT-UTC djtt = djm + tcor / 86400.0 # convert correction to days and apply. get TT dj4 = djtt + dj4m # A+M's MJD nelements = date.size pbs = np.zeros(nelements) for i in range(nelements): q = 0.985626 * djtt[i] rq = np.radians(q / tau + phi) pbsi = a5 * np.cos(rq) pbs[i] = pbsi.sum() meananomoly = 19.3870 + meanmotion * djtt # Mean anomoly M, Table 2 and Eq. 16 rmeananomoly = np.radians(meananomoly) # M in radians #Eqn of center, in brackets in eq 20 and all but the first term in eq 19. exclude pbs eoc = (10.691 + 3.e-7 * djtt) * np.sin(rmeananomoly)\ + 0.623 * np.sin(2. * rmeananomoly) + 0.050 * np.sin(3. * rmeananomoly)\ + 0.005 * np.sin(4. * rmeananomoly) + 0.0005 * np.sin(5. * rmeananomoly) if reverse: try: j = reverse.size except: j=0 rev = [0] if j >= 5: #User has supplied coefficients rec = rev if j < 5 and rev[0] < 5: fd = 0.0 else: fd=rec[0] + rec[1]* np.sin(rdelta_lsubs)\ + rec[2] * np.sin(2. * rdelta_lsubs)\ + rec[3] * np.sin(3. * rdelta_lsubs)\ + rec[4] * np.sin(4. * rdelta_lsubs) #TODO: This looks like reversing is going to cause an fd undefined error if j >= 5 out = out - ( pbs / meananomoly + fd) else: afms = 270.3863 + 0.52403840 * djtt # Eq. 17 lsubs = afms + eoc + pbs # Eq. 19 LS in degrees lsubs = zero360(lsubs) out= lsubs marstyear = 686.9728 # mean mars tropical year in terrestrial days #marsysol=668.5991 #mars siderial year in sols ny = np.floor((dj4 - 5668.690)/ marstyear ) # full Mars years from 1874 myn = ny - 42 # climate MY if reverse: return out else: return out, myn
if __name__ == '__main__': print(julian2ls(178, marsyear=40, reverse=True))