source: LMDZ6/trunk/libf/phylmd/phytrac_mod.f90

Last change on this file was 5274, checked in by abarral, 51 minutes ago

Replace yomcst.h by existing module

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