/[lmdze]/trunk/phylmd/nflxtr.f
ViewVC logotype

Contents of /trunk/phylmd/nflxtr.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 82 - (show annotations)
Wed Mar 5 14:57:53 2014 UTC (10 years, 2 months ago) by guez
File size: 4788 byte(s)
Changed all ".f90" suffixes to ".f".
1 module nflxtr_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE nflxtr(pdtime, pmfu, pmfd, pde_u, pen_d, paprs, x, dx)
8
9 ! From LMDZ4/libf/phylmd/nflxtr.F, version 1.1.1.1 2004/05/19 12:53:08
10
11 ! Objet : mélange convectif de traceurs à partir des flux de masse
12 ! Date : 13/12/1996 -- 13/01/97
13
14 ! Auteur : O. Boucher (LOA) sur inspiration de Z. X. Li (LMD),
15 ! Brinkop et Sausen (1996) et Boucher et al. (1996).
16
17 ! Attention, même si cette routine se veut la plus générale
18 ! possible, elle a herité de certaines notations et conventions du
19 ! schéma de Tiedtke (1993) :
20
21 ! -- les couches sont numerotées de haut en bas pour les flux mais
22 ! pas pour les entrées x, paprs ;
23
24 ! -- pmfu est positif, pmfd est négatif ;
25
26 ! -- tous les flux d'entraînement et de détraînement sont positifs
27 ! contrairement au schéma de Tiedtke, d'où les changements de
28 ! signe.
29
30 USE dimphy, ONLY: klev, klon
31 USE suphec_m, ONLY: rg
32
33 REAL, intent(in):: pdtime
34
35 ! les flux sont définis aux demi-niveaux
36 ! pmfu(klev+1) et pmfd(klev+1) sont implicitement nuls
37
38 REAL, intent(in):: pmfu(klon, klev) ! flux de masse dans le panache montant
39
40 REAL, intent(in):: pmfd(klon, klev)
41 ! flux de masse dans le panache descendant
42
43 REAL, intent(in):: pde_u(klon, klev) ! flux detraine dans le panache montant
44
45 REAL, intent(in):: pen_d(klon, klev)
46 ! flux entraine dans le panache descendant
47
48 REAL, intent(in):: paprs(klon, klev+1)
49 ! pression aux 1/2 couches (bas en haut)
50
51 REAL, intent(in):: x(klon, klev) ! q de traceur (bas en haut)
52 REAL, intent(out):: dx(klon, klev) ! tendance de traceur (bas en haut)
53
54 ! Local:
55
56 ! flux convectifs mais en variables locales
57 REAL zmfu(klon, klev+1)
58 REAL zmfd(klon, klev+1)
59 REAL zen_u(klon, klev)
60 REAL zde_u(klon, klev)
61 REAL zen_d(klon, klev)
62 REAL zde_d(klon, klev)
63 real zmfe
64
65 ! les flux de x sont definis aux 1/2 niveaux
66 ! xu et xd sont definis aux niveaux complets
67 REAL xu(klon, klev) ! q de traceurs dans le panache montant
68 REAL xd(klon, klev) ! q de traceurs dans le panache descendant
69 REAL zmfux(klon, klev+1) ! flux de x dans le panache montant
70 REAL zmfdx(klon, klev+1) ! flux de x dans le panache descendant
71 REAL zmfex(klon, klev+1) ! flux de x dans l'environnement
72 INTEGER i, k
73 REAL zmfmin
74 PARAMETER (zmfmin=1.E-10)
75
76 ! -----------------------------------------------------------------
77
78 ! Extension des flux UP et DN sur klev+1 niveaux
79
80 do k=1, klev
81 do i=1, klon
82 zmfu(i, k)=pmfu(i, k)
83 zmfd(i, k)=pmfd(i, k)
84 enddo
85 enddo
86 do i=1, klon
87 zmfu(i, klev+1)=0.
88 zmfd(i, klev+1)=0.
89 enddo
90
91 ! modif pour diagnostiquer les detrainements
92
93 ! on privilegie l'ajustement de l'entrainement dans l'ascendance.
94
95 do k=1, klev
96 do i=1, klon
97 zen_d(i, k)=pen_d(i, k)
98 zde_u(i, k)=pde_u(i, k)
99 zde_d(i, k) =-zmfd(i, k+1)+zmfd(i, k)+zen_d(i, k)
100 zen_u(i, k) = zmfu(i, k+1)-zmfu(i, k)+zde_u(i, k)
101 enddo
102 enddo
103
104 ! calcul des flux dans le panache montant
105
106 ! Dans la premiere couche, on prend q comme valeur de qu
107
108 do i=1, klon
109 zmfux(i, 1)=0.0
110 enddo
111
112 ! Autres couches
113 do k=1, klev
114 do i=1, klon
115 if ((zmfu(i, k+1)+zde_u(i, k)).lt.zmfmin) THEN
116 xu(i, k)=x(i, k)
117 else
118 xu(i, k)=(zmfux(i, k)+zen_u(i, k)*x(i, k)) &
119 /(zmfu(i, k+1)+zde_u(i, k))
120 endif
121 zmfux(i, k+1)=zmfu(i, k+1)*xu(i, k)
122 enddo
123 enddo
124
125 ! calcul des flux dans le panache descendant
126
127 do i=1, klon
128 zmfdx(i, klev+1)=0.0
129 enddo
130
131 do k=klev, 1, -1
132 do i=1, klon
133 if ((zde_d(i, k)-zmfd(i, k)).lt.zmfmin) THEN
134 xd(i, k)=x(i, k)
135 else
136 xd(i, k)=(zmfdx(i, k+1)-zen_d(i, k)*x(i, k)) / &
137 (zmfd(i, k)-zde_d(i, k))
138 endif
139 zmfdx(i, k)=zmfd(i, k)*xd(i, k)
140 enddo
141 enddo
142
143 ! introduction du flux de retour dans l'environnement
144
145 do k=2, klev
146 do i=1, klon
147 zmfe=-zmfu(i, k)-zmfd(i, k)
148 if (zmfe.le.0.) then
149 zmfex(i, k)= zmfe*x(i, k)
150 else
151 zmfex(i, k)= zmfe*x(i, k-1)
152 endif
153 enddo
154 enddo
155
156 do i=1, klon
157 zmfex(i, 1)=0.
158 zmfex(i, klev+1)=0.
159 enddo
160
161 ! calcul final des tendances
162
163 do k=1, klev
164 do i=1, klon
165 dx(i, k)=RG/(paprs(i, k)-paprs(i, k+1))*pdtime* &
166 ( zmfux(i, k) - zmfux(i, k+1) + &
167 zmfdx(i, k) - zmfdx(i, k+1) + &
168 zmfex(i, k) - zmfex(i, k+1) )
169 enddo
170 enddo
171
172 end SUBROUTINE nflxtr
173
174 end module nflxtr_m

  ViewVC Help
Powered by ViewVC 1.1.21