/[lmdze]/trunk/libf/dyn3d/calfis.f90
ViewVC logotype

Diff of /trunk/libf/dyn3d/calfis.f90

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

revision 10 by guez, Fri Apr 18 14:45:53 2008 UTC revision 44 by guez, Wed Apr 13 12:29:18 2011 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(nq, lafin, rdayvrai, heure, pucov, pvcov, pteta, pq, &    SUBROUTINE calfis(rdayvrai, heure, pucov, pvcov, teta, q, pmasse, pps, &
8         pmasse, pps, ppk, pphis, pphi, pducov, pdvcov, pdteta, pdq, pw, &         ppk, pphis, pphi, pducov, pdvcov, pdq, pw, pdufi, pdvfi, pdhfi, pdqfi, &
9         clesphy0, pdufi, pdvfi, pdhfi, pdqfi, pdpsfi)         pdpsfi, lafin)
10    
11      ! From dyn3d/calfis.F,v 1.3 2005/05/25 13:10:09      ! From dyn3d/calfis.F, version 1.3 2005/05/25 13:10:09
12        ! Authors: P. Le Van, F. Hourdin
13      ! Auteurs : P. Le Van, F. Hourdin  
14        ! 1. Réarrangement des tableaux et transformation variables
15      !   1. rearrangement des tableaux et transformation      ! dynamiques en variables physiques
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.
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
27      !      pour la dynamique on prend    T * (preff / p(l)) **kappa  
28      !    - les deux seules variables dependant de la geometrie necessaires      ! - Les deux seules variables dépendant de la géométrie
29      !      pour la physique sont la latitude pour le rayonnement et      ! nécessaires pour la physique sont la latitude pour le
30      !      l'aire de la maille quand on veut integrer une grandeur      ! rayonnement et l'aire de la maille quand on veut intégrer une
31      !      horizontalement.      ! grandeur horizontalement.
32    
33      !     Input :      ! Input :
34      !     -------      ! pucov covariant zonal velocity
35      !       pucov           covariant zonal velocity      ! pvcov covariant meridional velocity
36      !       pvcov           covariant meridional velocity      ! teta potential temperature
37      !       pteta           potential temperature      ! pps surface pressure
38      !       pps             surface pressure      ! pmasse masse d'air dans chaque maille
39      !       pmasse          masse d'air dans chaque maille      ! pts surface temperature (K)
40      !       pts             surface temperature  (K)      ! callrad clef d'appel au rayonnement
41      !       callrad         clef d'appel au rayonnement  
42        ! Output :
43      !    Output :      ! pdufi tendency for the natural zonal velocity (ms-1)
44      !    --------      ! pdvfi tendency for the natural meridional velocity
45      !        pdufi          tendency for the natural zonal velocity (ms-1)      ! pdhfi tendency for the potential temperature
46      !        pdvfi          tendency for the natural meridional velocity      ! pdtsfi tendency for the surface temperature
     !        pdhfi          tendency for the potential temperature  
     !        pdtsfi         tendency for the surface temperature  
47    
48      !        pdtrad         radiative tendencies  \  both input      ! pdtrad radiative tendencies \ input and output
49      !        pfluxrad       radiative fluxes      /  and output      ! pfluxrad radiative fluxes / input and output
50    
51        use comconst, only: kappa, cpp, dtphys, g
52        use comvert, only: preff
53        use comgeom, only: apoln, cu_2d, cv_2d, unsaire_2d, apols, rlonu, rlonv
54      use dimens_m, only: iim, jjm, llm, nqmx      use dimens_m, only: iim, jjm, llm, nqmx
55      use dimphy, only: klon      use dimphy, only: klon
     use comconst, only: kappa, cpp, dtphys, g, pi  
     use comvert, only: preff, presnivs  
     use comgeom, only: apoln, cu_2d, cv_2d, unsaire_2d, apols, rlonu, rlonv  
     use advtrac_m, only: niadv  
