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

Diff of /trunk/dyn3d/calfis.f90

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.21