Sleep in Fortran

11,268

Solution 1

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

Solution 2

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 :)

Share:
11,268
Brian Triplett
Author by

Brian Triplett

Updated on June 04, 2022

Comments

  • Brian Triplett
    Brian Triplett almost 2 years

    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 libraries would be preferred.

  • Brian Triplett
    Brian Triplett over 12 years
    do you think the 'sleep' function provided inside of Intel Fortran is basically doing the same thing you provided above?
  • M. S. B.
    M. S. B. over 12 years
    Yes, the functionally is probably the same. A similar subroutine is available in gfortran. This is an extension that might not be part of some other compiler.
  • milancurcic
    milancurcic over 12 years
    Which reminds me. This approach should definitely not be used if you need cpu time during sleep period. I assumed you do not this for long waits for remote data. If you do, you are far better off using a shell wrapper, because example above is cpu intensive.
  • Hossein Talebi
    Hossein Talebi about 10 years
    Hi, in Linux I could use this and it works fine. In Windows and using MinGW, when compiling it complains that it cannot find Sleep function. Do you know how to fix this?
  • zbeekman
    zbeekman over 5 years
    This answer is definitely more portable than the accepted answer.
  • zbeekman
    zbeekman over 5 years
    This solution is not portable across OSes. (*nix only, I believe.) @milancurcic 's answer below should work across all OSes.
  • Dan Sp.
    Dan Sp. over 5 years
    system_clock is still non-portable. It may behave differently on different systems/different compilers. Check out this answer already.
  • Vladimir F Героям слава
    Vladimir F Героям слава over 5 years
    It is portable, but one has to query the clock rate and use the value one gets. Also, this is just busy wating en.wikipedia.org/wiki/Busy_waiting, not proper sleeping.
  • Vladimir F Героям слава
    Vladimir F Героям слава over 5 years
    It is slightly more portable, but it is busy waiting, not proper sleeping, so the accepted answer is the right one to be accepted.
  • Shriraj Hegde
    Shriraj Hegde almost 2 years
    This is busy waiting, this can't really be considered as sleep.