/[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 89 by guez, Tue Mar 11 16:03:19 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, &         dudyn, 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éarrangement 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és dans la physique par leurs composantes
22        ! naturelles.
     !    - les vents sont donnes dans la physique par leurs composantes  
     !      naturelles.  
     !    - la variable thermodynamique de la physique est une variable  
     !      intensive :   T  
     !      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  
23    
24      !        pdtrad         radiative tendencies  \  both input      ! - La variable thermodynamique de la physique est une variable
25      !        pfluxrad       radiative fluxes      /  and output      ! intensive : T.
26        ! Pour la dynamique on prend T * (preff / p(l))**kappa
27    
28        ! - Les deux seules variables dépendant de la géométrie
29        ! nécessaires pour la physique sont la latitude pour le
30        ! rayonnement et l'aire de la maille quand on veut intégrer 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 :      ! Arguments :
45    
46      LOGICAL, intent(in):: lafin      ! Output :
47      REAL, intent(in):: heure ! heure de la journée en fraction de jour      ! dvfi tendency for the natural meridional velocity
48        ! dtetafi tendency for the potential temperature
49        ! pdtsfi tendency for the surface temperature
50    
51        ! pdtrad radiative tendencies \ input and output
52        ! pfluxrad radiative fluxes / input and output
53    
54      REAL pvcov(iim + 1, jjm, llm)      REAL, intent(in):: rdayvrai
55      REAL pucov(iim + 1, jjm + 1, llm)      REAL, intent(in):: time ! heure de la journée en fraction de jour
56      REAL pteta(iim + 1, jjm + 1, llm)      REAL, intent(in):: ucov(iim + 1, jjm + 1, llm)
57      REAL pmasse(iim + 1, jjm + 1, llm)      ! ucov covariant zonal velocity
58        REAL, intent(in):: vcov(iim + 1, jjm, llm)
59        ! vcov covariant meridional velocity
60        REAL, intent(in):: teta(iim + 1, jjm + 1, llm)
61        ! teta potential temperature
62    
63      REAL, intent(in):: q(iim + 1, jjm + 1, llm, nqmx)      REAL, intent(in):: q(iim + 1, jjm + 1, llm, nqmx)
64      ! (mass fractions of advected fields)      ! (mass fractions of advected fields)
65    
66      REAL pphis(iim + 1, jjm + 1)      REAL, intent(in):: ps(iim + 1, jjm + 1)
67      REAL pphi(iim + 1, jjm + 1, llm)      ! ps surface pressure
68        REAL, intent(in):: pk(iim + 1, jjm + 1, llm)
69      REAL pdvcov(iim + 1, jjm, llm)      REAL, intent(in):: phis(iim + 1, jjm + 1)
70      REAL pducov(iim + 1, jjm + 1, llm)      REAL, intent(in):: phi(iim + 1, jjm + 1, llm)
71      REAL pdteta(iim + 1, jjm + 1, llm)      REAL dudyn(iim + 1, jjm + 1, llm)
72      REAL pdq(iim + 1, jjm + 1, llm, nqmx)      REAL, intent(in):: w(iim + 1, jjm + 1, llm)
73    
74      REAL pw(iim + 1, jjm + 1, llm)      REAL, intent(out):: dufi(iim + 1, jjm + 1, llm)
75        ! tendency for the covariant zonal velocity (m2 s-2)
76      REAL pps(iim + 1, jjm + 1)  
77      REAL, intent(in):: ppk(iim + 1, jjm + 1, llm)      REAL dvfi(iim + 1, jjm, llm)
78        REAL, intent(out):: dtetafi(iim + 1, jjm + 1, llm)
79      REAL pdvfi(iim + 1, jjm, llm)      REAL dqfi(iim + 1, jjm + 1, llm, nqmx)
80      REAL pdufi(iim + 1, jjm + 1, llm)      REAL dpfi(iim + 1, jjm + 1)
81      REAL pdhfi(iim + 1, jjm + 1, llm)      LOGICAL, intent(in):: lafin
     REAL pdqfi(iim + 1, jjm + 1, llm, nqmx)  
     REAL pdpsfi(iim + 1, jjm + 1)  
   
     INTEGER, PARAMETER:: longcles = 20  
82    
83      !    Local variables :      ! Local variables :
84    
85      INTEGER i, j, l, ig0, ig, iq, iiq      INTEGER i, j, l, ig0, iq, iiq
86      REAL zpsrf(klon)      REAL zpsrf(klon)
87      REAL zplev(klon, llm+1), zplay(klon, llm)      REAL paprs(klon, llm+1), play(klon, llm)
88      REAL zphi(klon, llm), zphis(klon)      REAL pphi(klon, llm), pphis(klon)
89    
90      REAL zufi(klon, llm), zvfi(klon, llm)      REAL u(klon, llm), v(klon, llm)
91      REAL ztfi(klon, llm) ! temperature      real zvfi(iim + 1, jjm + 1, llm)
92        REAL t(klon, llm) ! temperature
93      real qx(klon, llm, nqmx) ! mass fractions of advected fields      real qx(klon, llm, nqmx) ! mass fractions of advected fields
94        REAL omega(klon, llm)
95    
96      REAL pcvgu(klon, llm), pcvgv(klon, llm)      REAL d_u(klon, llm), d_v(klon, llm) ! tendances physiques du vent (m s-2)
97      REAL pcvgt(klon, llm), pcvgq(klon, llm, 2)      REAL d_t(klon, llm), d_qx(klon, llm, nqmx)
98        REAL d_ps(klon)
     REAL pvervel(klon, llm)  
99    
100      REAL zdufi(klon, llm), zdvfi(klon, llm)      REAL z1(iim)
     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)  
