! #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 #ifdef with_m7 Use mo_aero_m7, only : nmod use mo_aero_m7, only : dh2so4, ddust, dbc, doc, dnacl #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 :: xmco2 = xmc + xmo*2.0 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 real, parameter :: xmhono=xmno+xmh+xmo ! 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 !>>> TvN ! Bug fix !real, parameter :: xmch3o2no2=xmn+3.*xmh+xmc+3.*xmo real, parameter :: xmch3o2no2=xmn+3.*xmh+xmc+4.*xmo !<<< TvN real, parameter :: xmorgntr=xmn+5.*xmh+2.*xmc+3.*xmo real, parameter :: xmxo2=2.*xmo+xmc real, parameter :: xmxo2n=2.*xmo+xmc real, parameter :: xmc3h7o2=3.*xmc+7.*xmh+2.*xmo 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 :: xmnh2o2=xmnh2+2.*xmo real, parameter :: xmso4=xms+4.*xmo ! modified CB05============================== real, parameter :: xmch3oh=xmc+4.*xmh+xmo real, parameter :: xmhcooh=xmc+2.*xmh+2.*xmo real, parameter :: xmmcooh=2.*xmc+4.*xmh+2.*xmo real, parameter :: xmc2h6=2.*xmc+6.*xmh real, parameter :: xmethoh=2.*xmc+6.*xmh+xmo real, parameter :: xmc3h8=3.*xmc+8.*xmh real, parameter :: xmc3h6=3.*xmc+6.*xmh real, parameter :: xmterp=2.*xmisop real, parameter :: xmispd=4.*xmc+xmo+6.*xmh ! acetone real, parameter :: xmacet=3.*xmc+xmo+6.*xmh real, parameter :: xmaco2=xmacet-xmh+2.*xmo real, parameter :: xmno3_a=xmn+xmo*3. real, parameter :: xmrn222=222. real, parameter :: xmpb210=210. real, parameter :: xmelvoc=10.*xmc+16.*xmh+7.*xmo real, parameter :: xmsvoc =10.*xmc+16.*xmh+6.*xmo ! this is a dummy molecular mass real, parameter :: xmnmv=999. ! surface tension of water at 273.15K [J m-2] real, parameter :: SurfTen = 0.075 ! 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 real, parameter :: soa_density = pom_density ! TB first order approx. same as pom ! 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 ! Kappa values real, parameter :: Kap_su = 0.6 real, parameter :: Kap_pom = 0.1 real, parameter :: Kap_soa = 0.1 real, parameter :: Kap_bc = 0. real, parameter :: Kap_ss = 1.0 real, parameter :: Kap_du = 0. real, parameter :: Kap_na2so4 = 0.95 real, parameter :: Kap_msa = 0.6 real, parameter :: Kap_no3 = 0.6 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_end_soa (nmod) = (/ isoanus, isoaais, isoaacs, isoacos, isoaaii, 0, 0 /) integer, parameter :: mode_nm (nmod) = (/ 2, 4, 6, 6, 3, 1, 1 /) ! # tracers in mode integer, parameter :: mode_nm_sed (nmod) = (/ 2, 4, 9, 6, 3, 1, 1 /) ! # tracers in mode integer, parameter :: mode_end (nmod) = mode_start + mode_nm ! last tracer in mode integer, parameter :: mode_tracers(0:6,nmod) = & reshape( (/ inus_n, iso4nus, isoanus, 0, 0, 0, 0, & iais_n, iso4ais, ibcais, ipomais,isoaais, 0, 0, & iacs_n, iso4acs, ibcacs, ipomacs, issacs, iduacs, isoaacs, & icos_n, iso4cos, ibccos, ipomcos, isscos, iducos, isoacos, & iaii_n, ibcaii, ipomaii,isoaaii, 0, 0, 0, & iaci_n, iduaci, 0, 0, 0, 0, 0, & icoi_n, iducoi, 0, 0, 0, 0, 0 /), (/ 7, nmod/) ) integer, parameter :: mode_tracers_sed(0:9,nmod) = & reshape( (/ inus_n, iso4nus, isoanus, 0, 0, 0, 0, 0,0,0,& iais_n, iso4ais, ibcais, ipomais,isoaais, 0, 0, 0,0,0,& iacs_n, iso4acs, ibcacs, ipomacs, issacs, iduacs, isoaacs, inh4,ino3_a,imsa,& icos_n, iso4cos, ibccos, ipomcos, isscos, iducos, isoacos, 0,0,0,& iaii_n, ibcaii, ipomaii,isoaaii, 0, 0, 0, 0,0,0,& iaci_n, iduaci, 0, 0, 0, 0, 0, 0,0,0,& icoi_n, iducoi, 0, 0, 0, 0, 0 ,0,0,0/), (/ 10, 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. !>>> TvN ! The uptake coefficients are currently defined per mode, ! which seems sufficiently accurate, given the uncertainties ! in uptake coefficients (Huijnen et al., ACPD, 2014). ! Alternative would be to define them per chemical component, ! and apply a volume/area averaging over the different components in each mode. ! Note that the last entry is currently not used. real, dimension(nmod+1),parameter :: g_n2o5 = (/ 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02 , 0.02 /) ! It would be easy to reduce the N2O5 uptake coefficient ! for the pure dust modes from 0.02 to 0.01 (Huijnen et al., ACPD, 2014): !real, dimension(nmod+1),parameter :: g_n2o5 = (/ 0.02, 0.02, 0.02, 0.02, 0.02, 0.01, 0.01 , 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/) ! Given the uncertainties in the HO2 uptake coefficients, ! we currently assume a value of 0.06 for all aersol components. ! Note that in Huijnen et al., a value of 0.7 is assumed ! for sulphate, nitrate and BC. real, dimension(nmod+1),parameter :: g_ho2 = (/ 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06 , 0.06 /) ! !<<< TvN #endif ! cbm4 split in hydrocarbons... integer, parameter :: ncb5=14 integer, parameter, dimension(ncb5) :: nmhc= & (/ipar ,ieth ,iole ,iald2, imgly, ich2o, & ich3oh,ihcooh,imcooh,ic2h6, iethoh,ic3h8, & ic3h6,iacet/) real, parameter, dimension(ncb5) :: xmcb5= & (/xmpar ,xmeth ,xmole ,xmald2,xmgly ,xmch2o, & xmch3oh,xmhcooh,xmmcooh,xmc2h6,xmethoh,xmc3h8, & xmc3h6,xmacet/) ! 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 = 15 ! 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, ihcooh/) 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, diffrb_hcooh/) 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, rsoil_hcooh/) 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, rwat_hcooh/) 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, rws_hcooh/) 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, rsnow_hcooh/) 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, rmes_hcooh/) 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, rcut_hcooh/) 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, diffcf_hcooh/) ! some vd fields are copies: integer, parameter :: vd_ncopy = 13 integer, parameter :: vd_copy_itarget(vd_ncopy) = (/ irooh , iorgntr, ihono, ich3o2no2, in2o5, ino3, io3s, imgly, ich3oh, iethoh, imcooh, iispd, iacet/) integer, parameter :: vd_copy_isource(vd_ncopy) = (/ ich3o2h, ipan , ihno4, ipan, ihno3, ino2, io3, ich2o, ich3o2h,ich3o2h,ihcooh, iald2, iald2/) ! 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=50 #else integer,parameter :: nscav=20 #endif integer,parameter,dimension(nscav) :: nscav_index = (/ih2o2, ihno3, ich3o2h, ich2o, iald2 , & irooh, iorgntr, iso2, inh3, iso4, & inh4, imsa, ino3_a, imgly, ipb210, & ich3oh, ihcooh, imcooh, iethoh, iacet & #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, & isoanus, isoaais, isoaacs, isoacos, isoaaii & #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) ! Since ammonium-nitrate and MSA are assumed to be in the soluble accumulation mode, ! their scavenging efficiency has been changed to the value for that mode. ! For consistency, the same value is used for Pb210. integer, dimension(nscav),parameter :: & nscav_type = (/ 2, 1, 2, 2, 2, & 2, 2, 4, 1, 2, & ! 3, 3, 3, 2, 3, & 7, 7, 7, 2, 7, & 2, 1, 1, 2, 2, & 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 5, 6, 7, 8, 9 /) ! SOA 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, 2, & 3, 3, 3, 2, 3, & 2, 1, 1, 2, 2/) #endif end module chem_param