22 use,
intrinsic :: iso_fortran_env
61 integer :: iteration = 0
62 integer(int64) :: step = -1
63 integer(int64) :: global_iteration = 0
64 procedure(get_value),
pointer,
public ::
value => null()
82 generic ::
operator(+) => add
83 generic ::
operator(-) => subtract
84 generic ::
operator(.eq.) => is_equal
85 generic ::
operator(/=) => is_different
86 generic ::
operator(.lt.) => is_earlier
87 generic ::
operator(.gt.) => is_later
88 generic ::
operator(.le.) => is_equal_or_earlier
89 generic ::
operator(.ge.) => is_equal_or_later
107 integer(int64),
optional,
intent(in) :: step
108 integer,
optional,
intent(in) :: initial_iteration
110 if (
present(initial_iteration))
then
111 counter%iteration = initial_iteration
113 if (
present(step))
then
118 counter%global_iteration = counter%iteration * counter%step
130 if (mod(counter%global_iteration, this%step) /= 0)
then
131 message(1) =
'Cannot set iteration counter, as the new iteration is not commensurable with counter step.'
132 call messages_fatal(1)
135 this%iteration = int(counter%global_iteration / this%step)
136 this%global_iteration = counter%global_iteration
148 value = real(this%global_iteration, real64)
157 counter = this%iteration
172 integer,
intent(in) :: n
176 new_counter%iteration = new_counter%iteration + n
177 new_counter%global_iteration = new_counter%iteration * new_counter%step
184 integer,
intent(in) :: n
188 new_counter%iteration = new_counter%iteration - n
189 new_counter%global_iteration = new_counter%iteration * new_counter%step
198 this%global_iteration = 0
206 is_earlier = counter_a%global_iteration < counter_b%global_iteration
214 is_later = counter_a%global_iteration > counter_b%global_iteration
222 is_equal_or_earlier = counter_a%global_iteration <= counter_b%global_iteration
230 is_equal_or_later = counter_a%global_iteration >= counter_b%global_iteration
238 are_equal = counter_a%global_iteration == counter_b%global_iteration
246 are_diff = counter_a%global_iteration /= counter_b%global_iteration
253 character(len=*),
intent(in) :: filename
254 type(namespace_t),
intent(in) :: namespace
256 type(restart_basic_t) :: restart
257 integer :: restart_file_unit
260 call restart%init(namespace, restart_iteration, restart_type_dump, ierr)
263 restart_file_unit = restart%open(filename)
264 if (restart%do_i_write())
write(restart_file_unit, *) this%iteration, this%step
265 call restart%close(restart_file_unit)
267 write(message(1), *)
"Could not write restart file '",trim(filename),
"'."
268 call messages_warning(1)
277 character(len=*),
intent(in) :: filename
278 type(namespace_t),
intent(in) :: namespace
280 type(restart_basic_t) :: restart
281 integer :: restart_file_unit
284 call restart%init(namespace, restart_iteration, restart_type_load, ierr)
287 restart_file_unit = restart%open(filename)
288 read(restart_file_unit, *) this%iteration, this%step
289 call restart%close(restart_file_unit)
290 this%global_iteration = this%iteration * this%step
296 success = (ierr == 0)
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...