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

Diff of /trunk/Sources/dyn3d/calfis.f

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

revision 34 by guez, Wed Jun 2 11:01:12 2010 UTC revision 71 by guez, Mon Jul 8 18:12:18 2013 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, dv, 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 dv(iim + 1, jjm, llm)
73        REAL, intent(in):: w(iim + 1, jjm + 1, llm)
74      REAL pw(iim + 1, jjm + 1, llm)  
75        REAL, intent(out):: dufi(iim + 1, jjm + 1, llm)
76      REAL pps(iim + 1, jjm + 1)      ! tendency for the covariant zonal velocity (m2 s-2)
77      REAL, intent(in):: ppk(iim + 1, jjm + 1, llm)  
78        REAL dvfi(iim + 1, jjm, llm)
79      REAL pdvfi(iim + 1, jjm, llm)      REAL, intent(out):: dtetafi(iim + 1, jjm + 1, llm)
80      REAL pdufi(iim + 1, jjm + 1, llm)      REAL dqfi(iim + 1, jjm + 1, llm, nqmx)
81      REAL pdhfi(iim + 1, jjm + 1, llm)      REAL dpfi(iim + 1, jjm + 1)
82      REAL pdqfi(iim + 1, jjm + 1, llm, nqmx)      LOGICAL, intent(in):: lafin
     REAL pdpsfi(iim + 1, jjm + 1)  
   
     INTEGER, PARAMETER:: longcles = 20  
83    
84      !    Local variables :      ! Local variables :
85    
86      INTEGER i, j, l, ig0, ig, iq, iiq      INTEGER i, j, l, ig0, ig, iq, iiq
87      REAL zpsrf(klon)      REAL zpsrf(klon)
88      REAL zplev(klon, llm+1), zplay(klon, llm)      REAL paprs(klon, llm+1), play(klon, llm)
89      REAL zphi(klon, llm), zphis(klon)      REAL pphi(klon, llm), pphis(klon)
90    
91      REAL zufi(klon, llm), zvfi(klon, llm)      REAL u(klon, llm), v(klon, llm)
92      REAL ztfi(klon, llm) ! temperature      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)
     REAL pvervel(klon, llm)  
100    
101      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)  
102      REAL pksurcp(iim + 1, jjm + 1)      REAL pksurcp(iim + 1, jjm + 1)
103    
104      ! I. Musat: diagnostic PVteta, Amip2      ! I. Musat: diagnostic PVteta, Amip2
# Line 125  contains Line 106  contains
106      REAL:: rtetaSTD(ntetaSTD) = (/350., 380., 405./)      REAL:: rtetaSTD(ntetaSTD) = (/350., 380., 405./)
107      REAL PVteta(klon, ntetaSTD)      REAL PVteta(klon, ntetaSTD)
108    
     REAL SSUM  
   
     LOGICAL:: firstcal = .true.  
     REAL, intent(in):: rdayvrai  
   
109      !-----------------------------------------------------------------------      !-----------------------------------------------------------------------
110    
111      !!print *, "Call sequence information: calfis"      !!print *, "Call sequence information: calfis"
112    
113      !    1. Initialisations :      ! 1. Initialisations :
114      !   latitude, longitude et aires des mailles pour la physique:      ! latitude, longitude et aires des mailles pour la physique:
115    
116      !   40. transformation des variables dynamiques en variables physiques:      ! 40. transformation des variables dynamiques en variables physiques:
117      !   41. pressions au sol (en Pascals)      ! 41. pressions au sol (en Pascals)
118    
119      zpsrf(1) = pps(1, 1)      zpsrf(1) = ps(1, 1)
120    
121      ig0  = 2      ig0 = 2
122      DO j = 2, jjm      DO j = 2, jjm
123         CALL SCOPY(iim, pps(1, j), 1, zpsrf(ig0), 1)         CALL SCOPY(iim, ps(1, j), 1, zpsrf(ig0), 1)
124         ig0 = ig0+iim         ig0 = ig0+iim
125      ENDDO      ENDDO
126    
127      zpsrf(klon) = pps(1, jjm + 1)      zpsrf(klon) = ps(1, jjm + 1)
128    
129      !   42. pression intercouches :      ! 42. pression intercouches :
130    
131      !     .... zplev  definis aux (llm +1) interfaces des couches  ....      ! paprs defini aux (llm +1) interfaces des couches
132      !     .... zplay  definis aux (llm)    milieux des couches  ....      ! play defini aux (llm) milieux des couches  
133    
134      !    ...    Exner = cp * (p(l) / preff) ** kappa     ....      ! Exner = cp * (p(l) / preff) ** kappa
135    
136      forall (l = 1: llm+1) zplev(:, l) = pack(p3d(:, :, l), dyn_phy)      forall (l = 1: llm+1) paprs(:, l) = pack(p3d(:, :, l), dyn_phy)
137    
138      !   43. temperature naturelle (en K) et pressions milieux couches .      ! 43. temperature naturelle (en K) et pressions milieux couches
139      DO l=1, llm      DO l=1, llm
140         pksurcp     =  ppk(:, :, l) / cpp         pksurcp = pk(:, :, l) / cpp
141         pls(:, :, l) = preff * pksurcp**(1./ kappa)         pls(:, :, l) = preff * pksurcp**(1./ kappa)
142         zplay(:, l) = pack(pls(:, :, l), dyn_phy)         play(:, l) = pack(pls(:, :, l), dyn_phy)
143         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)  
144      ENDDO      ENDDO
145    
146      !   43.bis traceurs      ! 43.bis traceurs
   
