source: LMDZ6/trunk/libf/phylmd/phytrac_mod.f90 @ 5272

Last change on this file since 5272 was 5268, checked in by abarral, 43 hours ago

.f90 <-> .F90 depending on cpp key use

  • 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 5268 2024-10-23 17:02:39Z abarral $
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    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 strataer_nuc_mod, ONLY : tracstrataer_init
149    USE aerophys
150
151    USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_STRATAER
152
153    IMPLICIT NONE
154
155    INCLUDE "YOMCST.h"
156    INCLUDE "clesphys.h"
157    !==========================================================================
158    !                   -- ARGUMENT DESCRIPTION --
159    !==========================================================================
160
161    ! Input arguments
162    !----------------
163    !Configuration grille,temps:
164    INTEGER,INTENT(IN) :: nstep      ! Appel physique
165    INTEGER,INTENT(IN) :: julien     ! Jour julien
166    REAL,INTENT(IN)    :: gmtime     ! Heure courante
167    REAL,INTENT(IN)    :: pdtphys    ! Pas d'integration pour la physique (seconde)
168    LOGICAL,INTENT(IN) :: debutphy   ! le flag de l'initialisation de la physique
169    LOGICAL,INTENT(IN) :: lafin      ! le flag de la fin de la physique
170
171    REAL,DIMENSION(klon),INTENT(IN) :: xlat    ! latitudes pour chaque point
172    REAL,DIMENSION(klon),INTENT(IN) :: xlon    ! longitudes pour chaque point
173    !
174    !Physique:
175    !--------
176    REAL,DIMENSION(klon,klev),INTENT(IN)   :: t_seri  ! Temperature
177    REAL,DIMENSION(klon,klev),INTENT(IN)   :: u       ! variable not used
178    REAL,DIMENSION(klon,klev),INTENT(IN)   :: v       ! variable not used
179    REAL,DIMENSION(klon,klev),INTENT(IN)   :: sh      ! humidite specifique
180    REAL,DIMENSION(klon,klev),INTENT(IN)   :: rh      ! humidite relative
181    REAL,DIMENSION(klon,klev),INTENT(IN)   :: ch      ! eau liquide (+ glace si le traceur existe)
182    REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs   ! pression pour chaque inter-couche (en Pa)
183    REAL,DIMENSION(klon,klev),INTENT(IN)   :: pplay   ! pression pour le mileu de chaque couche (en Pa)
184    REAL,DIMENSION(klon,klev),INTENT(IN)   :: pphi    ! geopotentiel
185    REAL,DIMENSION(klon),INTENT(IN)        :: pphis
186    REAL,DIMENSION(klev),INTENT(IN)        :: presnivs
187    REAL,DIMENSION(klon,klev),INTENT(IN)   :: cldliq  ! eau condensee totale
188    REAL,DIMENSION(klon,klev),INTENT(IN)   :: cldfra  ! fraction nuageuse (tous les nuages)
189    REAL,DIMENSION(klon,klev),INTENT(IN)   :: diafra  ! fraction nuageuse (convection ou stratus artificiels)
190    REAL,DIMENSION(klon,klev),INTENT(IN)   :: rneb    ! fraction nuageuse (grande echelle)
191    !
192    REAL                                   :: ql_incl ! contenu en eau liquide nuageuse dans le nuage ! ql_incl=oliq/rneb
193    REAL,DIMENSION(klon,klev),INTENT(IN)   :: beta_fisrt ! taux de conversion de l'eau cond (de fisrtilp)
194    REAL,DIMENSION(klon,klev),INTENT(out)  :: beta_v1    ! -- (originale version)
195
196    !
197    INTEGER,DIMENSION(klon),INTENT(IN)     :: itop_con
198    INTEGER,DIMENSION(klon),INTENT(IN)     :: ibas_con
199    REAL,DIMENSION(klon),INTENT(IN)        :: albsol  ! albedo surface
200    !
201    !Dynamique
202    !--------
203    REAL,DIMENSION(klon,klev,nbtr),INTENT(IN)    :: d_tr_dyn
204    !
205    !Convection:
206    !----------
207    REAL,DIMENSION(klon,klev),INTENT(IN) :: pmfu  ! flux de masse dans le panache montant
208    REAL,DIMENSION(klon,klev),INTENT(IN) :: pmfd  ! flux de masse dans le panache descendant
209    REAL,DIMENSION(klon,klev),INTENT(IN) :: pen_u ! flux entraine dans le panache montant
210    REAL,DIMENSION(klon,klev),INTENT(IN) :: pde_u ! flux detraine dans le panache montant
211    REAL,DIMENSION(klon,klev),INTENT(IN) :: pen_d ! flux entraine dans le panache descendant
212    REAL,DIMENSION(klon,klev),INTENT(IN) :: pde_d ! flux detraine dans le panache descendant
213
214    !...Tiedke     
215    REAL,DIMENSION(klon,klev+1),INTENT(IN)   :: pmflxr, pmflxs ! Flux precipitant de pluie, neige aux interfaces [convection]
216    REAL,DIMENSION(klon,klev+1),INTENT(IN)   :: prfl, psfl ! Flux precipitant de pluie, neige aux interfaces [large-scale]
217
218    LOGICAL,INTENT(IN)                       :: aerosol_couple
219    REAL,DIMENSION(klon,klev),INTENT(IN)     :: flxmass_w
220    REAL,DIMENSION(klon,klev,naero_grp,2),INTENT(IN) :: tau_aero
221    REAL,DIMENSION(klon,klev,naero_grp,2),INTENT(IN) :: piz_aero
222    REAL,DIMENSION(klon,klev,naero_grp,2),INTENT(IN) :: cg_aero
223    CHARACTER(len=4),DIMENSION(naero_grp),INTENT(IN) :: rfname
224    REAL,DIMENSION(klon,klev,2),INTENT(IN)   :: ccm
225    !... K.Emanuel
226    REAL,DIMENSION(klon,klev),INTENT(IN)     :: da
227    REAL,DIMENSION(klon,klev,klev),INTENT(IN):: phi
228    ! RomP >>>
229    REAL,DIMENSION(klon,klev),INTENT(IN)      :: d1a,dam
230    REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: phi2
231    !
232    REAL,DIMENSION(klon,klev),INTENT(IN)      :: wdtrainA
233    REAL,DIMENSION(klon,klev),INTENT(IN)      :: wdtrainM
234    REAL,DIMENSION(klon),INTENT(IN)           :: sigd
235    ! ---- RomP flux entraine, detraine et precipitant kerry Emanuel
236    REAL,DIMENSION(klon,klev),INTENT(IN)      :: evap
237    REAL,DIMENSION(klon,klev),INTENT(IN)      :: ep
238    REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: sij
239    REAL,DIMENSION(klon,klev),INTENT(IN)      :: wght_cvfd          !RL
240    REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: elij
241    REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: epmlmMm
242    REAL,DIMENSION(klon,klev),INTENT(IN)      :: eplaMm
243    REAL,DIMENSION(klon,klev),INTENT(IN)      :: clw
244    ! RomP <<<
245    !
246    REAL,DIMENSION(klon,klev),INTENT(IN)     :: mp
247    REAL,DIMENSION(klon,klev),INTENT(IN)     :: upwd      ! saturated updraft mass flux
248    REAL,DIMENSION(klon,klev),INTENT(IN)     :: dnwd      ! saturated downdraft mass flux
249    !
250    !Thermiques:
251    !----------
252    REAL,DIMENSION(klon,klev+1),INTENT(IN)   :: fm_therm
253    REAL,DIMENSION(klon,klev),INTENT(INOUT)     :: entr_therm
254    !
255    !Couche limite:
256    !--------------
257    !
258    REAL,DIMENSION(:),INTENT(IN)   :: cdragh          ! (klon) coeff drag pour T et Q
259    REAL,DIMENSION(:,:),INTENT(IN) :: coefh           ! (klon,klev) coeff melange CL (m**2/s)
260    REAL,DIMENSION(:),INTENT(IN)   :: ustar,u10m,v10m ! (klon) u* & vent a 10m (m/s)
261    REAL,DIMENSION(:),INTENT(IN)   :: wstar,ale_bl,ale_wake ! (klon) w* and Avail. Lifting Ener.
262    REAL,DIMENSION(:),INTENT(IN)   :: yu1             ! (klon) vents au premier niveau
263    REAL,DIMENSION(:),INTENT(IN)   :: yv1             ! (klon) vents au premier niveau
264    !
265    !Lessivage:
266    !----------
267    !
268    REAL, DIMENSION(:), ALLOCATABLE, SAVE :: ccntrAA
269    REAL, DIMENSION(:), ALLOCATABLE, SAVE :: ccntrENV
270    REAL, DIMENSION(:), ALLOCATABLE, SAVE :: coefcoli
271    LOGICAL, DIMENSION(:), ALLOCATABLE, SAVE :: flag_cvltr
272!$OMP THREADPRIVATE(ccntrAA,ccntrENV,coefcoli,flag_cvltr)
273    REAL, DIMENSION(klon,klev) :: ccntrAA_3d
274    REAL, DIMENSION(klon,klev) :: ccntrENV_3d
275    REAL, DIMENSION(klon,klev) :: coefcoli_3d
276    !
277    ! pour le ON-LINE
278    !
279    REAL,DIMENSION(klon,klev),INTENT(IN) :: frac_impa ! fraction d'aerosols non impactes
280    REAL,DIMENSION(klon,klev),INTENT(IN) :: frac_nucl ! fraction d'aerosols non nuclees
281
282    ! Arguments necessaires pour les sources et puits de traceur:
283    REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: ftsol  ! Temperature du sol (surf)(Kelvin)
284    REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: pctsrf ! Pourcentage de sol (nature du sol)
285
286    REAL,DIMENSION(klon)           :: v_dep_dry !dry deposition velocity of stratospheric sulfate in m/s
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
513IF (CPPKEY_STRATAER) THEN
514       ELSE IF (type_trac == 'coag') THEN
515          source(:,:)=0.
516          CALL tracstrataer_init(aerosol,lessivage)       ! init aerosols and lessivage param
517END IF
518       ELSE IF (type_trac == 'lmdz') THEN
519          CALL traclmdz_init(pctsrf,xlat,xlon,ftsol,tr_seri,t_seri,pplay,sh,pdtphys,aerosol,lessivage)
520       ENDIF
521
522       !
523       !--initialising coefficients for scavenging in the case of NP
524       !
525       ALLOCATE(flag_cvltr(nbtr))
526       IF (iflag_con.EQ.3) THEN
527          !
528          ALLOCATE(ccntrAA(nbtr))
529          ALLOCATE(ccntrENV(nbtr))
530          ALLOCATE(coefcoli(nbtr))
531          !
532          DO it=1, nbtr
533             IF (type_trac == 'repr') THEN
534                 flag_cvltr(it)=.FALSE.
535             ELSE IF (type_trac == 'inca') THEN
536!                IF ((it.EQ.id_Rn222) .OR. ((it.GE.id_SO2) .AND. (it.LE.id_NH3)) ) THEN
537!                   !--gas-phase species
538!                   flag_cvltr(it)=.FALSE.
539!
540!                ELSEIF ( (it.GE.id_CIDUSTM) .AND. (it.LE.id_AIN) ) THEN
541!                   !--insoluble aerosol species
542!                   flag_cvltr(it)=.TRUE.
543!                   ccntrAA(it)=0.7
544!                   ccntrENV(it)=0.7
545!                   coefcoli(it)=0.001
546!                ELSEIF ( (it.EQ.id_Pb210) .OR. ((it.GE.id_CSSSM) .AND. (it.LE.id_SSN))) THEN
547!                   !--soluble aerosol species
548!                   flag_cvltr(it)=.TRUE.
549!                   ccntrAA(it)=0.9
550!                   ccntrENV(it)=0.9
551!                   coefcoli(it)=0.001
552!                ELSE
553!                   WRITE(lunout,*) 'pb it=', it
554!                   CALL abort_physic('phytrac','pb it scavenging',1)
555!                ENDIF
556                !--test OB
557                !--for now we do not scavenge in cvltr
558                flag_cvltr(it)=.FALSE.
559             ELSE IF (type_trac == 'co2i') THEN
560                !--co2 tracers are not scavenged
561                flag_cvltr(it)=.FALSE.
562             ELSE IF (type_trac == 'inco') THEN     ! Add ThL
563                flag_cvltr(it)=.FALSE.
564IF (CPPKEY_STRATAER) THEN
565             ELSE IF (type_trac == 'coag') THEN
566                IF (convscav.and.aerosol(it)) THEN
567                   flag_cvltr(it)=.TRUE.
568                   ccntrAA(it) =ccntrAA_in
569                   ccntrENV(it)=ccntrENV_in
570                   coefcoli(it)=coefcoli_in
571                ELSE
572                   flag_cvltr(it)=.FALSE.
573                ENDIF
574END IF
575             ELSE IF (type_trac == 'lmdz') THEN
576                IF (convscav.and.aerosol(it)) THEN
577                   flag_cvltr(it)=.TRUE.
578                   ccntrAA(it) =ccntrAA_in    !--a modifier par JYG a lire depuis fichier
579                   ccntrENV(it)=ccntrENV_in
580                   coefcoli(it)=coefcoli_in
581                ELSE
582                   flag_cvltr(it)=.FALSE.
583                ENDIF
584             ENDIF
585          ENDDO
586          !
587       ELSE ! iflag_con .ne. 3
588          flag_cvltr(:) = .FALSE.
589       ENDIF
590       !
591       ! print out all tracer flags
592       !
593       WRITE(lunout,*) 'print out all tracer flags'
594       WRITE(lunout,*) 'type_trac      =', type_trac
595       WRITE(lunout,*) 'config_inca    =', config_inca
596       WRITE(lunout,*) 'iflag_con_trac =', iflag_con_trac
597       WRITE(lunout,*) 'iflag_con      =', iflag_con
598       WRITE(lunout,*) 'convscav       =', convscav
599       WRITE(lunout,*) 'iflag_lscav    =', iflag_lscav
600       WRITE(lunout,*) 'aerosol        =', aerosol
601       WRITE(lunout,*) 'iflag_the_trac =', iflag_the_trac
602       WRITE(lunout,*) 'iflag_thermals =', iflag_thermals
603       WRITE(lunout,*) 'iflag_vdf_trac =', iflag_vdf_trac
604       WRITE(lunout,*) 'pbl_flg        =', pbl_flg
605       WRITE(lunout,*) 'lessivage      =', lessivage
606       write(lunout,*)  'flag_cvltr    = ', flag_cvltr
607
608       IF (lessivage .AND. ANY(type_trac == ['inca','inco'])) &
609          CALL abort_physic('phytrac', 'lessivage=T config_inca=inca impossible',1)
610       !
611    ENDIF ! of IF (debutphy)
612    !############################################ END INITIALIZATION #######
613
614    DO k=1,klev
615       DO i=1,klon
616          zmasse(i,k)=(paprs(i,k)-paprs(i,k+1))/rg
617       ENDDO
618    ENDDO
619    !
620    IF (id_be .GT. 0) THEN
621       DO k=1,klev
622          DO i=1,klon
623             sourceBE(i,k)=srcbe(i,k)       !RomP  -> pour sortie histrac
624          ENDDO
625       ENDDO
626    ENDIF
627
628    !===============================================================================
629    !    -- Do specific treatment according to chemestry model or local LMDZ tracers
630    !     
631    !===============================================================================
632    IF (type_trac == 'inca') THEN
633       !    -- CHIMIE INCA  config_inca = aero or chem --
634       ! Appel fait en fin de phytrac pour avoir les emissions modifiees par
635       ! la couche limite et la convection avant le calcul de la chimie
636
637    ELSE IF (type_trac == 'repr') THEN
638       !   -- CHIMIE REPROBUS --
639       CALL tracreprobus(pdtphys, gmtime, debutphy, julien, &
640            presnivs, xlat, xlon, pphis, pphi, &
641            t_seri, pplay, paprs, sh , &
642            tr_seri)
643
644    ELSE IF (type_trac == 'co2i') THEN
645       !   -- CO2 interactif --
646       !   -- source is updated with FF and BB emissions
647       !   -- and net fluxes from ocean and orchidee
648       !   -- sign convention : positive into the atmosphere
649
650       CALL tracco2i(pdtphys, debutphy, &
651            xlat, xlon, pphis, pphi, &
652            t_seri, pplay, paprs, tr_seri, source)
653    ELSE IF (type_trac == 'inco') THEN      ! Add ThL
654       CALL tracco2i(pdtphys, debutphy, &
655            xlat, xlon, pphis, pphi, &
656            t_seri, pplay, paprs, tr_seri, source)
657
658IF (CPPKEY_STRATAER) THEN
659    ELSE IF (type_trac == 'coag') THEN
660       !   --STRATOSPHERIC AER IN THE STRAT --
661       CALL traccoag(pdtphys, gmtime, debutphy, julien, &
662            presnivs, xlat, xlon, pphis, pphi, &
663            t_seri, pplay, paprs, sh, rh , &
664            tr_seri)
665END IF
666    ELSE IF (type_trac == 'lmdz') THEN
667       !    -- Traitement des traceurs avec traclmdz
668       CALL traclmdz(nstep, julien, gmtime, pdtphys, t_seri, paprs, pplay, &
669            cdragh,  coefh, yu1, yv1, ftsol, pctsrf, xlat, xlon,iflag_vdf_trac>=0,sh, &
670            rh, pphi, ustar, wstar, ale_bl, ale_wake,  u10m, v10m, &
671            tr_seri, source, d_tr_cl,d_tr_dec, zmasse)               !RomP
672    ENDIF
673    !======================================================================
674    !       -- Calcul de l'effet de la convection --
675    !======================================================================
676
677    IF (iflag_con_trac==1) THEN
678
679       DO it=1, nbtr
680          IF ( conv_flg(it) == 0 ) CYCLE
681          IF (iflag_con.LT.2) THEN
682             !--pas de transport convectif
683             d_tr_cv(:,:,it)=0.
684
685          ELSE IF (iflag_con.EQ.2) THEN
686             !--ancien transport convectif de Tiedtke
687
688             CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, &
689                  pplay, paprs, tr_seri(:,:,it), d_tr_cv(:,:,it))
690          ELSE   
691             !--nouveau transport convectif de Emanuel
692
693             IF (flag_cvltr(it)) THEN
694                !--nouveau transport convectif de Emanuel avec lessivage convectif
695                !
696                !
697                ccntrAA_3d(:,:) =ccntrAA(it)
698                ccntrENV_3d(:,:)=ccntrENV(it)
699                coefcoli_3d(:,:)=coefcoli(it)
700
701                !--beware this interface is a bit weird because it is called for each tracer
702                !--with the full array tr_seri even if only item it is processed
703
704                CALL cvltr_scav(pdtphys, da, phi,phi2,d1a,dam, mp,ep,         &
705                     sigd,sij,wght_cvfd,clw,elij,epmlmMm,eplaMm,              &     
706                     pmflxr,pmflxs,evap,t_seri,wdtrainA,wdtrainM,             &   
707                     paprs,it,tr_seri,upwd,dnwd,itop_con,ibas_con,            &
708                     ccntrAA_3d,ccntrENV_3d,coefcoli_3d,                      &
709                     d_tr_cv,d_tr_trsp,d_tr_sscav,d_tr_sat,d_tr_uscav,qDi,qPr,&
710                     qPa,qMel,qTrdi,dtrcvMA,Mint,                             &
711                     zmfd1a,zmfphi2,zmfdam)
712
713
714             ELSE  !---flag_cvltr(it).EQ.FALSE
715                !--nouveau transport convectif de Emanuel mais pas de lessivage convectif
716
717                !--beware this interface is a bit weird because it is called for each tracer
718                !--with the full array tr_seri even if only item it is processed
719                !
720                CALL cvltr_noscav(it,pdtphys, da, phi,mp,wght_cvfd,paprs,pplay, &  !jyg
721                     tr_seri,upwd,dnwd,d_tr_cv)                                !jyg
722
723             ENDIF
724
725          ENDIF !--iflag
726
727          !--on ajoute les tendances
728
729          DO k = 1, klev
730             DO i = 1, klon       
731                tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cv(i,k,it)
732             ENDDO
733          ENDDO
734
735          CALL minmaxqfi(tr_seri(:,:,it),0.,1.e33,'convection it = '//TRIM(int2str(it)))
736
737       ENDDO ! nbtr
738
739IF (CPPKEY_STRATAER) THEN
740       IF (type_trac=='coag') THEN
741         ! initialize wet deposition flux of sulfur
742         budg_dep_wet_ocs(:)=0.0
743         budg_dep_wet_so2(:)=0.0
744         budg_dep_wet_h2so4(:)=0.0
745         budg_dep_wet_part(:)=0.0
746         ! compute wet deposition flux of sulfur (sum over gases and particles)
747         ! and convert to kg(S)/m2/s
748         DO i = 1, klon
749         DO k = 1, klev
750         DO it = 1, nbtr
751         !do not include SO2 because most of it comes trom the troposphere
752           IF (it==id_OCS_strat) THEN
753             budg_dep_wet_ocs(i)=budg_dep_wet_ocs(i)+d_tr_cv(i,k,it)*(mSatom/mOCSmol) &
754                            & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
755           ELSEIF (it==id_SO2_strat) THEN
756             budg_dep_wet_so2(i)=budg_dep_wet_so2(i)+d_tr_cv(i,k,it)*(mSatom/mSO2mol) &
757                            & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
758           ELSEIF (it==id_H2SO4_strat) THEN
759             budg_dep_wet_h2so4(i)=budg_dep_wet_h2so4(i)+d_tr_cv(i,k,it)*(mSatom/mH2SO4mol) &
760                            & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
761           ELSEIF (it.GT.nbtr_sulgas) THEN
762             budg_dep_wet_part(i)=budg_dep_wet_part(i)+d_tr_cv(i,k,it)*(mSatom/mH2SO4mol)  &
763                            & *dens_aer_dry*4./3.*RPI*(mdw(it-nbtr_sulgas)/2.)**3 &
764                            & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
765           ENDIF
766         ENDDO
767         ENDDO
768         ENDDO
769       ENDIF
770END IF
771
772    ENDIF ! convection
773
774    !======================================================================
775    !    -- Calcul de l'effet des thermiques --
776    !======================================================================
777
778    DO it=1,nbtr
779       DO k=1,klev
780          DO i=1,klon
781             d_tr_th(i,k,it)=0.
782             tr_seri(i,k,it)=MAX(tr_seri(i,k,it),0.)
783! the next safeguard causes some problem for stratospheric aerosol tracers (particle number)
784! and there is little justification for it so it is commented out (4 December 2017) by OB
785! if reinstated please keep the ifndef CPP_StratAer
786!#ifndef CPP_StratAer
787!             tr_seri(i,k,it)=MIN(tr_seri(i,k,it),1.e10)
788!#endif
789          ENDDO
790       ENDDO
791    ENDDO
792
793    IF (iflag_thermals.GT.0.AND.iflag_the_trac>0) THEN   
794
795       DO it=1, nbtr
796
797          CALL thermcell_dq(klon,klev,1,pdtphys,fm_therm,entr_therm, &
798               zmasse,tr_seri(1:klon,1:klev,it),        &
799               d_tr_th(1:klon,1:klev,it),ztra_th,0 )
800
801          DO k=1,klev
802             DO i=1,klon
803                d_tr_th(i,k,it)=pdtphys*d_tr_th(i,k,it)
804                tr_seri(i,k,it)=MAX(tr_seri(i,k,it)+d_tr_th(i,k,it),0.)
805             ENDDO
806          ENDDO
807
808       ENDDO ! it
809
810    ENDIF ! Thermiques
811
812    !======================================================================
813    !     -- Calcul de l'effet de la couche limite --
814    !======================================================================
815
816    IF (iflag_vdf_trac==1) THEN
817
818       !  Injection during BL mixing
819       !
820IF (CPPKEY_STRATAER) THEN
821       IF (type_trac=='coag') THEN
822
823         ! initialize dry deposition flux of sulfur
824         budg_dep_dry_ocs(:)=0.0
825         budg_dep_dry_so2(:)=0.0
826         budg_dep_dry_h2so4(:)=0.0
827         budg_dep_dry_part(:)=0.0
828
829         ! compute dry deposition velocity as function of surface type (numbers
830         ! from IPSL note 23, 2002)
831         v_dep_dry(:) =  pctsrf(:,is_ter) * 2.5e-3 &
832                     & + pctsrf(:,is_oce) * 0.5e-3 &
833                     & + pctsrf(:,is_lic) * 2.5e-3 &
834                     & + pctsrf(:,is_sic) * 2.5e-3
835
836         ! compute surface dry deposition flux
837         zrho(:,1)=pplay(:,1)/t_seri(:,1)/RD
838
839         DO it=1, nbtr
840          source(:,it) = - v_dep_dry(:) * tr_seri(:,1,it) * zrho(:,1)
841         ENDDO
842
843       ENDIF
844END IF
845
846       DO it=1, nbtr
847          !
848          IF (pbl_flg(it) /= 0) THEN
849             !
850             CALL cltrac(pdtphys, coefh,t_seri,       &
851                  tr_seri(:,:,it), source(:,it),      &
852                  paprs, pplay, delp,                 &
853                  d_tr_cl(:,:,it),d_tr_dry(:,it),flux_tr_dry(:,it))
854             !
855             tr_seri(:,:,it)=tr_seri(:,:,it)+d_tr_cl(:,:,it)
856             !
857IF (CPPKEY_STRATAER) THEN
858             IF (type_trac=='coag') THEN
859               ! compute dry deposition flux of sulfur (sum over gases and particles)
860               IF (it==id_OCS_strat) THEN
861                 budg_dep_dry_ocs(:)=budg_dep_dry_ocs(:)-source(:,it)*(mSatom/mOCSmol)
862               ELSEIF (it==id_SO2_strat) THEN
863                 budg_dep_dry_so2(:)=budg_dep_dry_so2(:)-source(:,it)*(mSatom/mSO2mol)
864               ELSEIF (it==id_H2SO4_strat) THEN
865                 budg_dep_dry_h2so4(:)=budg_dep_dry_h2so4(:)-source(:,it)*(mSatom/mH2SO4mol)
866               ELSEIF (it.GT.nbtr_sulgas) THEN
867                 budg_dep_dry_part(:)=budg_dep_dry_part(:)-source(:,it)*(mSatom/mH2SO4mol)*dens_aer_dry &
868                                & *4./3.*RPI*(mdw(it-nbtr_sulgas)/2.)**3
869               ENDIF
870             ENDIF
871END IF
872             !
873          ENDIF
874          !
875       ENDDO
876       !
877    ELSE IF (iflag_vdf_trac==0) THEN
878       !
879       !   Injection of source in the first model layer
880       !
881       DO it=1,nbtr
882          d_tr_cl(:,1,it)=source(:,it)*RG/delp(:,1)*pdtphys
883          tr_seri(:,1,it)=tr_seri(:,1,it)+d_tr_cl(:,1,it)
884       ENDDO
885       d_tr_cl(:,2:klev,1:nbtr)=0.
886       !
887    ELSE IF (iflag_vdf_trac==-1) THEN
888       !
889       ! Nothing happens
890       d_tr_cl=0.
891       !
892    ELSE
893       !
894       CALL abort_physic('iflag_vdf_trac', 'cas non prevu',1)
895       !
896    ENDIF ! couche limite
897
898    !======================================================================
899    !   Calcul de l'effet de la precipitation grande echelle
900    !   POUR INCA le lessivage est fait directement dans INCA
901    !======================================================================
902
903    IF (lessivage) THEN
904
905       ql_incloud_ref = 10.e-4
906       ql_incloud_ref =  5.e-4
907
908
909       ! calcul du contenu en eau liquide au sein du nuage
910       ql_incl = ql_incloud_ref
911       ! choix du lessivage
912       !
913       IF (iflag_lscav .EQ. 3 .OR. iflag_lscav .EQ. 4) THEN
914          ! ********  Olivier Boucher version (3) possibly with modified ql_incl (4)
915          !
916          DO it = 1, nbtr
917
918             IF (aerosol(it)) THEN
919             !  incloud scavenging and removal by large scale rain ! orig : ql_incl was replaced by 0.5e-3 kg/kg
920             ! the value 0.5e-3 kg/kg is from Giorgi and Chameides (1986), JGR
921             ! Liu (2001) proposed to use 1.5e-3 kg/kg
922
923             CALL lsc_scav(pdtphys,it,iflag_lscav,aerosol,ql_incl,prfl,psfl,rneb,beta_fisrt,  &
924                           beta_v1,pplay,paprs,t_seri,tr_seri,d_tr_insc,d_tr_bcscav,d_tr_evapls,qPrls)
925
926             !large scale scavenging tendency
927             DO k = 1, klev
928                DO i = 1, klon
929                   d_tr_ls(i,k,it)=d_tr_insc(i,k,it)+d_tr_bcscav(i,k,it)+d_tr_evapls(i,k,it)
930                   tr_seri(i,k,it)=tr_seri(i,k,it)+d_tr_ls(i,k,it)
931                ENDDO
932             ENDDO
933             CALL minmaxqfi(tr_seri(:,:,it),0.,1.e33,'lsc scav it = '//TRIM(int2str(it)))
934             ENDIF
935
936          ENDDO  !tr
937
938IF (CPPKEY_STRATAER) THEN
939         IF (type_trac=='coag') THEN
940           ! compute wet deposition flux of sulfur (sum over gases and
941           ! particles) and convert to kg(S)/m2/s
942           ! adding contribution of d_tr_ls to d_tr_cv (above)
943           DO i = 1, klon
944           DO k = 1, klev
945           DO it = 1, nbtr
946             IF (it==id_OCS_strat) THEN
947               budg_dep_wet_ocs(i)=budg_dep_wet_ocs(i)+d_tr_ls(i,k,it)*(mSatom/mOCSmol) &
948                              & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
949             ELSEIF (it==id_SO2_strat) THEN
950               budg_dep_wet_so2(i)=budg_dep_wet_so2(i)+d_tr_ls(i,k,it)*(mSatom/mSO2mol) &
951                              & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
952             ELSEIF (it==id_H2SO4_strat) THEN
953               budg_dep_wet_h2so4(i)=budg_dep_wet_h2so4(i)+d_tr_ls(i,k,it)*(mSatom/mH2SO4mol) &
954                              & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
955             ELSEIF (it.GT.nbtr_sulgas) THEN
956               budg_dep_wet_part(i)=budg_dep_wet_part(i)+d_tr_ls(i,k,it)*(mSatom/mH2SO4mol)  &
957                              & *dens_aer_dry*4./3.*RPI*(mdw(it-nbtr_sulgas)/2.)**3 &
958                              & *(paprs(i,k)-paprs(i,k+1))/RG/pdtphys
959             ENDIF
960           ENDDO
961           ENDDO
962           ENDDO
963         ENDIF
964END IF
965
966       ELSE IF (iflag_lscav .EQ. 2) THEN ! frac_impa, frac_nucl
967          ! *********   modified  old version
968
969          d_tr_lessi_nucl(:,:,:) = 0.
970          d_tr_lessi_impa(:,:,:) = 0.
971          flestottr(:,:,:) = 0.
972          ! Tendance des aerosols nuclees et impactes
973          DO it = 1, nbtr
974             IF (aerosol(it)) THEN
975                his_dh(:)=0.
976                DO k = 1, klev
977                   DO i = 1, klon
978                      !PhH
979                      zrho(i,k)=pplay(i,k)/t_seri(i,k)/RD
980                      zdz(i,k)=(paprs(i,k)-paprs(i,k+1))/zrho(i,k)/RG
981                      !
982                   ENDDO
983                ENDDO
984
985                DO k=klev-1, 1, -1
986                   DO i=1, klon
987                      !             d_tr_ls(i,k,it)=tr_seri(i,k,it)*(frac_impa(i,k)*frac_nucl(i,k)-1.)
988                      dx=d_tr_ls(i,k,it)
989                      his_dh(i)=his_dh(i)-dx*zrho(i,k)*zdz(i,k)/pdtphys !  kg/m2/s
990                      evaplsc = prfl(i,k) - prfl(i,k+1) + psfl(i,k) - psfl(i,k+1)
991                      ! Evaporation Partielle -> Liberation Partielle 0.5*evap
992                      IF ( evaplsc .LT.0..and.abs(prfl(i,k+1)+psfl(i,k+1)).gt.1.e-10) THEN
993                         evaplsc = (-evaplsc)/(prfl(i,k+1)+psfl(i,k+1))
994                         ! evaplsc est donc positif, his_dh(i) est positif
995                         !-------------- 
996                         d_tr_evapls(i,k,it)=0.5*evaplsc*(d_tr_lessi_nucl(i,k+1,it) &
997                              +d_tr_lessi_impa(i,k+1,it))
998                         !-------------   d_tr_evapls(i,k,it)=-0.5*evaplsc*(d_tr_lsc(i,k+1,it))
999                         beta=0.5*evaplsc
1000                         if ((prfl(i,k)+psfl(i,k)).lt.1.e-10) THEN
1001                            beta=1.0*evaplsc
1002                         endif
1003                         dx=beta*his_dh(i)/zrho(i,k)/zdz(i,k)*pdtphys
1004                         his_dh(i)=(1.-beta)*his_dh(i)   ! tracer from
1005                         d_tr_evapls(i,k,it)=dx
1006                      ENDIF
1007                      d_tr_ls(i,k,it)=tr_seri(i,k,it)*(frac_impa(i,k)*frac_nucl(i,k)-1.) &
1008                           +d_tr_evapls(i,k,it)
1009
1010                      !--------------
1011                      d_tr_lessi_nucl(i,k,it) = d_tr_lessi_nucl(i,k,it) +    &
1012                           ( 1 - frac_nucl(i,k) )*tr_seri(i,k,it)
1013                      d_tr_lessi_impa(i,k,it) = d_tr_lessi_impa(i,k,it) +    &
1014                           ( 1 - frac_impa(i,k) )*tr_seri(i,k,it)
1015                      !
1016                      ! Flux lessivage total
1017                      flestottr(i,k,it) = flestottr(i,k,it) -   &
1018                           ( d_tr_lessi_nucl(i,k,it)   +        &
1019                           d_tr_lessi_impa(i,k,it) ) *          &
1020                           ( paprs(i,k)-paprs(i,k+1) ) /        &
1021                           (RG * pdtphys)
1022                      !! Mise a jour des traceurs due a l'impaction,nucleation
1023                      !                 tr_seri(i,k,it)=tr_seri(i,k,it)*frac_impa(i,k)*frac_nucl(i,k)
1024                      !!  calcul de la tendance liee au lessivage stratiforme
1025                      !                 d_tr_ls(i,k,it)=tr_seri(i,k,it)*&
1026                      !                                (1.-1./(frac_impa(i,k)*frac_nucl(i,k)))
1027                      !--------------
1028                   ENDDO
1029                ENDDO
1030             ENDIF
1031          ENDDO
1032          ! *********   end modified old version
1033
1034       ELSE IF (iflag_lscav .EQ. 1) THEN ! frac_impa, frac_nucl
1035          ! *********    old version
1036
1037          d_tr_lessi_nucl(:,:,:) = 0.
1038          d_tr_lessi_impa(:,:,:) = 0.
1039          flestottr(:,:,:) = 0.
1040          !=========================
1041          ! LESSIVAGE LARGE SCALE :
1042          !=========================
1043
1044          ! Tendance des aerosols nuclees et impactes
1045          ! -----------------------------------------
1046          DO it = 1, nbtr
1047             IF (aerosol(it)) THEN
1048                DO k = 1, klev
1049                   DO i = 1, klon
1050                      d_tr_lessi_nucl(i,k,it) = d_tr_lessi_nucl(i,k,it) +    &
1051                           ( 1 - frac_nucl(i,k) )*tr_seri(i,k,it)
1052                      d_tr_lessi_impa(i,k,it) = d_tr_lessi_impa(i,k,it) +    &
1053                           ( 1 - frac_impa(i,k) )*tr_seri(i,k,it)
1054
1055                      !
1056                      ! Flux lessivage total
1057                      ! ------------------------------------------------------------
1058                      flestottr(i,k,it) = flestottr(i,k,it) -   &
1059                           ( d_tr_lessi_nucl(i,k,it)   +        &
1060                           d_tr_lessi_impa(i,k,it) ) *          &
1061                           ( paprs(i,k)-paprs(i,k+1) ) /        &
1062                           (RG * pdtphys)
1063                      !
1064                      ! Mise a jour des traceurs due a l'impaction,nucleation
1065                      ! ----------------------------------------------------------------------
1066                      tr_seri(i,k,it)=tr_seri(i,k,it)*frac_impa(i,k)*frac_nucl(i,k)
1067                   ENDDO
1068                ENDDO
1069             ENDIF
1070          ENDDO
1071
1072          ! *********   end old version
1073       ENDIF  !  iflag_lscav .EQ. 1, 2, 3 or 4
1074       !
1075    ENDIF !  lessivage
1076
1077
1078    !    -- CHIMIE INCA  config_inca = aero or chem --
1079    IF (ANY(type_trac == ['inca','inco'])) THEN  ! ModThL
1080
1081       CALL tracinca(&
1082            nstep,    julien,   gmtime,         lafin,     &
1083            pdtphys,  t_seri,   paprs,          pplay,     &
1084            pmfu,     upwd,     ftsol,  pctsrf, pphis,     &
1085            pphi,     albsol,   sh,    ch,     rh,        &
1086            cldfra,   rneb,     diafra,         cldliq,    &
1087            itop_con, ibas_con, pmflxr,         pmflxs,    &
1088            prfl,     psfl,     aerosol_couple, flxmass_w, &
1089            tau_aero, piz_aero, cg_aero,        ccm,       &
1090            rfname,                                        &
1091            tr_seri(:,:,1+nqCO2:nbtr),  source(:,1+nqCO2:nbtr))  ! ModThL 
1092    ENDIF
1093
1094  END SUBROUTINE phytrac
1095
1096END MODULE
Note: See TracBrowser for help on using the repository browser.