101      REAL pksurcp(iim + 1, jjm + 1)      REAL pksurcp(iim + 1, jjm + 1)
102    
     ! 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  
   
103      !-----------------------------------------------------------------------      !-----------------------------------------------------------------------
104    
105      !!print *, "Call sequence information: calfis"      !!print *, "Call sequence information: calfis"
106    
107      !    1. Initialisations :      ! 1. Initialisations :
108      !   latitude, longitude et aires des mailles pour la physique:      ! latitude, longitude et aires des mailles pour la physique:
109    
110      !   40. transformation des variables dynamiques en variables physiques:      ! 40. transformation des variables dynamiques en variables physiques:
111      !   41. pressions au sol (en Pascals)      ! 41. pressions au sol (en Pascals)
112    
113      zpsrf(1) = pps(1, 1)      zpsrf(1) = ps(1, 1)
114    
115      ig0  = 2      ig0 = 2
116      DO j = 2, jjm      DO j = 2, jjm
117         CALL SCOPY(iim, pps(1, j), 1, zpsrf(ig0), 1)         CALL SCOPY(iim, ps(1, j), 1, zpsrf(ig0), 1)
118         ig0 = ig0+iim         ig0 = ig0+iim
119      ENDDO      ENDDO
120    
121      zpsrf(klon) = pps(1, jjm + 1)      zpsrf(klon) = ps(1, jjm + 1)
122    
123      !   42. pression intercouches :      ! 42. pression intercouches :
124    
125      !     .... zplev  definis aux (llm +1) interfaces des couches  ....      ! paprs defini aux (llm +1) interfaces des couches
126      !     .... zplay  definis aux (llm)    milieux des couches  ....      ! play defini aux (llm) milieux des couches  
127    
128      !    ...    Exner = cp * (p(l) / preff) ** kappa     ....      ! Exner = cp * (p(l) / preff) ** kappa
129    
130      forall (l = 1: llm+1) zplev(:, l) = pack(p3d(:, :, l), dyn_phy)      forall (l = 1: llm+1) paprs(:, l) = pack(p3d(:, :, l), dyn_phy)
131    
132      !   43. temperature naturelle (en K) et pressions milieux couches .      ! 43. temperature naturelle (en K) et pressions milieux couches
133      DO l=1, llm      DO l=1, llm
134         pksurcp     =  ppk(:, :, l) / cpp         pksurcp = pk(:, :, l) / cpp
135         pls(:, :, l) = preff * pksurcp**(1./ kappa)         pls(:, :, l) = preff * pksurcp**(1./ kappa)
136         zplay(:, l) = pack(pls(:, :, l), dyn_phy)         play(:, l) = pack(pls(:, :, l), dyn_phy)
137         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)  
138      ENDDO      ENDDO
139    
140      !   43.bis traceurs      ! 43.bis traceurs
   
