source: palm/trunk/SOURCE/mod_particle_attributes.f90 @ 2263

Last change on this file since 2263 was 2263, checked in by schwenkel, 4 years ago

Implemented splitting and merging algorithm

  • Property svn:keywords set to Id
File size: 16.8 KB
Line 
1!> @file mod_particle_attributes.f90
2!------------------------------------------------------------------------------!
3! This file is part of PALM.
4!
5! PALM is free software: you can redistribute it and/or modify it under the
6! terms of the GNU General Public License as published by the Free Software
7! Foundation, either version 3 of the License, or (at your option) any later
8! version.
9!
10! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
11! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13!
14! You should have received a copy of the GNU General Public License along with
15! PALM. If not, see <http://www.gnu.org/licenses/>.
16!
17! Copyright 1997-2017 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! ------------------
22!
23!
24! Former revisions:
25! -----------------
26! $Id: mod_particle_attributes.f90 2263 2017-06-08 14:59:01Z schwenkel $
27! Implemented splitting and merging algorithm
28!
29! 2183 2017-03-17 14:29:15Z schwenkel
30!
31! 2182 2017-03-17 14:27:40Z schwenkel
32! Added parameters for simplified particle initialization.
33!
34! 2122 2017-01-18 12:22:54Z hoffmann
35! Calculation of particle ID
36! Particle attribute dvrp_psize renamed to user: this attribute can be used by
37! by the user to store any variable
38!
39! 2000 2016-08-20 18:09:15Z knoop
40! Forced header and separation lines into 80 columns
41!
42! 1936 2016-06-13 13:37:44Z suehring
43! +deallocate_memory, step_dealloc
44!
45! 1929 2016-06-09 16:25:25Z suehring
46! -sgs_wfu_par, sgs_wfv_par, sgs_wfw_par
47! + sgs_wf_par
48!
49! 1871 2016-04-15 11:46:09Z hoffmann
50! Initialization of aerosols added.
51!
52! 1849 2016-04-08 11:33:18Z hoffmann
53! bfactor, mass_of_solute, molecular_weight_of_solute, molecular_weight_of_water,
54! vanthoff added from modules
55!
56! 1831 2016-04-07 13:15:51Z hoffmann
57! palm_kernel removed, curvature_solution_effects added
58!
59! 1822 2016-04-07 07:49:42Z hoffmann
60! +collision_algorithm, all_or_nothing, average_impact
61! Tails removed.
62!
63! 1727 2015-11-20 07:22:02Z knoop
64! Bugfix: Cause of syntax warning gfortran preprocessor removed
65!
66! 1682 2015-10-07 23:56:08Z knoop
67! Code annotations made doxygen readable
68!
69! 1575 2015-03-27 09:56:27Z raasch
70! +seed_follows_topography
71!
72! 1359 2014-04-11 17:15:14Z hoffmann
73! new module containing all particle related variables
74! -dt_sort_particles
75!
76! Description:
77! ------------
78!> Definition of variables used to compute particle transport
79!------------------------------------------------------------------------------!
80MODULE particle_attributes
81 
82
83    USE kinds
84
85    CHARACTER(LEN=15) ::  bc_par_lr = 'cyclic'                    !< left/right boundary condition
86    CHARACTER(LEN=15) ::  bc_par_ns = 'cyclic'                    !< north/south boundary condition
87    CHARACTER(LEN=15) ::  bc_par_b  = 'reflect'                   !< bottom boundary condition
88    CHARACTER(LEN=15) ::  bc_par_t  = 'absorb'                    !< top boundary condition
89    CHARACTER(LEN=15) ::  collision_algorithm = 'all_or_nothing'  !< collision algorithm
90    CHARACTER(LEN=15) ::  collision_kernel = 'none'               !< collision kernel
91    CHARACTER(LEN=5) ::  splitting_function = 'gamma'             !< function for calculation critical weighting factor
92    CHARACTER(LEN=5) ::  splitting_mode = 'const'                 !< splitting mode
93
94
95    INTEGER(iwp) ::  deleted_particles = 0                        !< number of deleted particles per time step
96    INTEGER(iwp) ::  dissipation_classes = 10                     !< number of dissipation classes
97    INTEGER(iwp) ::  ibc_par_b                                    !< particle bottom boundary condition dummy
98    INTEGER(iwp) ::  ibc_par_lr                                   !< particle left/right boundary condition dummy
99    INTEGER(iwp) ::  ibc_par_ns                                   !< particle north/south boundary condition dummy
100    INTEGER(iwp) ::  ibc_par_t                                    !< particle top boundary condition dummy
101    INTEGER(iwp) ::  iran_part = -1234567                         !< number for random generator
102    INTEGER(iwp) ::  isf                                          !< dummy for splitting function
103    INTEGER(iwp) ::  i_splitting_mode                             !< dummy for splitting mode
104    INTEGER(iwp) ::  maximum_number_of_particles = 0              !< maximum number of particles on a PE (can be removed?)
105    INTEGER(iwp) ::  max_number_particles_per_gridbox = 30        !< maximum number of particles per gridbox (used in splitting algorithm)
106    INTEGER(iwp) ::  merge_drp = 0                                !< number of merged droplets
107    INTEGER(iwp) ::  min_nr_particle = 50                         !< minimum number of particles for which memory is allocated at every grid cell         
108    INTEGER(iwp) ::  mpi_particle_type                            !< parameter for particle PE particle exchange
109    INTEGER(iwp) ::  new_particles = 0                            !< number of new particles
110    INTEGER(iwp) ::  n_max = 100                                  !< number of radii bin for splitting functions     
111    INTEGER(iwp) ::  number_of_particles = 0                      !< number of particles for each grid box (3d array is saved on prt_count)           
112    INTEGER(iwp) ::  number_of_particle_groups = 1                !< number of particle groups to be used           
113    INTEGER(iwp) ::  number_of_sublayers = 20                     !< number of sublayers for particle velocities betwenn surface and first grid level         
114    INTEGER(iwp) ::  number_particles_per_gridbox = -1            !< number of particles which are created in every grid box           
115    INTEGER(iwp) ::  offset_ocean_nzt = 0                         !< in case of oceans runs, the vertical index calculations need an offset         
116    INTEGER(iwp) ::  offset_ocean_nzt_m1 = 0                      !< in case of oceans runs, the vertical index calculations need an offset
117    INTEGER(iwp) ::  particles_per_point = 1                      !< number of particles to be started per point
118    INTEGER(iwp) ::  particle_file_count = 0                      !< can be removed ?
119    INTEGER(iwp) ::  radius_classes = 20                          !< number of radius classes to be used in the collision efficiency table
120    INTEGER(iwp) ::  sort_count = 0                               !< counter for sorting particles
121    INTEGER(iwp) ::  splitting_factor = 2                         !< splitting factor
122    INTEGER(iwp) ::  splitting_factor_max = 5                     !< maximum splittig factor
123    INTEGER(iwp) ::  step_dealloc = 100                           !< number of timesteps after which particle memory is deallocated
124    INTEGER(iwp) ::  sum_merge_drp = 0                            !< sum of merged super droplets
125    INTEGER(iwp) ::  sum_new_particles = 0                        !< sum of created particles (in splitting algorithm)
126    INTEGER(iwp) ::  total_number_of_particles                    !< total number of particles in the whole model domain           
127    INTEGER(iwp) ::  trlp_count_sum                               !< parameter for particle exchange of PEs
128    INTEGER(iwp) ::  trlp_count_recv_sum                          !< parameter for particle exchange of PEs
129    INTEGER(iwp) ::  trrp_count_sum                               !< parameter for particle exchange of PEs
130    INTEGER(iwp) ::  trrp_count_recv_sum                          !< parameter for particle exchange of PEs
131    INTEGER(iwp) ::  trsp_count_sum                               !< parameter for particle exchange of PEs
132    INTEGER(iwp) ::  trsp_count_recv_sum                          !< parameter for particle exchange of PEs
133    INTEGER(iwp) ::  trnp_count_sum                               !< parameter for particle exchange of PEs
134    INTEGER(iwp) ::  trnp_count_recv_sum                          !< parameter for particle exchange of PEs
135
136    INTEGER(iwp), PARAMETER ::  max_number_of_particle_groups = 10 !< maximum allowed number of particle groups
137
138    INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE ::  prt_count  !< 3d array of number of particles of every grid box
139
140    LOGICAL ::  all_or_nothing = .FALSE.                  !< flag for collision algorithm
141    LOGICAL ::  average_impact = .FALSE.                  !< flag for collision algortihm
142    LOGICAL ::  curvature_solution_effects = .FALSE.      !< parameter to consider solution and curvature effects on the equilibrium vapor pressure of cloud droplets                     
143    LOGICAL ::  deallocate_memory = .TRUE.                !< parameter to enable deallocation of unused memory                   
144    LOGICAL ::  hall_kernel = .FALSE.                     !< flag for collision kernel
145    LOGICAL ::  init_aerosol_probabilistic = .FALSE.      !< parameter to steer the initialization of the aerosol spectrum
146    LOGICAL ::  merging = .FALSE.                         !< parameter to enable merging of super droplets
147    LOGICAL ::  monodisperse_aerosols = .FALSE.           !< parameter to steer the initialization of the aerosol spectrum
148    LOGICAL ::  particle_advection = .FALSE.              !< parameter to steer the advection of particles
149    LOGICAL ::  random_start_position = .FALSE.           !< parameter to initialize particles on random positon (within one grid box)                   
150    LOGICAL ::  read_particles_from_restartfile = .TRUE.  !< read particle data from the previous run                   
151    LOGICAL ::  seed_follows_topography = .FALSE.         !< heights of initial particles are interpreted relative to the given topography
152    LOGICAL ::  splitting = .FALSE.                       !< parameter to enable the splitting of super droplets
153    LOGICAL ::  uniform_particles = .TRUE.                !< can be removed?
154    LOGICAL ::  use_kernel_tables = .FALSE.               !< parameter, which turns on the use of precalculated collision kernels
155    LOGICAL ::  use_sgs_for_particles = .FALSE.           !< parameter to use sgs velocities for particles
156    LOGICAL ::  wang_kernel = .FALSE.                     !< flag for collision kernel
157    LOGICAL ::  write_particle_statistics = .FALSE.       !< switch on/off output of particle information (statistical information)
158               
159    LOGICAL, DIMENSION(max_number_of_particle_groups) ::                       &
160                vertical_particle_advection = .TRUE.              !< Switch on/off vertical particle transport
161
162    REAL(wp) ::  alloc_factor = 20.0_wp                           !< memory allocated additionally to the memory needed for initial particles at a given grid cell
163    REAL(wp) ::  c_0 = 3.0_wp                                     !< parameter for lagrangian timescale
164    REAL(wp) ::  dt_min_part = 0.0002_wp                          !< minimum particle time step when SGS velocities are used (s)
165    REAL(wp) ::  dt_prel = 9999999.9_wp                           !< temporal interval at which particles are to be released from a particle source (in s)
166    REAL(wp) ::  dt_write_particle_data = 9999999.9_wp            !< temporal interval for output of particle data (in s)             
167    REAL(wp) ::  end_time_prel = 9999999.9_wp                     !< time of the last release of particles (in s).           
168    REAL(wp) ::  initial_weighting_factor = 1.0_wp                !< weighting factor used for initialization
169    REAL(wp) ::  molecular_weight_of_solute = 0.05844_wp          !< mol. m. NaCl (kg mol-1)
170    REAL(wp) ::  molecular_weight_of_water = 0.01801528_wp        !< mol. m. H2O (kg mol-1)
171    REAL(wp) ::  n1 = 100.0_wp                                    !< number concentration of the first log-normal distribution (dry aerosol initialization)
172    REAL(wp) ::  n2 = 0.0_wp                                      !< see n1
173    REAL(wp) ::  n3 = 0.0_wp                                      !< see n1
174    REAL(wp) ::  number_concentration = -1.0_wp                   !< initial particle number concentration (in units of 1/cm^-3)
175    REAL(wp) ::  particle_advection_start = 0.0_wp                !< time of the first release of particles (in s).
176    REAL(wp) ::  radius_merge = 1.0E-7_wp                         !< particles with a smaller radius are merged if merging is set
177    REAL(wp) ::  radius_split = 40.0E-6_wp                        !< particles with a bigger radius are splitted if splittig is set
178    REAL(wp) ::  rho_s = 2165.0_wp                                !< density of NaCl (kg m-3)
179    REAL(wp) ::  rm1 = 0.05E-6_wp                                 !< mode radius of the first log-normal distribution (dry aerosol initialization)
180    REAL(wp) ::  rm2 = 0.05E-6_wp                                 !< see rm1
181    REAL(wp) ::  rm3 = 0.05E-6_wp                                 !< see rm2
182    REAL(wp) ::  s1 = 2.0_wp                                      !< geometric standard deviation of the first log-normal distribution (dry aerosol initialization)
183    REAL(wp) ::  s2 = 2.0_wp                                      !< see s1
184    REAL(wp) ::  s3 = 2.0_wp                                      !< see s1
185    REAL(wp) ::  sgs_wf_part                                      !< parameter for sgs
186    REAL(wp) ::  time_prel = 0.0_wp                               !< time for particle release
187    REAL(wp) ::  time_sort_particles = 0.0_wp                     !< can be removed?
188    REAL(wp) ::  time_write_particle_data = 0.0_wp                !< write particle data at current time on file
189    REAL(wp) ::  vanthoff = 2.0_wp                                !< van't Hoff factor for NaCl
190    REAL(wp) ::  weight_factor_merge = -1.0_wp                    !< critical weighting factor for merging
191    REAL(wp) ::  weight_factor_split = -1.0_wp                    !< critical weighting factor for splitting
192    REAL(wp) ::  z0_av_global                                     !< horizontal mean value of z0
193
194    REAL(wp), DIMENSION(max_number_of_particle_groups) ::  density_ratio = 9999999.9_wp  !< ratio of the density of the fluid and the density of the particles   
195    REAL(wp), DIMENSION(max_number_of_particle_groups) ::  pdx = 9999999.9_wp            !< distance along x between particles within a particle source (in m)
196    REAL(wp), DIMENSION(max_number_of_particle_groups) ::  pdy = 9999999.9_wp            !< distance along y between particles within a particle source (in m)
197    REAL(wp), DIMENSION(max_number_of_particle_groups) ::  pdz = 9999999.9_wp            !< distance along z between particles within a particle source (in m)
198    REAL(wp), DIMENSION(max_number_of_particle_groups) ::  psb = 9999999.9_wp            !< bottom edge of a particle source (in m)
199    REAL(wp), DIMENSION(max_number_of_particle_groups) ::  psl = 9999999.9_wp            !< left edge of a particle source (in m)
200    REAL(wp), DIMENSION(max_number_of_particle_groups) ::  psn = 9999999.9_wp            !< rear ("north") edge of a particle source (in m)
201    REAL(wp), DIMENSION(max_number_of_particle_groups) ::  psr = 9999999.9_wp            !< right edge of a particle source (in m).
202    REAL(wp), DIMENSION(max_number_of_particle_groups) ::  pss = 9999999.9_wp            !< front ("south") edge of a particle source (in m).
203    REAL(wp), DIMENSION(max_number_of_particle_groups) ::  pst = 9999999.9_wp            !< top edge of a particle source (in m).
204    REAL(wp), DIMENSION(max_number_of_particle_groups) ::  radius = 9999999.9_wp         !< particle radius (in m).
205
206    REAL(wp), DIMENSION(:), ALLOCATABLE     ::  log_z_z0   !< Precalculate LOG(z/z0)
207
208   
209    TYPE particle_type
210        SEQUENCE
211        REAL(wp)     ::  radius, age, age_m, dt_sum, user, e_m,                &
212                         origin_x, origin_y, origin_z, rvar1, rvar2, rvar3,    &
213                         speed_x, speed_y, speed_z, weight_factor, x, y, z
214        INTEGER(iwp) ::  class, group, id1, id2
215        LOGICAL      ::  particle_mask
216        INTEGER(iwp) ::  block_nr
217    END TYPE particle_type
218
219    TYPE(particle_type), DIMENSION(:), POINTER ::  particles
220    TYPE(particle_type)                        ::  zero_particle
221
222    TYPE particle_groups_type
223        SEQUENCE
224        REAL(wp) ::  density_ratio, radius, exp_arg, exp_term
225    END TYPE particle_groups_type
226
227    TYPE(particle_groups_type), DIMENSION(max_number_of_particle_groups) ::    &
228       particle_groups
229
230    TYPE  grid_particle_def
231        INTEGER(iwp), DIMENSION(0:7)               ::  start_index
232        INTEGER(iwp), DIMENSION(0:7)               ::  end_index
233        INTEGER(iwp)                               ::  id_counter
234        LOGICAL                                    ::  time_loop_done
235        TYPE(particle_type), POINTER, DIMENSION(:) ::  particles                !Particle array for this grid cell
236    END TYPE grid_particle_def
237
238    TYPE(grid_particle_def), DIMENSION(:,:,:), ALLOCATABLE, TARGET ::  grid_particles
239
240    TYPE block_offset_def
241        INTEGER(iwp) ::  i_off
242        INTEGER(iwp) ::  j_off
243        INTEGER(iwp) ::  k_off
244    END TYPE block_offset_def
245
246    TYPE(block_offset_def), DIMENSION(0:7)         ::  block_offset
247
248    SAVE
249
250
251END MODULE particle_attributes
252
Note: See TracBrowser for help on using the repository browser.