Sleep in Fortran

后端 未结 3 1311
长情又很酷
长情又很酷 2021-02-12 23:27

Does anyone know of an way to sleep for a given number of milliseconds in Fortran? I do not want to use non-portable system calls so anything intrinsic to Fortran or C librarie

相关标签:
3条回答
  • 2021-02-12 23:44

    Using the Fortran ISO C Binding to use the C library sleep to sleep in units of seconds:

       module Fortran_Sleep
    
       use, intrinsic :: iso_c_binding, only: c_int
    
       implicit none
    
       interface
    
          !  should be unsigned int ... not available in Fortran
          !  OK until highest bit gets set.
          function FortSleep (seconds)  bind ( C, name="sleep" )
              import
              integer (c_int) :: FortSleep
              integer (c_int), intent (in), VALUE :: seconds
          end function FortSleep
    
       end interface
    
    end module Fortran_Sleep
    
    
    program test_Fortran_Sleep
    
       use, intrinsic :: iso_c_binding, only: c_int
    
       use Fortran_Sleep
    
       implicit none
    
       integer (c_int) :: wait_sec, how_long
    
       write (*, '( "Input sleep time: " )', advance='no')
       read (*, *) wait_sec
       how_long = FortSleep ( wait_sec )
    
       write (*, *) how_long
    
       stop
    
    end program test_Fortran_Sleep
    
    0 讨论(0)
  • 2021-02-12 23:45
          ! This is another option of making your fortran code to wait for x seconds
           Integer :: iStart, iNew
           Real*8 :: rWait, rDT
          ! rWait: seconds that you want to wait for; you can also set this as an (IN)
          ! variable if this code goes into a subroutine that is developed to be called 
          ! from any part of the program.
          rWait = 1.d0; rDT = 0.d0
          call system_clock (iStart)
          do while (rDT <= rWait)
              call system_clock (iNew)
              rDT = floatj (iNew - iStart) / 10000.d0
          enddo
    
    0 讨论(0)
  • 2021-02-12 23:52

    You can use Fortran standard intrinsic functions to do this without C binding:

    program sleep
    !===============================================================================
    implicit none
    character(len=100) :: arg ! input argument character string
    integer,dimension(8) :: t ! arguments for date_and_time
    integer :: s1,s2,ms1,ms2  ! start and end times [ms]
    real :: dt                ! desired sleep interval [ms]
    !===============================================================================
    ! Get start time:
    call date_and_time(values=t)
    ms1=(t(5)*3600+t(6)*60+t(7))*1000+t(8)
    
    ! Get the command argument, e.g. sleep time in milliseconds:
    call get_command_argument(number=1,value=arg)
    read(unit=arg,fmt=*)dt
    
    do ! check time:
      call date_and_time(values=t)
      ms2=(t(5)*3600+t(6)*60+t(7))*1000+t(8)
      if(ms2-ms1>=dt)exit
    enddo
    !===============================================================================
    endprogram sleep
    

    Assuming the executable is slp:

    ~$ time slp 1234
    
    real        0m1.237s
    user        0m1.233s
    sys         0m0.003s 
    

    Add a special case to this program if you are worried it will break around midnight :)

    0 讨论(0)
提交回复
热议问题