random_number_seed Function

public function random_number_seed(info, file)

Arguments

Type IntentOptional Attributes Name
integer, intent(in), optional :: info
integer, intent(in), optional :: file

Return Value integer


Source Code

  integer function random_number_seed(info,file)
    integer,optional,intent(in) :: info,file
    integer                     :: t(8),rn,is
    integer,parameter           :: LMASK=huge(rn) ! = 0111...111
    integer,parameter           :: LUN=676769
    character (len=80)          :: rdev0='/dev/urandom',rdev1='/dev/random',rdev
    logical                     :: openok,readok,printinfo
    openok=.true.
    readok=.true.
    if (present(file)) then
       if (file==0) then
          rdev=rdev0
       else
          rdev=rdev1
       end if
    else
       rdev=rdev0
    end if
    if (present(info)) then
       printinfo=(info/=0)
    else
       printinfo=.false.
    end if
    open(LUN,file=rdev,form='unformatted',access='stream',action='read',iostat=is)
    if (is/=0) then
       openok=.false.
       print *,'open',is
    else
       read(LUN,iostat=is) rn
       if (is/=0) then
          readok=.false.
       end if
    end if
    if (openok) close(LUN)
    if (openok.and.readok) then
       rn=iand(rn,LMASK) ! Make it positive, i.e. zero the leftmost bit
       if (printinfo) write(6,'(a,a,a,i0)') 'Seed from ',trim(rdev),': ',rn
    else
       call date_and_time(values=t)
       rn=t(7)+60*(t(6)+60*(t(5)+24*(t(3)-1+31*(t(2)-1+12*t(1)))))+t(8)
       if (printinfo) write(6,'(a,i12)') 'Seed from time:',rn
    end if
    random_number_seed=rn
    return
  end function random_number_seed