source: LMDZ4/trunk/libf/phylmd/nflxtr.F90 @ 1351

Last change on this file since 1351 was 1279, checked in by Laurent Fairhead, 15 years ago

Merged LMDZ4-dev branch changes r1241:1278 into the trunk
Running trunk and LMDZ4-dev in LMDZOR configuration on local
machine (sequential) and SX8 (4-proc) yields identical results
(restart and restartphy are identical binarily)
Log history from r1241 to r1278 is available by switching to
source:LMDZ4/branches/LMDZ4-dev-20091210

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.5 KB
Line 
1!
2! $Id $
3!
4SUBROUTINE nflxtr(pdtime,pmfu,pmfd,pen_u,pde_u,pen_d,pde_d,pplay,paprs,x,dx)
5  USE dimphy
6  IMPLICIT NONE
7!=====================================================================
8! Objet : Melange convectif de traceurs a partir des flux de masse
9! Date : 13/12/1996 -- 13/01/97
10! Auteur: O. Boucher (LOA) sur inspiration de Z. X. Li (LMD),
11!         Brinkop et Sausen (1996) et Boucher et al. (1996).
12! ATTENTION : meme si cette routine se veut la plus generale possible,
13!             elle a herite de certaines notations et conventions du
14!             schema de Tiedtke (1993).
15! 1. En particulier, les couches sont numerotees de haut en bas !!!
16!    Ceci est valable pour les flux
17!    mais pas pour les entrees x, pplay, paprs !!!!
18! 2. pmfu est positif, pmfd est negatif
19! 3. Tous les flux d'entrainements et de detrainements sont positifs
20!    contrairement au schema de Tiedtke d'ou les changements de signe!!!!
21!=====================================================================
22!
23  include "YOMCST.h"
24  include "YOECUMF.h"
25
26  REAL,INTENT(IN) :: pdtime  ! pdtphys
27!
28! les flux sont definis au 1/2 niveaux
29! => pmfu(klev+1) et pmfd(klev+1) sont implicitement nuls
30!
31  REAL,DIMENSION(klon,klev),INTENT(IN) :: pmfu  ! flux de masse dans le panache montant
32  REAL,DIMENSION(klon,klev),INTENT(IN) :: pmfd  ! flux de masse dans le panache descendant
33  REAL,DIMENSION(klon,klev),INTENT(IN) :: pen_u ! flux entraine dans le panache montant
34  REAL,DIMENSION(klon,klev),INTENT(IN) :: pde_u ! flux detraine dans le panache montant
35  REAL,DIMENSION(klon,klev),INTENT(IN) :: pen_d ! flux entraine dans le panache descendant
36  REAL,DIMENSION(klon,klev),INTENT(IN) :: pde_d ! flux detraine dans le panache descendant
37
38  REAL,DIMENSION(klon,klev),INTENT(IN)   :: pplay ! pression aux couches (bas en haut)
39  REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs ! pression aux 1/2 couches (bas en haut)
40  REAL,DIMENSION(klon,klev),INTENT(IN)   :: x     ! q de traceur (bas en haut)
41  REAL,DIMENSION(klon,klev),INTENT(INOUT) :: dx   ! tendance de traceur  (bas en haut)
42
43! flux convectifs mais en variables locales
44  REAL,DIMENSION(klon,klev+1) :: zmfu  ! copie de pmfu avec klev+1 = 0
45  REAL,DIMENSION(klon,klev+1) :: zmfd  ! copie de pmfd avec klev+1 = 0
46  REAL,DIMENSION(klon,klev)   :: zen_u
47  REAL,DIMENSION(klon,klev)   :: zde_u
48  REAL,DIMENSION(klon,klev)   :: zen_d
49  REAL,DIMENSION(klon,klev)   :: zde_d
50  REAL                        :: zmfe
51
52! variables locales     
53! les flux de x sont definis aux 1/2 niveaux
54! xu et xd sont definis aux niveaux complets
55  REAL,DIMENSION(klon,klev)   :: xu      ! q de traceurs dans le panache montant
56  REAL,DIMENSION(klon,klev)   :: xd      ! q de traceurs dans le panache descendant
57  REAL,DIMENSION(klon,klev+1) :: zmfux   ! flux de x dans le panache montant
58  REAL,DIMENSION(klon,klev+1) :: zmfdx   ! flux de x dans le panache descendant
59  REAL,DIMENSION(klon,klev+1) :: zmfex   ! flux de x dans l'environnement
60  INTEGER                     :: i, k
61  REAL,PARAMETER              :: zmfmin=1.E-10
62
63! ==============================================
64! Extension des flux UP et DN sur klev+1 niveaux
65! ==============================================
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! ==========================================
77! modif pour diagnostiquer les detrainements
78! ==========================================
79!   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
89! =========================================
90! calcul des flux dans le panache montant
91! =========================================
92!
93! Dans la premiere couche, on prend q comme valeur de qu
94
95  DO i=1, klon
96     zmfux(i,1)=0.0
97  ENDDO
98
99! 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))/(zmfu(i,k+1)+zde_u(i,k))
106        ENDIF
107        zmfux(i,k+1)=zmfu(i,k+1)*xu(i,k)
108     ENDDO
109  ENDDO
110! ==========================================
111! calcul des flux dans le panache descendant
112! ==========================================
113   
114  DO i=1, klon
115     zmfdx(i,klev+1)=0.0
116  ENDDO
117
118  DO k=klev,1,-1
119     DO i=1, klon
120        IF ((zde_d(i,k)-zmfd(i,k)).lt.zmfmin) THEN
121           xd(i,k)=x(i,k)
122        ELSE
123           xd(i,k)=(zmfdx(i,k+1)-zen_d(i,k)*x(i,k))/(zmfd(i,k)-zde_d(i,k))
124        ENDIF
125        zmfdx(i,k)=zmfd(i,k)*xd(i,k)
126     ENDDO
127  ENDDO
128! ===================================================
129! introduction du flux de retour dans l'environnement
130! ===================================================
131
132  DO k=2, klev
133     DO i=1, klon
134        zmfe=-zmfu(i,k)-zmfd(i,k)
135        IF (zmfe.le.0.) then
136           zmfex(i,k)= zmfe*x(i,k)
137        ELSE
138           zmfex(i,k)= zmfe*x(i,k-1)
139        ENDIF
140     ENDDO
141  ENDDO
142
143  DO i=1, klon
144     zmfex(i,1)=0.
145     zmfex(i,klev+1)=0.
146  ENDDO
147! ==========================
148! calcul final des tendances
149! ==========================
150  DO k=1, klev
151     DO i=1, klon
152        dx(i,k)=RG/(paprs(i,k)-paprs(i,k+1))*pdtime*  &
153             ( zmfux(i,k) - zmfux(i,k+1) +            &
154             zmfdx(i,k) - zmfdx(i,k+1) +              &
155             zmfex(i,k) - zmfex(i,k+1) )
156     ENDDO
157  ENDDO
158 
159END SUBROUTINE nflxtr
Note: See TracBrowser for help on using the repository browser.