source: trunk/libf/phylmd/flxtr.F @ 1

Last change on this file since 1 was 1, checked in by emillour, 14 years ago

Import initial LMDZ5

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