Check a number of conditions determining whether to continue tracking the particle or terminate it, as well as whether to record any output data as per selected reporting conditions.
66 class(MethodCellType),
intent(inout) :: this
67 type(ParticleType),
pointer,
intent(inout) :: particle
68 type(CellDefnType),
pointer,
intent(inout) :: cell_defn
69 real(DP),
intent(in) :: tmax
71 logical(LGP) :: dry_cell, dry_particle, no_exit_face, stop_zone, weak_sink
73 real(DP) :: t, ttrackmax
75 dry_cell = this%fmi%ibdgwfsat0(cell_defn%icell) == 0
76 dry_particle = particle%z > cell_defn%top
77 no_exit_face = cell_defn%inoexitface > 0
78 stop_zone = cell_defn%izone > 0 .and. particle%istopzone == cell_defn%izone
79 weak_sink = cell_defn%iweaksink > 0
81 particle%izone = cell_defn%izone
87 if (no_exit_face .and. .not. dry_cell)
then
93 if (particle%istopweaksink > 0)
then
97 call this%weaksink(particle)
102 if (particle%idrymeth == 0)
then
105 no_exit_face = .false.
106 else if (particle%idrymeth == 1)
then
110 else if (particle%idrymeth == 2)
then
112 particle%advancing = .false.
113 no_exit_face = .false.
125 particle%ttrack =
totim
126 call this%timestep(particle)
129 call this%tracktimes%advance()
130 if (this%tracktimes%any())
then
131 do i = this%tracktimes%selection(1), this%tracktimes%selection(2)
132 t = this%tracktimes%times(i)
136 call this%usertime(particle)
137 if (t > ttrackmax) ttrackmax = t
143 particle%ttrack = ttrackmax
148 else if (dry_particle .and. this%name /=
"passtobottom")
then
149 if (particle%idrymeth == 0)
then
151 particle%z = cell_defn%top
152 else if (particle%idrymeth == 1)
then
156 else if (particle%idrymeth == 2)
then
158 particle%advancing = .false.
159 no_exit_face = .false.
171 particle%ttrack =
totim
172 call this%timestep(particle)
175 call this%tracktimes%advance()
176 if (this%tracktimes%any())
then
177 do i = this%tracktimes%selection(1), this%tracktimes%selection(2)
178 t = this%tracktimes%times(i)
182 call this%usertime(particle)
183 if (t > ttrackmax) ttrackmax = t
189 if (no_exit_face)
then
190 particle%advancing = .false.
192 call this%terminate(particle)
@, public weaksink
particle entered a weak sink
@, public usertime
user-specified tracking time
@, public terminate
particle terminated
@, public timestep
time step ended
@ term_weaksink
terminated in a weak sink cell
@ term_inactive
terminated in an inactive cell
@ term_no_exits
terminated in a cell with no exit face
@ term_stopzone
terminated in a cell with a stop zone number
logical(lgp), pointer, public endofsimulation
flag indicating end of simulation
real(dp), pointer, public totim
time relative to start of simulation
real(dp), pointer, public totimc
simulation time at start of time step