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

Last change on this file since 3556 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
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 "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
[892]35      real incl
[3]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
[892]47      incl=R_incl * RPI / 180.
[3]48c
[892]49      lon_sun = longi * RPI / 180.0
[3]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
[892]57      latr = lat(i) * RPI / 180.
[3]58c
59c--pose probleme quand lat=+/-90 degres
60c
61c      omega = -TAN(latr)*TAN(lat_sun)
62c      omega = ACOS(omega)
[892]63c      IF (latr.GE.(RPI/2.+lat_sun)
64c     .    .OR. latr.LE.(-RPI/2.+lat_sun)) THEN
[3]65c         omega = 0.0       ! nuit polaire
66c      ENDIF
[892]67c      IF (latr.GE.(RPI/2.-lat_sun)
68c     .          .OR. latr.LE.(-RPI/2.-lat_sun)) THEN
69c         omega = RPI  ! journee polaire
[3]70c      ENDIF
71c
72c--remplace par cela (le cas par defaut est different)
73c
74      omega=0.0  !--nuit polaire
[892]75      IF (latr.GE.(RPI/2.-lat_sun)
76     .          .OR. latr.LE.(-RPI/2.-lat_sun)) THEN
77         omega = RPI  ! journee polaire
[3]78      ENDIF
[892]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
[3]83      omega = -TAN(latr)*TAN(lat_sun)
84      omega = ACOS(omega)
85      ENDIF
86c
87         omega1 = gmtime1 + long(i)*RDAY/360.0
[892]88         omega1 = omega1*2*RPI / RDAY
89         omega1 = MOD (omega1+2*RPI, 2*RPI)
90         omega1 = omega1 - RPI
[3]91c
92         omega2 = gmtime2 + long(i)*RDAY/360.0
[892]93         omega2 = omega2*2*RPI / RDAY
94         omega2 = MOD (omega2+2*RPI, 2*RPI)
95         omega2 = omega2 - RPI
[3]96c
97      IF (omega1.LE.omega2) THEN  !--on est dans la meme journee locale
98c
[1301]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
[3]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
[1301]121         z1_mu =SIN(latr)*SIN(lat_sun) +
122     .          COS(latr)*COS(lat_sun)*
123     .          (-SIN(omega1))/       
124     .          (RPI-omega1)
[3]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
[1301]137         z2_mu =SIN(latr)*SIN(lat_sun) +
138     .          COS(latr)*COS(lat_sun)*
139     .          (SIN(omega2))/       
140     .          (omega2+RPI)
[3]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
[892]152      frac(i)=(zfrac1+zfrac2)/(omega2+2*RPI-omega1)
[1301]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
[3]159c
160      ENDIF   !---comparaison omega1 et omega2
161c
162      ENDDO
163c
164      END
Note: See TracBrowser for help on using the repository browser.