source: LMDZ6/branches/Amaury_dev/libf/phylmd/nflxtr.F90 @ 5209

Last change on this file since 5209 was 5144, checked in by abarral, 3 months ago

Put YOMCST.h into modules

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