/[lmdze]/trunk/dyn3d/calfis.f
ViewVC logotype

Diff of /trunk/dyn3d/calfis.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/dyn3d/calfis.f90 revision 34 by guez, Wed Jun 2 11:01:12 2010 UTC trunk/dyn3d/calfis.f revision 90 by guez, Wed Mar 12 21:16:36 2014 UTC
# Line 1  Line 1 
1  module calfis_m  module calfis_m
2    
   ! Clean: no C preprocessor directive, no include line  
   
3    IMPLICIT NONE    IMPLICIT NONE
4    
5  contains  contains
6    
7    SUBROUTINE calfis(lafin, rdayvrai, heure, pucov, pvcov, pteta, q, &    SUBROUTINE calfis(rdayvrai, time, ucov, vcov, teta, q, ps, pk, phis, phi, &
8         pmasse, pps, ppk, pphis, pphi, pducov, pdvcov, pdteta, pdq, pw, &         w, dufi, dvfi, dtetafi, dqfi, dpfi, lafin)
9         pdufi, pdvfi, pdhfi, pdqfi, pdpsfi)  
10        ! From dyn3d/calfis.F, version 1.3, 2005/05/25 13:10:09
11      ! From dyn3d/calfis.F, v 1.3 2005/05/25 13:10:09      ! Authors: P. Le Van, F. Hourdin
12    
13      ! Auteurs : P. Le Van, F. Hourdin      ! 1. R\'earrangement des tableaux et transformation des variables
14        ! dynamiques en variables physiques
15      !   1. rearrangement des tableaux et transformation  
16      !      variables dynamiques  >  variables physiques      ! 2. Calcul des termes physiques
17      !   2. calcul des termes physiques      ! 3. Retransformation des tendances physiques en tendances dynamiques
18      !   3. retransformation des tendances physiques en tendances dynamiques  
19        ! Remarques:
20      !   remarques:  
21      !   ----------      ! - Les vents sont donn\'es dans la physique par leurs composantes
22        ! naturelles.
23      !    - les vents sont donnes dans la physique par leurs composantes  
24      !      naturelles.      ! - La variable thermodynamique de la physique est une variable
25      !    - la variable thermodynamique de la physique est une variable      ! intensive : T.
26      !      intensive :   T      ! Pour la dynamique on prend T * (preff / p(l))**kappa
     !      pour la dynamique on prend    T * (preff / p(l)) **kappa  
     !    - les deux seules variables dependant de la geometrie necessaires  
     !      pour la physique sont la latitude pour le rayonnement et  
     !      l'aire de la maille quand on veut integrer une grandeur  
     !      horizontalement.  
   
     !     Input :  
     !     -------  
     !       pucov           covariant zonal velocity  
     !       pvcov           covariant meridional velocity  
     !       pteta           potential temperature  
     !       pps             surface pressure  
     !       pmasse          masse d'air dans chaque maille  
     !       pts             surface temperature  (K)  
     !       callrad         clef d'appel au rayonnement  
   
     !    Output :  
     !    --------  
     !        pdufi          tendency for the natural zonal velocity (ms-1)  
     !        pdvfi          tendency for the natural meridional velocity  
     !        pdhfi          tendency for the potential temperature  
     !        pdtsfi         tendency for the surface temperature  
27    
28      !        pdtrad         radiative tendencies  \  both input      ! - Les deux seules variables d\'ependant de la g\'eom\'etrie
29      !        pfluxrad       radiative fluxes      /  and output      ! n\'ecessaires pour la physique sont la latitude (pour le
30        ! rayonnement) et l'aire de la maille (quand on veut int\'egrer une
31        ! grandeur horizontalement).
32    
33        use comconst, only: kappa, cpp, dtphys, g
34        use comgeom, only: apoln, cu_2d, cv_2d, unsaire_2d, apols, rlonu, rlonv
35      use dimens_m, only: iim, jjm, llm, nqmx      use dimens_m, only: iim, jjm, llm, nqmx
36      use dimphy, only: klon      use dimphy, only: klon
37      use comconst, only: kappa, cpp, dtphys, g, pi      use disvert_m, only: preff
     use comvert, only: preff  
     use comgeom, only: apoln, cu_2d, cv_2d, unsaire_2d, apols, rlonu, rlonv  
     use iniadvtrac_m, only: niadv  
