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

Last change on this file since 4208 was 4199, checked in by dubos, 6 years ago

simple_physics : cleanup radiative transfer

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