如何在 Fortran 程序中设置内部挂钟?
How to set internal wall clock in a Fortran program?
我使用 Fortran 进行一些科学计算。我使用高性能计算。正如我们所知,当我们在 HPC 作业调度程序中提交作业时,我们还会为作业指定挂钟时间限制。但是,当时间到了,如果作业还在写输出数据,它会被终止,并且会导致数据中有一些 'NUL' 值,给 post-processing 带来麻烦:
那么,我们能否设置一个内部机制,让我们的作业可以在 HPC allowance time 结束前的某个时间和平地自行停止?
相关问题:How to skip reading "NUL" value in MATLAB's textscan function?
在意识到你的问题后,我发现我最近在我的程序中实现了类似的功能(提交 https://bitbucket.org/LadaF/elmm/commits/f10a1b3421a3dd14fdcbe165aa70bf5c5001413f)。但是我还是得手动设置时间限制。
最重要的部分:
time_stepping%clock_time_limit
是以秒为单位的时间限制。计算对应的系统时钟滴答数:
call system_clock(count_rate = timer_rate)
call system_clock(count_max = timer_max_count)
timer_count_time_limit = int( min(time_stepping%clock_time_limit &
* real(timer_rate, knd), &
real(timer_max_count, knd) * 0.999_dbl) &
, dbl)
启动计时器
call system_clock(count = time_steps_timer_count_start)
检查计时器并退出主循环,如果时间到了error_exit
设置为.true.
if (mod(time_step,time_stepping%check_period)==0) then
if (master) then
error_exit = time_steps_timer_count_2 - time_steps_timer_count_start > timer_count_time_limit
if (error_exit) write(*,*) "Maximum clock time exceeded."
end if
MPI_Bcast the error exit to other processes
if (error_exit) exit
end if
现在,您可能希望自动从您的调度程序中获取时间限制。这将因不同的作业调度软件而异。会有一个像$PBS_WALLTIME
这样的环境变量。请参阅 Get walltime in a PBS job script,但请查看您的调度程序手册。
读取此变量
我使用 Fortran 进行一些科学计算。我使用高性能计算。正如我们所知,当我们在 HPC 作业调度程序中提交作业时,我们还会为作业指定挂钟时间限制。但是,当时间到了,如果作业还在写输出数据,它会被终止,并且会导致数据中有一些 'NUL' 值,给 post-processing 带来麻烦:
那么,我们能否设置一个内部机制,让我们的作业可以在 HPC allowance time 结束前的某个时间和平地自行停止?
相关问题:How to skip reading "NUL" value in MATLAB's textscan function?
在意识到你的问题后,我发现我最近在我的程序中实现了类似的功能(提交 https://bitbucket.org/LadaF/elmm/commits/f10a1b3421a3dd14fdcbe165aa70bf5c5001413f)。但是我还是得手动设置时间限制。
最重要的部分:
time_stepping%clock_time_limit
是以秒为单位的时间限制。计算对应的系统时钟滴答数:
call system_clock(count_rate = timer_rate)
call system_clock(count_max = timer_max_count)
timer_count_time_limit = int( min(time_stepping%clock_time_limit &
* real(timer_rate, knd), &
real(timer_max_count, knd) * 0.999_dbl) &
, dbl)
启动计时器
call system_clock(count = time_steps_timer_count_start)
检查计时器并退出主循环,如果时间到了error_exit
设置为.true.
if (mod(time_step,time_stepping%check_period)==0) then
if (master) then
error_exit = time_steps_timer_count_2 - time_steps_timer_count_start > timer_count_time_limit
if (error_exit) write(*,*) "Maximum clock time exceeded."
end if
MPI_Bcast the error exit to other processes
if (error_exit) exit
end if
现在,您可能希望自动从您的调度程序中获取时间限制。这将因不同的作业调度软件而异。会有一个像$PBS_WALLTIME
这样的环境变量。请参阅 Get walltime in a PBS job script,但请查看您的调度程序手册。