147      DO iq=1, nqmx      DO iq=1, nqmx
148         iiq=niadv(iq)         iiq=niadv(iq)
149         DO l=1, llm         DO l=1, llm
150            qx(1, l, iq) = q(1, 1, l, iiq)            qx(1, l, iq) = q(1, 1, l, iiq)
151            ig0          = 2            ig0 = 2
152            DO j=2, jjm            DO j=2, jjm
153               DO i = 1, iim               DO i = 1, iim
154                  qx(ig0, l, iq)  = q(i, j, l, iiq)                  qx(ig0, l, iq) = q(i, j, l, iiq)
155                  ig0             = ig0 + 1                  ig0 = ig0 + 1
156               ENDDO               ENDDO
157            ENDDO            ENDDO
158            qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)            qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)
159         ENDDO         ENDDO
160      ENDDO      ENDDO
161    
162      !   convergence dynamique pour les traceurs "EAU"      ! Geopotentiel calcule par rapport a la surface locale:
163        forall (l = 1:llm) pphi(:, l) = pack(phi(:, :, l), dyn_phy)
164      DO iq=1, 2      pphis = pack(phis, dyn_phy)
165         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)  ....  
166    
167        ! Calcul de la vitesse verticale (en Pa*m*s ou Kg/s)
168      DO l=1, llm      DO l=1, llm
169         pvervel(1, l)=pw(1, 1, l) * g /apoln         omega(1, l)=w(1, 1, l) * g /apoln
170         ig0=2         ig0=2
171         DO j=2, jjm         DO j=2, jjm
172            DO i = 1, iim            DO i = 1, iim
173               pvervel(ig0, l) = pw(i, j, l) * g * unsaire_2d(i, j)               omega(ig0, l) = w(i, j, l) * g * unsaire_2d(i, j)
174               ig0 = ig0 + 1               ig0 = ig0 + 1
175            ENDDO            ENDDO
176         ENDDO         ENDDO
177         pvervel(ig0, l)=pw(1, jjm + 1, l) * g /apols         omega(ig0, l)=w(1, jjm + 1, l) * g /apols
178      ENDDO      ENDDO
179    
180      !   45. champ u:      ! 45. champ u:
   
     DO  l=1, llm  
181    
182         DO  j=2, jjm      DO l=1, llm
183           DO j=2, jjm
184            ig0 = 1+(j-2)*iim            ig0 = 1+(j-2)*iim
185            zufi(ig0+1, l)= 0.5 *  &            u(ig0+1, l)= 0.5 &
186                 (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))  
187            DO i=2, iim            DO i=2, iim
188               zufi(ig0+i, l)= 0.5 * &               u(ig0+i, l)= 0.5 * (ucov(i-1, j, l)/cu_2d(i-1, j) &
189                    (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))  
190            end DO            end DO
191         end DO         end DO
   
192      end DO      end DO
193    
194      !   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  
195    
196      !   47. champs de vents au pôle nord        forall (j = 2: jjm, l = 1: llm) zvfi(:iim, j, l)= 0.5 &
197      !        U = 1 / pi  *  integrale [ v * cos(long) * d long ]           * (vcov(:iim, j-1, l) / cv_2d(:iim, j-1) &
198      !        V = 1 / pi  *  integrale [ v * sin(long) * d long ]           + vcov(:iim, j, l) / cv_2d(:iim, j))
199        zvfi(iim + 1, 2:jjm, :) = zvfi(1, 2:jjm, :)
200    
201        ! 47. champs de vents au pôle nord
202        ! U = 1 / pi * integrale [ v * cos(long) * d long ]
203        ! V = 1 / pi * integrale [ v * sin(long) * d long ]
204    
205      DO l=1, llm      DO l=1, llm
206           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)  
207         DO i=2, iim         DO i=2, iim
208            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)  
        ENDDO  
   
        DO i=1, iim  
           zcos(i)   = COS(rlonv(i))*z1(i)  
           zcosbis(i)= COS(rlonv(i))*z1bis(i)  
           zsin(i)   = SIN(rlonv(i))*z1(i)  
           zsinbis(i)= SIN(rlonv(i))*z1bis(i)  