56      use grid_change, only: dyn_phy, gr_fi_dyn      use grid_change, only: dyn_phy, gr_fi_dyn
57        use iniadvtrac_m, only: niadv
58        use nr_util, only: pi
59      use physiq_m, only: physiq      use physiq_m, only: physiq
60      use pressure_var, only: p3d, pls      use pressure_var, only: p3d, pls
61    
62      !    0.  Declarations :      ! Arguments :
   
     INTEGER nq  
   
     !    Arguments :  
63    
64      LOGICAL, intent(in):: lafin      LOGICAL, intent(in):: lafin
65      REAL, intent(in):: heure ! heure de la journée en fraction de jour      REAL, intent(in):: heure ! heure de la journée en fraction de jour
66    
67      REAL pvcov(iim + 1,jjm,llm)      REAL pvcov(iim + 1, jjm, llm)
68      REAL pucov(iim + 1,jjm + 1,llm)      REAL pucov(iim + 1, jjm + 1, llm)
69      REAL pteta(iim + 1,jjm + 1,llm)      REAL, intent(in):: teta(iim + 1, jjm + 1, llm)
70      REAL pmasse(iim + 1,jjm + 1,llm)      REAL pmasse(iim + 1, jjm + 1, llm)
71    
72      REAL, intent(in):: pq(iim + 1,jjm + 1,llm,nqmx)      REAL, intent(in):: q(iim + 1, jjm + 1, llm, nqmx)
73      ! (mass fractions of advected fields)      ! (mass fractions of advected fields)
74    
75      REAL pphis(iim + 1,jjm + 1)      REAL pphis(iim + 1, jjm + 1)
76      REAL pphi(iim + 1,jjm + 1,llm)      REAL pphi(iim + 1, jjm + 1, llm)
77    
78      REAL pdvcov(iim + 1,jjm,llm)      REAL pdvcov(iim + 1, jjm, llm)
79      REAL pducov(iim + 1,jjm + 1,llm)      REAL pducov(iim + 1, jjm + 1, llm)
80      REAL pdteta(iim + 1,jjm + 1,llm)      REAL pdq(iim + 1, jjm + 1, llm, nqmx)
     REAL pdq(iim + 1,jjm + 1,llm,nqmx)  
81    
82      REAL pw(iim + 1,jjm + 1,llm)      REAL, intent(in):: pw(iim + 1, jjm + 1, llm)
83    
84      REAL pps(iim + 1,jjm + 1)      REAL pps(iim + 1, jjm + 1)
85      REAL, intent(in):: ppk(iim + 1,jjm + 1,llm)      REAL, intent(in):: ppk(iim + 1, jjm + 1, llm)
86    
87      REAL pdvfi(iim + 1,jjm,llm)      REAL pdvfi(iim + 1, jjm, llm)
88      REAL pdufi(iim + 1,jjm + 1,llm)      REAL pdufi(iim + 1, jjm + 1, llm)
89      REAL pdhfi(iim + 1,jjm + 1,llm)      REAL, intent(out):: pdhfi(iim + 1, jjm + 1, llm)
90      REAL pdqfi(iim + 1,jjm + 1,llm,nqmx)      REAL pdqfi(iim + 1, jjm + 1, llm, nqmx)
91      REAL pdpsfi(iim + 1,jjm + 1)      REAL pdpsfi(iim + 1, jjm + 1)
92    
93      INTEGER, PARAMETER:: longcles = 20      ! Local variables :
     REAL clesphy0(longcles)  
94    
95      !    Local variables :      INTEGER i, j, l, ig0, ig, iq, iiq
   
     INTEGER i,j,l,ig0,ig,iq,iiq  