38      use grid_change, only: dyn_phy, gr_fi_dyn      use grid_change, only: dyn_phy, gr_fi_dyn
39        use iniadvtrac_m, only: niadv
40        use nr_util, only: pi
41      use physiq_m, only: physiq      use physiq_m, only: physiq
42      use pressure_var, only: p3d, pls      use pressure_var, only: p3d, pls
43    
44      !    Arguments :      REAL, intent(in):: rdayvrai
45        REAL, intent(in):: time ! heure de la journ\'ee en fraction de jour
46    
47      LOGICAL, intent(in):: lafin      REAL, intent(in):: ucov(iim + 1, jjm + 1, llm)
48      REAL, intent(in):: heure ! heure de la journée en fraction de jour      ! ucov covariant zonal velocity
49    
50      REAL pvcov(iim + 1, jjm, llm)      REAL, intent(in):: vcov(iim + 1, jjm, llm)
51      REAL pucov(iim + 1, jjm + 1, llm)      ! vcov covariant meridional velocity
52      REAL pteta(iim + 1, jjm + 1, llm)  
53      REAL pmasse(iim + 1, jjm + 1, llm)      REAL, intent(in):: teta(iim + 1, jjm + 1, llm) ! teta potential temperature
54    
55      REAL, intent(in):: q(iim + 1, jjm + 1, llm, nqmx)      REAL, intent(in):: q(iim + 1, jjm + 1, llm, nqmx)
56      ! (mass fractions of advected fields)      ! mass fractions of advected fields
57    
58        REAL, intent(in):: ps(iim + 1, jjm + 1) ! ps surface pressure
59    
60      REAL pphis(iim + 1, jjm + 1)      REAL, intent(in):: pk(iim + 1, jjm + 1, llm)
61      REAL pphi(iim + 1, jjm + 1, llm)      ! Exner = cp * (p / preff)**kappa
62    
63      REAL pdvcov(iim + 1, jjm, llm)      REAL, intent(in):: phis(iim + 1, jjm + 1)
64      REAL pducov(iim + 1, jjm + 1, llm)      REAL, intent(in):: phi(iim + 1, jjm + 1, llm)
65      REAL pdteta(iim + 1, jjm + 1, llm)      REAL, intent(in):: w(iim + 1, jjm + 1, llm)
     REAL pdq(iim + 1, jjm + 1, llm, nqmx)  
66    
67      REAL pw(iim + 1, jjm + 1, llm)      REAL, intent(out):: dufi(iim + 1, jjm + 1, llm)
68        ! tendency for the covariant zonal velocity (m2 s-2)
69    
70      REAL pps(iim + 1, jjm + 1)      REAL, intent(out):: dvfi(iim + 1, jjm, llm)
71      REAL, intent(in):: ppk(iim + 1, jjm + 1, llm)      ! tendency for the natural meridional velocity
72    
73      REAL pdvfi(iim + 1, jjm, llm)      REAL, intent(out):: dtetafi(iim + 1, jjm + 1, llm)
74      REAL pdufi(iim + 1, jjm + 1, llm)      ! tendency for the potential temperature
     REAL pdhfi(iim + 1, jjm + 1, llm)  
     REAL pdqfi(iim + 1, jjm + 1, llm, nqmx)  
     REAL pdpsfi(iim + 1, jjm + 1)  
