source: LMDZ.3.3/trunk/libf/phylmd/nflxtr.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: 5.2 KB
Line 
1      SUBROUTINE nflxtr(pdtime,pmfu,pmfd,pen_u,pde_u,pen_d,pde_d,
2     .                 pplay,paprs,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
14c   mais pas pour les entrees x, pplay, paprs !!!!
15c --pmfu est positif, pmfd est negatif
16c --Tous les flux d'entrainements et de detrainements sont positifs
17c   contrairement au schema de Tiedtke d'ou les changements de signe!!!!
18c=====================================================================
19c
20#include "dimensions.h"
21#include "dimphy.h"
22#include "YOMCST.h"
23#include "YOECUMF.h"
24c
25      REAL pdtime
26c--les flux sont definis au 1/2 niveaux
27c--pmfu(klev+1) et pmfd(klev+1) sont implicitement nuls
28      REAL pmfu(klon,klev)  ! flux de masse dans le panache montant
29      REAL pmfd(klon,klev)  ! flux de masse dans le panache descendant
30      REAL pen_u(klon,klev) ! flux entraine dans le panache montant
31      REAL pde_u(klon,klev) ! flux detraine dans le panache montant
32      REAL pen_d(klon,klev) ! flux entraine dans le panache descendant
33      REAL pde_d(klon,klev) ! flux detraine dans le panache descendant
34
35      REAL pplay(klon,klev)    ! pression aux couches (bas en haut)
36      REAL paprs(klon,klev+1)  ! pression aux 1/2 couches (bas en haut)
37      REAL x(klon,klev)        ! q de traceur (bas en haut)
38      REAL dx(klon,klev)     ! tendance de traceur  (bas en haut)
39c
40c--flux convectifs mais en variables locales
41      REAL zmfu(klon,klev+1)
42      REAL zmfd(klon,klev+1)
43      REAL zen_u(klon,klev)
44      REAL zde_u(klon,klev)
45      REAL zen_d(klon,klev)
46      REAL zde_d(klon,klev)
47      real zmfe
48c
49c--variables locales     
50c--les flux de x sont definis aux 1/2 niveaux
51c--xu et xd sont definis aux niveaux complets
52      REAL xu(klon,klev)        ! q de traceurs dans le panache montant
53      REAL xd(klon,klev)        ! q de traceurs dans le panache descendant
54      REAL zmfux(klon,klev+1)   ! flux de x dans le panache montant
55      REAL zmfdx(klon,klev+1)   ! flux de x dans le panache descendant
56      REAL zmfex(klon,klev+1)   ! flux de x dans l'environnement
57      INTEGER i, k
58      REAL zmfmin
59      PARAMETER (zmfmin=1.E-10)
60
61c =========================================
62c
63c
64c   Extension des flux UP et DN sur klev+1 niveaux
65c =========================================
66      do k=1,klev
67         do i=1,klon
68            zmfu(i,k)=pmfu(i,k)
69            zmfd(i,k)=pmfd(i,k)
70         enddo
71      enddo
72      do i=1,klon
73         zmfu(i,klev+1)=0.
74         zmfd(i,klev+1)=0.
75      enddo
76
77c--modif pour diagnostiquer les detrainements
78c =========================================
79c   on privilegie l'ajustement de l'entrainement dans l'ascendance.
80
81      do k=1, klev
82         do i=1, klon
83            zen_d(i,k)=pen_d(i,k)
84            zde_u(i,k)=pde_u(i,k)
85            zde_d(i,k) =-zmfd(i,k+1)+zmfd(i,k)+zen_d(i,k)
86            zen_u(i,k) = zmfu(i,k+1)-zmfu(i,k)+zde_u(i,k)
87         enddo
88      enddo
89c
90c--calcul des flux dans le panache montant
91c =========================================
92c
93c Dans la premiere couche, on prend q comme valeur de qu
94c
95      do i=1, klon
96         zmfux(i,1)=0.0
97      enddo
98c
99c Autres couches
100      do k=1,klev
101         do i=1, klon
102            if ((zmfu(i,k+1)+zde_u(i,k)).lt.zmfmin) THEN
103               xu(i,k)=x(i,k)
104            else
105               xu(i,k)=(zmfux(i,k)+zen_u(i,k)*x(i,k))
106     s               /(zmfu(i,k+1)+zde_u(i,k))
107            endif
108            zmfux(i,k+1)=zmfu(i,k+1)*xu(i,k)
109         enddo
110      enddo
111c
112c--calcul des flux dans le panache descendant
113c =========================================
114c   
115      do i=1, klon
116         zmfdx(i,klev+1)=0.0
117      enddo
118c
119      do k=klev,1,-1
120         do i=1, klon
121            if ((zde_d(i,k)-zmfd(i,k)).lt.zmfmin) THEN
122               xd(i,k)=x(i,k)
123            else
124               xd(i,k)=(zmfdx(i,k+1)-zen_d(i,k)*x(i,k)) /
125     .               (zmfd(i,k)-zde_d(i,k))
126            endif
127            zmfdx(i,k)=zmfd(i,k)*xd(i,k)
128         enddo
129      enddo
130c
131c--introduction du flux de retour dans l'environnement
132c =========================================
133c
134      do k=2, klev
135         do i=1, klon
136            zmfe=-zmfu(i,k)-zmfd(i,k)
137            if (zmfe.le.0.) then
138               zmfex(i,k)= zmfe*x(i,k)
139            else
140               zmfex(i,k)= zmfe*x(i,k-1)
141            endif
142         enddo
143      enddo
144
145      do i=1, klon
146         zmfex(i,1)=0.
147         zmfex(i,klev+1)=0.
148      enddo
149c
150c--calcul final des tendances
151c
152      do k=1, klev
153         do i=1, klon
154            dx(i,k)=RG/(paprs(i,k)-paprs(i,k+1))*pdtime*
155     .                      ( zmfux(i,k) - zmfux(i,k+1) +
156     .                        zmfdx(i,k) - zmfdx(i,k+1) +
157     .                        zmfex(i,k) - zmfex(i,k+1) )
158         enddo
159      enddo
160c
161      return
162      end
Note: See TracBrowser for help on using the repository browser.