source: dynamico_lmdz/simple_physics/phyparam/physics/astronomy.F90 @ 4192

Last change on this file since 4192 was 4192, checked in by dubos, 5 years ago

simple_physics : cleanup astronomy

File size: 5.8 KB
Line 
1MODULE astronomy
2  IMPLICIT NONE
3  SAVE
4
5  REAL :: aphelie, periheli, year_day, peri_day, obliquit, &
6       timeperi, e_elips,p_elips
7  REAL, PARAMETER :: unitastr=149.597927, & ! millions of km
8       pi=2.*ASIN(1.)
9
10CONTAINS
11 
12  SUBROUTINE solarlong(pday,psollong)
13
14!=======================================================================
15!      Calcul de la distance soleil-planete et de la declinaison
16!   en fonction du jour de l'annee.
17!
18!   Methode:
19!   --------
20!      Calcul complet de l'ellipse
21!
22!   Input:
23!   ------
24!   pday          jour de l'annee (le jour 0 correspondant a l'equinoxe)
25!   lwrite        clef logique pour sorties de controle
26!
27!   Output:
28!   -------
29!   pdist_sol     distance entre le soleil et la planete
30!                 ( en unite astronomique pour utiliser la constante
31!                  solaire terrestre 1370 Wm-2 )
32!   pdecli        declinaison ( en radians )
33!
34!=======================================================================
35
36    USE planet
37    REAL, INTENT(IN) :: pday
38    REAL, INTENT(OUT) :: psollong
39    LOGICAL, PARAMETER ::  lwrite=.TRUE.
40    REAL pdist_sol, pdecli
41
42! Local:
43! ------
44    REAL zanom,xref,zx0,zdx,zteta,zz
45    INTEGER iter
46
47!--------------------------------------------------------
48! calcul de l'angle polaire et de la distance au soleil :
49! -------------------------------------------------------
50
51!  calcul de l'zanomalie moyenne
52
53    zz=(pday-peri_day)/year_day
54    zanom=2.*pi*(zz-nint(zz))
55    xref=abs(zanom)
56
57!  resolution de l'equation horaire  zx0 - e * sin (zx0) = xref
58!  methode de Newton
59   
60    zx0=xref+e_elips*sin(xref)
61    DO iter=1,10
62       zdx=-(zx0-e_elips*sin(zx0)-xref)/(1.-e_elips*cos(zx0))
63       zx0=zx0+zdx
64    END DO
65    zx0=zx0+zdx
66    if(zanom.lt.0.) zx0=-zx0
67   
68    ! zteta est la longitude solaire
69   
70    zteta=2.*atan(sqrt((1.+e_elips)/(1.-e_elips))*tan(zx0/2.))
71   
72    psollong=zteta-timeperi
73   
74    IF(psollong.LT.0.) psollong=psollong+2.*pi
75    IF(psollong.GT.2.*pi) psollong=psollong-2.*pi
76    !-----------------------------------------------------------------------
77    !   sorties eventuelles:
78    !   ---------------------
79   
80    IF (lwrite) THEN
81       PRINT*,'jour de l"annee   :',pday
82       PRINT*,'distance au soleil (en unite astronomique) :',pdist_sol
83       PRINT*,'declinaison (en degres) :',pdecli*180./pi
84    ENDIF
85   
86  END SUBROUTINE solarlong
87 
88  SUBROUTINE iniorbit
89    !=======================================================================
90    !
91    !   Auteur:
92    !   -------
93    !     Frederic Hourdin      22 Fevrier 1991
94    !
95    !   Objet:
96    !   ------
97    !    Initialisation du sous programme orbite qui calcule
98    !    a une date donnee de l'annee de duree year_day commencant
99    !    a l'equinoxe de printemps et dont le perihelie se situe
100    !    a la date peri_day, la distance au soleil et la declinaison.
101    !
102    !   Interface:
103    !   ----------
104    !   - initialise certaines variables de ce module
105    !   - Doit etre appele avant d'utiliser orbite.
106    !
107    !   Arguments:
108    !   ----------
109    !
110    !   Input:
111    !   ------
112    !   aphelie       \   aphelie et perihelie de l'orbite
113    !   periheli      /   en millions de kilometres.
114    !
115    !=======================================================================
116   
117    !-----------------------------------------------------------------------
118   
119    !   Local:
120    !   ------
121    REAL zxref,zanom,zz,zx0,zdx
122    INTEGER iter
123   
124    !-----------------------------------------------------------------------
125   
126    PRINT*,'Perihelie en Mkm  ',periheli
127    PRINT*,'Aphelise  en Mkm  ',aphelie
128    PRINT*,'obliquite en degres  :',obliquit
129   
130    e_elips=(aphelie-periheli)/(periheli+aphelie)
131    p_elips=0.5*(periheli+aphelie)*(1-e_elips*e_elips)/unitastr
132   
133    print*,'e_elips',e_elips
134    print*,'p_elips',p_elips
135   
136    !-----------------------------------------------------------------------
137    ! calcul de l'angle polaire et de la distance au soleil :
138    ! -------------------------------------------------------
139   
140    !  calcul de l'zanomalie moyenne
141   
142    zz=(year_day-peri_day)/year_day
143    zanom=2.*pi*(zz-nint(zz))
144    zxref=abs(zanom)
145    PRINT*,'zanom  ',zanom
146   
147    !  resolution de l'equation horaire  zx0 - e * sin (zx0) = zxref
148    !  methode de Newton
149   
150    zx0=zxref+e_elips*sin(zxref)
151    DO  iter=1,100
152       zdx=-(zx0-e_elips*sin(zx0)-zxref)/(1.-e_elips*cos(zx0))
153!       if(abs(zdx).le.(1.e-12)) goto 120
154       zx0=zx0+zdx
155    END DO
156   
157    zx0=zx0+zdx
158    if(zanom.lt.0.) zx0=-zx0
159    PRINT*,'zx0   ',zx0
160   
161    ! zteta est la longitude solaire
162   
163    timeperi=2.*atan(sqrt((1.+e_elips)/(1.-e_elips))*tan(zx0/2.))
164    PRINT*,'longitude solaire du perihelie timeperi = ',timeperi
165   
166   
167  END SUBROUTINE iniorbit
168
169  PURE SUBROUTINE orbite(pls,pdist_sol,pdecli)
170    !=======================================================================
171    !
172    !   Objet:
173    !   ------
174    !
175    !   Distance from sun and declimation as a function of the solar
176    !   longitude Ls
177    !
178    !   Arguments:
179    !   ----------
180    !
181    !   Input:
182    !   ------
183    !   pls          Ls
184    !
185    !   Output:
186    !   -------
187    !   pdist_sol     Distance Sun-Planet in UA
188    !   pdecli        declinaison ( en radians )
189    !
190    !=======================================================================
191    !-----------------------------------------------------------------------
192    !   Declarations:
193    !   -------------
194   
195    ! arguments:
196    ! ----------
197
198    REAL, INTENT(IN) :: pls
199    REAL, INTENT(OUT) :: pdist_sol,pdecli
200   
201    !-----------------------------------------------------------------------
202   
203    ! Distance Sun-Planet
204   
205    pdist_sol=p_elips/(1.+e_elips*cos(pls+timeperi))
206   
207    ! Solar declination
208   
209    pdecli= asin (sin(pls)*sin(obliquit*pi/180.))
210   
211  END SUBROUTINE orbite
212
213END MODULE astronomy
214
Note: See TracBrowser for help on using the repository browser.