141      DO iq=1, nqmx      DO iq=1, nqmx
142         iiq=niadv(iq)         iiq=niadv(iq)
143         DO l=1, llm         DO l=1, llm
144            qx(1, l, iq) = q(1, 1, l, iiq)            qx(1, l, iq) = q(1, 1, l, iiq)
145            ig0          = 2            ig0 = 2
146            DO j=2, jjm            DO j=2, jjm
147               DO i = 1, iim               DO i = 1, iim
148                  qx(ig0, l, iq)  = q(i, j, l, iiq)                  qx(ig0, l, iq) = q(i, j, l, iiq)
149                  ig0             = ig0 + 1                  ig0 = ig0 + 1
150               ENDDO               ENDDO
151            ENDDO            ENDDO
152            qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)            qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)
153         ENDDO         ENDDO
154      ENDDO      ENDDO
155    
156      !   convergence dynamique pour les traceurs "EAU"      ! Geopotentiel calcule par rapport a la surface locale:
157        forall (l = 1:llm) pphi(:, l) = pack(phi(:, :, l), dyn_phy)
158      DO iq=1, 2      pphis = pack(phis, dyn_phy)
159         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)  ....  
160    
161        ! Calcul de la vitesse verticale (en Pa*m*s ou Kg/s)
162      DO l=1, llm      DO l=1, llm
163         pvervel(1, l)=pw(1, 1, l) * g /apoln         omega(1, l)=w(1, 1, l) * g /apoln
164         ig0=2         ig0=2
165         DO j=2, jjm         DO j=2, jjm
166            DO i = 1, iim            DO i = 1, iim
167               pvervel(ig0, l) = pw(i, j, l) * g * unsaire_2d(i, j)               omega(ig0, l) = w(i, j, l) * g * unsaire_2d(i, j)
168               ig0 = ig0 + 1               ig0 = ig0 + 1
169            ENDDO            ENDDO
170         ENDDO         ENDDO
171         pvervel(ig0, l)=pw(1, jjm + 1, l) * g /apols         omega(ig0, l)=w(1, jjm + 1, l) * g /apols
172      ENDDO      ENDDO
173    
174      !   45. champ u:      ! 45. champ u:
175    
176      DO  l=1, llm      DO l=1, llm
177           DO j=2, jjm
        DO  j=2, jjm  
178            ig0 = 1+(j-2)*iim            ig0 = 1+(j-2)*iim
179            zufi(ig0+1, l)= 0.5 *  &            u(ig0+1, l)= 0.5 &
180                 (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))  
181            DO i=2, iim            DO i=2, iim
182               zufi(ig0+i, l)= 0.5 * &               u(ig0+i, l)= 0.5 * (ucov(i-1, j, l)/cu_2d(i-1, j) &
183                    (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))  
184            end DO            end DO
185         end DO         end DO
   
186      end DO      end DO
187    
188      !   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  
189    
190      !   47. champs de vents au pôle nord        forall (j = 2: jjm, l = 1: llm) zvfi(:iim, j, l)= 0.5 &
191      !        U = 1 / pi  *  integrale [ v * cos(long) * d long ]           * (vcov(:iim, j-1, l) / cv_2d(:iim, j-1) &
192      !        V = 1 / pi  *  integrale [ v * sin(long) * d long ]           + vcov(:iim, j, l) / cv_2d(:iim, j))
193        zvfi(iim + 1, 2:jjm, :) = zvfi(1, 2:jjm, :)
194    
195        ! 47. champs de vents au pôle nord
196        ! U = 1 / pi * integrale [ v * cos(long) * d long ]
197        ! V = 1 / pi * integrale [ v * sin(long) * d long ]
198    
199      DO l=1, llm      DO l=1, llm
200           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)  
201         DO i=2, iim         DO i=2, iim
202            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)  
203         ENDDO         ENDDO
204    
205         DO i=1, iim         u(1, l) = SUM(COS(rlonv(:iim)) * z1) / pi
206            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  
   