75    
76      INTEGER, PARAMETER:: longcles = 20      REAL, intent(out):: dqfi(iim + 1, jjm + 1, llm, nqmx)
77        REAL, intent(out):: dpfi(iim + 1, jjm + 1) ! tendance sur la pression
78        LOGICAL, intent(in):: lafin
79    
80      !    Local variables :      ! Local:
81    
82      INTEGER i, j, l, ig0, ig, iq, iiq      INTEGER i, j, l, ig0, iq, iiq
83      REAL zpsrf(klon)      REAL zpsrf(klon)
     REAL zplev(klon, llm+1), zplay(klon, llm)  
     REAL zphi(klon, llm), zphis(klon)  
84    
85      REAL zufi(klon, llm), zvfi(klon, llm)      REAL paprs(klon, llm+1), play(klon, llm)
86      REAL ztfi(klon, llm) ! temperature      ! paprs defini aux (llm +1) interfaces des couches
87        ! play defini aux (llm) milieux des couches  
88    
89        REAL pphi(klon, llm), pphis(klon)
90    
91        REAL u(klon, llm), v(klon, llm)
92        real zvfi(iim + 1, jjm + 1, llm)
93        REAL t(klon, llm) ! temperature
94      real qx(klon, llm, nqmx) ! mass fractions of advected fields      real qx(klon, llm, nqmx) ! mass fractions of advected fields
95        REAL omega(klon, llm)
96    
97      REAL pcvgu(klon, llm), pcvgv(klon, llm)      REAL d_u(klon, llm), d_v(klon, llm) ! tendances physiques du vent (m s-2)
98      REAL pcvgt(klon, llm), pcvgq(klon, llm, 2)      REAL d_t(klon, llm), d_qx(klon, llm, nqmx)
99        REAL d_ps(klon)
100    
101      REAL pvervel(klon, llm)      REAL z1(iim)
   
     REAL zdufi(klon, llm), zdvfi(klon, llm)  
     REAL zdtfi(klon, llm), zdqfi(klon, llm, nqmx)  
     REAL zdpsrf(klon)  
   
     REAL zsin(iim), zcos(iim), z1(iim)  
     REAL zsinbis(iim), zcosbis(iim), z1bis(iim)  
102      REAL pksurcp(iim + 1, jjm + 1)      REAL pksurcp(iim + 1, jjm + 1)
103    
     ! I. Musat: diagnostic PVteta, Amip2  
     INTEGER, PARAMETER:: ntetaSTD=3  
     REAL:: rtetaSTD(ntetaSTD) = (/350., 380., 405./)  
     REAL PVteta(klon, ntetaSTD)  
   
     REAL SSUM  
   
     LOGICAL:: firstcal = .true.  
     REAL, intent(in):: rdayvrai  
   
104      !-----------------------------------------------------------------------      !-----------------------------------------------------------------------
105    
106      !!print *, "Call sequence information: calfis"      !!print *, "Call sequence information: calfis"
107    
108      !    1. Initialisations :      ! 40. transformation des variables dynamiques en variables physiques:
     !   latitude, longitude et aires des mailles pour la physique:  
109    
110      !   40. transformation des variables dynamiques en variables physiques:      ! 42. pression intercouches :
     !   41. pressions au sol (en Pascals)  
   
     zpsrf(1) = pps(1, 1)  
   
     ig0  = 2  
     DO j = 2, jjm  
        CALL SCOPY(iim, pps(1, j), 1, zpsrf(ig0), 1)  
        ig0 = ig0+iim  
     ENDDO  
111    
112      zpsrf(klon) = pps(1, jjm + 1)      forall (l = 1: llm+1) paprs(:, l) = pack(p3d(:, :, l), dyn_phy)
113    
114      !   42. pression intercouches :      ! 43. temperature naturelle (en K) et pressions milieux couches
   
     !     .... zplev  definis aux (llm +1) interfaces des couches  ....  
     !     .... zplay  definis aux (llm)    milieux des couches  ....  
   
     !    ...    Exner = cp * (p(l) / preff) ** kappa     ....  
   
     forall (l = 1: llm+1) zplev(:, l) = pack(p3d(:, :, l), dyn_phy)  
   
     !   43. temperature naturelle (en K) et pressions milieux couches .  
