source: palm/trunk/SOURCE/salsa_mod.f90 @ 4058

Last change on this file since 4058 was 4058, checked in by knoop, 2 years ago

Bugfix: to_be_resorted was uninitialized in case of s_H2O in 3d_data_averaging

  • Property svn:keywords set to Id
File size: 503.6 KB
Line 
1!> @file salsa_mod.f90
2!--------------------------------------------------------------------------------!
3! This file is part of PALM-4U.
4!
5! PALM-4U 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-4U 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!
17! Copyright 2018-2019 University of Helsinki
18! Copyright 1997-2019 Leibniz Universitaet Hannover
19!--------------------------------------------------------------------------------!
20!
21! Current revisions:
22! -----------------
23!
24!
25! Former revisions:
26! -----------------
27! $Id: salsa_mod.f90 4058 2019-06-27 15:25:42Z knoop $
28! Bugfix: to_be_resorted was uninitialized in case of s_H2O in 3d_data_averaging
29!
30! 4012 2019-05-31 15:19:05Z monakurppa
31! Merge salsa branch to trunk. List of changes:
32! - Error corrected in distr_update that resulted in the aerosol number size
33!   distribution not converging if the concentration was nclim.
34! - Added a separate output for aerosol liquid water (s_H2O)
35! - aerosol processes for a size bin are now calculated only if the aerosol
36!   number of concentration of that bin is > 2*nclim
37! - An initialisation error in the subroutine "deposition" corrected and the
38!   subroutine reformatted.
39! - stuff from salsa_util_mod.f90 moved into salsa_mod.f90
40! - calls for closing the netcdf input files added
41!
42! 3956 2019-05-07 12:32:52Z monakurppa
43! - Conceptual bug in depo_surf correct for urban and land surface model
44! - Subroutine salsa_tendency_ij optimized.
45! - Interfaces salsa_non_advective_processes and salsa_exchange_horiz_bounds
46!   created. These are now called in module_interface.
47!   salsa_exchange_horiz_bounds after calling salsa_driver only when needed
48!   (i.e. every dt_salsa).
49!
50! 3924 2019-04-23 09:33:06Z monakurppa
51! Correct a bug introduced by the previous update.
52!
53! 3899 2019-04-16 14:05:27Z monakurppa
54! - remove unnecessary error / location messages
55! - corrected some error message numbers
56! - allocate source arrays only if emissions or dry deposition is applied.
57!
58! 3885 2019-04-11 11:29:34Z kanani
59! Changes related to global restructuring of location messages and introduction
60! of additional debug messages
61!
62! 3876 2019-04-08 18:41:49Z knoop
63! Introduced salsa_actions module interface
64!
65! 3871 2019-04-08 14:38:39Z knoop
66! Major changes in formatting, performance and data input structure (see branch
67! the history for details)
68! - Time-dependent emissions enabled: lod=1 for yearly PM emissions that are
69!   normalised depending on the time, and lod=2 for preprocessed emissions
70!   (similar to the chemistry module).
71! - Additionally, 'uniform' emissions allowed. This emission is set constant on
72!   all horisontal upward facing surfaces and it is created based on parameters
73!   surface_aerosol_flux, aerosol_flux_dpg/sigmag/mass_fracs_a/mass_fracs_b.
74! - All emissions are now implemented as surface fluxes! No 3D sources anymore.
75! - Update the emission information by calling salsa_emission_update if
76!   skip_time_do_salsa >= time_since_reference_point and
77!   next_aero_emission_update <= time_since_reference_point
78! - Aerosol background concentrations read from PIDS_DYNAMIC. The vertical grid
79!   must match the one applied in the model.
80! - Gas emissions and background concentrations can be also read in in salsa_mod
81!   if the chemistry module is not applied.
82! - In deposition, information on the land use type can be now imported from
83!   the land use model
84! - Use SI units in PARIN, i.e. n_lognorm given in #/m3 and dpg in metres.
85! - Apply 100 character line limit
86! - Change all variable names from capital to lowercase letter
87! - Change real exponents to integer if possible. If not, precalculate the value
88!   value of exponent
89! - Rename in1a to start_subrange_1a, fn2a to end_subrange_1a etc.
90! - Rename nbins --> nbins_aerosol, ncc_tot --> ncomponents_mass and ngast -->
91!   ngases_salsa
92! - Rename ibc to index_bc, idu to index_du etc.
93! - Renamed loop indices b, c and sg to ib, ic and ig
94! - run_salsa subroutine removed
95! - Corrected a bud in salsa_driver: falsely applied ino instead of inh
96! - Call salsa_tendency within salsa_prognostic_equations which is called in
97!   module_interface_mod instead of prognostic_equations_mod
98! - Removed tailing white spaces and unused variables
99! - Change error message to start by PA instead of SA
100!
101! 3833 2019-03-28 15:04:04Z forkel
102! added USE chem_gasphase_mod for nvar, nspec and spc_names
103!
104! 3787 2019-03-07 08:43:54Z raasch
105! unused variables removed
106!
107! 3780 2019-03-05 11:19:45Z forkel
108! unused variable for file index removed from rrd-subroutines parameter list
109!
110! 3685 2019-01-21 01:02:11Z knoop
111! Some interface calls moved to module_interface + cleanup
112!
113! 3655 2019-01-07 16:51:22Z knoop
114! Implementation of the PALM module interface
115!
116! 3636 2018-12-19 13:48:34Z raasch
117! nopointer option removed
118!
119! 3630 2018-12-17 11:04:17Z knoop
120! - Moved the control parameter "salsa" from salsa_mod.f90 to control_parameters
121! - Updated salsa_rrd_local and salsa_wrd_local
122! - Add target attribute
123! - Revise initialization in case of restarts
124! - Revise masked data output
125!
126! 3582 2018-11-29 19:16:36Z suehring
127! missing comma separator inserted
128!
129! 3483 2018-11-02 14:19:26Z raasch
130! bugfix: directives added to allow compilation without netCDF
131!
132! 3481 2018-11-02 09:14:13Z raasch
133! temporary variable cc introduced to circumvent a possible Intel18 compiler bug
134! related to contiguous/non-contguous pointer/target attributes
135!
136! 3473 2018-10-30 20:50:15Z suehring
137! NetCDF input routine renamed
138!
139! 3467 2018-10-30 19:05:21Z suehring
140! Initial revision
141!
142! 3412 2018-10-24 07:25:57Z monakurppa
143!
144! Authors:
145! --------
146! @author Mona Kurppa (University of Helsinki)
147!
148!
149! Description:
150! ------------
151!> Sectional aerosol module for large scale applications SALSA
152!> (Kokkola et al., 2008, ACP 8, 2469-2483). Solves the aerosol number and mass
153!> concentration as well as chemical composition. Includes aerosol dynamic
154!> processes: nucleation, condensation/evaporation of vapours, coagulation and
155!> deposition on tree leaves, ground and roofs.
156!> Implementation is based on formulations implemented in UCLALES-SALSA except
157!> for deposition which is based on parametrisations by Zhang et al. (2001,
158!> Atmos. Environ. 35, 549-560) or Petroff&Zhang (2010, Geosci. Model Dev. 3,
159!> 753-769)
160!>
161!> @todo Apply information from emission_stack_height to lift emission sources
162!> @todo emission mode "parameterized", i.e. based on street type
163!> @todo Allow insoluble emissions
164!> @todo Apply flux limiter in prognostic equations
165!------------------------------------------------------------------------------!
166 MODULE salsa_mod
167
168    USE basic_constants_and_equations_mod,                                                         &
169        ONLY:  c_p, g, p_0, pi, r_d
170
171    USE chem_gasphase_mod,                                                                         &
172        ONLY:  nspec, nvar, spc_names
173
174    USE chem_modules,                                                                              &
175        ONLY:  call_chem_at_all_substeps, chem_gasphase_on, chem_species
176
177    USE control_parameters
178
179    USE indices,                                                                                   &
180        ONLY:  nbgp, nx, nxl, nxlg, nxr, nxrg, ny, nyn, nyng, nys, nysg, nzb, nz, nzt, wall_flags_0
181
182    USE kinds
183
184    USE netcdf_data_input_mod,                                                                     &
185        ONLY:  chem_emis_att_type, chem_emis_val_type
186
187    USE pegrid
188
189    USE statistics,                                                                                &
190        ONLY:  sums_salsa_ws_l
191
192    IMPLICIT NONE
193!
194!-- SALSA constants:
195!
196!-- Local constants:
197    INTEGER(iwp), PARAMETER ::  luc_urban = 15     !< default landuse type for urban
198    INTEGER(iwp), PARAMETER ::  ngases_salsa  = 5  !< total number of gaseous tracers:
199                                                   !< 1 = H2SO4, 2 = HNO3, 3 = NH3, 4 = OCNV
200                                                   !< (non-volatile OC), 5 = OCSV (semi-volatile)
201    INTEGER(iwp), PARAMETER ::  nmod = 7     !< number of modes for initialising the aerosol size
202                                             !< distribution
203    INTEGER(iwp), PARAMETER ::  nreg = 2     !< Number of main size subranges
204    INTEGER(iwp), PARAMETER ::  maxspec = 7  !< Max. number of aerosol species
205    INTEGER(iwp), PARAMETER ::  season = 1   !< For dry depostion by Zhang et al.: 1 = summer,
206                                             !< 2 = autumn (no harvest yet), 3 = late autumn
207                                             !< (already frost), 4 = winter, 5 = transitional spring
208!
209!-- Universal constants
210    REAL(wp), PARAMETER ::  abo    = 1.380662E-23_wp   !< Boltzmann constant (J/K)
211    REAL(wp), PARAMETER ::  alv    = 2.260E+6_wp       !< latent heat for H2O
212                                                       !< vaporisation (J/kg)
213    REAL(wp), PARAMETER ::  alv_d_rv  = 4896.96865_wp  !< alv / rv
214    REAL(wp), PARAMETER ::  am_airmol = 4.8096E-26_wp  !< Average mass of one air
215                                                       !< molecule (Jacobson,
216                                                       !< 2005, Eq. 2.3)
217    REAL(wp), PARAMETER ::  api6   = 0.5235988_wp      !< pi / 6
218    REAL(wp), PARAMETER ::  argas  = 8.314409_wp       !< Gas constant (J/(mol K))
219    REAL(wp), PARAMETER ::  argas_d_cpd = 8.281283865E-3_wp  !< argas per cpd
220    REAL(wp), PARAMETER ::  avo    = 6.02214E+23_wp    !< Avogadro constant (1/mol)
221    REAL(wp), PARAMETER ::  d_sa   = 5.539376964394570E-10_wp  !< diameter of condensing sulphuric
222                                                               !< acid molecule (m)
223    REAL(wp), PARAMETER ::  for_ppm_to_nconc =  7.243016311E+16_wp !< ppm * avo / R (K/(Pa*m3))
224    REAL(wp), PARAMETER ::  epsoc  = 0.15_wp          !< water uptake of organic
225                                                      !< material
226    REAL(wp), PARAMETER ::  mclim  = 1.0E-23_wp       !< mass concentration min limit (kg/m3)
227    REAL(wp), PARAMETER ::  n3     = 158.79_wp        !< Number of H2SO4 molecules in 3 nm cluster
228                                                      !< if d_sa=5.54e-10m
229    REAL(wp), PARAMETER ::  nclim  = 1.0_wp           !< number concentration min limit (#/m3)
230    REAL(wp), PARAMETER ::  surfw0 = 0.073_wp         !< surface tension of water at 293 K (J/m2)
231!
232!-- Molar masses in kg/mol
233    REAL(wp), PARAMETER ::  ambc     = 12.0E-3_wp     !< black carbon (BC)
234    REAL(wp), PARAMETER ::  amdair   = 28.970E-3_wp   !< dry air
235    REAL(wp), PARAMETER ::  amdu     = 100.E-3_wp     !< mineral dust
236    REAL(wp), PARAMETER ::  amh2o    = 18.0154E-3_wp  !< H2O
237    REAL(wp), PARAMETER ::  amh2so4  = 98.06E-3_wp    !< H2SO4
238    REAL(wp), PARAMETER ::  amhno3   = 63.01E-3_wp    !< HNO3
239    REAL(wp), PARAMETER ::  amn2o    = 44.013E-3_wp   !< N2O
240    REAL(wp), PARAMETER ::  amnh3    = 17.031E-3_wp   !< NH3
241    REAL(wp), PARAMETER ::  amo2     = 31.9988E-3_wp  !< O2
242    REAL(wp), PARAMETER ::  amo3     = 47.998E-3_wp   !< O3
243    REAL(wp), PARAMETER ::  amoc     = 150.E-3_wp     !< organic carbon (OC)
244    REAL(wp), PARAMETER ::  amss     = 58.44E-3_wp    !< sea salt (NaCl)
245!
246!-- Densities in kg/m3
247    REAL(wp), PARAMETER ::  arhobc     = 2000.0_wp  !< black carbon
248    REAL(wp), PARAMETER ::  arhodu     = 2650.0_wp  !< mineral dust
249    REAL(wp), PARAMETER ::  arhoh2o    = 1000.0_wp  !< H2O
250    REAL(wp), PARAMETER ::  arhoh2so4  = 1830.0_wp  !< SO4
251    REAL(wp), PARAMETER ::  arhohno3   = 1479.0_wp  !< HNO3
252    REAL(wp), PARAMETER ::  arhonh3    = 1530.0_wp  !< NH3
253    REAL(wp), PARAMETER ::  arhooc     = 2000.0_wp  !< organic carbon
254    REAL(wp), PARAMETER ::  arhoss     = 2165.0_wp  !< sea salt (NaCl)
255!
256!-- Volume of molecule in m3/#
257    REAL(wp), PARAMETER ::  amvh2o   = amh2o /avo / arhoh2o      !< H2O
258    REAL(wp), PARAMETER ::  amvh2so4 = amh2so4 / avo / arhoh2so4 !< SO4
259    REAL(wp), PARAMETER ::  amvhno3  = amhno3 / avo / arhohno3   !< HNO3
260    REAL(wp), PARAMETER ::  amvnh3   = amnh3 / avo / arhonh3     !< NH3
261    REAL(wp), PARAMETER ::  amvoc    = amoc / avo / arhooc       !< OC
262    REAL(wp), PARAMETER ::  amvss    = amss / avo / arhoss       !< sea salt
263!
264!-- Constants for the dry deposition model by Petroff and Zhang (2010):
265!-- obstacle characteristic dimension "L" (cm) (plane obstacle by default) and empirical constants
266!-- C_B, C_IN, C_IM, beta_IM and C_IT for each land use category (15, as in Zhang et al. (2001))
267    REAL(wp), DIMENSION(1:15), PARAMETER :: l_p10 = &
268        (/0.15,  4.0,   0.15,  3.0,   3.0,   0.5,   3.0,   -99., 0.5,  2.0,  1.0,   -99., -99., -99., 3.0/)
269    REAL(wp), DIMENSION(1:15), PARAMETER :: c_b_p10 = &
270        (/0.887, 1.262, 0.887, 1.262, 1.262, 0.996, 0.996, -99., 0.7,  0.93, 0.996, -99., -99., -99., 1.262/)
271    REAL(wp), DIMENSION(1:15), PARAMETER :: c_in_p10 = &
272        (/0.81,  0.216, 0.81,  0.216, 0.216, 0.191, 0.162, -99., 0.7,  0.14, 0.162, -99., -99., -99., 0.216/)
273    REAL(wp), DIMENSION(1:15), PARAMETER :: c_im_p10 = &
274        (/0.162, 0.13,  0.162, 0.13,  0.13,  0.191, 0.081, -99., 0.191,0.086,0.081, -99., -99., -99., 0.13/)
275    REAL(wp), DIMENSION(1:15), PARAMETER :: beta_im_p10 = &
276        (/0.6,   0.47,  0.6,   0.47,  0.47,  0.47,  0.47,  -99., 0.6,  0.47, 0.47,  -99., -99., -99., 0.47/)
277    REAL(wp), DIMENSION(1:15), PARAMETER :: c_it_p10 = &
278        (/0.0,   0.056, 0.0,   0.056, 0.056, 0.042, 0.056, -99., 0.042,0.014,0.056, -99., -99., -99., 0.056/)
279!
280!-- Constants for the dry deposition model by Zhang et al. (2001):
281!-- empirical constants "alpha" and "gamma" and characteristic radius "A" for
282!-- each land use category (15) and season (5)
283    REAL(wp), DIMENSION(1:15), PARAMETER :: alpha_z01 = &
284        (/1.0, 0.6, 1.1, 0.8, 0.8, 1.2, 1.2, 50.0, 50.0, 1.3, 2.0, 50.0, 100.0, 100.0, 1.5/)
285    REAL(wp), DIMENSION(1:15), PARAMETER :: gamma_z01 = &
286        (/0.56, 0.58, 0.56, 0.56, 0.56, 0.54, 0.54, 0.54, 0.54, 0.54, 0.54, 0.54, 0.50, 0.50, 0.56/)
287    REAL(wp), DIMENSION(1:15,1:5), PARAMETER :: A_z01 =  RESHAPE( (/& 
288         2.0, 5.0, 2.0,  5.0, 5.0, 2.0, 2.0, -99., -99., 10.0, 10.0, -99., -99., -99., 10.0,&  ! SC1
289         2.0, 5.0, 2.0,  5.0, 5.0, 2.0, 2.0, -99., -99., 10.0, 10.0, -99., -99., -99., 10.0,&  ! SC2
290         2.0, 5.0, 5.0, 10.0, 5.0, 5.0, 5.0, -99., -99., 10.0, 10.0, -99., -99., -99., 10.0,&  ! SC3
291         2.0, 5.0, 5.0, 10.0, 5.0, 5.0, 5.0, -99., -99., 10.0, 10.0, -99., -99., -99., 10.0,&  ! SC4
292         2.0, 5.0, 2.0,  5.0, 5.0, 2.0, 2.0, -99., -99., 10.0, 10.0, -99., -99., -99., 10.0 &  ! SC5
293                                                           /), (/ 15, 5 /) )
294!-- Land use categories (based on Z01 but the same applies here also for P10):
295!-- 1 = evergreen needleleaf trees,
296!-- 2 = evergreen broadleaf trees,
297!-- 3 = deciduous needleleaf trees,
298!-- 4 = deciduous broadleaf trees,
299!-- 5 = mixed broadleaf and needleleaf trees (deciduous broadleaf trees for P10),
300!-- 6 = grass (short grass for P10),
301!-- 7 = crops, mixed farming,
302!-- 8 = desert,
303!-- 9 = tundra,
304!-- 10 = shrubs and interrupted woodlands (thorn shrubs for P10),
305!-- 11 = wetland with plants (long grass for P10)
306!-- 12 = ice cap and glacier,
307!-- 13 = inland water (inland lake for P10)
308!-- 14 = ocean (water for P10),
309!-- 15 = urban
310!
311!-- SALSA variables:
312    CHARACTER(LEN=20)  ::  bc_salsa_b = 'neumann'                 !< bottom boundary condition
313    CHARACTER(LEN=20)  ::  bc_salsa_t = 'neumann'                 !< top boundary condition
314    CHARACTER(LEN=20)  ::  depo_pcm_par = 'zhang2001'             !< or 'petroff2010'
315    CHARACTER(LEN=20)  ::  depo_pcm_type = 'deciduous_broadleaf'  !< leaf type
316    CHARACTER(LEN=20)  ::  depo_surf_par = 'zhang2001'            !< or 'petroff2010'
317    CHARACTER(LEN=100) ::  input_file_dynamic = 'PIDS_DYNAMIC'    !< file name for dynamic input
318    CHARACTER(LEN=100) ::  input_file_salsa   = 'PIDS_SALSA'      !< file name for emission data
319    CHARACTER(LEN=20)  ::  salsa_emission_mode = 'no_emission'    !< 'no_emission', 'uniform',
320                                                                  !< 'parameterized', 'read_from_file'
321
322    CHARACTER(LEN=20), DIMENSION(4) ::  decycle_method =                                           &
323                                                 (/'dirichlet','dirichlet','dirichlet','dirichlet'/)
324                                     !< Decycling method at horizontal boundaries
325                                     !< 1=left, 2=right, 3=south, 4=north
326                                     !< dirichlet = initial profiles for the ghost and first 3 layers
327                                     !< neumann = zero gradient
328
329    CHARACTER(LEN=3), DIMENSION(maxspec) ::  listspec = &  !< Active aerosols
330                                   (/'SO4','   ','   ','   ','   ','   ','   '/)
331
332    INTEGER(iwp) ::  depo_pcm_par_num = 1   !< parametrisation type: 1=zhang2001, 2=petroff2010
333    INTEGER(iwp) ::  depo_pcm_type_num = 0  !< index for the dry deposition type on the plant canopy
334    INTEGER(iwp) ::  depo_surf_par_num = 1  !< parametrisation type: 1=zhang2001, 2=petroff2010
335    INTEGER(iwp) ::  dots_salsa = 0         !< starting index for salsa-timeseries
336    INTEGER(iwp) ::  end_subrange_1a = 1    !< last index for bin subrange 1a
337    INTEGER(iwp) ::  end_subrange_2a = 1    !< last index for bin subrange 2a
338    INTEGER(iwp) ::  end_subrange_2b = 1    !< last index for bin subrange 2b
339    INTEGER(iwp) ::  ibc_salsa_b            !< index for the bottom boundary condition
340    INTEGER(iwp) ::  ibc_salsa_t            !< index for the top boundary condition
341    INTEGER(iwp) ::  index_bc  = -1         !< index for black carbon (BC)
342    INTEGER(iwp) ::  index_du  = -1         !< index for dust
343    INTEGER(iwp) ::  index_nh  = -1         !< index for NH3
344    INTEGER(iwp) ::  index_no  = -1         !< index for HNO3
345    INTEGER(iwp) ::  index_oc  = -1         !< index for organic carbon (OC)
346    INTEGER(iwp) ::  index_so4 = -1         !< index for SO4 or H2SO4
347    INTEGER(iwp) ::  index_ss  = -1         !< index for sea salt
348    INTEGER(iwp) ::  init_aerosol_type = 0  !< Initial size distribution type
349                                            !< 0 = uniform (read from PARIN)
350                                            !< 1 = read vertical profile of the mode number
351                                            !<     concentration from an input file
352    INTEGER(iwp) ::  init_gases_type = 0    !< Initial gas concentration type
353                                            !< 0 = uniform (read from PARIN)
354                                            !< 1 = read vertical profile from an input file
355    INTEGER(iwp) ::  lod_gas_emissions = 0  !< level of detail of the gaseous emission data
356    INTEGER(iwp) ::  nbins_aerosol = 1      !< total number of size bins
357    INTEGER(iwp) ::  ncc   = 1              !< number of chemical components used
358    INTEGER(iwp) ::  ncomponents_mass = 1   !< total number of chemical compounds (ncc+1)
359                                            !< if particle water is advected)
360    INTEGER(iwp) ::  nj3 = 1                !< J3 parametrization (nucleation)
361                                            !< 1 = condensational sink (Kerminen&Kulmala, 2002)
362                                            !< 2 = coagulational sink (Lehtinen et al. 2007)
363                                            !< 3 = coagS+self-coagulation (Anttila et al. 2010)
364    INTEGER(iwp) ::  nsnucl = 0             !< Choice of the nucleation scheme:
365                                            !< 0 = off
366                                            !< 1 = binary nucleation
367                                            !< 2 = activation type nucleation
368                                            !< 3 = kinetic nucleation
369                                            !< 4 = ternary nucleation
370                                            !< 5 = nucleation with ORGANICs
371                                            !< 6 = activation type of nucleation with H2SO4+ORG
372                                            !< 7 = heteromolecular nucleation with H2SO4*ORG
373                                            !< 8 = homomolecular nucleation of H2SO4
374                                            !<     + heteromolecular nucleation with H2SO4*ORG
375                                            !< 9 = homomolecular nucleation of H2SO4 and ORG
376                                            !<     + heteromolecular nucleation with H2SO4*ORG
377    INTEGER(iwp) ::  start_subrange_1a = 1  !< start index for bin subranges: subrange 1a
378    INTEGER(iwp) ::  start_subrange_2a = 1  !<                                subrange 2a
379    INTEGER(iwp) ::  start_subrange_2b = 1  !<                                subrange 2b
380
381    INTEGER(iwp), DIMENSION(nreg) ::  nbin = (/ 3, 7/)  !< Number of size bins per subrange: 1 & 2
382
383    INTEGER(iwp), DIMENSION(ngases_salsa) ::  gas_index_chem = &
384                                                 (/ 1, 1, 1, 1, 1/)  !< gas indices in chemistry_model_mod
385                                                 !< 1 = H2SO4, 2 = HNO3, 3 = NH3, 4 = OCNV, 5 = OCSV
386    INTEGER(iwp), DIMENSION(ngases_salsa) ::  emission_index_chem  !< gas indices in the gas emission file
387
388    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  k_topo_top  !< vertical index of the topography top
389!
390!-- SALSA switches:
391    LOGICAL ::  advect_particle_water   = .TRUE.   !< Advect water concentration of particles
392    LOGICAL ::  decycle_lr              = .FALSE.  !< Undo cyclic boundaries: left and right
393    LOGICAL ::  decycle_ns              = .FALSE.  !< Undo cyclic boundaries: north and south
394    LOGICAL ::  include_emission        = .FALSE.  !< Include or not emissions
395    LOGICAL ::  feedback_to_palm        = .FALSE.  !< Allow feedback due to condensation of H2O
396    LOGICAL ::  nest_salsa              = .FALSE.  !< Apply nesting for salsa
397    LOGICAL ::  no_insoluble            = .FALSE.  !< Exclude insoluble chemical components
398    LOGICAL ::  read_restart_data_salsa = .FALSE.  !< Read restart data for salsa
399    LOGICAL ::  salsa_gases_from_chem   = .FALSE.  !< Transfer the gaseous components to SALSA from
400                                                   !< the chemistry model
401    LOGICAL ::  van_der_waals_coagc     = .FALSE.  !< Enhancement of coagulation kernel by van der
402                                                   !< Waals and viscous forces
403    LOGICAL ::  write_binary_salsa      = .FALSE.  !< read binary for salsa
404!
405!-- Process switches: nl* is read from the NAMELIST and is NOT changed.
406!--                   ls* is the switch used and will get the value of nl*
407!--                       except for special circumstances (spinup period etc.)
408    LOGICAL ::  nlcoag       = .FALSE.  !< Coagulation master switch
409    LOGICAL ::  lscoag       = .FALSE.  !<
410    LOGICAL ::  nlcnd        = .FALSE.  !< Condensation master switch
411    LOGICAL ::  lscnd        = .FALSE.  !<
412    LOGICAL ::  nlcndgas     = .FALSE.  !< Condensation of precursor gases
413    LOGICAL ::  lscndgas     = .FALSE.  !<
414    LOGICAL ::  nlcndh2oae   = .FALSE.  !< Condensation of H2O on aerosol
415    LOGICAL ::  lscndh2oae   = .FALSE.  !< particles (FALSE -> equilibrium calc.)
416    LOGICAL ::  nldepo       = .FALSE.  !< Deposition master switch
417    LOGICAL ::  lsdepo       = .FALSE.  !<
418    LOGICAL ::  nldepo_surf  = .FALSE.  !< Deposition on vegetation master switch
419    LOGICAL ::  lsdepo_surf  = .FALSE.  !<
420    LOGICAL ::  nldepo_pcm   = .FALSE.  !< Deposition on walls master switch
421    LOGICAL ::  lsdepo_pcm   = .FALSE.  !<
422    LOGICAL ::  nldistupdate = .TRUE.   !< Size distribution update master switch
423    LOGICAL ::  lsdistupdate = .FALSE.  !<
424    LOGICAL ::  lspartition  = .FALSE.  !< Partition of HNO3 and NH3
425
426    REAL(wp) ::  act_coeff = 1.0E-7_wp               !< Activation coefficient
427    REAL(wp) ::  dt_salsa  = 0.00001_wp              !< Time step of SALSA
428    REAL(wp) ::  h2so4_init = nclim                  !< Init value for sulphuric acid gas
429    REAL(wp) ::  hno3_init  = nclim                  !< Init value for nitric acid gas
430    REAL(wp) ::  last_salsa_time = 0.0_wp            !< previous salsa call
431    REAL(wp) ::  next_aero_emission_update = 0.0_wp  !< previous emission update
432    REAL(wp) ::  next_gas_emission_update = 0.0_wp   !< previous emission update
433    REAL(wp) ::  nf2a = 1.0_wp                       !< Number fraction allocated to 2a-bins
434    REAL(wp) ::  nh3_init  = nclim                   !< Init value for ammonia gas
435    REAL(wp) ::  ocnv_init = nclim                   !< Init value for non-volatile organic gases
436    REAL(wp) ::  ocsv_init = nclim                   !< Init value for semi-volatile organic gases
437    REAL(wp) ::  rhlim = 1.20_wp                     !< RH limit in %/100. Prevents unrealistical RH
438    REAL(wp) ::  skip_time_do_salsa = 0.0_wp         !< Starting time of SALSA (s)
439!
440!-- Initial log-normal size distribution: mode diameter (dpg, metres),
441!-- standard deviation (sigmag) and concentration (n_lognorm, #/m3)
442    REAL(wp), DIMENSION(nmod) ::  dpg   = &
443                     (/1.3E-8_wp, 5.4E-8_wp, 8.6E-7_wp, 2.0E-7_wp, 2.0E-7_wp, 2.0E-7_wp, 2.0E-7_wp/)
444    REAL(wp), DIMENSION(nmod) ::  sigmag  = &
445                                        (/1.8_wp, 2.16_wp, 2.21_wp, 2.0_wp, 2.0_wp, 2.0_wp, 2.0_wp/)
446    REAL(wp), DIMENSION(nmod) ::  n_lognorm = &
447                             (/1.04e+11_wp, 3.23E+10_wp, 5.4E+6_wp, 0.0_wp, 0.0_wp, 0.0_wp, 0.0_wp/)
448!
449!-- Initial mass fractions / chemical composition of the size distribution
450    REAL(wp), DIMENSION(maxspec) ::  mass_fracs_a = & !< mass fractions between
451             (/1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0/) !< aerosol species for A bins
452    REAL(wp), DIMENSION(maxspec) ::  mass_fracs_b = & !< mass fractions between
453             (/0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0/) !< aerosol species for B bins
454    REAL(wp), DIMENSION(nreg+1) ::  reglim = & !< Min&max diameters of size subranges
455                                 (/ 3.0E-9_wp, 5.0E-8_wp, 1.0E-5_wp/)
456!
457!-- Initial log-normal size distribution: mode diameter (dpg, metres), standard deviation (sigmag)
458!-- concentration (n_lognorm, #/m3) and mass fractions of all chemical components (listed in
459!-- listspec) for both a (soluble) and b (insoluble) bins.
460    REAL(wp), DIMENSION(nmod) ::  aerosol_flux_dpg   = &
461                     (/1.3E-8_wp, 5.4E-8_wp, 8.6E-7_wp, 2.0E-7_wp, 2.0E-7_wp, 2.0E-7_wp, 2.0E-7_wp/)
462    REAL(wp), DIMENSION(nmod) ::  aerosol_flux_sigmag  = &
463                                        (/1.8_wp, 2.16_wp, 2.21_wp, 2.0_wp, 2.0_wp, 2.0_wp, 2.0_wp/)
464    REAL(wp), DIMENSION(maxspec) ::  aerosol_flux_mass_fracs_a = &
465                                                               (/1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0/)
466    REAL(wp), DIMENSION(maxspec) ::  aerosol_flux_mass_fracs_b = &
467                                                               (/0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0/)
468    REAL(wp), DIMENSION(nmod) ::  surface_aerosol_flux = &
469                                 (/1.0E+8_wp, 1.0E+9_wp, 1.0E+5_wp, 0.0_wp, 0.0_wp, 0.0_wp, 0.0_wp/)
470
471    REAL(wp), DIMENSION(:), ALLOCATABLE ::  bin_low_limits     !< to deliver information about
472                                                               !< the lower diameters per bin
473    REAL(wp), DIMENSION(:), ALLOCATABLE ::  bc_am_t_val        !< vertical gradient of: aerosol mass
474    REAL(wp), DIMENSION(:), ALLOCATABLE ::  bc_an_t_val        !< of: aerosol number
475    REAL(wp), DIMENSION(:), ALLOCATABLE ::  bc_gt_t_val        !< salsa gases near domain top
476    REAL(wp), DIMENSION(:), ALLOCATABLE ::  gas_emission_time  !< Time array in gas emission data (s)
477    REAL(wp), DIMENSION(:), ALLOCATABLE ::  nsect              !< Background number concentrations
478    REAL(wp), DIMENSION(:), ALLOCATABLE ::  massacc            !< Mass accomodation coefficients
479!
480!-- SALSA derived datatypes:
481!
482!-- Component index
483    TYPE component_index
484       CHARACTER(len=3), ALLOCATABLE ::  comp(:)  !< Component name
485       INTEGER(iwp) ::  ncomp  !< Number of components
486       INTEGER(iwp), ALLOCATABLE ::  ind(:)  !< Component index
487    END TYPE component_index
488!
489!-- For matching LSM and USM surface types and the deposition module surface types
490    TYPE match_surface
491       INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  match_lupg  !< index for pavement / green roofs
492       INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  match_luvw  !< index for vegetation / walls
493       INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  match_luww  !< index for water / windows
494    END TYPE match_surface
495!
496!-- Aerosol emission data attributes
497    TYPE salsa_emission_attribute_type
498
499       CHARACTER(LEN=25) ::   units
500
501       CHARACTER(LEN=25), DIMENSION(:), ALLOCATABLE ::   cat_name    !<
502       CHARACTER(LEN=25), DIMENSION(:), ALLOCATABLE ::   cc_name     !<
503       CHARACTER(LEN=25), DIMENSION(:), ALLOCATABLE ::   unit_time   !<
504       CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE ::  var_names   !<
505
506       INTEGER(iwp) ::  lod = 0            !< level of detail
507       INTEGER(iwp) ::  nbins = 10         !< number of aerosol size bins
508       INTEGER(iwp) ::  ncat  = 0          !< number of emission categories
509       INTEGER(iwp) ::  ncc   = 7          !< number of aerosol chemical components
510       INTEGER(iwp) ::  nhoursyear = 0     !< number of hours: HOURLY mode
511       INTEGER(iwp) ::  nmonthdayhour = 0  !< number of month days and hours: MDH mode
512       INTEGER(iwp) ::  num_vars           !< number of variables
513       INTEGER(iwp) ::  nt  = 0            !< number of time steps
514       INTEGER(iwp) ::  nz  = 0            !< number of vertical levels
515       INTEGER(iwp) ::  tind               !< time index for reference time in salsa emission data
516
517       INTEGER(iwp), DIMENSION(maxspec) ::  cc_input_to_model   !<
518
519       INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  cat_index  !< Index of emission categories
520       INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  cc_index   !< Index of chemical components
521
522       REAL(wp) ::  conversion_factor  !< unit conversion factor for aerosol emissions
523
524       REAL(wp), DIMENSION(:), ALLOCATABLE ::  dmid         !< mean diameters of size bins (m)
525       REAL(wp), DIMENSION(:), ALLOCATABLE ::  rho          !< average density (kg/m3)
526       REAL(wp), DIMENSION(:), ALLOCATABLE ::  time         !< time (s)
527       REAL(wp), DIMENSION(:), ALLOCATABLE ::  time_factor  !< emission time factor
528       REAL(wp), DIMENSION(:), ALLOCATABLE ::  z            !< height (m)
529
530       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  etf  !< emission time factor
531       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: stack_height
532
533    END TYPE salsa_emission_attribute_type
534!
535!-- The default size distribution and mass composition per emission category:
536!-- 1 = traffic, 2 = road dust, 3 = wood combustion, 4 = other
537!-- Mass fractions: H2SO4, OC, BC, DU, SS, HNO3, NH3
538    TYPE salsa_emission_mode_type
539
540       INTEGER(iwp) ::  ndm = 3  !< number of default modes
541       INTEGER(iwp) ::  ndc = 4  !< number of default categories
542
543       CHARACTER(LEN=25), DIMENSION(1:4) ::  cat_name_table = (/'traffic exhaust', &
544                                                                'road dust      ', &
545                                                                'wood combustion', &
546                                                                'other          '/)
547
548       INTEGER(iwp), DIMENSION(1:4) ::  cat_input_to_model   !<
549
550       REAL(wp), DIMENSION(1:3) ::  dpg_table = (/ 13.5E-9_wp, 1.4E-6_wp, 5.4E-8_wp/)  !<
551       REAL(wp), DIMENSION(1:3) ::  ntot_table  !<
552       REAL(wp), DIMENSION(1:3) ::  sigmag_table = (/ 1.6_wp, 1.4_wp, 1.7_wp /)  !<
553
554       REAL(wp), DIMENSION(1:maxspec,1:4) ::  mass_frac_table = &  !<
555          RESHAPE( (/ 0.04_wp, 0.48_wp, 0.48_wp, 0.0_wp,  0.0_wp, 0.0_wp, 0.0_wp, &
556                      0.0_wp,  0.05_wp, 0.0_wp,  0.95_wp, 0.0_wp, 0.0_wp, 0.0_wp, &
557                      0.0_wp,  0.5_wp,  0.5_wp,  0.0_wp,  0.0_wp, 0.0_wp, 0.0_wp, &
558                      0.0_wp,  0.5_wp,  0.5_wp,  0.0_wp,  0.0_wp, 0.0_wp, 0.0_wp  &
559                   /), (/maxspec,4/) )
560
561       REAL(wp), DIMENSION(1:3,1:4) ::  pm_frac_table = & !< rel. mass
562                                     RESHAPE( (/ 0.016_wp, 0.000_wp, 0.984_wp, &
563                                                 0.000_wp, 1.000_wp, 0.000_wp, &
564                                                 0.000_wp, 0.000_wp, 1.000_wp, &
565                                                 1.000_wp, 0.000_wp, 1.000_wp  &
566                                              /), (/3,4/) )
567
568    END TYPE salsa_emission_mode_type
569!
570!-- Aerosol emission data values
571    TYPE salsa_emission_value_type
572
573       REAL(wp) ::  fill  !< fill value
574
575       REAL(wp), DIMENSION(:), ALLOCATABLE :: preproc_mass_fracs  !< mass fractions
576
577       REAL(wp), DIMENSION(:,:), ALLOCATABLE :: def_mass_fracs  !< mass fractions per emis. category
578
579       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: def_data      !< surface emission values in PM
580       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: preproc_data  !< surface emission values per bin
581
582    END TYPE salsa_emission_value_type
583!
584!-- Prognostic variable: Aerosol size bin information (number (#/m3) and mass (kg/m3) concentration)
585!-- and the concentration of gaseous tracers (#/m3). Gas tracers are contained sequentially in
586!-- dimension 4 as:
587!-- 1. H2SO4, 2. HNO3, 3. NH3, 4. OCNV (non-volatile organics), 5. OCSV (semi-volatile)
588    TYPE salsa_variable
589
590       REAL(wp), ALLOCATABLE, DIMENSION(:)     ::  init  !<
591
592       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::  diss_s     !<
593       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::  flux_s     !<
594       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::  source     !<
595       REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::  sums_ws_l  !<
596
597       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  diss_l  !<
598       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  flux_l  !<
599
600       REAL(wp), POINTER, DIMENSION(:,:,:), CONTIGUOUS ::  conc     !<
601       REAL(wp), POINTER, DIMENSION(:,:,:), CONTIGUOUS ::  conc_p   !<
602       REAL(wp), POINTER, DIMENSION(:,:,:), CONTIGUOUS ::  tconc_m  !<
603
604    END TYPE salsa_variable
605!
606!-- Datatype used to store information about the binned size distributions of aerosols
607    TYPE t_section
608
609       REAL(wp) ::  dmid     !< bin middle diameter (m)
610       REAL(wp) ::  vhilim   !< bin volume at the high limit
611       REAL(wp) ::  vlolim   !< bin volume at the low limit
612       REAL(wp) ::  vratiohi !< volume ratio between the center and high limit
613       REAL(wp) ::  vratiolo !< volume ratio between the center and low limit
614       !******************************************************
615       ! ^ Do NOT change the stuff above after initialization !
616       !******************************************************
617       REAL(wp) ::  core    !< Volume of dry particle
618       REAL(wp) ::  dwet    !< Wet diameter or mean droplet diameter (m)
619       REAL(wp) ::  numc    !< Number concentration of particles/droplets (#/m3)
620       REAL(wp) ::  veqh2o  !< Equilibrium H2O concentration for each particle
621
622       REAL(wp), DIMENSION(maxspec+1) ::  volc !< Volume concentrations (m^3/m^3) of aerosols +
623                                               !< water. Since most of the stuff in SALSA is hard
624                                               !< coded, these *have to be* in the order
625                                               !< 1:SO4, 2:OC, 3:BC, 4:DU, 5:SS, 6:NO, 7:NH, 8:H2O
626    END TYPE t_section
627
628    TYPE(salsa_emission_attribute_type) ::  aero_emission_att  !< emission attributes
629    TYPE(salsa_emission_value_type)     ::  aero_emission      !< emission values
630    TYPE(salsa_emission_mode_type)      ::  def_modes          !< default emission modes
631
632    TYPE(chem_emis_att_type) ::  chem_emission_att  !< chemistry emission attributes
633    TYPE(chem_emis_val_type) ::  chem_emission      !< chemistry emission values
634
635    TYPE(t_section), DIMENSION(:), ALLOCATABLE ::  aero  !< local aerosol properties
636
637    TYPE(match_surface) ::  lsm_to_depo_h  !< to match the deposition module and horizontal LSM surfaces
638    TYPE(match_surface) ::  usm_to_depo_h  !< to match the deposition module and horizontal USM surfaces
639
640    TYPE(match_surface), DIMENSION(0:3) ::  lsm_to_depo_v  !< to match the deposition mod. and vertical LSM surfaces
641    TYPE(match_surface), DIMENSION(0:3) ::  usm_to_depo_v  !< to match the deposition mod. and vertical USM surfaces
642!
643!-- SALSA variables: as x = x(k,j,i,bin).
644!-- The 4th dimension contains all the size bins sequentially for each aerosol species  + water.
645!
646!-- Prognostic variables:
647!
648!-- Number concentration (#/m3)
649    TYPE(salsa_variable), ALLOCATABLE, DIMENSION(:), TARGET ::  aerosol_number  !<
650    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET ::  nconc_1  !<
651    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET ::  nconc_2  !<
652    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET ::  nconc_3  !<
653!
654!-- Mass concentration (kg/m3)
655    TYPE(salsa_variable), ALLOCATABLE, DIMENSION(:), TARGET ::  aerosol_mass  !<
656    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET ::  mconc_1  !<
657    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET ::  mconc_2  !<
658    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET ::  mconc_3  !<
659!
660!-- Gaseous concentrations (#/m3)
661    TYPE(salsa_variable), ALLOCATABLE, DIMENSION(:), TARGET ::  salsa_gas  !<
662    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET ::  gconc_1  !<
663    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET ::  gconc_2  !<
664    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET ::  gconc_3  !<
665!
666!-- Diagnostic tracers
667    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::  sedim_vd  !< sedimentation velocity per bin (m/s)
668    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::  ra_dry    !< aerosol dry radius (m)
669
670!-- Particle component index tables
671    TYPE(component_index) :: prtcl  !< Contains "getIndex" which gives the index for a given aerosol
672                                    !< component name: 1:SO4, 2:OC, 3:BC, 4:DU, 5:SS, 6:NO, 7:NH, 8:H2O
673!
674!-- Data output arrays:
675!
676!-- Gases:
677    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  g_h2so4_av  !< H2SO4
678    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  g_hno3_av   !< HNO3
679    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  g_nh3_av    !< NH3
680    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  g_ocnv_av   !< non-volatile OC
681    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  g_ocsv_av   !< semi-volatile OC
682!
683!-- Integrated:
684    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  ldsa_av  !< lung-deposited surface area
685    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  ntot_av  !< total number concentration
686    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  pm25_av  !< PM2.5
687    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  pm10_av  !< PM10
688!
689!-- In the particle phase:
690    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  s_bc_av   !< black carbon
691    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  s_du_av   !< dust
692    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  s_h2o_av  !< liquid water
693    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  s_nh_av   !< ammonia
694    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  s_no_av   !< nitrates
695    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  s_oc_av   !< org. carbon
696    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  s_so4_av  !< sulphates
697    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::  s_ss_av   !< sea salt
698!
699!-- Bin specific mass and number concentrations:
700    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET ::  mbins_av  !< bin mas
701    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET ::  nbins_av  !< bin number
702
703!
704!-- PALM interfaces:
705!
706!-- Boundary conditions:
707    INTERFACE salsa_boundary_conds
708       MODULE PROCEDURE salsa_boundary_conds
709       MODULE PROCEDURE salsa_boundary_conds_decycle
710    END INTERFACE salsa_boundary_conds
711!
712!-- Data output checks for 2D/3D data to be done in check_parameters
713    INTERFACE salsa_check_data_output
714       MODULE PROCEDURE salsa_check_data_output
715    END INTERFACE salsa_check_data_output
716!
717!-- Input parameter checks to be done in check_parameters
718    INTERFACE salsa_check_parameters
719       MODULE PROCEDURE salsa_check_parameters
720    END INTERFACE salsa_check_parameters
721!
722!-- Averaging of 3D data for output
723    INTERFACE salsa_3d_data_averaging
724       MODULE PROCEDURE salsa_3d_data_averaging
725    END INTERFACE salsa_3d_data_averaging
726!
727!-- Data output of 2D quantities
728    INTERFACE salsa_data_output_2d
729       MODULE PROCEDURE salsa_data_output_2d
730    END INTERFACE salsa_data_output_2d
731!
732!-- Data output of 3D data
733    INTERFACE salsa_data_output_3d
734       MODULE PROCEDURE salsa_data_output_3d
735    END INTERFACE salsa_data_output_3d
736!
737!-- Data output of 3D data
738    INTERFACE salsa_data_output_mask
739       MODULE PROCEDURE salsa_data_output_mask
740    END INTERFACE salsa_data_output_mask
741!
742!-- Definition of data output quantities
743    INTERFACE salsa_define_netcdf_grid
744       MODULE PROCEDURE salsa_define_netcdf_grid
745    END INTERFACE salsa_define_netcdf_grid
746!
747!-- Output of information to the header file
748    INTERFACE salsa_header
749       MODULE PROCEDURE salsa_header
750    END INTERFACE salsa_header
751!
752!-- Initialization actions
753    INTERFACE salsa_init
754       MODULE PROCEDURE salsa_init
755    END INTERFACE salsa_init
756!
757!-- Initialization of arrays
758    INTERFACE salsa_init_arrays
759       MODULE PROCEDURE salsa_init_arrays
760    END INTERFACE salsa_init_arrays
761!
762!-- Writing of binary output for restart runs  !!! renaming?!
763    INTERFACE salsa_wrd_local
764       MODULE PROCEDURE salsa_wrd_local
765    END INTERFACE salsa_wrd_local
766!
767!-- Reading of NAMELIST parameters
768    INTERFACE salsa_parin
769       MODULE PROCEDURE salsa_parin
770    END INTERFACE salsa_parin
771!
772!-- Reading of parameters for restart runs
773    INTERFACE salsa_rrd_local
774       MODULE PROCEDURE salsa_rrd_local
775    END INTERFACE salsa_rrd_local
776!
777!-- Swapping of time levels (required for prognostic variables)
778    INTERFACE salsa_swap_timelevel
779       MODULE PROCEDURE salsa_swap_timelevel
780    END INTERFACE salsa_swap_timelevel
781!
782!-- Interface between PALM and salsa
783    INTERFACE salsa_driver
784       MODULE PROCEDURE salsa_driver
785    END INTERFACE salsa_driver
786
787!-- Actions salsa variables
788    INTERFACE salsa_actions
789       MODULE PROCEDURE salsa_actions
790       MODULE PROCEDURE salsa_actions_ij
791    END INTERFACE salsa_actions
792!
793!-- Non-advective processes (i.e. aerosol dynamic reactions) for salsa variables
794    INTERFACE salsa_non_advective_processes
795       MODULE PROCEDURE salsa_non_advective_processes
796       MODULE PROCEDURE salsa_non_advective_processes_ij
797    END INTERFACE salsa_non_advective_processes
798!
799!-- Exchange horiz for salsa variables
800    INTERFACE salsa_exchange_horiz_bounds
801       MODULE PROCEDURE salsa_exchange_horiz_bounds
802    END INTERFACE salsa_exchange_horiz_bounds
803!
804!-- Prognostics equations for salsa variables
805    INTERFACE salsa_prognostic_equations
806       MODULE PROCEDURE salsa_prognostic_equations
807       MODULE PROCEDURE salsa_prognostic_equations_ij
808    END INTERFACE salsa_prognostic_equations
809!
810!-- Tendency salsa variables
811    INTERFACE salsa_tendency
812       MODULE PROCEDURE salsa_tendency
813       MODULE PROCEDURE salsa_tendency_ij
814    END INTERFACE salsa_tendency
815
816
817    SAVE
818
819    PRIVATE
820!
821!-- Public functions:
822    PUBLIC salsa_boundary_conds, salsa_check_data_output, salsa_check_parameters,                  &
823           salsa_3d_data_averaging, salsa_data_output_2d, salsa_data_output_3d,                    &
824           salsa_data_output_mask, salsa_define_netcdf_grid, salsa_diagnostics, salsa_driver,      &
825           salsa_emission_update, salsa_header, salsa_init, salsa_init_arrays, salsa_parin,        &
826           salsa_rrd_local, salsa_swap_timelevel, salsa_prognostic_equations, salsa_wrd_local,     &
827           salsa_actions, salsa_non_advective_processes, salsa_exchange_horiz_bounds
828!
829!-- Public parameters, constants and initial values
830    PUBLIC bc_am_t_val, bc_an_t_val, bc_gt_t_val, dots_salsa, dt_salsa,                            &
831           ibc_salsa_b, last_salsa_time, lsdepo, nest_salsa, salsa, salsa_gases_from_chem,         &
832           skip_time_do_salsa
833!
834!-- Public prognostic variables
835    PUBLIC aerosol_mass, aerosol_number, gconc_2, mconc_2, nbins_aerosol, ncc, ncomponents_mass,   &
836           nclim, nconc_2, ngases_salsa, prtcl, ra_dry, salsa_gas, sedim_vd
837
838
839 CONTAINS
840
841!------------------------------------------------------------------------------!
842! Description:
843! ------------
844!> Parin for &salsa_par for new modules
845!------------------------------------------------------------------------------!
846 SUBROUTINE salsa_parin
847
848    IMPLICIT NONE
849
850    CHARACTER(LEN=80) ::  line   !< dummy string that contains the current line
851                                  !< of the parameter file
852
853    NAMELIST /salsa_parameters/      aerosol_flux_dpg, aerosol_flux_mass_fracs_a,                  &
854                                     aerosol_flux_mass_fracs_b, aerosol_flux_sigmag,               &
855                                     advect_particle_water, bc_salsa_b, bc_salsa_t, decycle_lr,    &
856                                     decycle_method, decycle_ns, depo_pcm_par, depo_pcm_type,      &
857                                     depo_surf_par, dpg, dt_salsa, feedback_to_palm, h2so4_init,   &
858                                     hno3_init, init_gases_type, init_aerosol_type, listspec,      &
859                                     mass_fracs_a, mass_fracs_b, n_lognorm, nbin, nest_salsa, nf2a,&
860                                     nh3_init, nj3, nlcnd, nlcndgas, nlcndh2oae, nlcoag, nldepo,   &
861                                     nldepo_pcm,  nldepo_surf, nldistupdate, nsnucl, ocnv_init,    &
862                                     ocsv_init, read_restart_data_salsa, reglim, salsa,            &
863                                     salsa_emission_mode, sigmag, skip_time_do_salsa,              &
864                                     surface_aerosol_flux, van_der_waals_coagc, write_binary_salsa
865
866    line = ' '
867!
868!-- Try to find salsa package
869    REWIND ( 11 )
870    line = ' '
871    DO WHILE ( INDEX( line, '&salsa_parameters' ) == 0 )
872       READ ( 11, '(A)', END=10 )  line
873    ENDDO
874    BACKSPACE ( 11 )
875!
876!-- Read user-defined namelist
877    READ ( 11, salsa_parameters )
878!
879!-- Enable salsa (salsa switch in modules.f90)
880    salsa = .TRUE.
881
882 10 CONTINUE
883
884 END SUBROUTINE salsa_parin
885
886!------------------------------------------------------------------------------!
887! Description:
888! ------------
889!> Check parameters routine for salsa.
890!------------------------------------------------------------------------------!
891 SUBROUTINE salsa_check_parameters
892
893    USE control_parameters,                                                                        &
894        ONLY:  message_string
895
896    IMPLICIT NONE
897
898!
899!-- Checks go here (cf. check_parameters.f90).
900    IF ( salsa  .AND.  .NOT.  humidity )  THEN
901       WRITE( message_string, * ) 'salsa = ', salsa, ' is not allowed with humidity = ', humidity
902       CALL message( 'salsa_check_parameters', 'PA0594', 1, 2, 0, 6, 0 )
903    ENDIF
904
905    IF ( bc_salsa_b == 'dirichlet' )  THEN
906       ibc_salsa_b = 0
907    ELSEIF ( bc_salsa_b == 'neumann' )  THEN
908       ibc_salsa_b = 1
909    ELSE
910       message_string = 'unknown boundary condition: bc_salsa_b = "' // TRIM( bc_salsa_t ) // '"'
911       CALL message( 'salsa_check_parameters', 'PA0595', 1, 2, 0, 6, 0 )
912    ENDIF
913
914    IF ( bc_salsa_t == 'dirichlet' )  THEN
915       ibc_salsa_t = 0
916    ELSEIF ( bc_salsa_t == 'neumann' )  THEN
917       ibc_salsa_t = 1
918    ELSEIF ( bc_salsa_t == 'nested' )  THEN
919       ibc_salsa_t = 2
920    ELSE
921       message_string = 'unknown boundary condition: bc_salsa_t = "' // TRIM( bc_salsa_t ) // '"'
922       CALL message( 'salsa_check_parameters', 'PA0596', 1, 2, 0, 6, 0 )
923    ENDIF
924
925    IF ( nj3 < 1  .OR.  nj3 > 3 )  THEN
926       message_string = 'unknown nj3 (must be 1-3)'
927       CALL message( 'salsa_check_parameters', 'PA0597', 1, 2, 0, 6, 0 )
928    ENDIF
929
930    IF ( salsa_emission_mode /= 'no_emission'  .AND.  ibc_salsa_b  == 0 ) THEN
931       message_string = 'salsa_emission_mode /= "no_emission" requires bc_salsa_b = "Neumann"'
932       CALL message( 'salsa_check_parameters','PA0598', 1, 2, 0, 6, 0 )
933    ENDIF
934
935    IF ( salsa_emission_mode /= 'no_emission' )  include_emission = .TRUE.
936
937 END SUBROUTINE salsa_check_parameters
938
939!------------------------------------------------------------------------------!
940!
941! Description:
942! ------------
943!> Subroutine defining appropriate grid for netcdf variables.
944!> It is called out from subroutine netcdf.
945!> Same grid as for other scalars (see netcdf_interface_mod.f90)
946!------------------------------------------------------------------------------!
947 SUBROUTINE salsa_define_netcdf_grid( var, found, grid_x, grid_y, grid_z )
948
949    IMPLICIT NONE
950
951    CHARACTER(LEN=*), INTENT(OUT) ::  grid_x   !<
952    CHARACTER(LEN=*), INTENT(OUT) ::  grid_y   !<
953    CHARACTER(LEN=*), INTENT(OUT) ::  grid_z   !<
954    CHARACTER(LEN=*), INTENT(IN)  ::  var      !<
955
956    LOGICAL, INTENT(OUT) ::  found   !<
957
958    found  = .TRUE.
959!
960!-- Check for the grid
961
962    IF ( var(1:2) == 'g_' )  THEN
963       grid_x = 'x'
964       grid_y = 'y'
965       grid_z = 'zu'
966    ELSEIF ( var(1:4) == 'LDSA' )  THEN
967       grid_x = 'x'
968       grid_y = 'y'
969       grid_z = 'zu'
970    ELSEIF ( var(1:5) == 'm_bin' )  THEN
971       grid_x = 'x'
972       grid_y = 'y'
973       grid_z = 'zu'
974    ELSEIF ( var(1:5) == 'N_bin' )  THEN
975       grid_x = 'x'
976       grid_y = 'y'
977       grid_z = 'zu'
978    ELSEIF ( var(1:4) == 'Ntot' ) THEN
979       grid_x = 'x'
980       grid_y = 'y'
981       grid_z = 'zu'
982    ELSEIF ( var(1:2) == 'PM' )  THEN
983       grid_x = 'x'
984       grid_y = 'y'
985       grid_z = 'zu'
986    ELSEIF ( var(1:2) == 's_' )  THEN
987       grid_x = 'x'
988       grid_y = 'y'
989       grid_z = 'zu'
990    ELSE
991       found  = .FALSE.
992       grid_x = 'none'
993       grid_y = 'none'
994       grid_z = 'none'
995    ENDIF
996
997 END SUBROUTINE salsa_define_netcdf_grid
998
999!------------------------------------------------------------------------------!
1000! Description:
1001! ------------
1002!> Header output for new module
1003!------------------------------------------------------------------------------!
1004 SUBROUTINE salsa_header( io )
1005
1006    USE indices,                                                                                   &
1007        ONLY:  nx, ny, nz
1008
1009    IMPLICIT NONE
1010 
1011    INTEGER(iwp), INTENT(IN) ::  io   !< Unit of the output file
1012!
1013!-- Write SALSA header
1014    WRITE( io, 1 )
1015    WRITE( io, 2 ) skip_time_do_salsa
1016    WRITE( io, 3 ) dt_salsa
1017    WRITE( io, 4 )  nz, ny, nx, nbins_aerosol
1018    IF ( advect_particle_water )  THEN
1019       WRITE( io, 5 )  SHAPE( aerosol_mass(1)%conc ), ncomponents_mass*nbins_aerosol,              &
1020                        advect_particle_water
1021    ELSE
1022       WRITE( io, 5 )  SHAPE( aerosol_mass(1)%conc ), ncc*nbins_aerosol, advect_particle_water
1023    ENDIF
1024    IF ( .NOT. salsa_gases_from_chem )  THEN
1025       WRITE( io, 6 )  SHAPE( aerosol_mass(1)%conc ), ngases_salsa, salsa_gases_from_chem
1026    ENDIF
1027    WRITE( io, 7 )
1028    IF ( nsnucl > 0 )   WRITE( io, 8 ) nsnucl, nj3
1029    IF ( nlcoag )       WRITE( io, 9 )
1030    IF ( nlcnd )        WRITE( io, 10 ) nlcndgas, nlcndh2oae
1031    IF ( lspartition )  WRITE( io, 11 )
1032    IF ( nldepo )       WRITE( io, 12 ) nldepo_pcm, nldepo_surf
1033    WRITE( io, 13 )  reglim, nbin, bin_low_limits
1034    IF ( init_aerosol_type == 0 )  WRITE( io, 14 ) nsect
1035    WRITE( io, 15 ) ncc, listspec, mass_fracs_a, mass_fracs_b
1036    IF ( .NOT. salsa_gases_from_chem )  THEN
1037       WRITE( io, 16 ) ngases_salsa, h2so4_init, hno3_init, nh3_init, ocnv_init, ocsv_init
1038    ENDIF
1039    WRITE( io, 17 )  init_aerosol_type, init_gases_type
1040    IF ( init_aerosol_type == 0 )  THEN
1041       WRITE( io, 18 )  dpg, sigmag, n_lognorm
1042    ELSE
1043       WRITE( io, 19 )
1044    ENDIF
1045    IF ( nest_salsa )  WRITE( io, 20 )  nest_salsa
1046    WRITE( io, 21 ) salsa_emission_mode
1047    IF ( salsa_emission_mode == 'uniform' )  THEN
1048       WRITE( io, 22 ) surface_aerosol_flux, aerosol_flux_dpg, aerosol_flux_sigmag,                &
1049                       aerosol_flux_mass_fracs_a
1050    ENDIF
1051    IF ( SUM( aerosol_flux_mass_fracs_b ) > 0.0_wp  .OR. salsa_emission_mode == 'read_from_file' ) &
1052    THEN
1053       WRITE( io, 23 )
1054    ENDIF
1055
10561   FORMAT (//' SALSA information:'/                                                               &
1057              ' ------------------------------'/)
10582   FORMAT   ('    Starts at: skip_time_do_salsa = ', F10.2, '  s')
10593   FORMAT  (/'    Timestep: dt_salsa = ', F6.2, '  s')
10604   FORMAT  (/'    Array shape (z,y,x,bins):'/                                                     &
1061              '       aerosol_number:  ', 4(I3)) 
10625   FORMAT  (/'       aerosol_mass:    ', 4(I3),/                                                  &
1063              '       (advect_particle_water = ', L1, ')')
10646   FORMAT   ('       salsa_gas: ', 4(I3),/                                                        &
1065              '       (salsa_gases_from_chem = ', L1, ')')
10667   FORMAT  (/'    Aerosol dynamic processes included: ')
10678   FORMAT  (/'       nucleation (scheme = ', I1, ' and J3 parametrization = ', I1, ')')
10689   FORMAT  (/'       coagulation')
106910  FORMAT  (/'       condensation (of precursor gases = ', L1, ' and water vapour = ', L1, ')' )
107011  FORMAT  (/'       dissolutional growth by HNO3 and NH3')
107112  FORMAT  (/'       dry deposition (on vegetation = ', L1, ' and on topography = ', L1, ')')
107213  FORMAT  (/'    Aerosol bin subrange limits (in metres): ',  3(ES10.2E3), /                     &
1073              '    Number of size bins for each aerosol subrange: ', 2I3,/                         &
1074              '    Aerosol bin limits (in metres): ', 9(ES10.2E3))
107514  FORMAT   ('    Initial number concentration in bins at the lowest level (#/m**3):', 9(ES10.2E3))
107615  FORMAT  (/'    Number of chemical components used: ', I1,/                                     &
1077              '       Species: ',7(A6),/                                                           &
1078              '    Initial relative contribution of each species to particle volume in:',/         &
1079              '       a-bins: ', 7(F6.3),/                                                         &
1080              '       b-bins: ', 7(F6.3))
108116  FORMAT  (/'    Number of gaseous tracers used: ', I1,/                                         &
1082              '    Initial gas concentrations:',/                                                  &
1083              '       H2SO4: ',ES12.4E3, ' #/m**3',/                                               &
1084              '       HNO3:  ',ES12.4E3, ' #/m**3',/                                               &
1085              '       NH3:   ',ES12.4E3, ' #/m**3',/                                               &
1086              '       OCNV:  ',ES12.4E3, ' #/m**3',/                                               &
1087              '       OCSV:  ',ES12.4E3, ' #/m**3')
108817   FORMAT (/'   Initialising concentrations: ', /                                                &
1089              '      Aerosol size distribution: init_aerosol_type = ', I1,/                        &
1090              '      Gas concentrations: init_gases_type = ', I1 )
109118   FORMAT ( '      Mode diametres: dpg(nmod) = ', 7(F7.3), ' (m)', /                             &
1092              '      Standard deviation: sigmag(nmod) = ', 7(F7.2),/                               &
1093              '      Number concentration: n_lognorm(nmod) = ', 7(ES12.4E3), ' (#/m3)' )
109419   FORMAT (/'      Size distribution read from a file.')
109520   FORMAT (/'   Nesting for salsa variables: ', L1 )
109621   FORMAT (/'   Emissions: salsa_emission_mode = ', A )
109722   FORMAT (/'      surface_aerosol_flux = ', ES12.4E3, ' #/m**2/s', /                            &
1098              '      aerosol_flux_dpg     =  ', 7(F7.3), ' (m)', /                                 &
1099              '      aerosol_flux_sigmag  =  ', 7(F7.2), /                                         &
1100              '      aerosol_mass_fracs_a =  ', 7(ES12.4E3) )
110123   FORMAT (/'      (currently all emissions are soluble!)')
1102
1103 END SUBROUTINE salsa_header
1104
1105!------------------------------------------------------------------------------!
1106! Description:
1107! ------------
1108!> Allocate SALSA arrays and define pointers if required
1109!------------------------------------------------------------------------------!
1110 SUBROUTINE salsa_init_arrays
1111
1112    USE chem_gasphase_mod,                                                                         &
1113        ONLY:  nvar
1114
1115    USE surface_mod,                                                                               &
1116        ONLY:  surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, surf_usm_v
1117
1118    IMPLICIT NONE
1119
1120    INTEGER(iwp) ::  gases_available !< Number of available gas components in the chemistry model
1121    INTEGER(iwp) ::  i               !< loop index for allocating
1122    INTEGER(iwp) ::  l               !< loop index for allocating: surfaces
1123    INTEGER(iwp) ::  lsp             !< loop index for chem species in the chemistry model
1124
1125    gases_available = 0
1126!
1127!-- Allocate prognostic variables (see salsa_swap_timelevel)
1128!
1129!-- Set derived indices:
1130!-- (This does the same as the subroutine salsa_initialize in SALSA/UCLALES-SALSA)
1131    start_subrange_1a = 1  ! 1st index of subrange 1a
1132    start_subrange_2a = start_subrange_1a + nbin(1)  ! 1st index of subrange 2a
1133    end_subrange_1a   = start_subrange_2a - 1        ! last index of subrange 1a
1134    end_subrange_2a   = end_subrange_1a + nbin(2)    ! last index of subrange 2a
1135
1136!
1137!-- If the fraction of insoluble aerosols in subrange 2 is zero: do not allocate arrays for them
1138    IF ( nf2a > 0.999999_wp  .AND.  SUM( mass_fracs_b ) < 0.00001_wp )  THEN
1139       no_insoluble = .TRUE.
1140       start_subrange_2b = end_subrange_2a+1  ! 1st index of subrange 2b
1141       end_subrange_2b   = end_subrange_2a    ! last index of subrange 2b
1142    ELSE
1143       start_subrange_2b = start_subrange_2a + nbin(2)  ! 1st index of subrange 2b
1144       end_subrange_2b   = end_subrange_2a + nbin(2)    ! last index of subrange 2b
1145    ENDIF
1146
1147    nbins_aerosol = end_subrange_2b   ! total number of aerosol size bins
1148!
1149!-- Create index tables for different aerosol components
1150    CALL component_index_constructor( prtcl, ncc, maxspec, listspec )
1151
1152    ncomponents_mass = ncc
1153    IF ( advect_particle_water )  ncomponents_mass = ncc + 1  ! Add water
1154
1155!
1156!-- Allocate:
1157    ALLOCATE( aero(nbins_aerosol), bc_am_t_val(nbins_aerosol*ncomponents_mass),                    &
1158              bc_an_t_val(nbins_aerosol), bc_gt_t_val(ngases_salsa), bin_low_limits(nbins_aerosol),&
1159              nsect(nbins_aerosol), massacc(nbins_aerosol) )
1160    ALLOCATE( k_topo_top(nysg:nyng,nxlg:nxrg) )
1161    IF ( nldepo ) ALLOCATE( sedim_vd(nzb:nzt+1,nysg:nyng,nxlg:nxrg,nbins_aerosol) )
1162    ALLOCATE( ra_dry(nzb:nzt+1,nysg:nyng,nxlg:nxrg,nbins_aerosol) )
1163
1164!
1165!-- Aerosol number concentration
1166    ALLOCATE( aerosol_number(nbins_aerosol) )
1167    ALLOCATE( nconc_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg,nbins_aerosol),                                &
1168              nconc_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg,nbins_aerosol),                                &
1169              nconc_3(nzb:nzt+1,nysg:nyng,nxlg:nxrg,nbins_aerosol) )
1170    nconc_1 = 0.0_wp
1171    nconc_2 = 0.0_wp
1172    nconc_3 = 0.0_wp
1173
1174    DO i = 1, nbins_aerosol
1175       aerosol_number(i)%conc(nzb:nzt+1,nysg:nyng,nxlg:nxrg)    => nconc_1(:,:,:,i)
1176       aerosol_number(i)%conc_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg)  => nconc_2(:,:,:,i)
1177       aerosol_number(i)%tconc_m(nzb:nzt+1,nysg:nyng,nxlg:nxrg) => nconc_3(:,:,:,i)
1178       ALLOCATE( aerosol_number(i)%flux_s(nzb+1:nzt,0:threads_per_task-1),                         &
1179                 aerosol_number(i)%diss_s(nzb+1:nzt,0:threads_per_task-1),                         &
1180                 aerosol_number(i)%flux_l(nzb+1:nzt,nys:nyn,0:threads_per_task-1),                 &
1181                 aerosol_number(i)%diss_l(nzb+1:nzt,nys:nyn,0:threads_per_task-1),                 &
1182                 aerosol_number(i)%init(nzb:nzt+1),                                                &
1183                 aerosol_number(i)%sums_ws_l(nzb:nzt+1,0:threads_per_task-1) )
1184       aerosol_number(i)%init = nclim
1185       IF ( include_emission  .OR.  ( nldepo  .AND.  nldepo_surf ) )  THEN
1186          ALLOCATE( aerosol_number(i)%source(nys:nyn,nxl:nxr) )
1187       ENDIF
1188    ENDDO
1189
1190!
1191!-- Aerosol mass concentration
1192    ALLOCATE( aerosol_mass(ncomponents_mass*nbins_aerosol) )
1193    ALLOCATE( mconc_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg,ncomponents_mass*nbins_aerosol),               &
1194              mconc_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg,ncomponents_mass*nbins_aerosol),               &
1195              mconc_3(nzb:nzt+1,nysg:nyng,nxlg:nxrg,ncomponents_mass*nbins_aerosol) )
1196    mconc_1 = 0.0_wp
1197    mconc_2 = 0.0_wp
1198    mconc_3 = 0.0_wp
1199
1200    DO i = 1, ncomponents_mass*nbins_aerosol
1201       aerosol_mass(i)%conc(nzb:nzt+1,nysg:nyng,nxlg:nxrg)    => mconc_1(:,:,:,i)
1202       aerosol_mass(i)%conc_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg)  => mconc_2(:,:,:,i)
1203       aerosol_mass(i)%tconc_m(nzb:nzt+1,nysg:nyng,nxlg:nxrg) => mconc_3(:,:,:,i)
1204       ALLOCATE( aerosol_mass(i)%flux_s(nzb+1:nzt,0:threads_per_task-1),                           &
1205                 aerosol_mass(i)%diss_s(nzb+1:nzt,0:threads_per_task-1),                           &
1206                 aerosol_mass(i)%flux_l(nzb+1:nzt,nys:nyn,0:threads_per_task-1),                   &
1207                 aerosol_mass(i)%diss_l(nzb+1:nzt,nys:nyn,0:threads_per_task-1),                   &
1208                 aerosol_mass(i)%init(nzb:nzt+1),                                                  &
1209                 aerosol_mass(i)%sums_ws_l(nzb:nzt+1,0:threads_per_task-1)  )
1210       aerosol_mass(i)%init = mclim
1211       IF ( include_emission  .OR.  ( nldepo  .AND.  nldepo_surf ) )  THEN
1212          ALLOCATE( aerosol_mass(i)%source(nys:nyn,nxl:nxr) )
1213       ENDIF
1214    ENDDO
1215
1216!
1217!-- Surface fluxes: answs = aerosol number, amsws = aerosol mass
1218!
1219!-- Horizontal surfaces: default type
1220    DO  l = 0, 2   ! upward (l=0), downward (l=1) and model top (l=2)
1221       ALLOCATE( surf_def_h(l)%answs( 1:surf_def_h(l)%ns, nbins_aerosol ) )
1222       ALLOCATE( surf_def_h(l)%amsws( 1:surf_def_h(l)%ns, nbins_aerosol*ncomponents_mass ) )
1223       surf_def_h(l)%answs = 0.0_wp
1224       surf_def_h(l)%amsws = 0.0_wp
1225    ENDDO
1226!
1227!-- Horizontal surfaces: natural type
1228    ALLOCATE( surf_lsm_h%answs( 1:surf_lsm_h%ns, nbins_aerosol ) )
1229    ALLOCATE( surf_lsm_h%amsws( 1:surf_lsm_h%ns, nbins_aerosol*ncomponents_mass ) )
1230    surf_lsm_h%answs = 0.0_wp
1231    surf_lsm_h%amsws = 0.0_wp
1232!
1233!-- Horizontal surfaces: urban type
1234    ALLOCATE( surf_usm_h%answs( 1:surf_usm_h%ns, nbins_aerosol ) )
1235    ALLOCATE( surf_usm_h%amsws( 1:surf_usm_h%ns, nbins_aerosol*ncomponents_mass ) )
1236    surf_usm_h%answs = 0.0_wp
1237    surf_usm_h%amsws = 0.0_wp
1238
1239!
1240!-- Vertical surfaces: northward (l=0), southward (l=1), eastward (l=2) and westward (l=3) facing
1241    DO  l = 0, 3
1242       ALLOCATE( surf_def_v(l)%answs( 1:surf_def_v(l)%ns, nbins_aerosol ) )
1243       surf_def_v(l)%answs = 0.0_wp
1244       ALLOCATE( surf_def_v(l)%amsws( 1:surf_def_v(l)%ns, nbins_aerosol*ncomponents_mass ) )
1245       surf_def_v(l)%amsws = 0.0_wp
1246
1247       ALLOCATE( surf_lsm_v(l)%answs( 1:surf_lsm_v(l)%ns, nbins_aerosol ) )
1248       surf_lsm_v(l)%answs = 0.0_wp
1249       ALLOCATE( surf_lsm_v(l)%amsws( 1:surf_lsm_v(l)%ns, nbins_aerosol*ncomponents_mass ) )
1250       surf_lsm_v(l)%amsws = 0.0_wp
1251
1252       ALLOCATE( surf_usm_v(l)%answs( 1:surf_usm_v(l)%ns, nbins_aerosol ) )
1253       surf_usm_v(l)%answs = 0.0_wp
1254       ALLOCATE( surf_usm_v(l)%amsws( 1:surf_usm_v(l)%ns, nbins_aerosol*ncomponents_mass ) )
1255       surf_usm_v(l)%amsws = 0.0_wp
1256
1257    ENDDO
1258
1259!
1260!-- Concentration of gaseous tracers (1. SO4, 2. HNO3, 3. NH3, 4. OCNV, 5. OCSV)
1261!-- (number concentration (#/m3) )
1262!
1263!-- If chemistry is on, read gas phase concentrations from there. Otherwise,
1264!-- allocate salsa_gas array.
1265
1266    IF ( air_chemistry )  THEN
1267       DO  lsp = 1, nvar
1268          SELECT CASE ( TRIM( chem_species(lsp)%name ) )
1269             CASE ( 'H2SO4', 'h2so4' )
1270                gases_available = gases_available + 1
1271                gas_index_chem(1) = lsp
1272             CASE ( 'HNO3', 'hno3' )
1273                gases_available = gases_available + 1
1274                gas_index_chem(2) = lsp
1275             CASE ( 'NH3', 'nh3' )
1276                gases_available = gases_available + 1
1277                gas_index_chem(3) = lsp
1278             CASE ( 'OCNV', 'ocnv' )
1279                gases_available = gases_available + 1
1280                gas_index_chem(4) = lsp
1281             CASE ( 'OCSV', 'ocsv' )
1282                gases_available = gases_available + 1
1283                gas_index_chem(5) = lsp
1284          END SELECT
1285       ENDDO
1286
1287       IF ( gases_available == ngases_salsa )  THEN
1288          salsa_gases_from_chem = .TRUE.
1289       ELSE
1290          WRITE( message_string, * ) 'SALSA is run together with chemistry but not all gaseous '// &
1291                                     'components are provided by kpp (H2SO4, HNO3, NH3, OCNV, OCSV)'
1292       CALL message( 'check_parameters', 'PA0599', 1, 2, 0, 6, 0 )
1293       ENDIF
1294
1295    ELSE
1296
1297       ALLOCATE( salsa_gas(ngases_salsa) )
1298       ALLOCATE( gconc_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg,ngases_salsa),                 &
1299                 gconc_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg,ngases_salsa),                 &
1300                 gconc_3(nzb:nzt+1,nysg:nyng,nxlg:nxrg,ngases_salsa) )
1301       gconc_1 = 0.0_wp
1302       gconc_2 = 0.0_wp
1303       gconc_3 = 0.0_wp
1304
1305       DO i = 1, ngases_salsa
1306          salsa_gas(i)%conc(nzb:nzt+1,nysg:nyng,nxlg:nxrg)    => gconc_1(:,:,:,i)
1307          salsa_gas(i)%conc_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg)  => gconc_2(:,:,:,i)
1308          salsa_gas(i)%tconc_m(nzb:nzt+1,nysg:nyng,nxlg:nxrg) => gconc_3(:,:,:,i)
1309          ALLOCATE( salsa_gas(i)%flux_s(nzb+1:nzt,0:threads_per_task-1),       &
1310                    salsa_gas(i)%diss_s(nzb+1:nzt,0:threads_per_task-1),       &
1311                    salsa_gas(i)%flux_l(nzb+1:nzt,nys:nyn,0:threads_per_task-1),&
1312                    salsa_gas(i)%diss_l(nzb+1:nzt,nys:nyn,0:threads_per_task-1),&
1313                    salsa_gas(i)%init(nzb:nzt+1),                              &
1314                    salsa_gas(i)%sums_ws_l(nzb:nzt+1,0:threads_per_task-1) )
1315          salsa_gas(i)%init = nclim
1316          IF ( include_emission )  ALLOCATE( salsa_gas(i)%source(nys:nys,nxl:nxr) )
1317       ENDDO
1318!
1319!--    Surface fluxes: gtsws = gaseous tracer flux
1320!
1321!--    Horizontal surfaces: default type
1322       DO  l = 0, 2   ! upward (l=0), downward (l=1) and model top (l=2)
1323          ALLOCATE( surf_def_h(l)%gtsws( 1:surf_def_h(l)%ns, ngases_salsa ) )
1324          surf_def_h(l)%gtsws = 0.0_wp
1325       ENDDO
1326!--    Horizontal surfaces: natural type
1327       ALLOCATE( surf_lsm_h%gtsws( 1:surf_lsm_h%ns, ngases_salsa ) )
1328       surf_lsm_h%gtsws = 0.0_wp
1329!--    Horizontal surfaces: urban type
1330       ALLOCATE( surf_usm_h%gtsws( 1:surf_usm_h%ns, ngases_salsa ) )
1331       surf_usm_h%gtsws = 0.0_wp
1332!
1333!--    Vertical surfaces: northward (l=0), southward (l=1), eastward (l=2) and
1334!--    westward (l=3) facing
1335       DO  l = 0, 3
1336          ALLOCATE( surf_def_v(l)%gtsws( 1:surf_def_v(l)%ns, ngases_salsa ) )
1337          surf_def_v(l)%gtsws = 0.0_wp
1338          ALLOCATE( surf_lsm_v(l)%gtsws( 1:surf_lsm_v(l)%ns, ngases_salsa ) )
1339          surf_lsm_v(l)%gtsws = 0.0_wp
1340          ALLOCATE( surf_usm_v(l)%gtsws( 1:surf_usm_v(l)%ns, ngases_salsa ) )
1341          surf_usm_v(l)%gtsws = 0.0_wp
1342       ENDDO
1343    ENDIF
1344
1345    IF ( ws_scheme_sca )  THEN
1346
1347       IF ( salsa )  THEN
1348          ALLOCATE( sums_salsa_ws_l(nzb:nzt+1,0:threads_per_task-1) )
1349          sums_salsa_ws_l = 0.0_wp
1350       ENDIF
1351
1352    ENDIF
1353
1354 END SUBROUTINE salsa_init_arrays
1355
1356!------------------------------------------------------------------------------!
1357! Description:
1358! ------------
1359!> Initialization of SALSA. Based on salsa_initialize in UCLALES-SALSA.
1360!> Subroutines salsa_initialize, SALSAinit and DiagInitAero in UCLALES-SALSA are
1361!> also merged here.
1362!------------------------------------------------------------------------------!
1363 SUBROUTINE salsa_init
1364
1365    IMPLICIT NONE
1366
1367    INTEGER(iwp) :: i   !<
1368    INTEGER(iwp) :: ib  !< loop index for aerosol number bins
1369    INTEGER(iwp) :: ic  !< loop index for aerosol mass bins
1370    INTEGER(iwp) :: ig  !< loop index for gases
1371    INTEGER(iwp) :: ii  !< index for indexing
1372    INTEGER(iwp) :: j   !<
1373
1374    IF ( debug_output )  CALL debug_message( 'salsa_init', 'start' )
1375
1376    bin_low_limits = 0.0_wp
1377    k_topo_top     = 0
1378    nsect          = 0.0_wp
1379    massacc        = 1.0_wp
1380
1381!
1382!-- Indices for chemical components used (-1 = not used)
1383    ii = 0
1384    IF ( is_used( prtcl, 'SO4' ) )  THEN
1385       index_so4 = get_index( prtcl,'SO4' )
1386       ii = ii + 1
1387    ENDIF
1388    IF ( is_used( prtcl,'OC' ) )  THEN
1389       index_oc = get_index(prtcl, 'OC')
1390       ii = ii + 1
1391    ENDIF
1392    IF ( is_used( prtcl, 'BC' ) )  THEN
1393       index_bc = get_index( prtcl, 'BC' )
1394       ii = ii + 1
1395    ENDIF
1396    IF ( is_used( prtcl, 'DU' ) )  THEN
1397       index_du = get_index( prtcl, 'DU' )
1398       ii = ii + 1
1399    ENDIF
1400    IF ( is_used( prtcl, 'SS' ) )  THEN
1401       index_ss = get_index( prtcl, 'SS' )
1402       ii = ii + 1
1403    ENDIF
1404    IF ( is_used( prtcl, 'NO' ) )  THEN
1405       index_no = get_index( prtcl, 'NO' )
1406       ii = ii + 1
1407    ENDIF
1408    IF ( is_used( prtcl, 'NH' ) )  THEN
1409       index_nh = get_index( prtcl, 'NH' )
1410       ii = ii + 1
1411    ENDIF
1412!
1413!-- All species must be known
1414    IF ( ii /= ncc )  THEN
1415       message_string = 'Unknown aerosol species/component(s) given in the initialization'
1416       CALL message( 'salsa_mod: salsa_init', 'PA0600', 1, 2, 0, 6, 0 )
1417    ENDIF
1418!
1419!-- Partition and dissolutional growth by gaseous HNO3 and NH3
1420    IF ( index_no > 0  .AND.  index_nh > 0  .AND.  index_so4 > 0 )  lspartition = .TRUE.
1421!
1422!-- Initialise
1423!
1424!-- Aerosol size distribution (TYPE t_section)
1425    aero(:)%dwet     = 1.0E-10_wp
1426    aero(:)%veqh2o   = 1.0E-10_wp
1427    aero(:)%numc     = nclim
1428    aero(:)%core     = 1.0E-10_wp
1429    DO ic = 1, maxspec+1    ! 1:SO4, 2:OC, 3:BC, 4:DU, 5:SS, 6:NO, 7:NH, 8:H2O
1430       aero(:)%volc(ic) = 0.0_wp
1431    ENDDO
1432
1433    IF ( nldepo )  sedim_vd = 0.0_wp
1434
1435    IF ( .NOT. salsa_gases_from_chem )  THEN
1436       IF ( .NOT. read_restart_data_salsa )  THEN
1437          salsa_gas(1)%conc = h2so4_init
1438          salsa_gas(2)%conc = hno3_init
1439          salsa_gas(3)%conc = nh3_init
1440          salsa_gas(4)%conc = ocnv_init
1441          salsa_gas(5)%conc = ocsv_init
1442       ENDIF
1443       DO  ig = 1, ngases_salsa
1444          salsa_gas(ig)%conc_p    = 0.0_wp
1445          salsa_gas(ig)%tconc_m   = 0.0_wp
1446          salsa_gas(ig)%flux_s    = 0.0_wp
1447          salsa_gas(ig)%diss_s    = 0.0_wp
1448          salsa_gas(ig)%flux_l    = 0.0_wp
1449          salsa_gas(ig)%diss_l    = 0.0_wp
1450          salsa_gas(ig)%sums_ws_l = 0.0_wp
1451          salsa_gas(ig)%conc_p    = salsa_gas(ig)%conc
1452       ENDDO
1453!
1454!--    Set initial value for gas compound tracer
1455       salsa_gas(1)%init = h2so4_init
1456       salsa_gas(2)%init = hno3_init
1457       salsa_gas(3)%init = nh3_init
1458       salsa_gas(4)%init = ocnv_init
1459       salsa_gas(5)%init = ocsv_init
1460    ENDIF
1461!
1462!-- Aerosol radius in each bin: dry and wet (m)
1463    ra_dry = 1.0E-10_wp
1464!
1465!-- Initialise aerosol tracers
1466    aero(:)%vhilim   = 0.0_wp
1467    aero(:)%vlolim   = 0.0_wp
1468    aero(:)%vratiohi = 0.0_wp
1469    aero(:)%vratiolo = 0.0_wp
1470    aero(:)%dmid     = 0.0_wp
1471!
1472!-- Initialise the sectional particle size distribution
1473    CALL set_sizebins
1474!
1475!-- Initialise location-dependent aerosol size distributions and chemical compositions:
1476    CALL aerosol_init
1477
1478!-- Initalisation run of SALSA + calculate the vertical top index of the topography
1479    DO  i = nxl, nxr
1480       DO  j = nys, nyn
1481
1482          k_topo_top(j,i) = MAXLOC( MERGE( 1, 0, BTEST( wall_flags_0(:,j,i), 12 ) ), DIM = 1 ) - 1
1483
1484          CALL salsa_driver( i, j, 1 )
1485          CALL salsa_diagnostics( i, j )
1486       ENDDO
1487    ENDDO
1488
1489    DO  ib = 1, nbins_aerosol
1490       aerosol_number(ib)%conc_p    = aerosol_number(ib)%conc
1491       aerosol_number(ib)%tconc_m   = 0.0_wp
1492       aerosol_number(ib)%flux_s    = 0.0_wp
1493       aerosol_number(ib)%diss_s    = 0.0_wp
1494       aerosol_number(ib)%flux_l    = 0.0_wp
1495       aerosol_number(ib)%diss_l    = 0.0_wp
1496       aerosol_number(ib)%sums_ws_l = 0.0_wp
1497    ENDDO
1498    DO  ic = 1, ncomponents_mass*nbins_aerosol
1499       aerosol_mass(ic)%conc_p    = aerosol_mass(ic)%conc
1500       aerosol_mass(ic)%tconc_m   = 0.0_wp
1501       aerosol_mass(ic)%flux_s    = 0.0_wp
1502       aerosol_mass(ic)%diss_s    = 0.0_wp
1503       aerosol_mass(ic)%flux_l    = 0.0_wp
1504       aerosol_mass(ic)%diss_l    = 0.0_wp
1505       aerosol_mass(ic)%sums_ws_l = 0.0_wp
1506    ENDDO
1507!
1508!
1509!-- Initialise the deposition scheme and surface types
1510    IF ( nldepo )  CALL init_deposition
1511
1512    IF ( include_emission )  THEN
1513!
1514!--    Read in and initialize emissions
1515       CALL salsa_emission_setup( .TRUE. )
1516       IF ( .NOT. salsa_gases_from_chem  .AND.  salsa_emission_mode == 'read_from_file' )  THEN
1517          CALL salsa_gas_emission_setup( .TRUE. )
1518       ENDIF
1519    ENDIF
1520
1521    IF ( debug_output )  CALL debug_message( 'salsa_init', 'end' )
1522
1523 END SUBROUTINE salsa_init
1524
1525!------------------------------------------------------------------------------!
1526! Description:
1527! ------------
1528!> Initializes particle size distribution grid by calculating size bin limits
1529!> and mid-size for *dry* particles in each bin. Called from salsa_initialize
1530!> (only at the beginning of simulation).
1531!> Size distribution described using:
1532!>   1) moving center method (subranges 1 and 2)
1533!>      (Jacobson, Atmos. Env., 31, 131-144, 1997)
1534!>   2) fixed sectional method (subrange 3)
1535!> Size bins in each subrange are spaced logarithmically
1536!> based on given subrange size limits and bin number.
1537!
1538!> Mona changed 06/2017: Use geometric mean diameter to describe the mean
1539!> particle diameter in a size bin, not the arithmeric mean which clearly
1540!> overestimates the total particle volume concentration.
1541!
1542!> Coded by:
1543!> Hannele Korhonen (FMI) 2005
1544!> Harri Kokkola (FMI) 2006
1545!
1546!> Bug fixes for box model + updated for the new aerosol datatype:
1547!> Juha Tonttila (FMI) 2014
1548!------------------------------------------------------------------------------!
1549 SUBROUTINE set_sizebins
1550
1551    IMPLICIT NONE
1552
1553    INTEGER(iwp) ::  cc  !< running index
1554    INTEGER(iwp) ::  dd  !< running index
1555
1556    REAL(wp) ::  ratio_d  !< ratio of the upper and lower diameter of subranges
1557!
1558!-- vlolim&vhilim: min & max *dry* volumes [fxm]
1559!-- dmid: bin mid *dry* diameter (m)
1560!-- vratiolo&vratiohi: volume ratio between the center and low/high limit
1561!
1562!-- 1) Size subrange 1:
1563    ratio_d = reglim(2) / reglim(1)   ! section spacing (m)
1564    DO  cc = start_subrange_1a, end_subrange_1a
1565       aero(cc)%vlolim = api6 * ( reglim(1) * ratio_d**( REAL( cc-1 ) / nbin(1) ) )**3
1566       aero(cc)%vhilim = api6 * ( reglim(1) * ratio_d**( REAL( cc ) / nbin(1) ) )**3
1567       aero(cc)%dmid = SQRT( ( aero(cc)%vhilim / api6 )**0.33333333_wp *                           &
1568                             ( aero(cc)%vlolim / api6 )**0.33333333_wp )
1569       aero(cc)%vratiohi = aero(cc)%vhilim / ( api6 * aero(cc)%dmid**3 )
1570       aero(cc)%vratiolo = aero(cc)%vlolim / ( api6 * aero(cc)%dmid**3 )
1571    ENDDO
1572!
1573!-- 2) Size subrange 2:
1574!-- 2.1) Sub-subrange 2a: high hygroscopicity
1575    ratio_d = reglim(3) / reglim(2)   ! section spacing
1576    DO  dd = start_subrange_2a, end_subrange_2a
1577       cc = dd - start_subrange_2a
1578       aero(dd)%vlolim = api6 * ( reglim(2) * ratio_d**( REAL( cc ) / nbin(2) ) )**3
1579       aero(dd)%vhilim = api6 * ( reglim(2) * ratio_d**( REAL( cc+1 ) / nbin(2) ) )**3
1580       aero(dd)%dmid = SQRT( ( aero(dd)%vhilim / api6 )**0.33333333_wp *                           &
1581                             ( aero(dd)%vlolim / api6 )**0.33333333_wp )
1582       aero(dd)%vratiohi = aero(dd)%vhilim / ( api6 * aero(dd)%dmid**3 )
1583       aero(dd)%vratiolo = aero(dd)%vlolim / ( api6 * aero(dd)%dmid**3 )
1584    ENDDO
1585!
1586!-- 2.2) Sub-subrange 2b: low hygroscopicity
1587    IF ( .NOT. no_insoluble )  THEN
1588       aero(start_subrange_2b:end_subrange_2b)%vlolim   = aero(start_subrange_2a:end_subrange_2a)%vlolim
1589       aero(start_subrange_2b:end_subrange_2b)%vhilim   = aero(start_subrange_2a:end_subrange_2a)%vhilim
1590       aero(start_subrange_2b:end_subrange_2b)%dmid     = aero(start_subrange_2a:end_subrange_2a)%dmid
1591       aero(start_subrange_2b:end_subrange_2b)%vratiohi = aero(start_subrange_2a:end_subrange_2a)%vratiohi
1592       aero(start_subrange_2b:end_subrange_2b)%vratiolo = aero(start_subrange_2a:end_subrange_2a)%vratiolo
1593    ENDIF
1594!
1595!-- Initialize the wet diameter with the bin dry diameter to avoid numerical problems later
1596    aero(:)%dwet = aero(:)%dmid
1597!
1598!-- Save bin limits (lower diameter) to be delivered to PALM if needed
1599    DO cc = 1, nbins_aerosol
1600       bin_low_limits(cc) = ( aero(cc)%vlolim / api6 )**0.33333333_wp
1601    ENDDO
1602
1603 END SUBROUTINE set_sizebins
1604
1605!------------------------------------------------------------------------------!
1606! Description:
1607! ------------
1608!> Initilize altitude-dependent aerosol size distributions and compositions.
1609!>
1610!> Mona added 06/2017: Correct the number and mass concentrations by normalizing
1611!< by the given total number and mass concentration.
1612!>
1613!> Tomi Raatikainen, FMI, 29.2.2016
1614!------------------------------------------------------------------------------!
1615 SUBROUTINE aerosol_init
1616
1617    USE netcdf_data_input_mod,                                                                     &
1618        ONLY:  close_input_file, get_attribute, get_variable,                                      &
1619               netcdf_data_input_get_dimension_length, open_read_file
1620
1621    IMPLICIT NONE
1622
1623    CHARACTER(LEN=25), DIMENSION(:), ALLOCATABLE :: cc_name  !< chemical component name
1624
1625    INTEGER(iwp) ::  ee        !< index: end
1626    INTEGER(iwp) ::  i         !< loop index: x-direction
1627    INTEGER(iwp) ::  ib        !< loop index: size bins
1628    INTEGER(iwp) ::  ic        !< loop index: chemical components
1629    INTEGER(iwp) ::  id_dyn    !< NetCDF id of PIDS_DYNAMIC_SALSA
1630    INTEGER(iwp) ::  ig        !< loop index: gases
1631    INTEGER(iwp) ::  j         !< loop index: y-direction
1632    INTEGER(iwp) ::  k         !< loop index: z-direction
1633    INTEGER(iwp) ::  lod_aero  !< level of detail of inital aerosol concentrations
1634    INTEGER(iwp) ::  pr_nbins  !< Number of aerosol size bins in file
1635    INTEGER(iwp) ::  pr_ncc    !< Number of aerosol chemical components in file
1636    INTEGER(iwp) ::  pr_nz     !< Number of vertical grid-points in file
1637    INTEGER(iwp) ::  prunmode  !< running mode of SALSA
1638    INTEGER(iwp) ::  ss        !< index: start
1639
1640    INTEGER(iwp), DIMENSION(maxspec) ::  cc_input_to_model
1641
1642    LOGICAL  ::  netcdf_extend = .FALSE. !< Flag: netcdf file exists
1643
1644    REAL(wp) ::  flag  !< flag to mask topography grid points
1645
1646    REAL(wp), DIMENSION(nbins_aerosol) ::  core   !< size of the bin mid aerosol particle
1647
1648    REAL(wp), DIMENSION(0:nz+1) ::  pnf2a   !< number fraction in 2a
1649    REAL(wp), DIMENSION(0:nz+1) ::  pmfoc1a !< mass fraction of OC in 1a
1650
1651    REAL(wp), DIMENSION(0:nz+1,nbins_aerosol)   ::  pndist  !< size dist as a function of height (#/m3)
1652    REAL(wp), DIMENSION(0:nz+1,maxspec)         ::  pmf2a   !< mass distributions in subrange 2a
1653    REAL(wp), DIMENSION(0:nz+1,maxspec)         ::  pmf2b   !< mass distributions in subrange 2b
1654
1655    REAL(wp), DIMENSION(:), ALLOCATABLE ::  pr_dmid  !< vertical profile of aerosol bin diameters
1656    REAL(wp), DIMENSION(:), ALLOCATABLE ::  pr_z     !< z levels of profiles
1657
1658    REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  pr_mass_fracs_a  !< mass fraction: a
1659    REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  pr_mass_fracs_b  !< and b
1660
1661    cc_input_to_model = 0
1662    prunmode = 1
1663!
1664!-- Bin mean aerosol particle volume (m3)
1665    core(:) = 0.0_wp
1666    core(1:nbins_aerosol) = api6 * aero(1:nbins_aerosol)%dmid**3
1667!
1668!-- Set concentrations to zero
1669    pndist(:,:)  = 0.0_wp
1670    pnf2a(:)     = nf2a
1671    pmf2a(:,:)   = 0.0_wp
1672    pmf2b(:,:)   = 0.0_wp
1673    pmfoc1a(:)   = 0.0_wp
1674
1675    IF ( init_aerosol_type == 1 )  THEN
1676!
1677!--    Read input profiles from PIDS_DYNAMIC_SALSA
1678#if defined( __netcdf )
1679!
1680!--    Location-dependent size distributions and compositions.
1681       INQUIRE( FILE = TRIM( input_file_dynamic ) //  TRIM( coupling_char ), EXIST = netcdf_extend )
1682       IF ( netcdf_extend )  THEN
1683!
1684!--       Open file in read-only mode
1685          CALL open_read_file( TRIM( input_file_dynamic ) // TRIM( coupling_char ), id_dyn )
1686!
1687!--       Inquire dimensions:
1688          CALL netcdf_data_input_get_dimension_length( id_dyn, pr_nz, 'z' )
1689          IF ( pr_nz /= nz )  THEN
1690             WRITE( message_string, * ) 'Number of inifor horizontal grid points does not match '//&
1691                                        'the number of numeric grid points.'
1692             CALL message( 'aerosol_init', 'PA0601', 1, 2, 0, 6, 0 )
1693          ENDIF
1694          CALL netcdf_data_input_get_dimension_length( id_dyn, pr_ncc, 'composition_index' )
1695!
1696!--       Allocate memory
1697          ALLOCATE( pr_z(1:pr_nz), pr_mass_fracs_a(nzb:nzt+1,pr_ncc),                              &
1698                    pr_mass_fracs_b(nzb:nzt+1,pr_ncc) )
1699          pr_mass_fracs_a = 0.0_wp
1700          pr_mass_fracs_b = 0.0_wp
1701!
1702!--       Read vertical levels
1703          CALL get_variable( id_dyn, 'z', pr_z )
1704!
1705!--       Read name and index of chemical components
1706          CALL get_variable( id_dyn, 'composition_name', cc_name, pr_ncc )
1707          DO  ic = 1, pr_ncc
1708             SELECT CASE ( TRIM( cc_name(ic) ) )
1709                CASE ( 'H2SO4', 'SO4', 'h2so4', 'so4' )
1710                   cc_input_to_model(1) = ic
1711                CASE ( 'OC', 'oc' )
1712                   cc_input_to_model(2) = ic
1713                CASE ( 'BC', 'bc' )
1714                   cc_input_to_model(3) = ic
1715                CASE ( 'DU', 'du' )
1716                   cc_input_to_model(4) = ic
1717                CASE ( 'SS', 'ss' )
1718                   cc_input_to_model(5) = ic
1719                CASE ( 'HNO3', 'hno3', 'NO', 'no' )
1720                   cc_input_to_model(6) = ic
1721                CASE ( 'NH3', 'nh3', 'NH', 'nh' )
1722                   cc_input_to_model(7) = ic
1723             END SELECT
1724          ENDDO
1725
1726          IF ( SUM( cc_input_to_model ) == 0 )  THEN
1727             message_string = 'None of the aerosol chemical components in ' // TRIM(               &
1728                              input_file_dynamic ) // ' correspond to ones applied in SALSA.'
1729             CALL message( 'salsa_mod: aerosol_init', 'PA0602', 2, 2, 0, 6, 0 )
1730          ENDIF
1731!
1732!--       Vertical profiles of mass fractions of different chemical components:
1733          CALL get_variable( id_dyn, 'init_atmosphere_mass_fracs_a', pr_mass_fracs_a,              &
1734                             0, pr_ncc-1, 0, pr_nz-1 )
1735          CALL get_variable( id_dyn, 'init_atmosphere_mass_fracs_b', pr_mass_fracs_b,              &
1736                             0, pr_ncc-1, 0, pr_nz-1  )
1737!
1738!--       Match the input data with the chemical composition applied in the model
1739          DO  ic = 1, maxspec
1740             ss = cc_input_to_model(ic)
1741             IF ( ss == 0 )  CYCLE
1742             pmf2a(nzb+1:nzt+1,ic) = pr_mass_fracs_a(nzb:nzt,ss)
1743             pmf2b(nzb+1:nzt+1,ic) = pr_mass_fracs_b(nzb:nzt,ss)
1744          ENDDO
1745!
1746!--       Aerosol concentrations: lod=1 (total PM) or lod=2 (sectional number size distribution)
1747          CALL get_attribute( id_dyn, 'lod', lod_aero, .FALSE., 'init_atmosphere_aerosol' )
1748          IF ( lod_aero /= 1 )  THEN
1749             message_string = 'Currently only lod=1 accepted for init_atmosphere_aerosol'
1750             CALL message( 'salsa_mod: aerosol_init', 'PA0603', 2, 2, 0, 6, 0 )
1751          ELSE
1752!
1753!--          Bin mean diameters in the input file
1754             CALL netcdf_data_input_get_dimension_length( id_dyn, pr_nbins, 'Dmid')
1755             IF ( pr_nbins /= nbins_aerosol )  THEN
1756                message_string = 'Number of size bins in init_atmosphere_aerosol does not match '  &
1757                                 // 'with that applied in the model'
1758                CALL message( 'salsa_mod: aerosol_init', 'PA0604', 2, 2, 0, 6, 0 )
1759             ENDIF
1760
1761             ALLOCATE( pr_dmid(pr_nbins) )
1762             pr_dmid    = 0.0_wp
1763
1764             CALL get_variable( id_dyn, 'Dmid', pr_dmid )
1765!
1766!--          Check whether the sectional representation conform to the one
1767!--          applied in the model
1768             IF ( ANY( ABS( ( aero(1:nbins_aerosol)%dmid - pr_dmid ) /                             &
1769                              aero(1:nbins_aerosol)%dmid )  > 0.1_wp )  ) THEN
1770                message_string = 'Mean diameters of the aerosol size bins in ' // TRIM(            &
1771                                 input_file_dynamic ) // ' do not match with the sectional '//     &
1772                                 'representation of the model.'
1773                CALL message( 'salsa_mod: aerosol_init', 'PA0605', 2, 2, 0, 6, 0 )
1774             ENDIF
1775!
1776!--          Inital aerosol concentrations
1777             CALL get_variable( id_dyn, 'init_atmosphere_aerosol', pndist(nzb+1:nzt,:),            &
1778                                0, pr_nbins-1, 0, pr_nz-1 )
1779          ENDIF
1780!
1781!--       Set bottom and top boundary condition (Neumann)
1782          pmf2a(nzb,:)    = pmf2a(nzb+1,:)
1783          pmf2a(nzt+1,:)  = pmf2a(nzt,:)
1784          pmf2b(nzb,:)    = pmf2b(nzb+1,:)
1785          pmf2b(nzt+1,:)  = pmf2b(nzt,:)
1786          pndist(nzb,:)   = pndist(nzb+1,:)
1787          pndist(nzt+1,:) = pndist(nzt,:)
1788
1789          IF ( index_so4 < 0 )  THEN
1790             pmf2a(:,1) = 0.0_wp
1791             pmf2b(:,1) = 0.0_wp
1792          ENDIF
1793          IF ( index_oc < 0 )  THEN
1794             pmf2a(:,2) = 0.0_wp
1795             pmf2b(:,2) = 0.0_wp
1796          ENDIF
1797          IF ( index_bc < 0 )  THEN
1798             pmf2a(:,3) = 0.0_wp
1799             pmf2b(:,3) = 0.0_wp
1800          ENDIF
1801          IF ( index_du < 0 )  THEN
1802             pmf2a(:,4) = 0.0_wp
1803             pmf2b(:,4) = 0.0_wp
1804          ENDIF
1805          IF ( index_ss < 0 )  THEN
1806             pmf2a(:,5) = 0.0_wp
1807             pmf2b(:,5) = 0.0_wp
1808          ENDIF
1809          IF ( index_no < 0 )  THEN
1810             pmf2a(:,6) = 0.0_wp
1811             pmf2b(:,6) = 0.0_wp
1812          ENDIF
1813          IF ( index_nh < 0 )  THEN
1814             pmf2a(:,7) = 0.0_wp
1815             pmf2b(:,7) = 0.0_wp
1816          ENDIF
1817
1818          IF ( SUM( pmf2a ) < 0.00001_wp  .AND.  SUM( pmf2b ) < 0.00001_wp )  THEN
1819             message_string = 'Error in initialising mass fractions of chemical components. ' //   &
1820                              'Check that all chemical components are included in parameter file!'
1821             CALL message( 'salsa_mod: aerosol_init', 'PA0606', 2, 2, 0, 6, 0 ) 
1822          ENDIF
1823!
1824!--       Then normalise the mass fraction so that SUM = 1
1825          DO  k = nzb, nzt+1
1826             pmf2a(k,:) = pmf2a(k,:) / SUM( pmf2a(k,:) )
1827             IF ( SUM( pmf2b(k,:) ) > 0.0_wp )  pmf2b(k,:) = pmf2b(k,:) / SUM( pmf2b(k,:) )
1828          ENDDO
1829
1830          DEALLOCATE( pr_z, pr_mass_fracs_a, pr_mass_fracs_b )
1831
1832       ELSE
1833          message_string = 'Input file '// TRIM( input_file_dynamic ) // TRIM( coupling_char ) //  &
1834                           ' for SALSA missing!'
1835          CALL message( 'salsa_mod: aerosol_init', 'PA0607', 1, 2, 0, 6, 0 )
1836!
1837!--       Close input file
1838          CALL close_input_file( id_dyn )
1839       ENDIF   ! netcdf_extend
1840
1841#else
1842       message_string = 'init_aerosol_type = 1 but preprocessor directive __netcdf is not used '// &
1843                        'in compiling!'
1844       CALL message( 'salsa_mod: aerosol_init', 'PA0608', 1, 2, 0, 6, 0 )
1845
1846#endif
1847
1848    ELSEIF ( init_aerosol_type == 0 )  THEN
1849!
1850!--    Mass fractions for species in a and b-bins
1851       IF ( index_so4 > 0 )  THEN
1852          pmf2a(:,1) = mass_fracs_a(index_so4)
1853          pmf2b(:,1) = mass_fracs_b(index_so4)
1854       ENDIF
1855       IF ( index_oc > 0 )  THEN
1856          pmf2a(:,2) = mass_fracs_a(index_oc)
1857          pmf2b(:,2) = mass_fracs_b(index_oc)
1858       ENDIF
1859       IF ( index_bc > 0 )  THEN
1860          pmf2a(:,3) = mass_fracs_a(index_bc)
1861          pmf2b(:,3) = mass_fracs_b(index_bc)
1862       ENDIF
1863       IF ( index_du > 0 )  THEN
1864          pmf2a(:,4) = mass_fracs_a(index_du)
1865          pmf2b(:,4) = mass_fracs_b(index_du)
1866       ENDIF
1867       IF ( index_ss > 0 )  THEN
1868          pmf2a(:,5) = mass_fracs_a(index_ss)
1869          pmf2b(:,5) = mass_fracs_b(index_ss)
1870       ENDIF
1871       IF ( index_no > 0 )  THEN
1872          pmf2a(:,6) = mass_fracs_a(index_no)
1873          pmf2b(:,6) = mass_fracs_b(index_no)
1874       ENDIF
1875       IF ( index_nh > 0 )  THEN
1876          pmf2a(:,7) = mass_fracs_a(index_nh)
1877          pmf2b(:,7) = mass_fracs_b(index_nh)
1878       ENDIF
1879       DO  k = nzb, nzt+1
1880          pmf2a(k,:) = pmf2a(k,:) / SUM( pmf2a(k,:) )
1881          IF ( SUM( pmf2b(k,:) ) > 0.0_wp ) pmf2b(k,:) = pmf2b(k,:) / SUM( pmf2b(k,:) )
1882       ENDDO
1883
1884       CALL size_distribution( n_lognorm, dpg, sigmag, nsect )
1885!
1886!--    Normalize by the given total number concentration
1887       nsect = nsect * SUM( n_lognorm ) / SUM( nsect )
1888       DO  ib = start_subrange_1a, end_subrange_2b
1889          pndist(:,ib) = nsect(ib)
1890       ENDDO
1891    ENDIF
1892
1893    IF ( init_gases_type == 1 )  THEN
1894!
1895!--    Read input profiles from PIDS_CHEM
1896#if defined( __netcdf )
1897!
1898!--    Location-dependent size distributions and compositions.
1899       INQUIRE( FILE = TRIM( input_file_dynamic ) //  TRIM( coupling_char ), EXIST = netcdf_extend )
1900       IF ( netcdf_extend  .AND.  .NOT. salsa_gases_from_chem )  THEN
1901!
1902!--       Open file in read-only mode
1903          CALL open_read_file( TRIM( input_file_dynamic ) // TRIM( coupling_char ), id_dyn )
1904!
1905!--       Inquire dimensions:
1906          CALL netcdf_data_input_get_dimension_length( id_dyn, pr_nz, 'z' )
1907          IF ( pr_nz /= nz )  THEN
1908             WRITE( message_string, * ) 'Number of inifor horizontal grid points does not match '//&
1909                                        'the number of numeric grid points.'
1910             CALL message( 'aerosol_init', 'PA0609', 1, 2, 0, 6, 0 )
1911          ENDIF
1912!
1913!--       Read vertical profiles of gases:
1914          CALL get_variable( id_dyn, 'init_atmosphere_h2so4', salsa_gas(1)%init(nzb+1:nzt) )
1915          CALL get_variable( id_dyn, 'init_atmosphere_hno3',  salsa_gas(2)%init(nzb+1:nzt) )
1916          CALL get_variable( id_dyn, 'init_atmosphere_nh3',   salsa_gas(3)%init(nzb+1:nzt) )
1917          CALL get_variable( id_dyn, 'init_atmosphere_ocnv',  salsa_gas(4)%init(nzb+1:nzt) )
1918          CALL get_variable( id_dyn, 'init_atmosphere_ocsv',  salsa_gas(5)%init(nzb+1:nzt) )
1919!
1920!--       Set Neumann top and surface boundary condition for initial + initialise concentrations
1921          DO  ig = 1, ngases_salsa
1922             salsa_gas(ig)%init(nzb)   =  salsa_gas(ig)%init(nzb+1)
1923             salsa_gas(ig)%init(nzt+1) =  salsa_gas(ig)%init(nzt)
1924             IF ( .NOT. read_restart_data_salsa )  THEN
1925                DO  k = nzb, nzt+1
1926                   salsa_gas(ig)%conc(k,:,:) = salsa_gas(ig)%init(k)
1927                ENDDO
1928             ENDIF
1929          ENDDO
1930
1931       ELSEIF ( .NOT. netcdf_extend  .AND.  .NOT.  salsa_gases_from_chem )  THEN
1932          message_string = 'Input file '// TRIM( input_file_dynamic ) // TRIM( coupling_char ) //  &
1933                           ' for SALSA missing!'
1934          CALL message( 'salsa_mod: aerosol_init', 'PA0610', 1, 2, 0, 6, 0 )
1935!
1936!--       Close input file
1937          CALL close_input_file( id_dyn )
1938       ENDIF   ! netcdf_extend
1939#else
1940       message_string = 'init_gases_type = 1 but preprocessor directive __netcdf is not used in '//&
1941                        'compiling!'
1942       CALL message( 'salsa_mod: aerosol_init', 'PA0611', 1, 2, 0, 6, 0 )
1943
1944#endif
1945
1946    ENDIF
1947!
1948!-- Both SO4 and OC are included, so use the given mass fractions
1949    IF ( index_oc > 0  .AND.  index_so4 > 0 )  THEN
1950       pmfoc1a(:) = pmf2a(:,2) / ( pmf2a(:,2) + pmf2a(:,1) )  ! Normalize
1951!
1952!-- Pure organic carbon
1953    ELSEIF ( index_oc > 0 )  THEN
1954       pmfoc1a(:) = 1.0_wp
1955!
1956!-- Pure SO4
1957    ELSEIF ( index_so4 > 0 )  THEN
1958       pmfoc1a(:) = 0.0_wp
1959
1960    ELSE
1961       message_string = 'Either OC or SO4 must be active for aerosol region 1a!'
1962       CALL message( 'salsa_mod: aerosol_init', 'PA0612', 1, 2, 0, 6, 0 )
1963    ENDIF
1964
1965!
1966!-- Initialize concentrations
1967    DO  i = nxlg, nxrg
1968       DO  j = nysg, nyng
1969          DO  k = nzb, nzt+1
1970!
1971!--          Predetermine flag to mask topography
1972             flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
1973!
1974!--          a) Number concentrations
1975!--          Region 1:
1976             DO  ib = start_subrange_1a, end_subrange_1a
1977                IF ( .NOT. read_restart_data_salsa )  THEN
1978                   aerosol_number(ib)%conc(k,j,i) = pndist(k,ib) * flag
1979                ENDIF
1980                IF ( prunmode == 1 )  THEN
1981                   aerosol_number(ib)%init = pndist(:,ib)
1982                ENDIF
1983             ENDDO
1984!
1985!--          Region 2:
1986             IF ( nreg > 1 )  THEN
1987                DO  ib = start_subrange_2a, end_subrange_2a
1988                   IF ( .NOT. read_restart_data_salsa )  THEN
1989                      aerosol_number(ib)%conc(k,j,i) = MAX( 0.0_wp, pnf2a(k) ) * pndist(k,ib) * flag
1990                   ENDIF
1991                   IF ( prunmode == 1 )  THEN
1992                      aerosol_number(ib)%init = MAX( 0.0_wp, nf2a ) * pndist(:,ib)
1993                   ENDIF
1994                ENDDO
1995                IF ( .NOT. no_insoluble )  THEN
1996                   DO  ib = start_subrange_2b, end_subrange_2b
1997                      IF ( pnf2a(k) < 1.0_wp )  THEN
1998                         IF ( .NOT. read_restart_data_salsa )  THEN
1999                            aerosol_number(ib)%conc(k,j,i) = MAX( 0.0_wp, 1.0_wp - pnf2a(k) ) *    &
2000                                                             pndist(k,ib) * flag
2001                         ENDIF
2002                         IF ( prunmode == 1 )  THEN
2003                            aerosol_number(ib)%init = MAX( 0.0_wp, 1.0_wp - nf2a ) * pndist(:,ib)
2004                         ENDIF
2005                      ENDIF
2006                   ENDDO
2007                ENDIF
2008             ENDIF
2009!
2010!--          b) Aerosol mass concentrations
2011!--             bin subrange 1: done here separately due to the SO4/OC convention
2012!
2013!--          SO4:
2014             IF ( index_so4 > 0 )  THEN
2015                ss = ( index_so4 - 1 ) * nbins_aerosol + start_subrange_1a !< start
2016                ee = ( index_so4 - 1 ) * nbins_aerosol + end_subrange_1a !< end
2017                ib = start_subrange_1a
2018                DO  ic = ss, ee
2019                   IF ( .NOT. read_restart_data_salsa )  THEN
2020                      aerosol_mass(ic)%conc(k,j,i) = MAX( 0.0_wp, 1.0_wp - pmfoc1a(k) ) *          &
2021                                                     pndist(k,ib) * core(ib) * arhoh2so4 * flag
2022                   ENDIF
2023                   IF ( prunmode == 1 )  THEN
2024                      aerosol_mass(ic)%init(k) = MAX( 0.0_wp, 1.0_wp - pmfoc1a(k) ) * pndist(k,ib) &
2025                                                 * core(ib) * arhoh2so4
2026                   ENDIF
2027                   ib = ib+1
2028                ENDDO
2029             ENDIF
2030!
2031!--          OC:
2032             IF ( index_oc > 0 ) THEN
2033                ss = ( index_oc - 1 ) * nbins_aerosol + start_subrange_1a !< start
2034                ee = ( index_oc - 1 ) * nbins_aerosol + end_subrange_1a !< end
2035                ib = start_subrange_1a
2036                DO  ic = ss, ee
2037                   IF ( .NOT. read_restart_data_salsa )  THEN
2038                      aerosol_mass(ic)%conc(k,j,i) = MAX( 0.0_wp, pmfoc1a(k) ) * pndist(k,ib) *    &
2039                                                     core(ib) * arhooc * flag
2040                   ENDIF
2041                   IF ( prunmode == 1 )  THEN
2042                      aerosol_mass(ic)%init(k) = MAX( 0.0_wp, pmfoc1a(k) ) * pndist(k,ib) *        &
2043                                                 core(ib) * arhooc
2044                   ENDIF
2045                   ib = ib+1
2046                ENDDO
2047             ENDIF
2048          ENDDO !< k
2049
2050          prunmode = 3  ! Init only once
2051
2052       ENDDO !< j
2053    ENDDO !< i
2054
2055!
2056!-- c) Aerosol mass concentrations
2057!--    bin subrange 2:
2058    IF ( nreg > 1 ) THEN
2059
2060       IF ( index_so4 > 0 ) THEN
2061          CALL set_aero_mass( index_so4, pmf2a(:,1), pmf2b(:,1), pnf2a, pndist, core, arhoh2so4 )
2062       ENDIF
2063       IF ( index_oc > 0 ) THEN
2064          CALL set_aero_mass( index_oc, pmf2a(:,2), pmf2b(:,2), pnf2a, pndist, core, arhooc )
2065       ENDIF
2066       IF ( index_bc > 0 ) THEN
2067          CALL set_aero_mass( index_bc, pmf2a(:,3), pmf2b(:,3), pnf2a, pndist, core, arhobc )
2068       ENDIF
2069       IF ( index_du > 0 ) THEN
2070          CALL set_aero_mass( index_du, pmf2a(:,4), pmf2b(:,4), pnf2a, pndist, core, arhodu )
2071       ENDIF
2072       IF ( index_ss > 0 ) THEN
2073          CALL set_aero_mass( index_ss, pmf2a(:,5), pmf2b(:,5), pnf2a, pndist, core, arhoss )
2074       ENDIF
2075       IF ( index_no > 0 ) THEN
2076          CALL set_aero_mass( index_no, pmf2a(:,6), pmf2b(:,6), pnf2a, pndist, core, arhohno3 )
2077       ENDIF
2078       IF ( index_nh > 0 ) THEN
2079          CALL set_aero_mass( index_nh, pmf2a(:,7), pmf2b(:,7), pnf2a, pndist, core, arhonh3 )
2080       ENDIF
2081
2082    ENDIF
2083
2084 END SUBROUTINE aerosol_init
2085
2086!------------------------------------------------------------------------------!
2087! Description:
2088! ------------
2089!> Create a lognormal size distribution and discretise to a sectional
2090!> representation.
2091!------------------------------------------------------------------------------!
2092 SUBROUTINE size_distribution( in_ntot, in_dpg, in_sigma, psd_sect )
2093
2094    IMPLICIT NONE
2095
2096    INTEGER(iwp) ::  ib         !< running index: bin
2097    INTEGER(iwp) ::  iteration  !< running index: iteration
2098
2099    REAL(wp) ::  d1         !< particle diameter (m, dummy)
2100    REAL(wp) ::  d2         !< particle diameter (m, dummy)
2101    REAL(wp) ::  delta_d    !< (d2-d1)/10
2102    REAL(wp) ::  deltadp    !< bin width
2103    REAL(wp) ::  dmidi      !< ( d1 + d2 ) / 2
2104
2105    REAL(wp), DIMENSION(:), INTENT(in) ::  in_dpg    !< geometric mean diameter (m)
2106    REAL(wp), DIMENSION(:), INTENT(in) ::  in_ntot   !< number conc. (#/m3)
2107    REAL(wp), DIMENSION(:), INTENT(in) ::  in_sigma  !< standard deviation
2108
2109    REAL(wp), DIMENSION(:), INTENT(inout) ::  psd_sect  !< sectional size distribution
2110
2111    DO  ib = start_subrange_1a, end_subrange_2b
2112       psd_sect(ib) = 0.0_wp
2113!
2114!--    Particle diameter at the low limit (largest in the bin) (m)
2115       d1 = ( aero(ib)%vlolim / api6 )**0.33333333_wp
2116!
2117!--    Particle diameter at the high limit (smallest in the bin) (m)
2118       d2 = ( aero(ib)%vhilim / api6 )**0.33333333_wp
2119!
2120!--    Span of particle diameter in a bin (m)
2121       delta_d = 0.1_wp * ( d2 - d1 )
2122!
2123!--    Iterate:
2124       DO  iteration = 1, 10
2125          d1 = ( aero(ib)%vlolim / api6 )**0.33333333_wp + ( ib - 1) * delta_d
2126          d2 = d1 + delta_d
2127          dmidi = 0.5_wp * ( d1 + d2 )
2128          deltadp = LOG10( d2 / d1 )
2129!
2130!--       Size distribution
2131!--       in_ntot = total number, total area, or total volume concentration
2132!--       in_dpg = geometric-mean number, area, or volume diameter
2133!--       n(k) = number, area, or volume concentration in a bin
2134          psd_sect(ib) = psd_sect(ib) + SUM( in_ntot * deltadp / ( SQRT( 2.0_wp * pi ) *           &
2135                        LOG10( in_sigma ) ) * EXP( -LOG10( dmidi / in_dpg )**2.0_wp /              &
2136                        ( 2.0_wp * LOG10( in_sigma ) ** 2.0_wp ) ) )
2137
2138       ENDDO
2139    ENDDO
2140
2141 END SUBROUTINE size_distribution
2142
2143!------------------------------------------------------------------------------!
2144! Description:
2145! ------------
2146!> Sets the mass concentrations to aerosol arrays in 2a and 2b.
2147!>
2148!> Tomi Raatikainen, FMI, 29.2.2016
2149!------------------------------------------------------------------------------!
2150 SUBROUTINE set_aero_mass( ispec, pmf2a, pmf2b, pnf2a, pndist, pcore, prho )
2151
2152    IMPLICIT NONE
2153
2154    INTEGER(iwp) ::  ee        !< index: end
2155    INTEGER(iwp) ::  i         !< loop index
2156    INTEGER(iwp) ::  ib        !< loop index
2157    INTEGER(iwp) ::  ic        !< loop index
2158    INTEGER(iwp) ::  j         !< loop index
2159    INTEGER(iwp) ::  k         !< loop index
2160    INTEGER(iwp) ::  prunmode  !< 1 = initialise
2161    INTEGER(iwp) ::  ss        !< index: start
2162
2163    INTEGER(iwp), INTENT(in) :: ispec  !< Aerosol species index
2164
2165    REAL(wp) ::  flag   !< flag to mask topography grid points
2166
2167    REAL(wp), INTENT(in) ::  prho !< Aerosol density
2168
2169    REAL(wp), DIMENSION(nbins_aerosol), INTENT(in) ::  pcore !< Aerosol bin mid core volume
2170    REAL(wp), DIMENSION(0:nz+1), INTENT(in)        ::  pnf2a !< Number fraction for 2a
2171    REAL(wp), DIMENSION(0:nz+1), INTENT(in)        ::  pmf2a !< Mass distributions for a
2172    REAL(wp), DIMENSION(0:nz+1), INTENT(in)        ::  pmf2b !< and b bins
2173
2174    REAL(wp), DIMENSION(0:nz+1,nbins_aerosol), INTENT(in) ::  pndist !< Aerosol size distribution
2175
2176    prunmode = 1
2177
2178    DO i = nxlg, nxrg
2179       DO j = nysg, nyng
2180          DO k = nzb, nzt+1
2181!
2182!--          Predetermine flag to mask topography
2183             flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) ) 
2184!
2185!--          Regime 2a:
2186             ss = ( ispec - 1 ) * nbins_aerosol + start_subrange_2a
2187             ee = ( ispec - 1 ) * nbins_aerosol + end_subrange_2a
2188             ib = start_subrange_2a
2189             DO ic = ss, ee
2190                IF ( .NOT. read_restart_data_salsa )  THEN
2191                   aerosol_mass(ic)%conc(k,j,i) = MAX( 0.0_wp, pmf2a(k) ) * pnf2a(k) * pndist(k,ib)&
2192                                                  * pcore(ib) * prho * flag
2193                ENDIF
2194                IF ( prunmode == 1 )  THEN
2195                   aerosol_mass(ic)%init(k) = MAX( 0.0_wp, pmf2a(k) ) * pnf2a(k) * pndist(k,ib) *  &
2196                                              pcore(ib) * prho
2197                ENDIF
2198                ib = ib + 1
2199             ENDDO
2200!
2201!--          Regime 2b:
2202             IF ( .NOT. no_insoluble )  THEN
2203                ss = ( ispec - 1 ) * nbins_aerosol + start_subrange_2b
2204                ee = ( ispec - 1 ) * nbins_aerosol + end_subrange_2b
2205                ib = start_subrange_2a
2206                DO ic = ss, ee
2207                   IF ( .NOT. read_restart_data_salsa )  THEN
2208                      aerosol_mass(ic)%conc(k,j,i) = MAX( 0.0_wp, pmf2b(k) ) * ( 1.0_wp - pnf2a(k))&
2209                                                     * pndist(k,ib) * pcore(ib) * prho * flag
2210                   ENDIF
2211                   IF ( prunmode == 1 )  THEN
2212                      aerosol_mass(ic)%init(k) = MAX( 0.0_wp, pmf2b(k) ) * ( 1.0_wp - pnf2a(k) ) * &
2213                                                 pndist(k,ib) * pcore(ib) * prho
2214                   ENDIF
2215                   ib = ib + 1
2216                ENDDO  ! c
2217
2218             ENDIF
2219          ENDDO   ! k
2220
2221          prunmode = 3  ! Init only once
2222
2223       ENDDO   ! j
2224    ENDDO   ! i
2225
2226 END SUBROUTINE set_aero_mass
2227
2228!------------------------------------------------------------------------------!
2229! Description:
2230! ------------
2231!> Initialise the matching between surface types in LSM and deposition models.
2232!> Do the matching based on Zhang et al. (2001). Atmos. Environ. 35, 549-560
2233!> (here referred as Z01).
2234!------------------------------------------------------------------------------!
2235 SUBROUTINE init_deposition
2236
2237    USE surface_mod,                                                                               &
2238        ONLY:  surf_lsm_h, surf_lsm_v, surf_usm_h, surf_usm_v
2239
2240    IMPLICIT NONE
2241
2242    INTEGER(iwp) ::  l  !< loop index for vertical surfaces
2243
2244    LOGICAL :: match_lsm  !< flag to initilise LSM surfaces (if false, initialise USM surfaces)
2245
2246    IF ( depo_pcm_par == 'zhang2001' )  THEN
2247       depo_pcm_par_num = 1
2248    ELSEIF ( depo_pcm_par == 'petroff2010' )  THEN
2249       depo_pcm_par_num = 2
2250    ENDIF
2251
2252    IF ( depo_surf_par == 'zhang2001' )  THEN
2253       depo_surf_par_num = 1
2254    ELSEIF ( depo_surf_par == 'petroff2010' )  THEN
2255       depo_surf_par_num = 2
2256    ENDIF
2257!
2258!-- LSM: Pavement, vegetation and water
2259    IF ( nldepo_surf  .AND.  land_surface )  THEN
2260       match_lsm = .TRUE.
2261       ALLOCATE( lsm_to_depo_h%match_lupg(1:surf_lsm_h%ns),                                         &
2262                 lsm_to_depo_h%match_luvw(1:surf_lsm_h%ns),                                         &
2263                 lsm_to_depo_h%match_luww(1:surf_lsm_h%ns) )
2264       lsm_to_depo_h%match_lupg = 0
2265       lsm_to_depo_h%match_luvw = 0
2266       lsm_to_depo_h%match_luww = 0
2267       CALL match_sm_zhang( surf_lsm_h, lsm_to_depo_h%match_lupg, lsm_to_depo_h%match_luvw,        &
2268                            lsm_to_depo_h%match_luww, match_lsm )
2269       DO  l = 0, 3
2270          ALLOCATE( lsm_to_depo_v(l)%match_lupg(1:surf_lsm_v(l)%ns),                               &
2271                    lsm_to_depo_v(l)%match_luvw(1:surf_lsm_v(l)%ns),                               &
2272                    lsm_to_depo_v(l)%match_luww(1:surf_lsm_v(l)%ns) )
2273          lsm_to_depo_v(l)%match_lupg = 0
2274          lsm_to_depo_v(l)%match_luvw = 0
2275          lsm_to_depo_v(l)%match_luww = 0
2276          CALL match_sm_zhang( surf_lsm_v(l), lsm_to_depo_v(l)%match_lupg,                         &
2277                               lsm_to_depo_v(l)%match_luvw, lsm_to_depo_v(l)%match_luww, match_lsm )
2278       ENDDO
2279    ENDIF
2280!
2281!-- USM: Green roofs/walls, wall surfaces and windows
2282    IF ( nldepo_surf  .AND.  urban_surface )  THEN
2283       match_lsm = .FALSE.
2284       ALLOCATE( usm_to_depo_h%match_lupg(1:surf_usm_h%ns),                                        &
2285                 usm_to_depo_h%match_luvw(1:surf_usm_h%ns),                                        &
2286                 usm_to_depo_h%match_luww(1:surf_usm_h%ns) )
2287       usm_to_depo_h%match_lupg = 0
2288       usm_to_depo_h%match_luvw = 0
2289       usm_to_depo_h%match_luww = 0
2290       CALL match_sm_zhang( surf_usm_h, usm_to_depo_h%match_lupg, usm_to_depo_h%match_luvw,        &
2291                            usm_to_depo_h%match_luww, match_lsm )
2292       DO  l = 0, 3
2293          ALLOCATE( usm_to_depo_v(l)%match_lupg(1:surf_usm_v(l)%ns),                               &
2294                    usm_to_depo_v(l)%match_luvw(1:surf_usm_v(l)%ns),                               &
2295                    usm_to_depo_v(l)%match_luww(1:surf_usm_v(l)%ns) )
2296          usm_to_depo_v(l)%match_lupg = 0
2297          usm_to_depo_v(l)%match_luvw = 0
2298          usm_to_depo_v(l)%match_luww = 0
2299          CALL match_sm_zhang( surf_usm_v(l), usm_to_depo_v(l)%match_lupg,                         &
2300                               usm_to_depo_v(l)%match_luvw, usm_to_depo_v(l)%match_luww, match_lsm )
2301       ENDDO
2302    ENDIF
2303
2304    IF ( nldepo_pcm )  THEN
2305       SELECT CASE ( depo_pcm_type )
2306          CASE ( 'evergreen_needleleaf' )
2307             depo_pcm_type_num = 1
2308          CASE ( 'evergreen_broadleaf' )
2309             depo_pcm_type_num = 2
2310          CASE ( 'deciduous_needleleaf' )
2311             depo_pcm_type_num = 3
2312          CASE ( 'deciduous_broadleaf' )
2313             depo_pcm_type_num = 4
2314          CASE DEFAULT
2315             message_string = 'depo_pcm_type not set correctly.'
2316             CALL message( 'salsa_mod: init_deposition', 'PA0613', 1, 2, 0, 6, 0 )
2317       END SELECT
2318    ENDIF
2319
2320 END SUBROUTINE init_deposition
2321
2322!------------------------------------------------------------------------------!
2323! Description:
2324! ------------
2325!> Match the surface types in PALM and Zhang et al. 2001 deposition module
2326!------------------------------------------------------------------------------!
2327 SUBROUTINE match_sm_zhang( surf, match_pav_green, match_veg_wall, match_wat_win, match_lsm )
2328
2329    USE surface_mod,                                                           &
2330        ONLY:  ind_pav_green, ind_veg_wall, ind_wat_win, surf_type
2331
2332    IMPLICIT NONE
2333
2334    INTEGER(iwp) ::  m              !< index for surface elements
2335    INTEGER(iwp) ::  pav_type_palm  !< pavement / green wall type in PALM
2336    INTEGER(iwp) ::  veg_type_palm  !< vegetation / wall type in PALM
2337    INTEGER(iwp) ::  wat_type_palm  !< water / window type in PALM
2338
2339    INTEGER(iwp), DIMENSION(:), INTENT(inout) ::  match_pav_green  !<  matching pavement/green walls
2340    INTEGER(iwp), DIMENSION(:), INTENT(inout) ::  match_veg_wall   !<  matching vegetation/walls
2341    INTEGER(iwp), DIMENSION(:), INTENT(inout) ::  match_wat_win    !<  matching water/windows
2342
2343    LOGICAL, INTENT(in) :: match_lsm  !< flag to initilise LSM surfaces (if false, initialise USM)
2344
2345    TYPE(surf_type), INTENT(in) :: surf  !< respective surface type
2346
2347    DO  m = 1, surf%ns
2348       IF ( match_lsm )  THEN
2349!
2350!--       Vegetation (LSM):
2351          IF ( surf%frac(ind_veg_wall,m) > 0 )  THEN
2352             veg_type_palm = surf%vegetation_type(m)
2353             SELECT CASE ( veg_type_palm )
2354                CASE ( 0 )
2355                   message_string = 'No vegetation type defined.'
2356                   CALL message( 'salsa_mod: init_depo_surfaces', 'PA0614', 1, 2, 0, 6, 0 )
2357                CASE ( 1 )  ! bare soil
2358                   match_veg_wall(m) = 6  ! grass in Z01
2359                CASE ( 2 )  ! crops, mixed farming
2360                   match_veg_wall(m) = 7  !  crops, mixed farming Z01
2361                CASE ( 3 )  ! short grass
2362                   match_veg_wall(m) = 6  ! grass in Z01
2363                CASE ( 4 )  ! evergreen needleleaf trees
2364                    match_veg_wall(m) = 1  ! evergreen needleleaf trees in Z01
2365                CASE ( 5 )  ! deciduous needleleaf trees
2366                   match_veg_wall(m) = 3  ! deciduous needleleaf trees in Z01
2367                CASE ( 6 )  ! evergreen broadleaf trees
2368                   match_veg_wall(m) = 2  ! evergreen broadleaf trees in Z01
2369                CASE ( 7 )  ! deciduous broadleaf trees
2370                   match_veg_wall(m) = 4  ! deciduous broadleaf trees in Z01
2371                CASE ( 8 )  ! tall grass
2372                   match_veg_wall(m) = 6  ! grass in Z01
2373                CASE ( 9 )  ! desert
2374                   match_veg_wall(m) = 8  ! desert in Z01
2375                CASE ( 10 )  ! tundra
2376                   match_veg_wall(m) = 9  ! tundra in Z01
2377                CASE ( 11 )  ! irrigated crops
2378                   match_veg_wall(m) = 7  !  crops, mixed farming Z01
2379                CASE ( 12 )  ! semidesert
2380                   match_veg_wall(m) = 8  ! desert in Z01
2381                CASE ( 13 )  ! ice caps and glaciers
2382                   match_veg_wall(m) = 12  ! ice cap and glacier in Z01
2383                CASE ( 14 )  ! bogs and marshes
2384                   match_veg_wall(m) = 11  ! wetland with plants in Z01
2385                CASE ( 15 )  ! evergreen shrubs
2386                   match_veg_wall(m) = 10  ! shrubs and interrupted woodlands in Z01
2387                CASE ( 16 )  ! deciduous shrubs
2388                   match_veg_wall(m) = 10  ! shrubs and interrupted woodlands in Z01
2389                CASE ( 17 )  ! mixed forest/woodland
2390                   match_veg_wall(m) = 5  ! mixed broadleaf and needleleaf trees in Z01
2391                CASE ( 18 )  ! interrupted forest
2392                   match_veg_wall(m) = 10  ! shrubs and interrupted woodlands in Z01
2393             END SELECT
2394          ENDIF
2395!
2396!--       Pavement (LSM):
2397          IF ( surf%frac(ind_pav_green,m) > 0 )  THEN
2398             pav_type_palm = surf%pavement_type(m)
2399             IF ( pav_type_palm == 0 )  THEN  ! error
2400                message_string = 'No pavement type defined.'
2401                CALL message( 'salsa_mod: match_sm_zhang', 'PA0615', 1, 2, 0, 6, 0 )
2402             ELSE
2403                match_pav_green(m) = 15  ! urban in Z01
2404             ENDIF
2405          ENDIF
2406!
2407!--       Water (LSM):
2408          IF ( surf%frac(ind_wat_win,m) > 0 )  THEN
2409             wat_type_palm = surf%water_type(m)
2410             IF ( wat_type_palm == 0 )  THEN  ! error
2411                message_string = 'No water type defined.'
2412                CALL message( 'salsa_mod: match_sm_zhang', 'PA0616', 1, 2, 0, 6, 0 )
2413             ELSEIF ( wat_type_palm == 3 )  THEN
2414                match_wat_win(m) = 14  ! ocean in Z01
2415             ELSEIF ( wat_type_palm == 1  .OR.  wat_type_palm == 2 .OR.  wat_type_palm == 4        &
2416                      .OR.  wat_type_palm == 5  )  THEN
2417                match_wat_win(m) = 13  ! inland water in Z01
2418             ENDIF
2419          ENDIF
2420       ELSE
2421!
2422!--       Wall surfaces (USM):
2423          IF ( surf%frac(ind_veg_wall,m) > 0 )  THEN
2424             match_veg_wall(m) = 15  ! urban in Z01
2425          ENDIF
2426!
2427!--       Green walls and roofs (USM):
2428          IF ( surf%frac(ind_pav_green,m) > 0 )  THEN
2429             match_pav_green(m) =  6 ! (short) grass in Z01
2430          ENDIF
2431!
2432!--       Windows (USM):
2433          IF ( surf%frac(ind_wat_win,m) > 0 )  THEN
2434             match_wat_win(m) = 15  ! urban in Z01
2435          ENDIF
2436       ENDIF
2437
2438    ENDDO
2439
2440 END SUBROUTINE match_sm_zhang
2441
2442!------------------------------------------------------------------------------!
2443! Description:
2444! ------------
2445!> Swapping of timelevels
2446!------------------------------------------------------------------------------!
2447 SUBROUTINE salsa_swap_timelevel( mod_count )
2448
2449    IMPLICIT NONE
2450
2451    INTEGER(iwp) ::  ib   !<
2452    INTEGER(iwp) ::  ic   !<
2453    INTEGER(iwp) ::  icc  !<
2454    INTEGER(iwp) ::  ig   !<
2455
2456    INTEGER(iwp), INTENT(IN) ::  mod_count  !<
2457
2458    IF ( time_since_reference_point >= skip_time_do_salsa )  THEN
2459
2460       SELECT CASE ( mod_count )
2461
2462          CASE ( 0 )
2463
2464             DO  ib = 1, nbins_aerosol
2465                aerosol_number(ib)%conc(nzb:nzt+1,nysg:nyng,nxlg:nxrg)   => nconc_1(:,:,:,ib)
2466                aerosol_number(ib)%conc_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg) => nconc_2(:,:,:,ib)
2467
2468                DO  ic = 1, ncomponents_mass
2469                   icc = ( ic-1 ) * nbins_aerosol + ib
2470                   aerosol_mass(icc)%conc(nzb:nzt+1,nysg:nyng,nxlg:nxrg)   => mconc_1(:,:,:,icc)
2471                   aerosol_mass(icc)%conc_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg) => mconc_2(:,:,:,icc)
2472                ENDDO
2473             ENDDO
2474
2475             IF ( .NOT. salsa_gases_from_chem )  THEN
2476                DO  ig = 1, ngases_salsa
2477                   salsa_gas(ig)%conc(nzb:nzt+1,nysg:nyng,nxlg:nxrg)   => gconc_1(:,:,:,ig)
2478                   salsa_gas(ig)%conc_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg) => gconc_2(:,:,:,ig)
2479                ENDDO
2480             ENDIF
2481
2482          CASE ( 1 )
2483
2484             DO  ib = 1, nbins_aerosol
2485                aerosol_number(ib)%conc(nzb:nzt+1,nysg:nyng,nxlg:nxrg)   => nconc_2(:,:,:,ib)
2486                aerosol_number(ib)%conc_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg) => nconc_1(:,:,:,ib)
2487                DO  ic = 1, ncomponents_mass
2488                   icc = ( ic-1 ) * nbins_aerosol + ib
2489                   aerosol_mass(icc)%conc(nzb:nzt+1,nysg:nyng,nxlg:nxrg)   => mconc_2(:,:,:,icc)
2490                   aerosol_mass(icc)%conc_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg) => mconc_1(:,:,:,icc)
2491                ENDDO
2492             ENDDO
2493
2494             IF ( .NOT. salsa_gases_from_chem )  THEN
2495                DO  ig = 1, ngases_salsa
2496                   salsa_gas(ig)%conc(nzb:nzt+1,nysg:nyng,nxlg:nxrg)   => gconc_2(:,:,:,ig)
2497                   salsa_gas(ig)%conc_p(nzb:nzt+1,nysg:nyng,nxlg:nxrg) => gconc_1(:,:,:,ig)
2498                ENDDO
2499             ENDIF
2500
2501       END SELECT
2502
2503    ENDIF
2504
2505 END SUBROUTINE salsa_swap_timelevel
2506
2507
2508!------------------------------------------------------------------------------!
2509! Description:
2510! ------------
2511!> This routine reads the respective restart data.
2512!------------------------------------------------------------------------------!
2513 SUBROUTINE salsa_rrd_local( k, nxlf, nxlc, nxl_on_file, nxrf, nxrc, nxr_on_file, nynf, nync,      &
2514                             nyn_on_file, nysf, nysc, nys_on_file, tmp_3d, found )
2515
2516    IMPLICIT NONE
2517
2518    INTEGER(iwp) ::  ib              !<
2519    INTEGER(iwp) ::  ic              !<
2520    INTEGER(iwp) ::  ig              !<
2521    INTEGER(iwp) ::  k               !<
2522    INTEGER(iwp) ::  nxlc            !<
2523    INTEGER(iwp) ::  nxlf            !<
2524    INTEGER(iwp) ::  nxl_on_file     !<
2525    INTEGER(iwp) ::  nxrc            !<
2526    INTEGER(iwp) ::  nxrf            !<
2527    INTEGER(iwp) ::  nxr_on_file     !<
2528    INTEGER(iwp) ::  nync            !<
2529    INTEGER(iwp) ::  nynf            !<
2530    INTEGER(iwp) ::  nyn_on_file     !<
2531    INTEGER(iwp) ::  nysc            !<
2532    INTEGER(iwp) ::  nysf            !<
2533    INTEGER(iwp) ::  nys_on_file     !<
2534
2535    LOGICAL, INTENT(OUT)  ::  found  !<
2536
2537    REAL(wp), &
2538       DIMENSION(nzb:nzt+1,nys_on_file-nbgp:nyn_on_file+nbgp,nxl_on_file-nbgp:nxr_on_file+nbgp) :: tmp_3d   !<
2539
2540    found = .FALSE.
2541
2542    IF ( read_restart_data_salsa )  THEN
2543
2544       SELECT CASE ( restart_string(1:length) )
2545
2546          CASE ( 'aerosol_number' )
2547             DO  ib = 1, nbins_aerosol
2548                IF ( k == 1 )  READ ( 13 ) tmp_3d
2549                aerosol_number(ib)%conc(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =               &
2550                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
2551                found = .TRUE.
2552             ENDDO
2553
2554          CASE ( 'aerosol_mass' )
2555             DO  ic = 1, ncomponents_mass * nbins_aerosol
2556                IF ( k == 1 )  READ ( 13 ) tmp_3d
2557                aerosol_mass(ic)%conc(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                 &
2558                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
2559                found = .TRUE.
2560             ENDDO
2561
2562          CASE ( 'salsa_gas' )
2563             DO  ig = 1, ngases_salsa
2564                IF ( k == 1 )  READ ( 13 ) tmp_3d
2565                salsa_gas(ig)%conc(:,nysc-nbgp:nync+nbgp,nxlc-nbgp:nxrc+nbgp) =                    &
2566                                                   tmp_3d(:,nysf-nbgp:nynf+nbgp,nxlf-nbgp:nxrf+nbgp)
2567                found = .TRUE.
2568             ENDDO
2569
2570          CASE DEFAULT
2571             found = .FALSE.
2572
2573       END SELECT
2574    ENDIF
2575
2576 END SUBROUTINE salsa_rrd_local
2577
2578!------------------------------------------------------------------------------!
2579! Description:
2580! ------------
2581!> This routine writes the respective restart data.
2582!> Note that the following input variables in PARIN have to be equal between
2583!> restart runs:
2584!>    listspec, nbin, nbin2, nf2a, ncc, mass_fracs_a, mass_fracs_b
2585!------------------------------------------------------------------------------!
2586 SUBROUTINE salsa_wrd_local
2587
2588    IMPLICIT NONE
2589
2590    INTEGER(iwp) ::  ib   !<
2591    INTEGER(iwp) ::  ic   !<
2592    INTEGER(iwp) ::  ig  !<
2593
2594    IF ( write_binary  .AND.  write_binary_salsa )  THEN
2595
2596       CALL wrd_write_string( 'aerosol_number' )
2597       DO  ib = 1, nbins_aerosol
2598          WRITE ( 14 )  aerosol_number(ib)%conc
2599       ENDDO
2600
2601       CALL wrd_write_string( 'aerosol_mass' )
2602       DO  ic = 1, nbins_aerosol * ncomponents_mass
2603          WRITE ( 14 )  aerosol_mass(ic)%conc
2604       ENDDO
2605
2606       CALL wrd_write_string( 'salsa_gas' )
2607       DO  ig = 1, ngases_salsa
2608          WRITE ( 14 )  salsa_gas(ig)%conc
2609       ENDDO
2610
2611    ENDIF
2612
2613 END SUBROUTINE salsa_wrd_local
2614
2615!------------------------------------------------------------------------------!
2616! Description:
2617! ------------
2618!> Performs necessary unit and dimension conversion between the host model and
2619!> SALSA module, and calls the main SALSA routine.
2620!> Partially adobted form the original SALSA boxmodel version.
2621!> Now takes masses in as kg/kg from LES!! Converted to m3/m3 for SALSA
2622!> 05/2016 Juha: This routine is still pretty much in its original shape.
2623!>               It's dumb as a mule and twice as ugly, so implementation of
2624!>               an improved solution is necessary sooner or later.
2625!> Juha Tonttila, FMI, 2014
2626!> Jaakko Ahola, FMI, 2016
2627!> Only aerosol processes included, Mona Kurppa, UHel, 2017
2628!------------------------------------------------------------------------------!
2629 SUBROUTINE salsa_driver( i, j, prunmode )
2630
2631    USE arrays_3d,                                                                                 &
2632        ONLY: pt_p, q_p, u, v, w
2633
2634    USE plant_canopy_model_mod,                                                                    &
2635        ONLY: lad_s
2636
2637    USE surface_mod,                                                                               &
2638        ONLY:  surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, surf_usm_v
2639
2640    IMPLICIT NONE
2641
2642    INTEGER(iwp) ::  endi    !< end index
2643    INTEGER(iwp) ::  ib      !< loop index
2644    INTEGER(iwp) ::  ic      !< loop index
2645    INTEGER(iwp) ::  ig      !< loop index
2646    INTEGER(iwp) ::  k_wall  !< vertical index of topography top
2647    INTEGER(iwp) ::  k       !< loop index
2648    INTEGER(iwp) ::  l       !< loop index
2649    INTEGER(iwp) ::  nc_h2o  !< index of H2O in the prtcl index table
2650    INTEGER(iwp) ::  ss      !< loop index
2651    INTEGER(iwp) ::  str     !< start index
2652    INTEGER(iwp) ::  vc      !< default index in prtcl
2653
2654    INTEGER(iwp), INTENT(in) ::  i         !< loop index
2655    INTEGER(iwp), INTENT(in) ::  j         !< loop index
2656    INTEGER(iwp), INTENT(in) ::  prunmode  !< 1: Initialization, 2: Spinup, 3: Regular runtime
2657
2658    REAL(wp) ::  cw_old  !< previous H2O mixing ratio
2659    REAL(wp) ::  flag    !< flag to mask topography grid points
2660    REAL(wp) ::  in_lad  !< leaf area density (m2/m3)
2661    REAL(wp) ::  in_rh   !< relative humidity
2662    REAL(wp) ::  zgso4   !< SO4
2663    REAL(wp) ::  zghno3  !< HNO3
2664    REAL(wp) ::  zgnh3   !< NH3
2665    REAL(wp) ::  zgocnv  !< non-volatile OC
2666    REAL(wp) ::  zgocsv  !< semi-volatile OC
2667
2668    REAL(wp), DIMENSION(nzb:nzt+1) ::  in_adn  !< air density (kg/m3)
2669    REAL(wp), DIMENSION(nzb:nzt+1) ::  in_cs   !< H2O sat. vapour conc.
2670    REAL(wp), DIMENSION(nzb:nzt+1) ::  in_cw   !< H2O vapour concentration
2671    REAL(wp), DIMENSION(nzb:nzt+1) ::  in_p    !< pressure (Pa)
2672    REAL(wp), DIMENSION(nzb:nzt+1) ::  in_t    !< temperature (K)
2673    REAL(wp), DIMENSION(nzb:nzt+1) ::  in_u    !< wind magnitude (m/s)
2674    REAL(wp), DIMENSION(nzb:nzt+1) ::  kvis    !< kinematic viscosity of air(m2/s)
2675    REAL(wp), DIMENSION(nzb:nzt+1) ::  ppm_to_nconc  !< Conversion factor from ppm to #/m3
2676
2677    REAL(wp), DIMENSION(nzb:nzt+1,nbins_aerosol) ::  schmidt_num  !< particle Schmidt number
2678    REAL(wp), DIMENSION(nzb:nzt+1,nbins_aerosol) ::  vd           !< particle fall seed (m/s)
2679
2680    TYPE(t_section), DIMENSION(nbins_aerosol) ::  lo_aero   !< additional variable for OpenMP
2681    TYPE(t_section), DIMENSION(nbins_aerosol) ::  aero_old  !< helper array
2682
2683    aero_old(:)%numc = 0.0_wp
2684    in_lad           = 0.0_wp
2685    in_u             = 0.0_wp
2686    kvis             = 0.0_wp
2687    lo_aero          = aero
2688    schmidt_num      = 0.0_wp
2689    vd               = 0.0_wp
2690    zgso4            = nclim
2691    zghno3           = nclim
2692    zgnh3            = nclim
2693    zgocnv           = nclim
2694    zgocsv           = nclim
2695!
2696!-- Aerosol number is always set, but mass can be uninitialized
2697    DO ib = 1, nbins_aerosol
2698       lo_aero(ib)%volc(:)  = 0.0_wp
2699       aero_old(ib)%volc(:) = 0.0_wp
2700    ENDDO
2701!
2702!-- Set the salsa runtime config (How to make this more efficient?)
2703    CALL set_salsa_runtime( prunmode )
2704!
2705!-- Calculate thermodynamic quantities needed in SALSA
2706    CALL salsa_thrm_ij( i, j, p_ij=in_p, temp_ij=in_t, cw_ij=in_cw, cs_ij=in_cs, adn_ij=in_adn )
2707!
2708!-- Magnitude of wind: needed for deposition
2709    IF ( lsdepo )  THEN
2710       in_u(nzb+1:nzt) = SQRT( ( 0.5_wp * ( u(nzb+1:nzt,j,i) + u(nzb+1:nzt,j,i+1) ) )**2 +         &
2711                               ( 0.5_wp * ( v(nzb+1:nzt,j,i) + v(nzb+1:nzt,j+1,i) ) )**2 +         &
2712                               ( 0.5_wp * ( w(nzb:nzt-1,j,i) + w(nzb+1:nzt,j,  i) ) )**2 )
2713    ENDIF
2714!
2715!-- Calculate conversion factors for gas concentrations
2716    ppm_to_nconc(:) = for_ppm_to_nconc * in_p(:) / in_t(:)
2717!
2718!-- Determine topography-top index on scalar grid
2719    k_wall = k_topo_top(j,i)
2720
2721    DO k = nzb+1, nzt
2722!
2723!--    Predetermine flag to mask topography
2724       flag = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i), 0 ) )
2725!
2726!--    Wind velocity for dry depositon on vegetation
2727       IF ( lsdepo_pcm  .AND.  plant_canopy )  THEN
2728          in_lad = lad_s( MAX( k-k_wall,0 ),j,i)
2729       ENDIF
2730!
2731!--    For initialization and spinup, limit the RH with the parameter rhlim
2732       IF ( prunmode < 3 ) THEN
2733          in_cw(k) = MIN( in_cw(k), in_cs(k) * rhlim )
2734       ELSE
2735          in_cw(k) = in_cw(k)
2736       ENDIF
2737       cw_old = in_cw(k) !* in_adn(k)
2738!
2739!--    Set volume concentrations:
2740!--    Sulphate (SO4) or sulphuric acid H2SO4
2741       IF ( index_so4 > 0 )  THEN
2742          vc = 1
2743          str = ( index_so4-1 ) * nbins_aerosol + 1    ! start index
2744          endi = index_so4 * nbins_aerosol             ! end index
2745          ic = 1
2746          DO ss = str, endi
2747             lo_aero(ic)%volc(vc) = aerosol_mass(ss)%conc(k,j,i) / arhoh2so4
2748             ic = ic+1
2749          ENDDO
2750          aero_old(1:nbins_aerosol)%volc(vc) = lo_aero(1:nbins_aerosol)%volc(vc)
2751       ENDIF
2752!
2753!--    Organic carbon (OC) compounds
2754       IF ( index_oc > 0 )  THEN
2755          vc = 2
2756          str = ( index_oc-1 ) * nbins_aerosol + 1
2757          endi = index_oc * nbins_aerosol
2758          ic = 1
2759          DO ss = str, endi
2760             lo_aero(ic)%volc(vc) = aerosol_mass(ss)%conc(k,j,i) / arhooc
2761             ic = ic+1
2762          ENDDO
2763          aero_old(1:nbins_aerosol)%volc(vc) = lo_aero(1:nbins_aerosol)%volc(vc)
2764       ENDIF
2765!
2766!--    Black carbon (BC)
2767       IF ( index_bc > 0 )  THEN
2768          vc = 3
2769          str = ( index_bc-1 ) * nbins_aerosol + 1 + end_subrange_1a
2770          endi = index_bc * nbins_aerosol
2771          ic = 1 + end_subrange_1a
2772          DO ss = str, endi
2773             lo_aero(ic)%volc(vc) = aerosol_mass(ss)%conc(k,j,i) / arhobc
2774             ic = ic+1
2775          ENDDO
2776          aero_old(1:nbins_aerosol)%volc(vc) = lo_aero(1:nbins_aerosol)%volc(vc)
2777       ENDIF
2778!
2779!--    Dust (DU)
2780       IF ( index_du > 0 )  THEN
2781          vc = 4
2782          str = ( index_du-1 ) * nbins_aerosol + 1 + end_subrange_1a
2783          endi = index_du * nbins_aerosol
2784          ic = 1 + end_subrange_1a
2785          DO ss = str, endi
2786             lo_aero(ic)%volc(vc) = aerosol_mass(ss)%conc(k,j,i) / arhodu
2787             ic = ic+1
2788          ENDDO
2789          aero_old(1:nbins_aerosol)%volc(vc) = lo_aero(1:nbins_aerosol)%volc(vc)
2790       ENDIF
2791!
2792!--    Sea salt (SS)
2793       IF ( index_ss > 0 )  THEN
2794          vc = 5
2795          str = ( index_ss-1 ) * nbins_aerosol + 1 + end_subrange_1a
2796          endi = index_ss * nbins_aerosol
2797          ic = 1 + end_subrange_1a
2798          DO ss = str, endi
2799             lo_aero(ic)%volc(vc) = aerosol_mass(ss)%conc(k,j,i) / arhoss
2800             ic = ic+1
2801          ENDDO
2802          aero_old(1:nbins_aerosol)%volc(vc) = lo_aero(1:nbins_aerosol)%volc(vc)
2803       ENDIF
2804!
2805!--    Nitrate (NO(3-)) or nitric acid HNO3
2806       IF ( index_no > 0 )  THEN
2807          vc = 6
2808          str = ( index_no-1 ) * nbins_aerosol + 1 
2809          endi = index_no * nbins_aerosol
2810          ic = 1
2811          DO ss = str, endi
2812             lo_aero(ic)%volc(vc) = aerosol_mass(ss)%conc(k,j,i) / arhohno3
2813             ic = ic+1
2814          ENDDO
2815          aero_old(1:nbins_aerosol)%volc(vc) = lo_aero(1:nbins_aerosol)%volc(vc)
2816       ENDIF
2817!
2818!--    Ammonium (NH(4+)) or ammonia NH3
2819       IF ( index_nh > 0 )  THEN
2820          vc = 7
2821          str = ( index_nh-1 ) * nbins_aerosol + 1
2822          endi = index_nh * nbins_aerosol
2823          ic = 1
2824          DO ss = str, endi
2825             lo_aero(ic)%volc(vc) = aerosol_mass(ss)%conc(k,j,i) / arhonh3
2826             ic = ic+1
2827          ENDDO
2828          aero_old(1:nbins_aerosol)%volc(vc) = lo_aero(1:nbins_aerosol)%volc(vc)
2829       ENDIF
2830!
2831!--    Water (always used)
2832       nc_h2o = get_index( prtcl,'H2O' )
2833       vc = 8
2834       str = ( nc_h2o-1 ) * nbins_aerosol + 1
2835       endi = nc_h2o * nbins_aerosol
2836       ic = 1
2837       IF ( advect_particle_water )  THEN
2838          DO ss = str, endi
2839             lo_aero(ic)%volc(vc) = aerosol_mass(ss)%conc(k,j,i) / arhoh2o
2840             ic = ic+1
2841          ENDDO
2842       ELSE
2843         lo_aero(1:nbins_aerosol)%volc(vc) = mclim
2844       ENDIF
2845       aero_old(1:nbins_aerosol)%volc(vc) = lo_aero(1:nbins_aerosol)%volc(vc)
2846!
2847!--    Number concentrations (numc) and particle sizes
2848!--    (dwet = wet diameter, core = dry volume)
2849       DO  ib = 1, nbins_aerosol
2850          lo_aero(ib)%numc = aerosol_number(ib)%conc(k,j,i)
2851          aero_old(ib)%numc = lo_aero(ib)%numc
2852          IF ( lo_aero(ib)%numc > nclim )  THEN
2853             lo_aero(ib)%dwet = ( SUM( lo_aero(ib)%volc(:) ) / lo_aero(ib)%numc / api6 )**0.33333333_wp
2854             lo_aero(ib)%core = SUM( lo_aero(ib)%volc(1:7) ) / lo_aero(ib)%numc
2855          ELSE
2856             lo_aero(ib)%dwet = lo_aero(ib)%dmid
2857             lo_aero(ib)%core = api6 * ( lo_aero(ib)%dwet )**3
2858          ENDIF
2859       ENDDO
2860!
2861!--    Calculate the ambient sizes of particles by equilibrating soluble fraction of particles with
2862!--    water using the ZSR method.
2863       in_rh = in_cw(k) / in_cs(k)
2864       IF ( prunmode==1  .OR.  .NOT. advect_particle_water )  THEN
2865          CALL equilibration( in_rh, in_t(k), lo_aero, .TRUE. )
2866       ENDIF
2867!
2868!--    Gaseous tracer concentrations in #/m3
2869       IF ( salsa_gases_from_chem )  THEN
2870!
2871!--       Convert concentrations in ppm to #/m3
2872          zgso4  = chem_species(gas_index_chem(1))%conc(k,j,i) * ppm_to_nconc(k)
2873          zghno3 = chem_species(gas_index_chem(2))%conc(k,j,i) * ppm_to_nconc(k)
2874          zgnh3  = chem_species(gas_index_chem(3))%conc(k,j,i) * ppm_to_nconc(k)
2875          zgocnv = chem_species(gas_index_chem(4))%conc(k,j,i) * ppm_to_nconc(k)
2876          zgocsv = chem_species(gas_index_chem(5))%conc(k,j,i) * ppm_to_nconc(k)
2877       ELSE
2878          zgso4  = salsa_gas(1)%conc(k,j,i)
2879          zghno3 = salsa_gas(2)%conc(k,j,i)
2880          zgnh3  = salsa_gas(3)%conc(k,j,i)
2881          zgocnv = salsa_gas(4)%conc(k,j,i)
2882          zgocsv = salsa_gas(5)%conc(k,j,i)
2883       ENDIF
2884!
2885!--    Calculate aerosol processes:
2886!--    *********************************************************************************************
2887!
2888!--    Coagulation
2889       IF ( lscoag )   THEN
2890          CALL coagulation( lo_aero, dt_salsa, in_t(k), in_p(k) )
2891       ENDIF
2892!
2893!--    Condensation
2894       IF ( lscnd )   THEN
2895          CALL condensation( lo_aero, zgso4, zgocnv, zgocsv,  zghno3, zgnh3, in_cw(k), in_cs(k),      &
2896                             in_t(k), in_p(k), dt_salsa, prtcl )
2897       ENDIF
2898!
2899!--    Deposition
2900       IF ( lsdepo )  THEN
2901          CALL deposition( lo_aero, in_t(k), in_adn(k), in_u(k), in_lad, kvis(k), schmidt_num(k,:),   &
2902                           vd(k,:) )
2903       ENDIF
2904!
2905!--    Size distribution bin update
2906       IF ( lsdistupdate )   THEN
2907          CALL distr_update( lo_aero )
2908       ENDIF
2909!--    *********************************************************************************************
2910
2911       IF ( lsdepo ) sedim_vd(k,j,i,:) = vd(k,:)
2912!
2913!--    Calculate changes in concentrations
2914       DO ib = 1, nbins_aerosol
2915          aerosol_number(ib)%conc(k,j,i) = aerosol_number(ib)%conc(k,j,i) + ( lo_aero(ib)%numc -   &
2916                                           aero_old(ib)%numc ) * flag
2917       ENDDO
2918
2919       IF ( index_so4 > 0 )  THEN
2920          vc = 1
2921          str = ( index_so4-1 ) * nbins_aerosol + 1
2922          endi = index_so4 * nbins_aerosol
2923          ic = 1
2924          DO ss = str, endi
2925             aerosol_mass(ss)%conc(k,j,i) = aerosol_mass(ss)%conc(k,j,i) + ( lo_aero(ic)%volc(vc) -&
2926                                            aero_old(ic)%volc(vc) ) * arhoh2so4 * flag
2927             ic = ic+1
2928          ENDDO
2929       ENDIF
2930
2931       IF ( index_oc > 0 )  THEN
2932          vc = 2
2933          str = ( index_oc-1 ) * nbins_aerosol + 1
2934          endi = index_oc * nbins_aerosol
2935          ic = 1
2936          DO ss = str, endi
2937             aerosol_mass(ss)%conc(k,j,i) = aerosol_mass(ss)%conc(k,j,i) + ( lo_aero(ic)%volc(vc) -&
2938                                            aero_old(ic)%volc(vc) ) * arhooc * flag
2939             ic = ic+1
2940          ENDDO
2941       ENDIF
2942
2943       IF ( index_bc > 0 )  THEN
2944          vc = 3
2945          str = ( index_bc-1 ) * nbins_aerosol + 1 + end_subrange_1a
2946          endi = index_bc * nbins_aerosol
2947          ic = 1 + end_subrange_1a
2948          DO ss = str, endi
2949             aerosol_mass(ss)%conc(k,j,i) = aerosol_mass(ss)%conc(k,j,i) + ( lo_aero(ic)%volc(vc) -&
2950                                            aero_old(ic)%volc(vc) ) * arhobc * flag
2951             ic = ic+1
2952          ENDDO
2953       ENDIF
2954
2955       IF ( index_du > 0 )  THEN
2956          vc = 4
2957          str = ( index_du-1 ) * nbins_aerosol + 1 + end_subrange_1a
2958          endi = index_du * nbins_aerosol
2959          ic = 1 + end_subrange_1a
2960          DO ss = str, endi
2961             aerosol_mass(ss)%conc(k,j,i) = aerosol_mass(ss)%conc(k,j,i) + ( lo_aero(ic)%volc(vc) -&
2962                                            aero_old(ic)%volc(vc) ) * arhodu * flag
2963             ic = ic+1
2964          ENDDO
2965       ENDIF
2966
2967       IF ( index_ss > 0 )  THEN
2968          vc = 5
2969          str = ( index_ss-1 ) * nbins_aerosol + 1 + end_subrange_1a
2970          endi = index_ss * nbins_aerosol
2971          ic = 1 + end_subrange_1a
2972          DO ss = str, endi
2973             aerosol_mass(ss)%conc(k,j,i) = aerosol_mass(ss)%conc(k,j,i) + ( lo_aero(ic)%volc(vc) -&
2974                                            aero_old(ic)%volc(vc) ) * arhoss * flag
2975             ic = ic+1
2976          ENDDO
2977       ENDIF
2978
2979       IF ( index_no > 0 )  THEN
2980          vc = 6
2981          str = ( index_no-1 ) * nbins_aerosol + 1
2982          endi = index_no * nbins_aerosol
2983          ic = 1
2984          DO ss = str, endi
2985             aerosol_mass(ss)%conc(k,j,i) = aerosol_mass(ss)%conc(k,j,i) + ( lo_aero(ic)%volc(vc) -&
2986                                            aero_old(ic)%volc(vc) ) * arhohno3 * flag
2987             ic = ic+1
2988          ENDDO
2989       ENDIF
2990
2991       IF ( index_nh > 0 )  THEN
2992          vc = 7
2993          str = ( index_nh-1 ) * nbins_aerosol + 1
2994          endi = index_nh * nbins_aerosol
2995          ic = 1
2996          DO ss = str, endi
2997             aerosol_mass(ss)%conc(k,j,i) = aerosol_mass(ss)%conc(k,j,i) + ( lo_aero(ic)%volc(vc) -&
2998                                            aero_old(ic)%volc(vc) ) * arhonh3 * flag
2999             ic = ic+1
3000          ENDDO
3001       ENDIF
3002
3003       IF ( advect_particle_water )  THEN
3004          nc_h2o = get_index( prtcl,'H2O' )
3005          vc = 8
3006          str = ( nc_h2o-1 ) * nbins_aerosol + 1
3007          endi = nc_h2o * nbins_aerosol
3008          ic = 1
3009          DO ss = str, endi
3010             aerosol_mass(ss)%conc(k,j,i) = aerosol_mass(ss)%conc(k,j,i) + ( lo_aero(ic)%volc(vc) -&
3011                                            aero_old(ic)%volc(vc) ) * arhoh2o * flag
3012             ic = ic+1
3013          ENDDO
3014       ENDIF
3015       IF ( prunmode == 1 )  THEN
3016          nc_h2o = get_index( prtcl,'H2O' )
3017          vc = 8
3018          str = ( nc_h2o-1 ) * nbins_aerosol + 1
3019          endi = nc_h2o * nbins_aerosol
3020          ic = 1
3021          DO ss = str, endi
3022             aerosol_mass(ss)%init(k) = MAX( aerosol_mass(ss)%init(k), ( lo_aero(ic)%volc(vc) - &
3023                                             aero_old(ic)%volc(vc) ) * arhoh2o )
3024             IF ( k == nzb+1 )  THEN
3025                aerosol_mass(ss)%init(k-1) = aerosol_mass(ss)%init(k)
3026             ELSEIF ( k == nzt  )  THEN
3027                aerosol_mass(ss)%init(k+1) = aerosol_mass(ss)%init(k)
3028                aerosol_mass(ss)%conc(k+1,j,i) = aerosol_mass(ss)%init(k)
3029             ENDIF
3030             ic = ic+1
3031          ENDDO
3032       ENDIF
3033!
3034!--    Condensation of precursor gases
3035       IF ( lscndgas )  THEN
3036          IF ( salsa_gases_from_chem )  THEN
3037!
3038!--          SO4 (or H2SO4)
3039             ig = gas_index_chem(1)
3040             chem_species(ig)%conc(k,j,i) = chem_species(ig)%conc(k,j,i) + ( zgso4 /               &
3041                                            ppm_to_nconc(k) - chem_species(ig)%conc(k,j,i) ) * flag
3042!
3043!--          HNO3
3044             ig = gas_index_chem(2)
3045             chem_species(ig)%conc(k,j,i) = chem_species(ig)%conc(k,j,i) + ( zghno3 /              &
3046                                            ppm_to_nconc(k) - chem_species(ig)%conc(k,j,i) ) * flag
3047!
3048!--          NH3
3049             ig = gas_index_chem(3)
3050             chem_species(ig)%conc(k,j,i) = chem_species(ig)%conc(k,j,i) + ( zgnh3 /               &
3051                                            ppm_to_nconc(k) - chem_species(ig)%conc(k,j,i) ) * flag
3052!
3053!--          non-volatile OC
3054             ig = gas_index_chem(4)
3055             chem_species(ig)%conc(k,j,i) = chem_species(ig)%conc(k,j,i) + ( zgocnv /              &
3056                                            ppm_to_nconc(k) - chem_species(ig)%conc(k,j,i) ) * flag
3057!
3058!--          semi-volatile OC
3059             ig = gas_index_chem(5)
3060             chem_species(ig)%conc(k,j,i) = chem_species(ig)%conc(k,j,i) + ( zgocsv /              &
3061                                            ppm_to_nconc(k) - chem_species(ig)%conc(k,j,i) ) * flag
3062
3063          ELSE
3064!
3065!--          SO4 (or H2SO4)
3066             salsa_gas(1)%conc(k,j,i) = salsa_gas(1)%conc(k,j,i) + ( zgso4 -                       &
3067                                        salsa_gas(1)%conc(k,j,i) ) * flag
3068!
3069!--          HNO3
3070             salsa_gas(2)%conc(k,j,i) = salsa_gas(2)%conc(k,j,i) + ( zghno3 -                      &
3071                                        salsa_gas(2)%conc(k,j,i) ) * flag
3072!
3073!--          NH3
3074             salsa_gas(3)%conc(k,j,i) = salsa_gas(3)%conc(k,j,i) + ( zgnh3 -                       &
3075                                        salsa_gas(3)%conc(k,j,i) ) * flag
3076!
3077!--          non-volatile OC
3078             salsa_gas(4)%conc(k,j,i) = salsa_gas(4)%conc(k,j,i) + ( zgocnv -                      &
3079                                        salsa_gas(4)%conc(k,j,i) ) * flag
3080!
3081!--          semi-volatile OC
3082             salsa_gas(5)%conc(k,j,i) = salsa_gas(5)%conc(k,j,i) + ( zgocsv -                      &
3083                                        salsa_gas(5)%conc(k,j,i) ) * flag
3084          ENDIF
3085       ENDIF
3086!
3087!--    Tendency of water vapour mixing ratio is obtained from the change in RH during SALSA run.
3088!--    This releases heat and changes pt. Assumes no temperature change during SALSA run.
3089!--    q = r / (1+r), Euler method for integration
3090!
3091       IF ( feedback_to_palm )  THEN
3092          q_p(k,j,i) = q_p(k,j,i) + 1.0_wp / ( in_cw(k) * in_adn(k) + 1.0_wp )**2 *                &
3093                       ( in_cw(k) - cw_old ) * in_adn(k) * flag
3094          pt_p(k,j,i) = pt_p(k,j,i) + alv / c_p * ( in_cw(k) - cw_old ) * in_adn(k) / ( in_cw(k) / &
3095                        in_adn(k) + 1.0_wp )**2 * pt_p(k,j,i) / in_t(k) * flag
3096       ENDIF
3097
3098    ENDDO   ! k
3099
3100!
3101!-- Set surfaces and wall fluxes due to deposition
3102    IF ( lsdepo  .AND.  lsdepo_surf  .AND.  prunmode == 3 )  THEN
3103       IF ( .NOT. land_surface  .AND.  .NOT. urban_surface )  THEN
3104          CALL depo_surf( i, j, surf_def_h(0), vd, schmidt_num, kvis, in_u, .TRUE. )
3105          DO  l = 0, 3
3106             CALL depo_surf( i, j, surf_def_v(l), vd, schmidt_num, kvis, in_u, .FALSE. )
3107          ENDDO
3108       ELSE
3109          CALL depo_surf( i, j, surf_usm_h, vd, schmidt_num, kvis, in_u, .TRUE., usm_to_depo_h )
3110          DO  l = 0, 3
3111             CALL depo_surf( i, j, surf_usm_v(l), vd, schmidt_num, kvis, in_u, .FALSE.,            &
3112                             usm_to_depo_v(l) )
3113          ENDDO
3114          CALL depo_surf( i, j, surf_lsm_h, vd, schmidt_num, kvis, in_u, .TRUE., lsm_to_depo_h )
3115          DO  l = 0, 3
3116             CALL depo_surf( i, j, surf_lsm_v(l), vd, schmidt_num, kvis, in_u, .FALSE.,            &
3117                             lsm_to_depo_v(l) )
3118          ENDDO
3119       ENDIF
3120    ENDIF
3121
3122    IF ( prunmode < 3 )  THEN
3123       !$OMP MASTER
3124       aero = lo_aero
3125       !$OMP END MASTER
3126    END IF
3127
3128 END SUBROUTINE salsa_driver
3129
3130!------------------------------------------------------------------------------!
3131! Description:
3132! ------------
3133!> Set logical switches according to the host model state and user-specified
3134!> NAMELIST options.
3135!> Juha Tonttila, FMI, 2014
3136!> Only aerosol processes included, Mona Kurppa, UHel, 2017
3137!------------------------------------------------------------------------------!
3138 SUBROUTINE set_salsa_runtime( prunmode )
3139
3140    IMPLICIT NONE
3141
3142    INTEGER(iwp), INTENT(in) ::  prunmode
3143
3144    SELECT CASE(prunmode)
3145
3146       CASE(1) !< Initialization
3147          lscoag       = .FALSE.
3148          lscnd        = .FALSE.
3149          lscndgas     = .FALSE.
3150          lscndh2oae   = .FALSE.
3151          lsdepo       = .FALSE.
3152          lsdepo_pcm   = .FALSE.
3153          lsdepo_surf  = .FALSE.
3154          lsdistupdate = .TRUE.
3155          lspartition  = .FALSE.
3156
3157       CASE(2)  !< Spinup period
3158          lscoag      = ( .FALSE. .AND. nlcoag   )
3159          lscnd       = ( .TRUE.  .AND. nlcnd    )
3160          lscndgas    = ( .TRUE.  .AND. nlcndgas )
3161          lscndh2oae  = ( .TRUE.  .AND. nlcndh2oae )
3162
3163       CASE(3)  !< Run
3164          lscoag       = nlcoag
3165          lscnd        = nlcnd
3166          lscndgas     = nlcndgas
3167          lscndh2oae   = nlcndh2oae
3168          lsdepo       = nldepo
3169          lsdepo_pcm   = nldepo_pcm
3170          lsdepo_surf  = nldepo_surf
3171          lsdistupdate = nldistupdate
3172    END SELECT
3173
3174
3175 END SUBROUTINE set_salsa_runtime
3176 
3177!------------------------------------------------------------------------------!
3178! Description:
3179! ------------
3180!> Calculates the absolute temperature (using hydrostatic pressure), saturation
3181!> vapour pressure and mixing ratio over water, relative humidity and air
3182!> density needed in the SALSA model.
3183!> NOTE, no saturation adjustment takes place -> the resulting water vapour
3184!> mixing ratio can be supersaturated, allowing the microphysical calculations
3185!> in SALSA.
3186!
3187!> Juha Tonttila, FMI, 2014 (original SALSAthrm)
3188!> Mona Kurppa, UHel, 2017 (adjustment for PALM and only aerosol processes)
3189!------------------------------------------------------------------------------!
3190 SUBROUTINE salsa_thrm_ij( i, j, p_ij, temp_ij, cw_ij, cs_ij, adn_ij )
3191
3192    USE arrays_3d,                                                                                 &
3193        ONLY: pt, q, zu
3194
3195    USE basic_constants_and_equations_mod,                                                         &
3196        ONLY:  barometric_formula, exner_function, ideal_gas_law_rho, magnus
3197
3198    USE control_parameters,                                                                        &
3199        ONLY: pt_surface, surface_pressure
3200
3201    IMPLICIT NONE
3202
3203    INTEGER(iwp), INTENT(in) ::  i  !<
3204    INTEGER(iwp), INTENT(in) ::  j  !<
3205
3206    REAL(wp) ::  t_surface  !< absolute surface temperature (K)
3207
3208    REAL(wp), DIMENSION(nzb:nzt+1) ::  e_s  !< saturation vapour pressure over water (Pa)
3209
3210    REAL(wp), DIMENSION(:), INTENT(inout) ::  adn_ij   !< air density (kg/m3)
3211    REAL(wp), DIMENSION(:), INTENT(inout) ::  p_ij     !< air pressure (Pa)
3212    REAL(wp), DIMENSION(:), INTENT(inout) ::  temp_ij  !< air temperature (K)
3213
3214    REAL(wp), DIMENSION(:), INTENT(inout), OPTIONAL ::  cw_ij  !< water vapour concentration (kg/m3)
3215    REAL(wp), DIMENSION(:), INTENT(inout), OPTIONAL ::  cs_ij  !< saturation water vap. conc.(kg/m3)
3216!
3217!-- Pressure p_ijk (Pa) = hydrostatic pressure
3218    t_surface = pt_surface * exner_function( surface_pressure * 100.0_wp )
3219    p_ij(:) = barometric_formula( zu, t_surface, surface_pressure * 100.0_wp )
3220!
3221!-- Absolute ambient temperature (K)
3222    temp_ij(:) = pt(:,j,i) * exner_function( p_ij(:) )
3223!
3224!-- Air density
3225    adn_ij(:) = ideal_gas_law_rho( p_ij(:), temp_ij(:) )
3226!
3227!-- Water vapour concentration r_v (kg/m3)
3228    IF ( PRESENT( cw_ij ) )  THEN
3229       cw_ij(:) = ( q(:,j,i) / ( 1.0_wp - q(:,j,i) ) ) * adn_ij(:)
3230    ENDIF
3231!
3232!-- Saturation mixing ratio r_s (kg/kg) from vapour pressure at temp (Pa)
3233    IF ( PRESENT( cs_ij ) )  THEN
3234       e_s(:) = 611.0_wp * EXP( alv_d_rv * ( 3.6609E-3_wp - 1.0_wp /           &
3235                temp_ij(:) ) )! magnus( temp_ij(:) )
3236       cs_ij(:) = ( 0.622_wp * e_s / ( p_ij(:) - e_s(:) ) ) * adn_ij(:)
3237    ENDIF
3238
3239 END SUBROUTINE salsa_thrm_ij
3240
3241!------------------------------------------------------------------------------!
3242! Description:
3243! ------------
3244!> Calculates ambient sizes of particles by equilibrating soluble fraction of
3245!> particles with water using the ZSR method (Stokes and Robinson, 1966).
3246!> Method:
3247!> Following chemical components are assumed water-soluble
3248!> - (ammonium) sulphate (100%)
3249!> - sea salt (100 %)
3250!> - organic carbon (epsoc * 100%)
3251!> Exact thermodynamic considerations neglected.
3252!> - If particles contain no sea salt, calculation according to sulphate
3253!>   properties
3254!> - If contain sea salt but no sulphate, calculation according to sea salt
3255!>   properties
3256!> - If contain both sulphate and sea salt -> the molar fraction of these
3257!>   compounds determines which one of them is used as the basis of calculation.
3258!> If sulphate and sea salt coexist in a particle, it is assumed that the Cl is
3259!> replaced by sulphate; thus only either sulphate + organics or sea salt +
3260!> organics is included in the calculation of soluble fraction.
3261!> Molality parameterizations taken from Table 1 of Tang: Thermodynamic and
3262!> optical properties of mixed-salt aerosols of atmospheric importance,
3263!> J. Geophys. Res., 102 (D2), 1883-1893 (1997)
3264!
3265!> Coded by:
3266!> Hannele Korhonen (FMI) 2005
3267!> Harri Kokkola (FMI) 2006
3268!> Matti Niskanen(FMI) 2012
3269!> Anton Laakso  (FMI) 2013
3270!> Modified for the new aerosol datatype, Juha Tonttila (FMI) 2014
3271!
3272!> fxm: should sea salt form a solid particle when prh is very low (even though
3273!> it could be mixed with e.g. sulphate)?
3274!> fxm: crashes if no sulphate or sea salt
3275!> fxm: do we really need to consider Kelvin effect for subrange 2
3276!------------------------------------------------------------------------------!
3277 SUBROUTINE equilibration( prh, ptemp, paero, init )
3278
3279    IMPLICIT NONE
3280
3281    INTEGER(iwp) :: ib      !< loop index
3282    INTEGER(iwp) :: counti  !< loop index
3283
3284    LOGICAL, INTENT(in) ::  init   !< TRUE: Initialization, FALSE: Normal runtime: update water
3285                                   !< content only for 1a
3286
3287    REAL(wp) ::  zaw      !< water activity [0-1]
3288    REAL(wp) ::  zcore    !< Volume of dry particle
3289    REAL(wp) ::  zdold    !< Old diameter
3290    REAL(wp) ::  zdwet    !< Wet diameter or mean droplet diameter
3291    REAL(wp) ::  zke      !< Kelvin term in the Köhler equation
3292    REAL(wp) ::  zlwc     !< liquid water content [kg/m3-air]
3293    REAL(wp) ::  zrh      !< Relative humidity
3294
3295    REAL(wp), DIMENSION(maxspec) ::  zbinmol  !< binary molality of each components (mol/kg)
3296    REAL(wp), DIMENSION(maxspec) ::  zvpart   !< volume of chem. compounds in one particle
3297
3298    REAL(wp), INTENT(in) ::  prh    !< relative humidity [0-1]
3299    REAL(wp), INTENT(in) ::  ptemp  !< temperature (K)
3300
3301    TYPE(t_section), DIMENSION(nbins_aerosol), INTENT(inout) ::  paero  !< aerosol properties
3302
3303    zaw       = 0.0_wp
3304    zlwc      = 0.0_wp
3305!
3306!-- Relative humidity:
3307    zrh = prh
3308    zrh = MAX( zrh, 0.05_wp )
3309    zrh = MIN( zrh, 0.98_wp)
3310!
3311!-- 1) Regime 1: sulphate and partly water-soluble OC. Done for every CALL
3312    DO  ib = start_subrange_1a, end_subrange_1a   ! size bin
3313
3314       zbinmol = 0.0_wp
3315       zdold   = 1.0_wp
3316       zke     = 1.02_wp
3317
3318       IF ( paero(ib)%numc > nclim )  THEN
3319!
3320!--       Volume in one particle
3321          zvpart = 0.0_wp
3322          zvpart(1:2) = paero(ib)%volc(1:2) / paero(ib)%numc
3323          zvpart(6:7) = paero(ib)%volc(6:7) / paero(ib)%numc
3324!
3325!--       Total volume and wet diameter of one dry particle
3326          zcore = SUM( zvpart(1:2) )
3327          zdwet = paero(ib)%dwet
3328
3329          counti = 0
3330          DO  WHILE ( ABS( zdwet / zdold - 1.0_wp ) > 1.0E-2_wp )
3331
3332             zdold = MAX( zdwet, 1.0E-20_wp )
3333             zaw = MAX( 1.0E-3_wp, zrh / zke ) ! To avoid underflow
3334!
3335!--          Binary molalities (mol/kg):
3336!--          Sulphate
3337             zbinmol(1) = 1.1065495E+2_wp - 3.6759197E+2_wp * zaw + 5.0462934E+2_wp * zaw**2 -     &
3338                          3.1543839E+2_wp * zaw**3 + 6.770824E+1_wp  * zaw**4
3339!--          Organic carbon
3340             zbinmol(2) = 1.0_wp / ( zaw * amh2o ) - 1.0_wp / amh2o
3341!--          Nitric acid
3342             zbinmol(6) = 2.306844303E+1_wp - 3.563608869E+1_wp * zaw - 6.210577919E+1_wp * zaw**2 &
3343                          + 5.510176187E+2_wp * zaw**3 - 1.460055286E+3_wp * zaw**4                &
3344                          + 1.894467542E+3_wp * zaw**5 - 1.220611402E+3_wp * zaw**6                &
3345                          + 3.098597737E+2_wp * zaw**7
3346!
3347!--          Calculate the liquid water content (kg/m3-air) using ZSR (see e.g. Eq. 10.98 in
3348!--          Seinfeld and Pandis (2006))
3349             zlwc = ( paero(ib)%volc(1) * ( arhoh2so4 / amh2so4 ) ) / zbinmol(1) +                 &
3350                    epsoc * paero(ib)%volc(2) * ( arhooc / amoc ) / zbinmol(2) +                   &
3351                    ( paero(ib)%volc(6) * ( arhohno3/amhno3 ) ) / zbinmol(6)
3352!
3353!--          Particle wet diameter (m)
3354             zdwet = ( zlwc / paero(ib)%numc / arhoh2o / api6 + ( SUM( zvpart(6:7) ) / api6 ) +    &
3355                       zcore / api6 )**0.33333333_wp
3356!
3357!--          Kelvin effect (Eq. 10.85 in in Seinfeld and Pandis (2006)). Avoid
3358!--          overflow.
3359             zke = EXP( MIN( 50.0_wp, 4.0_wp * surfw0 * amvh2so4 / ( abo * ptemp *  zdwet ) ) )
3360
3361             counti = counti + 1
3362             IF ( counti > 1000 )  THEN
3363                message_string = 'Subrange 1: no convergence!'
3364                CALL message( 'salsa_mod: equilibration', 'PA0617', 1, 2, 0, 6, 0 )
3365             ENDIF
3366          ENDDO
3367!
3368!--       Instead of lwc, use the volume concentration of water from now on
3369!--       (easy to convert...)
3370          paero(ib)%volc(8) = zlwc / arhoh2o
3371!
3372!--       If this is initialization, update the core and wet diameter
3373          IF ( init )  THEN
3374             paero(ib)%dwet = zdwet
3375             paero(ib)%core = zcore
3376          ENDIF
3377
3378       ELSE
3379!--       If initialization
3380!--       1.2) empty bins given bin average values
3381          IF ( init )  THEN
3382             paero(ib)%dwet = paero(ib)%dmid
3383             paero(ib)%core = api6 * paero(ib)%dmid**3
3384          ENDIF
3385
3386       ENDIF
3387
3388    ENDDO  ! ib
3389!
3390!-- 2) Regime 2a: sulphate, OC, BC and sea salt
3391!--    This is done only for initialization call, otherwise the water contents
3392!--    are computed via condensation
3393    IF ( init )  THEN
3394       DO  ib = start_subrange_2a, end_subrange_2b
3395!
3396!--       Initialize
3397          zke     = 1.02_wp
3398          zbinmol = 0.0_wp
3399          zdold   = 1.0_wp
3400!
3401!--       1) Particle properties calculated for non-empty bins
3402          IF ( paero(ib)%numc > nclim )  THEN
3403!
3404!--          Volume in one particle [fxm]
3405             zvpart = 0.0_wp
3406             zvpart(1:7) = paero(ib)%volc(1:7) / paero(ib)%numc
3407!
3408!--          Total volume and wet diameter of one dry particle [fxm]
3409             zcore = SUM( zvpart(1:5) )
3410             zdwet = paero(ib)%dwet
3411
3412             counti = 0
3413             DO  WHILE ( ABS( zdwet / zdold - 1.0_wp ) > 1.0E-12_wp )
3414
3415                zdold = MAX( zdwet, 1.0E-20_wp )
3416                zaw = zrh / zke
3417!
3418!--             Binary molalities (mol/kg):
3419!--             Sulphate
3420                zbinmol(1) = 1.1065495E+2_wp - 3.6759197E+2_wp * zaw + 5.0462934E+2_wp * zaw**2 -  &
3421                             3.1543839E+2_wp * zaw**3 + 6.770824E+1_wp  * zaw**4
3422!--             Organic carbon
3423                zbinmol(2) = 1.0_wp / ( zaw * amh2o ) - 1.0_wp / amh2o
3424!--             Nitric acid
3425                zbinmol(6) = 2.306844303E+1_wp          - 3.563608869E+1_wp * zaw -                &
3426                             6.210577919E+1_wp * zaw**2 + 5.510176187E+2_wp * zaw**3 -             &
3427                             1.460055286E+3_wp * zaw**4 + 1.894467542E+3_wp * zaw**5 -             &
3428                             1.220611402E+3_wp * zaw**6 + 3.098597737E+2_wp * zaw**7 
3429!--             Sea salt (natrium chloride)
3430                zbinmol(5) = 5.875248E+1_wp - 1.8781997E+2_wp * zaw + 2.7211377E+2_wp * zaw**2 -   &
3431                             1.8458287E+2_wp * zaw**3 + 4.153689E+1_wp  * zaw**4
3432!
3433!--             Calculate the liquid water content (kg/m3-air)
3434                zlwc = ( paero(ib)%volc(1) * ( arhoh2so4 / amh2so4 ) ) / zbinmol(1) +              &
3435                       epsoc * ( paero(ib)%volc(2) * ( arhooc / amoc ) ) / zbinmol(2) +            &
3436                       ( paero(ib)%volc(6) * ( arhohno3 / amhno3 ) ) / zbinmol(6) +                &
3437                       ( paero(ib)%volc(5) * ( arhoss / amss ) ) / zbinmol(5)
3438
3439!--             Particle wet radius (m)
3440                zdwet = ( zlwc / paero(ib)%numc / arhoh2o / api6 + ( SUM( zvpart(6:7) ) / api6 )  + &
3441                           zcore / api6 )**0.33333333_wp
3442!
3443!--             Kelvin effect (Eq. 10.85 in Seinfeld and Pandis (2006))
3444                zke = EXP( MIN( 50.0_wp, 4.0_wp * surfw0 * amvh2so4 / ( abo * zdwet * ptemp ) ) )
3445
3446                counti = counti + 1
3447                IF ( counti > 1000 )  THEN
3448                   message_string = 'Subrange 2: no convergence!'
3449                CALL message( 'salsa_mod: equilibration', 'PA0618', 1, 2, 0, 6, 0 )
3450                ENDIF
3451             ENDDO
3452!
3453!--          Liquid water content; instead of LWC use the volume concentration
3454             paero(ib)%volc(8) = zlwc / arhoh2o
3455             paero(ib)%dwet    = zdwet
3456             paero(ib)%core    = zcore
3457
3458          ELSE
3459!--          2.2) empty bins given bin average values
3460             paero(ib)%dwet = paero(ib)%dmid
3461             paero(ib)%core = api6 * paero(ib)%dmid**3
3462          ENDIF
3463
3464       ENDDO   ! ib
3465    ENDIF
3466
3467 END SUBROUTINE equilibration
3468
3469!------------------------------------------------------------------------------!
3470!> Description:
3471!> ------------
3472!> Calculation of the settling velocity vc (m/s) per aerosol size bin and
3473!> deposition on plant canopy (lsdepo_pcm).
3474!
3475!> Deposition is based on either the scheme presented in:
3476!> Zhang et al. (2001), Atmos. Environ. 35, 549-560 (includes collection due to
3477!> Brownian diffusion, impaction, interception and sedimentation; hereafter ZO1)
3478!> OR
3479!> Petroff & Zhang (2010), Geosci. Model Dev. 3, 753-769 (includes also
3480!> collection due to turbulent impaction, hereafter P10)
3481!
3482!> Equation numbers refer to equation in Jacobson (2005): Fundamentals of
3483!> Atmospheric Modeling, 2nd Edition.
3484!
3485!> Subroutine follows closely sedim_SALSA in UCLALES-SALSA written by Juha
3486!> Tonttila (KIT/FMI) and Zubair Maalick (UEF).
3487!> Rewritten to PALM by Mona Kurppa (UH), 2017.
3488!
3489!> Call for grid point i,j,k
3490!------------------------------------------------------------------------------!
3491
3492 SUBROUTINE deposition( paero, tk, adn, mag_u, lad, kvis, schmidt_num, vc )
3493
3494    USE plant_canopy_model_mod,                                                &
3495        ONLY: cdc
3496
3497    IMPLICIT NONE
3498
3499    INTEGER(iwp) ::  ib   !< loop index
3500    INTEGER(iwp) ::  ic   !< loop index
3501
3502    REAL(wp) ::  alpha             !< parameter, Table 3 in Z01
3503    REAL(wp) ::  avis              !< molecular viscocity of air (kg/(m*s))
3504    REAL(wp) ::  beta_im           !< parameter for turbulent impaction
3505    REAL(wp) ::  c_brownian_diff   !< coefficient for Brownian diffusion
3506    REAL(wp) ::  c_impaction       !< coefficient for inertial impaction
3507    REAL(wp) ::  c_interception    !< coefficient for interception
3508    REAL(wp) ::  c_turb_impaction  !< coefficient for turbulent impaction
3509    REAL(wp) ::  depo              !< deposition velocity (m/s)
3510    REAL(wp) ::  gamma             !< parameter, Table 3 in Z01
3511    REAL(wp) ::  lambda            !< molecular mean free path (m)
3512    REAL(wp) ::  mdiff             !< particle diffusivity coefficient
3513    REAL(wp) ::  par_a             !< parameter A for the characteristic radius of collectors,
3514                                   !< Table 3 in Z01
3515    REAL(wp) ::  par_l             !< obstacle characteristic dimension in P10
3516    REAL(wp) ::  pdn               !< particle density (kg/m3)
3517    REAL(wp) ::  ustar             !< friction velocity (m/s)
3518    REAL(wp) ::  va                !< thermal speed of an air molecule (m/s)
3519
3520    REAL(wp), INTENT(in) ::  adn    !< air density (kg/m3)
3521    REAL(wp), INTENT(in) ::  lad    !< leaf area density (m2/m3)
3522    REAL(wp), INTENT(in) ::  mag_u  !< wind velocity (m/s)
3523    REAL(wp), INTENT(in) ::  tk     !< abs.temperature (K)
3524
3525    REAL(wp), INTENT(inout) ::  kvis   !< kinematic viscosity of air (m2/s)
3526
3527    REAL(wp), DIMENSION(nbins_aerosol) ::  beta   !< Cunningham slip-flow correction factor
3528    REAL(wp), DIMENSION(nbins_aerosol) ::  Kn     !< Knudsen number
3529    REAL(wp), DIMENSION(nbins_aerosol) ::  zdwet  !< wet diameter (m)
3530
3531    REAL(wp), DIMENSION(:), INTENT(inout) ::  schmidt_num  !< particle Schmidt number
3532    REAL(wp), DIMENSION(:), INTENT(inout) ::  vc  !< critical fall speed i.e. settling velocity of
3533                                                  !< an aerosol particle (m/s)
3534
3535    TYPE(t_section), DIMENSION(nbins_aerosol), INTENT(inout) ::  paero  !< aerosol properties
3536!
3537!-- Initialise
3538    depo  = 0.0_wp
3539    pdn   = 1500.0_wp    ! default value
3540    ustar = 0.0_wp
3541!
3542!-- Molecular viscosity of air (Eq. 4.54)
3543    avis = 1.8325E-5_wp * ( 416.16_wp / ( tk + 120.0_wp ) ) * ( tk / 296.16_wp )**1.5_wp
3544!
3545!-- Kinematic viscosity (Eq. 4.55)
3546    kvis =  avis / adn
3547!
3548!-- Thermal velocity of an air molecule (Eq. 15.32)
3549    va = SQRT( 8.0_wp * abo * tk / ( pi * am_airmol ) )
3550!
3551!-- Mean free path (m) (Eq. 15.24)
3552    lambda = 2.0_wp * avis / ( adn * va )
3553!
3554!-- Particle wet diameter (m)
3555    zdwet = paero(:)%dwet
3556!
3557!-- Knudsen number (Eq. 15.23)
3558    Kn = MAX( 1.0E-2_wp, lambda / ( zdwet * 0.5_wp ) ) ! To avoid underflow
3559!
3560!-- Cunningham slip-flow correction (Eq. 15.30)
3561    beta = 1.0_wp + Kn * ( 1.249_wp + 0.42_wp * EXP( -0.87_wp / Kn ) )
3562!
3563!-- Critical fall speed i.e. settling velocity  (Eq. 20.4)
3564    vc = MIN( 1.0_wp, zdwet**2 * ( pdn - adn ) * g * beta / ( 18.0_wp * avis ) )
3565!
3566!-- Deposition on vegetation
3567    IF ( lsdepo_pcm  .AND.  plant_canopy  .AND.  lad > 0.0_wp )  THEN
3568!
3569!--    Parameters for the land use category 'deciduous broadleaf trees'(Table 3)
3570       alpha   = alpha_z01(depo_pcm_type_num)
3571       gamma   = gamma_z01(depo_pcm_type_num)
3572       par_a   = A_z01(depo_pcm_type_num, season) * 1.0E-3_wp
3573!
3574!--    Deposition efficiencies from Table 1. Constants from Table 2.
3575       par_l            = l_p10(depo_pcm_type_num) * 0.01_wp
3576       c_brownian_diff  = c_b_p10(depo_pcm_type_num)
3577       c_interception   = c_in_p10(depo_pcm_type_num)
3578       c_impaction      = c_im_p10(depo_pcm_type_num)
3579       beta_im          = beta_im_p10(depo_pcm_type_num)
3580       c_turb_impaction = c_it_p10(depo_pcm_type_num)
3581
3582       DO  ib = 1, nbins_aerosol
3583
3584          IF ( paero(ib)%numc < ( 2.0_wp * nclim ) )  CYCLE
3585
3586!--       Particle diffusivity coefficient (Eq. 15.29)
3587          mdiff = ( abo * tk * beta(ib) ) / ( 3.0_wp * pi * avis * zdwet(ib) )
3588!
3589!--       Particle Schmidt number (Eq. 15.36)
3590          schmidt_num(ib) = kvis / mdiff
3591!
3592!--       Friction velocity for deposition on vegetation. Calculated following Prandtl (1925):
3593          ustar = SQRT( cdc ) * mag_u
3594          SELECT CASE ( depo_pcm_par_num )
3595
3596             CASE ( 1 )   ! Zhang et al. (2001)
3597                CALL depo_vel_Z01( vc(ib), ustar, schmidt_num(ib), paero(ib)%dwet, alpha,  gamma,  &
3598                                   par_a, depo )
3599             CASE ( 2 )   ! Petroff & Zhang (2010)
3600                CALL depo_vel_P10( vc(ib), mag_u, ustar, kvis, schmidt_num(ib), paero(ib)%dwet,    &
3601                                   par_l, c_brownian_diff, c_interception, c_impaction, beta_im,   &
3602                                   c_turb_impaction, depo )
3603          END SELECT
3604!
3605!--       Calculate the change in concentrations
3606          paero(ib)%numc = paero(ib)%numc - depo * lad * paero(ib)%numc * dt_salsa
3607          DO  ic = 1, maxspec+1
3608             paero(ib)%volc(ic) = paero(ib)%volc(ic) - depo * lad * paero(ib)%volc(ic) * dt_salsa
3609          ENDDO
3610       ENDDO
3611
3612    ENDIF
3613
3614 END SUBROUTINE deposition
3615
3616!------------------------------------------------------------------------------!
3617! Description:
3618! ------------
3619!> Calculate deposition velocity (m/s) based on Zhan et al. (2001, case 1).
3620!------------------------------------------------------------------------------!
3621
3622 SUBROUTINE depo_vel_Z01( vc, ustar, schmidt_num, diameter, alpha, gamma, par_a, depo )
3623
3624    IMPLICIT NONE
3625
3626    REAL(wp) ::  rs                !< overall quasi-laminar resistance for particles
3627    REAL(wp) ::  stokes_num        !< Stokes number for smooth or bluff surfaces
3628
3629    REAL(wp), INTENT(in) ::  alpha        !< parameter, Table 3 in Z01
3630    REAL(wp), INTENT(in) ::  gamma        !< parameter, Table 3 in Z01
3631    REAL(wp), INTENT(in) ::  par_a        !< parameter A for the characteristic diameter of
3632                                          !< collectors, Table 3 in Z01
3633    REAL(wp), INTENT(in) ::  diameter     !< particle diameter
3634    REAL(wp), INTENT(in) ::  schmidt_num  !< particle Schmidt number
3635    REAL(wp), INTENT(in) ::  ustar        !< friction velocity (m/s)
3636    REAL(wp), INTENT(in) ::  vc           !< terminal velocity (m/s)
3637
3638    REAL(wp), INTENT(inout)  ::  depo     !< deposition efficiency (m/s)
3639
3640    IF ( par_a > 0.0_wp )  THEN
3641!
3642!--    Initialise
3643       rs = 0.0_wp
3644!
3645!--    Stokes number for vegetated surfaces (Seinfeld & Pandis (2006): Eq.19.24)
3646       stokes_num = vc * ustar / ( g * par_a )
3647!
3648!--    The overall quasi-laminar resistance for particles (Zhang et al., Eq. 5)
3649       rs = MAX( EPSILON( 1.0_wp ), ( 3.0_wp * ustar * EXP( -stokes_num**0.5_wp ) *                &
3650                 ( schmidt_num**( -gamma ) + ( stokes_num / ( alpha + stokes_num ) )**2 +          &
3651                 0.5_wp * ( diameter / par_a )**2 ) ) )
3652
3653       depo = rs + vc
3654
3655    ELSE
3656       depo = 0.0_wp
3657    ENDIF
3658
3659 END SUBROUTINE depo_vel_Z01
3660
3661!------------------------------------------------------------------------------!
3662! Description:
3663! ------------
3664!> Calculate deposition velocity (m/s) based on Petroff & Zhang (2010, case 2).
3665!------------------------------------------------------------------------------!
3666
3667 SUBROUTINE depo_vel_P10( vc, mag_u, ustar, kvis_a, schmidt_num, diameter, par_l, c_brownian_diff, &
3668                          c_interception, c_impaction, beta_im, c_turb_impaction, depo )
3669
3670    IMPLICIT NONE
3671
3672    REAL(wp) ::  stokes_num        !< Stokes number for smooth or bluff surfaces
3673    REAL(wp) ::  tau_plus          !< dimensionless particle relaxation time
3674    REAL(wp) ::  v_bd              !< deposition velocity due to Brownian diffusion
3675    REAL(wp) ::  v_im              !< deposition velocity due to impaction
3676    REAL(wp) ::  v_in              !< deposition velocity due to interception
3677    REAL(wp) ::  v_it              !< deposition velocity due to turbulent impaction
3678
3679    REAL(wp), INTENT(in) ::  beta_im           !< parameter for turbulent impaction
3680    REAL(wp), INTENT(in) ::  c_brownian_diff   !< coefficient for Brownian diffusion
3681    REAL(wp), INTENT(in) ::  c_impaction       !< coefficient for inertial impaction
3682    REAL(wp), INTENT(in) ::  c_interception    !< coefficient for interception
3683    REAL(wp), INTENT(in) ::  c_turb_impaction  !< coefficient for turbulent impaction
3684    REAL(wp), INTENT(in) ::  kvis_a       !< kinematic viscosity of air (m2/s)
3685    REAL(wp), INTENT(in) ::  mag_u        !< wind velocity (m/s)
3686    REAL(wp), INTENT(in) ::  par_l        !< obstacle characteristic dimension in P10
3687    REAL(wp), INTENT(in) ::  diameter       !< particle diameter
3688    REAL(wp), INTENT(in) ::  schmidt_num  !< particle Schmidt number
3689    REAL(wp), INTENT(in) ::  ustar        !< friction velocity (m/s)
3690    REAL(wp), INTENT(in) ::  vc           !< terminal velocity (m/s)
3691
3692    REAL(wp), INTENT(inout)  ::  depo     !< deposition efficiency (m/s)
3693
3694    IF ( par_l > 0.0_wp )  THEN
3695!
3696!--    Initialise
3697       tau_plus = 0.0_wp
3698       v_bd     = 0.0_wp
3699       v_im     = 0.0_wp
3700       v_in     = 0.0_wp
3701       v_it     = 0.0_wp
3702!
3703!--    Stokes number for vegetated surfaces (Seinfeld & Pandis (2006): Eq.19.24)
3704       stokes_num = vc * ustar / ( g * par_l )
3705!
3706!--    Non-dimensional relexation time of the particle on top of canopy
3707       tau_plus = vc * ustar**2 / ( kvis_a * g )
3708!
3709!--    Brownian diffusion
3710       v_bd = mag_u * c_brownian_diff * schmidt_num**( -0.66666666_wp ) *                             &
3711              ( mag_u * par_l / kvis_a )**( -0.5_wp )
3712!
3713!--    Interception
3714       v_in = mag_u * c_interception * diameter / par_l * ( 2.0_wp + LOG( 2.0_wp * par_l / diameter ) )
3715!
3716!--    Impaction: Petroff (2009) Eq. 18
3717       v_im = mag_u * c_impaction * ( stokes_num / ( stokes_num + beta_im ) )**2
3718!
3719!--    Turbulent impaction
3720       IF ( tau_plus < 20.0_wp )  THEN
3721          v_it = 2.5E-3_wp * c_turb_impaction * tau_plus**2
3722       ELSE
3723          v_it = c_turb_impaction
3724       ENDIF
3725
3726       depo = ( v_bd + v_in + v_im + v_it + vc )
3727
3728    ELSE
3729       depo = 0.0_wp
3730    ENDIF
3731
3732 END SUBROUTINE depo_vel_P10
3733
3734!------------------------------------------------------------------------------!
3735! Description:
3736! ------------
3737!> Calculate the dry deposition on horizontal and vertical surfaces. Implement
3738!> as a surface flux.
3739!> @todo aerodynamic resistance ignored for now (not important for
3740!        high-resolution simulations)
3741!------------------------------------------------------------------------------!
3742 SUBROUTINE depo_surf( i, j, surf, vc, schmidt_num, kvis, mag_u, norm, match_array )
3743
3744    USE arrays_3d,                                                                                 &
3745        ONLY: rho_air_zw
3746
3747    USE surface_mod,                                                                               &
3748        ONLY:  ind_pav_green, ind_veg_wall, ind_wat_win, surf_type
3749
3750    IMPLICIT NONE
3751
3752    INTEGER(iwp) ::  ib      !< loop index
3753    INTEGER(iwp) ::  ic      !< loop index
3754    INTEGER(iwp) ::  icc     !< additional loop index
3755    INTEGER(iwp) ::  k       !< loop index
3756    INTEGER(iwp) ::  m       !< loop index
3757    INTEGER(iwp) ::  surf_e  !< End index of surface elements at (j,i)-gridpoint
3758    INTEGER(iwp) ::  surf_s  !< Start index of surface elements at (j,i)-gridpoint
3759
3760    INTEGER(iwp), INTENT(in) ::  i  !< loop index
3761    INTEGER(iwp), INTENT(in) ::  j  !< loop index
3762
3763    LOGICAL, INTENT(in) ::  norm   !< to normalise or not
3764
3765    REAL(wp) ::  alpha             !< parameter, Table 3 in Z01
3766    REAL(wp) ::  beta_im           !< parameter for turbulent impaction
3767    REAL(wp) ::  c_brownian_diff   !< coefficient for Brownian diffusion
3768    REAL(wp) ::  c_impaction       !< coefficient for inertial impaction
3769    REAL(wp) ::  c_interception    !< coefficient for interception
3770    REAL(wp) ::  c_turb_impaction  !< coefficient for turbulent impaction
3771    REAL(wp) ::  gamma             !< parameter, Table 3 in Z01
3772    REAL(wp) ::  norm_fac          !< normalisation factor (usually air density)
3773    REAL(wp) ::  par_a             !< parameter A for the characteristic radius of collectors,
3774                                   !< Table 3 in Z01
3775    REAL(wp) ::  par_l             !< obstacle characteristic dimension in P10
3776    REAL(wp) ::  rs                !< the overall quasi-laminar resistance for particles
3777    REAL(wp) ::  tau_plus          !< dimensionless particle relaxation time
3778    REAL(wp) ::  v_bd              !< deposition velocity due to Brownian diffusion
3779    REAL(wp) ::  v_im              !< deposition velocity due to impaction
3780    REAL(wp) ::  v_in              !< deposition velocity due to interception
3781    REAL(wp) ::  v_it              !< deposition velocity due to turbulent impaction
3782
3783    REAL(wp), DIMENSION(nbins_aerosol) ::  depo      !< deposition efficiency
3784    REAL(wp), DIMENSION(nbins_aerosol) ::  depo_sum  !< sum of deposition efficiencies
3785
3786    REAL(wp), DIMENSION(:), INTENT(in) ::  kvis   !< kinematic viscosity of air (m2/s)
3787    REAL(wp), DIMENSION(:), INTENT(in) ::  mag_u  !< wind velocity (m/s)
3788
3789    REAL(wp), DIMENSION(:,:), INTENT(in) ::  schmidt_num   !< particle Schmidt number
3790    REAL(wp), DIMENSION(:,:), INTENT(in) ::  vc            !< terminal velocity (m/s)
3791
3792    TYPE(match_surface), INTENT(in), OPTIONAL ::  match_array  !< match the deposition module and
3793                                                               !< LSM/USM surfaces
3794    TYPE(surf_type), INTENT(inout) :: surf                     !< respective surface type
3795!
3796!-- Initialise
3797    depo     = 0.0_wp
3798    depo_sum = 0.0_wp
3799    rs       = 0.0_wp
3800    surf_s   = surf%start_index(j,i)
3801    surf_e   = surf%end_index(j,i)
3802    tau_plus = 0.0_wp
3803    v_bd     = 0.0_wp
3804    v_im     = 0.0_wp
3805    v_in     = 0.0_wp
3806    v_it     = 0.0_wp
3807!
3808!-- Model parameters for the land use category. If LSM or USM is applied, import
3809!-- characteristics. Otherwise, apply surface type "urban".
3810    alpha   = alpha_z01(luc_urban)
3811    gamma   = gamma_z01(luc_urban)
3812    par_a   = A_z01(luc_urban, season) * 1.0E-3_wp
3813
3814    par_l            = l_p10(luc_urban) * 0.01_wp
3815    c_brownian_diff  = c_b_p10(luc_urban)
3816    c_interception   = c_in_p10(luc_urban)
3817    c_impaction      = c_im_p10(luc_urban)
3818    beta_im          = beta_im_p10(luc_urban)
3819    c_turb_impaction = c_it_p10(luc_urban)
3820
3821
3822    IF ( PRESENT( match_array ) )  THEN  ! land or urban surface model
3823
3824       DO  m = surf_s, surf_e
3825
3826          k = surf%k(m)
3827          norm_fac = 1.0_wp
3828
3829          IF ( norm )  norm_fac = rho_air_zw(k)  ! normalise vertical fluxes by air density
3830
3831          IF ( match_array%match_lupg(m) > 0 )  THEN
3832             alpha = alpha_z01( match_array%match_lupg(m) )
3833             gamma = gamma_z01( match_array%match_lupg(m) )
3834             par_a = A_z01( match_array%match_lupg(m), season ) * 1.0E-3_wp
3835
3836             beta_im          = beta_im_p10( match_array%match_lupg(m) )
3837             c_brownian_diff  = c_b_p10( match_array%match_lupg(m) )
3838             c_impaction      = c_im_p10( match_array%match_lupg(m) )
3839             c_interception   = c_in_p10( match_array%match_lupg(m) )
3840             c_turb_impaction = c_it_p10( match_array%match_lupg(m) )
3841             par_l            = l_p10( match_array%match_lupg(m) ) * 0.01_wp
3842
3843             DO  ib = 1, nbins_aerosol
3844                IF ( aerosol_number(ib)%conc(k,j,i) < ( 2.0_wp * nclim )  .OR.                     &
3845                     schmidt_num(k+1,ib) < 1.0_wp )  CYCLE
3846
3847                SELECT CASE ( depo_surf_par_num )
3848
3849                   CASE ( 1 )
3850                      CALL depo_vel_Z01( vc(k+1,ib), surf%us(m), schmidt_num(k+1,ib),              &
3851                                         ra_dry(k,j,i,ib), alpha, gamma, par_a, depo(ib) )
3852                   CASE ( 2 )
3853                      CALL depo_vel_P10( vc(k+1,ib), mag_u(k+1), surf%us(m), kvis(k+1),            &
3854                                         schmidt_num(k+1,ib), ra_dry(k,j,i,ib), par_l,             &
3855                                         c_brownian_diff, c_interception, c_impaction, beta_im,    &
3856                                         c_turb_impaction, depo(ib) )
3857                END SELECT
3858             ENDDO
3859             depo_sum = depo_sum + surf%frac(ind_pav_green,m) * depo
3860          ENDIF
3861
3862          IF ( match_array%match_luvw(m) > 0 )  THEN
3863             alpha = alpha_z01( match_array%match_luvw(m) )
3864             gamma = gamma_z01( match_array%match_luvw(m) )
3865             par_a = A_z01( match_array%match_luvw(m), season ) * 1.0E-3_wp
3866
3867             beta_im          = beta_im_p10( match_array%match_luvw(m) )
3868             c_brownian_diff  = c_b_p10( match_array%match_luvw(m) )
3869             c_impaction      = c_im_p10( match_array%match_luvw(m) )
3870             c_interception   = c_in_p10( match_array%match_luvw(m) )
3871             c_turb_impaction = c_it_p10( match_array%match_luvw(m) )
3872             par_l            = l_p10( match_array%match_luvw(m) ) * 0.01_wp
3873
3874             DO  ib = 1, nbins_aerosol
3875                IF ( aerosol_number(ib)%conc(k,j,i) < ( 2.0_wp * nclim )  .OR.                     &
3876                     schmidt_num(k+1,ib) < 1.0_wp )  CYCLE
3877
3878                SELECT CASE ( depo_surf_par_num )
3879
3880                   CASE ( 1 )
3881                      CALL depo_vel_Z01( vc(k+1,ib), surf%us(m), schmidt_num(k+1,ib),              &
3882                                         ra_dry(k,j,i,ib), alpha, gamma, par_a, depo(ib) )
3883                   CASE ( 2 )
3884                      CALL depo_vel_P10( vc(k+1,ib), mag_u(k+1), surf%us(m), kvis(k+1),            &
3885                                         schmidt_num(k+1,ib), ra_dry(k,j,i,ib), par_l,             &
3886                                         c_brownian_diff, c_interception, c_impaction, beta_im,    &
3887                                         c_turb_impaction, depo(ib) )
3888                END SELECT
3889             ENDDO
3890             depo_sum = depo_sum + surf%frac(ind_veg_wall,m) * depo
3891          ENDIF
3892
3893          IF ( match_array%match_luww(m) > 0 )  THEN
3894             alpha = alpha_z01( match_array%match_luww(m) )
3895             gamma = gamma_z01( match_array%match_luww(m) )
3896             par_a = A_z01( match_array%match_luww(m), season ) * 1.0E-3_wp
3897
3898             beta_im          = beta_im_p10( match_array%match_luww(m) )
3899             c_brownian_diff  = c_b_p10( match_array%match_luww(m) )
3900             c_impaction      = c_im_p10( match_array%match_luww(m) )
3901             c_interception   = c_in_p10( match_array%match_luww(m) )
3902             c_turb_impaction = c_it_p10( match_array%match_luww(m) )
3903             par_l            = l_p10( match_array%match_luww(m) ) * 0.01_wp
3904
3905             DO  ib = 1, nbins_aerosol
3906                IF ( aerosol_number(ib)%conc(k,j,i) < ( 2.0_wp * nclim )  .OR.                     &
3907                     schmidt_num(k+1,ib) < 1.0_wp )  CYCLE
3908
3909                SELECT CASE ( depo_surf_par_num )
3910
3911                   CASE ( 1 )
3912                      CALL depo_vel_Z01( vc(k+1,ib), surf%us(m), schmidt_num(k+1,ib),              &
3913                                         ra_dry(k,j,i,ib), alpha, gamma, par_a, depo(ib) )
3914                   CASE ( 2 )
3915                      CALL depo_vel_P10( vc(k+1,ib), mag_u(k+1), surf%us(m), kvis(k+1),            &
3916                                         schmidt_num(k+1,ib), ra_dry(k,j,i,ib), par_l,             &
3917                                         c_brownian_diff, c_interception, c_impaction, beta_im,    &
3918                                         c_turb_impaction, depo(ib) )
3919                END SELECT
3920             ENDDO
3921             depo_sum = depo_sum + surf%frac(ind_wat_win,m) * depo
3922          ENDIF
3923
3924          DO  ib = 1, nbins_aerosol
3925             IF ( aerosol_number(ib)%conc(k,j,i) < ( 2.0_wp * nclim ) )  CYCLE
3926!
3927!--          Calculate changes in surface fluxes due to dry deposition
3928             IF ( include_emission )  THEN
3929                surf%answs(m,ib) = aerosol_number(ib)%source(j,i) - MAX( 0.0_wp,                   &
3930                                   depo_sum(ib) * norm_fac * aerosol_number(ib)%conc(k,j,i) )
3931                DO  ic = 1, ncomponents_mass
3932                   icc = ( ic - 1 ) * nbins_aerosol + ib
3933                   surf%amsws(m,icc) = aerosol_mass(icc)%source(j,i) - MAX( 0.0_wp,                &
3934                                       depo_sum(ib) *  norm_fac * aerosol_mass(icc)%conc(k,j,i) )
3935                ENDDO  ! ic
3936             ELSE
3937                surf%answs(m,ib) = -depo_sum(ib) * norm_fac * aerosol_number(ib)%conc(k,j,i)
3938                DO  ic = 1, ncomponents_mass
3939                   icc = ( ic - 1 ) * nbins_aerosol + ib
3940                   surf%amsws(m,icc) = -depo_sum(ib) *  norm_fac * aerosol_mass(icc)%conc(k,j,i)
3941                ENDDO  ! ic
3942             ENDIF
3943          ENDDO  ! ib
3944
3945       ENDDO
3946
3947    ELSE  ! default surfaces
3948
3949       DO  m = surf_s, surf_e
3950
3951          k = surf%k(m)
3952          norm_fac = 1.0_wp
3953
3954          IF ( norm )  norm_fac = rho_air_zw(k)  ! normalise vertical fluxes by air density
3955
3956          DO  ib = 1, nbins_aerosol
3957             IF ( aerosol_number(ib)%conc(k,j,i) < ( 2.0_wp * nclim )  .OR.                        &
3958                  schmidt_num(k+1,ib) < 1.0_wp )  CYCLE
3959
3960             SELECT CASE ( depo_surf_par_num )
3961
3962                CASE ( 1 )
3963                   CALL depo_vel_Z01( vc(k+1,ib), surf%us(m), schmidt_num(k+1,ib),                 &
3964                                      ra_dry(k,j,i,ib), alpha, gamma, par_a, depo(ib) )
3965                CASE ( 2 )
3966                   CALL depo_vel_P10( vc(k+1,ib), mag_u(k+1), surf%us(m), kvis(k+1),               &
3967                                      schmidt_num(k+1,ib), ra_dry(k,j,i,ib), par_l,                &
3968                                      c_brownian_diff, c_interception, c_impaction, beta_im,       &
3969                                      c_turb_impaction, depo(ib) )
3970             END SELECT
3971!
3972!--          Calculate changes in surface fluxes due to dry deposition
3973             IF ( include_emission )  THEN
3974                surf%answs(m,ib) = aerosol_number(ib)%source(j,i) - MAX( 0.0_wp,                   &
3975                                   depo(ib) * norm_fac * aerosol_number(ib)%conc(k,j,i) )
3976                DO  ic = 1, ncomponents_mass
3977                   icc = ( ic - 1 ) * nbins_aerosol + ib
3978                   surf%amsws(m,icc) = aerosol_mass(icc)%source(j,i) - MAX( 0.0_wp,                &
3979                                       depo(ib) *  norm_fac * aerosol_mass(icc)%conc(k,j,i) )
3980                ENDDO  ! ic
3981             ELSE
3982                surf%answs(m,ib) = -depo(ib) * norm_fac * aerosol_number(ib)%conc(k,j,i)
3983                DO  ic = 1, ncomponents_mass
3984                   icc = ( ic - 1 ) * nbins_aerosol + ib
3985                   surf%amsws(m,icc) = -depo(ib) *  norm_fac * aerosol_mass(icc)%conc(k,j,i)
3986                ENDDO  ! ic
3987             ENDIF
3988          ENDDO  ! ib
3989       ENDDO
3990
3991    ENDIF
3992
3993 END SUBROUTINE depo_surf
3994
3995!------------------------------------------------------------------------------!
3996! Description:
3997! ------------
3998!> Calculates particle loss and change in size distribution due to (Brownian)
3999!> coagulation. Only for particles with dwet < 30 micrometres.
4000!
4001!> Method:
4002!> Semi-implicit, non-iterative method: (Jacobson, 1994)
4003!> Volume concentrations of the smaller colliding particles added to the bin of
4004!> the larger colliding particles. Start from first bin and use the updated
4005!> number and volume for calculation of following bins. NB! Our bin numbering
4006!> does not follow particle size in subrange 2.
4007!
4008!> Schematic for bin numbers in different subranges:
4009!>             1                            2
4010!>    +-------------------------------------------+
4011!>  a | 1 | 2 | 3 || 4 | 5 | 6 | 7 |  8 |  9 | 10||
4012!>  b |           ||11 |12 |13 |14 | 15 | 16 | 17||
4013!>    +-------------------------------------------+
4014!
4015!> Exact coagulation coefficients for each pressure level are scaled according
4016!> to current particle wet size (linear scaling).
4017!> Bins are organized in terms of the dry size of the condensation nucleus,
4018!> while coagulation kernell is calculated with the actual hydrometeor
4019!> size.
4020!
4021!> Called from salsa_driver
4022!> fxm: Process selection should be made smarter - now just lots of IFs inside
4023!>      loops
4024!
4025!> Coded by:
4026!> Hannele Korhonen (FMI) 2005
4027!> Harri Kokkola (FMI) 2006
4028!> Tommi Bergman (FMI) 2012
4029!> Matti Niskanen(FMI) 2012
4030!> Anton Laakso  (FMI) 2013
4031!> Juha Tonttila (FMI) 2014
4032!------------------------------------------------------------------------------!
4033 SUBROUTINE coagulation( paero, ptstep, ptemp, ppres )
4034
4035    IMPLICIT NONE
4036
4037    INTEGER(iwp) ::  index_2a !< corresponding bin in subrange 2a
4038    INTEGER(iwp) ::  index_2b !< corresponding bin in subrange 2b
4039    INTEGER(iwp) ::  ib       !< loop index
4040    INTEGER(iwp) ::  ll       !< loop index
4041    INTEGER(iwp) ::  mm       !< loop index
4042    INTEGER(iwp) ::  nn       !< loop index
4043
4044    REAL(wp) ::  pressi          !< pressure
4045    REAL(wp) ::  temppi          !< temperature
4046    REAL(wp) ::  zdpart_mm       !< diameter of particle (m)
4047    REAL(wp) ::  zdpart_nn       !< diameter of particle (m)
4048    REAL(wp) ::  zminusterm      !< coagulation loss in a bin (1/s)
4049
4050    REAL(wp), INTENT(in) ::  ppres  !< ambient pressure (Pa)
4051    REAL(wp), INTENT(in) ::  ptemp  !< ambient temperature (K)
4052    REAL(wp), INTENT(in) ::  ptstep !< time step (s)
4053
4054    REAL(wp), DIMENSION(nbins_aerosol) ::  zmpart     !< approximate mass of particles (kg)
4055    REAL(wp), DIMENSION(maxspec+1)     ::  zplusterm  !< coagulation gain in a bin (for each
4056                                                      !< chemical compound)
4057    REAL(wp), DIMENSION(nbins_aerosol,nbins_aerosol) ::  zcc  !< updated coagulation coefficients (m3/s)
4058
4059    TYPE(t_section), DIMENSION(nbins_aerosol), INTENT(inout) ::  paero  !< Aerosol properties
4060
4061    zdpart_mm = 0.0_wp
4062    zdpart_nn = 0.0_wp
4063!
4064!-- 1) Coagulation to coarse mode calculated in a simplified way:
4065!--    CoagSink ~ Dp in continuum subrange, thus we calculate 'effective'
4066!--    number concentration of coarse particles
4067
4068!-- 2) Updating coagulation coefficients
4069!
4070!-- Aerosol mass (kg). Density of 1500 kg/m3 assumed
4071    zmpart(1:end_subrange_2b) = api6 * ( MIN( paero(1:end_subrange_2b)%dwet, 30.0E-6_wp )**3 )     &
4072                                * 1500.0_wp
4073    temppi = ptemp
4074    pressi = ppres
4075    zcc    = 0.0_wp
4076!
4077!-- Aero-aero coagulation
4078    DO  mm = 1, end_subrange_2b   ! smaller colliding particle
4079       IF ( paero(mm)%numc < ( 2.0_wp * nclim ) )  CYCLE
4080       DO  nn = mm, end_subrange_2b   ! larger colliding particle
4081          IF ( paero(nn)%numc < ( 2.0_wp * nclim ) )  CYCLE
4082
4083          zdpart_mm = MIN( paero(mm)%dwet, 30.0E-6_wp )     ! Limit to 30 um
4084          zdpart_nn = MIN( paero(nn)%dwet, 30.0E-6_wp )     ! Limit to 30 um
4085!
4086!--       Coagulation coefficient of particles (m3/s)
4087          zcc(mm,nn) = coagc( zdpart_mm, zdpart_nn, zmpart(mm), zmpart(nn), temppi, pressi )
4088          zcc(nn,mm) = zcc(mm,nn)
4089       ENDDO
4090    ENDDO
4091
4092!
4093!-- 3) New particle and volume concentrations after coagulation:
4094!--    Calculated according to Jacobson (2005) eq. 15.9
4095!
4096!-- Aerosols in subrange 1a:
4097    DO  ib = start_subrange_1a, end_subrange_1a
4098       IF ( paero(ib)%numc < ( 2.0_wp * nclim ) )  CYCLE
4099       zminusterm   = 0.0_wp
4100       zplusterm(:) = 0.0_wp
4101!
4102!--    Particles lost by coagulation with larger aerosols
4103       DO  ll = ib+1, end_subrange_2b
4104          zminusterm = zminusterm + zcc(ib,ll) * paero(ll)%numc
4105       ENDDO
4106!
4107!--    Coagulation gain in a bin: change in volume conc. (cm3/cm3):
4108       DO ll = start_subrange_1a, ib - 1
4109          zplusterm(1:2) = zplusterm(1:2) + zcc(ll,ib) * paero(ll)%volc(1:2)
4110          zplusterm(6:7) = zplusterm(6:7) + zcc(ll,ib) * paero(ll)%volc(6:7)
4111          zplusterm(8)   = zplusterm(8)   + zcc(ll,ib) * paero(ll)%volc(8)
4112       ENDDO
4113!
4114!--    Volume and number concentrations after coagulation update [fxm]
4115       paero(ib)%volc(1:2) = ( paero(ib)%volc(1:2) + ptstep * zplusterm(1:2) * paero(ib)%numc ) /  &
4116                            ( 1.0_wp + ptstep * zminusterm )
4117       paero(ib)%volc(6:8) = ( paero(ib)%volc(6:8) + ptstep * zplusterm(6:8) * paero(ib)%numc ) /  &
4118                            ( 1.0_wp + ptstep * zminusterm )
4119       paero(ib)%numc = paero(ib)%numc / ( 1.0_wp + ptstep * zminusterm + 0.5_wp * ptstep *        &
4120                        zcc(ib,ib) * paero(ib)%numc )
4121    ENDDO
4122!
4123!-- Aerosols in subrange 2a:
4124    DO  ib = start_subrange_2a, end_subrange_2a
4125       IF ( paero(ib)%numc < ( 2.0_wp * nclim ) )  CYCLE
4126       zminusterm   = 0.0_wp
4127       zplusterm(:) = 0.0_wp
4128!
4129!--    Find corresponding size bin in subrange 2b
4130       index_2b = ib - start_subrange_2a + start_subrange_2b
4131!
4132!--    Particles lost by larger particles in 2a
4133       DO  ll = ib+1, end_subrange_2a
4134          zminusterm = zminusterm + zcc(ib,ll) * paero(ll)%numc
4135       ENDDO
4136!
4137!--    Particles lost by larger particles in 2b
4138       IF ( .NOT. no_insoluble )  THEN
4139          DO  ll = index_2b+1, end_subrange_2b
4140             zminusterm = zminusterm + zcc(ib,ll) * paero(ll)%numc
4141          ENDDO
4142       ENDIF
4143!
4144!--    Particle volume gained from smaller particles in subranges 1, 2a and 2b
4145       DO  ll = start_subrange_1a, ib-1
4146          zplusterm(1:2) = zplusterm(1:2) + zcc(ll,ib) * paero(ll)%volc(1:2)
4147          zplusterm(6:8) = zplusterm(6:8) + zcc(ll,ib) * paero(ll)%volc(6:8)
4148       ENDDO
4149!
4150!--    Particle volume gained from smaller particles in 2a
4151!--    (Note, for components not included in the previous loop!)
4152       DO  ll = start_subrange_2a, ib-1
4153          zplusterm(3:5) = zplusterm(3:5) + zcc(ll,ib)*paero(ll)%volc(3:5)
4154       ENDDO
4155!
4156!--    Particle volume gained from smaller (and equal) particles in 2b
4157       IF ( .NOT. no_insoluble )  THEN
4158          DO  ll = start_subrange_2b, index_2b
4159             zplusterm(1:8) = zplusterm(1:8) + zcc(ll,ib) * paero(ll)%volc(1:8)
4160          ENDDO
4161       ENDIF
4162!
4163!--    Volume and number concentrations after coagulation update [fxm]
4164       paero(ib)%volc(1:8) = ( paero(ib)%volc(1:8) + ptstep * zplusterm(1:8) * paero(ib)%numc ) /  &
4165                            ( 1.0_wp + ptstep * zminusterm )
4166       paero(ib)%numc = paero(ib)%numc / ( 1.0_wp + ptstep * zminusterm + 0.5_wp * ptstep *        &
4167                        zcc(ib,ib) * paero(ib)%numc )
4168    ENDDO
4169!
4170!-- Aerosols in subrange 2b:
4171    IF ( .NOT. no_insoluble )  THEN
4172       DO  ib = start_subrange_2b, end_subrange_2b
4173          IF ( paero(ib)%numc < ( 2.0_wp * nclim ) )  CYCLE
4174          zminusterm   = 0.0_wp
4175          zplusterm(:) = 0.0_wp
4176!
4177!--       Find corresponding size bin in subsubrange 2a
4178          index_2a = ib - start_subrange_2b + start_subrange_2a
4179!
4180!--       Particles lost to larger particles in subranges 2b
4181          DO  ll = ib + 1, end_subrange_2b
4182             zminusterm = zminusterm + zcc(ib,ll) * paero(ll)%numc
4183          ENDDO
4184!
4185!--       Particles lost to larger and equal particles in 2a
4186          DO  ll = index_2a, end_subrange_2a
4187             zminusterm = zminusterm + zcc(ib,ll) * paero(ll)%numc
4188          ENDDO
4189!
4190!--       Particle volume gained from smaller particles in subranges 1 & 2a
4191          DO  ll = start_subrange_1a, index_2a - 1
4192             zplusterm(1:8) = zplusterm(1:8) + zcc(ll,ib) * paero(ll)%volc(1:8)
4193          ENDDO
4194!
4195!--       Particle volume gained from smaller particles in 2b
4196          DO  ll = start_subrange_2b, ib - 1
4197             zplusterm(1:8) = zplusterm(1:8) + zcc(ll,ib) * paero(ll)%volc(1:8)
4198          ENDDO
4199!
4200!--       Volume and number concentrations after coagulation update [fxm]
4201          paero(ib)%volc(1:8) = ( paero(ib)%volc(1:8) + ptstep * zplusterm(1:8) * paero(ib)%numc ) &
4202                                / ( 1.0_wp + ptstep * zminusterm )
4203          paero(ib)%numc = paero(ib)%numc / ( 1.0_wp + ptstep * zminusterm + 0.5_wp * ptstep *     &
4204                           zcc(ib,ib) * paero(ib)%numc )
4205       ENDDO
4206    ENDIF
4207
4208 END SUBROUTINE coagulation
4209
4210!------------------------------------------------------------------------------!
4211! Description:
4212! ------------
4213!> Calculation of coagulation coefficients. Extended version of the function
4214!> originally found in mo_salsa_init.
4215!
4216!> J. Tonttila, FMI, 05/2014
4217!------------------------------------------------------------------------------!
4218 REAL(wp) FUNCTION coagc( diam1, diam2, mass1, mass2, temp, pres )
4219
4220    IMPLICIT NONE
4221
4222    REAL(wp) ::  fmdist  !< distance of flux matching (m)
4223    REAL(wp) ::  knud_p  !< particle Knudsen number
4224    REAL(wp) ::  mdiam   !< mean diameter of colliding particles (m)
4225    REAL(wp) ::  mfp     !< mean free path of air molecules (m)
4226    REAL(wp) ::  visc    !< viscosity of air (kg/(m s))
4227
4228    REAL(wp), INTENT(in) ::  diam1  !< diameter of colliding particle 1 (m)
4229    REAL(wp), INTENT(in) ::  diam2  !< diameter of colliding particle 2 (m)
4230    REAL(wp), INTENT(in) ::  mass1  !< mass of colliding particle 1 (kg)
4231    REAL(wp), INTENT(in) ::  mass2  !< mass of colliding particle 2 (kg)
4232    REAL(wp), INTENT(in) ::  pres   !< ambient pressure (Pa?) [fxm]
4233    REAL(wp), INTENT(in) ::  temp   !< ambient temperature (K)
4234
4235    REAL(wp), DIMENSION (2) ::  beta    !< Cunningham correction factor
4236    REAL(wp), DIMENSION (2) ::  dfpart  !< particle diffusion coefficient (m2/s)
4237    REAL(wp), DIMENSION (2) ::  diam    !< diameters of particles (m)
4238    REAL(wp), DIMENSION (2) ::  flux    !< flux in continuum and free molec. regime (m/s)
4239    REAL(wp), DIMENSION (2) ::  knud    !< particle Knudsen number
4240    REAL(wp), DIMENSION (2) ::  mpart   !< masses of particles (kg)
4241    REAL(wp), DIMENSION (2) ::  mtvel   !< particle mean thermal velocity (m/s)
4242    REAL(wp), DIMENSION (2) ::  omega   !< particle mean free path
4243    REAL(wp), DIMENSION (2) ::  tva     !< temporary variable (m)
4244!
4245!-- Initialisation
4246    coagc   = 0.0_wp
4247!
4248!-- 1) Initializing particle and ambient air variables
4249    diam  = (/ diam1, diam2 /) !< particle diameters (m)
4250    mpart = (/ mass1, mass2 /) !< particle masses (kg)
4251!
4252!-- Viscosity of air (kg/(m s))
4253    visc = ( 7.44523E-3_wp * temp ** 1.5_wp ) / ( 5093.0_wp * ( temp + 110.4_wp ) )
4254!
4255!-- Mean free path of air (m)
4256    mfp = ( 1.656E-10_wp * temp + 1.828E-8_wp ) * ( p_0 + 1325.0_wp ) / pres
4257!
4258!-- 2) Slip correction factor for small particles
4259    knud = 2.0_wp * EXP( LOG(mfp) - LOG(diam) )! Knudsen number for air (15.23)
4260!
4261!-- Cunningham correction factor (Allen and Raabe, Aerosol Sci. Tech. 4, 269)
4262    beta = 1.0_wp + knud * ( 1.142_wp + 0.558_wp * EXP( -0.999_wp / knud ) )
4263!
4264!-- 3) Particle properties
4265!-- Diffusion coefficient (m2/s) (Jacobson (2005) eq. 15.29)
4266    dfpart = beta * abo * temp / ( 3.0_wp * pi * visc * diam )
4267!
4268!-- Mean thermal velocity (m/s) (Jacobson (2005) eq. 15.32)
4269    mtvel = SQRT( ( 8.0_wp * abo * temp ) / ( pi * mpart ) )
4270!
4271!-- Particle mean free path (m) (Jacobson (2005) eq. 15.34 )
4272    omega = 8.0_wp * dfpart / ( pi * mtvel )
4273!
4274!-- Mean diameter (m)
4275    mdiam = 0.5_wp * ( diam(1) + diam(2) )
4276!
4277!-- 4) Calculation of fluxes (Brownian collision kernels) and flux matching
4278!-- following Jacobson (2005):
4279!
4280!-- Flux in continuum regime (m3/s) (eq. 15.28)
4281    flux(1) = 4.0_wp * pi * mdiam * ( dfpart(1) + dfpart(2) )
4282!
4283!-- Flux in free molec. regime (m3/s) (eq. 15.31)
4284    flux(2) = pi * SQRT( ( mtvel(1)**2 ) + ( mtvel(2)**2 ) ) * ( mdiam**2 )
4285!
4286!-- temporary variables (m) to calculate flux matching distance (m)
4287    tva(1) = ( ( mdiam + omega(1) )**3 - ( mdiam**2 + omega(1)**2 ) * SQRT( ( mdiam**2 +           &
4288               omega(1)**2 ) ) ) / ( 3.0_wp * mdiam * omega(1) ) - mdiam
4289    tva(2) = ( ( mdiam + omega(2) )**3 - ( mdiam**2 + omega(2)**2 ) * SQRT( ( mdiam**2 +           &
4290               omega(2)**2 ) ) ) / ( 3.0_wp * mdiam * omega(2) ) - mdiam
4291!
4292!-- Flux matching distance (m): the mean distance from the centre of a sphere reached by particles
4293!-- that leave sphere's surface and travel a distance of particle mean free path (eq. 15.34)
4294    fmdist = SQRT( tva(1)**2 + tva(2)**2 )
4295!
4296!-- 5) Coagulation coefficient = coalescence efficiency * collision kernel (m3/s) (eq. 15.33).
4297!--    Here assumed coalescence efficiency 1!!
4298    coagc = flux(1) / ( mdiam / ( mdiam + fmdist) + flux(1) / flux(2) )
4299!
4300!-- Corrected collision kernel (Karl et al., 2016 (ACP)): Include van der Waals and viscous forces
4301    IF ( van_der_waals_coagc )  THEN
4302       knud_p = SQRT( omega(1)**2 + omega(2)**2 ) / mdiam
4303       IF ( knud_p >= 0.1_wp  .AND.  knud_p <= 10.0_wp )  THEN
4304          coagc = coagc * ( 2.0_wp + 0.4_wp * LOG( knud_p ) )
4305       ELSE
4306          coagc = coagc * 3.0_wp
4307       ENDIF
4308    ENDIF
4309
4310 END FUNCTION coagc
4311
4312!------------------------------------------------------------------------------!
4313! Description:
4314! ------------
4315!> Calculates the change in particle volume and gas phase
4316!> concentrations due to nucleation, condensation and dissolutional growth.
4317!
4318!> Sulphuric acid and organic vapour: only condensation and no evaporation.
4319!
4320!> New gas and aerosol phase concentrations calculated according to Jacobson
4321!> (1997): Numerical techniques to solve condensational and dissolutional growth
4322!> equations when growth is coupled to reversible reactions, Aerosol Sci. Tech.,
4323!> 27, pp 491-498.
4324!
4325!> Following parameterization has been used:
4326!> Molecular diffusion coefficient of condensing vapour (m2/s)
4327!> (Reid et al. (1987): Properties of gases and liquids, McGraw-Hill, New York.)
4328!> D = {1.d-7*sqrt(1/M_air + 1/M_gas)*T^1.75} / &
4329!      {p_atm/p_stand * (d_air^(1/3) + d_gas^(1/3))^2 }
4330!> M_air = 28.965 : molar mass of air (g/mol)
4331!> d_air = 19.70  : diffusion volume of air
4332!> M_h2so4 = 98.08 : molar mass of h2so4 (g/mol)
4333!> d_h2so4 = 51.96  : diffusion volume of h2so4
4334!
4335!> Called from main aerosol model
4336!> For equations, see Jacobson, Fundamentals of Atmospheric Modeling, 2nd Edition (2005)
4337!
4338!> Coded by:
4339!> Hannele Korhonen (FMI) 2005
4340!> Harri Kokkola (FMI) 2006
4341!> Juha Tonttila (FMI) 2014
4342!> Rewritten to PALM by Mona Kurppa (UHel) 2017
4343!------------------------------------------------------------------------------!
4344 SUBROUTINE condensation( paero, pc_sa, pc_ocnv, pcocsv, pchno3, pc_nh3, pcw, pcs, ptemp, ppres,   &
4345                          ptstep, prtcl )
4346
4347    IMPLICIT NONE
4348
4349    INTEGER(iwp) ::  ss      !< start index
4350    INTEGER(iwp) ::  ee      !< end index
4351
4352    REAL(wp) ::  zcs_ocnv    !< condensation sink of nonvolatile organics (1/s)
4353    REAL(wp) ::  zcs_ocsv    !< condensation sink of semivolatile organics (1/s)
4354    REAL(wp) ::  zcs_su      !< condensation sink of sulfate (1/s)
4355    REAL(wp) ::  zcs_tot     !< total condensation sink (1/s) (gases)
4356    REAL(wp) ::  zcvap_new1  !< vapour concentration after time step (#/m3): sulphuric acid
4357    REAL(wp) ::  zcvap_new2  !< nonvolatile organics
4358    REAL(wp) ::  zcvap_new3  !< semivolatile organics
4359    REAL(wp) ::  zdfvap      !< air diffusion coefficient (m2/s)
4360    REAL(wp) ::  zdvap1      !< change in vapour concentration (#/m3): sulphuric acid
4361    REAL(wp) ::  zdvap2      !< nonvolatile organics
4362    REAL(wp) ::  zdvap3      !< semivolatile organics
4363    REAL(wp) ::  zmfp        !< mean free path of condensing vapour (m)
4364    REAL(wp) ::  zrh         !< Relative humidity [0-1]
4365    REAL(wp) ::  zvisc       !< viscosity of air (kg/(m s))
4366    REAL(wp) ::  zn_vs_c     !< ratio of nucleation of all mass transfer in the smallest bin
4367    REAL(wp) ::  zxocnv      !< ratio of organic vapour in 3nm particles
4368    REAL(wp) ::  zxsa        !< Ratio in 3nm particles: sulphuric acid
4369
4370    REAL(wp), INTENT(in) ::  ppres   !< ambient pressure (Pa)
4371    REAL(wp), INTENT(in) ::  pcs     !< Water vapour saturation concentration (kg/m3)
4372    REAL(wp), INTENT(in) ::  ptemp   !< ambient temperature (K)
4373    REAL(wp), INTENT(in) ::  ptstep  !< timestep (s)
4374
4375    REAL(wp), INTENT(inout) ::  pchno3   !< Gas concentrations (#/m3): nitric acid HNO3
4376    REAL(wp), INTENT(inout) ::  pc_nh3   !< ammonia NH3
4377    REAL(wp), INTENT(inout) ::  pc_ocnv  !< non-volatile organics
4378    REAL(wp), INTENT(inout) ::  pcocsv   !< semi-volatile organics
4379    REAL(wp), INTENT(inout) ::  pc_sa    !< sulphuric acid H2SO4
4380    REAL(wp), INTENT(inout) ::  pcw      !< Water vapor concentration (kg/m3)
4381
4382    REAL(wp), DIMENSION(nbins_aerosol)       ::  zbeta          !< transitional correction factor
4383    REAL(wp), DIMENSION(nbins_aerosol)       ::  zcolrate       !< collision rate (1/s)
4384    REAL(wp), DIMENSION(nbins_aerosol)       ::  zcolrate_ocnv  !< collision rate of OCNV (1/s)
4385    REAL(wp), DIMENSION(start_subrange_1a+1) ::  zdfpart        !< particle diffusion coef. (m2/s)
4386    REAL(wp), DIMENSION(nbins_aerosol)       ::  zdvoloc        !< change of organics volume
4387    REAL(wp), DIMENSION(nbins_aerosol)       ::  zdvolsa        !< change of sulphate volume
4388    REAL(wp), DIMENSION(2)                   ::  zj3n3          !< Formation massrate of molecules
4389                                                                !< in nucleation, (molec/m3s),
4390                                                                !< 1: H2SO4 and 2: organic vapor
4391    REAL(wp), DIMENSION(nbins_aerosol)       ::  zknud          !< particle Knudsen number
4392
4393    TYPE(component_index), INTENT(in) :: prtcl  !< Keeps track which substances are used
4394
4395    TYPE(t_section), DIMENSION(nbins_aerosol), INTENT(inout) ::  paero  !< Aerosol properties
4396
4397    zj3n3  = 0.0_wp
4398    zrh    = pcw / pcs
4399    zxocnv = 0.0_wp
4400    zxsa   = 0.0_wp
4401!
4402!-- Nucleation
4403    IF ( nsnucl > 0 )  THEN
4404       CALL nucleation( paero, ptemp, zrh, ppres, pc_sa, pc_ocnv, pc_nh3, ptstep, zj3n3, zxsa,     &
4405                        zxocnv )
4406    ENDIF
4407!
4408!-- Condensation on pre-existing particles
4409    IF ( lscndgas )  THEN
4410!
4411!--    Initialise:
4412       zdvolsa = 0.0_wp
4413       zdvoloc = 0.0_wp
4414       zcolrate = 0.0_wp
4415!
4416!--    1) Properties of air and condensing gases:
4417!--    Viscosity of air (kg/(m s)) (Eq. 4.54 in Jabonson (2005))
4418       zvisc = ( 7.44523E-3_wp * ptemp ** 1.5_wp ) / ( 5093.0_wp * ( ptemp + 110.4_wp ) )
4419!
4420!--    Diffusion coefficient of air (m2/s)
4421       zdfvap = 5.1111E-10_wp * ptemp ** 1.75_wp * ( p_0 + 1325.0_wp ) / ppres
4422!
4423!--    Mean free path (m): same for H2SO4 and organic compounds
4424       zmfp = 3.0_wp * zdfvap * SQRT( pi * amh2so4 / ( 8.0_wp * argas * ptemp ) )
4425!
4426!--    2) Transition regime correction factor zbeta for particles (Fuchs and Sutugin (1971)):
4427!--       Size of condensing molecule considered only for nucleation mode (3 - 20 nm).
4428!
4429!--    Particle Knudsen number: condensation of gases on aerosols
4430       ss = start_subrange_1a
4431       ee = start_subrange_1a+1
4432       zknud(ss:ee) = 2.0_wp * zmfp / ( paero(ss:ee)%dwet + d_sa )
4433       ss = start_subrange_1a+2
4434       ee = end_subrange_2b
4435       zknud(ss:ee) = 2.0_wp * zmfp / paero(ss:ee)%dwet
4436!
4437!--    Transitional correction factor: aerosol + gas (the semi-empirical Fuchs- Sutugin
4438!--    interpolation function (Fuchs and Sutugin, 1971))
4439       zbeta = ( zknud + 1.0_wp ) / ( 0.377_wp * zknud + 1.0_wp + 4.0_wp / ( 3.0_wp * massacc ) *  &
4440               ( zknud + zknud ** 2 ) )
4441!
4442!--    3) Collision rate of molecules to particles
4443!--       Particle diffusion coefficient considered only for nucleation mode (3 - 20 nm)
4444!
4445!--    Particle diffusion coefficient (m2/s) (e.g. Eq. 15.29 in Jacobson (2005))
4446       zdfpart = abo * ptemp * zbeta(start_subrange_1a:start_subrange_1a+1) / ( 3.0_wp * pi * zvisc&
4447                 * paero(start_subrange_1a:start_subrange_1a+1)%dwet)
4448!
4449!--    Collision rate (mass-transfer coefficient): gases on aerosols (1/s) (Eq. 16.64 in
4450!--    Jacobson (2005))
4451       ss = start_subrange_1a
4452       ee = start_subrange_1a+1
4453       zcolrate(ss:ee) = MERGE( 2.0_wp * pi * ( paero(ss:ee)%dwet + d_sa ) * ( zdfvap + zdfpart ) *&
4454                               zbeta(ss:ee) * paero(ss:ee)%numc, 0.0_wp, paero(ss:ee)%numc > nclim )
4455       ss = start_subrange_1a+2
4456       ee = end_subrange_2b
4457       zcolrate(ss:ee) = MERGE( 2.0_wp * pi * paero(ss:ee)%dwet * zdfvap * zbeta(ss:ee) *          &
4458                                paero(ss:ee)%numc, 0.0_wp, paero(ss:ee)%numc > nclim )
4459!
4460!-- 4) Condensation sink (1/s)
4461       zcs_tot = SUM( zcolrate )   ! total sink
4462!
4463!--    5) Changes in gas-phase concentrations and particle volume
4464!
4465!--    5.1) Organic vapours
4466!
4467!--    5.1.1) Non-volatile organic compound: condenses onto all bins
4468       IF ( pc_ocnv > 1.0E+10_wp  .AND.  zcs_tot > 1.0E-30_wp  .AND. index_oc > 0 )  &
4469       THEN
4470!--       Ratio of nucleation vs. condensation rates in the smallest bin
4471          zn_vs_c = 0.0_wp
4472          IF ( zj3n3(2) > 1.0_wp )  THEN
4473             zn_vs_c = ( zj3n3(2) ) / ( zj3n3(2) + pc_ocnv * zcolrate(start_subrange_1a) )
4474          ENDIF
4475!
4476!--       Collision rate in the smallest bin, including nucleation and condensation (see
4477!--       Jacobson (2005), eq. (16.73) )
4478          zcolrate_ocnv = zcolrate
4479          zcolrate_ocnv(start_subrange_1a) = zcolrate_ocnv(start_subrange_1a) + zj3n3(2) / pc_ocnv
4480!
4481!--       Total sink for organic vapor
4482          zcs_ocnv = zcs_tot + zj3n3(2) / pc_ocnv
4483!
4484!--       New gas phase concentration (#/m3)
4485          zcvap_new2 = pc_ocnv / ( 1.0_wp + ptstep * zcs_ocnv )
4486!
4487!--       Change in gas concentration (#/m3)
4488          zdvap2 = pc_ocnv - zcvap_new2
4489!
4490!--       Updated vapour concentration (#/m3)
4491          pc_ocnv = zcvap_new2
4492!
4493!--       Volume change of particles (m3(OC)/m3(air))
4494          zdvoloc = zcolrate_ocnv(start_subrange_1a:end_subrange_2b) / zcs_ocnv * amvoc * zdvap2
4495!
4496!--       Change of volume due to condensation in 1a-2b
4497          paero(start_subrange_1a:end_subrange_2b)%volc(2) =                                       &
4498                                          paero(start_subrange_1a:end_subrange_2b)%volc(2) + zdvoloc
4499!
4500!--       Change of number concentration in the smallest bin caused by nucleation (Jacobson (2005),
4501!--       eq. (16.75)). If zxocnv = 0, then the chosen nucleation mechanism doesn't take into
4502!--       account the non-volatile organic vapors and thus the paero doesn't have to be updated.
4503          IF ( zxocnv > 0.0_wp )  THEN
4504             paero(start_subrange_1a)%numc = paero(start_subrange_1a)%numc + zn_vs_c *             &
4505                                             zdvoloc(start_subrange_1a) / amvoc / ( n3 * zxocnv )
4506          ENDIF
4507       ENDIF
4508!
4509!--    5.1.2) Semivolatile organic compound: all bins except subrange 1
4510       zcs_ocsv = SUM( zcolrate(start_subrange_2a:end_subrange_2b) ) !< sink for semi-volatile organics
4511       IF ( pcocsv > 1.0E+10_wp  .AND.  zcs_ocsv > 1.0E-30  .AND. is_used( prtcl,'OC') )  THEN
4512!
4513!--       New gas phase concentration (#/m3)
4514          zcvap_new3 = pcocsv / ( 1.0_wp + ptstep * zcs_ocsv )
4515!
4516!--       Change in gas concentration (#/m3)
4517          zdvap3 = pcocsv - zcvap_new3
4518!
4519!--       Updated gas concentration (#/m3)
4520          pcocsv = zcvap_new3
4521!
4522!--       Volume change of particles (m3(OC)/m3(air))
4523          ss = start_subrange_2a
4524          ee = end_subrange_2b
4525          zdvoloc(ss:ee) = zdvoloc(ss:ee) + zcolrate(ss:ee) / zcs_ocsv * amvoc * zdvap3
4526!
4527!--       Change of volume due to condensation in 1a-2b
4528          paero(start_subrange_1a:end_subrange_2b)%volc(2) =                                       &
4529                                          paero(start_subrange_1a:end_subrange_2b)%volc(2) + zdvoloc
4530       ENDIF
4531!
4532!--    5.2) Sulphate: condensed on all bins
4533       IF ( pc_sa > 1.0E+10_wp  .AND.  zcs_tot > 1.0E-30_wp  .AND.  index_so4 > 0 )  THEN
4534!
4535!--    Ratio of mass transfer between nucleation and condensation
4536          zn_vs_c = 0.0_wp
4537          IF ( zj3n3(1) > 1.0_wp )  THEN
4538             zn_vs_c = ( zj3n3(1) ) / ( zj3n3(1) + pc_sa * zcolrate(start_subrange_1a) )
4539          ENDIF
4540!
4541!--       Collision rate in the smallest bin, including nucleation and condensation (see
4542!--       Jacobson (2005), eq. (16.73))
4543          zcolrate(start_subrange_1a) = zcolrate(start_subrange_1a) + zj3n3(1) / pc_sa
4544!
4545!--       Total sink for sulfate (1/s)
4546          zcs_su = zcs_tot + zj3n3(1) / pc_sa
4547!
4548!--       Sulphuric acid:
4549!--       New gas phase concentration (#/m3)
4550          zcvap_new1 = pc_sa / ( 1.0_wp + ptstep * zcs_su )
4551!
4552!--       Change in gas concentration (#/m3)
4553          zdvap1 = pc_sa - zcvap_new1
4554!
4555!--       Updating vapour concentration (#/m3)
4556          pc_sa = zcvap_new1
4557!
4558!--       Volume change of particles (m3(SO4)/m3(air)) by condensation
4559          zdvolsa = zcolrate(start_subrange_1a:end_subrange_2b) / zcs_su * amvh2so4 * zdvap1
4560!
4561!--       Change of volume concentration of sulphate in aerosol [fxm]
4562          paero(start_subrange_1a:end_subrange_2b)%volc(1) =                                       &
4563                                          paero(start_subrange_1a:end_subrange_2b)%volc(1) + zdvolsa
4564!
4565!--       Change of number concentration in the smallest bin caused by nucleation
4566!--       (Jacobson (2005), equation (16.75))
4567          IF ( zxsa > 0.0_wp )  THEN
4568             paero(start_subrange_1a)%numc = paero(start_subrange_1a)%numc + zn_vs_c *             &
4569                                             zdvolsa(start_subrange_1a) / amvh2so4 / ( n3 * zxsa)
4570          ENDIF
4571       ENDIF
4572!
4573!--    Partitioning of H2O, HNO3, and NH3: Dissolutional growth
4574       IF ( lspartition  .AND.  ( pchno3 > 1.0E+10_wp  .OR.  pc_nh3 > 1.0E+10_wp ) )  THEN
4575          CALL gpparthno3( ppres, ptemp, paero, pchno3, pc_nh3, pcw, pcs, zbeta, ptstep )
4576       ENDIF
4577    ENDIF
4578!
4579!-- Condensation of water vapour
4580    IF ( lscndh2oae )  THEN
4581       CALL gpparth2o( paero, ptemp, ppres, pcs, pcw, ptstep )
4582    ENDIF
4583
4584 END SUBROUTINE condensation
4585
4586!------------------------------------------------------------------------------!
4587! Description:
4588! ------------
4589!> Calculates the particle number and volume increase, and gas-phase
4590!> concentration decrease due to nucleation subsequent growth to detectable size
4591!> of 3 nm.
4592!
4593!> Method:
4594!> When the formed clusters grow by condensation (possibly also by self-
4595!> coagulation), their number is reduced due to scavenging to pre-existing
4596!> particles. Thus, the apparent nucleation rate at 3 nm is significantly lower
4597!> than the real nucleation rate (at ~1 nm).
4598!
4599!> Calculation of the formation rate of detectable particles at 3 nm (i.e. J3):
4600!> nj3 = 1: Kerminen, V.-M. and Kulmala, M. (2002), J. Aerosol Sci.,33, 609-622.
4601!> nj3 = 2: Lehtinen et al. (2007), J. Aerosol Sci., 38(9), 988-994.
4602!> nj3 = 3: Anttila et al. (2010), J. Aerosol Sci., 41(7), 621-636.
4603!
4604!> c = aerosol of critical radius (1 nm)
4605!> x = aerosol with radius 3 nm
4606!> 2 = wet or mean droplet
4607!
4608!> Called from subroutine condensation (in module salsa_dynamics_mod.f90)
4609!
4610!> Calls one of the following subroutines:
4611!>  - binnucl
4612!>  - ternucl
4613!>  - kinnucl
4614!>  - actnucl
4615!
4616!> fxm: currently only sulphuric acid grows particles from 1 to 3 nm
4617!>  (if asked from Markku, this is terribly wrong!!!)
4618!
4619!> Coded by:
4620!> Hannele Korhonen (FMI) 2005
4621!> Harri Kokkola (FMI) 2006
4622!> Matti Niskanen(FMI) 2012
4623!> Anton Laakso  (FMI) 2013
4624!------------------------------------------------------------------------------!
4625
4626 SUBROUTINE nucleation( paero, ptemp, prh, ppres, pc_sa, pc_ocnv, pc_nh3, ptstep, pj3n3, pxsa,     &
4627                        pxocnv )
4628
4629    IMPLICIT NONE
4630
4631    INTEGER(iwp) ::  iteration
4632
4633    REAL(wp) ::  zc_h2so4     !< H2SO4 conc. (#/cm3) !UNITS!
4634    REAL(wp) ::  zc_org       !< organic vapour conc. (#/cm3)
4635    REAL(wp) ::  zcc_c        !< Cunningham correct factor for c = critical (1nm)
4636    REAL(wp) ::  zcc_x        !< Cunningham correct factor for x = 3nm
4637    REAL(wp) ::  zcoags_c     !< coagulation sink (1/s) for c = critical (1nm)
4638    REAL(wp) ::  zcoags_x     !< coagulation sink (1/s) for x = 3nm
4639    REAL(wp) ::  zcoagstot    !< total particle losses due to coagulation, including condensation
4640                              !< and self-coagulation
4641    REAL(wp) ::  zcocnv_local !< organic vapour conc. (#/m3)
4642    REAL(wp) ::  zcsink       !< condensational sink (#/m2)
4643    REAL(wp) ::  zcsa_local   !< H2SO4 conc. (#/m3)
4644    REAL(wp) ::  zcv_c        !< mean relative thermal velocity (m/s) for c = critical (1nm)
4645    REAL(wp) ::  zcv_x        !< mean relative thermal velocity (m/s) for x = 3nm
4646    REAL(wp) ::  zdcrit       !< diameter of critical cluster (m)
4647    REAL(wp) ::  zdelta_vap   !< change of H2SO4 and organic vapour concentration (#/m3)
4648    REAL(wp) ::  zdfvap       !< air diffusion coefficient (m2/s)
4649    REAL(wp) ::  zdmean       !< mean diameter of existing particles (m)
4650    REAL(wp) ::  zeta         !< constant: proportional to ratio of CS/GR (m)
4651                              !< (condensation sink / growth rate)
4652    REAL(wp) ::  zgamma       !< proportionality factor ((nm2*m2)/h)
4653    REAL(wp) ::  z_gr_clust   !< growth rate of formed clusters (nm/h)
4654    REAL(wp) ::  z_gr_tot     !< total growth rate
4655    REAL(wp) ::  zj3          !< number conc. of formed 3nm particles (#/m3)
4656    REAL(wp) ::  zjnuc        !< nucleation rate at ~1nm (#/m3s)
4657    REAL(wp) ::  z_k_eff      !< effective cogulation coefficient for freshly nucleated particles
4658    REAL(wp) ::  zknud_c      !< Knudsen number for c = critical (1nm)
4659    REAL(wp) ::  zknud_x      !< Knudsen number for x = 3nm
4660    REAL(wp) ::  zkocnv       !< lever: zkocnv=1 --> organic compounds involved in nucleation
4661    REAL(wp) ::  zksa         !< lever: zksa=1 --> H2SO4 involved in nucleation
4662    REAL(wp) ::  zlambda      !< parameter for adjusting the growth rate due to self-coagulation
4663    REAL(wp) ::  zm_c         !< particle mass (kg) for c = critical (1nm)
4664    REAL(wp) ::  zm_para      !< Parameter m for calculating the coagulation sink (Eq. 5&6 in
4665                              !< Lehtinen et al. 2007)
4666    REAL(wp) ::  zm_x         !< particle mass (kg) for x = 3nm
4667    REAL(wp) ::  zmfp         !< mean free path of condesing vapour(m)
4668    REAL(wp) ::  zmixnh3      !< ammonia mixing ratio (ppt)
4669    REAL(wp) ::  zmyy         !< gas dynamic viscosity (N*s/m2)
4670    REAL(wp) ::  z_n_nuc      !< number of clusters/particles at the size range d1-dx (#/m3)
4671    REAL(wp) ::  znoc         !< number of organic molecules in critical cluster
4672    REAL(wp) ::  znsa         !< number of H2SO4 molecules in critical cluster
4673
4674    REAL(wp), INTENT(in) ::  pc_nh3   !< ammonia concentration (#/m3)
4675    REAL(wp), INTENT(in) ::  pc_ocnv  !< conc. of non-volatile OC (#/m3)
4676    REAL(wp), INTENT(in) ::  pc_sa    !< sulphuric acid conc. (#/m3)
4677    REAL(wp), INTENT(in) ::  ppres    !< ambient air pressure (Pa)
4678    REAL(wp), INTENT(in) ::  prh      !< ambient rel. humidity [0-1]
4679    REAL(wp), INTENT(in) ::  ptemp    !< ambient temperature (K)
4680    REAL(wp), INTENT(in) ::  ptstep   !< time step (s) of SALSA
4681
4682    REAL(wp), INTENT(inout) ::  pj3n3(2) !< formation mass rate of molecules (molec/m3s) for
4683                                         !< 1: H2SO4 and 2: organic vapour
4684
4685    REAL(wp), INTENT(out) ::  pxocnv  !< ratio of non-volatile organic vapours in 3 nm particles
4686    REAL(wp), INTENT(out) ::  pxsa    !< ratio of H2SO4 in 3 nm aerosol particles
4687
4688    REAL(wp), DIMENSION(nbins_aerosol) ::  zbeta       !< transitional correction factor
4689    REAL(wp), DIMENSION(nbins_aerosol) ::  zcc_2       !< Cunningham correct factor:2
4690    REAL(wp), DIMENSION(nbins_aerosol) ::  zcv_2       !< mean relative thermal velocity (m/s): 2
4691    REAL(wp), DIMENSION(nbins_aerosol) ::  zcv_c2      !< average velocity after coagulation: c & 2
4692    REAL(wp), DIMENSION(nbins_aerosol) ::  zcv_x2      !< average velocity after coagulation: x & 2
4693    REAL(wp), DIMENSION(nbins_aerosol) ::  zdc_2       !< particle diffusion coefficient (m2/s): 2
4694    REAL(wp), DIMENSION(nbins_aerosol) ::  zdc_c       !< particle diffusion coefficient (m2/s): c
4695    REAL(wp), DIMENSION(nbins_aerosol) ::  zdc_c2      !< sum of diffusion coef. for c and 2
4696    REAL(wp), DIMENSION(nbins_aerosol) ::  zdc_x       !< particle diffusion coefficient (m2/s): x
4697    REAL(wp), DIMENSION(nbins_aerosol) ::  zdc_x2      !< sum of diffusion coef. for: x & 2
4698    REAL(wp), DIMENSION(nbins_aerosol) ::  zgamma_f_2  !< zgamma_f for calculating zomega
4699    REAL(wp), DIMENSION(nbins_aerosol) ::  zgamma_f_c  !< zgamma_f for calculating zomega
4700    REAL(wp), DIMENSION(nbins_aerosol) ::  zgamma_f_x  !< zgamma_f for calculating zomega
4701    REAL(wp), DIMENSION(nbins_aerosol) ::  z_k_c2      !< coagulation coef. in the continuum
4702                                                       !< regime: c & 2
4703    REAL(wp), DIMENSION(nbins_aerosol) ::  z_k_x2      !< coagulation coef. in the continuum
4704                                                       !< regime: x & 2
4705    REAL(wp), DIMENSION(nbins_aerosol) ::  zknud       !< particle Knudsen number
4706    REAL(wp), DIMENSION(nbins_aerosol) ::  zknud_2     !< particle Knudsen number: 2
4707    REAL(wp), DIMENSION(nbins_aerosol) ::  zm_2        !< particle mass (kg): 2
4708    REAL(wp), DIMENSION(nbins_aerosol) ::  zomega_2c   !< zomega (m) for calculating zsigma: c & 2
4709    REAL(wp), DIMENSION(nbins_aerosol) ::  zomega_2x   !< zomega (m) for calculating zsigma: x & 2
4710    REAL(wp), DIMENSION(nbins_aerosol) ::  zomega_c    !< zomega (m) for calculating zsigma: c
4711    REAL(wp), DIMENSION(nbins_aerosol) ::  zomega_x    !< zomega (m) for calculating zsigma: x
4712    REAL(wp), DIMENSION(nbins_aerosol) ::  z_r_c2      !< sum of the radii: c & 2
4713    REAL(wp), DIMENSION(nbins_aerosol) ::  z_r_x2      !< sum of the radii: x & 2
4714    REAL(wp), DIMENSION(nbins_aerosol) ::  zsigma_c2   !<
4715    REAL(wp), DIMENSION(nbins_aerosol) ::  zsigma_x2   !<
4716
4717    TYPE(t_section), DIMENSION(nbins_aerosol), INTENT(inout) ::  paero  !< aerosol properties
4718!
4719!-- 1) Nucleation rate (zjnuc) and diameter of critical cluster (zdcrit)
4720    zjnuc  = 0.0_wp
4721    znsa   = 0.0_wp
4722    znoc   = 0.0_wp
4723    zdcrit = 0.0_wp
4724    zksa   = 0.0_wp
4725    zkocnv = 0.0_wp
4726
4727    SELECT CASE ( nsnucl )
4728!
4729!--    Binary H2SO4-H2O nucleation
4730       CASE(1)
4731
4732          zc_h2so4 = pc_sa * 1.0E-6_wp   ! sulphuric acid conc. to #/cm3
4733          CALL binnucl( zc_h2so4, ptemp, prh, zjnuc, znsa, znoc, zdcrit,  zksa, zkocnv )
4734!
4735!--    Activation type nucleation
4736       CASE(2)
4737
4738          zc_h2so4 = pc_sa * 1.0E