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

Last change on this file since 3412 was 3361, checked in by oboucher, 6 years ago

Embryon of changes for interactive CO2
type_trac=co2i

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