209         ENDDO         ENDDO
210    
211         zufi(1, l)  = SSUM(iim, zcos, 1)/pi         u(1, l) = SUM(COS(rlonv(:iim)) * z1) / pi
212         pcvgu(1, l) = SSUM(iim, zcosbis, 1)/pi         zvfi(:, 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
        zvfi(1, l)  = SSUM(iim, zsin, 1)/pi  
        pcvgv(1, l) = SSUM(iim, zsinbis, 1)/pi  
   
213      ENDDO      ENDDO
214    
215      !   48. champs de vents au pôle sud:      ! 48. champs de vents au pôle sud:
216      !        U = 1 / pi  *  integrale [ v * cos(long) * d long ]      ! U = 1 / pi * integrale [ v * cos(long) * d long ]
217      !        V = 1 / pi  *  integrale [ v * sin(long) * d long ]      ! V = 1 / pi * integrale [ v * sin(long) * d long ]
218    
219      DO l=1, llm      DO l=1, llm
220           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) &  
221              /cv_2d(1, jjm)              /cv_2d(1, jjm)
222         DO i=2, iim         DO i=2, iim
223            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)  
224         ENDDO         ENDDO
225    
226         DO i=1, iim         u(klon, l) = SUM(COS(rlonv(:iim)) * z1) / pi
227            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  
   
228      ENDDO      ENDDO
229    
230      !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:  
   
     CALL physiq(firstcal, lafin, rdayvrai, heure, dtphys, zplev, zplay, zphi, &  
          zphis, zufi, zvfi, ztfi, qx, pvervel, zdufi, zdvfi, zdtfi, zdqfi, &  
          zdpsrf, pducov, PVteta) ! IM diagnostique PVteta, Amip2  
   
     !   transformation des tendances physiques en tendances dynamiques:  
231    
232      !  tendance sur la pression :      !IM calcul PV a teta=350, 380, 405K
233        CALL PVtheta(klon, llm, ucov, vcov, teta, t, play, paprs, ntetaSTD, &
234      pdpsfi = gr_fi_dyn(zdpsrf)           rtetaSTD, PVteta)
235    
236      !   62. enthalpie potentielle      ! Appel de la physique :
237        CALL physiq(lafin, rdayvrai, time, dtphys, paprs, play, pphi, pphis, u, &
238             v, t, qx, omega, d_u, d_v, d_t, d_qx, d_ps, dudyn, PVteta)
239    
240      DO l=1, llm      ! transformation des tendances physiques en tendances dynamiques:
241    
242         DO i=1, iim + 1      ! tendance sur la pression :
           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  
243    
244         DO j=2, jjm      dpfi = gr_fi_dyn(d_ps)
           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  
