MODFLOW 6  version 6.7.0.dev3
USGS Modular Hydrologic Model
particlemodule Module Reference

Data Types

type  particletype
 Particle tracked by the PRT model. More...
 
type  particlestoretype
 Structure of arrays to store particles. More...
 

Enumerations

enum  {
  active = 1 , term_boundary = 2 , term_weaksink = 3 , term_no_exits = 5 ,
  term_stopzone = 6 , term_inactive = 7 , term_unreleased = 8 , term_no_exits_sub = 9 ,
  term_timeout = 10
}
 Particle status enumeration. More...
 

Functions/Subroutines

subroutine create_particle (particle)
 Create a new particle. More...
 
subroutine create_particle_store (store, np, mempath)
 Allocate particle store. More...
 
subroutine destroy (this, mempath)
 Destroy particle store after use. More...
 
subroutine destroy_particle (particle)
 Destroy a particle after use. More...
 
subroutine resize (this, np, mempath)
 Reallocate particle storage to the given size. More...
 
subroutine get (this, particle, imdl, iprp, ip)
 Load a particle from the particle store. More...
 
subroutine put (this, particle, ip)
 Save a particle's state to the particle store. More...
 
subroutine transform_coords (this, xorigin, yorigin, zorigin, sinrot, cosrot, invert)
 Transform particle coordinates. More...
 
subroutine reset_transform (this)
 Reset particle coordinate transformation properties. More...
 
subroutine get_model_coords (this, x, y, z)
 Return the particle's model coordinates, inverting any applied transformation if needed. The particle's state is not altered. More...
 
integer function num_stored (this)
 Return the number of particles. More...
 

Variables

integer, parameter max_level = 4
 Tracking "levels" defined in method modules. Currently only 3 used. More...
 

Enumeration Type Documentation

◆ anonymous enum

anonymous enum

Particles begin in status 1 (active) at release time. Status may only increase over time. Status values greater than one imply termination. A particle may terminate for several reasons, all mutually exclusive. A particle's final tracking status will always be greater than one.

Status codes 0-3 and 5-8 correspond directly to MODPATH 7 status codes. Code 4 does not apply to PRT because PRT does not distinguish forwards from backwards tracking. Status code 9 provides more specific, subcell- level information about a particle which terminates due to no outflow. Code 10 distinguishes particles which have "timed out" upon reaching a user-specified stop time or the end of the simulation.

Enumerator
active 
term_boundary 

terminated at a boundary face

term_weaksink 

terminated in a weak sink cell

term_no_exits 

terminated in a cell with no exit face

term_stopzone 

terminated in a cell with a stop zone number

term_inactive 

terminated in an inactive cell

term_unreleased 

terminated permanently unreleased

term_no_exits_sub 

terminated in a subcell with no exit face

term_timeout 

terminated at stop time or end of simulation

Definition at line 28 of file Particle.f90.

Function/Subroutine Documentation

◆ create_particle()

subroutine particlemodule::create_particle ( type(particletype), pointer  particle)

Definition at line 142 of file Particle.f90.

143  type(ParticleType), pointer :: particle !< particle
144  allocate (particle)
145  allocate (particle%history)

◆ create_particle_store()

subroutine particlemodule::create_particle_store ( type(particlestoretype), pointer  store,
integer(i4b), intent(in)  np,
character(*), intent(in)  mempath 
)
Parameters
[in]npnumber of particles
[in]mempathpath to memory

Definition at line 149 of file Particle.f90.

150  type(ParticleStoreType), pointer :: store !< store
151  integer(I4B), intent(in) :: np !< number of particles
152  character(*), intent(in) :: mempath !< path to memory
153 
154  allocate (store)
155  call mem_allocate(store%imdl, np, 'PLIMDL', mempath)
156  call mem_allocate(store%irpt, np, 'PLIRPT', mempath)
157  call mem_allocate(store%iprp, np, 'PLIPRP', mempath)
158  call mem_allocate(store%name, lenboundname, np, 'PLNAME', mempath)
159  call mem_allocate(store%icu, np, 'PLICU', mempath)
160  call mem_allocate(store%ilay, np, 'PLILAY', mempath)
161  call mem_allocate(store%izone, np, 'PLIZONE', mempath)
162  call mem_allocate(store%istatus, np, 'PLISTATUS', mempath)
163  call mem_allocate(store%x, np, 'PLX', mempath)
164  call mem_allocate(store%y, np, 'PLY', mempath)
165  call mem_allocate(store%z, np, 'PLZ', mempath)
166  call mem_allocate(store%trelease, np, 'PLTRELEASE', mempath)
167  call mem_allocate(store%tstop, np, 'PLTSTOP', mempath)
168  call mem_allocate(store%ttrack, np, 'PLTTRACK', mempath)
169  call mem_allocate(store%istopweaksink, np, 'PLISTOPWEAKSINK', mempath)
170  call mem_allocate(store%istopzone, np, 'PLISTOPZONE', mempath)
171  call mem_allocate(store%idrymeth, np, 'PLIDRYMETH', mempath)
172  call mem_allocate(store%frctrn, np, 'PLFRCTRN', mempath)
173  call mem_allocate(store%iexmeth, np, 'PLIEXMETH', mempath)
174  call mem_allocate(store%extol, np, 'PLEXTOL', mempath)
175  call mem_allocate(store%extend, np, 'PLEXTEND', mempath)
176  call mem_allocate(store%icycwin, np, 'PLICYCWIN', mempath)
177  call mem_allocate(store%itrdomain, np, max_level, 'PLIDOMAIN', mempath)
178  call mem_allocate(store%iboundary, np, max_level, 'PLIBOUNDARY', mempath)
Here is the caller graph for this function:

