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

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

  ViewVC Help
Powered by ViewVC 1.1.21