207      ENDDO      ENDDO
208    
209      !   48. champs de vents au pôle sud:      ! 48. champs de vents au pôle sud:
210      !        U = 1 / pi  *  integrale [ v * cos(long) * d long ]      ! U = 1 / pi * integrale [ v * cos(long) * d long ]
211      !        V = 1 / pi  *  integrale [ v * sin(long) * d long ]      ! V = 1 / pi * integrale [ v * sin(long) * d long ]
212    
213      DO l=1, llm      DO l=1, llm
214           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) &  
215              /cv_2d(1, jjm)              /cv_2d(1, jjm)
216         DO i=2, iim         DO i=2, iim
217            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)  
218         ENDDO         ENDDO
219    
220         DO i=1, iim         u(klon, l) = SUM(COS(rlonv(:iim)) * z1) / pi
221            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  
   
222      ENDDO      ENDDO
223    
224      !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)  
225    
226      !   Appel de la physique:      ! Appel de la physique :
227        CALL physiq(lafin, rdayvrai, time, dtphys, paprs, play, pphi, pphis, u, &
228             v, t, qx, omega, d_u, d_v, d_t, d_qx, d_ps, dudyn)
229    
230      CALL physiq(firstcal, lafin, rdayvrai, heure, dtphys, zplev, zplay, zphi, &      ! transformation des tendances physiques en tendances dynamiques:
          zphis, zufi, zvfi, ztfi, qx, pvervel, zdufi, zdvfi, zdtfi, zdqfi, &  
          zdpsrf, pducov, PVteta) ! IM diagnostique PVteta, Amip2  
231    
232      !   transformation des tendances physiques en tendances dynamiques:      ! tendance sur la pression :
233    
234      !  tendance sur la pression :      dpfi = gr_fi_dyn(d_ps)
235    
236      pdpsfi = gr_fi_dyn(zdpsrf)      ! 62. enthalpie potentielle
237        do l=1, llm
238           dtetafi(:, :, l) = cpp * gr_fi_dyn(d_t(:, l)) / pk(:, :, l)
239        end do
240    
241      !   62. enthalpie potentielle      ! 62. humidite specifique
   
     DO l=1, llm  
   
        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  
242    
243      DO iq=1, nqmx      DO iq=1, nqmx
244         DO l=1, llm         DO l=1, llm
245            DO i=1, iim + 1            DO i=1, iim + 1
246               pdqfi(i, 1, l, iq)    = zdqfi(1, l, iq)               dqfi(i, 1, l, iq) = d_qx(1, l, iq)
247               pdqfi(i, jjm + 1, l, iq) = zdqfi(klon, l, iq)               dqfi(i, jjm + 1, l, iq) = d_qx(klon, l, iq)
248            ENDDO            ENDDO
249            DO j=2, jjm            DO j=2, jjm
250               ig0=1+(j-2)*iim               ig0=1+(j-2)*iim
251               DO i=1, iim               DO i=1, iim
252                  pdqfi(i, j, l, iq) = zdqfi(ig0+i, l, iq)                  dqfi(i, j, l, iq) = d_qx(ig0+i, l, iq)
253               ENDDO               ENDDO
254               pdqfi(iim + 1, j, l, iq) = pdqfi(1, j, l, iq)               dqfi(iim + 1, j, l, iq) = dqfi(1, j, l, iq)
255            ENDDO            ENDDO
256         ENDDO         ENDDO
257      ENDDO      ENDDO
258    
259      !   63. traceurs      ! 63. traceurs
260    
261      !     initialisation des tendances      ! initialisation des tendances
262      pdqfi=0.      dqfi=0.
263    
264      DO iq=1, nqmx      DO iq=1, nqmx
265         iiq=niadv(iq)         iiq=niadv(iq)
266         DO l=1, llm         DO l=1, llm
267            DO i=1, iim + 1            DO i=1, iim + 1
268               pdqfi(i, 1, l, iiq)    = zdqfi(1, l, iq)               dqfi(i, 1, l, iiq) = d_qx(1, l, iq)
269               pdqfi(i, jjm + 1, l, iiq) = zdqfi(klon, l, iq)               dqfi(i, jjm + 1, l, iiq) = d_qx(klon, l, iq)
270            ENDDO            ENDDO
271            DO j=2, jjm            DO j=2, jjm
272               ig0=1+(j-2)*iim               ig0=1+(j-2)*iim
273               DO i=1, iim               DO i=1, iim
274                  pdqfi(i, j, l, iiq) = zdqfi(ig0+i, l, iq)                  dqfi(i, j, l, iiq) = d_qx(ig0+i, l, iq)
275               ENDDO               ENDDO
276               pdqfi(iim + 1, j, l, iiq) = pdqfi(1, j, l, iq)               dqfi(iim + 1, j, l, iiq) = dqfi(1, j, l, iq)
277            ENDDO            ENDDO
278         ENDDO         ENDDO
279      ENDDO      ENDDO
280    
281      !   65. champ u:      ! 65. champ u:
282    
283      DO l=1, llm      DO l=1, llm
   
