My Project
 All Classes Files Functions Variables Macros
solarlong.F
Go to the documentation of this file.
1  SUBROUTINE solarlong(pday,psollong,pdist_sol)
2 
3  USE ioipsl
4 
5  IMPLICIT NONE
6 
7 c=======================================================================
8 c
9 c Objet:
10 c ------
11 c
12 c Calcul de la distance soleil-planete et de la declinaison
13 c en fonction du jour de l'annee.
14 c
15 c
16 c Methode:
17 c --------
18 c
19 c Calcul complet de l'elipse
20 c
21 c Interface:
22 c ----------
23 c
24 c Uncommon comprenant les parametres orbitaux.
25 c
26 c Arguments:
27 c ----------
28 c
29 c Input:
30 c ------
31 c pday jour de l'annee (le jour 0 correspondant a l'equinoxe)
32 c lwrite clef logique pour sorties de controle
33 c
34 c Output:
35 c -------
36 c pdist_sol distance entre le soleil et la planete
37 c ( en unite astronomique pour utiliser la constante
38 c solaire terrestre 1370 Wm-2 )
39 c pdecli declinaison ( en radians )
40 c
41 c=======================================================================
42 c-----------------------------------------------------------------------
43 c Declarations:
44 c -------------
45 
46 #include "planete.h"
47 #include "YOMCST.h"
48  include 'iniprint.h'
49 
50 c arguments:
51 c ----------
52 
53  REAL pday,pdist_sol,pdecli,psollong
54  LOGICAL lwrite
55 
56 c Local:
57 c ------
58 
59  REAL zanom,xref,zx0,zdx,zteta,zz,pi
60  INTEGER iter
61  REAL :: pyear_day,pperi_day
62  REAL :: jd_eq, jd_peri
63  LOGICAL,SAVE :: first=.true.
64 c$OMP THREADPRIVATE(first)
65 
66 c-----------------------------------------------------------------------
67 c calcul de l'angle polaire et de la distance au soleil :
68 c -------------------------------------------------------
69 
70 c Initialisation eventuelle:
71  if(first) then
72  call ioget_calendar(pyear_day)
73  call ymds2ju(2000, 3, 21, 0., jd_eq)
74  call ymds2ju(2001, 1, 4, 0., jd_peri)
75  pperi_day = jd_peri - jd_eq
76  pperi_day = r_peri + 180.
77  write(lunout,*)' Number of days in a year = ',pyear_day
78 c call iniorbit(249.22,206.66,669.,485.,25.2)
79  call iniorbit(152.59,146.61,pyear_day,pperi_day,r_incl)
80  first=.false.
81  endif
82 
83 c calcul de l'zanomalie moyenne
84 
85  zz=(pday-peri_day)/year_day
86  pi=2.*asin(1.)
87  zanom=2.*pi*(zz-nint(zz))
88  xref=abs(zanom)
89 
90 c resolution de l'equation horaire zx0 - e * sin (zx0) = xref
91 c methode de Newton
92 
93 ! zx0=xref+e_elips*sin(xref)
94  zx0=xref+r_ecc*sin(xref)
95  DO 110 iter=1,10
96 ! zdx=-(zx0-e_elips*sin(zx0)-xref)/(1.-e_elips*cos(zx0))
97  zdx=-(zx0-r_ecc*sin(zx0)-xref)/(1.-r_ecc*cos(zx0))
98  if(abs(zdx).le.(1.e-7)) goto 120
99  zx0=zx0+zdx
100 110 continue
101 120 continue
102  zx0=zx0+zdx
103  if(zanom.lt.0.) zx0=-zx0
104 
105 c zteta est la longitude solaire
106 
107 ! zteta=2.*atan(sqrt((1.+e_elips)/(1.-e_elips))*tan(zx0/2.))
108  zteta=2.*atan(sqrt((1.+r_ecc)/(1.-r_ecc))*tan(zx0/2.))
109 
110  psollong=zteta-timeperi
111 
112  IF(psollong.LT.0.) psollong=psollong+2.*pi
113  IF(psollong.GT.2.*pi) psollong=psollong-2.*pi
114 
115  psollong = psollong * 180. / pi
116 
117 c distance soleil
118 
119  pdist_sol = (1-r_ecc*r_ecc)
120  & /(1+r_ecc*cos(pi/180.*(psollong-(r_peri+180.0))))
121 ! pdist_sol = (1-e_elips*e_elips)
122 ! & /(1+e_elips*COS(pi/180.*(psollong-(R_peri+180.0))))
123 c-----------------------------------------------------------------------
124 c sorties eventuelles:
125 c ---------------------
126 
127 c IF (lwrite) THEN
128 c PRINT*,'jour de l"annee :',pday
129 c PRINT*,'distance au soleil (en unite astronomique) :',pdist_sol
130 c PRINT*,'declinaison (en degres) :',pdecli*180./pi
131 c ENDIF
132 
133  RETURN
134  END