source: trunk/LMDZ.VENUS/libf/phyvenus/zenang.F @ 1521

Last change on this file since 1521 was 1301, checked in by slebonnois, 11 years ago

SL: many bug corrections in phyvenus, some cleaning, and a new ksi matrix format for Venus IR

File size: 6.0 KB
Line 
1c====================================================================
2      SUBROUTINE zenang(longi,gmtime,pdtrad,lat,long,
3     s                  pmu0,frac)
4c=============================================================
5c Auteur : O. Boucher (LMD/CNRS)
6c          d'apres les routines zenith et angle de Z.X. Li
7c Objet  : calculer les valeurs moyennes du cos de l'angle zenithal
8c          et l'ensoleillement moyen entre gmtime1 et gmtime2
9c          connaissant la declinaison, la latitude et la longitude.
10c Rque   : Different de la routine angle en ce sens que zenang
11c          fournit des moyennes de pmu0 et non des valeurs
12c          instantanees, du coup frac prend toutes les valeurs
13c          entre 0 et 1.
14c Date   : premiere version le 13 decembre 1994
15c          revu pour  GCM  le 30 septembre 1996
16c===============================================================
17c longi----INPUT : la longitude vraie de la terre dans son plan
18c                  solaire a partir de l'equinoxe de printemps (degre)
19c gmtime---INPUT : temps universel en fraction de jour
20c pdtrad---INPUT : pas de temps du rayonnement (secondes)
21c lat------INPUT : latitude en degres
22c long-----INPUT : longitude en degres
23c pmu0-----OUTPUT: angle zenithal moyen entre gmtime et gmtime+pdtrad/RDAY
24c frac-----OUTPUT: ensoleillement moyen entre gmtime et gmtime+pdtrad/RDAY
25c================================================================
26      use dimphy
27      IMPLICIT none
28#include "dimensions.h"
29#include "YOMCST.h"
30c================================================================
31      real longi, gmtime, pdtrad
32      real lat(klon), long(klon), pmu0(klon), frac(klon)
33c================================================================
34      integer i
35      real gmtime1, gmtime2
36      real incl
37      real omega1, omega2, omega
38c omega1, omega2 : temps 1 et 2 exprime en radian avec 0 a midi.
39c omega : heure en radian du coucher de soleil
40c -omega est donc l'heure en radian de lever du soleil
41      real omegadeb, omegafin
42      real zfrac1, zfrac2, z1_mu, z2_mu
43      real lat_sun          ! declinaison en radian
44      real lon_sun          ! longitude solaire en radian
45      real latr             ! latitude du pt de grille en radian
46c================================================================
47c
48      incl=R_incl * RPI / 180.
49c
50      lon_sun = longi * RPI / 180.0
51      lat_sun = ASIN (SIN(lon_sun)*SIN(incl) )
52c
53      gmtime1=gmtime*RDAY
54      gmtime2=gmtime*RDAY+pdtrad
55c
56      DO i = 1, klon
57c
58      latr = lat(i) * RPI / 180.
59c
60c--pose probleme quand lat=+/-90 degres
61c
62c      omega = -TAN(latr)*TAN(lat_sun)
63c      omega = ACOS(omega)
64c      IF (latr.GE.(RPI/2.+lat_sun)
65c     .    .OR. latr.LE.(-RPI/2.+lat_sun)) THEN
66c         omega = 0.0       ! nuit polaire
67c      ENDIF
68c      IF (latr.GE.(RPI/2.-lat_sun)
69c     .          .OR. latr.LE.(-RPI/2.-lat_sun)) THEN
70c         omega = RPI  ! journee polaire
71c      ENDIF
72c
73c--remplace par cela (le cas par defaut est different)
74c
75      omega=0.0  !--nuit polaire
76      IF (latr.GE.(RPI/2.-lat_sun)
77     .          .OR. latr.LE.(-RPI/2.-lat_sun)) THEN
78         omega = RPI  ! journee polaire
79      ENDIF
80      IF (latr.LT.(RPI/2.+lat_sun).AND.
81     .    latr.GT.(-RPI/2.+lat_sun).AND.
82     .    latr.LT.(RPI/2.-lat_sun).AND.
83     .    latr.GT.(-RPI/2.-lat_sun)) THEN
84      omega = -TAN(latr)*TAN(lat_sun)
85      omega = ACOS(omega)
86      ENDIF
87c
88         omega1 = gmtime1 + long(i)*RDAY/360.0
89         omega1 = omega1*2*RPI / RDAY
90         omega1 = MOD (omega1+2*RPI, 2*RPI)
91         omega1 = omega1 - RPI
92c
93         omega2 = gmtime2 + long(i)*RDAY/360.0
94         omega2 = omega2*2*RPI / RDAY
95         omega2 = MOD (omega2+2*RPI, 2*RPI)
96         omega2 = omega2 - RPI
97c
98      IF (omega1.LE.omega2) THEN  !--on est dans la meme journee locale
99c
100      IF (omega2.LE.-omega .OR. omega1.GE.omega      !--nuit
101     .           .OR. omega.LT.1e-5) THEN            !--nuit polaire
102        frac(i)=0.0
103        pmu0(i)=SIN(latr)*SIN(lat_sun) +
104     .          COS(latr)*COS(lat_sun)*
105     .          (SIN(omega2)-SIN(omega1))/
106     .          (omega2-omega1)       
107      ELSE                                           !--jour+nuit/jour
108        omegadeb=MAX(-omega,omega1)
109        omegafin=MIN(omega,omega2)
110        frac(i)=(omegafin-omegadeb)/(omega2-omega1)
111        pmu0(i)=SIN(latr)*SIN(lat_sun) +
112     .          COS(latr)*COS(lat_sun)*
113     .          (SIN(omegafin)-SIN(omegadeb))/
114     .          (omegafin-omegadeb)       
115      ENDIF
116c
117      ELSE  !---omega1 GT omega2 -- a cheval sur deux journees
118c
119c-------------------entre omega1 et pi
120      IF (omega1.GE.omega) THEN  !--nuit
121         zfrac1=0.0
122         z1_mu =SIN(latr)*SIN(lat_sun) +
123     .          COS(latr)*COS(lat_sun)*
124     .          (-SIN(omega1))/       
125     .          (RPI-omega1)
126      ELSE                       !--jour+nuit
127        omegadeb=MAX(-omega,omega1)
128        omegafin=omega
129        zfrac1=omegafin-omegadeb
130        z1_mu =SIN(latr)*SIN(lat_sun) +
131     .          COS(latr)*COS(lat_sun)*
132     .          (SIN(omegafin)-SIN(omegadeb))/
133     .          (omegafin-omegadeb)
134      ENDIF
135c---------------------entre -pi et omega2
136      IF (omega2.LE.-omega) THEN   !--nuit
137         zfrac2=0.0
138         z2_mu =SIN(latr)*SIN(lat_sun) +
139     .          COS(latr)*COS(lat_sun)*
140     .          (SIN(omega2))/       
141     .          (omega2+RPI)
142      ELSE                         !--jour+nuit
143         omegadeb=-omega
144         omegafin=MIN(omega,omega2)
145         zfrac2=omegafin-omegadeb
146         z2_mu =SIN(latr)*SIN(lat_sun) +
147     .           COS(latr)*COS(lat_sun)*
148     .           (SIN(omegafin)-SIN(omegadeb))/
149     .           (omegafin-omegadeb)
150c
151      ENDIF
152c-----------------------moyenne
153      frac(i)=(zfrac1+zfrac2)/(omega2+2*RPI-omega1)
154      if (frac(i).ne.0.) then
155       pmu0(i)=(zfrac1*z1_mu+zfrac2*z2_mu)/MAX(zfrac1+zfrac2,1.E-10)
156      else
157       pmu0(i)=((RPI-omega1)*z1_mu+(omega2+RPI)*z2_mu)/
158     .                   (omega2+2*RPI-omega1)
159      endif
160c
161      ENDIF   !---comparaison omega1 et omega2
162c
163      ENDDO
164c
165      END
Note: See TracBrowser for help on using the repository browser.