96      REAL zpsrf(klon)      REAL zpsrf(klon)
97      REAL zplev(klon,llm+1),zplay(klon,llm)      REAL zplev(klon, llm+1), zplay(klon, llm)
98      REAL zphi(klon,llm),zphis(klon)      REAL zphi(klon, llm), zphis(klon)
   
     REAL zufi(klon,llm), zvfi(klon,llm)  
     REAL ztfi(klon,llm) ! temperature  
     real zqfi(klon,llm,nqmx) ! mass fractions of advected fields  
   
     REAL pcvgu(klon,llm), pcvgv(klon,llm)  
     REAL pcvgt(klon,llm), pcvgq(klon,llm,2)  
99    
100      REAL pvervel(klon,llm)      REAL zufi(klon, llm), v(klon, llm)
101        real zvfi(iim + 1, jjm + 1, llm)
102        REAL ztfi(klon, llm) ! temperature
103        real qx(klon, llm, nqmx) ! mass fractions of advected fields
104        REAL pvervel(klon, llm)
105    
106      REAL zdufi(klon,llm),zdvfi(klon,llm)      REAL zdufi(klon, llm), zdvfi(klon, llm)
107      REAL zdtfi(klon,llm),zdqfi(klon,llm,nqmx)      REAL zdtfi(klon, llm), zdqfi(klon, llm, nqmx)
108      REAL zdpsrf(klon)      REAL zdpsrf(klon)
109    
110      REAL zsin(iim),zcos(iim),z1(iim)      REAL z1(iim)
111      REAL zsinbis(iim),zcosbis(iim),z1bis(iim)      REAL pksurcp(iim + 1, jjm + 1)
     REAL pksurcp(iim + 1,jjm + 1)  
112    
113      ! I. Musat: diagnostic PVteta, Amip2      ! I. Musat: diagnostic PVteta, Amip2
114      INTEGER, PARAMETER:: ntetaSTD=3      INTEGER, PARAMETER:: ntetaSTD=3
115      REAL:: rtetaSTD(ntetaSTD) = (/350., 380., 405./)      REAL:: rtetaSTD(ntetaSTD) = (/350., 380., 405./)
116      REAL PVteta(klon,ntetaSTD)      REAL PVteta(klon, ntetaSTD)
117    
     REAL SSUM  
   
     LOGICAL:: firstcal = .true.  
118      REAL, intent(in):: rdayvrai      REAL, intent(in):: rdayvrai
119    
120      !-----------------------------------------------------------------------      !-----------------------------------------------------------------------
121    
122      !!print *, "Call sequence information: calfis"      !!print *, "Call sequence information: calfis"
123    
124      !    1. Initialisations :      ! 1. Initialisations :
125      !   latitude, longitude et aires des mailles pour la physique:      ! latitude, longitude et aires des mailles pour la physique:
126    
127      !   40. transformation des variables dynamiques en variables physiques:      ! 40. transformation des variables dynamiques en variables physiques:
128      !   41. pressions au sol (en Pascals)      ! 41. pressions au sol (en Pascals)
129    
130      zpsrf(1) = pps(1,1)      zpsrf(1) = pps(1, 1)
131    
132      ig0  = 2      ig0 = 2
133      DO j = 2,jjm      DO j = 2, jjm
134         CALL SCOPY(iim,pps(1,j),1,zpsrf(ig0), 1)         CALL SCOPY(iim, pps(1, j), 1, zpsrf(ig0), 1)
135         ig0 = ig0+iim         ig0 = ig0+iim
136      ENDDO      ENDDO
137    
138      zpsrf(klon) = pps(1,jjm + 1)      zpsrf(klon) = pps(1, jjm + 1)
139    
140      !   42. pression intercouches :      ! 42. pression intercouches :
141    
142      !     .... zplev  definis aux (llm +1) interfaces des couches  ....      ! zplev defini aux (llm +1) interfaces des couches
143      !     .... zplay  definis aux (llm)    milieux des couches  ....      ! zplay defini aux (llm) milieux des couches  
144    
145      !    ...    Exner = cp * (p(l) / preff) ** kappa     ....      ! Exner = cp * (p(l) / preff) ** kappa
146    
147      forall (l = 1: llm+1) zplev(:, l) = pack(p3d(:, :, l), dyn_phy)      forall (l = 1: llm+1) zplev(:, l) = pack(p3d(:, :, l), dyn_phy)
148    
149      !   43. temperature naturelle (en K) et pressions milieux couches .      ! 43. temperature naturelle (en K) et pressions milieux couches
150      DO l=1,llm      DO l=1, llm
151         pksurcp     =  ppk(:, :, l) / cpp         pksurcp = ppk(:, :, l) / cpp
152         pls(:, :, l) = preff * pksurcp**(1./ kappa)         pls(:, :, l) = preff * pksurcp**(1./ kappa)
153         zplay(:, l) = pack(pls(:, :, l), dyn_phy)         zplay(:, l) = pack(pls(:, :, l), dyn_phy)
154         ztfi(:, l) = pack(pteta(:, :, l) * pksurcp, dyn_phy)         ztfi(:, l) = pack(teta(:, :, l) * pksurcp, dyn_phy)
        pcvgt(:, l) = pack(pdteta(:, :, l) * pksurcp / pmasse(:, :, l), dyn_phy)  
