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

Last change on this file since 4514 was 4514, checked in by oboucher, 14 months ago

cleaning up lsc_scav.F90

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