source: LMDZ6/trunk/libf/phylmd/phytrac_mod.F90 @ 4596

Last change on this file since 4596 was 4590, checked in by fhourdin, 2 years ago

Passage des thermiques a la nouvelle norme.

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:keywords set to Id
File size: 45.3 KB
Line 
1!$Id: phytrac_mod.F90 4590 2023-06-29 01:03:15Z fairhead $
2MODULE phytrac_mod
3!=================================================================================
4! Interface between the LMDZ physical package and tracer computation.
5! Chemistry modules (INCA, Reprobus or the more specific traclmdz routine)
6! are called from phytrac.
7!
8!======================================================================
9! Auteur(s) FH
10! Objet: Moniteur general des tendances traceurs
11!
12! iflag_vdf_trac : Options for activating transport by vertical diffusion :
13!     1. notmal
14!     0. emission is injected in the first layer only, without diffusion
15!    -1  no emission & no diffusion
16! Modification 2013/07/22 : transformed into a module to pass tendencies to
17!     physics outputs. Additional keys for controling activation of sub processes.
18! Modification R. Pilon 10 octobre 2012 large scale scavenging incloud_scav + bc_scav
19! Modification R. Pilon 01 janvier 2012 transport+scavenging KE scheme : cvltr
20!=================================================================================
21
22!
23! Tracer tendencies, for outputs
24!-------------------------------
25  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_cl  ! Td couche limite/traceur
26  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_dec                            !RomP
27  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_cv  ! Td convection/traceur
28! RomP >>>
29  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_insc
30  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_bcscav
31  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_evapls
32  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_ls
33  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_trsp
34  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_sscav
35  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_sat
36  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_uscav
37  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: qPr,qDi ! concentration tra dans pluie,air descente insaturee
38  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: qPa,qMel
39  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: qTrdi,dtrcvMA ! conc traceur descente air insaturee et td convective MA
40! RomP <<<
41  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_th  ! Td thermique
42  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_lessi_impa ! Td du lessivage par impaction
43  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: d_tr_lessi_nucl ! Td du lessivage par nucleation
44  REAL,DIMENSION(:,:),ALLOCATABLE,SAVE   :: qPrls      !jyg: concentration tra dans pluie LS a la surf.
45  REAL,DIMENSION(:,:),ALLOCATABLE,SAVE   :: d_tr_dry ! Td depot sec/traceur (1st layer),ALLOCATABLE,SAVE  jyg
46  REAL,DIMENSION(:,:),ALLOCATABLE,SAVE   :: flux_tr_dry ! depot sec/traceur (surface),ALLOCATABLE,SAVE    jyg
47
48!$OMP THREADPRIVATE(qPa,qMel,qTrdi,dtrcvMA,d_tr_th,d_tr_lessi_impa,d_tr_lessi_nucl)
49!$OMP THREADPRIVATE(d_tr_trsp,d_tr_sscav,d_tr_sat,d_tr_uscav,qPr,qDi)
50!$OMP THREADPRIVATE(d_tr_insc,d_tr_bcscav,d_tr_evapls,d_tr_ls,qPrls)
51!$OMP THREADPRIVATE(d_tr_cl,d_tr_dry,flux_tr_dry,d_tr_dec,d_tr_cv)
52
53CONTAINS
54
55  SUBROUTINE phytrac_init()
56
57    USE dimphy
58    USE infotrac_phy, ONLY: nbtr, type_trac
59    USE tracco2i_mod, ONLY: tracco2i_init
60   
61    IMPLICIT NONE
62
63    ALLOCATE(d_tr_cl(klon,klev,nbtr),d_tr_dry(klon,nbtr))
64    ALLOCATE(flux_tr_dry(klon,nbtr),d_tr_dec(klon,klev,nbtr),d_tr_cv(klon,klev,nbtr))
65    ALLOCATE(d_tr_insc(klon,klev,nbtr),d_tr_bcscav(klon,klev,nbtr))
66    ALLOCATE(d_tr_evapls(klon,klev,nbtr),d_tr_ls(klon,klev,nbtr))
67    ALLOCATE(qPrls(klon,nbtr),d_tr_trsp(klon,klev,nbtr))
68    ALLOCATE(d_tr_sscav(klon,klev,nbtr),d_tr_sat(klon,klev,nbtr))
69    ALLOCATE(d_tr_uscav(klon,klev,nbtr),qPr(klon,klev,nbtr),qDi(klon,klev,nbtr))
70    ALLOCATE(qPa(klon,klev,nbtr),qMel(klon,klev,nbtr))
71    ALLOCATE(qTrdi(klon,klev,nbtr),dtrcvMA(klon,klev,nbtr))
72    ALLOCATE(d_tr_th(klon,klev,nbtr))
73    ALLOCATE(d_tr_lessi_impa(klon,klev,nbtr),d_tr_lessi_nucl(klon,klev,nbtr))
74
75    !===============================================================================
76    !    -- Do specific treatment according to chemestry model or local LMDZ tracers
77    !     
78    !===============================================================================
79    !   -- CO2 interactif --
80    IF (ANY(type_trac == ['co2i','inco'])) CALL tracco2i_init()
81
82       !   -- type_trac == 'co2i' ! PC
83       !   -- CO2 interactif --
84       !   -- source is updated with FF and BB emissions
85       !   -- and net fluxes from ocean and orchidee
86       !   -- sign convention : positive into the atmosphere
87
88  END SUBROUTINE phytrac_init
89
90  SUBROUTINE phytrac(                                 &
91       nstep,     julien,   gmtime,   debutphy,       &
92       lafin,     pdtphys,  u, v,     t_seri,         &
93       paprs,     pplay,    pmfu,     pmfd,           &
94       pen_u,     pde_u,    pen_d,    pde_d,          &
95       cdragh,    coefh,    fm_therm, entr_therm,     &
96       yu1,       yv1,      ftsol,    pctsrf,         &
97       ustar,     u10m,      v10m,                    &
98       wstar,     ale_bl,      ale_wake,              &
99       xlat,      xlon,                               &
100       frac_impa,frac_nucl,beta_fisrt,beta_v1,        &
101       presnivs,  pphis,    pphi,     albsol,         &
102       sh,        ch, rh,   cldfra,   rneb,           &
103       diafra,    cldliq,   itop_con, ibas_con,       &
104       pmflxr,    pmflxs,   prfl,     psfl,           &
105       da,        phi,      mp,       upwd,           &
106       phi2,      d1a,      dam,      sij, wght_cvfd, &   ! RomP +RL
107       wdtrainA,  wdtrainM, sigd,     clw, elij,      &   ! RomP
108       evap,      ep,       epmlmMm,  eplaMm,         &   ! RomP
109       dnwd,      aerosol_couple,     flxmass_w,      &
110       tau_aero,  piz_aero,  cg_aero, ccm,            &
111       rfname,                                        &
112       d_tr_dyn,                                      &   ! RomP
113       tr_seri, init_source)         
114    !
115    !======================================================================
116    ! Auteur(s) FH
117    ! Objet: Moniteur general des tendances traceurs
118    ! Modification R. Pilon 01 janvier 2012 transport+scavenging KE scheme : cvltr
119    ! Modification R. Pilon 10 octobre 2012 large scale scavenging incloud_scav + bc_scav
120    !======================================================================
121
122    USE ioipsl
123    USE phys_cal_mod, only : hour
124    USE dimphy
125    USE infotrac_phy, ONLY: nbtr, nqCO2, type_trac, conv_flg, pbl_flg
126    USE strings_mod,  ONLY: int2str
127    USE mod_grid_phy_lmdz
128    USE mod_phys_lmdz_para
129    USE iophy
130    USE traclmdz_mod
131    USE tracinca_mod
132    USE tracreprobus_mod
133    USE indice_sol_mod
134    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
135    USE print_control_mod, ONLY: lunout
136    USE aero_mod, ONLY : naero_grp
137    USE lmdz_thermcell_dq, ONLY : thermcell_dq
138
139    USE tracco2i_mod
140
141#ifdef CPP_StratAer
142    USE traccoag_mod
143    USE phys_local_var_mod, ONLY: mdw
144    USE phys_local_var_mod, ONLY: budg_dep_dry_ocs,   budg_dep_wet_ocs
145    USE phys_local_var_mod, ONLY: budg_dep_dry_so2,   budg_dep_wet_so2
146    USE phys_local_var_mod, ONLY: budg_dep_dry_h2so4, budg_dep_wet_h2so4
147    USE phys_local_var_mod, ONLY: budg_dep_dry_part,  budg_dep_wet_part
148    USE infotrac_phy, ONLY: nbtr_sulgas, id_OCS_strat, id_SO2_strat, id_H2SO4_strat
149    USE aerophys
150#endif
151
152    IMPLICIT NONE
153
154    INCLUDE "YOMCST.h"
155    INCLUDE "clesphys.h"
156    !==========================================================================
157    !                   -- ARGUMENT DESCRIPTION --
158    !==========================================================================
159
160    ! Input arguments
161    !----------------
162    !Configuration grille,temps:
163    INTEGER,INTENT(IN) :: nstep      ! Appel physique
164    INTEGER,INTENT(IN) :: julien     ! Jour julien
165    REAL,INTENT(IN)    :: gmtime     ! Heure courante
166    REAL,INTENT(IN)    :: pdtphys    ! Pas d'integration pour la physique (seconde)
167    LOGICAL,INTENT(IN) :: debutphy   ! le flag de l'initialisation de la physique
168    LOGICAL,INTENT(IN) :: lafin      ! le flag de la fin de la physique
169
170    REAL,DIMENSION(klon),INTENT(IN) :: xlat    ! latitudes pour chaque point
171    REAL,DIMENSION(klon),INTENT(IN) :: xlon    ! longitudes pour chaque point
172    !
173    !Physique:
174    !--------
175    REAL,DIMENSION(klon,klev),INTENT(IN)   :: t_seri  ! Temperature
176    REAL,DIMENSION(klon,klev),INTENT(IN)   :: u       ! variable not used
177    REAL,DIMENSION(klon,klev),INTENT(IN)   :: v       ! variable not used
178    REAL,DIMENSION(klon,klev),INTENT(IN)   :: sh      ! humidite specifique
179    REAL,DIMENSION(klon,klev),INTENT(IN)   :: rh      ! humidite relative
180    REAL,DIMENSION(klon,klev),INTENT(IN)   :: ch      ! eau liquide (+ glace si le traceur existe)
181    REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs   ! pression pour chaque inter-couche (en Pa)
182    REAL,DIMENSION(klon,klev),INTENT(IN)   :: pplay   ! pression pour le mileu de chaque couche (en Pa)
183    REAL,DIMENSION(klon,klev),INTENT(IN)   :: pphi    ! geopotentiel
184    REAL,DIMENSION(klon),INTENT(IN)        :: pphis
185    REAL,DIMENSION(klev),INTENT(IN)        :: presnivs
186    REAL,DIMENSION(klon,klev),INTENT(IN)   :: cldliq  ! eau condensee totale
187    REAL,DIMENSION(klon,klev),INTENT(IN)   :: cldfra  ! fraction nuageuse (tous les nuages)
188    REAL,DIMENSION(klon,klev),INTENT(IN)   :: diafra  ! fraction nuageuse (convection ou stratus artificiels)
189    REAL,DIMENSION(klon,klev),INTENT(IN)   :: rneb    ! fraction nuageuse (grande echelle)
190    !
191    REAL                                   :: ql_incl ! contenu en eau liquide nuageuse dans le nuage ! ql_incl=oliq/rneb
192    REAL,DIMENSION(klon,klev),INTENT(IN)   :: beta_fisrt ! taux de conversion de l'eau cond (de fisrtilp)
193    REAL,DIMENSION(klon,klev),INTENT(out)  :: beta_v1    ! -- (originale version)
194
195    !
196    INTEGER,DIMENSION(klon),INTENT(IN)     :: itop_con
197    INTEGER,DIMENSION(klon),INTENT(IN)     :: ibas_con
198    REAL,DIMENSION(klon),INTENT(IN)        :: albsol  ! albedo surface
199    !
200    !Dynamique
201    !--------
202    REAL,DIMENSION(klon,klev,nbtr),INTENT(IN)    :: d_tr_dyn
203    !
204    !Convection:
205    !----------
206    REAL,DIMENSION(klon,klev),INTENT(IN) :: pmfu  ! flux de masse dans le panache montant
207    REAL,DIMENSION(klon,klev),INTENT(IN) :: pmfd  ! flux de masse dans le panache descendant
208    REAL,DIMENSION(klon,klev),INTENT(IN) :: pen_u ! flux entraine dans le panache montant
209    REAL,DIMENSION(klon,klev),INTENT(IN) :: pde_u ! flux detraine dans le panache montant
210    REAL,DIMENSION(klon,klev),INTENT(IN) :: pen_d ! flux entraine dans le panache descendant
211    REAL,DIMENSION(klon,klev),INTENT(IN) :: pde_d ! flux detraine dans le panache descendant
212
213    !...Tiedke     
214    REAL,DIMENSION(klon,klev+1),INTENT(IN)   :: pmflxr, pmflxs ! Flux precipitant de pluie, neige aux interfaces [convection]
215    REAL,DIMENSION(klon,klev+1),INTENT(IN)   :: prfl, psfl ! Flux precipitant de pluie, neige aux interfaces [large-scale]
216
217    LOGICAL,INTENT(IN)                       :: aerosol_couple
218    REAL,DIMENSION(klon,klev),INTENT(IN)     :: flxmass_w
219    REAL,DIMENSION(klon,klev,naero_grp,2),INTENT(IN) :: tau_aero
220    REAL,DIMENSION(klon,klev,naero_grp,2),INTENT(IN) :: piz_aero
221    REAL,DIMENSION(klon,klev,naero_grp,2),INTENT(IN) :: cg_aero
222    CHARACTER(len=4),DIMENSION(naero_grp),INTENT(IN) :: rfname
223    REAL,DIMENSION(klon,klev,2),INTENT(IN)   :: ccm
224    !... K.Emanuel
225    REAL,DIMENSION(klon,klev),INTENT(IN)     :: da
226    REAL,DIMENSION(klon,klev,klev),INTENT(IN):: phi
227    ! RomP >>>
228    REAL,DIMENSION(klon,klev),INTENT(IN)      :: d1a,dam
229    REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: phi2
230    !
231    REAL,DIMENSION(klon,klev),INTENT(IN)      :: wdtrainA
232    REAL,DIMENSION(klon,klev),INTENT(IN)      :: wdtrainM
233    REAL,DIMENSION(klon),INTENT(IN)           :: sigd
234    ! ---- RomP flux entraine, detraine et precipitant kerry Emanuel
235    REAL,DIMENSION(klon,klev),INTENT(IN)      :: evap
236    REAL,DIMENSION(klon,klev),INTENT(IN)      :: ep
237    REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: sij
238    REAL,DIMENSION(klon,klev),INTENT(IN)      :: wght_cvfd          !RL
239    REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: elij
240    REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: epmlmMm
241    REAL,DIMENSION(klon,klev),INTENT(IN)      :: eplaMm
242    REAL,DIMENSION(klon,klev),INTENT(IN)      :: clw
243    ! RomP <<<
244    !
245    REAL,DIMENSION(klon,klev),INTENT(IN)     :: mp
246    REAL,DIMENSION(klon,klev),INTENT(IN)     :: upwd      ! saturated updraft mass flux
247    REAL,DIMENSION(klon,klev),INTENT(IN)     :: dnwd      ! saturated downdraft mass flux
248    !
249    !Thermiques:
250    !----------
251    REAL,DIMENSION(klon,klev+1),INTENT(IN)   :: fm_therm
252    REAL,DIMENSION(klon,klev),INTENT(INOUT)     :: entr_therm
253    !
254    !Couche limite:
255    !--------------
256    !
257    REAL,DIMENSION(:),INTENT(IN)   :: cdragh          ! (klon) coeff drag pour T et Q
258    REAL,DIMENSION(:,:),INTENT(IN) :: coefh           ! (klon,klev) coeff melange CL (m**2/s)
259    REAL,DIMENSION(:),INTENT(IN)   :: ustar,u10m,v10m ! (klon) u* & vent a 10m (m/s)
260    REAL,DIMENSION(:),INTENT(IN)   :: wstar,ale_bl,ale_wake ! (klon) w* and Avail. Lifting Ener.
261    REAL,DIMENSION(:),INTENT(IN)   :: yu1             ! (klon) vents au premier niveau
262    REAL,DIMENSION(:),INTENT(IN)   :: yv1             ! (klon) vents au premier niveau
263    !
264    !Lessivage:
265    !----------
266    !
267    REAL, DIMENSION(:), ALLOCATABLE, SAVE :: ccntrAA
268    REAL, DIMENSION(:), ALLOCATABLE, SAVE :: ccntrENV
269    REAL, DIMENSION(:), ALLOCATABLE, SAVE :: coefcoli
270    LOGICAL, DIMENSION(:), ALLOCATABLE, SAVE :: flag_cvltr
271!$OMP THREADPRIVATE(ccntrAA,ccntrENV,coefcoli,flag_cvltr)
272    REAL, DIMENSION(klon,klev) :: ccntrAA_3d
273    REAL, DIMENSION(klon,klev) :: ccntrENV_3d
274    REAL, DIMENSION(klon,klev) :: coefcoli_3d
275    !
276    ! pour le ON-LINE
277    !
278    REAL,DIMENSION(klon,klev),INTENT(IN) :: frac_impa ! fraction d'aerosols non impactes
279    REAL,DIMENSION(klon,klev),INTENT(IN) :: frac_nucl ! fraction d'aerosols non nuclees
280
281    ! Arguments necessaires pour les sources et puits de traceur:
282    REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: ftsol  ! Temperature du sol (surf)(Kelvin)
283    REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: pctsrf ! Pourcentage de sol (nature du sol)
284
285#ifdef CPP_StratAer
286    REAL,DIMENSION(klon)           :: v_dep_dry !dry deposition velocity of stratospheric sulfate in m/s
287#endif
288    ! Output argument
289    !----------------
290    REAL,DIMENSION(klon,klev,nbtr),INTENT(INOUT) :: tr_seri ! Concentration Traceur [U/KgA]
291    REAL,DIMENSION(klon,klev)                    :: sourceBE
292    REAL,DIMENSION(klon,nbtr), INTENT(IN) :: init_source
293
294    !=======================================================================================
295    !                        -- LOCAL VARIABLES --
296    !=======================================================================================
297
298    INTEGER :: i, k, it
299    INTEGER :: nsplit
300
301    !Sources et Reservoirs de traceurs (ex:Radon):
302    !--------------------------------------------
303    !
304    REAL,DIMENSION(:,:),ALLOCATABLE,SAVE :: source  ! a voir lorsque le flux de surface est prescrit
305!$OMP THREADPRIVATE(source)
306
307    !
308    !Entrees/Sorties:
309    !---------------
310    INTEGER                   :: iiq, ierr
311    INTEGER                   :: nhori, nvert
312    REAL                      :: zsto, zout, zjulian
313    INTEGER,SAVE              :: nid_tra     ! pointe vers le fichier histrac.nc         
314!$OMP THREADPRIVATE(nid_tra)
315    REAL,DIMENSION(klon)      :: zx_tmp_fi2d ! variable temporaire grille physique
316    INTEGER                   :: itau_w      ! pas de temps ecriture = nstep + itau_phy
317    LOGICAL,PARAMETER         :: ok_sync=.TRUE.
318    !
319    ! Nature du traceur
320    !------------------
321    LOGICAL,DIMENSION(:),ALLOCATABLE,SAVE :: aerosol  ! aerosol(it) = true  => aerosol => lessivage
322!$OMP THREADPRIVATE(aerosol)                        ! aerosol(it) = false => gaz
323    REAL,DIMENSION(klon,klev)             :: delp     ! epaisseur de couche (Pa)
324    !
325    ! Tendances de traceurs (Td) et flux de traceurs:
326    !------------------------
327    REAL,DIMENSION(klon,klev)      :: d_tr     ! Td dans l'atmosphere
328    REAL,DIMENSION(klon,klev)      :: Mint
329    REAL,DIMENSION(klon,klev,nbtr) :: zmfd1a
330    REAL,DIMENSION(klon,klev,nbtr) :: zmfdam
331    REAL,DIMENSION(klon,klev,nbtr) :: zmfphi2
332    ! Physique
333    !----------
334    REAL,DIMENSION(klon,klev,nbtr) :: flestottr ! flux de lessivage dans chaque couche
335    REAL,DIMENSION(klon,klev)      :: zmasse    ! densite atmospherique Kg/m2
336    REAL,DIMENSION(klon,klev)      :: ztra_th
337    !PhH
338    REAL,DIMENSION(klon,klev)      :: zrho
339    REAL,DIMENSION(klon,klev)      :: zdz
340    REAL                           :: evaplsc,dx,beta ! variable pour lessivage Genthon
341    REAL,DIMENSION(klon)           :: his_dh          ! ---
342    ! in-cloud scav variables
343    REAL           :: ql_incloud_ref     ! ref value of in-cloud condensed water content
344
345    !Controles:
346    !---------
347    INTEGER,SAVE :: iflag_vdf_trac,iflag_con_trac,iflag_the_trac
348    INTEGER,SAVE  :: iflag_con_trac_omp, iflag_vdf_trac_omp,iflag_the_trac_omp
349!$OMP THREADPRIVATE(iflag_vdf_trac,iflag_con_trac,iflag_the_trac)
350
351    LOGICAL,SAVE :: lessivage
352!$OMP THREADPRIVATE(lessivage)
353
354    !RomP >>>
355    INTEGER,SAVE  :: iflag_lscav_omp,iflag_lscav
356    REAL, SAVE ::   ccntrAA_in,ccntrAA_omp
357    REAL, SAVE ::   ccntrENV_in,ccntrENV_omp
358    REAL, SAVE ::   coefcoli_in,coefcoli_omp
359
360    LOGICAL,SAVE  :: convscav_omp,convscav
361!$OMP THREADPRIVATE(iflag_lscav)
362!$OMP THREADPRIVATE(ccntrAA_in,ccntrENV_in,coefcoli_in)
363!$OMP THREADPRIVATE(convscav)
364    !RomP <<<
365    !######################################################################
366    !                    -- INITIALIZATION --
367    !######################################################################
368
369    DO k=1,klev
370       DO i=1,klon
371          sourceBE(i,k)=0.
372          Mint(i,k)=0.
373          zrho(i,k)=0.
374          zdz(i,k)=0.
375       ENDDO
376    ENDDO
377
378    DO it=1, nbtr
379       DO k=1,klev
380          DO i=1,klon
381             d_tr_insc(i,k,it)=0.
382             d_tr_bcscav(i,k,it)=0.
383             d_tr_evapls(i,k,it)=0.
384             d_tr_ls(i,k,it)=0.
385             d_tr_cv(i,k,it)=0.
386             d_tr_cl(i,k,it)=0.
387             d_tr_trsp(i,k,it)=0.
388             d_tr_sscav(i,k,it)=0.
389             d_tr_sat(i,k,it)=0.
390             d_tr_uscav(i,k,it)=0.
391             d_tr_lessi_impa(i,k,it)=0.
392             d_tr_lessi_nucl(i,k,it)=0.
393             qDi(i,k,it)=0.
394             qPr(i,k,it)=0.
395             qPa(i,k,it)=0.
396             qMel(i,k,it)=0.
397             qTrdi(i,k,it)=0.
398             dtrcvMA(i,k,it)=0.
399             zmfd1a(i,k,it)=0.
400             zmfdam(i,k,it)=0.
401             zmfphi2(i,k,it)=0.
402          ENDDO
403       ENDDO
404    ENDDO
405
406    DO it=1, nbtr
407       DO i=1,klon
408          d_tr_dry(i,it)=0.
409          flux_tr_dry(i,it)=0.
410       ENDDO
411    ENDDO
412
413    DO k = 1, klev
414       DO i = 1, klon
415          delp(i,k) = paprs(i,k)-paprs(i,k+1)
416       ENDDO
417    ENDDO
418
419    IF (debutphy) THEN
420       !!jyg
421!$OMP BARRIER
422       ecrit_tra=86400. ! frequence de stokage en dur
423       ! obsolete car remplace par des ecritures dans phys_output_write
424       !RomP >>>
425       !
426       !Config Key  = convscav
427       !Config Desc = Convective scavenging switch: 0=off, 1=on.
428       !Config Def  = .FALSE.
429       !Config Help =
430       !
431!$OMP MASTER
432       convscav_omp=.FALSE.
433       call getin('convscav', convscav_omp)
434       iflag_vdf_trac_omp=1
435       call getin('iflag_vdf_trac', iflag_vdf_trac_omp)
436       iflag_con_trac_omp=1
437       call getin('iflag_con_trac', iflag_con_trac_omp)
438       iflag_the_trac_omp=1
439       call getin('iflag_the_trac', iflag_the_trac_omp)
440!$OMP END MASTER
441!$OMP BARRIER
442       convscav=convscav_omp
443       iflag_vdf_trac=iflag_vdf_trac_omp
444       iflag_con_trac=iflag_con_trac_omp
445       iflag_the_trac=iflag_the_trac_omp
446       write(lunout,*) 'phytrac passage dans routine conv avec lessivage', convscav
447       !
448       !Config Key  = iflag_lscav
449       !Config Desc = Large scale scavenging parametrization: 0=none, 1=old(Genthon92),
450       !              2=1+PHeinrich, 3=Reddy_Boucher2004, 4=3+RPilon.
451       !Config Def  = 1
452       !Config Help =
453       !
454!$OMP MASTER
455       iflag_lscav_omp=1
456       call getin('iflag_lscav', iflag_lscav_omp)
457       ccntrAA_omp=1
458       ccntrENV_omp=1.
459       coefcoli_omp=0.001
460       call getin('ccntrAA', ccntrAA_omp)
461       call getin('ccntrENV', ccntrENV_omp)
462       call getin('coefcoli', coefcoli_omp)
463!$OMP END MASTER
464!$OMP BARRIER
465       iflag_lscav=iflag_lscav_omp
466       ccntrAA_in=ccntrAA_omp
467       ccntrENV_in=ccntrENV_omp
468       coefcoli_in=coefcoli_omp
469       !
470       SELECT CASE(iflag_lscav)
471       CASE(0)
472          WRITE(lunout,*)  'Large scale scavenging: none'
473       CASE(1)
474          WRITE(lunout,*)  'Large scale scavenging: C. Genthon, Tellus(1992), 44B, 371-389'
475       CASE(2)
476          WRITE(lunout,*)  'Large scale scavenging: C. Genthon, modified P. Heinrich'
477       CASE(3)
478          WRITE(lunout,*)  'Large scale scavenging: M. Shekkar Reddy and O. Boucher, JGR(2004), 109, D14202'
479       CASE(4)
480          WRITE(lunout,*)  'Large scale scavenging: Reddy and Boucher, modified R. Pilon'
481       END SELECT
482       !RomP <<<
483       WRITE(*,*) 'FIRST TIME IN PHYTRAC : pdtphys(sec) = ',pdtphys,'ecrit_tra (sec) = ',ecrit_tra
484       ALLOCATE( source(klon,nbtr), stat=ierr)
485       IF (ierr /= 0) CALL abort_physic('phytrac', 'pb in allocation 1',1)
486
487       ALLOCATE( aerosol(nbtr), stat=ierr)
488       IF (ierr /= 0) CALL abort_physic('phytrac', 'pb in allocation 2',1)
489
490
491       ! Initialize module for specific tracers
492       IF (type_trac == 'inca') THEN
493          source(:,:)=init_source(:,:)
494          CALL tracinca_init(aerosol,lessivage)
495       ELSE IF (type_trac == 'repr') THEN
496          source(:,:)=0.
497       ELSE IF (type_trac == 'co2i') THEN
498          source(:,:)=0.
499          lessivage  = .FALSE.
500          aerosol(:) = .FALSE.
501          pbl_flg(:) = 1
502          iflag_the_trac= 1
503          iflag_vdf_trac= 1
504          iflag_con_trac= 1
505       ELSE IF (type_trac == 'inco') THEN
506          source(:,1:nqCO2) = 0.                          ! from CO2i ModThL
507          source(:,nqCO2+1:nbtr)=init_source(:,:)         ! from INCA ModThL
508          aerosol(1:nqCO2) = .FALSE.                      ! from CO2i ModThL
509          CALL tracinca_init(aerosol(nqCO2+1:nbtr),lessivage)     ! from INCA ModThL
510          pbl_flg(1:nqCO2) = 1                            ! From CO2i ModThL
511          iflag_the_trac = 1                              ! From CO2i
512          iflag_vdf_trac = 1                              ! From CO2i
513          iflag_con_trac = 1                              ! From CO2i
514#ifdef CPP_StratAer
515       ELSE IF (type_trac == 'coag') THEN
516          source(:,:)=0.
517          DO it= 1, nbtr_sulgas
518            aerosol(it)=.FALSE.
519            IF (it==id_H2SO4_strat) aerosol(it)=.TRUE.
520          ENDDO
521          DO it= nbtr_sulgas+1, nbtr
522            aerosol(it)=.TRUE.
523          ENDDO
524#endif
525       ELSE IF (type_trac == 'lmdz') THEN
526          CALL traclmdz_init(pctsrf,xlat,xlon,ftsol,tr_seri,t_seri,pplay,sh,pdtphys,aerosol,lessivage)
527       ENDIF
528
529       !
530       !--initialising coefficients for scavenging in the case of NP
531       !
532       ALLOCATE(flag_cvltr(nbtr))
533       IF (iflag_con.EQ.3) THEN
534          !
535          ALLOCATE(ccntrAA(nbtr))
536          ALLOCATE(ccntrENV(nbtr))
537          ALLOCATE(coefcoli(nbtr))
538          !
539          DO it=1, nbtr
540             IF (type_trac == 'repr') THEN
541                 flag_cvltr(it)=.FALSE.
542             ELSE IF (type_trac == 'inca') THEN
543!                IF ((it.EQ.id_Rn222) .OR. ((it.GE.id_SO2) .AND. (it.LE.id_NH3)) ) THEN
544!                   !--gas-phase species
545!                   flag_cvltr(it)=.FALSE.
546!
547!                ELSEIF ( (it.GE.id_CIDUSTM) .AND. (it.LE.id_AIN) ) THEN
548!                   !--insoluble aerosol species
549!                   flag_cvltr(it)=.TRUE.
550!                   ccntrAA(it)=0.7
551!                   ccntrENV(it)=0.7
552!                   coefcoli(it)=0.001
553!                ELSEIF ( (it.EQ.id_Pb210) .OR. ((it.GE.id_CSSSM) .AND. (it.LE.id_SSN))) THEN
554!                   !--soluble aerosol species
555!                   flag_cvltr(it)=.TRUE.
556!                   ccntrAA(it)=0.9
557!                   ccntrENV(it)=0.9
558!                   coefcoli(it)=0.001
559!                ELSE
560!                   WRITE(lunout,*) 'pb it=', it
561!                   CALL abort_physic('phytrac','pb it scavenging',1)
562!                ENDIF
563                !--test OB
564                !--for now we do not scavenge in cvltr
565                flag_cvltr(it)=.FALSE.
566             ELSE IF (type_trac == 'co2i') THEN
567                !--co2 tracers are not scavenged
568                flag_cvltr(it)=.FALSE.
569             ELSE IF (type_trac == 'inco') THEN     ! Add ThL
570                flag_cvltr(it)=.FALSE.
571#ifdef CPP_StratAer
572             ELSE IF (type_trac == 'coag') THEN
573                IF (convscav.and.aerosol(it)) THEN
574                   flag_cvltr(it)=.TRUE.
575                   ccntrAA(it) =ccntrAA_in   
576                   ccntrENV(it)=ccntrENV_in
577                   coefcoli(it)=coefcoli_in
578                ELSE
579                   flag_cvltr(it)=.FALSE.
580                ENDIF
581#endif
582             ELSE IF (type_trac == 'lmdz') THEN
583                IF (convscav.and.aerosol(it)) THEN
584                   flag_cvltr(it)=.TRUE.
585                   ccntrAA(it) =ccntrAA_in    !--a modifier par JYG a lire depuis fichier
586                   ccntrENV(it)=ccntrENV_in
587                   coefcoli(it)=coefcoli_in
588                ELSE
589                   flag_cvltr(it)=.FALSE.
590                ENDIF
591             ENDIF
592          ENDDO
593          !
594       ELSE ! iflag_con .ne. 3
595          flag_cvltr(:) = .FALSE.
596       ENDIF
597       !
598       ! print out all tracer flags
599       !
600       WRITE(lunout,*) 'print out all tracer flags'
601       WRITE(lunout,*) 'type_trac      =', type_trac
602       WRITE(lunout,*) 'config_inca    =', config_inca
603       WRITE(lunout,*) 'iflag_con_trac =', iflag_con_trac
604       WRITE(lunout,*) 'iflag_con      =', iflag_con
605       WRITE(lunout,*) 'convscav       =', convscav
606       WRITE(lunout,*) 'iflag_lscav    =', iflag_lscav
607       WRITE(lunout,*) 'aerosol        =', aerosol
608       WRITE(lunout,*) 'iflag_the_trac =', iflag_the_trac
609       WRITE(lunout,*) 'iflag_thermals =', iflag_thermals
610       WRITE(lunout,*) 'iflag_vdf_trac =', iflag_vdf_trac
611       WRITE(lunout,*) 'pbl_flg        =', pbl_flg
612       WRITE(lunout,*) 'lessivage      =', lessivage
613       write(lunout,*)  'flag_cvltr    = ', flag_cvltr
614
615       IF (lessivage .AND. ANY(type_trac == ['inca','inco'])) &
616          CALL abort_physic('phytrac', 'lessivage=T config_inca=inca impossible',1)
617       !
618    ENDIF ! of IF (debutphy)
619    !############################################ END INITIALIZATION #######
620
621    DO k=1,klev
622       DO i=1,klon
623          zmasse(i,k)=(paprs(i,k)-paprs(i,k+1))/rg
624       ENDDO
625    ENDDO
626    !
627    IF (id_be .GT. 0) THEN
628       DO k=1,klev
629          DO i=1,klon
630             sourceBE(i,k)=srcbe(i,k)       !RomP  -> pour sortie histrac
631          ENDDO
632       ENDDO
633    ENDIF
634
635    !===============================================================================
636    !    -- Do specific treatment according to chemestry model or local LMDZ tracers
637    !     
638    !===============================================================================
639    IF (type_trac == 'inca') THEN
640       !    -- CHIMIE INCA  config_inca = aero or chem --
641       ! Appel fait en fin de phytrac pour avoir les emissions modifiees par
642       ! la couche limite et la convection avant le calcul de la chimie
643
644    ELSE IF (type_trac == 'repr') THEN
645       !   -- CHIMIE REPROBUS --
646       CALL tracreprobus(pdtphys, gmtime, debutphy, julien, &
647            presnivs, xlat, xlon, pphis, pphi, &
648            t_seri, pplay, paprs, sh , &
649            tr_seri)
650
651    ELSE IF (type_trac == 'co2i') THEN
652       !   -- CO2 interactif --
653       !   -- source is updated with FF and BB emissions
654       !   -- and net fluxes from ocean and orchidee
655       !   -- sign convention : positive into the atmosphere
656
657       CALL tracco2i(pdtphys, debutphy, &
658            xlat, xlon, pphis, pphi, &
659            t_seri, pplay, paprs, tr_seri, source)
660    ELSE IF (type_trac == 'inco') THEN      ! Add ThL
661       CALL tracco2i(pdtphys, debutphy, &
662            xlat, xlon, pphis, pphi, &
663            t_seri, pplay, paprs, tr_seri, source)
664
665#ifdef CPP_StratAer
666    ELSE IF (type_trac == 'coag') THEN
667       !   --STRATOSPHERIC AER IN THE STRAT --
668       CALL traccoag(pdtphys, gmtime, debutphy, julien, &
669            presnivs, xlat, xlon, pphis, pphi, &
670            t_seri, pplay, paprs, sh, rh , &
671            tr_seri)
672#endif
673    ELSE IF (type_trac == 'lmdz') THEN
674       !    -- Traitement des traceurs avec traclmdz
675       CALL traclmdz(nstep, julien, gmtime, pdtphys, t_seri, paprs, pplay, &
676            cdragh,  coefh, yu1, yv1, ftsol, pctsrf, xlat, xlon,iflag_vdf_trac>=0,sh, &
677            rh, pphi, ustar, wstar, ale_bl, ale_wake,  u10m, v10m, &
678            tr_seri, source, d_tr_cl,d_tr_dec, zmasse)               !RomP
679    ENDIF
680    !======================================================================
681    !       -- Calcul de l'effet de la convection --
682    !======================================================================
683
684    IF (iflag_con_trac==1) THEN
685
686       DO it=1, nbtr
687          IF ( conv_flg(it) == 0 ) CYCLE
688          IF (iflag_con.LT.2) THEN
689             !--pas de transport convectif
690             d_tr_cv(:,:,it)=0.
691
692          ELSE IF (iflag_con.EQ.2) THEN
693             !--ancien transport convectif de Tiedtke
694
695             CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, &
696                  pplay, paprs, tr_seri(:,:,it), d_tr_cv(:,:,it))
697          ELSE   
698             !--nouveau transport convectif de Emanuel
699
700             IF (flag_cvltr(it)) THEN
701                !--nouveau transport convectif de Emanuel avec lessivage convectif
702                !
703                !
704                ccntrAA_3d(:,:) =ccntrAA(it)
705                ccntrENV_3d(:,:)=ccntrENV(it)
706                coefcoli_3d(:,:)=coefcoli(it)
707
708                !--beware this interface is a bit weird because it is called for each tracer
709                !--with the full array tr_seri even if only item it is processed
710
711                CALL cvltr_scav(pdtphys, da, phi,phi2,d1a,dam, mp,ep,         &
712                     sigd,sij,wght_cvfd,clw,elij,epmlmMm,eplaMm,              &     
713                     pmflxr,pmflxs,evap,t_seri,wdtrainA,wdtrainM,             &   
714                     paprs,it,tr_seri,upwd,dnwd,itop_con,ibas_con,            &
715                     ccntrAA_3d,ccntrENV_3d,coefcoli_3d,                      &
716                     d_tr_cv,d_tr_trsp,d_tr_sscav,d_tr_sat,d_tr_uscav,qDi,qPr,&
717                     qPa,qMel,qTrdi,dtrcvMA,Mint,                             &
718                     zmfd1a,zmfphi2,zmfdam)
719
720
721             ELSE  !---flag_cvltr(it).EQ.FALSE
722                !--nouveau transport convectif de Emanuel mais pas de lessivage convectif
723
724                !--beware this interface is a bit weird because it is called for each tracer
725                !--with the full array tr_seri even if only item it is processed
726                !
727                CALL cvltr_noscav(it,pdtphys, da, phi,mp,wght_cvfd,paprs,pplay, &  !jyg
728                     tr_seri,upwd,dnwd,d_tr_cv)                                !jyg
729
730             ENDIF
731
732          ENDIF !--iflag
733
734          !--on ajoute les tendances
735
736          DO k = 1, klev
737             DO i = 1, klon       
738                tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cv(i,k,it)
739             ENDDO
740          ENDDO
741
742          CALL minmaxqfi(tr_seri(:,:,it),0.,1.e33,'convection it = '//TRIM(int2str(it)))
743
744       ENDDO ! nbtr
745
746#ifdef CPP_StratAer
747       IF (type_trac=='coag') THEN
748         ! initialize wet deposition flux of sulfur
749         budg_dep_wet_ocs(:)=0.0
750         budg_dep_wet_so2(:)=0.0
751         budg_dep_wet_h2so4(:)=0.0
752         budg_dep_wet_part(:)=0.0
753         ! compute wet deposition flux of sulfur (sum over gases and particles)
754         ! and convert to kg(S)/m2/s
755         DO i = 1, klon
756         DO k = 1, klev
757         DO it = 1, nbtr
758         !do not include SO2 because most of it comes trom the troposphere
759           IF (it==id_OCS_strat) THEN
760             budg_dep_wet_ocs(i)=budg_dep_wet_ocs(i)+d_tr_cv(i,k,it)*(mSatom/mOCSmol) &
761                            & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
762           ELSEIF (it==id_SO2_strat) THEN
763             budg_dep_wet_so2(i)=budg_dep_wet_so2(i)+d_tr_cv(i,k,it)*(mSatom/mSO2mol) &
764                            & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
765           ELSEIF (it==id_H2SO4_strat) THEN
766             budg_dep_wet_h2so4(i)=budg_dep_wet_h2so4(i)+d_tr_cv(i,k,it)*(mSatom/mH2SO4mol) &
767                            & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
768           ELSEIF (it.GT.nbtr_sulgas) THEN
769             budg_dep_wet_part(i)=budg_dep_wet_part(i)+d_tr_cv(i,k,it)*(mSatom/mH2SO4mol)  &
770                            & *dens_aer_dry*4./3.*RPI*(mdw(it-nbtr_sulgas)/2.)**3 &
771                            & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
772           ENDIF
773         ENDDO
774         ENDDO
775         ENDDO
776       ENDIF
777#endif
778
779    ENDIF ! convection
780
781    !======================================================================
782    !    -- Calcul de l'effet des thermiques --
783    !======================================================================
784
785    DO it=1,nbtr
786       DO k=1,klev
787          DO i=1,klon
788             d_tr_th(i,k,it)=0.
789             tr_seri(i,k,it)=MAX(tr_seri(i,k,it),0.)
790! the next safeguard causes some problem for stratospheric aerosol tracers (particle number)
791! and there is little justification for it so it is commented out (4 December 2017) by OB
792! if reinstated please keep the ifndef CPP_StratAer
793!#ifndef CPP_StratAer
794!             tr_seri(i,k,it)=MIN(tr_seri(i,k,it),1.e10)
795!#endif
796          ENDDO
797       ENDDO
798    ENDDO
799
800    IF (iflag_thermals.GT.0.AND.iflag_the_trac>0) THEN   
801
802       DO it=1, nbtr
803
804          CALL thermcell_dq(klon,klev,1,pdtphys,fm_therm,entr_therm, &
805               zmasse,tr_seri(1:klon,1:klev,it),        &
806               d_tr_th(1:klon,1:klev,it),ztra_th,0 )
807
808          DO k=1,klev
809             DO i=1,klon
810                d_tr_th(i,k,it)=pdtphys*d_tr_th(i,k,it)
811                tr_seri(i,k,it)=MAX(tr_seri(i,k,it)+d_tr_th(i,k,it),0.)
812             ENDDO
813          ENDDO
814
815       ENDDO ! it
816
817    ENDIF ! Thermiques
818
819    !======================================================================
820    !     -- Calcul de l'effet de la couche limite --
821    !======================================================================
822
823    IF (iflag_vdf_trac==1) THEN
824
825       !  Injection during BL mixing
826       !
827#ifdef CPP_StratAer
828       IF (type_trac=='coag') THEN
829
830         ! initialize dry deposition flux of sulfur
831         budg_dep_dry_ocs(:)=0.0
832         budg_dep_dry_so2(:)=0.0
833         budg_dep_dry_h2so4(:)=0.0
834         budg_dep_dry_part(:)=0.0
835
836         ! compute dry deposition velocity as function of surface type (numbers
837         ! from IPSL note 23, 2002)
838         v_dep_dry(:) =  pctsrf(:,is_ter) * 2.5e-3 &
839                     & + pctsrf(:,is_oce) * 0.5e-3 &
840                     & + pctsrf(:,is_lic) * 2.5e-3 &
841                     & + pctsrf(:,is_sic) * 2.5e-3
842
843         ! compute surface dry deposition flux
844         zrho(:,1)=pplay(:,1)/t_seri(:,1)/RD
845
846         DO it=1, nbtr
847          source(:,it) = - v_dep_dry(:) * tr_seri(:,1,it) * zrho(:,1)
848         ENDDO
849
850       ENDIF
851#endif
852
853       DO it=1, nbtr
854          !
855          IF (pbl_flg(it) /= 0) THEN
856             !
857             CALL cltrac(pdtphys, coefh,t_seri,       &
858                  tr_seri(:,:,it), source(:,it),      &
859                  paprs, pplay, delp,                 &
860                  d_tr_cl(:,:,it),d_tr_dry(:,it),flux_tr_dry(:,it))
861             !
862             tr_seri(:,:,it)=tr_seri(:,:,it)+d_tr_cl(:,:,it)
863             !
864#ifdef CPP_StratAer
865             IF (type_trac=='coag') THEN
866               ! compute dry deposition flux of sulfur (sum over gases and particles)
867               IF (it==id_OCS_strat) THEN
868                 budg_dep_dry_ocs(:)=budg_dep_dry_ocs(:)-source(:,it)*(mSatom/mOCSmol)
869               ELSEIF (it==id_SO2_strat) THEN
870                 budg_dep_dry_so2(:)=budg_dep_dry_so2(:)-source(:,it)*(mSatom/mSO2mol)
871               ELSEIF (it==id_H2SO4_strat) THEN
872                 budg_dep_dry_h2so4(:)=budg_dep_dry_h2so4(:)-source(:,it)*(mSatom/mH2SO4mol)
873               ELSEIF (it.GT.nbtr_sulgas) THEN
874                 budg_dep_dry_part(:)=budg_dep_dry_part(:)-source(:,it)*(mSatom/mH2SO4mol)*dens_aer_dry &
875                                & *4./3.*RPI*(mdw(it-nbtr_sulgas)/2.)**3
876               ENDIF
877             ENDIF
878#endif
879             !
880          ENDIF
881          !
882       ENDDO
883       !
884    ELSE IF (iflag_vdf_trac==0) THEN
885       !
886       !   Injection of source in the first model layer
887       !
888       DO it=1,nbtr
889          d_tr_cl(:,1,it)=source(:,it)*RG/delp(:,1)*pdtphys
890          tr_seri(:,1,it)=tr_seri(:,1,it)+d_tr_cl(:,1,it)
891       ENDDO
892       d_tr_cl(:,2:klev,1:nbtr)=0.
893       !
894    ELSE IF (iflag_vdf_trac==-1) THEN
895       !
896       ! Nothing happens
897       d_tr_cl=0.
898       !
899    ELSE
900       !
901       CALL abort_physic('iflag_vdf_trac', 'cas non prevu',1)
902       !
903    ENDIF ! couche limite
904
905    !======================================================================
906    !   Calcul de l'effet de la precipitation grande echelle
907    !   POUR INCA le lessivage est fait directement dans INCA
908    !======================================================================
909
910    IF (lessivage) THEN
911
912       ql_incloud_ref = 10.e-4
913       ql_incloud_ref =  5.e-4
914
915
916       ! calcul du contenu en eau liquide au sein du nuage
917       ql_incl = ql_incloud_ref
918       ! choix du lessivage
919       !
920       IF (iflag_lscav .EQ. 3 .OR. iflag_lscav .EQ. 4) THEN
921          ! ********  Olivier Boucher version (3) possibly with modified ql_incl (4)
922          !
923          DO it = 1, nbtr
924
925             IF (aerosol(it)) THEN
926             !  incloud scavenging and removal by large scale rain ! orig : ql_incl was replaced by 0.5e-3 kg/kg
927             ! the value 0.5e-3 kg/kg is from Giorgi and Chameides (1986), JGR
928             ! Liu (2001) proposed to use 1.5e-3 kg/kg
929
930             CALL lsc_scav(pdtphys,it,iflag_lscav,aerosol,ql_incl,prfl,psfl,rneb,beta_fisrt,  &
931                           beta_v1,pplay,paprs,t_seri,tr_seri,d_tr_insc,d_tr_bcscav,d_tr_evapls,qPrls)
932
933             !large scale scavenging tendency
934             DO k = 1, klev
935                DO i = 1, klon
936                   d_tr_ls(i,k,it)=d_tr_insc(i,k,it)+d_tr_bcscav(i,k,it)+d_tr_evapls(i,k,it)
937                   tr_seri(i,k,it)=tr_seri(i,k,it)+d_tr_ls(i,k,it)
938                ENDDO
939             ENDDO
940             CALL minmaxqfi(tr_seri(:,:,it),0.,1.e33,'lsc scav it = '//TRIM(int2str(it)))
941             ENDIF
942
943          ENDDO  !tr
944
945#ifdef CPP_StratAer
946         IF (type_trac=='coag') THEN
947           ! compute wet deposition flux of sulfur (sum over gases and
948           ! particles) and convert to kg(S)/m2/s
949           ! adding contribution of d_tr_ls to d_tr_cv (above)
950           DO i = 1, klon
951           DO k = 1, klev
952           DO it = 1, nbtr
953             IF (it==id_OCS_strat) THEN
954               budg_dep_wet_ocs(i)=budg_dep_wet_ocs(i)+d_tr_ls(i,k,it)*(mSatom/mOCSmol) &
955                              & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
956             ELSEIF (it==id_SO2_strat) THEN
957               budg_dep_wet_so2(i)=budg_dep_wet_so2(i)+d_tr_ls(i,k,it)*(mSatom/mSO2mol) &
958                              & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
959             ELSEIF (it==id_H2SO4_strat) THEN
960               budg_dep_wet_h2so4(i)=budg_dep_wet_h2so4(i)+d_tr_ls(i,k,it)*(mSatom/mH2SO4mol) &
961                              & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
962             ELSEIF (it.GT.nbtr_sulgas) THEN
963               budg_dep_wet_part(i)=budg_dep_wet_part(i)+d_tr_ls(i,k,it)*(mSatom/mH2SO4mol)  &
964                              & *dens_aer_dry*4./3.*RPI*(mdw(it-nbtr_sulgas)/2.)**3 &
965                              & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
966             ENDIF
967           ENDDO
968           ENDDO
969           ENDDO
970         ENDIF
971#endif
972
973       ELSE IF (iflag_lscav .EQ. 2) THEN ! frac_impa, frac_nucl
974          ! *********   modified  old version
975
976          d_tr_lessi_nucl(:,:,:) = 0.
977          d_tr_lessi_impa(:,:,:) = 0.
978          flestottr(:,:,:) = 0.
979          ! Tendance des aerosols nuclees et impactes
980          DO it = 1, nbtr
981             IF (aerosol(it)) THEN
982                his_dh(:)=0.
983                DO k = 1, klev
984                   DO i = 1, klon
985                      !PhH
986                      zrho(i,k)=pplay(i,k)/t_seri(i,k)/RD
987                      zdz(i,k)=(paprs(i,k)-paprs(i,k+1))/zrho(i,k)/RG
988                      !
989                   ENDDO
990                ENDDO
991
992                DO k=klev-1, 1, -1
993                   DO i=1, klon
994                      !             d_tr_ls(i,k,it)=tr_seri(i,k,it)*(frac_impa(i,k)*frac_nucl(i,k)-1.)
995                      dx=d_tr_ls(i,k,it)
996                      his_dh(i)=his_dh(i)-dx*zrho(i,k)*zdz(i,k)/pdtphys !  kg/m2/s
997                      evaplsc = prfl(i,k) - prfl(i,k+1) + psfl(i,k) - psfl(i,k+1)
998                      ! Evaporation Partielle -> Liberation Partielle 0.5*evap
999                      IF ( evaplsc .LT.0..and.abs(prfl(i,k+1)+psfl(i,k+1)).gt.1.e-10) THEN
1000                         evaplsc = (-evaplsc)/(prfl(i,k+1)+psfl(i,k+1))
1001                         ! evaplsc est donc positif, his_dh(i) est positif
1002                         !-------------- 
1003                         d_tr_evapls(i,k,it)=0.5*evaplsc*(d_tr_lessi_nucl(i,k+1,it) &
1004                              +d_tr_lessi_impa(i,k+1,it))
1005                         !-------------   d_tr_evapls(i,k,it)=-0.5*evaplsc*(d_tr_lsc(i,k+1,it))
1006                         beta=0.5*evaplsc
1007                         if ((prfl(i,k)+psfl(i,k)).lt.1.e-10) THEN
1008                            beta=1.0*evaplsc
1009                         endif
1010                         dx=beta*his_dh(i)/zrho(i,k)/zdz(i,k)*pdtphys
1011                         his_dh(i)=(1.-beta)*his_dh(i)   ! tracer from
1012                         d_tr_evapls(i,k,it)=dx
1013                      ENDIF
1014                      d_tr_ls(i,k,it)=tr_seri(i,k,it)*(frac_impa(i,k)*frac_nucl(i,k)-1.) &
1015                           +d_tr_evapls(i,k,it)
1016
1017                      !--------------
1018                      d_tr_lessi_nucl(i,k,it) = d_tr_lessi_nucl(i,k,it) +    &
1019                           ( 1 - frac_nucl(i,k) )*tr_seri(i,k,it)
1020                      d_tr_lessi_impa(i,k,it) = d_tr_lessi_impa(i,k,it) +    &
1021                           ( 1 - frac_impa(i,k) )*tr_seri(i,k,it)
1022                      !
1023                      ! Flux lessivage total
1024                      flestottr(i,k,it) = flestottr(i,k,it) -   &
1025                           ( d_tr_lessi_nucl(i,k,it)   +        &
1026                           d_tr_lessi_impa(i,k,it) ) *          &
1027                           ( paprs(i,k)-paprs(i,k+1) ) /        &
1028                           (RG * pdtphys)
1029                      !! Mise a jour des traceurs due a l'impaction,nucleation
1030                      !                 tr_seri(i,k,it)=tr_seri(i,k,it)*frac_impa(i,k)*frac_nucl(i,k)
1031                      !!  calcul de la tendance liee au lessivage stratiforme
1032                      !                 d_tr_ls(i,k,it)=tr_seri(i,k,it)*&
1033                      !                                (1.-1./(frac_impa(i,k)*frac_nucl(i,k)))
1034                      !--------------
1035                   ENDDO
1036                ENDDO
1037             ENDIF
1038          ENDDO
1039          ! *********   end modified old version
1040
1041       ELSE IF (iflag_lscav .EQ. 1) THEN ! frac_impa, frac_nucl
1042          ! *********    old version
1043
1044          d_tr_lessi_nucl(:,:,:) = 0.
1045          d_tr_lessi_impa(:,:,:) = 0.
1046          flestottr(:,:,:) = 0.
1047          !=========================
1048          ! LESSIVAGE LARGE SCALE :
1049          !=========================
1050
1051          ! Tendance des aerosols nuclees et impactes
1052          ! -----------------------------------------
1053          DO it = 1, nbtr
1054             IF (aerosol(it)) THEN
1055                DO k = 1, klev
1056                   DO i = 1, klon
1057                      d_tr_lessi_nucl(i,k,it) = d_tr_lessi_nucl(i,k,it) +    &
1058                           ( 1 - frac_nucl(i,k) )*tr_seri(i,k,it)
1059                      d_tr_lessi_impa(i,k,it) = d_tr_lessi_impa(i,k,it) +    &
1060                           ( 1 - frac_impa(i,k) )*tr_seri(i,k,it)
1061
1062                      !
1063                      ! Flux lessivage total
1064                      ! ------------------------------------------------------------
1065                      flestottr(i,k,it) = flestottr(i,k,it) -   &
1066                           ( d_tr_lessi_nucl(i,k,it)   +        &
1067                           d_tr_lessi_impa(i,k,it) ) *          &
1068                           ( paprs(i,k)-paprs(i,k+1) ) /        &
1069                           (RG * pdtphys)
1070                      !
1071                      ! Mise a jour des traceurs due a l'impaction,nucleation
1072                      ! ----------------------------------------------------------------------
1073                      tr_seri(i,k,it)=tr_seri(i,k,it)*frac_impa(i,k)*frac_nucl(i,k)
1074                   ENDDO
1075                ENDDO
1076             ENDIF
1077          ENDDO
1078
1079          ! *********   end old version
1080       ENDIF  !  iflag_lscav . EQ. 1, 2, 3 or 4
1081       !
1082    ENDIF !  lessivage
1083
1084
1085    !    -- CHIMIE INCA  config_inca = aero or chem --
1086    IF (ANY(type_trac == ['inca','inco'])) THEN  ! ModThL
1087
1088       CALL tracinca(&
1089            nstep,    julien,   gmtime,         lafin,     &
1090            pdtphys,  t_seri,   paprs,          pplay,     &
1091            pmfu,     upwd,     ftsol,  pctsrf, pphis,     &
1092            pphi,     albsol,   sh,    ch,     rh,        &
1093            cldfra,   rneb,     diafra,         cldliq,    &
1094            itop_con, ibas_con, pmflxr,         pmflxs,    &
1095            prfl,     psfl,     aerosol_couple, flxmass_w, &
1096            tau_aero, piz_aero, cg_aero,        ccm,       &
1097            rfname,                                        &
1098            tr_seri(:,:,1+nqCO2:nbtr),  source(:,1+nqCO2:nbtr))  ! ModThL 
1099    ENDIF
1100
1101  END SUBROUTINE phytrac
1102
1103END MODULE
Note: See TracBrowser for help on using the repository browser.