source: LMDZ6/branches/LMDZ-QUEST/libf/phylmd/phytrac_mod.F90 @ 5021

Last change on this file since 5021 was 3419, checked in by acozic, 6 years ago

merge with rev 3418 of trunk

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