◆ destroy()

subroutine particlemodule::destroy ( class(particlestoretype), intent(inout)  this,
character(*), intent(in)  mempath 
)
Parameters
[in,out]thisstore
[in]mempathpath to memory

Definition at line 182 of file Particle.f90.

183  class(ParticleStoreType), intent(inout) :: this !< store
184  character(*), intent(in) :: mempath !< path to memory
185 
186  call mem_deallocate(this%imdl, 'PLIMDL', mempath)
187  call mem_deallocate(this%iprp, 'PLIPRP', mempath)
188  call mem_deallocate(this%irpt, 'PLIRPT', mempath)
189  call mem_deallocate(this%name, 'PLNAME', mempath)
190  call mem_deallocate(this%icu, 'PLICU', mempath)
191  call mem_deallocate(this%ilay, 'PLILAY', mempath)
192  call mem_deallocate(this%izone, 'PLIZONE', mempath)
193  call mem_deallocate(this%istatus, 'PLISTATUS', mempath)
194  call mem_deallocate(this%x, 'PLX', mempath)
195  call mem_deallocate(this%y, 'PLY', mempath)
196  call mem_deallocate(this%z, 'PLZ', mempath)
197  call mem_deallocate(this%trelease, 'PLTRELEASE', mempath)
198  call mem_deallocate(this%tstop, 'PLTSTOP', mempath)
199  call mem_deallocate(this%ttrack, 'PLTTRACK', mempath)
200  call mem_deallocate(this%istopweaksink, 'PLISTOPWEAKSINK', mempath)
201  call mem_deallocate(this%istopzone, 'PLISTOPZONE', mempath)
202  call mem_deallocate(this%idrymeth, 'PLIDRYMETH', mempath)
203  call mem_deallocate(this%frctrn, 'PLFRCTRN', mempath)
204  call mem_deallocate(this%iexmeth, 'PLIEXMETH', mempath)
205  call mem_deallocate(this%extol, 'PLEXTOL', mempath)
206  call mem_deallocate(this%extend, 'PLEXTEND', mempath)
207  call mem_deallocate(this%icycwin, 'PLICYCWIN', mempath)
208  call mem_deallocate(this%itrdomain, 'PLIDOMAIN', mempath)
209  call mem_deallocate(this%iboundary, 'PLIBOUNDARY', mempath)

◆ destroy_particle()

subroutine particlemodule::destroy_particle ( class(particletype), intent(inout)  particle)

Definition at line 213 of file Particle.f90.

214  class(ParticleType), intent(inout) :: particle !< particle
215  deallocate (particle%history)

◆ get()

subroutine particlemodule::get ( class(particlestoretype), intent(inout)  this,
class(particletype), intent(inout)  particle,
integer(i4b), intent(in)  imdl,
integer(i4b), intent(in)  iprp,
integer(i4b), intent(in)  ip 
)

This routine is used to initialize a particle for tracking. The advancing flag and coordinate transformation are reset.

Parameters
[in,out]thisparticle store
[in]imdlindex of model particle originated in
[in]iprpindex of particle release package particle originated in
[in]ipindex into the particle list

Definition at line 257 of file Particle.f90.