115      DO l=1, llm      DO l=1, llm
116         pksurcp     =  ppk(:, :, l) / cpp         pksurcp = pk(:, :, l) / cpp
117         pls(:, :, l) = preff * pksurcp**(1./ kappa)         pls(:, :, l) = preff * pksurcp**(1./ kappa)
118         zplay(:, l) = pack(pls(:, :, l), dyn_phy)         play(:, l) = pack(pls(:, :, l), dyn_phy)
119         ztfi(:, l) = pack(pteta(:, :, l) * pksurcp, dyn_phy)         t(:, l) = pack(teta(:, :, l) * pksurcp, dyn_phy)
        pcvgt(:, l) = pack(pdteta(:, :, l) * pksurcp / pmasse(:, :, l), dyn_phy)  
120      ENDDO      ENDDO
121    
122      !   43.bis traceurs      ! 43.bis traceurs
   
123      DO iq=1, nqmx      DO iq=1, nqmx
124         iiq=niadv(iq)         iiq=niadv(iq)
125         DO l=1, llm         DO l=1, llm
126            qx(1, l, iq) = q(1, 1, l, iiq)            qx(1, l, iq) = q(1, 1, l, iiq)
127            ig0          = 2            ig0 = 2
128            DO j=2, jjm            DO j=2, jjm
129               DO i = 1, iim               DO i = 1, iim
130                  qx(ig0, l, iq)  = q(i, j, l, iiq)                  qx(ig0, l, iq) = q(i, j, l, iiq)
131                  ig0             = ig0 + 1                  ig0 = ig0 + 1
132               ENDDO               ENDDO
133            ENDDO            ENDDO
134            qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)            qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)
135         ENDDO         ENDDO
136      ENDDO      ENDDO
137    
138      !   convergence dynamique pour les traceurs "EAU"      ! Geopotentiel calcule par rapport a la surface locale:
139        forall (l = 1:llm) pphi(:, l) = pack(phi(:, :, l), dyn_phy)
140      DO iq=1, 2      pphis = pack(phis, dyn_phy)
141         DO l=1, llm      forall (l = 1:llm) pphi(:, l)=pphi(:, l) - pphis
           pcvgq(1, l, iq)= pdq(1, 1, l, iq) / pmasse(1, 1, l)  
           ig0          = 2  
           DO j=2, jjm  
              DO i = 1, iim  
                 pcvgq(ig0, l, iq) = pdq(i, j, l, iq) / pmasse(i, j, l)  
                 ig0             = ig0 + 1  
              ENDDO  
           ENDDO  
           pcvgq(ig0, l, iq)= pdq(1, jjm + 1, l, iq) / pmasse(1, jjm + 1, l)  
        ENDDO  
     ENDDO  
   
     !   Geopotentiel calcule par rapport a la surface locale:  
   
     forall (l = 1:llm) zphi(:, l) = pack(pphi(:, :, l), dyn_phy)  
     zphis = pack(pphis, dyn_phy)  
     DO l=1, llm  
        DO ig=1, klon  
           zphi(ig, l)=zphi(ig, l)-zphis(ig)  
        ENDDO  
     ENDDO  
   
     !   ....  Calcul de la vitesse  verticale  (en Pa*m*s  ou Kg/s)  ....  
142    
143        ! Calcul de la vitesse verticale (en Pa*m*s ou Kg/s)
144      DO l=1, llm      DO l=1, llm
145         pvervel(1, l)=pw(1, 1, l) * g /apoln         omega(1, l)=w(1, 1, l) * g /apoln
146         ig0=2         ig0=2
147         DO j=2, jjm         DO j=2, jjm
148            DO i = 1, iim            DO i = 1, iim
149               pvervel(ig0, l) = pw(i, j, l) * g * unsaire_2d(i, j)               omega(ig0, l) = w(i, j, l) * g * unsaire_2d(i, j)
150               ig0 = ig0 + 1               ig0 = ig0 + 1
151            ENDDO            ENDDO
152         ENDDO         ENDDO
153         pvervel(ig0, l)=pw(1, jjm + 1, l) * g /apols         omega(ig0, l)=w(1, jjm + 1, l) * g /apols
154      ENDDO      ENDDO
155    
156      !   45. champ u:      ! 45. champ u:
   
     DO  l=1, llm  