155      ENDDO      ENDDO
156    
157      !   43.bis traceurs      ! 43.bis traceurs
158        DO iq=1, nqmx
     DO iq=1,nq  
159         iiq=niadv(iq)         iiq=niadv(iq)
160         DO l=1,llm         DO l=1, llm
161            zqfi(1,l,iq) = pq(1,1,l,iiq)            qx(1, l, iq) = q(1, 1, l, iiq)
162            ig0          = 2            ig0 = 2
163            DO j=2,jjm            DO j=2, jjm
164               DO i = 1, iim               DO i = 1, iim
165                  zqfi(ig0,l,iq)  = pq(i,j,l,iiq)                  qx(ig0, l, iq) = q(i, j, l, iiq)
166                  ig0             = ig0 + 1                  ig0 = ig0 + 1
167               ENDDO               ENDDO
168            ENDDO            ENDDO
169            zqfi(ig0,l,iq) = pq(1,jjm + 1,l,iiq)            qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)
170         ENDDO         ENDDO
171      ENDDO      ENDDO
172    
173      !   convergence dynamique pour les traceurs "EAU"      ! Geopotentiel calcule par rapport a la surface locale:
   
     DO iq=1,2  
        DO l=1,llm  
           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:  
   
174      forall (l = 1:llm) zphi(:, l) = pack(pphi(:, :, l), dyn_phy)      forall (l = 1:llm) zphi(:, l) = pack(pphi(:, :, l), dyn_phy)
175      zphis = pack(pphis, dyn_phy)      zphis = pack(pphis, dyn_phy)
176      DO l=1,llm      DO l=1, llm
177         DO ig=1,klon         DO ig=1, klon
178            zphi(ig,l)=zphi(ig,l)-zphis(ig)            zphi(ig, l)=zphi(ig, l)-zphis(ig)
179         ENDDO         ENDDO
180      ENDDO      ENDDO
181    
182      !   ....  Calcul de la vitesse  verticale  (en Pa*m*s  ou Kg/s)  ....      ! Calcul de la vitesse verticale (en Pa*m*s ou Kg/s)
183        DO l=1, llm
184      DO l=1,llm         pvervel(1, l)=pw(1, 1, l) * g /apoln
        pvervel(1,l)=pw(1,1,l) * g /apoln  
185         ig0=2         ig0=2
186         DO j=2,jjm         DO j=2, jjm
187            DO i = 1, iim            DO i = 1, iim
188               pvervel(ig0,l) = pw(i,j,l) * g * unsaire_2d(i,j)               pvervel(ig0, l) = pw(i, j, l) * g * unsaire_2d(i, j)
189               ig0 = ig0 + 1               ig0 = ig0 + 1
190            ENDDO            ENDDO
191         ENDDO         ENDDO
192         pvervel(ig0,l)=pw(1,jjm + 1,l) * g /apols         pvervel(ig0, l)=pw(1, jjm + 1, l) * g /apols
193      ENDDO      ENDDO
194    
195      !   45. champ u:      ! 45. champ u:
196    
197      DO  l=1,llm      DO l=1, llm
198           DO j=2, jjm
        DO  j=2,jjm  