258  class(ParticleStoreType), intent(inout) :: this !< particle store
259  class(ParticleType), intent(inout) :: particle !< particle
260  integer(I4B), intent(in) :: imdl !< index of model particle originated in
261  integer(I4B), intent(in) :: iprp !< index of particle release package particle originated in
262  integer(I4B), intent(in) :: ip !< index into the particle list
263 
264  call particle%reset_transform()
265  call particle%history%Clear()
266  particle%imdl = imdl
267  particle%iprp = iprp
268  particle%irpt = this%irpt(ip)
269  particle%ip = ip
270  particle%name = this%name(ip)
271  particle%istopweaksink = this%istopweaksink(ip)
272  particle%istopzone = this%istopzone(ip)
273  particle%idrymeth = this%idrymeth(ip)
274  particle%icu = this%icu(ip)
275  particle%ilay = this%ilay(ip)
276  particle%izone = this%izone(ip)
277  particle%istatus = this%istatus(ip)
278  particle%x = this%x(ip)
279  particle%y = this%y(ip)
280  particle%z = this%z(ip)
281  particle%trelease = this%trelease(ip)
282  particle%tstop = this%tstop(ip)
283  particle%ttrack = this%ttrack(ip)
284  particle%advancing = .true.
285  particle%itrdomain(1:max_level) = &
286  this%itrdomain(ip, 1:max_level)
287  particle%itrdomain(1) = imdl
288  particle%iboundary(1:max_level) = &
289  this%iboundary(ip, 1:max_level)
290  particle%frctrn = this%frctrn(ip)
291  particle%iexmeth = this%iexmeth(ip)
292  particle%extol = this%extol(ip)
293  particle%extend = this%extend(ip)
294  particle%icycwin = this%icycwin(ip)

◆ get_model_coords()

subroutine particlemodule::get_model_coords ( class(particletype), intent(in)  this,
real(dp), intent(out)  x,
real(dp), intent(out)  y,
real(dp), intent(out)  z 
)
Parameters
[in]thisparticle
[out]xx coordinate
[out]yy coordinate
[out]zz coordinate

Definition at line 381 of file Particle.f90.

382  use geomutilmodule, only: transform, compose
383  class(ParticleType), intent(in) :: this !< particle
384  real(DP), intent(out) :: x !< x coordinate
385  real(DP), intent(out) :: y !< y coordinate
386  real(DP), intent(out) :: z !< z coordinate
387 
388  if (this%transformed) then
389  call transform(this%x, this%y, this%z, x, y, z, &
390  this%xorigin, this%yorigin, this%zorigin, &
391  this%sinrot, this%cosrot, invert=.true.)
392  else
393  x = this%x
394  y = this%y
395  z = this%z
396  end if
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
Here is the call graph for this function:

◆ num_stored()

