1 |
SUBROUTINE thermcell(ngrid,nlay,ptimestep |
SUBROUTINE thermcell(ngrid, nlay, ptimestep, pplay, pplev, pphi, pu, pv, pt, & |
2 |
s ,pplay,pplev,pphi |
po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0, r_aspect, l_mix, w2di, tho) |
3 |
s ,pu,pv,pt,po |
|
4 |
s ,pduadj,pdvadj,pdtadj,pdoadj |
use dimens_m |
5 |
s ,fm0,entr0 |
use dimphy |
6 |
c s ,pu_therm,pv_therm |
use SUPHEC_M |
7 |
s ,r_aspect,l_mix,w2di,tho) |
|
8 |
|
IMPLICIT NONE |
9 |
use dimens_m |
|
10 |
use dimphy |
! Calcul du transport verticale dans la couche limite en presence |
11 |
use SUPHEC_M |
! de "thermiques" explicitement representes |
12 |
IMPLICIT NONE |
|
13 |
|
! Réécriture à partir d'un listing papier à Habas, le 14/02/00 |
14 |
c======================================================================= |
|
15 |
c |
! le thermique est supposé homogène et dissipé par mélange avec |
16 |
c Calcul du transport verticale dans la couche limite en presence |
! son environnement. la longueur l_mix contrôle l'efficacité du |
17 |
c de "thermiques" explicitement representes |
! mélange |
18 |
c |
|
19 |
c Réécriture à partir d'un listing papier à Habas, le 14/02/00 |
! Le calcul du transport des différentes espèces se fait en prenant |
20 |
c |
! en compte: |
21 |
c le thermique est supposé homogène et dissipé par mélange avec |
! 1. un flux de masse montant |
22 |
c son environnement. la longueur l_mix contrôle l'efficacité du |
! 2. un flux de masse descendant |
23 |
c mélange |
! 3. un entrainement |
24 |
c |
! 4. un detrainement |
25 |
c Le calcul du transport des différentes espèces se fait en prenant |
|
26 |
c en compte: |
! arguments: |
27 |
c 1. un flux de masse montant |
|
28 |
c 2. un flux de masse descendant |
INTEGER ngrid, nlay, w2di, tho |
29 |
c 3. un entrainement |
real ptimestep, l_mix, r_aspect |
30 |
c 4. un detrainement |
REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) |
31 |
c |
REAL pu(ngrid, nlay), pduadj(ngrid, nlay) |
32 |
c======================================================================= |
REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) |
33 |
|
REAL po(ngrid, nlay), pdoadj(ngrid, nlay) |
34 |
c----------------------------------------------------------------------- |
REAL, intent(in):: pplay(ngrid, nlay) |
35 |
c declarations: |
real, intent(in):: pplev(ngrid, nlay+1) |
36 |
c ------------- |
real, intent(in):: pphi(ngrid, nlay) |
37 |
|
|
38 |
|
integer idetr |
39 |
c arguments: |
save idetr |
40 |
c ---------- |
data idetr/3/ |
41 |
|
|
42 |
INTEGER ngrid,nlay,w2di,tho |
! local: |
43 |
real ptimestep,l_mix,r_aspect |
|
44 |
REAL pt(ngrid,nlay),pdtadj(ngrid,nlay) |
INTEGER ig, k, l, lmaxa(klon), lmix(klon) |
45 |
REAL pu(ngrid,nlay),pduadj(ngrid,nlay) |
real zsortie1d(klon) |
46 |
REAL pv(ngrid,nlay),pdvadj(ngrid,nlay) |
! CR: on remplace lmax(klon, klev+1) |
47 |
REAL po(ngrid,nlay),pdoadj(ngrid,nlay) |
INTEGER lmax(klon), lmin(klon), lentr(klon) |
48 |
REAL, intent(in):: pplay(ngrid,nlay) |
real linter(klon) |
49 |
real, intent(in):: pplev(ngrid,nlay+1) |
real zmix(klon), fracazmix(klon) |
50 |
real pphi(ngrid,nlay) |
|
51 |
|
real zmax(klon), zw, zz, zw2(klon, klev+1), ztva(klon, klev), zzz |
52 |
integer idetr |
|
53 |
save idetr |
real zlev(klon, klev+1), zlay(klon, klev) |
54 |
data idetr/3/ |
REAL zh(klon, klev), zdhadj(klon, klev) |
55 |
|
REAL ztv(klon, klev) |
56 |
c local: |
real zu(klon, klev), zv(klon, klev), zo(klon, klev) |
57 |
c ------ |
REAL wh(klon, klev+1) |
58 |
|
real wu(klon, klev+1), wv(klon, klev+1), wo(klon, klev+1) |
59 |
INTEGER ig,k,l,lmaxa(klon),lmix(klon) |
real zla(klon, klev+1) |
60 |
real zsortie1d(klon) |
real zwa(klon, klev+1) |
61 |
c CR: on remplace lmax(klon,klev+1) |
real zld(klon, klev+1) |
62 |
INTEGER lmax(klon),lmin(klon),lentr(klon) |
real zwd(klon, klev+1) |
63 |
real linter(klon) |
real zsortie(klon, klev) |
64 |
real zmix(klon), fracazmix(klon) |
real zva(klon, klev) |
65 |
c RC |
real zua(klon, klev) |
66 |
real zmax(klon),zw,zz,zw2(klon,klev+1),ztva(klon,klev),zzz |
real zoa(klon, klev) |
67 |
|
|
68 |
real zlev(klon,klev+1),zlay(klon,klev) |
real zha(klon, klev) |
69 |
REAL zh(klon,klev),zdhadj(klon,klev) |
real wa_moy(klon, klev+1) |
70 |
REAL ztv(klon,klev) |
real fraca(klon, klev+1) |
71 |
real zu(klon,klev),zv(klon,klev),zo(klon,klev) |
real fracc(klon, klev+1) |
72 |
REAL wh(klon,klev+1) |
real zf, zf2 |
73 |
real wu(klon,klev+1),wv(klon,klev+1),wo(klon,klev+1) |
real thetath2(klon, klev), wth2(klon, klev) |
74 |
real zla(klon,klev+1) |
common/comtherm/thetath2, wth2 |
75 |
real zwa(klon,klev+1) |
|
76 |
real zld(klon,klev+1) |
real count_time |
77 |
real zwd(klon,klev+1) |
integer isplit, nsplit, ialt |
78 |
real zsortie(klon,klev) |
parameter (nsplit=10) |
79 |
real zva(klon,klev) |
data isplit/0/ |
80 |
real zua(klon,klev) |
save isplit |
81 |
real zoa(klon,klev) |
|
82 |
|
logical sorties |
83 |
real zha(klon,klev) |
real rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev) |
84 |
real wa_moy(klon,klev+1) |
real zpspsk(klon, klev) |
85 |
real fraca(klon,klev+1) |
|
86 |
real fracc(klon,klev+1) |
real wmax(klon), wmaxa(klon) |
87 |
real zf,zf2 |
real wa(klon, klev, klev+1) |
88 |
real thetath2(klon,klev),wth2(klon,klev) |
real wd(klon, klev+1) |
89 |
common/comtherm/thetath2,wth2 |
real larg_part(klon, klev, klev+1) |
90 |
|
real fracd(klon, klev+1) |
91 |
real count_time |
real xxx(klon, klev+1) |
92 |
integer isplit,nsplit,ialt |
real larg_cons(klon, klev+1) |
93 |
parameter (nsplit=10) |
real larg_detr(klon, klev+1) |
94 |
data isplit/0/ |
real fm0(klon, klev+1), entr0(klon, klev), detr(klon, klev) |
95 |
save isplit |
real pu_therm(klon, klev), pv_therm(klon, klev) |
96 |
|
real fm(klon, klev+1), entr(klon, klev) |
97 |
logical sorties |
real fmc(klon, klev+1) |
98 |
real rho(klon,klev),rhobarz(klon,klev+1),masse(klon,klev) |
|
99 |
real zpspsk(klon,klev) |
!CR:nouvelles variables |
100 |
|
real f_star(klon, klev+1), entr_star(klon, klev) |
101 |
c real wmax(klon,klev),wmaxa(klon) |
real entr_star_tot(klon), entr_star2(klon) |
102 |
real wmax(klon),wmaxa(klon) |
real f(klon), f0(klon) |
103 |
real wa(klon,klev,klev+1) |
real zlevinter(klon) |
104 |
real wd(klon,klev+1) |
logical first |
105 |
real larg_part(klon,klev,klev+1) |
data first /.false./ |
106 |
real fracd(klon,klev+1) |
save first |
107 |
real xxx(klon,klev+1) |
|
108 |
real larg_cons(klon,klev+1) |
character*2 str2 |
109 |
real larg_detr(klon,klev+1) |
character*10 str10 |
110 |
real fm0(klon,klev+1),entr0(klon,klev),detr(klon,klev) |
|
111 |
real pu_therm(klon,klev),pv_therm(klon,klev) |
LOGICAL vtest(klon), down |
112 |
real fm(klon,klev+1),entr(klon,klev) |
|
113 |
real fmc(klon,klev+1) |
EXTERNAL SCOPY |
114 |
|
|
115 |
cCR:nouvelles variables |
integer ncorrec, ll |
116 |
real f_star(klon,klev+1),entr_star(klon,klev) |
save ncorrec |
117 |
real entr_star_tot(klon),entr_star2(klon) |
data ncorrec/0/ |
118 |
real f(klon), f0(klon) |
|
119 |
real zlevinter(klon) |
!----------------------------------------------------------------------- |
120 |
logical first |
|
121 |
data first /.false./ |
! initialisation: |
122 |
save first |
|
123 |
cRC |
sorties=.true. |
124 |
|
IF(ngrid.NE.klon) THEN |
125 |
character*2 str2 |
PRINT * |
126 |
character*10 str10 |
PRINT *, 'STOP dans convadj' |
127 |
|
PRINT *, 'ngrid =', ngrid |
128 |
LOGICAL vtest(klon),down |
PRINT *, 'klon =', klon |
129 |
|
ENDIF |
130 |
EXTERNAL SCOPY |
|
131 |
|
! incrementation eventuelle de tendances precedentes: |
132 |
integer ncorrec,ll |
|
133 |
save ncorrec |
print *, '0 OK convect8' |
134 |
data ncorrec/0/ |
|
135 |
|
DO l=1, nlay |
136 |
c |
DO ig=1, ngrid |
137 |
c----------------------------------------------------------------------- |
zpspsk(ig, l)=(pplay(ig, l)/pplev(ig, 1))**RKAPPA |
138 |
c initialisation: |
zh(ig, l)=pt(ig, l)/zpspsk(ig, l) |
139 |
c --------------- |
zu(ig, l)=pu(ig, l) |
140 |
c |
zv(ig, l)=pv(ig, l) |
141 |
sorties=.true. |
zo(ig, l)=po(ig, l) |
142 |
IF(ngrid.NE.klon) THEN |
ztv(ig, l)=zh(ig, l)*(1.+0.61*zo(ig, l)) |
143 |
PRINT* |
end DO |
144 |
PRINT*,'STOP dans convadj' |
end DO |
145 |
PRINT*,'ngrid =',ngrid |
|
146 |
PRINT*,'klon =',klon |
print *, '1 OK convect8' |
147 |
ENDIF |
|
148 |
c |
! + + + + + + + + + + + |
149 |
c----------------------------------------------------------------------- |
|
150 |
c incrementation eventuelle de tendances precedentes: |
! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz |
151 |
c --------------------------------------------------- |
! wh, wt, wo ... |
152 |
|
|
153 |
print*,'0 OK convect8' |
! + + + + + + + + + + + zh, zu, zv, zo, rho |
154 |
|
|
155 |
DO 1010 l=1,nlay |
! -------------------- zlev(1) |
156 |
DO 1015 ig=1,ngrid |
! \\\\\\\\\\\\\\\\\\\\ |
157 |
zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA |
|
158 |
zh(ig,l)=pt(ig,l)/zpspsk(ig,l) |
! Calcul des altitudes des couches |
159 |
zu(ig,l)=pu(ig,l) |
|
160 |
zv(ig,l)=pv(ig,l) |
do l=2, nlay |
161 |
zo(ig,l)=po(ig,l) |
do ig=1, ngrid |
162 |
ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l)) |
zlev(ig, l)=0.5*(pphi(ig, l)+pphi(ig, l-1))/RG |
163 |
1015 CONTINUE |
enddo |
164 |
1010 CONTINUE |
enddo |
165 |
|
do ig=1, ngrid |
166 |
print*,'1 OK convect8' |
zlev(ig, 1)=0. |
167 |
c -------------------- |
zlev(ig, nlay+1)=(2.*pphi(ig, klev)-pphi(ig, klev-1))/RG |
168 |
c |
enddo |
169 |
c |
do l=1, nlay |
170 |
c + + + + + + + + + + + |
do ig=1, ngrid |
171 |
c |
zlay(ig, l)=pphi(ig, l)/RG |
172 |
c |
enddo |
173 |
c wa, fraca, wd, fracd -------------------- zlev(2), rhobarz |
enddo |
174 |
c wh,wt,wo ... |
|
175 |
c |
! Calcul des densites |
176 |
c + + + + + + + + + + + zh,zu,zv,zo,rho |
|
177 |
c |
do l=1, nlay |
178 |
c |
do ig=1, ngrid |
179 |
c -------------------- zlev(1) |
rho(ig, l)=pplay(ig, l)/(zpspsk(ig, l)*RD*zh(ig, l)) |
180 |
c \\\\\\\\\\\\\\\\\\\\ |
enddo |
181 |
c |
enddo |
182 |
c |
|
183 |
|
do l=2, nlay |
184 |
c----------------------------------------------------------------------- |
do ig=1, ngrid |
185 |
c Calcul des altitudes des couches |
rhobarz(ig, l)=0.5*(rho(ig, l)+rho(ig, l-1)) |
186 |
c----------------------------------------------------------------------- |
enddo |
187 |
|
enddo |
188 |
do l=2,nlay |
|
189 |
do ig=1,ngrid |
do k=1, nlay |
190 |
zlev(ig,l)=0.5*(pphi(ig,l)+pphi(ig,l-1))/RG |
do l=1, nlay+1 |
191 |
enddo |
do ig=1, ngrid |
192 |
enddo |
wa(ig, k, l)=0. |
193 |
do ig=1,ngrid |
enddo |
194 |
zlev(ig,1)=0. |
enddo |
195 |
zlev(ig,nlay+1)=(2.*pphi(ig,klev)-pphi(ig,klev-1))/RG |
enddo |
196 |
enddo |
|
197 |
do l=1,nlay |
! Calcul de w2, quarre de w a partir de la cape |
198 |
do ig=1,ngrid |
! a partir de w2, on calcule wa, vitesse de l'ascendance |
199 |
zlay(ig,l)=pphi(ig,l)/RG |
|
200 |
enddo |
! ATTENTION: Dans cette version, pour cause d'economie de memoire, |
201 |
enddo |
! w2 est stoke dans wa |
202 |
|
|
203 |
c print*,'2 OK convect8' |
! ATTENTION: dans convect8, on n'utilise le calcule des wa |
204 |
c----------------------------------------------------------------------- |
! independants par couches que pour calculer l'entrainement |
205 |
c Calcul des densites |
! a la base et la hauteur max de l'ascendance. |
206 |
c----------------------------------------------------------------------- |
|
207 |
|
! Indicages: |
208 |
do l=1,nlay |
! l'ascendance provenant du niveau k traverse l'interface l avec |
209 |
do ig=1,ngrid |
! une vitesse wa(k, l). |
210 |
rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l)) |
|
211 |
enddo |
! -------------------- |
212 |
enddo |
|
213 |
|
! + + + + + + + + + + |
214 |
do l=2,nlay |
|
215 |
do ig=1,ngrid |
! wa(k, l) ---- -------------------- l |
216 |
rhobarz(ig,l)=0.5*(rho(ig,l)+rho(ig,l-1)) |
! /\ |
217 |
enddo |
! /||\ + + + + + + + + + + |
218 |
enddo |
! || |
219 |
|
! || -------------------- |
220 |
do k=1,nlay |
! || |
221 |
do l=1,nlay+1 |
! || + + + + + + + + + + |
222 |
do ig=1,ngrid |
! || |
223 |
wa(ig,k,l)=0. |
! || -------------------- |
224 |
enddo |
! ||__ |
225 |
enddo |
! |___ + + + + + + + + + + k |
226 |
enddo |
|
227 |
|
! -------------------- |
228 |
c print*,'3 OK convect8' |
|
229 |
c------------------------------------------------------------------ |
!CR: ponderation entrainement des couches instables |
230 |
c Calcul de w2, quarre de w a partir de la cape |
!def des entr_star tels que entr=f*entr_star |
231 |
c a partir de w2, on calcule wa, vitesse de l'ascendance |
do l=1, klev |
232 |
c |
do ig=1, ngrid |
233 |
c ATTENTION: Dans cette version, pour cause d'economie de memoire, |
entr_star(ig, l)=0. |
234 |
c w2 est stoke dans wa |
enddo |
235 |
c |
enddo |
236 |
c ATTENTION: dans convect8, on n'utilise le calcule des wa |
! determination de la longueur de la couche d entrainement |
237 |
c independants par couches que pour calculer l'entrainement |
do ig=1, ngrid |
238 |
c a la base et la hauteur max de l'ascendance. |
lentr(ig)=1 |
239 |
c |
enddo |
240 |
c Indicages: |
|
241 |
c l'ascendance provenant du niveau k traverse l'interface l avec |
!on ne considere que les premieres couches instables |
242 |
c une vitesse wa(k,l). |
do k=nlay-2, 1, -1 |
243 |
c |
do ig=1, ngrid |
244 |
c -------------------- |
if (ztv(ig, k).gt.ztv(ig, k+1).and. & |
245 |
c |
ztv(ig, k+1).le.ztv(ig, k+2)) then |
246 |
c + + + + + + + + + + |
lentr(ig)=k |
247 |
c |
endif |
248 |
c wa(k,l) ---- -------------------- l |
enddo |
249 |
c /\ |
enddo |
250 |
c /||\ + + + + + + + + + + |
|
251 |
c || |
! determination du lmin: couche d ou provient le thermique |
252 |
c || -------------------- |
do ig=1, ngrid |
253 |
c || |
lmin(ig)=1 |
254 |
c || + + + + + + + + + + |
enddo |
255 |
c || |
do ig=1, ngrid |
256 |
c || -------------------- |
do l=nlay, 2, -1 |
257 |
c ||__ |
if (ztv(ig, l-1).gt.ztv(ig, l)) then |
258 |
c |___ + + + + + + + + + + k |
lmin(ig)=l-1 |
259 |
c |
endif |
260 |
c -------------------- |
enddo |
261 |
c |
enddo |
262 |
c |
|
263 |
c |
! definition de l'entrainement des couches |
264 |
c------------------------------------------------------------------ |
do l=1, klev-1 |
265 |
|
do ig=1, ngrid |
266 |
cCR: ponderation entrainement des couches instables |
if (ztv(ig, l).gt.ztv(ig, l+1).and. & |
267 |
cdef des entr_star tels que entr=f*entr_star |
l.ge.lmin(ig).and.l.le.lentr(ig)) then |
268 |
do l=1,klev |
entr_star(ig, l)=(ztv(ig, l)-ztv(ig, l+1))* & |
269 |
do ig=1,ngrid |
(zlev(ig, l+1)-zlev(ig, l)) |
270 |
entr_star(ig,l)=0. |
endif |
271 |
enddo |
enddo |
272 |
enddo |
enddo |
273 |
c determination de la longueur de la couche d entrainement |
! pas de thermique si couches 1->5 stables |
274 |
do ig=1,ngrid |
do ig=1, ngrid |
275 |
lentr(ig)=1 |
if (lmin(ig).gt.5) then |
276 |
enddo |
do l=1, klev |
277 |
|
entr_star(ig, l)=0. |
278 |
con ne considere que les premieres couches instables |
enddo |
279 |
do k=nlay-2,1,-1 |
endif |
280 |
do ig=1,ngrid |
enddo |
281 |
if (ztv(ig,k).gt.ztv(ig,k+1).and. |
! calcul de l entrainement total |
282 |
s ztv(ig,k+1).le.ztv(ig,k+2)) then |
do ig=1, ngrid |
283 |
lentr(ig)=k |
entr_star_tot(ig)=0. |
284 |
endif |
enddo |
285 |
enddo |
do ig=1, ngrid |
286 |
enddo |
do k=1, klev |
287 |
|
entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig, k) |
288 |
c determination du lmin: couche d ou provient le thermique |
enddo |
289 |
do ig=1,ngrid |
enddo |
290 |
lmin(ig)=1 |
|
291 |
enddo |
print *, 'fin calcul entr_star' |
292 |
do ig=1,ngrid |
do k=1, klev |
293 |
do l=nlay,2,-1 |
do ig=1, ngrid |
294 |
if (ztv(ig,l-1).gt.ztv(ig,l)) then |
ztva(ig, k)=ztv(ig, k) |
295 |
lmin(ig)=l-1 |
enddo |
296 |
endif |
enddo |
297 |
enddo |
|
298 |
enddo |
do k=1, klev+1 |
299 |
c |
do ig=1, ngrid |
300 |
c definition de l'entrainement des couches |
zw2(ig, k)=0. |
301 |
do l=1,klev-1 |
fmc(ig, k)=0. |
302 |
do ig=1,ngrid |
|
303 |
if (ztv(ig,l).gt.ztv(ig,l+1).and. |
f_star(ig, k)=0. |
304 |
s l.ge.lmin(ig).and.l.le.lentr(ig)) then |
|
305 |
entr_star(ig,l)=(ztv(ig,l)-ztv(ig,l+1))* |
larg_cons(ig, k)=0. |
306 |
s (zlev(ig,l+1)-zlev(ig,l)) |
larg_detr(ig, k)=0. |
307 |
endif |
wa_moy(ig, k)=0. |
308 |
enddo |
enddo |
309 |
enddo |
enddo |
310 |
c pas de thermique si couches 1->5 stables |
|
311 |
do ig=1,ngrid |
do ig=1, ngrid |
312 |
if (lmin(ig).gt.5) then |
linter(ig)=1. |
313 |
do l=1,klev |
lmaxa(ig)=1 |
314 |
entr_star(ig,l)=0. |
lmix(ig)=1 |
315 |
enddo |
wmaxa(ig)=0. |
316 |
endif |
enddo |
317 |
enddo |
|
318 |
c calcul de l entrainement total |
do l=1, nlay-2 |
319 |
do ig=1,ngrid |
do ig=1, ngrid |
320 |
entr_star_tot(ig)=0. |
if (ztv(ig, l).gt.ztv(ig, l+1) & |
321 |
enddo |
.and.entr_star(ig, l).gt.1.e-10 & |
322 |
do ig=1,ngrid |
.and.zw2(ig, l).lt.1e-10) then |
323 |
do k=1,klev |
f_star(ig, l+1)=entr_star(ig, l) |
324 |
entr_star_tot(ig)=entr_star_tot(ig)+entr_star(ig,k) |
!test:calcul de dteta |
325 |
enddo |
zw2(ig, l+1)=2.*RG*(ztv(ig, l)-ztv(ig, l+1))/ztv(ig, l+1) & |
326 |
enddo |
*(zlev(ig, l+1)-zlev(ig, l)) & |
327 |
c |
*0.4*pphi(ig, l)/(pphi(ig, l+1)-pphi(ig, l)) |
328 |
print*,'fin calcul entr_star' |
larg_detr(ig, l)=0. |
329 |
do k=1,klev |
else if ((zw2(ig, l).ge.1e-10).and. & |
330 |
do ig=1,ngrid |
(f_star(ig, l)+entr_star(ig, l).gt.1.e-10)) then |
331 |
ztva(ig,k)=ztv(ig,k) |
f_star(ig, l+1)=f_star(ig, l)+entr_star(ig, l) |
332 |
enddo |
ztva(ig, l)=(f_star(ig, l)*ztva(ig, l-1)+entr_star(ig, l) & |
333 |
enddo |
*ztv(ig, l))/f_star(ig, l+1) |
334 |
cRC |
zw2(ig, l+1)=zw2(ig, l)*(f_star(ig, l)/f_star(ig, l+1))**2+ & |
335 |
c print*,'7 OK convect8' |
2.*RG*(ztva(ig, l)-ztv(ig, l))/ztv(ig, l) & |
336 |
do k=1,klev+1 |
*(zlev(ig, l+1)-zlev(ig, l)) |
337 |
do ig=1,ngrid |
endif |
338 |
zw2(ig,k)=0. |
! determination de zmax continu par interpolation lineaire |
339 |
fmc(ig,k)=0. |
if (zw2(ig, l+1).lt.0.) then |
340 |
cCR |
if (abs(zw2(ig, l+1)-zw2(ig, l)).lt.1e-10) then |
341 |
f_star(ig,k)=0. |
print *, 'pb linter' |
342 |
cRC |
endif |
343 |
larg_cons(ig,k)=0. |
linter(ig)=(l*(zw2(ig, l+1)-zw2(ig, l)) & |
344 |
larg_detr(ig,k)=0. |
-zw2(ig, l))/(zw2(ig, l+1)-zw2(ig, l)) |
345 |
wa_moy(ig,k)=0. |
zw2(ig, l+1)=0. |
346 |
enddo |
lmaxa(ig)=l |
347 |
enddo |
else |
348 |
|
if (zw2(ig, l+1).lt.0.) then |
349 |
c print*,'8 OK convect8' |
print *, 'pb1 zw2<0' |
350 |
do ig=1,ngrid |
endif |
351 |
linter(ig)=1. |
wa_moy(ig, l+1)=sqrt(zw2(ig, l+1)) |
352 |
lmaxa(ig)=1 |
endif |
353 |
lmix(ig)=1 |
if (wa_moy(ig, l+1).gt.wmaxa(ig)) then |
354 |
wmaxa(ig)=0. |
! lmix est le niveau de la couche ou w (wa_moy) est maximum |
355 |
enddo |
lmix(ig)=l+1 |
356 |
|
wmaxa(ig)=wa_moy(ig, l+1) |
357 |
cCR: |
endif |
358 |
do l=1,nlay-2 |
enddo |
359 |
do ig=1,ngrid |
enddo |
360 |
if (ztv(ig,l).gt.ztv(ig,l+1) |
print *, 'fin calcul zw2' |
361 |
s .and.entr_star(ig,l).gt.1.e-10 |
|
362 |
s .and.zw2(ig,l).lt.1e-10) then |
! Calcul de la couche correspondant a la hauteur du thermique |
363 |
f_star(ig,l+1)=entr_star(ig,l) |
do ig=1, ngrid |
364 |
ctest:calcul de dteta |
lmax(ig)=lentr(ig) |
365 |
zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1) |
enddo |
366 |
s *(zlev(ig,l+1)-zlev(ig,l)) |
do ig=1, ngrid |
367 |
s *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l)) |
do l=nlay, lentr(ig)+1, -1 |
368 |
larg_detr(ig,l)=0. |
if (zw2(ig, l).le.1.e-10) then |
369 |
else if ((zw2(ig,l).ge.1e-10).and. |
lmax(ig)=l-1 |
370 |
s (f_star(ig,l)+entr_star(ig,l).gt.1.e-10)) then |
endif |
371 |
f_star(ig,l+1)=f_star(ig,l)+entr_star(ig,l) |
enddo |
372 |
ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l) |
enddo |
373 |
s *ztv(ig,l))/f_star(ig,l+1) |
! pas de thermique si couches 1->5 stables |
374 |
zw2(ig,l+1)=zw2(ig,l)*(f_star(ig,l)/f_star(ig,l+1))**2+ |
do ig=1, ngrid |
375 |
s 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) |
if (lmin(ig).gt.5) then |
376 |
s *(zlev(ig,l+1)-zlev(ig,l)) |
lmax(ig)=1 |
377 |
endif |
lmin(ig)=1 |
378 |
c determination de zmax continu par interpolation lineaire |
endif |
379 |
if (zw2(ig,l+1).lt.0.) then |
enddo |
380 |
ctest |
|
381 |
if (abs(zw2(ig,l+1)-zw2(ig,l)).lt.1e-10) then |
! Determination de zw2 max |
382 |
print*,'pb linter' |
do ig=1, ngrid |
383 |
endif |
wmax(ig)=0. |
384 |
linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) |
enddo |
385 |
s -zw2(ig,l))/(zw2(ig,l+1)-zw2(ig,l)) |
|
386 |
zw2(ig,l+1)=0. |
do l=1, nlay |
387 |
lmaxa(ig)=l |
do ig=1, ngrid |
388 |
else |
if (l.le.lmax(ig)) then |
389 |
if (zw2(ig,l+1).lt.0.) then |
if (zw2(ig, l).lt.0.)then |
390 |
print*,'pb1 zw2<0' |
print *, 'pb2 zw2<0' |
391 |
endif |
endif |
392 |
wa_moy(ig,l+1)=sqrt(zw2(ig,l+1)) |
zw2(ig, l)=sqrt(zw2(ig, l)) |
393 |
endif |
wmax(ig)=max(wmax(ig), zw2(ig, l)) |
394 |
if (wa_moy(ig,l+1).gt.wmaxa(ig)) then |
else |
395 |
c lmix est le niveau de la couche ou w (wa_moy) est maximum |
zw2(ig, l)=0. |
396 |
lmix(ig)=l+1 |
endif |
397 |
wmaxa(ig)=wa_moy(ig,l+1) |
enddo |
398 |
endif |
enddo |
399 |
enddo |
|
400 |
enddo |
! Longueur caracteristique correspondant a la hauteur des thermiques. |
401 |
print*,'fin calcul zw2' |
do ig=1, ngrid |
402 |
c |
zmax(ig)=0. |
403 |
c Calcul de la couche correspondant a la hauteur du thermique |
zlevinter(ig)=zlev(ig, 1) |
404 |
do ig=1,ngrid |
enddo |
405 |
lmax(ig)=lentr(ig) |
do ig=1, ngrid |
406 |
enddo |
! calcul de zlevinter |
407 |
do ig=1,ngrid |
zlevinter(ig)=(zlev(ig, lmax(ig)+1)-zlev(ig, lmax(ig)))* & |
408 |
do l=nlay,lentr(ig)+1,-1 |
linter(ig)+zlev(ig, lmax(ig))-lmax(ig)*(zlev(ig, lmax(ig)+1) & |
409 |
if (zw2(ig,l).le.1.e-10) then |
-zlev(ig, lmax(ig))) |
410 |
lmax(ig)=l-1 |
zmax(ig)=max(zmax(ig), zlevinter(ig)-zlev(ig, lmin(ig))) |
411 |
endif |
enddo |
412 |
enddo |
|
413 |
enddo |
print *, 'avant fermeture' |
414 |
c pas de thermique si couches 1->5 stables |
! Fermeture, determination de f |
415 |
do ig=1,ngrid |
do ig=1, ngrid |
416 |
if (lmin(ig).gt.5) then |
entr_star2(ig)=0. |
417 |
lmax(ig)=1 |
enddo |
418 |
lmin(ig)=1 |
do ig=1, ngrid |
419 |
endif |
if (entr_star_tot(ig).LT.1.e-10) then |
420 |
enddo |
f(ig)=0. |
421 |
c |
else |
422 |
c Determination de zw2 max |
do k=lmin(ig), lentr(ig) |
423 |
do ig=1,ngrid |
entr_star2(ig)=entr_star2(ig)+entr_star(ig, k)**2 & |
424 |
wmax(ig)=0. |
/(rho(ig, k)*(zlev(ig, k+1)-zlev(ig, k))) |
425 |
enddo |
enddo |
426 |
|
! Nouvelle fermeture |
427 |
do l=1,nlay |
f(ig)=wmax(ig)/(max(500., zmax(ig))*r_aspect & |
428 |
do ig=1,ngrid |
*entr_star2(ig))*entr_star_tot(ig) |
429 |
if (l.le.lmax(ig)) then |
endif |
430 |
if (zw2(ig,l).lt.0.)then |
enddo |
431 |
print*,'pb2 zw2<0' |
print *, 'apres fermeture' |
432 |
endif |
|
433 |
zw2(ig,l)=sqrt(zw2(ig,l)) |
! Calcul de l'entrainement |
434 |
wmax(ig)=max(wmax(ig),zw2(ig,l)) |
do k=1, klev |
435 |
else |
do ig=1, ngrid |
436 |
zw2(ig,l)=0. |
entr(ig, k)=f(ig)*entr_star(ig, k) |
437 |
endif |
enddo |
438 |
enddo |
enddo |
439 |
enddo |
! Calcul des flux |
440 |
|
do ig=1, ngrid |
441 |
c Longueur caracteristique correspondant a la hauteur des thermiques. |
do l=1, lmax(ig)-1 |
442 |
do ig=1,ngrid |
fmc(ig, l+1)=fmc(ig, l)+entr(ig, l) |
443 |
zmax(ig)=0. |
enddo |
444 |
zlevinter(ig)=zlev(ig,1) |
enddo |
445 |
enddo |
|
446 |
do ig=1,ngrid |
! determination de l'indice du debut de la mixed layer ou w decroit |
447 |
c calcul de zlevinter |
|
448 |
zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))* |
! calcul de la largeur de chaque ascendance dans le cas conservatif. |
449 |
s linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1) |
! dans ce cas simple, on suppose que la largeur de l'ascendance provenant |
450 |
s -zlev(ig,lmax(ig))) |
! d'une couche est égale à la hauteur de la couche alimentante. |
451 |
zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig))) |
! La vitesse maximale dans l'ascendance est aussi prise comme estimation |
452 |
enddo |
! de la vitesse d'entrainement horizontal dans la couche alimentante. |
453 |
|
|
454 |
print*,'avant fermeture' |
do l=2, nlay |
455 |
c Fermeture,determination de f |
do ig=1, ngrid |
456 |
do ig=1,ngrid |
if (l.le.lmaxa(ig)) then |
457 |
entr_star2(ig)=0. |
zw=max(wa_moy(ig, l), 1.e-10) |
458 |
enddo |
larg_cons(ig, l)=zmax(ig)*r_aspect & |
459 |
do ig=1,ngrid |
*fmc(ig, l)/(rhobarz(ig, l)*zw) |
460 |
if (entr_star_tot(ig).LT.1.e-10) then |
endif |
461 |
f(ig)=0. |
enddo |
462 |
else |
enddo |
463 |
do k=lmin(ig),lentr(ig) |
|
464 |
entr_star2(ig)=entr_star2(ig)+entr_star(ig,k)**2 |
do l=2, nlay |
465 |
s /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))) |
do ig=1, ngrid |
466 |
enddo |
if (l.le.lmaxa(ig)) then |
467 |
c Nouvelle fermeture |
if ((l_mix*zlev(ig, l)).lt.0.)then |
468 |
f(ig)=wmax(ig)/(max(500.,zmax(ig))*r_aspect |
print *, 'pb l_mix*zlev<0' |
|
s *entr_star2(ig))*entr_star_tot(ig) |
|
|
ctest |
|
|
c if (first) then |
|
|
c f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig) |
|
|
c s *wmax(ig)) |
|
|
c endif |
|
|
endif |
|
|
c f0(ig)=f(ig) |
|
|
c first=.true. |
|
|
enddo |
|
|
print*,'apres fermeture' |
|
|
|
|
|
c Calcul de l'entrainement |
|
|
do k=1,klev |
|
|
do ig=1,ngrid |
|
|
entr(ig,k)=f(ig)*entr_star(ig,k) |
|
|
enddo |
|
|
enddo |
|
|
c Calcul des flux |
|
|
do ig=1,ngrid |
|
|
do l=1,lmax(ig)-1 |
|
|
fmc(ig,l+1)=fmc(ig,l)+entr(ig,l) |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
cRC |
|
|
|
|
|
|
|
|
c print*,'9 OK convect8' |
|
|
c print*,'WA1 ',wa_moy |
|
|
|
|
|
c determination de l'indice du debut de la mixed layer ou w decroit |
|
|
|
|
|
c calcul de la largeur de chaque ascendance dans le cas conservatif. |
|
|
c dans ce cas simple, on suppose que la largeur de l'ascendance provenant |
|
|
c d'une couche est égale à la hauteur de la couche alimentante. |
|
|
c La vitesse maximale dans l'ascendance est aussi prise comme estimation |
|
|
c de la vitesse d'entrainement horizontal dans la couche alimentante. |
|
|
|
|
|
do l=2,nlay |
|
|
do ig=1,ngrid |
|
|
if (l.le.lmaxa(ig)) then |
|
|
zw=max(wa_moy(ig,l),1.e-10) |
|
|
larg_cons(ig,l)=zmax(ig)*r_aspect |
|
|
s *fmc(ig,l)/(rhobarz(ig,l)*zw) |
|
|
endif |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
do l=2,nlay |
|
|
do ig=1,ngrid |
|
|
if (l.le.lmaxa(ig)) then |
|
|
c if (idetr.eq.0) then |
|
|
c cette option est finalement en dur. |
|
|
if ((l_mix*zlev(ig,l)).lt.0.)then |
|
|
print*,'pb l_mix*zlev<0' |
|
|
endif |
|
|
larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) |
|
|
c else if (idetr.eq.1) then |
|
|
c larg_detr(ig,l)=larg_cons(ig,l) |
|
|
c s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) |
|
|
c else if (idetr.eq.2) then |
|
|
c larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) |
|
|
c s *sqrt(wa_moy(ig,l)) |
|
|
c else if (idetr.eq.4) then |
|
|
c larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) |
|
|
c s *wa_moy(ig,l) |
|
|
c endif |
|
|
endif |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
c print*,'10 OK convect8' |
|
|
c print*,'WA2 ',wa_moy |
|
|
c calcul de la fraction de la maille concernée par l'ascendance en tenant |
|
|
c compte de l'epluchage du thermique. |
|
|
c |
|
|
cCR def de zmix continu (profil parabolique des vitesses) |
|
|
do ig=1,ngrid |
|
|
if (lmix(ig).gt.1.) then |
|
|
c test |
|
|
if (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) |
|
|
s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1))) |
|
|
s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) |
|
|
s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10) |
|
|
s then |
|
|
c |
|
|
zmix(ig)=((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) |
|
|
s *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2) |
|
|
s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) |
|
|
s *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2)) |
|
|
s /(2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig))) |
|
|
s *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1))) |
|
|
s -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1)) |
|
|
s *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig)))))) |
|
|
else |
|
|
zmix(ig)=zlev(ig,lmix(ig)) |
|
|
print*,'pb zmix' |
|
|
endif |
|
|
else |
|
|
zmix(ig)=0. |
|
|
endif |
|
|
ctest |
|
|
if ((zmax(ig)-zmix(ig)).lt.0.) then |
|
|
zmix(ig)=0.99*zmax(ig) |
|
|
c print*,'pb zmix>zmax' |
|
|
endif |
|
|
enddo |
|
|
c |
|
|
c calcul du nouveau lmix correspondant |
|
|
do ig=1,ngrid |
|
|
do l=1,klev |
|
|
if (zmix(ig).ge.zlev(ig,l).and. |
|
|
s zmix(ig).lt.zlev(ig,l+1)) then |
|
|
lmix(ig)=l |
|
|
endif |
|
|
enddo |
|
|
enddo |
|
|
c |
|
|
do l=2,nlay |
|
|
do ig=1,ngrid |
|
|
if(larg_cons(ig,l).gt.1.) then |
|
|
c print*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' |
|
|
fraca(ig,l)=(larg_cons(ig,l)-larg_detr(ig,l)) |
|
|
s /(r_aspect*zmax(ig)) |
|
|
c test |
|
|
fraca(ig,l)=max(fraca(ig,l),0.) |
|
|
fraca(ig,l)=min(fraca(ig,l),0.5) |
|
|
fracd(ig,l)=1.-fraca(ig,l) |
|
|
fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig)) |
|
|
else |
|
|
c wa_moy(ig,l)=0. |
|
|
fraca(ig,l)=0. |
|
|
fracc(ig,l)=0. |
|
|
fracd(ig,l)=1. |
|
|
endif |
|
|
enddo |
|
|
enddo |
|
|
cCR: calcul de fracazmix |
|
|
do ig=1,ngrid |
|
|
fracazmix(ig)=(fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/ |
|
|
s (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig) |
|
|
s +fraca(ig,lmix(ig))-zlev(ig,lmix(ig))*(fraca(ig,lmix(ig)+1) |
|
|
s -fraca(ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig))) |
|
|
enddo |
|
|
c |
|
|
do l=2,nlay |
|
|
do ig=1,ngrid |
|
|
if(larg_cons(ig,l).gt.1.) then |
|
|
if (l.gt.lmix(ig)) then |
|
|
ctest |
|
|
if (zmax(ig)-zmix(ig).lt.1.e-10) then |
|
|
c print*,'pb xxx' |
|
|
xxx(ig,l)=(lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig)) |
|
|
else |
|
|
xxx(ig,l)=(zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig)) |
|
|
endif |
|
|
if (idetr.eq.0) then |
|
|
fraca(ig,l)=fracazmix(ig) |
|
|
else if (idetr.eq.1) then |
|
|
fraca(ig,l)=fracazmix(ig)*xxx(ig,l) |
|
|
else if (idetr.eq.2) then |
|
|
fraca(ig,l)=fracazmix(ig)*(1.-(1.-xxx(ig,l))**2) |
|
|
else |
|
|
fraca(ig,l)=fracazmix(ig)*xxx(ig,l)**2 |
|
469 |
endif |
endif |
470 |
c print*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' |
larg_detr(ig, l)=sqrt(l_mix*zlev(ig, l)) |
471 |
fraca(ig,l)=max(fraca(ig,l),0.) |
endif |
472 |
fraca(ig,l)=min(fraca(ig,l),0.5) |
enddo |
473 |
fracd(ig,l)=1.-fraca(ig,l) |
enddo |
474 |
fracc(ig,l)=larg_cons(ig,l)/(r_aspect*zmax(ig)) |
|
475 |
endif |
! calcul de la fraction de la maille concernée par l'ascendance en tenant |
476 |
endif |
! compte de l'epluchage du thermique. |
477 |
enddo |
|
478 |
enddo |
!CR def de zmix continu (profil parabolique des vitesses) |
479 |
|
do ig=1, ngrid |
480 |
print*,'fin calcul fraca' |
if (lmix(ig).gt.1.) then |
481 |
c print*,'11 OK convect8' |
if (((zw2(ig, lmix(ig)-1)-zw2(ig, lmix(ig))) & |
482 |
c print*,'Ea3 ',wa_moy |
*((zlev(ig, lmix(ig)))-(zlev(ig, lmix(ig)+1))) & |
483 |
c------------------------------------------------------------------ |
-(zw2(ig, lmix(ig))-zw2(ig, lmix(ig)+1)) & |
484 |
c Calcul de fracd, wd |
*((zlev(ig, lmix(ig)-1))-(zlev(ig, lmix(ig))))).gt.1e-10) & |
485 |
c somme wa - wd = 0 |
then |
486 |
c------------------------------------------------------------------ |
|
487 |
|
zmix(ig)=((zw2(ig, lmix(ig)-1)-zw2(ig, lmix(ig))) & |
488 |
|
*((zlev(ig, lmix(ig)))**2-(zlev(ig, lmix(ig)+1))**2) & |
489 |
do ig=1,ngrid |
-(zw2(ig, lmix(ig))-zw2(ig, lmix(ig)+1)) & |
490 |
fm(ig,1)=0. |
*((zlev(ig, lmix(ig)-1))**2-(zlev(ig, lmix(ig)))**2)) & |
491 |
fm(ig,nlay+1)=0. |
/(2.*((zw2(ig, lmix(ig)-1)-zw2(ig, lmix(ig))) & |
492 |
enddo |
*((zlev(ig, lmix(ig)))-(zlev(ig, lmix(ig)+1))) & |
493 |
|
-(zw2(ig, lmix(ig))-zw2(ig, lmix(ig)+1)) & |
494 |
do l=2,nlay |
*((zlev(ig, lmix(ig)-1))-(zlev(ig, lmix(ig)))))) |
495 |
do ig=1,ngrid |
else |
496 |
fm(ig,l)=fraca(ig,l)*wa_moy(ig,l)*rhobarz(ig,l) |
zmix(ig)=zlev(ig, lmix(ig)) |
497 |
cCR:test |
print *, 'pb zmix' |
498 |
if (entr(ig,l-1).lt.1e-10.and.fm(ig,l).gt.fm(ig,l-1) |
endif |
499 |
s .and.l.gt.lmix(ig)) then |
else |
500 |
fm(ig,l)=fm(ig,l-1) |
zmix(ig)=0. |
501 |
c write(1,*)'ajustement fm, l',l |
endif |
502 |
|
|
503 |
|
if ((zmax(ig)-zmix(ig)).lt.0.) then |
504 |
|
zmix(ig)=0.99*zmax(ig) |
505 |
|
endif |
506 |
|
enddo |
507 |
|
|
508 |
|
! calcul du nouveau lmix correspondant |
509 |
|
do ig=1, ngrid |
510 |
|
do l=1, klev |
511 |
|
if (zmix(ig).ge.zlev(ig, l).and. & |
512 |
|
zmix(ig).lt.zlev(ig, l+1)) then |
513 |
|
lmix(ig)=l |
514 |
|
endif |
515 |
|
enddo |
516 |
|
enddo |
517 |
|
|
518 |
|
do l=2, nlay |
519 |
|
do ig=1, ngrid |
520 |
|
if(larg_cons(ig, l).gt.1.) then |
521 |
|
fraca(ig, l)=(larg_cons(ig, l)-larg_detr(ig, l)) & |
522 |
|
/(r_aspect*zmax(ig)) |
523 |
|
fraca(ig, l)=max(fraca(ig, l), 0.) |
524 |
|
fraca(ig, l)=min(fraca(ig, l), 0.5) |
525 |
|
fracd(ig, l)=1.-fraca(ig, l) |
526 |
|
fracc(ig, l)=larg_cons(ig, l)/(r_aspect*zmax(ig)) |
527 |
|
else |
528 |
|
fraca(ig, l)=0. |
529 |
|
fracc(ig, l)=0. |
530 |
|
fracd(ig, l)=1. |
531 |
|
endif |
532 |
|
enddo |
533 |
|
enddo |
534 |
|
!CR: calcul de fracazmix |
535 |
|
do ig=1, ngrid |
536 |
|
fracazmix(ig)=(fraca(ig, lmix(ig)+1)-fraca(ig, lmix(ig)))/ & |
537 |
|
(zlev(ig, lmix(ig)+1)-zlev(ig, lmix(ig)))*zmix(ig) & |
538 |
|
+fraca(ig, lmix(ig))-zlev(ig, lmix(ig))*(fraca(ig, lmix(ig)+1) & |
539 |
|
-fraca(ig, lmix(ig)))/(zlev(ig, lmix(ig)+1)-zlev(ig, lmix(ig))) |
540 |
|
enddo |
541 |
|
|
542 |
|
do l=2, nlay |
543 |
|
do ig=1, ngrid |
544 |
|
if(larg_cons(ig, l).gt.1.) then |
545 |
|
if (l.gt.lmix(ig)) then |
546 |
|
if (zmax(ig)-zmix(ig).lt.1.e-10) then |
547 |
|
xxx(ig, l)=(lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig)) |
548 |
|
else |
549 |
|
xxx(ig, l)=(zmax(ig)-zlev(ig, l))/(zmax(ig)-zmix(ig)) |
550 |
endif |
endif |
551 |
c write(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) |
if (idetr.eq.0) then |
552 |
cRC |
fraca(ig, l)=fracazmix(ig) |
553 |
enddo |
else if (idetr.eq.1) then |
554 |
do ig=1,ngrid |
fraca(ig, l)=fracazmix(ig)*xxx(ig, l) |
555 |
if(fracd(ig,l).lt.0.1) then |
else if (idetr.eq.2) then |
556 |
stop'fracd trop petit' |
fraca(ig, l)=fracazmix(ig)*(1.-(1.-xxx(ig, l))**2) |
557 |
else |
else |
558 |
c vitesse descendante "diagnostique" |
fraca(ig, l)=fracazmix(ig)*xxx(ig, l)**2 |
559 |
wd(ig,l)=fm(ig,l)/(fracd(ig,l)*rhobarz(ig,l)) |
endif |
560 |
endif |
fraca(ig, l)=max(fraca(ig, l), 0.) |
561 |
enddo |
fraca(ig, l)=min(fraca(ig, l), 0.5) |
562 |
enddo |
fracd(ig, l)=1.-fraca(ig, l) |
563 |
|
fracc(ig, l)=larg_cons(ig, l)/(r_aspect*zmax(ig)) |
564 |
do l=1,nlay |
endif |
565 |
do ig=1,ngrid |
endif |
566 |
c masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) |
enddo |
567 |
masse(ig,l)=(pplev(ig,l)-pplev(ig,l+1))/RG |
enddo |
568 |
enddo |
|
569 |
enddo |
print *, 'fin calcul fraca' |
570 |
|
|
571 |
print*,'12 OK convect8' |
! Calcul de fracd, wd |
572 |
c print*,'WA4 ',wa_moy |
! somme wa - wd = 0 |
573 |
cc------------------------------------------------------------------ |
|
574 |
c calcul du transport vertical |
do ig=1, ngrid |
575 |
c------------------------------------------------------------------ |
fm(ig, 1)=0. |
576 |
|
fm(ig, nlay+1)=0. |
577 |
go to 4444 |
enddo |
578 |
c print*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep |
|
579 |
do l=2,nlay-1 |
do l=2, nlay |
580 |
do ig=1,ngrid |
do ig=1, ngrid |
581 |
if(fm(ig,l+1)*ptimestep.gt.masse(ig,l) |
fm(ig, l)=fraca(ig, l)*wa_moy(ig, l)*rhobarz(ig, l) |
582 |
s .and.fm(ig,l+1)*ptimestep.gt.masse(ig,l+1)) then |
if (entr(ig, l-1).lt.1e-10.and.fm(ig, l).gt.fm(ig, l-1) & |
583 |
c print*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' |
.and.l.gt.lmix(ig)) then |
584 |
c s ,fm(ig,l+1)*ptimestep |
fm(ig, l)=fm(ig, l-1) |
585 |
c s ,' M=',masse(ig,l),masse(ig,l+1) |
endif |
586 |
endif |
enddo |
587 |
enddo |
do ig=1, ngrid |
588 |
enddo |
if(fracd(ig, l).lt.0.1) then |
589 |
|
stop'fracd trop petit' |
590 |
do l=1,nlay |
else |
591 |
do ig=1,ngrid |
! vitesse descendante "diagnostique" |
592 |
if(entr(ig,l)*ptimestep.gt.masse(ig,l)) then |
wd(ig, l)=fm(ig, l)/(fracd(ig, l)*rhobarz(ig, l)) |
593 |
c print*,'WARN!!! E>M ig=',ig,' l=',l,' E==' |
endif |
594 |
c s ,entr(ig,l)*ptimestep |
enddo |
595 |
c s ,' M=',masse(ig,l) |
enddo |
596 |
endif |
|
597 |
enddo |
do l=1, nlay |
598 |
enddo |
do ig=1, ngrid |
599 |
|
masse(ig, l)=(pplev(ig, l)-pplev(ig, l+1))/RG |
600 |
do l=1,nlay |
enddo |
601 |
do ig=1,ngrid |
enddo |
602 |
if(.not.fm(ig,l).ge.0..or..not.fm(ig,l).le.10.) then |
|
603 |
c print*,'WARN!!! fm exagere ig=',ig,' l=',l |
print *, '12 OK convect8' |
604 |
c s ,' FM=',fm(ig,l) |
|
605 |
endif |
! calcul du transport vertical |
606 |
if(.not.masse(ig,l).ge.1.e-10 |
|
607 |
s .or..not.masse(ig,l).le.1.e4) then |
!CR:redefinition du entr |
608 |
endif |
do l=1, nlay |
609 |
if(.not.entr(ig,l).ge.0..or..not.entr(ig,l).le.10.) then |
do ig=1, ngrid |
610 |
c print*,'WARN!!! entr exagere ig=',ig,' l=',l |
detr(ig, l)=fm(ig, l)+entr(ig, l)-fm(ig, l+1) |
611 |
c s ,' E=',entr(ig,l) |
if (detr(ig, l).lt.0.) then |
612 |
endif |
entr(ig, l)=entr(ig, l)-detr(ig, l) |
613 |
enddo |
detr(ig, l)=0. |
614 |
enddo |
endif |
615 |
|
enddo |
616 |
4444 continue |
enddo |
617 |
|
|
618 |
cCR:redefinition du entr |
if (w2di.eq.1) then |
619 |
do l=1,nlay |
fm0=fm0+ptimestep*(fm-fm0)/float(tho) |
620 |
do ig=1,ngrid |
entr0=entr0+ptimestep*(entr-entr0)/float(tho) |
621 |
detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1) |
else |
622 |
if (detr(ig,l).lt.0.) then |
fm0=fm |
623 |
entr(ig,l)=entr(ig,l)-detr(ig,l) |
entr0=entr |
624 |
detr(ig,l)=0. |
endif |
625 |
c print*,'WARNING !!! detrainement negatif ',ig,l |
|
626 |
endif |
if (1.eq.1) then |
627 |
enddo |
call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse & |
628 |
enddo |
, zh, zdhadj, zha) |
629 |
cRC |
call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse & |
630 |
if (w2di.eq.1) then |
, zo, pdoadj, zoa) |
631 |
fm0=fm0+ptimestep*(fm-fm0)/float(tho) |
else |
632 |
entr0=entr0+ptimestep*(entr-entr0)/float(tho) |
call dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca & |
633 |
else |
, zh, zdhadj, zha) |
634 |
fm0=fm |
call dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca & |
635 |
entr0=entr |
, zo, pdoadj, zoa) |
636 |
endif |
endif |
637 |
|
|
638 |
if (1.eq.1) then |
if (1.eq.0) then |
639 |
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
call dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse & |
640 |
. ,zh,zdhadj,zha) |
, fraca, zmax & |
641 |
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
, zu, zv, pduadj, pdvadj, zua, zva) |
642 |
. ,zo,pdoadj,zoa) |
else |
643 |
else |
call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse & |
644 |
call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca |
, zu, pduadj, zua) |
645 |
. ,zh,zdhadj,zha) |
call dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse & |
646 |
call dqthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca |
, zv, pdvadj, zva) |
647 |
. ,zo,pdoadj,zoa) |
endif |
648 |
endif |
|
649 |
|
do l=1, nlay |
650 |
if (1.eq.0) then |
do ig=1, ngrid |
651 |
call dvthermcell2(ngrid,nlay,ptimestep,fm0,entr0,masse |
zf=0.5*(fracc(ig, l)+fracc(ig, l+1)) |
652 |
. ,fraca,zmax |
zf2=zf/(1.-zf) |
653 |
. ,zu,zv,pduadj,pdvadj,zua,zva) |
thetath2(ig, l)=zf2*(zha(ig, l)-zh(ig, l))**2 |
654 |
else |
wth2(ig, l)=zf2*(0.5*(wa_moy(ig, l)+wa_moy(ig, l+1)))**2 |
655 |
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
enddo |
656 |
. ,zu,pduadj,zua) |
enddo |
657 |
call dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse |
|
658 |
. ,zv,pdvadj,zva) |
do l=1, nlay |
659 |
endif |
do ig=1, ngrid |
660 |
|
pdtadj(ig, l)=zdhadj(ig, l)*zpspsk(ig, l) |
661 |
do l=1,nlay |
enddo |
662 |
do ig=1,ngrid |
enddo |
663 |
zf=0.5*(fracc(ig,l)+fracc(ig,l+1)) |
|
664 |
zf2=zf/(1.-zf) |
print *, '14 OK convect8' |
665 |
thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2 |
|
666 |
wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2 |
! Calculs pour les sorties |
667 |
enddo |
|
668 |
enddo |
if(sorties) then |
669 |
|
do l=1, nlay |
670 |
|
do ig=1, ngrid |
671 |
|
zla(ig, l)=(1.-fracd(ig, l))*zmax(ig) |
672 |
c print*,'13 OK convect8' |
zld(ig, l)=fracd(ig, l)*zmax(ig) |
673 |
c print*,'WA5 ',wa_moy |
if(1.-fracd(ig, l).gt.1.e-10) & |
674 |
do l=1,nlay |
zwa(ig, l)=wd(ig, l)*fracd(ig, l)/(1.-fracd(ig, l)) |
675 |
do ig=1,ngrid |
enddo |
676 |
pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l) |
enddo |
677 |
enddo |
|
678 |
enddo |
isplit=isplit+1 |
679 |
|
endif |
680 |
|
|
681 |
c do l=1,nlay |
print *, '19 OK convect8' |
|
c do ig=1,ngrid |
|
|
c if(abs(pdtadj(ig,l))*86400..gt.500.) then |
|
|
c print*,'WARN!!! ig=',ig,' l=',l |
|
|
c s ,' pdtadj=',pdtadj(ig,l) |
|
|
c endif |
|
|
c if(abs(pdoadj(ig,l))*86400..gt.1.) then |
|
|
c print*,'WARN!!! ig=',ig,' l=',l |
|
|
c s ,' pdoadj=',pdoadj(ig,l) |
|
|
c endif |
|
|
c enddo |
|
|
c enddo |
|
|
|
|
|
print*,'14 OK convect8' |
|
|
c------------------------------------------------------------------ |
|
|
c Calculs pour les sorties |
|
|
c------------------------------------------------------------------ |
|
|
|
|
|
if(sorties) then |
|
|
do l=1,nlay |
|
|
do ig=1,ngrid |
|
|
zla(ig,l)=(1.-fracd(ig,l))*zmax(ig) |
|
|
zld(ig,l)=fracd(ig,l)*zmax(ig) |
|
|
if(1.-fracd(ig,l).gt.1.e-10) |
|
|
s zwa(ig,l)=wd(ig,l)*fracd(ig,l)/(1.-fracd(ig,l)) |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
cdeja fait |
|
|
c do l=1,nlay |
|
|
c do ig=1,ngrid |
|
|
c detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1) |
|
|
c if (detr(ig,l).lt.0.) then |
|
|
c entr(ig,l)=entr(ig,l)-detr(ig,l) |
|
|
c detr(ig,l)=0. |
|
|
c print*,'WARNING !!! detrainement negatif ',ig,l |
|
|
c endif |
|
|
c enddo |
|
|
c enddo |
|
|
|
|
|
c print*,'15 OK convect8' |
|
|
|
|
|
isplit=isplit+1 |
|
|
|
|
|
|
|
|
goto 123 |
|
|
123 continue |
|
|
|
|
|
endif |
|
|
|
|
|
c if(wa_moy(1,4).gt.1.e-10) stop |
|
|
|
|
|
print*,'19 OK convect8' |
|
|
return |
|
|
end |
|
|
|
|
|
subroutine dqthermcell(ngrid,nlay,ptimestep,fm,entr,masse |
|
|
. ,q,dq,qa) |
|
|
use dimens_m |
|
|
use dimphy |
|
|
implicit none |
|
|
|
|
|
c======================================================================= |
|
|
c |
|
|
c Calcul du transport verticale dans la couche limite en presence |
|
|
c de "thermiques" explicitement representes |
|
|
c calcul du dq/dt une fois qu'on connait les ascendances |
|
|
c |
|
|
c======================================================================= |
|
|
|
|
|
|
|
|
integer ngrid,nlay |
|
|
|
|
|
real ptimestep |
|
|
real, intent(in):: masse(ngrid,nlay) |
|
|
real fm(ngrid,nlay+1) |
|
|
real entr(ngrid,nlay) |
|
|
real q(ngrid,nlay) |
|
|
real dq(ngrid,nlay) |
|
|
|
|
|
real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1) |
|
|
|
|
|
integer ig,k |
|
|
|
|
|
c calcul du detrainement |
|
|
|
|
|
do k=1,nlay |
|
|
do ig=1,ngrid |
|
|
detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
c calcul de la valeur dans les ascendances |
|
|
do ig=1,ngrid |
|
|
qa(ig,1)=q(ig,1) |
|
|
enddo |
|
|
|
|
|
do k=2,nlay |
|
|
do ig=1,ngrid |
|
|
if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. |
|
|
s 1.e-5*masse(ig,k)) then |
|
|
qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k)) |
|
|
s /(fm(ig,k+1)+detr(ig,k)) |
|
|
else |
|
|
qa(ig,k)=q(ig,k) |
|
|
endif |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
do k=2,nlay |
|
|
do ig=1,ngrid |
|
|
c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) |
|
|
wqd(ig,k)=fm(ig,k)*q(ig,k) |
|
|
enddo |
|
|
enddo |
|
|
do ig=1,ngrid |
|
|
wqd(ig,1)=0. |
|
|
wqd(ig,nlay+1)=0. |
|
|
enddo |
|
|
|
|
|
do k=1,nlay |
|
|
do ig=1,ngrid |
|
|
dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k) |
|
|
s -wqd(ig,k)+wqd(ig,k+1)) |
|
|
s /masse(ig,k) |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
return |
|
|
end |
|
|
|
|
|
subroutine dqthermcell2(ngrid,nlay,ptimestep,fm,entr,masse,frac |
|
|
. ,q,dq,qa) |
|
|
use dimens_m |
|
|
use dimphy |
|
|
implicit none |
|
|
|
|
|
c======================================================================= |
|
|
c |
|
|
c Calcul du transport verticale dans la couche limite en presence |
|
|
c de "thermiques" explicitement representes |
|
|
c calcul du dq/dt une fois qu'on connait les ascendances |
|
|
c |
|
|
c======================================================================= |
|
|
|
|
|
|
|
|
integer ngrid,nlay |
|
|
|
|
|
real ptimestep |
|
|
real masse(ngrid,nlay),fm(ngrid,nlay+1) |
|
|
real entr(ngrid,nlay),frac(ngrid,nlay) |
|
|
real q(ngrid,nlay) |
|
|
real dq(ngrid,nlay) |
|
|
|
|
|
real qa(klon,klev),detr(klon,klev),wqd(klon,klev+1) |
|
|
real qe(klon,klev),zf,zf2 |
|
|
|
|
|
integer ig,k |
|
|
|
|
|
c calcul du detrainement |
|
|
|
|
|
do k=1,nlay |
|
|
do ig=1,ngrid |
|
|
detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
c calcul de la valeur dans les ascendances |
|
|
do ig=1,ngrid |
|
|
qa(ig,1)=q(ig,1) |
|
|
qe(ig,1)=q(ig,1) |
|
|
enddo |
|
|
|
|
|
do k=2,nlay |
|
|
do ig=1,ngrid |
|
|
if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. |
|
|
s 1.e-5*masse(ig,k)) then |
|
|
zf=0.5*(frac(ig,k)+frac(ig,k+1)) |
|
|
zf2=1./(1.-zf) |
|
|
qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+zf2*entr(ig,k)*q(ig,k)) |
|
|
s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2) |
|
|
qe(ig,k)=(q(ig,k)-zf*qa(ig,k))*zf2 |
|
|
else |
|
|
qa(ig,k)=q(ig,k) |
|
|
qe(ig,k)=q(ig,k) |
|
|
endif |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
do k=2,nlay |
|
|
do ig=1,ngrid |
|
|
c wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) |
|
|
wqd(ig,k)=fm(ig,k)*qe(ig,k) |
|
|
enddo |
|
|
enddo |
|
|
do ig=1,ngrid |
|
|
wqd(ig,1)=0. |
|
|
wqd(ig,nlay+1)=0. |
|
|
enddo |
|
|
|
|
|
do k=1,nlay |
|
|
do ig=1,ngrid |
|
|
dq(ig,k)=(detr(ig,k)*qa(ig,k)-entr(ig,k)*qe(ig,k) |
|
|
s -wqd(ig,k)+wqd(ig,k+1)) |
|
|
s /masse(ig,k) |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
return |
|
|
end |
|
|
subroutine dvthermcell2(ngrid,nlay,ptimestep,fm,entr,masse |
|
|
. ,fraca,larga |
|
|
. ,u,v,du,dv,ua,va) |
|
|
use dimens_m |
|
|
use dimphy |
|
|
implicit none |
|
|
|
|
|
c======================================================================= |
|
|
c |
|
|
c Calcul du transport verticale dans la couche limite en presence |
|
|
c de "thermiques" explicitement representes |
|
|
c calcul du dq/dt une fois qu'on connait les ascendances |
|
|
c |
|
|
c======================================================================= |
|
|
|
|
|
|
|
|
integer ngrid,nlay |
|
|
|
|
|
real ptimestep |
|
|
real masse(ngrid,nlay),fm(ngrid,nlay+1) |
|
|
real fraca(ngrid,nlay+1) |
|
|
real larga(ngrid) |
|
|
real entr(ngrid,nlay) |
|
|
real u(ngrid,nlay) |
|
|
real ua(ngrid,nlay) |
|
|
real du(ngrid,nlay) |
|
|
real v(ngrid,nlay) |
|
|
real va(ngrid,nlay) |
|
|
real dv(ngrid,nlay) |
|
|
|
|
|
real qa(klon,klev),detr(klon,klev),zf,zf2 |
|
|
real wvd(klon,klev+1),wud(klon,klev+1) |
|
|
real gamma0,gamma(klon,klev+1) |
|
|
real ue(klon,klev),ve(klon,klev) |
|
|
real dua,dva |
|
|
integer iter |
|
|
|
|
|
integer ig,k |
|
|
|
|
|
c calcul du detrainement |
|
|
|
|
|
do k=1,nlay |
|
|
do ig=1,ngrid |
|
|
detr(ig,k)=fm(ig,k)-fm(ig,k+1)+entr(ig,k) |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
c calcul de la valeur dans les ascendances |
|
|
do ig=1,ngrid |
|
|
ua(ig,1)=u(ig,1) |
|
|
va(ig,1)=v(ig,1) |
|
|
ue(ig,1)=u(ig,1) |
|
|
ve(ig,1)=v(ig,1) |
|
|
enddo |
|
|
|
|
|
do k=2,nlay |
|
|
do ig=1,ngrid |
|
|
if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. |
|
|
s 1.e-5*masse(ig,k)) then |
|
|
c On itère sur la valeur du coeff de freinage. |
|
|
c gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) |
|
|
gamma0=masse(ig,k) |
|
|
s *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) ) |
|
|
s *0.5/larga(ig) |
|
|
s *1. |
|
|
c s *0.5 |
|
|
c gamma0=0. |
|
|
zf=0.5*(fraca(ig,k)+fraca(ig,k+1)) |
|
|
zf=0. |
|
|
zf2=1./(1.-zf) |
|
|
c la première fois on multiplie le coefficient de freinage |
|
|
c par le module du vent dans la couche en dessous. |
|
|
dua=ua(ig,k-1)-u(ig,k-1) |
|
|
dva=va(ig,k-1)-v(ig,k-1) |
|
|
do iter=1,5 |
|
|
c On choisit une relaxation lineaire. |
|
|
gamma(ig,k)=gamma0 |
|
|
c On choisit une relaxation quadratique. |
|
|
gamma(ig,k)=gamma0*sqrt(dua**2+dva**2) |
|
|
ua(ig,k)=(fm(ig,k)*ua(ig,k-1) |
|
|
s +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k)) |
|
|
s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2 |
|
|
s +gamma(ig,k)) |
|
|
va(ig,k)=(fm(ig,k)*va(ig,k-1) |
|
|
s +(zf2*entr(ig,k)+gamma(ig,k))*v(ig,k)) |
|
|
s /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2 |
|
|
s +gamma(ig,k)) |
|
|
c print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva |
|
|
dua=ua(ig,k)-u(ig,k) |
|
|
dva=va(ig,k)-v(ig,k) |
|
|
ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2 |
|
|
ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2 |
|
|
enddo |
|
|
else |
|
|
ua(ig,k)=u(ig,k) |
|
|
va(ig,k)=v(ig,k) |
|
|
ue(ig,k)=u(ig,k) |
|
|
ve(ig,k)=v(ig,k) |
|
|
gamma(ig,k)=0. |
|
|
endif |
|
|
enddo |
|
|
enddo |
|
|
|
|
|
do k=2,nlay |
|
|
do ig=1,ngrid |
|
|
wud(ig,k)=fm(ig,k)*ue(ig,k) |
|
|
wvd(ig,k)=fm(ig,k)*ve(ig,k) |
|
|
enddo |
|
|
enddo |
|
|
do ig=1,ngrid |
|
|
wud(ig,1)=0. |
|
|
wud(ig,nlay+1)=0. |
|
|
wvd(ig,1)=0. |
|
|
wvd(ig,nlay+1)=0. |
|
|
enddo |
|
|
|
|
|
do k=1,nlay |
|
|
do ig=1,ngrid |
|
|
du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k) |
|
|
s -(entr(ig,k)+gamma(ig,k))*ue(ig,k) |
|
|
s -wud(ig,k)+wud(ig,k+1)) |
|
|
s /masse(ig,k) |
|
|
dv(ig,k)=((detr(ig,k)+gamma(ig,k))*va(ig,k) |
|
|
s -(entr(ig,k)+gamma(ig,k))*ve(ig,k) |
|
|
s -wvd(ig,k)+wvd(ig,k+1)) |
|
|
s /masse(ig,k) |
|
|
enddo |
|
|
enddo |
|
682 |
|
|
683 |
return |
end SUBROUTINE thermcell |
|
end |
|