199            ig0 = 1+(j-2)*iim            ig0 = 1+(j-2)*iim
200            zufi(ig0+1,l)= 0.5 *  &            zufi(ig0+1, l)= 0.5 * &
201                 (pucov(iim,j,l)/cu_2d(iim,j) + pucov(1,j,l)/cu_2d(1,j))                 (pucov(iim, j, l)/cu_2d(iim, j) + pucov(1, j, l)/cu_2d(1, j))
202            pcvgu(ig0+1,l)= 0.5 *  &            DO i=2, iim
203                 (pducov(iim,j,l)/cu_2d(iim,j) + pducov(1,j,l)/cu_2d(1,j))               zufi(ig0+i, l)= 0.5 * &
204            DO i=2,iim                    (pucov(i-1, j, l)/cu_2d(i-1, j) &
205               zufi(ig0+i,l)= 0.5 * &                    + pucov(i, j, l)/cu_2d(i, j))
                   (pucov(i-1,j,l)/cu_2d(i-1,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))  
206            end DO            end DO
207         end DO         end DO
   
208      end DO      end DO
209    
210      !   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  
   
     !   47. champs de vents aux pole nord    
     !        U = 1 / pi  *  integrale [ v * cos(long) * d long ]  
     !        V = 1 / pi  *  integrale [ v * sin(long) * d long ]  
211    
212      DO l=1,llm      forall (j = 2: jjm, l = 1: llm) zvfi(:iim, j, l)= 0.5 &
213             * (pvcov(:iim, j-1, l) / cv_2d(:iim, j-1) &
214             + pvcov(:iim, j, l) / cv_2d(:iim, j))
215        zvfi(iim + 1, 2:jjm, :) = zvfi(1, 2:jjm, :)
216    
217         z1(1)   =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1,1,l)/cv_2d(1,1)      ! 47. champs de vents au pôle nord
218         z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1,1,l)/cv_2d(1,1)      ! U = 1 / pi * integrale [ v * cos(long) * d long ]
219         DO i=2,iim      ! V = 1 / pi * integrale [ v * sin(long) * d long ]
           z1(i)   =(rlonu(i)-rlonu(i-1))*pvcov(i,1,l)/cv_2d(i,1)  
           z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i,1,l)/cv_2d(i,1)  
        ENDDO  
220    
221         DO i=1,iim      DO l=1, llm
222            zcos(i)   = COS(rlonv(i))*z1(i)         z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1, 1, l)/cv_2d(1, 1)
223            zcosbis(i)= COS(rlonv(i))*z1bis(i)         DO i=2, iim
224            zsin(i)   = SIN(rlonv(i))*z1(i)            z1(i) =(rlonu(i)-rlonu(i-1))*pvcov(i, 1, l)/cv_2d(i, 1)
           zsinbis(i)= SIN(rlonv(i))*z1bis(i)  
225         ENDDO         ENDDO
226    
227         zufi(1,l)  = SSUM(iim,zcos,1)/pi         zufi(1, l) = SUM(COS(rlonv(:iim)) * z1) / pi
228         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  
   
