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

Last change on this file since 1518 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
RevLine 
[3]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
[1301]23c pmu0-----OUTPUT: angle zenithal moyen entre gmtime et gmtime+pdtrad/RDAY
24c frac-----OUTPUT: ensoleillement moyen entre gmtime et gmtime+pdtrad/RDAY
[3]25c================================================================
[101]26      use dimphy
27      IMPLICIT none
[3]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
[892]36      real incl
[3]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
[892]48      incl=R_incl * RPI / 180.
[3]49c
[892]50      lon_sun = longi * RPI / 180.0
[3]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
[892]58      latr = lat(i) * RPI / 180.
[3]59c
60c--pose probleme quand lat=+/-90 degres
61c
62c      omega = -TAN(latr)*TAN(lat_sun)
63c      omega = ACOS(omega)
[892]64c      IF (latr.GE.(RPI/2.+lat_sun)
65c     .    .OR. latr.LE.(-RPI/2.+lat_sun)) THEN
[3]66c         omega = 0.0       ! nuit polaire
67c      ENDIF
[892]68c      IF (latr.GE.(RPI/2.-lat_sun)
69c     .          .OR. latr.LE.(-RPI/2.-lat_sun)) THEN
70c         omega = RPI  ! journee polaire
[3]71c      ENDIF
72c
73c--remplace par cela (le cas par defaut est different)
74c
75      omega=0.0  !--nuit polaire
[892]76      IF (latr.GE.(RPI/2.-lat_sun)
77     .          .OR. latr.LE.(-RPI/2.-lat_sun)) THEN
78         omega = RPI  ! journee polaire
[3]79      ENDIF
[892]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
[3]84      omega = -TAN(latr)*TAN(lat_sun)
85      omega = ACOS(omega)
86      ENDIF
87c
88         omega1 = gmtime1 + long(i)*RDAY/360.0
[892]89         omega1 = omega1*2*RPI / RDAY
90         omega1 = MOD (omega1+2*RPI, 2*RPI)
91         omega1 = omega1 - RPI
[3]92c
93         omega2 = gmtime2 + long(i)*RDAY/360.0
[892]94         omega2 = omega2*2*RPI / RDAY
95         omega2 = MOD (omega2+2*RPI, 2*RPI)
96         omega2 = omega2 - RPI
[3]97c
98      IF (omega1.LE.omega2) THEN  !--on est dans la meme journee locale
99c
[1301]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
[3]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
[1301]122         z1_mu =SIN(latr)*SIN(lat_sun) +
123     .          COS(latr)*COS(lat_sun)*
124     .          (-SIN(omega1))/       
125     .          (RPI-omega1)
[3]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
[1301]138         z2_mu =SIN(latr)*SIN(lat_sun) +
139     .          COS(latr)*COS(lat_sun)*
140     .          (SIN(omega2))/       
141     .          (omega2+RPI)
[3]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
[892]153      frac(i)=(zfrac1+zfrac2)/(omega2+2*RPI-omega1)
[1301]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
[3]160c
161      ENDIF   !---comparaison omega1 et omega2
162c
163      ENDDO
164c
165      END
Note: See TracBrowser for help on using the repository browser.