source: trunk/UTIL/PYTHON/times.py @ 531

Last change on this file since 531 was 404, checked in by acolaitis, 13 years ago

sorry, forgot to do svn add for the previous commit :). These routines are already present if you use f2py on time.F. However, sometime it does not work so you can use my Python version. Also, mine works on arrays :).

File size: 2.5 KB
Line 
1def ls2sol(lstabin):
2
3#  Returns solar longitude, Ls (in deg.), from day number (in sol),
4#  where sol=0=Ls=0 at the northern hemisphere spring equinox
5     import numpy as np
6     import math as m
7
8     year_day=668.6
9     peri_day=485.35
10     timeperi=1.90258341759902
11     e_elips=0.0934
12     pi=3.14159265358979
13     degrad=57.2957795130823
14
15     if type(lstabin).__name__ in ['int','float']:
16        lstab=[lstabin]
17        lsout=np.zeros([1])
18     else: 
19        lstab=lstabin
20        lsout=np.zeros([len(lstab)])
21
22     i=0
23     for ls in lstab:
24         if (np.abs(ls) < 1.0e-5):
25            if (ls >= 0.0):
26                ls2sol = 0.0
27            else:
28                ls2sol = year_day
29         else:
30
31            zteta = ls/degrad + timeperi
32            zx0 = 2.0*m.atan(m.tan(0.5*zteta)/m.sqrt((1.+e_elips)/(1.-e_elips)))
33            xref = zx0-e_elips*m.sin(zx0)
34            zz = xref/(2.*pi)
35            ls2sol = zz*year_day + peri_day
36            if (ls2sol < 0.0): ls2sol = ls2sol + year_day
37            if (ls2sol >= year_day): ls2sol = ls2sol - year_day
38         
39         lsout[i]=ls2sol
40         i=i+1
41
42     return lsout
43
44def sol2ls(soltabin):
45
46#  convert a given martian day number (sol)
47#  into corresponding solar longitude, Ls (in degr.),
48#  where sol=0=Ls=0 is the
49#  northern hemisphere spring equinox.
50      import numpy as np
51      import math as m
52
53      year_day=668.6
54      peri_day=485.35
55      e_elips=0.09340
56      radtodeg=57.2957795130823
57      timeperi=1.90258341759902
58
59      if type(soltabin).__name__ in ['int','float']:
60        soltab=[soltabin]
61        solout=np.zeros([1])
62      else:
63        soltab=soltabin
64        solout=np.zeros([len(soltab)])
65
66      i=0
67      for sol in soltab:
68         zz=(sol-peri_day)/year_day
69         zanom=2.*np.pi*(zz-np.floor(zz))
70         xref=np.abs(zanom)
71
72#  The equation zx0 - e * sin (zx0) = xref, solved by Newton
73         zx0=xref+e_elips*m.sin(xref)
74         iter=0
75         while iter <= 10:
76            iter=iter+1
77            zdx=-(zx0-e_elips*m.sin(zx0)-xref)/(1.-e_elips*m.cos(zx0))
78            if(np.abs(zdx) <= (1.e-7)):
79              continue
80            zx0=zx0+zdx
81         zx0=zx0+zdx
82 
83         if(zanom < 0.): zx0=-zx0
84# compute true anomaly zteta, now that eccentric anomaly zx0 is known
85         zteta=2.*m.atan(m.sqrt((1.+e_elips)/(1.-e_elips))*m.tan(zx0/2.))
86
87# compute Ls
88         ls=zteta-timeperi
89         if(ls < 0.): ls=ls+2.*np.pi
90         if(ls > 2.*np.pi): ls=ls-2.*np.pi
91# convert Ls in deg.
92         ls=radtodeg*ls
93         solout[i]=ls
94         i=i+1
95 
96      return solout
Note: See TracBrowser for help on using the repository browser.