source: LMDZ.3.3/trunk/libf/phylmd/flxtr.F @ 494

Last change on this file since 494 was 2, checked in by lmdz, 25 years ago

Initial revision

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