MODFLOW 6  version 6.7.0.dev2
USGS Modular Hydrologic Model
Particle.f90
Go to the documentation of this file.
2 
3  use kindmodule, only: dp, i4b, lgp
4  use listmodule, only: listtype
8  implicit none
9  public
10 
11  !> Tracking "levels" defined in method modules. Currently only 3 used.
12  integer, parameter :: max_level = 4
13 
14  !> @brief Particle status enumeration.
15  !!
16  !! Particles begin in status 1 (active) at release time. Status may only
17  !! increase over time. Status values greater than one imply termination.
18  !! A particle may terminate for several reasons, all mutually exclusive.
19  !! A particle's final tracking status will always be greater than one.
20  !!
21  !! Status codes 0-3 and 5-8 correspond directly to MODPATH 7 status codes.
22  !! Code 4 does not apply to PRT because PRT does not distinguish forwards
23  !! from backwards tracking. Status code 9 provides more specific, subcell-
24  !! level information about a particle which terminates due to no outflow.
25  !! Code 10 distinguishes particles which have "timed out" upon reaching a
26  !! user-specified stop time or the end of the simulation.
27  !<
28  enum, bind(C)
29  enumerator :: active = 1
30  enumerator :: term_boundary = 2 !< terminated at a boundary face
31  enumerator :: term_weaksink = 3 !< terminated in a weak sink cell
32  enumerator :: term_no_exits = 5 !< terminated in a cell with no exit face
33  enumerator :: term_stopzone = 6 !< terminated in a cell with a stop zone number
34  enumerator :: term_inactive = 7 !< terminated in an inactive cell
35  enumerator :: term_unreleased = 8 !< terminated permanently unreleased
36  enumerator :: term_no_exits_sub = 9 !< terminated in a subcell with no exit face
37  enumerator :: term_timeout = 10 !< terminated at stop time or end of simulation
38  end enum
39 
40  !> @brief Particle tracked by the PRT model.
41  !!
42  !! Record-type to conveniently shuffle a particle's
43  !! state to/from storage before/after its trajectory
44  !! is solved for each time step.
45  !!
46  !! Particle coordinates may be local to the cell or
47  !! global/model. Routines are provided to convert a
48  !! particle's global coordinates to/from cell-local
49  !! coordinates for tracking through cell subdomains.
50  !!
51  !! Particles are identified by composite key, i.e.,
52  !! combinations of properties imdl, iprp, irpt, and
53  !! trelease. An optional label may be provided, but
54  !! need not be unique
55  !<
57  private
58  ! identity
59  character(len=LENBOUNDNAME), public :: name = '' !< optional particle name
60  integer(I4B), public :: imdl !< index of model the particle originated in
61  integer(I4B), public :: iprp !< index of release package the particle is from
62  integer(I4B), public :: irpt !< index of release point the particle is from
63  integer(I4B), public :: ip !< index of particle in the particle list
64  ! stop criteria
65  integer(I4B), public :: istopweaksink !< weak sink option (0: do not stop, 1: stop)
66  integer(I4B), public :: istopzone !< stop zone number
67  integer(I4B), public :: idrymeth !< dry tracking method
68  ! state
69  integer(I4B), public :: itrdomain(max_level) !< tracking domain indices
70  integer(I4B), public :: iboundary(max_level) !< tracking domain boundary indices
71  integer(I4B), public :: icp !< previous cell number (reduced)
72  integer(I4B), public :: icu !< user cell number
73  integer(I4B), public :: ilay !< grid layer
74  integer(I4B), public :: izone !< current zone number
75  integer(I4B), public :: izp !< previous zone number
76  integer(I4B), public :: istatus !< tracking status
77  real(dp), public :: x !< x coordinate
78  real(dp), public :: y !< y coordinate
79  real(dp), public :: z !< z coordinate
80  real(dp), public :: trelease !< release time
81  real(dp), public :: tstop !< stop time
82  real(dp), public :: ttrack !< time tracked so far
83  real(dp), public :: xorigin !< x origin for coordinate transformation from model to local
84  real(dp), public :: yorigin !< y origin for coordinate transformation from model to local
85  real(dp), public :: zorigin !< z origin for coordinate transformation from model to local
86  real(dp), public :: sinrot !< sine of rotation angle for coordinate transformation from model to local
87  real(dp), public :: cosrot !< cosine of rotation angle for coordinate transformation from model to local
88  real(dp), public :: extol !< tolerance for iterative solution of particle exit location and time in generalized Pollock's method
89  logical(LGP), public :: transformed !< whether coordinates have been transformed from model to local
90  logical(LGP), public :: advancing !< whether particle is still being tracked for current time step
91  integer(I4B), public :: ifrctrn !< whether to force solving the particle with the ternary method
92  integer(I4B), public :: iexmeth !< method for iterative solution of particle exit location and time in generalized Pollock's method
93  integer(I4B), public :: iextend !< whether to extend tracking beyond the end of the simulation
94  integer(I4B), public :: icycwin !< cycle detection window size
95  type(listtype), public, pointer :: history !< history of particle positions (for cycle detection)
96  contains
97  procedure, public :: destroy => destroy_particle
98  procedure, public :: get_model_coords
99  procedure, public :: transform => transform_coords
100  procedure, public :: reset_transform
101  end type particletype
102 
103  !> @brief Structure of arrays to store particles.
105  private
106  ! identity
107  character(len=LENBOUNDNAME), dimension(:), pointer, public, contiguous :: name !< optional particle label
108  integer(I4B), dimension(:), pointer, public, contiguous :: imdl !< index of model particle originated in
109  integer(I4B), dimension(:), pointer, public, contiguous :: iprp !< index of release package the particle originated in
110  integer(I4B), dimension(:), pointer, public, contiguous :: irpt !< index of release point in the particle release package the particle originated in
111  ! stopping criteria
112  integer(I4B), dimension(:), pointer, public, contiguous :: istopweaksink !< weak sink option: 0 = do not stop, 1 = stop
113  integer(I4B), dimension(:), pointer, public, contiguous :: istopzone !< stop zone number
114  integer(I4B), dimension(:), pointer, public, contiguous :: idrymeth !< stop in dry cells
115  ! state
116  integer(I4B), dimension(:, :), pointer, public, contiguous :: itrdomain !< array of indices for domains in the tracking domain hierarchy
117  integer(I4B), dimension(:, :), pointer, public, contiguous :: iboundary !< array of indices for tracking domain boundaries
118  integer(I4B), dimension(:), pointer, public, contiguous :: icu !< cell number (user)
119  integer(I4B), dimension(:), pointer, public, contiguous :: ilay !< layer
120  integer(I4B), dimension(:), pointer, public, contiguous :: izone !< current zone number
121  integer(I4B), dimension(:), pointer, public, contiguous :: izp !< previous zone number
122  integer(I4B), dimension(:), pointer, public, contiguous :: istatus !< particle status
123  real(dp), dimension(:), pointer, public, contiguous :: x !< model x coord of particle
124  real(dp), dimension(:), pointer, public, contiguous :: y !< model y coord of particle
125  real(dp), dimension(:), pointer, public, contiguous :: z !< model z coord of particle
126  real(dp), dimension(:), pointer, public, contiguous :: trelease !< particle release time
127  real(dp), dimension(:), pointer, public, contiguous :: tstop !< particle stop time
128  real(dp), dimension(:), pointer, public, contiguous :: ttrack !< current tracking time
129  integer(I4B), dimension(:), pointer, public, contiguous :: ifrctrn !< force ternary method
130  integer(I4B), dimension(:), pointer, public, contiguous :: iexmeth !< method for iterative solution of particle exit location and time in generalized Pollock's method
131  real(dp), dimension(:), pointer, public, contiguous :: extol !< tolerance for iterative solution of particle exit location and time in generalized Pollock's method
132  integer(LGP), dimension(:), pointer, public, contiguous :: extend !< whether to extend tracking beyond the end of the simulation
133  integer(I4B), dimension(:), pointer, public, contiguous :: icycwin !< cycle detection window size
134  contains
135  procedure, public :: destroy
136  procedure, public :: num_stored
137  procedure, public :: resize
138  procedure, public :: get
139  procedure, public :: put
140  end type particlestoretype
141 
142 contains
143 
144  !> @brief Create a new particle
145  subroutine create_particle(particle)
146  type(particletype), pointer :: particle !< particle
147  allocate (particle)
148  allocate (particle%history)
149  end subroutine create_particle
150 
151  !> @brief Allocate particle store
152  subroutine create_particle_store(store, np, mempath)
153  type(particlestoretype), pointer :: store !< store
154  integer(I4B), intent(in) :: np !< number of particles
155  character(*), intent(in) :: mempath !< path to memory
156 
157  allocate (store)
158  call mem_allocate(store%imdl, np, 'PLIMDL', mempath)
159  call mem_allocate(store%irpt, np, 'PLIRPT', mempath)
160  call mem_allocate(store%iprp, np, 'PLIPRP', mempath)
161  call mem_allocate(store%name, lenboundname, np, 'PLNAME', mempath)
162  call mem_allocate(store%icu, np, 'PLICU', mempath)
163  call mem_allocate(store%ilay, np, 'PLILAY', mempath)
164  call mem_allocate(store%izone, np, 'PLIZONE', mempath)
165  call mem_allocate(store%izp, np, 'PLIZP', mempath)
166  call mem_allocate(store%istatus, np, 'PLISTATUS', mempath)
167  call mem_allocate(store%x, np, 'PLX', mempath)
168  call mem_allocate(store%y, np, 'PLY', mempath)
169  call mem_allocate(store%z, np, 'PLZ', mempath)
170  call mem_allocate(store%trelease, np, 'PLTRELEASE', mempath)
171  call mem_allocate(store%tstop, np, 'PLTSTOP', mempath)
172  call mem_allocate(store%ttrack, np, 'PLTTRACK', mempath)
173  call mem_allocate(store%istopweaksink, np, 'PLISTOPWEAKSINK', mempath)
174  call mem_allocate(store%istopzone, np, 'PLISTOPZONE', mempath)
175  call mem_allocate(store%idrymeth, np, 'PLIDRYMETH', mempath)
176  call mem_allocate(store%ifrctrn, np, 'PLIFRCTRN', mempath)
177  call mem_allocate(store%iexmeth, np, 'PLIEXMETH', mempath)
178  call mem_allocate(store%extol, np, 'PLEXTOL', mempath)
179  call mem_allocate(store%extend, np, 'PLIEXTEND', mempath)
180  call mem_allocate(store%icycwin, np, 'PLICYCWIN', mempath)
181  call mem_allocate(store%itrdomain, np, max_level, 'PLIDOMAIN', mempath)
182  call mem_allocate(store%iboundary, np, max_level, 'PLIBOUNDARY', mempath)
183  end subroutine create_particle_store
184 
185  !> @brief Destroy particle store after use.
186  subroutine destroy(this, mempath)
187  class(particlestoretype), intent(inout) :: this !< store
188  character(*), intent(in) :: mempath !< path to memory
189 
190  call mem_deallocate(this%imdl, 'PLIMDL', mempath)
191  call mem_deallocate(this%iprp, 'PLIPRP', mempath)
192  call mem_deallocate(this%irpt, 'PLIRPT', mempath)
193  call mem_deallocate(this%name, 'PLNAME', mempath)
194  call mem_deallocate(this%icu, 'PLICU', mempath)
195  call mem_deallocate(this%ilay, 'PLILAY', mempath)
196  call mem_deallocate(this%izone, 'PLIZONE', mempath)
197  call mem_deallocate(this%izp, 'PLIZP', mempath)
198  call mem_deallocate(this%istatus, 'PLISTATUS', mempath)
199  call mem_deallocate(this%x, 'PLX', mempath)
200  call mem_deallocate(this%y, 'PLY', mempath)
201  call mem_deallocate(this%z, 'PLZ', mempath)
202  call mem_deallocate(this%trelease, 'PLTRELEASE', mempath)
203  call mem_deallocate(this%tstop, 'PLTSTOP', mempath)
204  call mem_deallocate(this%ttrack, 'PLTTRACK', mempath)
205  call mem_deallocate(this%istopweaksink, 'PLISTOPWEAKSINK', mempath)
206  call mem_deallocate(this%istopzone, 'PLISTOPZONE', mempath)
207  call mem_deallocate(this%idrymeth, 'PLIDRYMETH', mempath)
208  call mem_deallocate(this%ifrctrn, 'PLIFRCTRN', mempath)
209  call mem_deallocate(this%iexmeth, 'PLIEXMETH', mempath)
210  call mem_deallocate(this%extol, 'PLEXTOL', mempath)
211  call mem_deallocate(this%extend, 'PLIEXTEND', mempath)
212  call mem_deallocate(this%icycwin, 'PLICYCWIN', mempath)
213  call mem_deallocate(this%itrdomain, 'PLIDOMAIN', mempath)
214  call mem_deallocate(this%iboundary, 'PLIBOUNDARY', mempath)
215  end subroutine destroy
216 
217  !> @brief Destroy a particle after use.
218  subroutine destroy_particle(particle)
219  class(particletype), intent(inout) :: particle !< particle
220  deallocate (particle%history)
221  end subroutine destroy_particle
222 
223  !> @brief Reallocate particle storage to the given size.
224  subroutine resize(this, np, mempath)
225  ! dummy
226  class(particlestoretype), intent(inout) :: this !< particle store
227  integer(I4B), intent(in) :: np !< number of particles
228  character(*), intent(in) :: mempath !< path to memory
229 
230  ! resize arrays
231  call mem_reallocate(this%imdl, np, 'PLIMDL', mempath)
232  call mem_reallocate(this%iprp, np, 'PLIPRP', mempath)
233  call mem_reallocate(this%irpt, np, 'PLIRPT', mempath)
234  call mem_reallocate(this%name, lenboundname, np, 'PLNAME', mempath)
235  call mem_reallocate(this%icu, np, 'PLICU', mempath)
236  call mem_reallocate(this%ilay, np, 'PLILAY', mempath)
237  call mem_reallocate(this%izone, np, 'PLIZONE', mempath)
238  call mem_reallocate(this%izp, np, 'PLIZP', mempath)
239  call mem_reallocate(this%istatus, np, 'PLISTATUS', mempath)
240  call mem_reallocate(this%x, np, 'PLX', mempath)
241  call mem_reallocate(this%y, np, 'PLY', mempath)
242  call mem_reallocate(this%z, np, 'PLZ', mempath)
243  call mem_reallocate(this%trelease, np, 'PLTRELEASE', mempath)
244  call mem_reallocate(this%tstop, np, 'PLTSTOP', mempath)
245  call mem_reallocate(this%ttrack, np, 'PLTTRACK', mempath)
246  call mem_reallocate(this%istopweaksink, np, 'PLISTOPWEAKSINK', mempath)
247  call mem_reallocate(this%istopzone, np, 'PLISTOPZONE', mempath)
248  call mem_reallocate(this%idrymeth, np, 'PLIDRYMETH', mempath)
249  call mem_reallocate(this%ifrctrn, np, 'PLIFRCTRN', mempath)
250  call mem_reallocate(this%iexmeth, np, 'PLIEXMETH', mempath)
251  call mem_reallocate(this%extol, np, 'PLEXTOL', mempath)
252  call mem_reallocate(this%extend, np, 'PLIEXTEND', mempath)
253  call mem_reallocate(this%icycwin, np, 'PLICYCWIN', mempath)
254  call mem_reallocate(this%itrdomain, np, max_level, 'PLIDOMAIN', mempath)
255  call mem_reallocate(this%iboundary, np, max_level, 'PLIBOUNDARY', mempath)
256  end subroutine resize
257 
258  !> @brief Load a particle from the particle store.
259  !!
260  !! This routine is used to initialize a particle for tracking.
261  !! The advancing flag and coordinate transformation are reset.
262  !<
263  subroutine get(this, particle, imdl, iprp, ip)
264  class(particlestoretype), intent(inout) :: this !< particle store
265  class(particletype), intent(inout) :: particle !< particle
266  integer(I4B), intent(in) :: imdl !< index of model particle originated in
267  integer(I4B), intent(in) :: iprp !< index of particle release package particle originated in
268  integer(I4B), intent(in) :: ip !< index into the particle list
269 
270  call particle%reset_transform()
271  call particle%history%Clear()
272  particle%imdl = imdl
273  particle%iprp = iprp
274  particle%irpt = this%irpt(ip)
275  particle%ip = ip
276  particle%name = this%name(ip)
277  particle%istopweaksink = this%istopweaksink(ip)
278  particle%istopzone = this%istopzone(ip)
279  particle%idrymeth = this%idrymeth(ip)
280  particle%icp = 0
281  particle%icu = this%icu(ip)
282  particle%ilay = this%ilay(ip)
283  particle%izone = this%izone(ip)
284  particle%izp = this%izp(ip)
285  particle%istatus = this%istatus(ip)
286  particle%x = this%x(ip)
287  particle%y = this%y(ip)
288  particle%z = this%z(ip)
289  particle%trelease = this%trelease(ip)
290  particle%tstop = this%tstop(ip)
291  particle%ttrack = this%ttrack(ip)
292  particle%advancing = .true.
293  particle%itrdomain(1:max_level) = &
294  this%itrdomain(ip, 1:max_level)
295  particle%itrdomain(1) = imdl
296  particle%iboundary(1:max_level) = &
297  this%iboundary(ip, 1:max_level)
298  particle%ifrctrn = this%ifrctrn(ip)
299  particle%iexmeth = this%iexmeth(ip)
300  particle%extol = this%extol(ip)
301  particle%iextend = this%extend(ip)
302  particle%icycwin = this%icycwin(ip)
303  end subroutine get
304 
305  !> @brief Save a particle's state to the particle store.
306  subroutine put(this, particle, ip)
307  class(particlestoretype), intent(inout) :: this !< particle storage
308  class(particletype), intent(in) :: particle !< particle
309  integer(I4B), intent(in) :: ip !< particle index
310 
311  this%imdl(ip) = particle%imdl
312  this%iprp(ip) = particle%iprp
313  this%irpt(ip) = particle%irpt
314  this%name(ip) = particle%name
315  this%istopweaksink(ip) = particle%istopweaksink
316  this%istopzone(ip) = particle%istopzone
317  this%idrymeth(ip) = particle%idrymeth
318  this%icu(ip) = particle%icu
319  this%ilay(ip) = particle%ilay
320  this%izone(ip) = particle%izone
321  this%izp(ip) = particle%izp
322  this%istatus(ip) = particle%istatus
323  this%x(ip) = particle%x
324  this%y(ip) = particle%y
325  this%z(ip) = particle%z
326  this%trelease(ip) = particle%trelease
327  this%tstop(ip) = particle%tstop
328  this%ttrack(ip) = particle%ttrack
329  this%itrdomain( &
330  ip, &
331  1:max_level) = &
332  particle%itrdomain(1:max_level)
333  this%iboundary( &
334  ip, &
335  1:max_level) = &
336  particle%iboundary(1:max_level)
337  this%ifrctrn(ip) = particle%ifrctrn
338  this%iexmeth(ip) = particle%iexmeth
339  this%extol(ip) = particle%extol
340  this%extend(ip) = particle%iextend
341  this%icycwin(ip) = particle%icycwin
342  end subroutine put
343 
344  !> @brief Transform particle coordinates.
345  !!
346  !! Apply a translation and/or rotation to particle coordinates.
347  !! No rescaling. It's also possible to invert a transformation.
348  !! Be sure to reset the transformation after using it.
349  !<
350  subroutine transform_coords(this, xorigin, yorigin, zorigin, &
351  sinrot, cosrot, invert)
352  use geomutilmodule, only: transform, compose
353  class(particletype), intent(inout) :: this !< particle
354  real(DP), intent(in), optional :: xorigin !< x coordinate of origin
355  real(DP), intent(in), optional :: yorigin !< y coordinate of origin
356  real(DP), intent(in), optional :: zorigin !< z coordinate of origin
357  real(DP), intent(in), optional :: sinrot !< sine of rotation angle
358  real(DP), intent(in), optional :: cosrot !< cosine of rotation angle
359  logical(LGP), intent(in), optional :: invert !< whether to invert
360 
361  call transform(this%x, this%y, this%z, &
362  this%x, this%y, this%z, &
363  xorigin, yorigin, zorigin, &
364  sinrot, cosrot, invert)
365 
366  call compose(this%xorigin, this%yorigin, this%zorigin, &
367  this%sinrot, this%cosrot, &
368  xorigin, yorigin, zorigin, &
369  sinrot, cosrot, invert)
370 
371  this%transformed = .true.
372  end subroutine transform_coords
373 
374  !> @brief Reset particle coordinate transformation properties.
375  subroutine reset_transform(this)
376  class(particletype), intent(inout) :: this !< particle
377 
378  this%xorigin = dzero
379  this%yorigin = dzero
380  this%zorigin = dzero
381  this%sinrot = dzero
382  this%cosrot = done
383  this%cosrot = done
384  this%transformed = .false.
385  end subroutine reset_transform
386 
387  !> @brief Return the particle's model coordinates,
388  !! inverting any applied transformation if needed.
389  !! The particle's state is not altered.
390  subroutine get_model_coords(this, x, y, z)
391  use geomutilmodule, only: transform, compose
392  class(particletype), intent(in) :: this !< particle
393  real(DP), intent(out) :: x !< x coordinate
394  real(DP), intent(out) :: y !< y coordinate
395  real(DP), intent(out) :: z !< z coordinate
396 
397  if (this%transformed) then
398  call transform(this%x, this%y, this%z, x, y, z, &
399  this%xorigin, this%yorigin, this%zorigin, &
400  this%sinrot, this%cosrot, invert=.true.)
401  else
402  x = this%x
403  y = this%y
404  z = this%z
405  end if
406  end subroutine get_model_coords
407 
408  !> @brief Return the number of particles.
409  integer function num_stored(this) result(n)
410  class(particlestoretype) :: this
411  n = size(this%imdl)
412  end function num_stored
413 
414 end module particlemodule
This module contains simulation constants.
Definition: Constants.f90:9
integer(i4b), parameter lenboundname
maximum length of a bound name
Definition: Constants.f90:36
real(dp), parameter dzero
real constant zero
Definition: Constants.f90:65
integer(i4b), parameter lenmempath
maximum length of the memory path
Definition: Constants.f90:27
real(dp), parameter done
real constant 1
Definition: Constants.f90:76
subroutine, public transform(xin, yin, zin, xout, yout, zout, xorigin, yorigin, zorigin, sinrot, cosrot, invert)
Apply a 3D translation and optional 2D rotation to coordinates.
Definition: GeomUtil.f90:183
subroutine, public compose(xorigin, yorigin, zorigin, sinrot, cosrot, xorigin_new, yorigin_new, zorigin_new, sinrot_new, cosrot_new, invert)
Apply a 3D translation and 2D rotation to an existing transformation.
Definition: GeomUtil.f90:243
This module defines variable data types.
Definition: kind.f90:8
subroutine get(this, particle, imdl, iprp, ip)
Load a particle from the particle store.
Definition: Particle.f90:264
subroutine resize(this, np, mempath)
Reallocate particle storage to the given size.
Definition: Particle.f90:225
subroutine create_particle_store(store, np, mempath)
Allocate particle store.
Definition: Particle.f90:153
subroutine get_model_coords(this, x, y, z)
Return the particle's model coordinates, inverting any applied transformation if needed....
Definition: Particle.f90:391
integer function num_stored(this)
Return the number of particles.
Definition: Particle.f90:410
subroutine reset_transform(this)
Reset particle coordinate transformation properties.
Definition: Particle.f90:376
@ term_weaksink
terminated in a weak sink cell
Definition: Particle.f90:31
@ term_timeout
terminated at stop time or end of simulation
Definition: Particle.f90:37
@ term_inactive
terminated in an inactive cell
Definition: Particle.f90:34
@ term_no_exits
terminated in a cell with no exit face
Definition: Particle.f90:32
@ term_stopzone
terminated in a cell with a stop zone number
Definition: Particle.f90:33
@ term_no_exits_sub
terminated in a subcell with no exit face
Definition: Particle.f90:36
@ term_unreleased
terminated permanently unreleased
Definition: Particle.f90:35
@ term_boundary
terminated at a boundary face
Definition: Particle.f90:30
subroutine transform_coords(this, xorigin, yorigin, zorigin, sinrot, cosrot, invert)
Transform particle coordinates.
Definition: Particle.f90:352
subroutine destroy(this, mempath)
Destroy particle store after use.
Definition: Particle.f90:187
subroutine create_particle(particle)
Create a new particle.
Definition: Particle.f90:146
subroutine put(this, particle, ip)
Save a particle's state to the particle store.
Definition: Particle.f90:307
integer, parameter max_level
Tracking "levels" defined in method modules. Currently only 3 used.
Definition: Particle.f90:12
subroutine destroy_particle(particle)
Destroy a particle after use.
Definition: Particle.f90:219
A generic heterogeneous doubly-linked list.
Definition: List.f90:14
Structure of arrays to store particles.
Definition: Particle.f90:104
Particle tracked by the PRT model.
Definition: Particle.f90:56