! #include "tm5.inc" ! !----------------------------------------------------------------------- ! ! changed for coupling with M7 by Elisabetta Vignati 2005 !----------------------------------------------------------------------- module chem_param use global_types, only : d3_data use dims, only : nregions use binas, only : xmair use reaction_data #ifndef without_photolysis use photolysis_data #endif use deposition_data ! JadB. There was nmodes (from here) and nmod (from m7), both set to 7. Use only one parameter. I chose nmod. #ifdef with_m7 Use mo_aero_m7, only : nmod use mo_aero_m7, only : dh2so4, ddust, dbc, doc, dnacl use mo_aero, only : cmr_ff, cmr_bb, cmr_sk, cmr_sa, cmr_sc, facso2 use mo_aero, only : zbb_wsoc_perc, zbge_wsoc_perc !use mo_aero, only : zom2oc #endif implicit none #ifndef with_m7 integer, parameter :: nmod = 1 #endif ! For compatibility with old code, we will redefine nmodes as the same as nmod Integer, Parameter :: nmodes = nmod ! budget of SO4: specific !PLS type(d3_data), dimension(nregions), target :: so4pg, so4pa ! budget of ozone, and CH4 oxidation (double check) type(d3_data), dimension(nregions), target :: o3t, o3s ! transport, stratospheric type(d3_data), dimension(nregions), target :: o3ts ! to store 'old' o3 field type(d3_data), dimension(nregions), target :: o3p, o3l ! o3 production and loss terms.. !PLS type(d3_data), dimension(nregions), target :: ch4oh, ch4_ps ! ch4+oh descrutct. and pseudosource integer, parameter :: nmark= 1 ! number of 'marked' tracers integer, parameter :: nstd = 1 ! number of 'std deviation' in mmix output #ifdef with_cariolle #ifdef with_budgets integer, parameter :: ncar = 2 ! o3 and psc #endif #endif ! ! molar weights of components. ! These need to be calculated to a variable to which is referred ! in Tracers.txt ! real, parameter :: xmh=1.0079 real, parameter :: xmn=14.0067 real, parameter :: xmc=12.01115 real, parameter :: xms=32.064 real, parameter :: xmo=15.9994 real, parameter :: xmna=22.990 real, parameter :: xmcl=35.453 real, parameter :: xmnacl=xmna+xmcl ! Sea salt is 30.6% sodium (Millero, 2004) real, parameter :: xmo3=xmo*3 real, parameter :: xmnox=xmn real, parameter :: xmh2o2=xmo*2.+xmh*2. real, parameter :: xmch4=xmc+xmh*4. real, parameter :: xmco=xmc+xmo real, parameter :: xmhno3=xmh+xmn+xmo*3. real, parameter :: xmmepe=xmc+xmh*4.+xmo*2. real, parameter :: xmch2o=xmc+xmh*2.+xmo real, parameter :: xmno=xmn+xmo real, parameter :: xmho2=xmh+xmo*2. real, parameter :: xmch3o2=xmc+2.*xmo+3.*xmh real, parameter :: xmoh=xmo+xmh real, parameter :: xmno2=xmn+2.*xmo real, parameter :: xmno3=xmn+3.*xmo real, parameter :: xmn2o5=2.*xmn+5.*xmo real, parameter :: xmhno4=xmn+4.*xmo+xmh ! FD real, parameter :: xmair=28.94 real, parameter :: xmh2o=xmh*2+xmo ! xmpar is the results of the CBM4 implementation...calculate as C real, parameter :: xmpar=xmc real, parameter :: xmeth=2.*xmc real, parameter :: xmole=2.*xmc real, parameter :: xmisop=5.*xmc+8.*xmh real, parameter :: xmgly=3.*xmc+4.*xmh+2.*xmo real, parameter :: xmald2=2.*xmc real, parameter :: xmc2o3=2.*xmc+3.*xmo+3.*xmh real, parameter :: xmpan=2.*xmc+3.*xmh+3.*xmo+xmn+2.*xmo! ch3co-o2-no2 real, parameter :: xmror=2.*xmc+4.*xmh real, parameter :: xmrxpar=xmc real, parameter :: xmrooh=xmc+3.*xmh+2*xmo real, parameter :: xmorgntr=xmn+3.*xmh+xmc+3*xmo ! JEW CH3ONO2 real, parameter :: xmxo2=2.*xmo+xmc real, parameter :: xmxo2n=2.*xmo+xmc real, parameter :: xmbc=xmc real, parameter :: xmpom=xmair !EV needed for M7 real, parameter :: xmh2so4=2.*xmh+xms+4.*xmo real, parameter :: xmdust=xmair real, parameter :: xmnumb=xmair ! attention xmso2: conversion emissions done when added... real, parameter :: xmso2=xms+2.*xmo real, parameter :: xmdms=xms+2*xmc+6*xmh ! attention xmnh3: conversion emissions when added... real, parameter :: xmnh3=xmn+3.*xmh ! attention: conversion emissions when added... real, parameter :: xmnh4=xmn+4.*xmh real, parameter :: xmmsa=xms+xmc+3*xmo+4*xmh real, parameter :: xmnh2=xmn+xmh*2. real, parameter :: xmso4=xms+4.*xmo real, parameter :: xmno3_a=xmn+xmo*3 real, parameter :: xmrn222=222. real, parameter :: xmpb210=210. ! this is a dummy molecular mass real, parameter :: xmnmv=999. ! The following lines will be in the include file #ifdef with_m7 include 'm7_chem_param.inc' #else include 'chem_param.inc' #endif ! integer, parameter :: maxtrace = ntrace + 4 ! Half-life in days real, dimension(maxtrace), parameter :: half_life = 999999999. ! ! definition of the chemistry: #reactions, order of species, etc. ! parameters needed for chemistry and rate constants ! ! densities (kg/m3) used in emission and/or optics routines real, parameter :: density_ref = 1800.0 ! for 'reference' density calculations #ifdef with_m7 real, parameter :: ss_density = dnacl * 1.e3 real, parameter :: dust_density = ddust * 1.e3 real, parameter :: carbon_density = dbc * 1.e3 real, parameter :: pom_density = doc * 1.e3 ! Note that doc actually is the density of POM not OC ! H2-SO4 particle density: real, parameter :: so4_density = dh2so4 * 1.e3 real, parameter :: h2so4_factor = xmh2so4 / xmso4 ! Ammonium-nitrate particle density used in the optics routine: ! Value based on Lowenthal et al. (Atmos. Environ., 2000) (see also De Meij et al., ACP, 2006). !real, parameter :: nh4no3_density = 1700. real, parameter :: nh4no3_density = 1.73 * 1.e3 real, parameter :: nh4no3_factor = (xmnh4+xmno3)/xmno3 real, parameter :: msa_density = 1.48 * 1.e3 ! not used anymore (previously used for Whitby distributions): !real, parameter :: sigma_whitby = 2.0 !real, parameter :: radius_whitby = 0.034e-6 !real, parameter :: radius_bc = 0.034e-6 ! real, parameter :: nh4so4_density = 1760. ! Geometric mean dry radii for sea salt emissions. ! These values have been updated ! following Vignati et al. (Atmos. Environ., 2010) ! For further explanations, see emission_ss.F90. !real, parameter :: radius_ssa = 0.0794e-6 !real, parameter :: radius_ssc = 0.63e-6 real, parameter :: radius_ssa = 0.09e-6 ! accumulation mode real, parameter :: radius_ssc = 0.794e-6 ! coarse mode ! not used anymore: !real, parameter :: rad_soa = 0.01e-6 ! soa average radius ! assuming 3nm particle formation and growth to ! that size in half an hour ! Geometric mean radii of primary carbonaceous and sulfate emissions ! based on AeroCom-I recommendations (Dentener et al., ACP, 2006). ! The corresponding values for the M7 modes are given by Stier et al. (ACP, 2005). ! The same values have also been adopted in GLOMAP (Mann et al., 2010). ! ! Biofuel emissions should have similar characteristics as biomass burning emissions. ! However, as biofuel emissions are not separately provided ! they are treated as fossil fuel emissions. ! This also implies that changes in size characteristics ! since pre-industrial times (Dentener et al., 2006) ! are only partially accounted for. ! ! Mean radii for carbonaceous aerosol emissions from Dentener et al., ! corresponding to sigma = 1.8: !real, parameter :: rad_emi_ff = 0.015e-6 ! fossil/biofuel emission radius !real, parameter :: rad_emi_vg = 0.04e-6 ! vegetation fires emission radius ! Corresponding values for sigma = 1.59 used in M7: real, parameter :: rad_emi_ff = cmr_ff ! fossil/biofuel emission radius real, parameter :: rad_emi_vg = cmr_bb ! vegetation fires emission radius ! Since cmr_bb lies in the accumulation mode, ! a reduced value has to be used for the insoluble fraction ! One could use 0.04e-6 or set it to cmr_ff as done by Stier et al.: real, parameter :: rad_emi_vg_insol = cmr_ff ! Mean radii for sulfate aerosol emissions adapted to the M7 modes: !real, parameter :: rad_so4_ind = 0.075e-6 ! industrial emission radius (not used) real, parameter :: rad_so4_ait = cmr_sk ! aitken mode radius real, parameter :: rad_so4_acc = cmr_sa ! accumulation mode radius real, parameter :: rad_so4_coa = cmr_sc ! coarse mode radius ! real, parameter :: frac_pom_sol_vg = zbb_wsoc_perc ! fraction of soluble pom emitted from vegetation fires real, parameter :: frac_pom_sol_ff = 0.65 ! fraction of soluble pom emitted from fossil fuel ! use same value as for vegetation fires real, parameter :: frac_soa_sol = zbge_wsoc_perc ! fraction of soluble surrogate SOA emissions real, parameter :: frac_so4=1.-facso2 ! fraction of so2 emission emitted directly as sulfate #else real, parameter :: frac_so4=1.-0.975 ! fraction of so2 emission emitted directly as sulfate #endif #ifdef with_m7 real, dimension(nmod), parameter :: sigma_lognormal = (/ 1.59, 1.59, 1.59, 2.00, 1.59, 1.59, 2.00 /) ! ! mode numbers ! integer, parameter :: mode_nuc = 1 integer, parameter :: mode_ais = 2 integer, parameter :: mode_acs = 3 integer, parameter :: mode_cos = 4 integer, parameter :: mode_aii = 5 integer, parameter :: mode_aci = 6 integer, parameter :: mode_coi = 7 ! mode_number => mode_start integer, parameter :: mode_start (nmod) = (/ inus_n, iais_n, iacs_n, icos_n, iaii_n, iaci_n, icoi_n /) ! first tracer in mode integer, parameter :: mode_end_so4 (nmod) = (/ iso4nus, iso4ais, iso4acs, iso4cos, 0, 0, 0 /) integer, parameter :: mode_end_bc (nmod) = (/ 0, ibcais, ibcacs, ibccos, ibcaii, 0, 0 /) integer, parameter :: mode_end_pom (nmod) = (/ 0, ipomais, ipomacs, ipomcos, ipomaii, 0, 0 /) integer, parameter :: mode_end_ss (nmod) = (/ 0, 0, issacs, isscos, 0, 0, 0 /) integer, parameter :: mode_end_dust(nmod) = (/ 0, 0, iduacs, iducos, 0, iduaci, iducoi /) integer, parameter :: mode_nm (nmod) = (/ 1, 3, 5, 5, 2, 1, 1 /) ! # tracers in mode integer, parameter :: mode_end (nmod) = mode_start + mode_nm ! last tracer in mode integer, parameter :: mode_tracers(0:5,nmod) = & reshape( (/ inus_n, iso4nus, 0 , 0, 0, 0 , & iais_n, iso4ais, ibcais, ipomais, 0, 0, & iacs_n, iso4acs, ibcacs, ipomacs, issacs, iduacs, & icos_n, iso4cos, ibccos, ipomcos, isscos, iducos, & iaii_n, ibcaii, ipomaii, 0, 0, 0, & iaci_n, iduaci, 0,0,0,0, & icoi_n, iducoi, 0,0,0,0 /), (/ 6, nmod/) ) #else ! for gas phase: introduce dummy modes real, dimension(nmod), parameter :: sigma_lognormal = (/ 1.59 /) integer, parameter, dimension(nmod) :: mode_start = (/999 /) ! first tracer in mode integer, parameter, dimension(nmod) :: mode_end = (/999 /) ! last tracer in mode integer, parameter :: mode_nm(nmod) = (/ 1 /) ! # tracers in mode integer, parameter :: mode_tracers(0:1,nmod) = & reshape( (/ 999, 999 /), (/ 2, nmod/) ) #endif integer, parameter :: iacid = ntrace + 1 !these are used in the 'chemistry' integer, parameter :: iair = ntrace + 2 integer, parameter :: ih2o = ntrace + 3 integer, parameter :: io2 = ntrace + 4 integer, parameter :: ico2 = -999 ! ! additional fields used in chemistry routine alone ! (more meteo-like files in units different from #/cm3) ! integer, parameter :: n_extra = 15 integer, parameter :: i_pres = 1 integer, parameter :: i_temp = 2 integer, parameter :: iairn = 3 !number density = ntrace+2 integer, parameter :: ih2on = 4 ! integer, parameter :: iairm = 5 !air mass in kg integer, parameter :: ilwc = 6 integer, parameter :: iiwc = 7 integer, parameter :: icc = 8 integer, parameter :: irh = 9 !0-100% integer, parameter :: iph = 10 integer, parameter :: idz = 11 integer, parameter :: ieno = 12 !nox emissions integer, parameter :: irinc = 13 !relative increas in aerosol radius integer, parameter :: iclwc = 14 integer, parameter :: iciwc = 15 ! id list of species, for which standard deviation is wanted (must be transported species) integer, dimension(nstd), parameter :: istd=(/io3/) ! ! character(len=8), dimension(nmark),parameter :: marknam= (/'O3S '/) #ifdef with_cariolle character(len=8), dimension(ncar), parameter :: carnam = (/'O3C ','PSC '/) #endif ! Uptake coefficients for heterogeneous chemistry (Huijnen et al., ACPD13) ! Uptake on ice and liquid cloud. ! VH: note: I don't use g_n2o5_l, as it's better to use a temperature dependency (see chem_rates.F90) real, parameter :: g_n2o5_i=0.02, g_n2o5_l=0.02 real, parameter :: g_ho2_i =0.025, g_ho2_l =0.06 real, parameter :: g_no3_i =1e-5, g_no3_l =1e-5 ! So far no NO3 uptake on cloud? ! Assumed bulk aerosol uptake efficiency if no M7 ! Note that until now in the original parameterization gam_n2o5 was set to 0.04 in sources_sinks.F90! real,parameter :: g_n2o5_aer=0.02 real,parameter :: g_no3_aer =0.001 real,parameter :: g_ho2_aer =0.06 #ifdef with_m7 ! Uptake coefficients on aerosol - allowing a variable efficiency per mode. ! Last entry (nmod+1) allocated for EQSAM aerosols NO3_a and NH4 and for MSA. ! VH: I do include MSA here, even though it may have a different uptake than for NO3_A and NH4. ! Also it may largely be covered by SS. Please consider something different if you have any idea. real, dimension(nmod+1),parameter :: g_n2o5 = (/ 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02 , 0.02 /) real, dimension(nmod+1),parameter :: g_no3 = (/ 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001/) real, dimension(nmod+1),parameter :: g_ho2 = (/ 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06 , 0.06 /) #endif ! cbm4 split in hydrocarbons... integer, parameter :: ncb4=6 integer, parameter, dimension(ncb4) :: nmhc= & (/ipar,ieth,iole,iald2,imgly,ich2o/) real, parameter, dimension(ncb4) :: xmcb4= & (/xmpar,xmeth,xmole,xmald2,xmgly,xmch2o/) ! fscale(ntrace) scaling factor for conversion of mixing ratios in ! kg tracer per kg air to practical mixing ratio units (e.g. ppm) ! In this version: ratio of molecular weight of tracer to that of air real,dimension(ntrace),parameter :: fscale = xmair/ra(:) ! uscale is for user-scale. This is a scale factor used in ! user_output_column and user_output_mix. real, dimension(ntrace), parameter :: uscale = 1. real, dimension(ntracet,ntemp) :: henry ! heterogeneous removal rates ! ******************************************************************** ! dry deposition ! ******************************************************************** ! number of tracers on which dry depositions should be applied: integer, parameter :: ndep = 14 ! tracer indices on which dry depositions should be applied: ! note: SO4 dry deposition refers to aerosol dry deposition ! This should only be applied in gas-phase chemistry version (see ebischeme.F90) integer, parameter :: idep(ndep) = & (/ io3 , ihno3, ino , ino2 , iso2, iso4, & ih2o2, iald2, ich2o, ich3o2h, inh3, & ipan , ico , ihno4 /) real, parameter :: ddep_diffrb(ndep)= & (/ diffrb_o3 , diffrb_hno3, diffrb_no , diffrb_no2 , diffrb_so2, diffrb_so4,& diffrb_h2o2, diffrb_ald2, diffrb_ch2o, diffrb_ch3o2h, diffrb_nh3, & diffrb_pan , diffrb_co , diffrb_hno4 /) real, parameter :: ddep_rsoil(ndep) = & (/ rsoil_o3 , rsoil_hno3, rsoil_no , rsoil_no2 , rsoil_so2, rsoil_so4, & rsoil_h2o2, rsoil_ald2, rsoil_ch2o, rsoil_ch3o2h, rsoil_nh3, & rsoil_pan , rsoil_co , rsoil_hno4 /) real, parameter :: ddep_rwat(ndep) = & (/ rwat_o3 , rwat_hno3, rwat_no , rwat_no2 , rwat_so2, rwat_so4,& rwat_h2o2, rwat_ald2, rwat_ch2o, rwat_ch3o2h, rwat_nh3, & rwat_pan , rwat_co , rwat_hno4 /) real, parameter :: ddep_rws(ndep) = & (/ rws_o3 , rws_hno3, rws_no , rws_no2 , rws_so2, rws_so4,& rws_h2o2, rws_ald2, rws_ch2o, rws_ch3o2h, rws_nh3, & rws_pan , rws_co , rws_hno4 /) real, parameter :: ddep_rsnow(ndep) = & (/ rsnow_o3 , rsnow_hno3, rsnow_no , rsnow_no2 , rsnow_so2, rsnow_so4, & rsnow_h2o2, rsnow_ald2, rsnow_ch2o, rsnow_ch3o2h, rsnow_nh3, & rsnow_pan , rsnow_co , rsnow_hno4 /) real, parameter :: ddep_rmes(ndep) = & (/ rmes_o3 , rmes_hno3, rmes_no , rmes_no2 , rmes_so2, rmes_so4, & rmes_h2o2, rmes_ald2, rmes_ch2o, rmes_ch3o2h, rmes_nh3, & rmes_pan , rmes_co , rmes_hno4 /) real, parameter :: ddep_rcut(ndep) = & (/ rcut_o3 , rcut_hno3, rcut_no , rcut_no2 , rcut_so2, rcut_so4, & rcut_h2o2, rcut_ald2, rcut_ch2o, rcut_ch3o2h, rcut_nh3, & rcut_pan , rcut_co , rcut_hno4 /) real, parameter :: ddep_diffcf(ndep) = & (/ diffcf_o3 , diffcf_hno3, diffcf_no , diffcf_no2 , diffcf_so2, diffcf_so4, & diffcf_h2o2, diffcf_ald2, diffcf_ch2o, diffcf_ch3o2h, diffcf_nh3, & diffcf_pan , diffcf_co , diffcf_hno4 /) ! some vd fields are copies: integer, parameter :: vd_ncopy = 7 integer, parameter :: vd_copy_itarget(vd_ncopy) = (/ irooh , iorgntr, in2o5, ino3, io3s, imgly, ino3_a/) integer, parameter :: vd_copy_isource(vd_ncopy) = (/ ich3o2h, ipan , ihno3, ino2, io3, ich2o , iso4/) ! number of aerosol bins used for deposition: integer, parameter :: nrdep = 23 ! aerosol radii used for each bin: real, parameter :: lur(nrdep) = & (/ 0.001, 0.01, 0.05, 0.1, 0.3, & 0.5 , 0.7 , 0.8 , 0.9, 1.0, & 1.2 , 1.5 , 2.0 , 3.0, 4.0, & 5.0 , 6.0 , 8.0 , 10.0, 15.0, & 20.0 , 50.0 , 100.0 /) ! ******************************************************************** ! wet deposition ! ******************************************************************** ! nscav : selected species for scavenging ! nscav_index : index for scavenging: ! nscav_type : type of scavenging: ! 0 no scavenging ! 1 scavenging 100 % solubility assumed ! 2 scavenging henry solubility assumed ! 3 scavenging, aerosol removal assumed ! 4 scavenging, special case for SO2 with aq phase diss. ! #ifdef with_m7 integer,parameter :: nscav=40 #else integer,parameter :: nscav=15 #endif integer,parameter,dimension(nscav) :: & nscav_index = (/ih2o2, ihno3, ich3o2h, ich2o, iald2 , & irooh, iorgntr, iso2, inh3, & iso4, inh4, imsa, & ino3_a, imgly, ipb210 & #ifdef with_m7 ,inus_n, iais_n, iacs_n, icos_n, iaii_n, iaci_n, icoi_n, & iso4nus, iso4ais, iso4acs, iso4cos, & ibcais, ibcacs, ibccos, ibcaii, & ipomais, ipomacs, ipomcos, ipomaii, & issacs, isscos, & iduacs, iducos, iduaci, iducoi & #endif /) ! nscav_type = 5 : nu mode soluble aerosol ! nscav_type = 6 : ai mode soluble aerosol ! nscav_type = 7 : ac mode soluble aerosol ! nscav_type = 8 : co mode soluble aerosol ! nscav_type = 9 : ai mode insoluble aerosol ! nscav_type = 10 : ac mode insoluble aerosol ! nscav_type = 11 : co mode insoluble aerosol #ifdef with_m7 ! in m7-version so4 is treated as gas-phase sulphuric acid (H2SO4) (scav-type 2) integer, dimension(nscav),parameter :: & nscav_type = (/ 2, 1, 2, 2, 2, & 2, 2, 4, 1, & 2, 3, 3, & 3, 2, 3, & 5, 6, 7, 8, 9, 10, 11, & ! particle number 5, 6, 7, 8, & ! sulphate mass 6, 7, 8, 9, & ! BC mass 6, 7, 8, 9, & ! POM mass 7, 8, & ! SS mass 7, 8, 10, 11 /) ! DUST mass #else ! in gas-phase version so4 represents the sulphate aerosol. (scav-type 3) integer, dimension(nscav),parameter :: & nscav_type = (/ 2, 1, 2, 2, 2, & 2, 2, 4, 1, & 3, 3, 3, & 3, 2, 3 /) #endif end module chem_param