229      ENDDO      ENDDO
230    
231      !   48. champs de vents aux pole sud:      ! 48. champs de vents au pôle sud:
232      !        U = 1 / pi  *  integrale [ v * cos(long) * d long ]      ! U = 1 / pi * integrale [ v * cos(long) * d long ]
233      !        V = 1 / pi  *  integrale [ v * sin(long) * d long ]      ! V = 1 / pi * integrale [ v * sin(long) * d long ]
234    
235      DO l=1,llm      DO l=1, llm
236           z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1, jjm, l) &
237         z1(1)   =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1,jjm,l) &              /cv_2d(1, jjm)
238              /cv_2d(1,jjm)         DO i=2, iim
239         z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1,jjm,l) &            z1(i) =(rlonu(i)-rlonu(i-1))*pvcov(i, jjm, l)/cv_2d(i, jjm)
             /cv_2d(1,jjm)  
        DO i=2,iim  
           z1(i)   =(rlonu(i)-rlonu(i-1))*pvcov(i,jjm,l)/cv_2d(i,jjm)  
           z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i,jjm,l)/cv_2d(i,jjm)  
        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)  
240         ENDDO         ENDDO
241    
242         zufi(klon,l)  = SSUM(iim,zcos,1)/pi         zufi(klon, l) = SUM(COS(rlonv(:iim)) * z1) / pi
243         pcvgu(klon,l) = SSUM(iim,zcosbis,1)/pi         zvfi(:, jjm + 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
        zvfi(klon,l)  = SSUM(iim,zsin,1)/pi  
        pcvgv(klon,l) = SSUM(iim,zsinbis,1)/pi  
   
244      ENDDO      ENDDO
245    
246      !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)  
247    
248      !   Appel de la physique:      !IM calcul PV a teta=350, 380, 405K
249        CALL PVtheta(klon, llm, pucov, pvcov, teta, ztfi, zplay, zplev, &
250             ntetaSTD, rtetaSTD, PVteta)
251    
252      CALL physiq(nq, firstcal, lafin, rdayvrai, heure, dtphys, &      ! Appel de la physique :
253           zplev, zplay, zphi, zphis, presnivs, clesphy0, zufi, zvfi, &      CALL physiq(lafin, rdayvrai, heure, dtphys, zplev, zplay, zphi, &
254           ztfi, zqfi, pvervel, zdufi, zdvfi, zdtfi, zdqfi, zdpsrf, pducov, &           zphis, zufi, v, ztfi, qx, pvervel, zdufi, zdvfi, &
255           PVteta) ! IM diagnostique PVteta, Amip2           zdtfi, zdqfi, zdpsrf, pducov, PVteta) ! diagnostic PVteta, Amip2
256    
257      !   transformation des tendances physiques en tendances dynamiques:      ! transformation des tendances physiques en tendances dynamiques:
258    
259      !  tendance sur la pression :      ! tendance sur la pression :
260    
261      pdpsfi = gr_fi_dyn(zdpsrf)      pdpsfi = gr_fi_dyn(zdpsrf)
262    
263      !   62. enthalpie potentielle      ! 62. enthalpie potentielle
264    
265      DO l=1,llm      DO l=1, llm
266    
267         DO i=1,iim + 1         DO i=1, iim + 1
268            pdhfi(i,1,l)    = cpp *  zdtfi(1,l)      / ppk(i, 1  ,l)            pdhfi(i, 1, l) = cpp * zdtfi(1, l) / ppk(i, 1 , l)
269            pdhfi(i,jjm + 1,l) = cpp *  zdtfi(klon,l)/ ppk(i,jjm + 1,l)            pdhfi(i, jjm + 1, l) = cpp * zdtfi(klon, l)/ ppk(i, jjm + 1, l)
270         ENDDO         ENDDO
271    
272         DO j=2,jjm         DO j=2, jjm
273            ig0=1+(j-2)*iim            ig0=1+(j-2)*iim
274            DO i=1,iim            DO i=1, iim
275               pdhfi(i,j,l) = cpp * zdtfi(ig0+i,l) / ppk(i,j,l)               pdhfi(i, j, l) = cpp * zdtfi(ig0+i, l) / ppk(i, j, l)
276            ENDDO            ENDDO
277            pdhfi(iim + 1,j,l) =  pdhfi(1,j,l)            pdhfi(iim + 1, j, l) = pdhfi(1, j, l)
278         ENDDO         ENDDO
279    
280      ENDDO      ENDDO
281    
282      !   62. humidite specifique      ! 62. humidite specifique
283    
284      DO iq=1,nqmx      DO iq=1, nqmx
285         DO l=1,llm         DO l=1, llm
286            DO i=1,iim + 1            DO i=1, iim + 1
287               pdqfi(i,1,l,iq)    = zdqfi(1,l,iq)               pdqfi(i, 1, l, iq) = zdqfi(1, l, iq)
288               pdqfi(i,jjm + 1,l,iq) = zdqfi(klon,l,iq)               pdqfi(i, jjm + 1, l, iq) = zdqfi(klon, l, iq)
289            ENDDO            ENDDO
290            DO j=2,jjm            DO j=2, jjm
291               ig0=1+(j-2)*iim               ig0=1+(j-2)*iim
292               DO i=1,iim               DO i=1, iim
293                  pdqfi(i,j,l,iq) = zdqfi(ig0+i,l,iq)                  pdqfi(i, j, l, iq) = zdqfi(ig0+i, l, iq)
294               ENDDO               ENDDO
295               pdqfi(iim + 1,j,l,iq) = pdqfi(1,j,l,iq)               pdqfi(iim + 1, j, l, iq) = pdqfi(1, j, l, iq)
296            ENDDO            ENDDO
297         ENDDO         ENDDO
298      ENDDO      ENDDO
299    
300      !   63. traceurs      ! 63. traceurs
301    
302      !     initialisation des tendances      ! initialisation des tendances
303      pdqfi=0.      pdqfi=0.
304    
305      DO iq=1,nq      DO iq=1, nqmx
306         iiq=niadv(iq)         iiq=niadv(iq)
307         DO l=1,llm         DO l=1, llm
308            DO i=1,iim + 1            DO i=1, iim + 1
309               pdqfi(i,1,l,iiq)    = zdqfi(1,l,iq)               pdqfi(i, 1, l, iiq) = zdqfi(1, l, iq)
310               pdqfi(i,jjm + 1,l,iiq) = zdqfi(klon,l,iq)               pdqfi(i, jjm + 1, l, iiq) = zdqfi(klon, l, iq)
311            ENDDO            ENDDO
312            DO j=2,jjm            DO j=2, jjm
313               ig0=1+(j-2)*iim               ig0=1+(j-2)*iim
314               DO i=1,iim               DO i=1, iim
315                  pdqfi(i,j,l,iiq) = zdqfi(ig0+i,l,iq)                  pdqfi(i, j, l, iiq) = zdqfi(ig0+i, l, iq)
316               ENDDO               ENDDO
317               pdqfi(iim + 1,j,l,iiq) = pdqfi(1,j,l,iq)               pdqfi(iim + 1, j, l, iiq) = pdqfi(1, j, l, iq)
318            ENDDO            ENDDO
319         ENDDO         ENDDO
320      ENDDO      ENDDO
321    
322      !   65. champ u:      ! 65. champ u:
323    
324      DO l=1,llm      DO l=1, llm
325    
326         DO i=1,iim + 1         DO i=1, iim + 1
327            pdufi(i,1,l)    = 0.            pdufi(i, 1, l) = 0.
328            pdufi(i,jjm + 1,l) = 0.            pdufi(i, jjm + 1, l) = 0.
329         ENDDO         ENDDO
330    
331         DO j=2,jjm         DO j=2, jjm
332            ig0=1+(j-2)*iim            ig0=1+(j-2)*iim
333            DO i=1,iim-1            DO i=1, iim-1
334               pdufi(i,j,l)= &               pdufi(i, j, l)= &
335                    0.5*(zdufi(ig0+i,l)+zdufi(ig0+i+1,l))*cu_2d(i,j)                    0.5*(zdufi(ig0+i, l)+zdufi(ig0+i+1, l))*cu_2d(i, j)
336            ENDDO            ENDDO
337            pdufi(iim,j,l)= &            pdufi(iim, j, l)= &
338                 0.5*(zdufi(ig0+1,l)+zdufi(ig0+iim,l))*cu_2d(iim,j)                 0.5*(zdufi(ig0+1, l)+zdufi(ig0+iim, l))*cu_2d(iim, j)
339            pdufi(iim + 1,j,l)=pdufi(1,j,l)            pdufi(iim + 1, j, l)=pdufi(1, j, l)
340         ENDDO         ENDDO
341    
342      ENDDO      ENDDO
343    
344      !   67. champ v:      ! 67. champ v:
345    
346      DO l=1,llm      DO l=1, llm
347    
348         DO j=2,jjm-1         DO j=2, jjm-1
349            ig0=1+(j-2)*iim            ig0=1+(j-2)*iim
350            DO i=1,iim            DO i=1, iim
351               pdvfi(i,j,l)= &               pdvfi(i, j, l)= &
352                    0.5*(zdvfi(ig0+i,l)+zdvfi(ig0+i+iim,l))*cv_2d(i,j)                    0.5*(zdvfi(ig0+i, l)+zdvfi(ig0+i+iim, l))*cv_2d(i, j)
353            ENDDO            ENDDO
354            pdvfi(iim + 1,j,l) = pdvfi(1,j,l)            pdvfi(iim + 1, j, l) = pdvfi(1, j, l)
355         ENDDO         ENDDO
356      ENDDO      ENDDO
357    
358      !   68. champ v pres des poles:      ! 68. champ v pres des poles:
359      !      v = U * cos(long) + V * SIN(long)      ! v = U * cos(long) + V * SIN(long)
   
     DO l=1,llm  
