GCC Code Coverage Report


Directory: ./
File: phys/cvltr_spl.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 258 0.0%
Branches: 0 246 0.0%

Line Branch Exec Source
1 !
2 ! $Id $
3 !
4 ✗ SUBROUTINE cvltr_spl(pdtime, da, phi,phi2,d1a,dam, mpIN,epIN, &
5 sigd,sij,wght_cvfd,clw,elij,epmlmMm,eplaMm, &
6 pmflxrIN,pmflxsIN,ev,te,wdtrainA,wdtrainM, &
7 paprs,it,tr,upd,dnd,inb,icb, &
8 kk,henry,zrho, ccntrAA_spla,ccntrENV_spla,coefcoli_spla, &
9 id_prec,id_fine,id_coss, id_codu, id_scdu, &
10 dtrcv,trsptd,dtrSscav,dtrsat,dtrUscav,qDi,qPr, &
11 ✗ qPa,qMel,qTrdi,dtrcvMA,Mint, &
12 ✗ zmfd1a,zmfphi2,zmfdam)
13 USE IOIPSL
14 USE dimphy
15 USE infotrac_phy, ONLY : nbtr,tname
16 IMPLICIT NONE
17 !=====================================================================
18 ! Objet : convection des traceurs / KE
19 ! Auteurs: M-A Filiberti and J-Y Grandpeix
20 ! modifiee par R Pilon : lessivage des traceurs / KE
21 !=====================================================================
22
23 include "YOMCST.h"
24 include "YOECUMF.h"
25 include "conema3.h"
26 include "chem.h"
27
28 ! Entree
29 REAL,INTENT(IN) :: pdtime
30 REAL,DIMENSION(klon,klev),INTENT(IN) :: da
31 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: phi
32 ! RomP
33 REAL,DIMENSION(klon,klev),INTENT(IN) :: d1a,dam ! matrices pour simplifier
34 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: phi2 ! l'ecriture des tendances
35 !
36 REAL,DIMENSION(klon,klev),INTENT(IN) :: mpIN
37 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs ! pression aux 1/2 couches (bas en haut)
38 ! REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression aux 1/2 couches (bas en haut)
39 REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr ! q de traceur (bas en haut)
40 INTEGER,INTENT(IN) :: it
41 REAL,DIMENSION(klon,klev),INTENT(IN) :: upd ! saturated updraft mass flux
42 REAL,DIMENSION(klon,klev),INTENT(IN) :: dnd ! saturated downdraft mass flux
43 !
44 REAL,DIMENSION(klon,klev),INTENT(IN) :: wdtrainA ! masses precipitantes de l'asc adiab
45 REAL,DIMENSION(klon,klev),INTENT(IN) :: wdtrainM ! masses precipitantes des melanges
46 !JE REAL,DIMENSION(klon,klev),INTENT(IN) :: pmflxrIN ! vprecip: eau
47 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: pmflxrIN ! vprecip: eau
48 !JE REAL,DIMENSION(klon,klev),INTENT(IN) :: pmflxsIN ! vprecip: neige
49 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: pmflxsIN ! vprecip: neige
50 REAL,DIMENSION(klon,klev),INTENT(IN) :: ev ! evaporation cv30_routine
51 REAL,DIMENSION(klon,klev),INTENT(IN) :: epIN
52 REAL,DIMENSION(klon,klev),INTENT(IN) :: te
53 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: sij ! fraction dair de lenv
54 REAL,DIMENSION(klon,klev),INTENT(IN) :: wght_cvfd ! weights of the layers feeding convection
55 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: elij ! contenu en eau condensée spécifique/conc deau condensée massique
56 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: epmlmMm ! eau condensee precipitee dans mel masse dair sat
57 REAL,DIMENSION(klon,klev),INTENT(IN) :: eplaMm ! eau condensee precipitee dans aa masse dair sat
58
59 REAL,DIMENSION(klon,klev),INTENT(IN) :: clw ! contenu en eau condensée dans lasc adiab
60 REAL,DIMENSION(klon),INTENT(IN) :: sigd
61 INTEGER,DIMENSION(klon),INTENT(IN) :: icb,inb
62 ! Sortie
63 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: dtrcv ! tendance totale (bas en haut)
64 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: dtrcvMA ! M-A Filiberti
65 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: trsptd ! tendance du transport
66 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: dtrSscav ! tendance du lessivage courant sat
67 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: dtrsat ! tendance trsp+sat scav
68 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: dtrUscav ! tendance du lessivage courant unsat
69 !
70 ! Variables locales
71 INTEGER :: i,j,k
72 ✗ REAL,DIMENSION(klon,klev) :: dxpres ! difference de pression entre niveau (j+1) et (j)
73 REAL :: pdtimeRG ! pas de temps * gravite
74 ✗ REAL,DIMENSION(klon,nbtr) :: qfeed ! tracer concentration feeding convection
75 ! variables pour les courants satures
76 ✗ REAL,DIMENSION(klon,klev,klev) :: zmd
77 ✗ REAL,DIMENSION(klon,klev,klev) :: za
78 ✗ REAL,DIMENSION(klon,klev,nbtr) :: zmfd,zmfa
79 ✗ REAL,DIMENSION(klon,klev,nbtr) :: zmfp,zmfu
80
81 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: zmfd1a
82 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: zmfdam
83 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: zmfphi2
84
85 ! RomP ! les variables sont nettoyees des valeurs aberrantes
86 ✗ REAL,DIMENSION(klon,klev) :: Pa, Pm ! pluie AA et mélanges, var temporaire
87 ✗ REAL,DIMENSION(klon,klev) :: pmflxs,pmflxr ! pmflxrIN,pmflxsIN sans valeur aberante
88 ✗ REAL,DIMENSION(klon,klev) :: mp ! flux de masse
89 ✗ REAL,DIMENSION(klon,klev) :: ep ! fraction d'eau convertie en precipitation
90 ✗ REAL,DIMENSION(klon,klev) :: evap ! evaporation : variable temporaire
91 REAL,DIMENSION(klon,klev) :: rho !environmental density
92
93 ✗ REAL,DIMENSION(klon,klev) :: kappa ! denominateur du au calcul de la matrice
94 ! pour obtenir qd et qp
95 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: qTrdi ! traceurs descente air insature transport MA
96 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: qDi ! traceurs descente insaturees
97 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: qPr ! traceurs colonne precipitante
98 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: qPa ! traceurs dans les precip issues lasc. adiab.
99 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: qMel ! traceurs dans les precip issues des melanges
100 ✗ REAL,DIMENSION(klon,klev,nbtr) :: qMeltmp ! variable temporaire
101 ✗ REAL,DIMENSION(klon,klev,nbtr) :: qpmMint
102 REAL,DIMENSION(klon,klev),INTENT(OUT) :: Mint
103 ! tendances
104 REAL :: tdcvMA ! terme de transport de traceur (schema Marie Angele)
105 REAL :: trsptrac ! terme de transport de traceur par l'air
106 REAL :: scavtrac ! terme de lessivage courant sature
107 REAL :: uscavtrac ! terme de lessivage courant insature
108 ! impaction
109 !!! Correction apres discussion Romain P. / Olivier B.
110 !!! REAL,PARAMETER :: rdrop=2.5e-3 ! rayon des gouttes d'eau
111 REAL,PARAMETER :: rdrop=1.e-3 ! rayon des gouttes d'eau
112 !!!
113 ✗ REAL,DIMENSION(klon,klev) :: imp ! coefficient d'impaction
114 ! parametres lessivage
115 REAL :: ccntrAA_coef ! \alpha_a : fract aerosols de l'AA convertis en CCN
116 REAL :: ccntrENV_coef ! \beta_m : fract aerosols de l'env convertis en CCN
117 REAL :: coefcoli ! coefficient de collision des gouttes sur les aerosols
118 !
119 ✗ LOGICAL,DIMENSION(klon,klev) :: NO_precip
120 ! LOGICAL :: scavON
121 ! var tmp tests
122 REAL :: conserv
123 real :: conservMA
124 ! JE SPLA adaptation
125
126 INTEGER :: id_prec,id_fine,id_coss, id_codu, id_scdu
127 REAL,DIMENSION(nbtr) :: ccntrAA_spla,ccntrENV_spla,coefcoli_spla
128 ✗ REAL,DIMENSION(klon,klev) :: ccntrAA_coef3d
129 ✗ REAL,DIMENSION(klon,klev) :: ccntrENV_coef3d
130 ✗ REAL,DIMENSION(klon,klev) :: coefcoli3d
131
132 REAL,DIMENSION(nbtr) :: henry !--cste de Henry mol/l/atm
133 REAL,DIMENSION(nbtr) :: kk !--coefficient de var avec T (K)
134 REAL :: henry_t !--constante de Henry a T t (mol/l/atm)
135 REAL :: f_a !--rapport de la phase aqueuse a la phase gazeuse
136
137 REAL, PARAMETER :: ph=5.
138 REAL :: K1, K2
139 REAL,DIMENSION(klon,klev) :: zrho
140 REAL, PARAMETER :: qliq=1.e-3 ! CONVECTIVE ONLY
141
142 ! Je end 20140105
143
144 !JE20140724<<
145 !JE SPLA adapt:
146 !
147 !
148 !! coefficient lessivage
149 ! ccntrAA_coef = 0.
150 ! ccntrENV_coef = 0.
151 ! coefcoli = 0.
152 !
153 !!$OMP MASTER
154 ! call getin('ccntrAA_coef',ccntrAA_coef)
155 ! call getin('ccntrENV_coef',ccntrENV_coef)
156 ! call getin('coefcoli',coefcoli)
157 !!$OMP END MASTER
158 !!$OMP BARRIER
159 !!! JE
160 ! do j=1,klev
161 ! do i=1,klon
162 ! imp(i,j)=0.
163 ! ccntrAA_coef3d(i,j)=ccntrAA_coef
164 ! ccntrENV_coef3d(i,j)=ccntrENV_coef
165 ! coefcoli3d(i,j)=coefcoli
166 ! enddo
167 ! enddo
168 !
169 !
170 !!! for SPLA
171 !!!JEend
172 ! print*,'cvltr coef lessivage convectif', ccntrAA_coef,ccntrENV_coef,coefcoli
173 !
174 !JE20140724>>
175
176 ! scavON=.TRUE.
177 ! if(scavON) then
178 ! ccntrAA_coef = 1.
179 ! ccntrENV_coef = 1.
180 ! coefcoli = 1.
181 ! else
182 ! ccntrAA_coef = 0.
183 ! ccntrENV_coef = 0.
184 ! coefcoli = 0.
185 ! endif
186
187 ! ======================================================
188 ! calcul de l'impaction
189 ! ======================================================
190 !initialisation
191 ✗ do j=1,klev
192 ✗ do i=1,klon
193 ✗ imp(i,j)=0.
194 enddo
195 enddo
196 !JE init 20140103
197 !! impaction sur la surface de la colonne de la descente insaturee
198 !! On prend la moyenne des precip entre le niveau i+1 et i
199 !! I=3/4* (P(1+1)+P(i))/2 / (sigd*r*rho_l)
200 !! 1000kg/m3= densité de l'eau
201 !! 0.75e-3 = 3/4 /1000
202 !! Par la suite, I est tout le temps multiplié par sig_d pour avoir l'impaction sur la surface de la maille
203 !! on le néglige ici pour simplifier le code
204 ! do j=1,klev-1
205 ! do i=1,klon
206 ! imp(i,j) = coefcoli*0.75e-3/rdrop *&
207 ! 0.5*(pmflxr(i,j+1)+pmflxs(i,j+1)+pmflxr(i,j)+pmflxs(i,j))
208 !! rho(i,j)=pplay(i,j)/(rd*te(i,j))
209 ! enddo
210 ! enddo
211 !JE end 20140103
212
213 !
214 ! initialisation pour flux de traceurs, td et autre
215 trsptrac = 0.
216 scavtrac = 0.
217 uscavtrac = 0.
218 ✗ qfeed(:,it) = 0. !RL
219 ✗ DO j=1,klev
220 ✗ DO i=1,klon
221 ✗ zmfd(i,j,it)=0.
222 ✗ zmfa(i,j,it)=0.
223 ✗ zmfu(i,j,it)=0.
224 ✗ zmfp(i,j,it)=0.
225 ✗ zmfphi2(i,j,it)=0.
226 ✗ zmfd1a(i,j,it)=0.
227 ✗ zmfdam(i,j,it)=0.
228 ✗ qDi(i,j,it)=0.
229 ✗ qPr(i,j,it)=0.
230 ✗ qPa(i,j,it)=0.
231 ✗ qMel(i,j,it)=0.
232 ✗ qMeltmp(i,j,it)=0.
233 ✗ qTrdi(i,j,it)=0.
234 ✗ kappa(i,j)=0.
235 ✗ trsptd(i,j,it)=0.
236 ✗ dtrsat(i,j,it)=0.
237 ✗ dtrSscav(i,j,it)=0.
238 ✗ dtrUscav(i,j,it)=0.
239 ✗ dtrcv(i,j,it)=0.
240 ✗ dtrcvMA(i,j,it)=0.
241 ✗ evap(i,j)=0.
242 ✗ dxpres(i,j)=0.
243 ✗ qpmMint(i,j,it)=0.
244 ✗ Mint(i,j)=0.
245 END DO
246 END DO
247
248 ! suppression des valeurs très faibles (~1e-320)
249 ! multiplication de levaporation pour lavoir par unite de temps
250 ! et par unite de surface de la maille
251 ! -> cv30_unsat : evap : masse evaporee/s/(m2 de la descente)
252 ✗ DO j=1,klev
253 ✗ DO i=1,klon
254 ✗ if(ev(i,j).lt.1.e-16) then
255 ✗ evap(i,j)=0.
256 else
257 ✗ evap(i,j)=ev(i,j)*sigd(i)
258 endif
259 END DO
260 END DO
261
262 ✗ DO j=1,klev
263 ✗ DO i=1,klon
264 ✗ if(j.lt.klev) then
265 ✗ if(epIN(i,j).lt.1.e-32) then
266 ✗ ep(i,j)=0.
267 else
268 ✗ ep(i,j)=epIN(i,j)
269 endif
270 else
271 ✗ ep(i,j)=epmax
272 endif
273 ✗ if(mpIN(i,j).lt.1.e-32) then
274 ✗ mp(i,j)=0.
275 else
276 ✗ mp(i,j)=mpIN(i,j)
277 endif
278 ✗ if(pmflxsIN(i,j).lt.1.e-32) then
279 ✗ pmflxs(i,j)=0.
280 else
281 ✗ pmflxs(i,j)=pmflxsIN(i,j)
282 endif
283 ✗ if(pmflxrIN(i,j).lt.1.e-32) then
284 ✗ pmflxr(i,j)=0.
285 else
286 ✗ pmflxr(i,j)=pmflxrIN(i,j)
287 endif
288 ✗ if(wdtrainA(i,j).lt.1.e-32) then
289 ✗ Pa(i,j)=0.
290 else
291 ✗ Pa(i,j)=wdtrainA(i,j)
292 endif
293 ✗ if(wdtrainM(i,j).lt.1.e-32) then
294 ✗ Pm(i,j)=0.
295 else
296 ✗ Pm(i,j)=wdtrainM(i,j)
297 endif
298 END DO
299 END DO
300
301 !==========================================
302 ✗ DO j = klev-1,1,-1
303 ✗ DO i = 1,klon
304 NO_precip(i,j) = (pmflxr(i,j+1)+pmflxs(i,j+1)).lt.1.e-10&
305 ✗ .and.Pa(i,j).lt.1.e-10.and.Pm(i,j).lt.1.e-10
306 END DO
307 END DO
308 !==============================================================================
309 ! JE SPLA: Calc of ccntrAA_coef,ccntrENV_coef, coefcoli for SPLA aerosols and
310 ! precursors. From SPLA code inscav_spl.F
311 !print *,'Using SPLA values for cvltr_spl ccntr and coefcoli params'
312 !
313 !
314 !IF (it.EQ.2) THEN !--fine aerosol
315 ! DO j=1,klev
316 ! DO i=1,klon
317 ! ccntrAA_coef3d(i,j)=0.7
318 ! ccntrENV_coef3d(i,j)=0.7
319 ! coefcoli3d(i,j)=0.001
320 ! ENDDO
321 ! ENDDO
322 !ELSEIF (it.EQ.3) THEN !-- Coarse Sea salt aerosol
323 ! DO j=1,klev
324 ! DO i=1,klon
325 ! ccntrAA_coef3d(i,j)=1.0
326 ! ccntrENV_coef3d(i,j)=1.0
327 ! coefcoli3d(i,j)=0.001
328 ! ENDDO
329 ! ENDDO
330 !
331 !ELSEIF (it.EQ.4) THEN !--Coarse Dust aerosol
332 ! DO j=1,klev
333 ! DO i=1,klon
334 ! ccntrAA_coef3d(i,j)=0.7
335 ! ccntrENV_coef3d(i,j)=0.7
336 ! coefcoli3d(i,j)=0.001
337 !
338 ! ENDDO
339 ! ENDDO
340 ! Gas precursor: Henry's law
341
342 ✗ IF (it .EQ. id_prec) THEN
343 ✗ DO k=1, klev
344 ✗ DO i=1, klon
345 ✗ henry_t=henry(it)*exp(-kk(it)*(1./298.-1./te(i,k))) !--mol/l/atm
346 ✗ K1=1.2e-2*exp(-2010*(1/298.-1/te(i,k)))
347 ✗ K2=6.6e-8*exp(-1510*(1/298.-1/te(i,k)))
348 ✗ henry_t=henry_t*(1. + K1/10.**(-ph) + K1*K2/(10.**(-ph))**2)
349 ✗ f_a=henry_t/101.325*R*te(i,k)*qliq*zrho(i,k)/rho_water
350 ! scav(i,k)=f_a/(1.+f_a)
351 ✗ ccntrAA_coef3d(i,k)= f_a/(1.+f_a)
352 ✗ ccntrENV_coef3d(i,k)= f_a/(1.+f_a)
353 ✗ coefcoli3d(i,k)=0.0
354 ENDDO
355 ENDDO
356 ! CALL minmaxqfi2(clw,1.e33,-1.e33,'minmax clw')
357 ELSE
358 ✗ DO j=1,klev
359 ✗ DO i=1,klon
360 ✗ ccntrAA_coef3d(i,j)=ccntrAA_spla(it)
361 ✗ ccntrENV_coef3d(i,j)=ccntrENV_spla(it)
362 ✗ coefcoli3d(i,j)=coefcoli_spla(it)
363 ENDDO
364 ENDDO
365
366
367 ENDIF
368
369 ! JE end SPLA modifs in ccn parameters
370 !==============================================================================
371
372
373
374
375 !JE init 20140103
376 ! impaction sur la surface de la colonne de la descente insaturee
377 ! On prend la moyenne des precip entre le niveau i+1 et i
378 ! I=3/4* (P(1+1)+P(i))/2 / (sigd*r*rho_l)
379 ! 1000kg/m3= densité de l'eau
380 ! 0.75e-3 = 3/4 /1000
381 ! Par la suite, I est tout le temps multiplié par sig_d pour avoir l'impaction sur la surface de la maille
382 ! on le néglige ici pour simplifier le code
383 ✗ do j=1,klev-1
384 ✗ do i=1,klon
385 !JE imp(i,j) = coefcoli*0.75e-3/rdrop *&
386 !JE 0.5*(pmflxr(i,j+1)+pmflxs(i,j+1)+pmflxr(i,j)+pmflxs(i,j))
387 imp(i,j) = coefcoli3d(i,j)*0.75e-3/rdrop *&
388 ✗ 0.5*(pmflxr(i,j+1)+pmflxs(i,j+1)+pmflxr(i,j)+pmflxs(i,j))
389 ! rho(i,j)=pplay(i,j)/(rd*te(i,j))
390 enddo
391 enddo
392 !JE end 20140103
393
394
395 ! =========================================
396 ! calcul des tendances liees au downdraft
397 ! =========================================
398 !cdir collapse
399 ✗ DO k=1,klev
400 ✗ DO j=1,klev
401 ✗ DO i=1,klon
402 ✗ zmd(i,j,k)=0.
403 ✗ za (i,j,k)=0.
404 END DO
405 END DO
406 END DO
407 ! calcul de la matrice d echange
408 ! matrice de distribution de la masse entrainee en k
409 ! commmentaire RomP : mp > 0
410 ✗ DO k=1,klev-1
411 ✗ DO i=1,klon
412 ✗ zmd(i,k,k)=max(0.,mp(i,k)-mp(i,k+1)) ! ~ mk(k)
413 END DO
414 END DO
415 ✗ DO k=2,klev
416 ✗ DO j=k-1,1,-1
417 ✗ DO i=1,klon
418 ✗ if(mp(i,j+1).gt.1.e-10) then
419 ✗ zmd(i,j,k)=zmd(i,j+1,k)*min(1.,mp(i,j)/mp(i,j+1)) !det ~ mk(j)=mk(j+1)*mp(i,j)/mp(i,j+1)
420 ENDif
421 END DO
422 END DO
423 END DO
424 ✗ DO k=1,klev
425 ✗ DO j=1,klev-1
426 ✗ DO i=1,klon
427 ✗ za(i,j,k)=max(0.,zmd(i,j+1,k)-zmd(i,j,k))
428 END DO
429 END DO
430 END DO
431 !!!!! quantite de traceur dans la descente d'air insaturee : 4 juin 2012
432 ✗ DO k=1,klev
433 ✗ DO j=1,klev-1
434 ✗ DO i=1,klon
435 ✗ if(mp(i,j+1).gt.1.e-10) then
436 ✗ qTrdi(i,j+1,it)=qTrdi(i,j+1,it)+(zmd(i,j+1,k)/mp(i,j+1))*tr(i,k,it)
437 else
438 ✗ qTrdi(i,j,it)=0.!tr(i,j,it)
439 endif
440 ENDDO
441 ENDDO
442 ENDDO
443 !!!!!
444 !
445 ! rajout du terme lie a l ascendance induite
446 !
447 ✗ DO j=2,klev
448 ✗ DO i=1,klon
449 ✗ za(i,j,j-1)=za(i,j,j-1)+mp(i,j)
450 END DO
451 END DO
452 !
453 ! tendance courants insatures ! sans lessivage ancien schema
454 !
455 ✗ DO k=1,klev
456 ✗ DO j=1,klev
457 ✗ DO i=1,klon
458 ✗ zmfd(i,j,it)=zmfd(i,j,it)+za(i,j,k)*(tr(i,k,it)-tr(i,j,it))
459 END DO
460 END DO
461 END DO
462 !
463 ! =========================================
464 ! calcul des tendances liees aux courants satures j <-> z ; k <-> z'
465 ! =========================================
466 !RL
467 ! Feeding concentrations
468 ✗ DO j=1,klev
469 ✗ DO i=1,klon
470 ✗ qfeed(i,it)=qfeed(i,it)+wght_cvfd(i,j)*tr(i,j,it)
471 END DO
472 END DO
473 !RL
474 !
475 ✗ DO j=1,klev
476 ✗ DO i=1,klon
477 !RL
478 !! zmfa(i,j,it)=da(i,j)*(tr(i,1,it)-tr(i,j,it)) ! da
479 ✗ zmfa(i,j,it)=da(i,j)*(qfeed(i,it)-tr(i,j,it)) ! da
480 !RL
481 END DO
482 END DO
483 !
484 ✗ DO k=1,klev
485 ✗ DO j=1,klev
486 ✗ DO i=1,klon
487 ✗ zmfp(i,j,it)=zmfp(i,j,it)+phi(i,j,k)*(tr(i,k,it)-tr(i,j,it)) ! phi
488 END DO
489 END DO
490 END DO
491 ! RomP ajout des matrices liees au lessivage
492 ✗ DO j=1,klev
493 ✗ DO i=1,klon
494 ✗ zmfd1a(i,j,it)=d1a(i,j)*tr(i,1,it) ! da1
495 ✗ zmfdam(i,j,it)=dam(i,j)*tr(i,1,it) ! dam
496 END DO
497 END DO
498 ✗ DO k=1,klev
499 ✗ DO j=1,klev
500 ✗ DO i=1,klon
501 ✗ zmfphi2(i,j,it)=zmfphi2(i,j,it)+phi2(i,j,k)*tr(i,k,it) ! psi
502 END DO
503 END DO
504 END DO
505 ✗ DO j=1,klev-1
506 ✗ DO i=1,klon
507 ✗ zmfu(i,j,it)=max(0.,upd(i,j+1)+dnd(i,j+1))*(tr(i,j+1,it)-tr(i,j,it))
508 END DO
509 END DO
510 ✗ DO j=2,klev
511 ✗ DO i=1,klon
512 ✗ zmfu(i,j,it)=zmfu(i,j,it)+min(0.,upd(i,j)+dnd(i,j))*(tr(i,j,it)-tr(i,j-1,it))
513 END DO
514 END DO
515 ! ===================================================
516 ! calcul des tendances liees aux courants insatures
517 ! ===================================================
518 ! pression
519 ✗ DO k=1, klev
520 ✗ DO i=1, klon
521 ✗ dxpres(i,k)=paprs(i,k)-paprs(i,k+1)
522 ENDDO
523 ENDDO
524 ✗ pdtimeRG=pdtime*RG
525
526 ! q_pa et q_pm traceurs issues des courants satures se retrouvant dans les precipitations
527 ✗ DO j=1,klev
528 ✗ DO i=1,klon
529 ✗ if(j.ge.icb(i).and.j.le.inb(i)) then
530 ✗ if(clw(i,j).gt.1.e-16) then
531 ! qPa(i,j,it)=ccntrAA_coef*tr(i,1,it)/clw(i,j)
532 ✗ qPa(i,j,it)=ccntrAA_coef3d(i,j)*tr(i,1,it)/clw(i,j)
533 else
534 ✗ qPa(i,j,it)=0.
535 endif
536 endif
537 END DO
538 END DO
539
540 ! calcul de q_pm en 2 parties :
541 ! 1) calcul de sa valeur pour un niveau z' donne
542 ! 2) integration sur la verticale sur z'
543 ✗ DO j=1,klev
544 ✗ DO k=1,j-1
545 ✗ DO i=1,klon
546 ✗ if(k.ge.icb(i).and.k.le.inb(i).and.&
547 ✗ j.le.inb(i)) then
548 ✗ if(elij(i,k,j).gt.1.e-16) then
549 !JE qMeltmp(i,j,it)=((1-ep(i,k))*ccntrAA_coef*tr(i,1,it)&
550 !JE *(1.-sij(i,k,j)) +ccntrENV_coef&
551 !JE *tr(i,k,it)*sij(i,k,j)) / elij(i,k,j)
552 qMeltmp(i,j,it)=((1-ep(i,k))*ccntrAA_coef3d(i,k)*tr(i,1,it)&
553 *(1.-sij(i,k,j)) +ccntrENV_coef3d(i,k)&
554 ✗ *tr(i,k,it)*sij(i,k,j)) / elij(i,k,j)
555 else
556 ✗ qMeltmp(i,j,it)=0.
557 endif
558 ✗ qpmMint(i,j,it)=qpmMint(i,j,it) + qMeltmp(i,j,it)*epmlmMm(i,j,k)
559 ✗ Mint(i,j)=Mint(i,j) + epmlmMm(i,j,k)
560 endif ! end if dans nuage
561 END DO
562 END DO
563 END DO
564
565 ✗ DO j=1,klev
566 ✗ DO i=1,klon
567 ✗ if(Mint(i,j).gt.1.e-16) then
568 ✗ qMel(i,j,it)=qpmMint(i,j,it)/Mint(i,j)
569 else
570 ✗ qMel(i,j,it)=0.
571 endif
572 END DO
573 END DO
574
575 ! calcul de q_d et q_p traceurs de la descente precipitante
576 ✗ DO j=klev-1,1,-1
577 ✗ DO i=1,klon
578 ✗ if(mp(i,j+1).gt.mp(i,j).and.mp(i,j+1).gt.1.e-10) then ! detrainement
579 kappa(i,j)=((pmflxr(i,j+1)+pmflxs(i,j+1)+Pa(i,j)+Pm(i,j))*&
580 (-mp(i,j+1)-imp(i,j)/RG*dxpres(i,j))&
581 ✗ + (imp(i,j)/RG*dxpres(i,j))*(evap(i,j)/RG*dxpres(i,j)))
582
583 ✗ elseif(mp(i,j).gt.mp(i,j+1).and.mp(i,j).gt.1.e-10) then! entrainement
584 ✗ if(j.eq.1) then
585 kappa(i,j)=((pmflxr(i,j+1)+pmflxs(i,j+1)+Pa(i,j)+Pm(i,j))*&
586 (-mp(i,2)-imp(i,j)/RG*dxpres(i,j))&
587 ✗ + (imp(i,j)/RG*dxpres(i,j))*(evap(i,j)/RG*dxpres(i,j)))
588 else
589 kappa(i,j)=((pmflxr(i,j+1)+pmflxs(i,j+1)+Pa(i,j)+Pm(i,j))*&
590 (-mp(i,j)-imp(i,j)/RG*dxpres(i,j))&
591 ✗ + (imp(i,j)/RG*dxpres(i,j))*(evap(i,j)/RG*dxpres(i,j)))
592 endif
593 else
594 ✗ kappa(i,j)=1.
595 endif
596 ENDDO
597 ENDDO
598
599 ✗ DO j=klev-1,1,-1
600 ✗ DO i=1,klon
601 ✗ if (abs(kappa(i,j)).lt.1.e-25) then !si denominateur nul (il peut y avoir des mp!=0)
602 ✗ kappa(i,j)=1.
603 ✗ if(j.eq.1) then
604 ✗ qDi(i,j,it)=qDi(i,j+1,it) !orig tr(i,j,it) ! mp(1)=0 donc tout vient de la couche supérieure
605 ✗ elseif(mp(i,j+1).gt.mp(i,j).and.mp(i,j+1).gt.1.e-10) then
606 ✗ qDi(i,j,it)=qDi(i,j+1,it)
607 ✗ elseif(mp(i,j).gt.mp(i,j+1).and.mp(i,j).gt.1.e-10) then! entrainement
608 ✗ qDi(i,j,it)=(-mp(i,j+1)*(qDi(i,j+1,it)-tr(i,j,it))-mp(i,j)*tr(i,j,it))/(-mp(i,j))
609 else ! si mp (i)=0 et mp(j+1)=0
610 ✗ qDi(i,j,it)=tr(i,j,it) ! orig 0.
611 endif
612
613 ✗ if(NO_precip(i,j)) then
614 ✗ qPr(i,j,it)=0.
615 else
616 qPr(i,j,it)=((pmflxr(i,j+1)+pmflxs(i,j+1))*qPr(i,j+1,it)+&
617 Pa(i,j)*qPa(i,j,it)+Pm(i,j)*qMel(i,j,it)&
618 +imp(i,j)/RG*dxpres(i,j)*qDi(i,j,it))/&
619 ✗ (pmflxr(i,j+1)+pmflxs(i,j+1)+Pa(i,j)+Pm(i,j))
620 endif
621 else ! denominateur non nul
622 ✗ kappa(i,j)=1./kappa(i,j)
623 ! calcul de qd et qp
624 !!jyg (20130119) correction pour le sommet du nuage
625 !! if(j.ge.inb(i)) then !au-dessus du nuage, sommet inclu
626 ✗ if(j.gt.inb(i)) then !au-dessus du nuage
627 ✗ qDi(i,j,it)=tr(i,j,it) ! pas de descente => environnement = descente insaturee
628 ✗ qPr(i,j,it)=0.
629
630 ! vvv premiere couche du modele ou mp(1)=0 ! det tout le temps vvv
631 ✗ elseif(j.eq.1) then
632 ✗ if(mp(i,2).gt.1.e-10) then !mp(2) non nul -> detrainement (car mp(1) = 0) !ent pas possible
633 ✗ if(NO_precip(i,j)) then !pas de precip en (i)
634 ✗ qDi(i,j,it)=qDi(i,j+1,it)
635 ✗ qPr(i,j,it)=0.
636 else
637 qDi(i,j,it)=kappa(i,j)*(&
638 (-evap(i,j)/RG*dxpres(i,j))*((pmflxr(i,j+1)+pmflxs(i,j+1))*qPr(i,j+1,it)+&
639 Pa(i,j)*qPa(i,j,it)+Pm(i,j)*qMel(i,j,it)) +&
640 (pmflxr(i,j+1)+pmflxs(i,j+1)+Pa(i,j)+Pm(i,j))*&
641 ✗ (-mp(i,j+1)*qDi(i,j+1,it)))
642
643 qPr(i,j,it)=kappa(i,j)*(&
644 (-mp(i,j+1)-imp(i,j)/RG*dxpres(i,j))*&
645 ((pmflxr(i,j+1)+pmflxs(i,j+1))*qPr(i,j+1,it)+&
646 Pa(i,j)*qPa(i,j,it)+Pm(i,j)*qMel(i,j,it))&
647 ✗ +(-mp(i,j+1)*qDi(i,j+1,it)) * (imp(i,j)/RG*dxpres(i,j)))
648 endif
649
650 else !mp(2) nul -> plus de descente insaturee -> pluie agit sur environnement
651 ✗ qDi(i,j,it)=tr(i,j,it) ! orig 0.
652 ✗ if(NO_precip(i,j)) then
653 ✗ qPr(i,j,it)=0.
654 else
655 qPr(i,j,it)=((pmflxr(i,j+1)+pmflxs(i,j+1))*qPr(i,j+1,it)+&
656 Pa(i,j)*qPa(i,j,it)+Pm(i,j)*qMel(i,j,it)&
657 +imp(i,j)/RG*dxpres(i,j)*tr(i,j,it))/&
658 ✗ (pmflxr(i,j+1)+pmflxs(i,j+1)+Pa(i,j)+Pm(i,j))
659 endif
660
661 endif !mp(2) nul ou non
662
663 ! vvv (j!=1.and.j.lt.inb(i)) en-dessous du sommet nuage vvv
664 else
665 !------------------------------------------------------------- detrainement
666 ✗ if(mp(i,j+1).gt.mp(i,j).and.mp(i,j+1).gt.1.e-10) then !mp(i,j).gt.1.e-10) then
667 ✗ if(NO_precip(i,j)) then
668 ✗ qDi(i,j,it)=qDi(i,j+1,it)
669 ✗ qPr(i,j,it)=0.
670 else
671 qDi(i,j,it)=kappa(i,j)*(&
672 (-evap(i,j)/RG*dxpres(i,j))*((pmflxr(i,j+1)+pmflxs(i,j+1))*qPr(i,j+1,it)+&
673 Pa(i,j)*qPa(i,j,it)+Pm(i,j)*qMel(i,j,it)) +&
674 (pmflxr(i,j+1)+pmflxs(i,j+1)+Pa(i,j)+Pm(i,j))*&
675 ✗ (-mp(i,j+1)*qDi(i,j+1,it)))
676 !
677 qPr(i,j,it)=kappa(i,j)*(&
678 (-mp(i,j+1)-imp(i,j)/RG*dxpres(i,j))*&
679 ((pmflxr(i,j+1)+pmflxs(i,j+1))*qPr(i,j+1,it)+&
680 Pa(i,j)*qPa(i,j,it)+Pm(i,j)*qMel(i,j,it))&
681 ✗ +(-mp(i,j+1)*qDi(i,j+1,it)) * (imp(i,j)/RG*dxpres(i,j)))
682 endif !precip
683 !------------------------------------------------------------- entrainement
684 ✗ elseif(mp(i,j).gt.mp(i,j+1).and.mp(i,j).gt.1.e-10) then
685 ✗ if(NO_precip(i,j)) then
686 ✗ qDi(i,j,it)=(-mp(i,j+1)*(qDi(i,j+1,it)-tr(i,j,it))-mp(i,j)*tr(i,j,it))/(-mp(i,j))
687 ✗ qPr(i,j,it)=0.
688 else
689 qDi(i,j,it)=kappa(i,j)*(&
690 (-evap(i,j)/RG*dxpres(i,j))*((pmflxr(i,j+1)+pmflxs(i,j+1))*qPr(i,j+1,it)+&
691 Pa(i,j)*qPa(i,j,it)+Pm(i,j)*qMel(i,j,it)) +&
692 (pmflxr(i,j+1)+pmflxs(i,j+1)+Pa(i,j)+Pm(i,j))*&
693 ✗ (-mp(i,j+1)*(qDi(i,j+1,it)-tr(i,j,it))-mp(i,j)*tr(i,j,it)))
694 !
695 qPr(i,j,it)=kappa(i,j)*(&
696 (-mp(i,j)-imp(i,j)/RG*dxpres(i,j))*&
697 ((pmflxr(i,j+1)+pmflxs(i,j+1))*qPr(i,j+1,it)+&
698 Pa(i,j)*qPa(i,j,it)+Pm(i,j)*qMel(i,j,it))&
699 +(-mp(i,j+1)*(qDi(i,j+1,it)-tr(i,j,it))-mp(i,j)*tr(i,j,it))*&
700 ✗ (imp(i,j)/RG*dxpres(i,j)))
701 endif !precip
702 !------------------------------------------------------------- endif ! ent/det
703 else !mp nul
704 ✗ qDi(i,j,it)=tr(i,j,it) ! orig 0.
705 ✗ if(NO_precip(i,j)) then
706 ✗ qPr(i,j,it)=0.
707 else
708 qPr(i,j,it)=((pmflxr(i,j+1)+pmflxs(i,j+1))*qPr(i,j+1,it)+&
709 Pa(i,j)*qPa(i,j,it)+Pm(i,j)*qMel(i,j,it)&
710 +imp(i,j)/RG*dxpres(i,j)*tr(i,j,it))/&
711 ✗ (pmflxr(i,j+1)+pmflxs(i,j+1)+Pa(i,j)+Pm(i,j))
712 endif
713 endif ! mp nul ou non
714 endif ! condition sur j
715 endif ! kappa
716 ENDDO
717 ENDDO
718
719 !! print test descente insaturee
720 ! DO j=klev,1,-1
721 ! DO i=1,klon
722 ! if(it.eq.3) then
723 ! write(*,'(I2,2X,a,e20.12,2X,a,e20.12,2X,a,e20.12,2X,a,e20.12,2X,a,e20.12,2X,a,e20.12,2X,a,e20.12)') j,&
724 !! 'zmfdam',zmfdam(i,j,it),'zmfpsi',zmfphi2(i,j,it),&
725 ! 'zmfdam+zmfpsi',zmfdam(i,j,it)+zmfphi2(i,j,it),'qpmMint',qpmMint(i,j,it),&
726 ! 'Pm',Pm(i,j),'Mint',Mint(i,j),&
727 !! 'zmfa',zmfa(i,j,it),'zmfp',zmfp(i,j,it),&
728 ! 'zmfdam',zmfdam(i,j,it),'zmfpsi',zmfphi2(i,j,it),'zmfd1a',zmfd1a(i,j,it)
729 !! 'Pa',Pa(i,j),'eplaMm',eplaMm(i,j)
730 !! 'zmfd1a=da1*qa',zmfd1a(i,j,it),'Pa*qPa',wdtrainA(i,j)*qPa(i,j,it),'da1',d1a(i,j)
731 ! endif
732 ! ENDDO
733 ! ENDDO
734
735
736 ! ===================================================
737 ! calcul final des tendances
738 ! ===================================================
739
740 ✗ DO k=klev-1,1,-1
741 ✗ DO i=1, klon
742 ! transport
743 ✗ tdcvMA=zmfd(i,k,it)+zmfu(i,k,it)+zmfa(i,k,it)+zmfp(i,k,it) ! double comptage des downdraft insatures
744 ✗ trsptrac=zmfu(i,k,it)+zmfa(i,k,it)+zmfp(i,k,it)
745 ! lessivage courants satures
746 !JE scavtrac=-ccntrAA_coef*zmfd1a(i,k,it)&
747 !JE -zmfphi2(i,k,it)*ccntrENV_coef&
748 !JE -zmfdam(i,k,it)*ccntrAA_coef
749 scavtrac=-ccntrAA_coef3d(i,k)*zmfd1a(i,k,it)&
750 -zmfphi2(i,k,it)*ccntrENV_coef3d(i,k)&
751 ✗ -zmfdam(i,k,it)*ccntrAA_coef3d(i,k)
752 ! lessivage courants insatures
753 ✗ if(k.le.inb(i).and.k.gt.1) then ! tendances dans le nuage
754 !------------------------------------------------------------- detrainement
755 ✗ if(mp(i,k+1).gt.mp(i,k).and.mp(i,k+1).gt.1.e-10) then
756 uscavtrac= (-mp(i,k)+mp(i,k+1))*(qDi(i,k,it)-tr(i,k,it))&
757 ✗ + mp(i,k)*(tr(i,k-1,it)-tr(i,k,it))
758 !
759 ! if(it.eq.3) write(*,'(I2,1X,a,5X,e20.12,82X,a,e20.12)')k,' det incloud',&
760 ! (-mp(i,k)+mp(i,k+1))*(qDi(i,k,it)-tr(i,k,it))*pdtimeRG/dxpres(i,k)+&
761 ! mp(i,k)*(tr(i,k-1,it)-tr(i,k,it))*pdtimeRG/dxpres(i,k),&
762 ! 'mp',mp(i,k)
763 !------------------------------------------------------------- entrainement
764 ✗ elseif(mp(i,k).gt.mp(i,k+1).and.mp(i,k).gt.1.e-10) then
765 ✗ uscavtrac= mp(i,k)*(tr(i,k-1,it)-tr(i,k,it))
766 !
767 ! if(it.eq.3) write(*,'(I2,1X,a,5X,e20.12,82X,a,e20.12)')k,' ent incloud',uscavtrac*pdtimeRG/dxpres(i,k), 'mp',mp(i,k)
768 !=!------------------------------------------------------------- end ent/det
769 else ! mp(i,k+1)=0. et mp(i,k)=0. pluie directement sur l environnement
770
771 ✗ if(NO_precip(i,k)) then
772 uscavtrac=0.
773 ! if(it.eq.3) write(*,'(I2,1X,a,e20.12,82X,a,e20.12)')k,' no P ent incloud',uscavtrac*pdtimeRG/dxpres(i,k), 'mp',mp(i,k)
774 else
775 ✗ uscavtrac=-imp(i,k)*tr(i,k,it)*dxpres(i,k)/RG+evap(i,k)*qPr(i,k,it)*dxpres(i,k)/RG
776 ! if(it.eq.3) write(*,'(I2,1X,a,3X,e20.12,82X,a,e20.12)')k,' P env incloud',uscavtrac*pdtimeRG/dxpres(i,k), 'mp',mp(i,k)
777 !!JE adds
778 ! if(it.eq.3) write(*,'(I2,1X,a,3X,e20.12,82X,a,e20.12)')k,' P env incloud',uscavtrac, 'imp',imp(i,k)
779 ! if(it.eq.3) write(*,'(I2,1X,a,3X,e20.12,82X,a,e20.12)')k,' P env incloud',uscavtrac, 'tr',tr(i,k,it)
780 ! if(it.eq.3) write(*,'(I2,1X,a,3X,e20.12,82X,a,e20.12)')k,' P env incloud',uscavtrac, 'evap',evap(i,k)
781 ! if(it.eq.3) write(*,'(I2,1X,a,3X,e20.12,82X,a,e20.12)')k,' P env incloud',uscavtrac, 'qPr',qPr(i,k,it)
782 ! if(it.eq.3) write(*,'(I2,1X,a,3X,e20.12,82X,a,e20.12)')k,' P env incloud',uscavtrac, 'dxpres',dxpres(i,k)
783 !!Je end
784
785 endif
786 endif ! mp/det/ent
787 !------------------------------------------------------------- premiere couche
788 ✗ elseif(k.eq.1) then ! mp(1)=0.
789 ✗ if(mp(i,2).gt.1.e-10) then !detrainement
790 ✗ uscavtrac= (-0.+mp(i,2))*(qDi(i,k,it)-tr(i,k,it)) !&
791 ! + mp(i,2)*(0.-tr(i,k,it))
792 !
793 ! if(it.eq.3) write(*,'(I2,1X,a,e20.12,84X,a,e20.12)')k,' 1 det',&
794 ! (-0.+mp(i,2))*(qDi(i,k,it)-tr(i,k,it))*pdtimeRG/dxpres(i,k)+&
795 ! mp(i,2)*(0.-tr(i,k,it))*pdtimeRG/dxpres(i,k),&
796 ! 'mp',mp(i,k)
797 else ! mp(2) = 0 = mp(1) pas de descente insaturee, rien ne se passe s'il ne pleut pas, sinon pluie->env
798 ✗ if(NO_precip(i,1)) then
799 uscavtrac=0.
800 else
801 ✗ uscavtrac=-imp(i,k)*tr(i,k,it)*dxpres(i,k)/RG+evap(i,k)*qPr(i,k,it)*dxpres(i,k)/RG
802 endif
803 ! if(it.eq.3) write(*,'(I2,1X,a,2X,e20.12,82X,a,e20.12)')k,'1 P env incloud',uscavtrac*pdtimeRG/dxpres(i,k), 'mp',mp(i,k)
804 endif
805
806 else ! k > INB au-dessus du nuage
807 uscavtrac=0.
808 endif
809
810 ! ===== tendances finales ======
811 ✗ trsptd(i,k,it)=trsptrac*pdtimeRG/dxpres(i,k) ! td transport sans eau dans courants satures
812 ✗ dtrSscav(i,k,it)=scavtrac*pdtimeRG/dxpres(i,k) ! td du lessivage dans courants satures
813 ✗ dtrUscav(i,k,it)=uscavtrac*pdtimeRG/dxpres(i,k) ! td courant insat
814 ✗ dtrsat(i,k,it)=(trsptrac+scavtrac)*pdtimeRG/dxpres(i,k) ! td courant sat
815 ✗ dtrcv(i,k,it)=(trsptrac+scavtrac+uscavtrac)*pdtimeRG/dxpres(i,k)!dtrsat(i,k,it)+dtrUscav(i,k,it) td conv
816 !!!!!!
817 ✗ dtrcvMA(i,k,it)=tdcvMA*pdtimeRG/dxpres(i,k) ! MA tendance convection
818 ENDDO
819 ENDDO
820
821 ! test de conservation du traceur
822 !print*,"_____________________________________________________________"
823 !print*," "
824 ! conserv=0.
825 ! conservMA=0.
826 ! DO k= klev-1,1,-1
827 ! DO i=1, klon
828 ! conserv=conserv+dtrcv(i,k,it)* &
829 ! (paprs(i,k)-paprs(i,k+1))/RG
830 ! conservMA=conservMA+dtrcvMA(i,k,it)* &
831 ! (paprs(i,k)-paprs(i,k+1))/RG
832 !
833 ! if(it.eq.3) write(*,'(I2,2X,a,e20.12,2X,a,e20.12,2X,a,e20.12,2X,a,e20.12)') k,&
834 ! 'MA td ',dtrcvMA(i,k,it)*dxpres(i,k)/RG,&
835 ! ' td',dtrcv(i,k,it)*dxpres(i,k)/RG,' conservMA ',conservMA,'conserv ',conserv
836 !!
837 ! ENDDO
838 ! ENDDO
839 ! if(it.eq.3) print *,'it',it,'conserv ',conserv,'conservMA ',conservMA
840
841 ✗ END SUBROUTINE cvltr_spl
842