MODFLOW 6  version 6.9.0.dev0
USGS Modular Hydrologic Model
particlereleaseschedulemodule Module Reference

Particle release scheduling.

Data Types

type  particlereleasescheduletype
 Particle release scheduling utility. More...
 

Functions/Subroutines

type(particlereleasescheduletype) function, pointer, public create_release_schedule (tolerance)
 Create a new release schedule. More...
 
subroutine destroy (this)
 Deallocate the release schedule. More...
 
subroutine log (this, iout)
 Write the release schedule to the given output unit. More...
 
subroutine schedule (this, trelease)
 Add a release time to the schedule. More...
 
subroutine advance (this, lines)
 Refresh the schedule for the current time step. More...
 
logical function any (this)
 Check if any releases are scheduled. More...
 
integer function count (this)
 Return the number of releases scheduled. More...
 

Function/Subroutine Documentation

◆ advance()

subroutine particlereleaseschedulemodule::advance ( class(particlereleasescheduletype), intent(inout)  this,
character(len=linelength), dimension(:), intent(in), optional  lines 
)
private

This involves several tasks: first, advance the time selection. Then, if period-block release setting lines are provided, reinitialize the time step selection for the given period. Finally, refresh the schedule array, deduplicating any times closer than the set tolerance.

Definition at line 106 of file ParticleReleaseSchedule.f90.

107  use tdismodule, only: totimc, kstp, endofperiod
108  class(ParticleReleaseScheduleType), intent(inout) :: this
109  character(len=LINELENGTH), intent(in), optional :: lines(:)
110  integer(I4B) :: it, i
111  real(DP) :: tprevious
112  real(DP) :: trelease
113 
114  ! Advance the time selection.
115  call this%time_select%advance()
116 
117  ! Reinitialize the time step selection if new
118  ! period-block release settings are provided.
119  if (present(lines)) then
120  call this%step_select%init()
121  do i = 1, size(lines)
122  call this%step_select%read(lines(i))
123  end do
124  end if
125 
126  ! Reinitialize the release time schedule.
127  if (allocated(this%times)) deallocate (this%times)
128  allocate (this%times(0))
129 
130  tprevious = -done
131  trelease = -done
132 
133  ! Add a release time configured by period-block settings, if one
134  ! is scheduled this time step and doesn't coincide with any
135  ! explicitly configured release time (see above).
136  if (this%step_select%is_selected(kstp, endofperiod=endofperiod)) then
137  trelease = totimc
138  if (.not. this%time_select%contains_close(trelease, this%tolerance)) then
139  call this%schedule(trelease)
140  tprevious = trelease
141  end if
142  end if
143 
144  ! Schedule explicitly specified release times, up
145  ! to the configured tolerance of coincidence
146  if (this%time_select%any()) then
147  do it = this%time_select%selection(1), this%time_select%selection(2)
148  trelease = this%time_select%times(it)
149  if (tprevious >= dzero .and. is_close( &
150  tprevious, &
151  trelease, &
152  atol=this%tolerance)) cycle
153 
154  call this%schedule(trelease)
155  tprevious = trelease
156  end do
157  end if
logical(lgp), pointer, public endofperiod
flag indicating end of stress period
Definition: tdis.f90:30
real(dp), pointer, public totimc
simulation time at start of time step
Definition: tdis.f90:36
integer(i4b), pointer, public kstp
current time step number
Definition: tdis.f90:27
Here is the call graph for this function:

◆ any()

logical function particlereleaseschedulemodule::any ( class(particlereleasescheduletype)  this)

Note: be sure to call advance() before calling this function, or the result may still be associated with a prior time step.

Definition at line 165 of file ParticleReleaseSchedule.f90.

166  class(ParticleReleaseScheduleType) :: this
167  a = this%count() > 0

◆ count()

integer function particlereleaseschedulemodule::count ( class(particlereleasescheduletype)  this)
private

Note: be sure to call advance() before calling this function, or the result may still be associated with a prior time step.

Definition at line 175 of file ParticleReleaseSchedule.f90.

176  class(ParticleReleaseScheduleType) :: this
177  n = size(this%times)

◆ create_release_schedule()

type(particlereleasescheduletype) function, pointer, public particlereleaseschedulemodule::create_release_schedule ( real(dp), intent(in)  tolerance)
Parameters
[in]tolerancecoincident release time tolerance
Returns
schedule pointer

Definition at line 46 of file ParticleReleaseSchedule.f90.

47  real(DP), intent(in) :: tolerance !< coincident release time tolerance
48  type(ParticleReleaseScheduleType), pointer :: schedule_ !< schedule pointer
49 
50  allocate (schedule_)
51  allocate (schedule_%times(0))
52  allocate (schedule_%time_select)
53  allocate (schedule_%step_select)
54  call schedule_%time_select%init()
55  call schedule_%step_select%init()
56  schedule_%tolerance = tolerance
Here is the caller graph for this function:

◆ destroy()

subroutine particlereleaseschedulemodule::destroy ( class(particlereleasescheduletype), intent(inout)  this)
private
Parameters
[in,out]thisthis instance

Definition at line 60 of file ParticleReleaseSchedule.f90.

61  class(ParticleReleaseScheduleType), intent(inout) :: this !< this instance
62 
63  deallocate (this%times)
64  call this%time_select%deallocate()
65  call this%step_select%deallocate()
66  deallocate (this%time_select)
67  deallocate (this%step_select)

◆ log()

subroutine particlereleaseschedulemodule::log ( class(particlereleasescheduletype), intent(inout)  this,
integer(i4b), intent(in)  iout 
)
private
Parameters
[in,out]thisthis instance
[in]ioutoutput unit

Definition at line 71 of file ParticleReleaseSchedule.f90.

72  class(ParticleReleaseScheduleType), intent(inout) :: this !< this instance
73  integer(I4B), intent(in) :: iout !< output unit
74  character(len=*), parameter :: fmt = &
75  &"(6x,A,': ',50(G0,' '))"
76 
77  if (this%any()) then
78  write (iout, fmt) 'RELEASE SCHEDULE', this%times
79  else
80  write (iout, "(1x,a,1x,a)") 'NO RELEASES SCHEDULED'
81  end if

◆ schedule()

subroutine particlereleaseschedulemodule::schedule ( class(particlereleasescheduletype), intent(inout)  this,
real(dp), intent(in)  trelease 
)
private

To schedule multiple release times at once, expand and populate the time selection object by hand. DO NOT attempt to manipulate the times array; this is a read-only property which the schedule maintains.

Definition at line 91 of file ParticleReleaseSchedule.f90.

92  class(ParticleReleaseScheduleType), intent(inout) :: this
93  real(DP), intent(in) :: trelease
94  call expandarray(this%times)
95  this%times(size(this%times)) = trelease