source: palm/trunk/SOURCE/chem_modules.f90 @ 4327

Last change on this file since 4327 was 4273, checked in by monakurppa, 5 years ago

Add logical switched nesting_chem and nesting_offline_chem

  • Property svn:keywords set to Id
File size: 14.7 KB
RevLine 
[2615]1!> @file chem_modules.f90
2!------------------------------------------------------------------------------!
[2828]3! This file is part of the PALM model system.
[2615]4!
5! PALM is free software: you can redistribute it and/or modify it under the
6! terms of the GNU General Public License as published by the Free Software
7! Foundation, either version 3 of the License, or (at your option) any later
8! version.
9!
10! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
11! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13!
14! You should have received a copy of the GNU General Public License along with
15! PALM. If not, see <http://www.gnu.org/licenses/>.
16!
[3835]17! Copyright 2018-2019 Leibniz Universitaet Hannover
18! Copyright 2018-2019 Karlsruhe Institute of Technology
19! Copyright 2018-2019 Freie Universitaet Berlin
[2615]20!------------------------------------------------------------------------------!
21!
22! Current revisions:
[2828]23! -----------------
[2615]24!
[4110]25!
[2615]26! Former revisions:
27! -----------------
28! $Id: chem_modules.f90 4273 2019-10-24 13:40:54Z Giersch $
[4273]29! Add logical switches nesting_chem and nesting_offline_chem (both .TRUE.
30! by default)
31!
32! 4182 2019-08-22 15:20:23Z scharf
[4182]33! Corrected "Former revisions" section
34!
35! 4110 2019-07-22 17:05:21Z suehring
[4110]36! +cs_advc_flags_s
37!
38! 4109 2019-07-22 17:00:34Z suehring
[3968]39! - introduced namelist item chem_modules@emiss_lod as future
40! - replacement to chem_modules@mode_emis.  Currently keeping both
41!   for backward compatibility.  chem_modules@mode_emis will be
42!   depreciated upon migration of all dependent modules (e.g., salsa)
43!   to chem_modules@emiss_lod
44!
45! (ecc) 20190513 replaced nspec_out with n_matched_vars
46!
47! 3877 2019-04-08 19:09:16Z knoop
[3835]48! Formatting, clean-up, clarified/corrected comments
49!
50! 3833 2019-03-28 15:04:04Z forkel
[3833]51! removed USE chem_gasphase_mod
52!
53! 3827 2019-03-27 17:20:32Z forkel
[3827]54! some formatting  and reordering (ecc)
55!
56! 3820 2019-03-27 11:53:41Z forkel
[3820]57! renamed do_emis to emissions_anthropogenic, removed USE statistics, variables sorted by type
58!
59!
60! 3780 2019-03-05 11:19:45Z forkel
[3780]61! added cs_mech
62!
63! 3652 2019-01-07 15:29:59Z forkel
[3652]64! parameter chem_mechanism added (basit)
65!
[4182]66! 3282 2018-09-27 10:49:12Z basit
67! Initial revision
68!
69! Authors:
70! --------
71! @author Farah Kanani-Suehring
72! @author Basit Khan
73! @author Sabine Banzhaf
74! @author Emmanuele Russo
75! @author Edward C. Chan
76!
[2615]77!------------------------------------------------------------------------------!
78! Description:
79! ------------
[3636]80!> Definition of global PALM-4U chemistry variables
[2615]81!------------------------------------------------------------------------------!
82!
[2828]83 MODULE chem_modules
[3085]84
85    USE kinds
86
[2615]87    IMPLICIT NONE
88
[3835]89    CHARACTER (LEN=20) ::  bc_cs_b        = 'dirichlet'         !< namelist parameter: surface boundary condition for concentration
90    CHARACTER (LEN=20) ::  bc_cs_t        = 'initial_gradient'  !< namelist parameter: top boudary condition for concentration
91    CHARACTER (LEN=30) ::  chem_mechanism = 'phstatp'           !< namelist parameter: chemistry mechanism
92    CHARACTER (LEN=80) ::  daytype_mdh    = 'workday'           !< namelist parameter: type of day - workday, weekend, holiday
93    CHARACTER (LEN=80) ::  mode_emis      = 'PARAMETERIZED'     !< namelist parameter: mode of chemistry emissions - DEFAULT, EXPERT, PARAMETERIZED
94    CHARACTER (LEN=80) ::  time_fac_type  = 'MDH'               !< namelist parameter: type of time treatment in the mode_emis DEFAULT - HOUR, MDH
[3876]95    CHARACTER (LEN=10) ::  photolysis_scheme                    !< 'constant',
96                                                                !< 'simple' (Simple parameterisation from MCM, Saunders et al., 2003, Atmos. Chem. Phys., 3, 161-180
97                                                                !< 'fastj'  (Wild et al., 2000, J. Atmos. Chem., 37, 245-282) STILL NOT IMPLEMENTED
98
[3835]99    CHARACTER (LEN=11), DIMENSION(99) ::  cs_name             = 'novalue'  !< namelist parameter: names of species with given fluxes (see csflux)
100    CHARACTER (LEN=11), DIMENSION(99) ::  cs_profile_name     = 'novalue'  !< namelist parameter: tbc...???
101    CHARACTER (LEN=11), DIMENSION(99) ::  data_output_pr_cs   = 'novalue'  !< namelist parameter: tbc...???
102    CHARACTER (LEN=11), DIMENSION(99) ::  surface_csflux_name = 'novalue'  !< namelist parameter: tbc...???
[3190]103
[3835]104    INTEGER(iwp) ::  cs_pr_count                           = 0      !< counter for chemical species profiles
105    INTEGER(iwp) ::  cs_vertical_gradient_level_ind(99,10) = -9999  !< grid index values of cs_vertical_gradient_level
[3968]106    INTEGER(iwp) ::  emiss_lod                             = -1     !< namelist parameter: chem emission LOD (same as mode_emis)
107                                                                    !< -1 = unassigned, 0 = parameterized, 1 = default, 2 = pre-processed
[3835]108    INTEGER(iwp) ::  ibc_cs_b                                       !< integer flag for bc_cs_b
109    INTEGER(iwp) ::  ibc_cs_t                                       !< integer flag for bc_cs_t
110    INTEGER(iwp) ::  main_street_id                        = 0      !< namelist parameter: lower bound of main street IDs (OpenStreetMaps) for PARAMETERIZED mode
111    INTEGER(iwp) ::  max_pr_cs                             = 0      !<
112    INTEGER(iwp) ::  max_street_id                         = 0      !< namelist parameter: upper bound of main street IDs (OpenStreetMaps) for PARAMETERIZED mode     
[3968]113    INTEGER(iwp) ::  n_matched_vars                                 !< number of matched emissions variables
[3835]114    INTEGER(iwp) ::  side_street_id                        = 0      !< namelist parameter: lower bound of side street IDs (OpenStreetMaps) for PARAMETERIZED mode
[3190]115
[3835]116    INTEGER(iwp), DIMENSION(99) ::  cs_pr_index  = 0      !< index for chemical species profiles
117    INTEGER(iwp), DIMENSION(:)  ::  match_spec_nox(1:2)   !< results of matching the input and model's NOx
118    INTEGER(iwp), DIMENSION(:)  ::  match_spec_pm(1:3)    !< results of matching the input and model's PMs
119    INTEGER(iwp), DIMENSION(:)  ::  match_spec_sox(1:2)   !< results of matching the input and model's SOx!
120
121    INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  match_spec_input      !< index of input chem species for matching routine
122    INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  match_spec_model      !< index of model chem species for matching routine
123    INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  match_spec_voc_input  !< index of VOC input components matching the model's VOCs
124    INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  match_spec_voc_model  !< index of VOC model species matching the input VOCs comp.
[4109]125   
126    INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE  ::  cs_advc_flags_s !< flags used to degrade order of advection scheme for
127                                                                     !< chemical species near walls and lateral boundaries
[3835]128
129    LOGICAL ::  constant_top_csflux(99)   = .TRUE.   !< internal flag, set to .FALSE. if no top_csflux is prescribed
130    LOGICAL ::  constant_csflux(99)       = .TRUE.   !< internal flag, set to .FALSE. if no surface_csflux is prescribed
131    LOGICAL ::  call_chem_at_all_substeps = .FALSE.  !< namelist parameter: ....???
132    LOGICAL ::  chem_debug0               = .FALSE.  !< namelist parameter: flag for minimum print output
133    LOGICAL ::  chem_debug1               = .FALSE.  !< namelist parameter: flag for print output
134    LOGICAL ::  chem_debug2               = .FALSE.  !< namelist parameter: flag for further print output
135    LOGICAL ::  chem_gasphase_on          = .TRUE.   !< namelist parameter: flag to switch off chemical reactions
136    LOGICAL ::  cs_pr_namelist_found      = .FALSE.  !< ...???
137    LOGICAL ::  deposition_dry            = .FALSE.  !< namelist parameter: flag for activation of deposition calculation
138    LOGICAL ::  emissions_anthropogenic   = .FALSE.  !< namelist parameter: flag for turning on anthropogenic emissions
139    LOGICAL ::  emission_output_required  = .TRUE.   !< internal flag for requiring emission outputs
[4273]140    LOGICAL ::  nesting_chem              = .TRUE.   !< apply self-nesting for the chemistry model
141    LOGICAL ::  nesting_offline_chem      = .TRUE.   !< apply offline nesting for the chemistry model
[3835]142
143    REAL(wp) ::  cs_surface_initial_change(99)     = 0.0_wp        !< namelist parameter: ...???
144    REAL(wp) ::  cs_vertical_gradient(99,10)       = 0.0_wp        !< namelist parameter: ...???
145    REAL(wp) ::  cs_vertical_gradient_level(99,10) = -999999.9_wp  !< namelist parameter: ...???
146    REAL(wp) ::  emiss_factor_main(99)             = -9999.0_wp    !< namelist parameter: ...???
147    REAL(wp) ::  emiss_factor_side(99)             = -9999.0_wp    !< namelist parameter: ...???
148    REAL(wp) ::  surface_csflux(99)                = 0.0_wp        !< namelist parameter: ...???
149    REAL(wp) ::  top_csflux(99)                    = 0.0_wp        !< namelist parameter: ...???
150    REAL(wp) ::  wall_csflux(99,0:5)               = 0.0_wp        !< namelist parameter: ...???
151
152    REAL(wp), DIMENSION(99)     ::  cs_surface = 0.0_wp        !< namelist parameter: chem species concentration at surface
153    REAL(wp), DIMENSION(99,100) ::  cs_heights = 9999999.9_wp  !< namelist parameter: height levels for initial chem species concentrations
154    REAL(wp), DIMENSION(99,100) ::  cs_profile = 9999999.9_wp  !< namelist parameter: chem species concentration values at cs_heights levels
155
156    REAL(wp), DIMENSION(:), ALLOCATABLE ::  bc_cs_t_val  !< vertical gradient of chemical species near domain top
157    REAL(wp), DIMENSION(:), ALLOCATABLE ::  css          !< scaling parameter for chem species
158
159    REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::  emis_distribution  !< emissions final values (main module output) ???
160                                 
161    REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE, TARGET ::  cs_1  !< pointer for swapping of timelevels for respective quantity
162    REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE, TARGET ::  cs_2  !< pointer for swapping of timelevels for respective quantity
163    REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE, TARGET ::  cs_3  !< pointer for swapping of timelevels for respective quantity
164
165    REAL(wp), DIMENSION(:,:,:), POINTER ::  cs     !< pointer: sgs chem spcs  ???
166    REAL(wp), DIMENSION(:,:,:), POINTER ::  cs_p   !< pointer: prognostic value of sgs chem spcs ???
167    REAL(wp), DIMENSION(:,:,:), POINTER ::  tcs_m  !< pointer: to tcs array (temp)
168
[3827]169    REAL, PARAMETER ::  xm_air   =   28.964e-3             !< air      molecular weight (kg/mol)
170    REAL, PARAMETER ::  xm_C     =   12.01115e-3           !< C        molecular weight (kg/mol)
171    REAL, PARAMETER ::  xm_Ca    =   40.07800e-3           !< Ca       molecular weight (kg/mol)
172    REAL, PARAMETER ::  xm_Cd    =  112.41000e-3           !< Cd       molecular weight (kg/mol)
173    REAL, PARAMETER ::  xm_Cl    =   35.45300e-3           !< Cl       molecular weight (kg/mol)
174    REAL, PARAMETER ::  xm_dummy = 1000.0e-3               !< dummy    molecular weight (kg/mol)
175    REAL, PARAMETER ::  xm_F     =   18.99840e-3           !< F        molecular weight (kg/mol)
176    REAL, PARAMETER ::  xm_H     =    1.00790e-3           !< H        molecular weight (kg/mol)
177    REAL, PARAMETER ::  xm_K     =   39.09800e-3           !< K        molecular weight (kg/mol)
178    REAL, PARAMETER ::  xm_Mg    =   24.30500e-3           !< Mg       molecular weight (kg/mol)
179    REAL, PARAMETER ::  xm_N     =   14.00670e-3           !< N        molecular weight (kg/mol)
180    REAL, PARAMETER ::  xm_Na    =   22.98977e-3           !< Na       molecular weight (kg/mol)
181    REAL, PARAMETER ::  xm_O     =   15.99940e-3           !< O        molecular weight (kg/mol)
182    REAL, PARAMETER ::  xm_Pb    =  207.20000e-3           !< Pb       molecular weight (kg/mol)
183    REAL, PARAMETER ::  xm_Pb210 =  210.00000e-3           !< Pb (210) molecular weight (kg/mol)
184    REAL, PARAMETER ::  xm_Rn222 =  222.00000e-3           !< Rn (222) molecular weight (kg/mol)
185    REAL, PARAMETER ::  xm_S     =   32.06400e-3           !< S        molecular weight (kg/mol)
186    REAL, PARAMETER ::  xm_CO2   = xm_C + xm_O * 2         !< CO2      molecular weight (kg/mol)
187    REAL, PARAMETER ::  xm_h2o   = xm_H * 2 + xm_O         !< H2O      molecular weight (kg/mol)
188    REAL, PARAMETER ::  xm_HNO3  = xm_H + xm_N + xm_O * 3  !< HNO3     molecular weight (kg/mol)
189    REAL, PARAMETER ::  xm_o3    = xm_O * 3                !< O3       molecular weight (kg/mol)
190    REAL, PARAMETER ::  xm_N2O5  = xm_N * 2 + xm_O * 5     !< N2O5     molecular weight (kg/mol)
191    REAL, PARAMETER ::  xm_NH4   = xm_N + xm_H * 4         !< NH4      molecular weight (kg/mol)
192    REAL, PARAMETER ::  xm_NO3   = xm_N + xm_O * 3         !< NO3      molecular weight (kg/mol)
193    REAL, PARAMETER ::  xm_SO4   = xm_S + xm_O * 4         !< SO4      molecular weight (kg/mol)
[3876]194!
195!-  Define chemical variables within chem_species
196    TYPE species_def
197       CHARACTER(LEN=15)                            ::  name         !< name of chemical species
198       CHARACTER(LEN=15)                            ::  unit         !< unit (ppm for gases, kg m^-3 for aerosol tracers)
199       REAL(kind=wp), POINTER, DIMENSION(:,:,:)     ::  conc         !< concentrations of trace gases
200       REAL(kind=wp), POINTER, DIMENSION(:,:,:)     ::  conc_av      !< averaged concentrations
201       REAL(kind=wp), POINTER, DIMENSION(:,:,:)     ::  conc_p       !< conc at prognostic time level
202       REAL(kind=wp), POINTER, DIMENSION(:,:,:)     ::  tconc_m      !< weighted tendency of conc for previous sub-timestep (Runge-Kutta)
203       REAL(kind=wp), ALLOCATABLE, DIMENSION(:,:)   ::  cssws_av     !< averaged fluxes of trace gases at surface
204       REAL(kind=wp), ALLOCATABLE, DIMENSION(:,:)   ::  flux_s_cs    !< 6th-order advective flux at south face of grid box of chemical species (='cs')
205       REAL(kind=wp), ALLOCATABLE, DIMENSION(:,:)   ::  diss_s_cs    !< artificial numerical dissipation flux at south face of grid box of chemical species
206       REAL(kind=wp), ALLOCATABLE, DIMENSION(:,:,:) ::  flux_l_cs    !< 6th-order advective flux at left face of grid box of chemical species (='cs')
207       REAL(kind=wp), ALLOCATABLE, DIMENSION(:,:,:) ::  diss_l_cs    !< artificial numerical dissipation flux at left face of grid box of chemical species
208       REAL(kind=wp), ALLOCATABLE, DIMENSION(:)     ::  conc_pr_init !< initial profile of chemical species
209    END TYPE species_def
210!
211!-- Define photolysis frequencies in phot_frequen
212    TYPE photols_def
213       CHARACTER(LEN=15)                            :: name          !< name of pgotolysis frequency
214       CHARACTER(LEN=15)                            :: unit          !< unit (1/s)
215       REAL(kind=wp), POINTER, DIMENSION(:,:,:)     :: freq          !< photolysis frequency
216    END TYPE photols_def
[3458]217
[3876]218
219    TYPE(species_def), ALLOCATABLE, DIMENSION(:), TARGET ::  chem_species
220    TYPE(photols_def), ALLOCATABLE, DIMENSION(:), TARGET ::  phot_frequen
221
[2615]222    SAVE
[3820]223
[2828]224 END MODULE chem_modules
Note: See TracBrowser for help on using the repository browser.