source: LMDZ6/trunk/libf/phylmd/solarlong.f90

Last change on this file was 5274, checked in by abarral, 9 hours ago

Replace yomcst.h by existing module

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
File size: 4.1 KB
Line 
1SUBROUTINE solarlong(pday, psollong, pdist_sol)
2
3  USE ioipsl
4  USE print_control_mod, ONLY: lunout
5
6  USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
7          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
8          , R_ecc, R_peri, R_incl                                      &
9          , RA, RG, R1SA                                         &
10          , RSIGMA                                                     &
11          , R, RMD, RMV, RD, RV, RCPD                    &
12          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
13          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
14          , RCW, RCS                                                 &
15          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
16          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
17          , RALPD, RBETD, RGAMD
18IMPLICIT NONE
19
20  ! =======================================================================
21
22  ! Objet:
23  ! ------
24
25  ! Calcul de la distance soleil-planete et de la declinaison
26  ! en fonction du jour de l'annee.
27
28
29  ! Methode:
30  ! --------
31
32  ! Calcul complet de l'elipse
33
34  ! Interface:
35  ! ----------
36
37  ! Uncommon comprenant les parametres orbitaux.
38
39  ! Arguments:
40  ! ----------
41
42  ! Input:
43  ! ------
44  ! pday          jour de l'annee (le jour 0 correspondant a l'equinoxe)
45  ! lwrite        clef logique pour sorties de controle
46
47  ! Output:
48  ! -------
49  ! pdist_sol     distance entre le soleil et la planete
50  ! ( en unite astronomique pour utiliser la constante
51  ! solaire terrestre 1370 Wm-2 )
52  ! pdecli        declinaison ( en radians )
53
54  ! =======================================================================
55  ! -----------------------------------------------------------------------
56  ! Declarations:
57  ! -------------
58
59  include "planete.h"
60
61
62  ! arguments:
63  ! ----------
64
65  REAL pday, pdist_sol, pdecli, psollong
66  LOGICAL lwrite
67
68  ! Local:
69  ! ------
70
71  REAL zanom, xref, zx0, zdx, zteta, zz, pi
72  INTEGER iter
73  REAL :: pyear_day, pperi_day
74  REAL :: jd_eq, jd_peri
75  LOGICAL, SAVE :: first = .TRUE.
76  !$OMP THREADPRIVATE(first)
77
78  ! -----------------------------------------------------------------------
79  ! calcul de l'angle polaire et de la distance au soleil :
80  ! -------------------------------------------------------
81
82  ! Initialisation eventuelle:
83  IF (first) THEN
84    CALL ioget_calendar(pyear_day)
85    CALL ymds2ju(2000, 3, 21, 0., jd_eq)
86    CALL ymds2ju(2001, 1, 4, 0., jd_peri)
87    pperi_day = jd_peri - jd_eq
88    pperi_day = r_peri + 180.
89    WRITE (lunout, *) ' Number of days in a year = ', pyear_day
90    ! call iniorbit(249.22,206.66,669.,485.,25.2)
91    CALL iniorbit(152.59, 146.61, pyear_day, pperi_day, r_incl)
92    first = .FALSE.
93  END IF
94
95  ! calcul de l'zanomalie moyenne
96
97  zz = (pday-peri_day)/year_day
98  pi = 2.*asin(1.)
99  zanom = 2.*pi*(zz-nint(zz))
100  xref = abs(zanom)
101
102  ! resolution de l'equation horaire  zx0 - e * sin (zx0) = xref
103  ! methode de Newton
104
105  ! zx0=xref+e_elips*sin(xref)
106  zx0 = xref + r_ecc*sin(xref)
107  DO iter = 1, 10
108    ! zdx=-(zx0-e_elips*sin(zx0)-xref)/(1.-e_elips*cos(zx0))
109    zdx = -(zx0-r_ecc*sin(zx0)-xref)/(1.-r_ecc*cos(zx0))
110    IF (abs(zdx)<=(1.E-7)) GO TO 120
111    zx0 = zx0 + zdx
112  END DO
113120 CONTINUE
114  zx0 = zx0 + zdx
115  IF (zanom<0.) zx0 = -zx0
116
117  ! zteta est la longitude solaire
118
119  ! zteta=2.*atan(sqrt((1.+e_elips)/(1.-e_elips))*tan(zx0/2.))
120  zteta = 2.*atan(sqrt((1.+r_ecc)/(1.-r_ecc))*tan(zx0/2.))
121
122  psollong = zteta - timeperi
123
124  IF (psollong<0.) psollong = psollong + 2.*pi
125  IF (psollong>2.*pi) psollong = psollong - 2.*pi
126
127  psollong = psollong*180./pi
128
129  ! distance soleil
130
131  pdist_sol = (1-r_ecc*r_ecc)/(1+r_ecc*cos(pi/180.*(psollong- &
132    (r_peri+180.0))))
133  ! pdist_sol = (1-e_elips*e_elips)
134  ! &      /(1+e_elips*COS(pi/180.*(psollong-(R_peri+180.0))))
135  ! -----------------------------------------------------------------------
136  ! sorties eventuelles:
137  ! ---------------------
138
139  ! IF (lwrite) THEN
140  ! PRINT*,'jour de l"annee   :',pday
141  ! PRINT*,'distance au soleil (en unite astronomique) :',pdist_sol
142  ! PRINT*,'declinaison (en degres) :',pdecli*180./pi
143  ! ENDIF
144
145  RETURN
146END SUBROUTINE solarlong
Note: See TracBrowser for help on using the repository browser.