360    
361         DO i=1,iim      DO l=1, llm
362            pdvfi(i,1,l)= &         DO i=1, iim
363                 zdufi(1,l)*COS(rlonv(i))+zdvfi(1,l)*SIN(rlonv(i))            pdvfi(i, 1, l)= &
364            pdvfi(i,jjm,l)=zdufi(klon,l)*COS(rlonv(i)) &                 zdufi(1, l)*COS(rlonv(i))+zdvfi(1, l)*SIN(rlonv(i))
365                 +zdvfi(klon,l)*SIN(rlonv(i))            pdvfi(i, jjm, l)=zdufi(klon, l)*COS(rlonv(i)) &
366            pdvfi(i,1,l)= &                 +zdvfi(klon, l)*SIN(rlonv(i))
367                 0.5*(pdvfi(i,1,l)+zdvfi(i+1,l))*cv_2d(i,1)            pdvfi(i, 1, l)= &
368            pdvfi(i,jjm,l)= &                 0.5*(pdvfi(i, 1, l)+zdvfi(i+1, l))*cv_2d(i, 1)
369                 0.5*(pdvfi(i,jjm,l)+zdvfi(klon-iim-1+i,l))*cv_2d(i,jjm)            pdvfi(i, jjm, l)= &
370                   0.5*(pdvfi(i, jjm, l)+zdvfi(klon-iim-1+i, l))*cv_2d(i, jjm)
371         ENDDO         ENDDO
372    
373         pdvfi(iim + 1,1,l)  = pdvfi(1,1,l)         pdvfi(iim + 1, 1, l) = pdvfi(1, 1, l)
374         pdvfi(iim + 1,jjm,l)= pdvfi(1,jjm,l)         pdvfi(iim + 1, jjm, l)= pdvfi(1, jjm, l)
   
375      ENDDO      ENDDO
376    
     firstcal = .FALSE.  
   
377    END SUBROUTINE calfis    END SUBROUTINE calfis
378    
379  end module calfis_m  end module calfis_m

Legend:
Removed from v.10  
changed lines
  Added in v.44

  ViewVC Help
Powered by ViewVC 1.1.21