32 use,
intrinsic :: iso_fortran_env
43 real(real64) :: start_time
44 real(real64) :: last_tap
45 real(real64) :: iteration_time
46 real(real64) :: margin
47 real(real64) :: duration
48 real(real64) :: restart_last_tap
49 real(real64) :: restart_duration
53 logical :: restart_active
66 logical,
optional,
intent(in) :: auto
68 real(real64) :: alarm_time, write_time, restart_alarm_time, slurm_start_time, slurm_end_time, slurm_time
69 character(len=128) :: env_start, env_end
70 integer :: status_start, status_end
71 logical :: walltime_slurm
97 call get_environment_variable(
"SLURM_JOB_START_TIME", env_start, status=status_start)
98 call get_environment_variable(
"SLURM_JOB_END_TIME", env_end, status=status_end)
99 if (status_start == 0 .and. status_end == 0)
then
100 read(env_start, *, iostat=status_start) slurm_start_time
101 read(env_end, *, iostat=status_end) slurm_end_time
102 if (status_start == 0 .and. status_end == 0)
then
104 slurm_time = (slurm_end_time - slurm_start_time) / 60.0_real64
133 if (write_time > alarm_time/
m_four) write_time = alarm_time/
m_four
146 restart_active = .false.
180 restart_duration = time
203 last_tap = start_time
204 restart_last_tap = start_time
209 if (restart_duration > 60.0_real64) restart_active = .
true.
216 logical,
optional,
intent(in) :: print
224 iteration_time = now - last_tap
228 write(
message(1),
'("Walltimer_tap: elapsed time = ",F6.2," (", 3F10.5, "), active = ",L1 )') &
229 now - start_time, duration, iteration_time, margin, active
238 type(mpi_comm),
intent(in) :: comm
239 logical,
optional,
intent(in) :: print
251 write(
message(1),
'("Walltimer_alarm: elapsed time = ",F6.2," (", 3F10.5, "), active = ",L1 )') &
252 now - start_time, duration, iteration_time, margin, active
258 walltimer_alarm = active .and. (now > start_time + duration - iteration_time - margin)
262 call mpi_debug_in(comm, c_mpi_allreduce)
264 call mpi_debug_out(comm, c_mpi_allreduce)
269 write(
message(1),
'("Walltimer stopping execution after = ",F6.2," minutes.")') (now - start_time)/60.0_real64
280 type(mpi_comm),
intent(in) :: comm
295 call mpi_debug_in(comm, c_mpi_allreduce)
297 call mpi_debug_out(comm, c_mpi_allreduce)
302 restart_last_tap = now
303 write(
message(1),
'(a)')
"Restart walltime period is reached: writing restart data"
unsigned int alarm(unsigned int __seconds) __attribute__((__nothrow__
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
real(real64), parameter, public m_one
subroutine, public messages_switch_status(status)
create status file for asynchronous communication
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
type(namespace_t), public global_namespace
This module provices a simple timer class which can be used to trigger the writing of a restart file ...
subroutine, public walltimer_init(auto)
initialize the timer
subroutine, public walltimer_end()
destructor
subroutine set_alarm(time)
set alarm interval in seconds
logical function, public walltimer_alarm(comm, print)
indicate whether time is up
real(real64) function, public walltimer_get_start_time()
Return the walltimer start time.
logical function, public restart_walltime_period_alarm(comm)
subroutine start()
start the timer (save starting time)
subroutine, public walltimer_tap(print)
measure time of one iteration
subroutine set_restart_alarm(time)
set restart alarm interval in seconds
subroutine set_margin(time)
set safty margin in seconds