245    
246      ENDDO      ! 62. enthalpie potentielle
247        do l=1, llm
248           dtetafi(:, :, l) = cpp * gr_fi_dyn(d_t(:, l)) / pk(:, :, l)
249        end do
250    
251      !   62. humidite specifique      ! 62. humidite specifique
252    
253      DO iq=1, nqmx      DO iq=1, nqmx
254         DO l=1, llm         DO l=1, llm
255            DO i=1, iim + 1            DO i=1, iim + 1
256               pdqfi(i, 1, l, iq)    = zdqfi(1, l, iq)               dqfi(i, 1, l, iq) = d_qx(1, l, iq)
257               pdqfi(i, jjm + 1, l, iq) = zdqfi(klon, l, iq)               dqfi(i, jjm + 1, l, iq) = d_qx(klon, l, iq)
258            ENDDO            ENDDO
259            DO j=2, jjm            DO j=2, jjm
260               ig0=1+(j-2)*iim               ig0=1+(j-2)*iim
261               DO i=1, iim               DO i=1, iim
262                  pdqfi(i, j, l, iq) = zdqfi(ig0+i, l, iq)                  dqfi(i, j, l, iq) = d_qx(ig0+i, l, iq)
263               ENDDO               ENDDO
264               pdqfi(iim + 1, j, l, iq) = pdqfi(1, j, l, iq)               dqfi(iim + 1, j, l, iq) = dqfi(1, j, l, iq)
265            ENDDO            ENDDO
266         ENDDO         ENDDO
267      ENDDO      ENDDO
268    
269      !   63. traceurs      ! 63. traceurs
270    
271      !     initialisation des tendances      ! initialisation des tendances
272      pdqfi=0.      dqfi=0.
273    
274      DO iq=1, nqmx      DO iq=1, nqmx
275         iiq=niadv(iq)         iiq=niadv(iq)
276         DO l=1, llm         DO l=1, llm
277            DO i=1, iim + 1            DO i=1, iim + 1
278               pdqfi(i, 1, l, iiq)    = zdqfi(1, l, iq)               dqfi(i, 1, l, iiq) = d_qx(1, l, iq)
279               pdqfi(i, jjm + 1, l, iiq) = zdqfi(klon, l, iq)               dqfi(i, jjm + 1, l, iiq) = d_qx(klon, l, iq)
280            ENDDO            ENDDO
281            DO j=2, jjm            DO j=2, jjm
282               ig0=1+(j-2)*iim               ig0=1+(j-2)*iim
283               DO i=1, iim               DO i=1, iim
284                  pdqfi(i, j, l, iiq) = zdqfi(ig0+i, l, iq)                  dqfi(i, j, l, iiq) = d_qx(ig0+i, l, iq)
285               ENDDO               ENDDO
286               pdqfi(iim + 1, j, l, iiq) = pdqfi(1, j, l, iq)               dqfi(iim + 1, j, l, iiq) = dqfi(1, j, l, iq)
287            ENDDO            ENDDO
288         ENDDO         ENDDO
289      ENDDO      ENDDO
290    
291      !   65. champ u:      ! 65. champ u:
292    
293      DO l=1, llm      DO l=1, llm
   
294         DO i=1, iim + 1         DO i=1, iim + 1
295            pdufi(i, 1, l)    = 0.            dufi(i, 1, l) = 0.
296            pdufi(i, jjm + 1, l) = 0.            dufi(i, jjm + 1, l) = 0.
297         ENDDO         ENDDO
298    
299         DO j=2, jjm         DO j=2, jjm
300            ig0=1+(j-2)*iim            ig0=1+(j-2)*iim
301            DO i=1, iim-1            DO i=1, iim-1
302               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)  
303            ENDDO            ENDDO
304            pdufi(iim, j, l)= &            dufi(iim, j, l)= 0.5*(d_u(ig0+1, l)+d_u(ig0+iim, l))*cu_2d(iim, j)
305                 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)  
306         ENDDO         ENDDO
   
307      ENDDO      ENDDO
308    
309      !   67. champ v:      ! 67. champ v:
310    
311      DO l=1, llm      DO l=1, llm
   
312         DO j=2, jjm-1         DO j=2, jjm-1
313            ig0=1+(j-2)*iim            ig0=1+(j-2)*iim
314            DO i=1, iim            DO i=1, iim
315               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)  
316            ENDDO            ENDDO
317            pdvfi(iim + 1, j, l) = pdvfi(1, j, l)            dvfi(iim + 1, j, l) = dvfi(1, j, l)
318         ENDDO         ENDDO
319      ENDDO      ENDDO
320    
321      !   68. champ v pres des poles:      ! 68. champ v près des pôles:
322      !      v = U * cos(long) + V * SIN(long)      ! v = U * cos(long) + V * SIN(long)
323    
324      DO l=1, llm      DO l=1, llm
   
325         DO i=1, iim         DO i=1, iim
326            pdvfi(i, 1, l)= &            dvfi(i, 1, l)= d_u(1, l)*COS(rlonv(i))+d_v(1, l)*SIN(rlonv(i))
327                 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))
328            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)
329                 +zdvfi(klon, l)*SIN(rlonv(i))            dvfi(i, jjm, l)= 0.5 &
330            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)  
331         ENDDO         ENDDO
332    
333         pdvfi(iim + 1, 1, l)  = pdvfi(1, 1, l)         dvfi(iim + 1, 1, l) = dvfi(1, 1, l)
334         pdvfi(iim + 1, jjm, l)= pdvfi(1, jjm, l)         dvfi(iim + 1, jjm, l)= dvfi(1, jjm, l)
   
335      ENDDO      ENDDO
336    
     firstcal = .FALSE.  
   
337    END SUBROUTINE calfis    END SUBROUTINE calfis
338    
339  end module calfis_m  end module calfis_m

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

  ViewVC Help
Powered by ViewVC 1.1.21