284         DO i=1, iim + 1         DO i=1, iim + 1
285            pdufi(i, 1, l)    = 0.            dufi(i, 1, l) = 0.
286            pdufi(i, jjm + 1, l) = 0.            dufi(i, jjm + 1, l) = 0.
287         ENDDO         ENDDO
288    
289         DO j=2, jjm         DO j=2, jjm
290            ig0=1+(j-2)*iim            ig0=1+(j-2)*iim
291            DO i=1, iim-1            DO i=1, iim-1
292               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)  
293            ENDDO            ENDDO
294            pdufi(iim, j, l)= &            dufi(iim, j, l)= 0.5*(d_u(ig0+1, l)+d_u(ig0+iim, l))*cu_2d(iim, j)
295                 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)  
296         ENDDO         ENDDO
   
297      ENDDO      ENDDO
298    
299      !   67. champ v:      ! 67. champ v:
300    
301      DO l=1, llm      DO l=1, llm
   
302         DO j=2, jjm-1         DO j=2, jjm-1
303            ig0=1+(j-2)*iim            ig0=1+(j-2)*iim
304            DO i=1, iim            DO i=1, iim
305               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)  
306            ENDDO            ENDDO
307            pdvfi(iim + 1, j, l) = pdvfi(1, j, l)            dvfi(iim + 1, j, l) = dvfi(1, j, l)
308         ENDDO         ENDDO
309      ENDDO      ENDDO
310    
311      !   68. champ v pres des poles:      ! 68. champ v près des pôles:
312      !      v = U * cos(long) + V * SIN(long)      ! v = U * cos(long) + V * SIN(long)
313    
314      DO l=1, llm      DO l=1, llm
   
315         DO i=1, iim         DO i=1, iim
316            pdvfi(i, 1, l)= &            dvfi(i, 1, l)= d_u(1, l)*COS(rlonv(i))+d_v(1, l)*SIN(rlonv(i))
317                 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))
318            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)
319                 +zdvfi(klon, l)*SIN(rlonv(i))            dvfi(i, jjm, l)= 0.5 &
320            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)  
321         ENDDO         ENDDO
322    
323         pdvfi(iim + 1, 1, l)  = pdvfi(1, 1, l)         dvfi(iim + 1, 1, l) = dvfi(1, 1, l)
324         pdvfi(iim + 1, jjm, l)= pdvfi(1, jjm, l)         dvfi(iim + 1, jjm, l)= dvfi(1, jjm, l)
   
325      ENDDO      ENDDO
326    
     firstcal = .FALSE.  
   
327    END SUBROUTINE calfis    END SUBROUTINE calfis
328    
329  end module calfis_m  end module calfis_m

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

  ViewVC Help
Powered by ViewVC 1.1.21