如何在Fortran程序中设置内部挂钟?

时间:2017-03-27 23:18:32

标签: fortran clock hpc nul

我使用Fortran进行一些科学计算。我使用HPC。众所周知,当我们在HPC作业调度程序中提交作业时,我们还会为作业指定挂钟时间限制。但是,当时间到了,如果作业仍然在写输出数据,它将被终止,这将导致一些“NUL”。数据中的值,导致后处理的麻烦:

enter image description here

那么,我们是否可以设定一个内部机制,使我们的工作能够在HPC津贴时间结束前的某个时间安静地停止?

相关问题:How to skip reading "NUL" value in MATLAB's textscan function?

1 个答案:

答案 0 :(得分:2)

在意识到你的要求后,我发现我最近在程序中实现了类似的功能(commit 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,但请查看您的日程安排手册。

您可以使用GET_ENVIRONMENT_VARIABLE()

阅读此变量