22 use,
intrinsic :: iso_fortran_env
61 integer :: iteration = 0
62 integer :: initial_iteration = 0
63 integer(int64) :: step = -1
64 integer(int64) :: global_iteration = 0
65 procedure(get_value),
pointer,
public ::
value => null()
83 generic ::
operator(+) => add
84 generic ::
operator(-) => subtract
85 generic ::
operator(.eq.) => is_equal
86 generic ::
operator(/=) => is_different
87 generic ::
operator(.lt.) => is_earlier
88 generic ::
operator(.gt.) => is_later
89 generic ::
operator(.le.) => is_equal_or_earlier
90 generic ::
operator(.ge.) => is_equal_or_later
98 logical,
optional,
intent(in) :: elapsed
109 integer(int64),
optional,
intent(in) :: step
110 integer,
optional,
intent(in) :: initial_iteration
112 if (
present(initial_iteration))
then
113 counter%iteration = initial_iteration
115 if (
present(step))
then
120 counter%global_iteration = counter%iteration * counter%step
132 if (mod(counter%global_iteration, this%step) /= 0)
then
133 message(1) =
'Cannot set iteration counter, as the new iteration is not commensurable with counter step.'
134 call messages_fatal(1)
137 this%iteration = int(counter%global_iteration / this%step)
138 this%global_iteration = counter%global_iteration
149 logical,
optional,
intent(in) :: elapsed
151 value = real(this%global_iteration, real64)
152 if (optional_default(elapsed, .false.))
then
153 value =
value - real(this%initial_iteration*this%step, real64)
163 counter = this%iteration
178 integer,
intent(in) :: n
182 new_counter%iteration = new_counter%iteration + n
183 new_counter%global_iteration = new_counter%iteration * new_counter%step
190 integer,
intent(in) :: n
194 new_counter%iteration = new_counter%iteration - n
195 new_counter%global_iteration = new_counter%iteration * new_counter%step
204 this%global_iteration = 0
212 is_earlier = counter_a%global_iteration < counter_b%global_iteration
220 is_later = counter_a%global_iteration > counter_b%global_iteration
228 is_equal_or_earlier = counter_a%global_iteration <= counter_b%global_iteration
236 is_equal_or_later = counter_a%global_iteration >= counter_b%global_iteration
244 are_equal = counter_a%global_iteration == counter_b%global_iteration
252 are_diff = counter_a%global_iteration /= counter_b%global_iteration
259 character(len=*),
intent(in) :: filename
260 type(namespace_t),
intent(in) :: namespace
262 type(restart_basic_t) :: restart
263 integer :: restart_file_unit
266 call restart%init(namespace, restart_iteration, restart_type_dump, ierr)
269 restart_file_unit = restart%open(filename)
270 if (restart%do_i_write())
write(restart_file_unit, *) this%iteration, this%step
271 call restart%close(restart_file_unit)
273 write(message(1), *)
"Could not write restart file '",trim(filename),
"'."
274 call messages_warning(1)
283 character(len=*),
intent(in) :: filename
284 type(namespace_t),
intent(in) :: namespace
286 type(restart_basic_t) :: restart
287 integer :: restart_file_unit
290 call restart%init(namespace, restart_iteration, restart_type_load, ierr)
293 restart_file_unit = restart%open(filename)
294 read(restart_file_unit, *) this%iteration, this%step
295 call restart%close(restart_file_unit)
296 this%global_iteration = this%iteration * this%step
297 this%initial_iteration = this%iteration
302 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 integer function iteration_counter_counter(this)
Returns the value of the counter in the local reference frame.
pure real(real64) function iteration_counter_value(this, elapsed)
Returns the value of the counter in the common 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...