source: LMDZ6/branches/LMDZ_cdrag_LSCE/libf/phylmd/cvltr_spl.F90 @ 5428

Last change on this file since 5428 was 4046, checked in by dcugnet, 3 years ago

First commit for new tracers.

  • parser routines readTracFiles, strings_mod and tracer_types added in misc using revision 4 of https://svn.lmd.jussieu.fr/tracers-parser
  • tested in sequential and parallel mode using ioipsl.
  • for now, only two fields of "tracers(:)" derived type vector are used: "name" and "longName".
File size: 30.3 KB
Line 
1!
2! $Id $
3!
4SUBROUTINE 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
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
342IF (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')
357ELSE
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
367ENDIF
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
841END SUBROUTINE cvltr_spl
Note: See TracBrowser for help on using the repository browser.