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

Last change on this file since 3465 was 3465, checked in by Laurent Fairhead, 5 years ago

Further modifications for DYNAMICO/LMDZ convergence. These are based
on Yann's LMDZ6_V2 sources. Compiles on irene and converges with revision 3459
in a bucket configuration
YM/LF

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