22 use,
intrinsic :: iso_fortran_env
60 integer :: iteration = 0
61 integer(int64) :: step = -1
62 integer(int64) :: global_iteration = 0
63 procedure(get_value),
pointer,
public ::
value => null()
81 generic ::
operator(+) => add
82 generic ::
operator(-) => subtract
83 generic ::
operator(.eq.) => is_equal
84 generic ::
operator(/=) => is_different
85 generic ::
operator(.lt.) => is_earlier
86 generic ::
operator(.gt.) => is_later
87 generic ::
operator(.le.) => is_equal_or_earlier
88 generic ::
operator(.ge.) => is_equal_or_later
106 integer(int64),
optional,
intent(in) :: step
107 integer,
optional,
intent(in) :: initial_iteration
109 if (
present(initial_iteration))
then
110 counter%iteration = initial_iteration
112 if (
present(step))
then
117 counter%global_iteration = counter%iteration * counter%step
129 if (mod(counter%global_iteration, this%step) /= 0)
then
130 message(1) =
'Cannot set iteration counter, as the new iteration is not commensurable with counter step.'
131 call messages_fatal(1)
134 this%iteration = int(counter%global_iteration / this%step)
135 this%global_iteration = counter%global_iteration
147 value = real(this%global_iteration, real64)
156 counter = this%iteration
171 integer,
intent(in) :: n
175 new_counter%iteration = new_counter%iteration + n
176 new_counter%global_iteration = new_counter%iteration * new_counter%step
183 integer,
intent(in) :: n
187 new_counter%iteration = new_counter%iteration - n
188 new_counter%global_iteration = new_counter%iteration * new_counter%step
197 this%global_iteration = 0
205 is_earlier = counter_a%global_iteration < counter_b%global_iteration
213 is_later = counter_a%global_iteration > counter_b%global_iteration
221 is_equal_or_earlier = counter_a%global_iteration <= counter_b%global_iteration
229 is_equal_or_later = counter_a%global_iteration >= counter_b%global_iteration
237 are_equal = counter_a%global_iteration == counter_b%global_iteration
245 are_diff = counter_a%global_iteration /= counter_b%global_iteration
252 character(len=*),
intent(in) :: filename
253 type(namespace_t),
intent(in) :: namespace
255 integer :: restart_file_unit
257 call io_mkdir(
"restart", namespace, parents=.
true.)
258 restart_file_unit = io_open(
"restart/"//filename, namespace, form=
"unformatted", action=
'write')
259 write(restart_file_unit) this%iteration, this%step
260 call io_close(restart_file_unit)
267 character(len=*),
intent(in) :: filename
268 type(namespace_t),
intent(in) :: namespace
270 integer :: restart_file_unit
272 restart_file_unit = io_open(
"restart/"//filename, namespace, form=
"unformatted", action=
'read', die=.false.)
273 if (restart_file_unit /= -1)
then
274 read(restart_file_unit) this%iteration, this%step
275 call io_close(restart_file_unit)
277 this%global_iteration = this%iteration * this%step
278 restart_read = .
true.
281 restart_read = .false.
pure subroutine iteration_counter_reset(this)
elemental logical function iteration_counter_is_equal(counter_a, counter_b)
elemental logical function iteration_counter_is_equal_or_earlier(counter_a, counter_b)
elemental logical function iteration_counter_is_different(counter_a, counter_b)
pure integer(int64) function iteration_counter_global_step(this)
logical function iteration_counter_restart_read(this, filename, namespace)
pure real(real64) function iteration_counter_value(this)
Returns the value of the counter in the common reference frame.
pure integer function iteration_counter_counter(this)
Returns the value of the counter in the local reference frame.
subroutine iteration_counter_restart_write(this, filename, namespace)
elemental logical function iteration_counter_is_earlier(counter_a, counter_b)
pure type(iteration_counter_t) function iteration_counter_constructor(step, initial_iteration)
subroutine iteration_counter_set(this, counter)
type(iteration_counter_t) function iteration_counter_subtract(this, n)
elemental logical function iteration_counter_is_equal_or_later(counter_a, counter_b)
type(iteration_counter_t) function iteration_counter_add(this, n)
elemental logical function iteration_counter_is_later(counter_a, counter_b)
This class implements the iteration counter used by the multisystem algorithms. As any iteration coun...