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

Last change on this file since 3094 was 1530, checked in by emillour, 9 years ago

Venus and Titan GCMs:
Updates in the physics to keep up with updates in LMDZ5 (up to
LMDZ5 trunk, rev 2350) concerning dynamics/physics separation:

  • Adapted makelmdz and makelmdz_fcm script to stop if trying to compile 1d model or newstart or start2archive in parallel.
  • got rid of references to "dimensions.h" in physics. Within physics packages, use nbp_lon (=iim), nbp_lat (=jjmp1) and nbp_lev (=llm) from module mod_grid_phy_lmdz (in phy_common) instead. Only partially done for Titan, because of many hard-coded commons; a necessary first step will be to clean these up (using modules).

EM

File size: 5.9 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 "YOMCST.h"
29c================================================================
30      real longi, gmtime, pdtrad
31      real lat(klon), long(klon), pmu0(klon), frac(klon)
32c================================================================
33      integer i
34      real gmtime1, gmtime2
35      real incl
36      real omega1, omega2, omega
37c omega1, omega2 : temps 1 et 2 exprime en radian avec 0 a midi.
38c omega : heure en radian du coucher de soleil
39c -omega est donc l'heure en radian de lever du soleil
40      real omegadeb, omegafin
41      real zfrac1, zfrac2, z1_mu, z2_mu
42      real lat_sun          ! declinaison en radian
43      real lon_sun          ! longitude solaire en radian
44      real latr             ! latitude du pt de grille en radian
45c================================================================
46c
47      incl=R_incl * RPI / 180.
48c
49      lon_sun = longi * RPI / 180.0
50      lat_sun = ASIN (SIN(lon_sun)*SIN(incl) )
51c
52      gmtime1=gmtime*RDAY
53      gmtime2=gmtime*RDAY+pdtrad
54c
55      DO i = 1, klon
56c
57      latr = lat(i) * RPI / 180.
58c
59c--pose probleme quand lat=+/-90 degres
60c
61c      omega = -TAN(latr)*TAN(lat_sun)
62c      omega = ACOS(omega)
63c      IF (latr.GE.(RPI/2.+lat_sun)
64c     .    .OR. latr.LE.(-RPI/2.+lat_sun)) THEN
65c         omega = 0.0       ! nuit polaire
66c      ENDIF
67c      IF (latr.GE.(RPI/2.-lat_sun)
68c     .          .OR. latr.LE.(-RPI/2.-lat_sun)) THEN
69c         omega = RPI  ! journee polaire
70c      ENDIF
71c
72c--remplace par cela (le cas par defaut est different)
73c
74      omega=0.0  !--nuit polaire
75      IF (latr.GE.(RPI/2.-lat_sun)
76     .          .OR. latr.LE.(-RPI/2.-lat_sun)) THEN
77         omega = RPI  ! journee polaire
78      ENDIF
79      IF (latr.LT.(RPI/2.+lat_sun).AND.
80     .    latr.GT.(-RPI/2.+lat_sun).AND.
81     .    latr.LT.(RPI/2.-lat_sun).AND.
82     .    latr.GT.(-RPI/2.-lat_sun)) THEN
83      omega = -TAN(latr)*TAN(lat_sun)
84      omega = ACOS(omega)
85      ENDIF
86c
87         omega1 = gmtime1 + long(i)*RDAY/360.0
88         omega1 = omega1*2*RPI / RDAY
89         omega1 = MOD (omega1+2*RPI, 2*RPI)
90         omega1 = omega1 - RPI
91c
92         omega2 = gmtime2 + long(i)*RDAY/360.0
93         omega2 = omega2*2*RPI / RDAY
94         omega2 = MOD (omega2+2*RPI, 2*RPI)
95         omega2 = omega2 - RPI
96c
97      IF (omega1.LE.omega2) THEN  !--on est dans la meme journee locale
98c
99      IF (omega2.LE.-omega .OR. omega1.GE.omega      !--nuit
100     .           .OR. omega.LT.1e-5) THEN            !--nuit polaire
101        frac(i)=0.0
102        pmu0(i)=SIN(latr)*SIN(lat_sun) +
103     .          COS(latr)*COS(lat_sun)*
104     .          (SIN(omega2)-SIN(omega1))/
105     .          (omega2-omega1)       
106      ELSE                                           !--jour+nuit/jour
107        omegadeb=MAX(-omega,omega1)
108        omegafin=MIN(omega,omega2)
109        frac(i)=(omegafin-omegadeb)/(omega2-omega1)
110        pmu0(i)=SIN(latr)*SIN(lat_sun) +
111     .          COS(latr)*COS(lat_sun)*
112     .          (SIN(omegafin)-SIN(omegadeb))/
113     .          (omegafin-omegadeb)       
114      ENDIF
115c
116      ELSE  !---omega1 GT omega2 -- a cheval sur deux journees
117c
118c-------------------entre omega1 et pi
119      IF (omega1.GE.omega) THEN  !--nuit
120         zfrac1=0.0
121         z1_mu =SIN(latr)*SIN(lat_sun) +
122     .          COS(latr)*COS(lat_sun)*
123     .          (-SIN(omega1))/       
124     .          (RPI-omega1)
125      ELSE                       !--jour+nuit
126        omegadeb=MAX(-omega,omega1)
127        omegafin=omega
128        zfrac1=omegafin-omegadeb
129        z1_mu =SIN(latr)*SIN(lat_sun) +
130     .          COS(latr)*COS(lat_sun)*
131     .          (SIN(omegafin)-SIN(omegadeb))/
132     .          (omegafin-omegadeb)
133      ENDIF
134c---------------------entre -pi et omega2
135      IF (omega2.LE.-omega) THEN   !--nuit
136         zfrac2=0.0
137         z2_mu =SIN(latr)*SIN(lat_sun) +
138     .          COS(latr)*COS(lat_sun)*
139     .          (SIN(omega2))/       
140     .          (omega2+RPI)
141      ELSE                         !--jour+nuit
142         omegadeb=-omega
143         omegafin=MIN(omega,omega2)
144         zfrac2=omegafin-omegadeb
145         z2_mu =SIN(latr)*SIN(lat_sun) +
146     .           COS(latr)*COS(lat_sun)*
147     .           (SIN(omegafin)-SIN(omegadeb))/
148     .           (omegafin-omegadeb)
149c
150      ENDIF
151c-----------------------moyenne
152      frac(i)=(zfrac1+zfrac2)/(omega2+2*RPI-omega1)
153      if (frac(i).ne.0.) then
154       pmu0(i)=(zfrac1*z1_mu+zfrac2*z2_mu)/MAX(zfrac1+zfrac2,1.E-10)
155      else
156       pmu0(i)=((RPI-omega1)*z1_mu+(omega2+RPI)*z2_mu)/
157     .                   (omega2+2*RPI-omega1)
158      endif
159c
160      ENDIF   !---comparaison omega1 et omega2
161c
162      ENDDO
163c
164      END
Note: See TracBrowser for help on using the repository browser.