source: LMDZ4/trunk/libf/phylmd/flxtr.F @ 684

Last change on this file since 684 was 524, checked in by lmdzadmin, 21 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.1 KB
Line 
1!
2! $Header$
3!
4      SUBROUTINE flxtr(pdtime,pmfu,pmfd,pen_u,pde_u,pen_d,pde_d,
5     .                 pt,pplay,paprs,kcbot,kctop,kdtop,x,dx)
6      IMPLICIT NONE
7c=====================================================================
8c Objet : Melange convectif de traceurs a partir des flux de masse
9c Date : 13/12/1996 -- 13/01/97
10c Auteur: O. Boucher (LOA) sur inspiration de Z. X. Li (LMD),
11c         Brinkop et Sausen (1996) et Boucher et al. (1996).
12c ATTENTION : meme si cette routine se veut la plus generale possible,
13c             elle a herite de certaines notations et conventions du
14c             schema de Tiedtke (1993).
15c --En particulier, les couches sont numerotees de haut en bas !!!
16c   Ceci est valable pour les flux, kcbot, kctop et kdtop
17c   mais pas pour les entrees x, pplay, paprs !!!!
18c --Un schema amont est choisi pour calculer les flux pour s'assurer
19c   de la positivite des valeurs de traceurs, cela implique des eqs
20c   differentes pour les flux de traceurs montants et descendants.
21c --pmfu est positif, pmfd est negatif
22c --Tous les flux d'entrainements et de detrainements sont positifs
23c   contrairement au schema de Tiedtke d'ou les changements de signe!!!!
24c=====================================================================
25c
26#include "dimensions.h"
27#include "dimphy.h"
28#include "YOMCST.h"
29#include "YOECUMF.h"
30c
31      REAL pdtime
32c--les flux sont definis au 1/2 niveaux
33c--pmfu(klev+1) et pmfd(klev+1) sont implicitement nuls
34      REAL pmfu(klon,klev)  ! flux de masse dans le panache montant
35      REAL pmfd(klon,klev)  ! flux de masse dans le panache descendant
36      REAL pen_u(klon,klev) ! flux entraine dans le panache montant
37      REAL pde_u(klon,klev) ! flux detraine dans le panache montant
38      REAL pen_d(klon,klev) ! flux entraine dans le panache descendant
39      REAL pde_d(klon,klev) ! flux detraine dans le panache descendant
40c--idem mais en variables locales
41      REAL zpen_u(klon,klev)
42      REAL zpde_u(klon,klev)
43      REAL zpen_d(klon,klev)
44      REAL zpde_d(klon,klev)
45c
46      REAL pplay(klon,klev)    ! pression aux couches (bas en haut)
47      REAL pap(klon,klev)      ! pression aux couches (haut en bas)
48      REAL pt(klon,klev)       ! temperature aux couches (bas en haut)
49      REAL zt(klon,klev)       ! temperature aux couches (haut en bas)
50      REAL paprs(klon,klev+1)  ! pression aux 1/2 couches (bas en haut)
51      REAL paph(klon,klev+1)   ! pression aux 1/2 couches (haut en bas)
52      INTEGER kcbot(klon)      ! niveau de base de la convection
53      INTEGER kctop(klon)      ! niveau du sommet de la convection +1
54      INTEGER kdtop(klon)      ! niveau de sommet du panache descendant
55      REAL x(klon,klev)        ! q de traceur (bas en haut)
56      REAL zx(klon,klev)       ! q de traceur (haut en bas)
57      REAL dx(klon,klev)     ! tendance de traceur  (bas en haut)
58c
59c--variables locales     
60c--les flux de x sont definis aux 1/2 niveaux
61c--xu et xd sont definis aux niveaux complets
62      REAL xu(klon,klev)        ! q de traceurs dans le panache montant
63      REAL xd(klon,klev)        ! q de traceurs dans le panache descendant
64      REAL xe(klon,klev)        ! q de traceurs dans l'environnement
65      REAL zmfux(klon,klev+1)   ! flux de x dans le panache montant
66      REAL zmfdx(klon,klev+1)   ! flux de x dans le panache descendant
67      REAL zmfex(klon,klev+1)   ! flux de x dans l'environnement
68      INTEGER i, k
69      REAL zmfmin
70      PARAMETER (zmfmin=1.E-10)
71c
72c On remet les taux d'entrainement et de detrainement dans le panache
73c descendant a des valeurs positives.
74c On ajuste les valeurs de pen_u, pen_d pde_u et pde_d pour que la
75c conservation de la masse soit realisee a chaque niveau dans les 2
76c panaches.
77      DO k=1, klev
78      DO i=1, klon
79        zpen_u(i,k)= pen_u(i,k)
80        zpde_u(i,k)= pde_u(i,k)
81      ENDDO
82      ENDDO
83c
84      DO k=1, klev-1
85      DO i=1, klon
86        zpen_d(i,k)=-pen_d(i,k+1)
87        zpde_d(i,k)=-pde_d(i,k+1)
88      ENDDO
89      ENDDO
90c
91      DO i=1, klon
92      zpen_d(i,klev)       = 0.0
93      zpde_d(i,klev)       = -pmfd(i,klev)
94c   Correction 03 11 97
95c     zpen_d(i,kdtop(i)-1) = pmfd(i,kdtop(i)-1)-pmfd(i,kdtop(i))
96      IF (kdtop(i).EQ.klev+1) THEN
97      zpen_d(i,kdtop(i)-1) = pmfd(i,kdtop(i)-1)
98      ELSE
99      zpen_d(i,kdtop(i)-1) = pmfd(i,kdtop(i)-1)-pmfd(i,kdtop(i))
100      ENDIF
101
102      zpde_u(i,kctop(i)-2) = pmfu(i,kctop(i)-1)
103      zpen_u(i,klev)       = pmfu(i,klev)
104      ENDDO
105c
106      DO i=1, klon
107      DO k=kcbot(i), klev-1
108      zpen_u(i,k) = pmfu(i,k) - pmfu(i,k+1)
109      ENDDO
110      ENDDO
111c
112c conversion des sens de notations bas-haut et haut-bas
113c
114      DO k=1, klev+1
115      DO i=1, klon
116        paph(i,klev+2-k)=paprs(i,k)
117      ENDDO
118      ENDDO
119c
120      DO i=1, klon
121      DO k=1, klev
122        pap(i,klev+1-k)=pplay(i,k)
123        zt(i,klev+1-k) =pt(i,k)
124        zx(i,klev+1-k) =x(i,k)
125      ENDDO
126      ENDDO
127c
128c--initialisations des flux de traceurs aux extremites de la colonne
129c
130      DO i=1, klon
131        zmfux(i,klev+1) = 0.0
132        zmfdx(i,1) = 0.0
133        zmfex(i,1) = 0.0
134      ENDDO
135c
136c--calcul des flux dans le panache montant
137c
138      DO k=klev, 1, -1
139      DO i=1, klon
140       IF (k.GE.kcbot(i)) THEN
141         xu(i,k)=zx(i,k)
142         zmfux(i,k)=pmfu(i,k)*xu(i,k)
143       ELSE
144         zmfux(i,k)= (zmfux(i,k+1) + zpen_u(i,k)*zx(i,k) ) /
145     .               (1.+zpde_u(i,k)/MAX(zmfmin,pmfu(i,k)))
146         xu(i,k)=zmfux(i,k)/MAX(zmfmin,pmfu(i,k))
147       ENDIF
148      ENDDO
149      ENDDO
150c
151c--calcul des flux dans le panache descendant
152c
153      DO k=1, klev-1
154      DO i=1, klon
155       IF (k.LE.kdtop(i)-1) THEN
156         xd(i,k)=( zx(i,k)+xu(i,k) ) / 2.
157         zmfdx(i,k+1)=pmfd(i,k+1)*xd(i,k)
158       ELSE
159         zmfdx(i,k+1)= (zmfdx(i,k) - zpen_d(i,k)*zx(i,k) ) /
160     .               (1.-zpde_d(i,k)/MIN(-zmfmin,pmfd(i,k+1)))
161         xd(i,k)=zmfdx(i,k+1)/MIN(-zmfmin,pmfd(i,k+1))
162       ENDIF
163      ENDDO
164      ENDDO
165      DO i=1, klon
166         zmfdx(i,klev+1) = 0.0
167         xd(i,klev) = (zpen_d(i,klev)*zx(i,klev) - zmfdx(i,klev)) /
168     .                   MAX(zmfmin,zpde_d(i,klev))
169      ENDDO
170c
171c--introduction du flux de retour dans l'environnement
172c
173      DO k=1, klev-1
174      DO i=1, klon
175       IF (k.LE.kctop(i)-3) THEN
176         xe(i,k)= zx(i,k)
177         zmfex(i,k+1)=-(pmfu(i,k+1)+pmfd(i,k+1))*xe(i,k)
178       ELSE
179         zmfex(i,k+1)= (zmfex(i,k) -
180     .      (zpde_u(i,k)*xu(i,k)+zpde_d(i,k)*xd(i,k))) /
181     .      (1.-(zpen_d(i,k)+zpen_u(i,k))/
182     .      MIN(-zmfmin,-pmfu(i,k+1)-pmfd(i,k+1)) )
183         xe(i,k)=zmfex(i,k+1)/MIN(-zmfmin,-pmfu(i,k+1)-pmfd(i,k+1))
184       ENDIF
185      ENDDO
186      ENDDO
187      DO i=1, klon
188         zmfex(i,klev+1) = 0.0
189         xe(i,klev) = (zpde_u(i,klev)*xu(i,klev) +
190     .                 zpde_d(i,klev)*xd(i,klev) -zmfex(i,klev)) /
191     .                 MAX(zmfmin,zpen_u(i,klev)+zpen_d(i,klev))
192      ENDDO
193c
194c--calcul final des tendances
195c
196      DO k=1 , klev
197      DO i=1, klon
198        dx(i,klev+1-k) = RG/(paph(i,k+1)-paph(i,k))*pdtime*
199     .                      ( zmfux(i,k+1) - zmfux(i,k) +
200     .                        zmfdx(i,k+1) - zmfdx(i,k) +
201     .                        zmfex(i,k+1) - zmfex(i,k) )
202      ENDDO
203      ENDDO
204c
205      RETURN
206      END
Note: See TracBrowser for help on using the repository browser.