MODULE Random ! Contains functions for random number generation ! EVERYTIME ONE OF THE FUNCTION IS CALLED THE SEED IS INITIALIZED INTEGER, SAVE :: Seed ! Seed for random number generation CONTAINS ! ------------------------------------------------------------------------------------------------- SUBROUTINE ReadSeedForRandomNumberGeneration IMPLICIT NONE OPEN(1,FILE='Seed.inp',STATUS='old') READ(1,*) Seed CLOSE(1) PRINT '(1/,A,i10,1/)', ' First seed read from Seed.inp: ', Seed RETURN END SUBROUTINE ! ------------------------------------------------------------------------------------------------- SUBROUTINE WriteSeedForNextSeries IMPLICIT NONE OPEN(1,FILE='Seed.inp') WRITE(1,*) Seed CLOSE(1) PRINT '(1/,A,i10)', ' Seed for next calculations : ', Seed PRINT '(A,1/)', ' File Seed.inp replaced by new one! ' ! RETURN END SUBROUTINE ! ------------------------------------------------------------------------------------------------- FUNCTION RAN0() RESULT( random ) ! Generate real random number between 0 and 1 IMPLICIT NONE INTEGER :: k REAL :: random INTEGER, PARAMETER :: IA=16807,IM=2147483647,IQ=127773,IR=2836,MASK=123459876 REAL, PARAMETER :: AM=1./IM Seed = ieor( Seed , MASK ) k = Seed / IQ Seed = IA * ( Seed - k * IQ ) - IR * k IF ( Seed < 0 ) Seed = Seed + IM random = AM * Seed Seed = ieor( Seed, MASK ) RETURN END FUNCTION ! ------------------------------------------------------------------------------------------------- FUNCTION IRAN( n, m ) RESULT( IntegerRandom ) ! Generate integer random number between n and m IMPLICIT NONE INTEGER :: n, m, IntegerRandom IntegerRandom = n + ( ( m - n + 1 ) * RAN0() ) RETURN END FUNCTION END MODULE