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

Last change on this file since 3453 was 3450, checked in by oboucher, 6 years ago

Various additions for the interactive CO2 cycle

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