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

Last change on this file since 796 was 673, checked in by tnavarro, 13 years ago

use of python function instead of fortran code for GCM ls axtime. No need to compile timestuff anymore

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','float32']:
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.