157    
158         DO  j=2, jjm      DO l=1, llm
159           DO j=2, jjm
160            ig0 = 1+(j-2)*iim            ig0 = 1+(j-2)*iim
161            zufi(ig0+1, l)= 0.5 *  &            u(ig0+1, l)= 0.5 &
162                 (pucov(iim, j, l)/cu_2d(iim, j) + pucov(1, j, l)/cu_2d(1, j))                 * (ucov(iim, j, l) / cu_2d(iim, j) + ucov(1, j, l) / cu_2d(1, j))
           pcvgu(ig0+1, l)= 0.5 *  &  
                (pducov(iim, j, l)/cu_2d(iim, j) + pducov(1, j, l)/cu_2d(1, j))  
163            DO i=2, iim            DO i=2, iim
164               zufi(ig0+i, l)= 0.5 * &               u(ig0+i, l)= 0.5 * (ucov(i-1, j, l)/cu_2d(i-1, j) &
165                    (pucov(i-1, j, l)/cu_2d(i-1, j) &                    + ucov(i, j, l)/cu_2d(i, j))
                   + pucov(i, j, l)/cu_2d(i, j))  
              pcvgu(ig0+i, l)= 0.5 * &  
                   (pducov(i-1, j, l)/cu_2d(i-1, j) &  
                   + pducov(i, j, l)/cu_2d(i, j))  
166            end DO            end DO
167         end DO         end DO
   
168      end DO      end DO
169    
170      !   46.champ v:      ! 46.champ v:
   
     DO l = 1, llm  
        DO j = 2, jjm  
           ig0 = 1 + (j - 2) * iim  
           DO i = 1, iim  
              zvfi(ig0+i, l)= 0.5 * (pvcov(i, j-1, l) / cv_2d(i, j-1) &  
                   + pvcov(i, j, l) / cv_2d(i, j))  
              pcvgv(ig0+i, l)= 0.5 * &  
                   (pdvcov(i, j-1, l)/cv_2d(i, j-1) &  
                   + pdvcov(i, j, l)/cv_2d(i, j))  
           ENDDO  
        ENDDO  
     ENDDO  
171    
172      !   47. champs de vents au pôle nord        forall (j = 2: jjm, l = 1: llm) zvfi(:iim, j, l)= 0.5 &
173      !        U = 1 / pi  *  integrale [ v * cos(long) * d long ]           * (vcov(:iim, j-1, l) / cv_2d(:iim, j-1) &
174      !        V = 1 / pi  *  integrale [ v * sin(long) * d long ]           + vcov(:iim, j, l) / cv_2d(:iim, j))
175        zvfi(iim + 1, 2:jjm, :) = zvfi(1, 2:jjm, :)
176    
177        ! 47. champs de vents au p\^ole nord
178        ! U = 1 / pi * integrale [ v * cos(long) * d long ]
179        ! V = 1 / pi * integrale [ v * sin(long) * d long ]
180    
181      DO l=1, llm      DO l=1, llm
182           z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*vcov(1, 1, l)/cv_2d(1, 1)
        z1(1)   =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1, 1, l)/cv_2d(1, 1)  
        z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1, 1, l)/cv_2d(1, 1)  
183         DO i=2, iim         DO i=2, iim
184            z1(i)   =(rlonu(i)-rlonu(i-1))*pvcov(i, 1, l)/cv_2d(i, 1)            z1(i) =(rlonu(i)-rlonu(i-1))*vcov(i, 1, l)/cv_2d(i, 1)
           z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i, 1, l)/cv_2d(i, 1)  