integer function particlemodule::num_stored ( class(particlestoretype this)

Definition at line 400 of file Particle.f90.

401  class(ParticleStoreType) :: this
402  n = size(this%imdl)

◆ put()

subroutine particlemodule::put ( class(particlestoretype), intent(inout)  this,
class(particletype), intent(in)  particle,
integer(i4b), intent(in)  ip 
)
Parameters
[in,out]thisparticle storage
[in]ipparticle index

Definition at line 298 of file Particle.f90.

299  class(ParticleStoreType), intent(inout) :: this !< particle storage
300  class(ParticleType), intent(in) :: particle !< particle
301  integer(I4B), intent(in) :: ip !< particle index
302 
303  this%imdl(ip) = particle%imdl
304  this%iprp(ip) = particle%iprp
305  this%irpt(ip) = particle%irpt
306  this%name(ip) = particle%name
307  this%istopweaksink(ip) = particle%istopweaksink
308  this%istopzone(ip) = particle%istopzone
309  this%idrymeth(ip) = particle%idrymeth
310  this%icu(ip) = particle%icu
311  this%ilay(ip) = particle%ilay
312  this%izone(ip) = particle%izone
313  this%istatus(ip) = particle%istatus
314  this%x(ip) = particle%x
315  this%y(ip) = particle%y
316  this%z(ip) = particle%z
317  this%trelease(ip) = particle%trelease
318  this%tstop(ip) = particle%tstop
319  this%ttrack(ip) = particle%ttrack
320  this%itrdomain( &
321  ip, &
322  1:max_level) = &
323  particle%itrdomain(1:max_level)
324  this%iboundary( &
325  ip, &
326  1:max_level) = &
327  particle%iboundary(1:max_level)
328  this%frctrn(ip) = particle%frctrn
329  this%iexmeth(ip) = particle%iexmeth
330  this%extol(ip) = particle%extol
331  this%extend(ip) = particle%extend
332  this%icycwin(ip) = particle%icycwin

◆ reset_transform()

subroutine particlemodule::reset_transform ( class(particletype), intent(inout)  this)
Parameters
[in,out]thisparticle

Definition at line 366 of file Particle.f90.

367  class(ParticleType), intent(inout) :: this !< particle
368 
369  this%xorigin = dzero
370  this%yorigin = dzero
371  this%zorigin = dzero
372  this%sinrot = dzero
373  this%cosrot = done
374  this%cosrot = done
375  this%transformed = .false.

◆ resize()

subroutine particlemodule::resize ( class(particlestoretype), intent(inout)  this,
integer(i4b), intent(in)  np,
character(*), intent(in)  mempath 
)
Parameters
[in,out]thisparticle store
[in]npnumber of particles
[in]mempathpath to memory

Definition at line 219 of file Particle.f90.

220  ! dummy
221  class(ParticleStoreType), intent(inout) :: this !< particle store
222  integer(I4B), intent(in) :: np !< number of particles
223  character(*), intent(in) :: mempath !< path to memory
224 
225  ! resize arrays
226  call mem_reallocate(this%imdl, np, 'PLIMDL', mempath)
227  call mem_reallocate(this%iprp, np, 'PLIPRP', mempath)
228  call mem_reallocate(this%irpt, np, 'PLIRPT', mempath)
229  call mem_reallocate(this%name, lenboundname, np, 'PLNAME', mempath)
230  call mem_reallocate(this%icu, np, 'PLICU', mempath)
231  call mem_reallocate(this%ilay, np, 'PLILAY', mempath)
232  call mem_reallocate(this%izone, np, 'PLIZONE', mempath)
233  call mem_reallocate(this%istatus, np, 'PLISTATUS', mempath)
234  call mem_reallocate(this%x, np, 'PLX', mempath)
235  call mem_reallocate(this%y, np, 'PLY', mempath)
236  call mem_reallocate(this%z, np, 'PLZ', mempath)
237  call mem_reallocate(this%trelease, np, 'PLTRELEASE', mempath)
238  call mem_reallocate(this%tstop, np, 'PLTSTOP', mempath)
239  call mem_reallocate(this%ttrack, np, 'PLTTRACK', mempath)
240  call mem_reallocate(this%istopweaksink, np, 'PLISTOPWEAKSINK', mempath)
241  call mem_reallocate(this%istopzone, np, 'PLISTOPZONE', mempath)
242  call mem_reallocate(this%idrymeth, np, 'PLIDRYMETH', mempath)
243  call mem_reallocate(this%frctrn, np, 'PLFRCTRN', mempath)
244  call mem_reallocate(this%iexmeth, np, 'PLIEXMETH', mempath)
245  call mem_reallocate(this%extol, np, 'PLEXTOL', mempath)
246  call mem_reallocate(this%extend, np, 'PLEXTEND', mempath)
247  call mem_reallocate(this%icycwin, np, 'PLICYCWIN', mempath)
248  call mem_reallocate(this%itrdomain, np, max_level, 'PLIDOMAIN', mempath)
249  call mem_reallocate(this%iboundary, np, max_level, 'PLIBOUNDARY', mempath)

◆ transform_coords()

subroutine particlemodule::transform_coords ( class(particletype), intent(inout)  this,
real(dp), intent(in), optional  xorigin,
real(dp), intent(in), optional  yorigin,
real(dp), intent(in), optional  zorigin,
real(dp), intent(in), optional  sinrot,
real(dp), intent(in), optional  cosrot,
logical(lgp), intent(in), optional  invert 
)

Apply a translation and/or rotation to particle coordinates. No rescaling. It's also possible to invert a transformation. Be sure to reset the transformation after using it.

Parameters
[in,out]thisparticle
[in]xoriginx coordinate of origin
[in]yoriginy coordinate of origin
[in]zoriginz coordinate of origin
[in]sinrotsine of rotation angle
[in]cosrotcosine of rotation angle
[in]invertwhether to invert

Definition at line 341 of file Particle.f90.

343  use geomutilmodule, only: transform, compose
344  class(ParticleType), intent(inout) :: this !< particle
345  real(DP), intent(in), optional :: xorigin !< x coordinate of origin
346  real(DP), intent(in), optional :: yorigin !< y coordinate of origin
347  real(DP), intent(in), optional :: zorigin !< z coordinate of origin
348  real(DP), intent(in), optional :: sinrot !< sine of rotation angle
349  real(DP), intent(in), optional :: cosrot !< cosine of rotation angle
350  logical(LGP), intent(in), optional :: invert !< whether to invert
351 
352  call transform(this%x, this%y, this%z, &
353  this%x, this%y, this%z, &
354  xorigin, yorigin, zorigin, &
355  sinrot, cosrot, invert)
356 
357  call compose(this%xorigin, this%yorigin, this%zorigin, &
358  this%sinrot, this%cosrot, &
359  xorigin, yorigin, zorigin, &
360  sinrot, cosrot, invert)
361 
362  this%transformed = .true.
Here is the call graph for this function:

Variable Documentation

◆ max_level

integer, parameter particlemodule::max_level = 4

Definition at line 12 of file Particle.f90.

12  integer, parameter :: MAX_LEVEL = 4