121 |
use dimphy, only: klon |
use dimphy, only: klon |
122 |
use YOMCST, only: r_incl |
use YOMCST, only: r_incl |
123 |
use phyetat0_m, only: rlat, rlon |
use phyetat0_m, only: rlat, rlon |
124 |
|
use comconst, only: pi |
125 |
|
|
126 |
! Author : O. Boucher (LMD/CNRS), d'après les routines "zenith" et |
! Author : O. Boucher (LMD/CNRS), d'après les routines "zenith" et |
127 |
! "angle" de Z.X. Li |
! "angle" de Z.X. Li |
133 |
! moyennes de "pmu0" et non des valeurs instantanées. |
! moyennes de "pmu0" et non des valeurs instantanées. |
134 |
! Du coup "frac" prend toutes les valeurs entre 0 et 1. |
! Du coup "frac" prend toutes les valeurs entre 0 et 1. |
135 |
|
|
136 |
! Date : premiere version le 13 decembre 1994 |
! Date : première version le 13 decembre 1994 |
137 |
! revu pour GCM le 30 septembre 1996 |
! revu pour GCM le 30 septembre 1996 |
138 |
|
|
139 |
real, intent(in):: longi |
real, intent(in):: longi |
140 |
! (longitude vraie de la terre dans son plan solaire a partir de |
! (longitude vraie de la terre dans son plan solaire a partir de |
141 |
! l'equinoxe de printemps (degre)) |
! l'equinoxe de printemps) (in degrees) |
142 |
|
|
143 |
real, intent(in):: gmtime ! temps universel en fraction de jour |
real, intent(in):: gmtime ! temps universel en fraction de jour |
144 |
real, intent(in):: pdtrad ! pas de temps du rayonnement (secondes) |
real, intent(in):: pdtrad ! pas de temps du rayonnement (secondes) |
145 |
|
|
146 |
real, intent(out):: pmu0(klon) |
real, intent(out):: pmu0(klon) |
147 |
! (cosinus de l'angle zenithal moyen entre gmtime et gmtime+pdtrad) |
! (cosine of mean zenith angle between "gmtime" and "gmtime+pdtrad") |
148 |
|
|
149 |
real, intent(out), optional:: frac(klon) |
real, intent(out), optional:: frac(klon) |
150 |
! (ensoleillement moyen entre gmtime et gmtime+pdtrad) |
! (ensoleillement moyen entre gmtime et gmtime+pdtrad) |
153 |
|
|
154 |
integer i |
integer i |
155 |
real gmtime1, gmtime2 |
real gmtime1, gmtime2 |
156 |
real pi_local, deux_pi_local, incl |
real deux_pi, incl |
157 |
|
|
158 |
real omega1, omega2, omega |
real omega1, omega2, omega |
159 |
! omega1, omega2 : temps 1 et 2 exprime en radian avec 0 a midi. |
! omega1, omega2 : temps 1 et 2 exprimés en radians avec 0 à midi. |
160 |
! omega : heure en radian du coucher de soleil |
! omega : heure en radians du coucher de soleil |
161 |
! -omega est donc l'heure en radian de lever du soleil |
! -omega est donc l'heure en radians de lever du soleil |
162 |
|
|
163 |
real omegadeb, omegafin |
real omegadeb, omegafin |
164 |
real zfrac1, zfrac2, z1_mu, z2_mu |
real zfrac1, zfrac2, z1_mu, z2_mu |
165 |
real lat_sun ! declinaison en radian |
real lat_sun ! déclinaison en radians |
166 |
real lon_sun ! longitude solaire en radian |
real lon_sun ! longitude solaire en radians |
167 |
real latr ! latitude du pt de grille en radian |
real latr ! latitude du point de grille en radians |
168 |
|
|
169 |
!---------------------------------------------------------------------- |
!---------------------------------------------------------------------- |
170 |
|
|
171 |
pi_local = 4.0 * ATAN(1.0) |
deux_pi = 2 * pi |
172 |
deux_pi_local = 2.0 * pi_local |
incl=R_incl * pi / 180. |
|
incl=R_incl * pi_local / 180. |
|
173 |
|
|
174 |
lon_sun = longi * pi_local / 180.0 |
lon_sun = longi * pi / 180. |
175 |
lat_sun = ASIN (SIN(lon_sun)*SIN(incl) ) |
lat_sun = ASIN(SIN(lon_sun)*SIN(incl)) |
176 |
|
|
177 |
gmtime1=gmtime*86400. |
gmtime1=gmtime*86400. |
178 |
gmtime2=gmtime*86400.+pdtrad |
gmtime2=gmtime*86400.+pdtrad |
179 |
|
|
180 |
DO i = 1, klon |
DO i = 1, klon |
181 |
latr = rlat(i) * pi_local / 180. |
latr = rlat(i) * pi / 180. |
182 |
omega=0.0 !--nuit polaire |
omega=0.0 !--nuit polaire |
183 |
IF (latr >= (pi_local/2.-lat_sun) & |
IF (latr >= (pi/2.-lat_sun) & |
184 |
.OR. latr <= (-pi_local/2.-lat_sun)) THEN |
.OR. latr <= (-pi/2.-lat_sun)) THEN |
185 |
omega = pi_local ! journee polaire |
omega = pi ! journee polaire |
186 |
ENDIF |
ENDIF |
187 |
IF (latr < (pi_local/2.+lat_sun).AND. & |
IF (latr < (pi/2.+lat_sun).AND. & |
188 |
latr.GT.(-pi_local/2.+lat_sun).AND. & |
latr.GT.(-pi/2.+lat_sun).AND. & |
189 |
latr < (pi_local/2.-lat_sun).AND. & |
latr < (pi/2.-lat_sun).AND. & |
190 |
latr.GT.(-pi_local/2.-lat_sun)) THEN |
latr.GT.(-pi/2.-lat_sun)) THEN |
191 |
omega = -TAN(latr)*TAN(lat_sun) |
omega = -TAN(latr)*TAN(lat_sun) |
192 |
omega = ACOS(omega) |
omega = ACOS(omega) |
193 |
ENDIF |
ENDIF |
194 |
|
|
195 |
omega1 = gmtime1 + rlon(i)*86400.0/360.0 |
omega1 = gmtime1 + rlon(i)*86400.0/360.0 |
196 |
omega1 = omega1 / 86400.0*deux_pi_local |
omega1 = omega1 / 86400.0*deux_pi |
197 |
omega1 = MOD (omega1+deux_pi_local, deux_pi_local) |
omega1 = MOD (omega1+deux_pi, deux_pi) |
198 |
omega1 = omega1 - pi_local |
omega1 = omega1 - pi |
199 |
|
|
200 |
omega2 = gmtime2 + rlon(i)*86400.0/360.0 |
omega2 = gmtime2 + rlon(i)*86400.0/360.0 |
201 |
omega2 = omega2 / 86400.0*deux_pi_local |
omega2 = omega2 / 86400.0*deux_pi |
202 |
omega2 = MOD (omega2+deux_pi_local, deux_pi_local) |
omega2 = MOD (omega2+deux_pi, deux_pi) |
203 |
omega2 = omega2 - pi_local |
omega2 = omega2 - pi |
204 |
|
|
205 |
test_omega12: IF (omega1 <= omega2) THEN |
test_omega12: IF (omega1 <= omega2) THEN |
206 |
! on est dans la meme journee locale |
! on est dans la meme journee locale |
249 |
ENDIF |
ENDIF |
250 |
!-----------------------moyenne |
!-----------------------moyenne |
251 |
if (present(frac)) & |
if (present(frac)) & |
252 |
frac(i)=(zfrac1+zfrac2)/(omega2+deux_pi_local-omega1) |
frac(i)=(zfrac1+zfrac2)/(omega2+deux_pi-omega1) |
253 |
pmu0(i)=(zfrac1*z1_mu+zfrac2*z2_mu)/MAX(zfrac1+zfrac2, 1.E-10) |
pmu0(i)=(zfrac1*z1_mu+zfrac2*z2_mu)/MAX(zfrac1+zfrac2, 1.E-10) |
254 |
ENDIF test_omega12 |
ENDIF test_omega12 |
255 |
ENDDO |
ENDDO |