185         ENDDO         ENDDO
186    
187         DO i=1, iim         u(1, l) = SUM(COS(rlonv(:iim)) * z1) / pi
188            zcos(i)   = COS(rlonv(i))*z1(i)         zvfi(:, 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
           zcosbis(i)= COS(rlonv(i))*z1bis(i)  
           zsin(i)   = SIN(rlonv(i))*z1(i)  
           zsinbis(i)= SIN(rlonv(i))*z1bis(i)  
        ENDDO  
   
        zufi(1, l)  = SSUM(iim, zcos, 1)/pi  
        pcvgu(1, l) = SSUM(iim, zcosbis, 1)/pi  
        zvfi(1, l)  = SSUM(iim, zsin, 1)/pi  
        pcvgv(1, l) = SSUM(iim, zsinbis, 1)/pi  
   
189      ENDDO      ENDDO
190    
191      !   48. champs de vents au pôle sud:      ! 48. champs de vents au p\^ole sud:
192      !        U = 1 / pi  *  integrale [ v * cos(long) * d long ]      ! U = 1 / pi * integrale [ v * cos(long) * d long ]
193      !        V = 1 / pi  *  integrale [ v * sin(long) * d long ]      ! V = 1 / pi * integrale [ v * sin(long) * d long ]
194    
195      DO l=1, llm      DO l=1, llm
196           z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*vcov(1, jjm, l) &
        z1(1)   =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1, jjm, l) &  
             /cv_2d(1, jjm)  
        z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1, jjm, l) &  
197              /cv_2d(1, jjm)              /cv_2d(1, jjm)
198         DO i=2, iim         DO i=2, iim
199            z1(i)   =(rlonu(i)-rlonu(i-1))*pvcov(i, jjm, l)/cv_2d(i, jjm)            z1(i) =(rlonu(i)-rlonu(i-1))*vcov(i, jjm, l)/cv_2d(i, jjm)
           z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i, jjm, l)/cv_2d(i, jjm)  
