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

Last change on this file since 4122 was 4089, checked in by fhourdin, 2 years ago

Reecriture des thermiques

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