source: LMDZ6/branches/IPSLCM6.0.14/libf/phylmd/phytrac_mod.F90 @ 3255

Last change on this file since 3255 was 3109, checked in by oboucher, 7 years ago

Commenting out the safeguard test that puts an upper bound to tr_seri

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