200         ENDDO         ENDDO
201    
202         DO i=1, iim         u(klon, l) = SUM(COS(rlonv(:iim)) * z1) / pi
203            zcos(i)    = COS(rlonv(i))*z1(i)         zvfi(:, jjm + 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
           zcosbis(i) = COS(rlonv(i))*z1bis(i)  
           zsin(i)    = SIN(rlonv(i))*z1(i)  
           zsinbis(i) = SIN(rlonv(i))*z1bis(i)  
        ENDDO  
   
        zufi(klon, l)  = SSUM(iim, zcos, 1)/pi  
        pcvgu(klon, l) = SSUM(iim, zcosbis, 1)/pi  
        zvfi(klon, l)  = SSUM(iim, zsin, 1)/pi  
        pcvgv(klon, l) = SSUM(iim, zsinbis, 1)/pi  
   
204      ENDDO      ENDDO
205    
206      !IM calcul PV a teta=350, 380, 405K      forall(l= 1: llm) v(:, l) = pack(zvfi(:, :, l), dyn_phy)
     CALL PVtheta(klon, llm, pucov, pvcov, pteta, &  
          ztfi, zplay, zplev, &  
          ntetaSTD, rtetaSTD, PVteta)  
   
     !   Appel de la physique:  
207    
208      CALL physiq(firstcal, lafin, rdayvrai, heure, dtphys, zplev, zplay, zphi, &      ! Appel de la physique :
209           zphis, zufi, zvfi, ztfi, qx, pvervel, zdufi, zdvfi, zdtfi, zdqfi, &      CALL physiq(lafin, rdayvrai, time, dtphys, paprs, play, pphi, pphis, u, &
210           zdpsrf, pducov, PVteta) ! IM diagnostique PVteta, Amip2           v, t, qx, omega, d_u, d_v, d_t, d_qx, d_ps)
211    
212      !   transformation des tendances physiques en tendances dynamiques:      ! transformation des tendances physiques en tendances dynamiques:
213    
214      !  tendance sur la pression :      dpfi = gr_fi_dyn(d_ps)
215    
216      pdpsfi = gr_fi_dyn(zdpsrf)      ! 62. enthalpie potentielle
217        do l=1, llm
218           dtetafi(:, :, l) = cpp * gr_fi_dyn(d_t(:, l)) / pk(:, :, l)
219        end do
220    
221      !   62. enthalpie potentielle      ! 63. traceurs
222    
223      DO l=1, llm      ! initialisation des tendances
224        dqfi=0.
        DO i=1, iim + 1  
           pdhfi(i, 1, l)    = cpp *  zdtfi(1, l)      / ppk(i, 1  , l)  
           pdhfi(i, jjm + 1, l) = cpp *  zdtfi(klon, l)/ ppk(i, jjm + 1, l)  
        ENDDO  
   
        DO j=2, jjm  
           ig0=1+(j-2)*iim  
           DO i=1, iim  
              pdhfi(i, j, l) = cpp * zdtfi(ig0+i, l) / ppk(i, j, l)  
           ENDDO  
           pdhfi(iim + 1, j, l) =  pdhfi(1, j, l)  
        ENDDO  
   
     ENDDO  
   
     !   62. humidite specifique  
   
     DO iq=1, nqmx  
        DO l=1, llm  
           DO i=1, iim + 1  
              pdqfi(i, 1, l, iq)    = zdqfi(1, l, iq)  
              pdqfi(i, jjm + 1, l, iq) = zdqfi(klon, l, iq)  
           ENDDO  
           DO j=2, jjm  
              ig0=1+(j-2)*iim  
              DO i=1, iim  
                 pdqfi(i, j, l, iq) = zdqfi(ig0+i, l, iq)  
              ENDDO  
              pdqfi(iim + 1, j, l, iq) = pdqfi(1, j, l, iq)  
           ENDDO  
        ENDDO  
     ENDDO  
   
     !   63. traceurs  
   
     !     initialisation des tendances  
     pdqfi=0.  
225    
226      DO iq=1, nqmx      DO iq=1, nqmx
227         iiq=niadv(iq)         iiq=niadv(iq)
228         DO l=1, llm         DO l=1, llm
229            DO i=1, iim + 1            DO i=1, iim + 1
230               pdqfi(i, 1, l, iiq)    = zdqfi(1, l, iq)               dqfi(i, 1, l, iiq) = d_qx(1, l, iq)
231               pdqfi(i, jjm + 1, l, iiq) = zdqfi(klon, l, iq)               dqfi(i, jjm + 1, l, iiq) = d_qx(klon, l, iq)
232            ENDDO            ENDDO
233            DO j=2, jjm            DO j=2, jjm
234               ig0=1+(j-2)*iim               ig0=1+(j-2)*iim
235               DO i=1, iim               DO i=1, iim
236                  pdqfi(i, j, l, iiq) = zdqfi(ig0+i, l, iq)                  dqfi(i, j, l, iiq) = d_qx(ig0+i, l, iq)
237               ENDDO               ENDDO
238               pdqfi(iim + 1, j, l, iiq) = pdqfi(1, j, l, iq)               dqfi(iim + 1, j, l, iiq) = dqfi(1, j, l, iq)
239            ENDDO            ENDDO
240         ENDDO         ENDDO
241      ENDDO      ENDDO
242    
243      !   65. champ u:      ! 65. champ u:
244    
245      DO l=1, llm      DO l=1, llm
   
246         DO i=1, iim + 1         DO i=1, iim + 1
247            pdufi(i, 1, l)    = 0.            dufi(i, 1, l) = 0.
248            pdufi(i, jjm + 1, l) = 0.            dufi(i, jjm + 1, l) = 0.
249         ENDDO         ENDDO
250    
251         DO j=2, jjm         DO j=2, jjm
252            ig0=1+(j-2)*iim            ig0=1+(j-2)*iim
253            DO i=1, iim-1            DO i=1, iim-1
254               pdufi(i, j, l)= &               dufi(i, j, l)= 0.5*(d_u(ig0+i, l)+d_u(ig0+i+1, l))*cu_2d(i, j)
                   0.5*(zdufi(ig0+i, l)+zdufi(ig0+i+1, l))*cu_2d(i, j)  
255            ENDDO            ENDDO
256            pdufi(iim, j, l)= &            dufi(iim, j, l)= 0.5*(d_u(ig0+1, l)+d_u(ig0+iim, l))*cu_2d(iim, j)
257                 0.5*(zdufi(ig0+1, l)+zdufi(ig0+iim, l))*cu_2d(iim, j)            dufi(iim + 1, j, l)=dufi(1, j, l)
           pdufi(iim + 1, j, l)=pdufi(1, j, l)  
258         ENDDO         ENDDO
   
259      ENDDO      ENDDO
260    
261      !   67. champ v:      ! 67. champ v:
262    
263      DO l=1, llm      DO l=1, llm
   
264         DO j=2, jjm-1         DO j=2, jjm-1
265            ig0=1+(j-2)*iim            ig0=1+(j-2)*iim
266            DO i=1, iim            DO i=1, iim
267               pdvfi(i, j, l)= &               dvfi(i, j, l)= 0.5*(d_v(ig0+i, l)+d_v(ig0+i+iim, l))*cv_2d(i, j)
                   0.5*(zdvfi(ig0+i, l)+zdvfi(ig0+i+iim, l))*cv_2d(i, j)  
268            ENDDO            ENDDO
269            pdvfi(iim + 1, j, l) = pdvfi(1, j, l)            dvfi(iim + 1, j, l) = dvfi(1, j, l)
270         ENDDO         ENDDO
271      ENDDO      ENDDO
272    
273      !   68. champ v pres des poles:      ! 68. champ v pr\`es des p\^oles:
274      !      v = U * cos(long) + V * SIN(long)      ! v = U * cos(long) + V * SIN(long)
275    
276      DO l=1, llm      DO l=1, llm
   
277         DO i=1, iim         DO i=1, iim
278            pdvfi(i, 1, l)= &            dvfi(i, 1, l)= d_u(1, l)*COS(rlonv(i))+d_v(1, l)*SIN(rlonv(i))
279                 zdufi(1, l)*COS(rlonv(i))+zdvfi(1, l)*SIN(rlonv(i))            dvfi(i, jjm, l)=d_u(klon, l)*COS(rlonv(i)) +d_v(klon, l)*SIN(rlonv(i))
280            pdvfi(i, jjm, l)=zdufi(klon, l)*COS(rlonv(i)) &            dvfi(i, 1, l)= 0.5*(dvfi(i, 1, l)+d_v(i+1, l))*cv_2d(i, 1)
281                 +zdvfi(klon, l)*SIN(rlonv(i))            dvfi(i, jjm, l)= 0.5 &
282            pdvfi(i, 1, l)= &                 * (dvfi(i, jjm, l) + d_v(klon - iim - 1 + i, l)) * cv_2d(i, jjm)
                0.5*(pdvfi(i, 1, l)+zdvfi(i+1, l))*cv_2d(i, 1)  
           pdvfi(i, jjm, l)= &  
                0.5*(pdvfi(i, jjm, l)+zdvfi(klon-iim-1+i, l))*cv_2d(i, jjm)  
283         ENDDO         ENDDO
284    
285         pdvfi(iim + 1, 1, l)  = pdvfi(1, 1, l)         dvfi(iim + 1, 1, l) = dvfi(1, 1, l)
286         pdvfi(iim + 1, jjm, l)= pdvfi(1, jjm, l)         dvfi(iim + 1, jjm, l)= dvfi(1, jjm, l)
   
287      ENDDO      ENDDO
288    
     firstcal = .FALSE.  
   
289    END SUBROUTINE calfis    END SUBROUTINE calfis
290    
291  end module calfis_m  end module calfis_m

Legend:
Removed from v.34  
changed lines
  Added in v.90

  ViewVC Help
Powered by ViewVC 1.1.21