| 1 | def 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 |  | 
|---|
| 44 | def 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 | 
|---|