program main !*****************************************************************************80 ! !! MAIN is the main program for UNIFORM_PRB. ! ! Discussion: ! ! UNIFORM_PRB calls sample problems for the UNIFORM library. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 22 April 2008 ! ! Author: ! ! John Burkardt ! implicit none call timestamp ( ) write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'UNIFORM_PRB' write ( *, '(a)' ) ' FORTRAN90 version' write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' Test the routines in the UNIFORM library.' call test01 ( ) call test02 ( ) call test03 ( ) call test04 ( ) call test05 ( ) call test06 ( ) call test065 ( ) call test07 ( ) call test08 ( ) call test09 ( ) call test10 ( ) call test11 ( ) call test111 ( ) call test112 ( ) call test118 ( ) call test119 ( ) call test12 ( ) call test13 ( ) call test14 ( ) call test15 ( ) call test16 ( ) call test17 ( ) call test18 ( ) call test19 ( ) call test20 ( ) call test21 ( ) call test22 ( ) write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'UNIFORM_PRB' write ( *, '(a)' ) ' Normal end of execution.' write ( *, '(a)' ) ' ' call timestamp ( ) stop end subroutine test01 ( ) !*****************************************************************************80 ! !! TEST01 tests C4_UNIFORM_01. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none complex ( kind = 4 ) c4_uniform_01 integer ( kind = 4 ) i integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST01' write ( *, '(a)' ) ' C4_UNIFORM_01 computes pseudorandom complex values ' write ( *, '(a)' ) ' uniformly distributed in the unit circle.' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,f14.8,2x,f14.8)' ) i, c4_uniform_01 ( seed ) end do return end subroutine test02 ( ) !*****************************************************************************80 ! !! TEST02 tests C4VEC_UNIFORM_01. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ), parameter :: n = 10 complex ( kind = 4 ) c(n) integer ( kind = 4 ) i integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST02' write ( *, '(a)' ) ' C4VEC_UNIFORM_01 computes pseudorandom complex values ' write ( *, '(a)' ) ' uniformly distributed in the unit circle.' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init call c4vec_uniform_01 ( n, seed, c ) write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,f14.8,2x,f14.8)' ) i, c(i) end do return end subroutine test03 ( ) !*****************************************************************************80 ! !! TEST03 tests C8_UNIFORM_01. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none complex ( kind = 8 ) c8_uniform_01 integer ( kind = 4 ) i integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST03' write ( *, '(a)' ) ' C8_UNIFORM_01 computes pseudorandom double precision' write ( *, '(a)' ) ' complex values uniformly distributed in the unit' write ( *, '(a)' ) ' circle.' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,f14.8,2x,f14.8)' ) i, c8_uniform_01 ( seed ) end do return end subroutine test04 ( ) !*****************************************************************************80 ! !! TEST04 tests C8VEC_UNIFORM_01. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer, parameter :: n = 10 complex ( kind = 8 ) c(n) integer ( kind = 4 ) i integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST04' write ( *, '(a)' ) ' C8VEC_UNIFORM_01 computes pseudorandom ' write ( *, '(a)' ) ' double precision complex values uniformly distributed ' write ( *, '(a)' ) ' in the unit circle.' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init call c8vec_uniform_01 ( n, seed, c ) write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,f14.8,2x,f14.8)' ) i, c(i) end do return end subroutine test05 ( ) !*****************************************************************************80 ! !! TEST05 tests CH_UNIFORM. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none character ch_uniform character chi character clo integer ( kind = 4 ) i integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST05' write ( *, '(a)' ) ' CH_UNIFORM computes pseudorandom characters ' write ( *, '(a)' ) ' in an interval [CLO,CHI].' clo = 'A' chi = 'J' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' The lower endpoint CLO = "' // clo // '".' write ( *, '(a)' ) ' The upper endpoint CHI = "' // chi // '".' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,a1)' ) i, ch_uniform ( clo, chi, seed ) end do return end subroutine test06 ( ) !*****************************************************************************80 ! !! TEST06 tests GET_SEED. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none real ( kind = 8 ) r8_uniform_01 integer ( kind = 4 ) i integer ( kind = 4 ) j integer ( kind = 4 ) seed integer ( kind = 4 ) seed_old write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST06' write ( *, '(a)' ) ' GET_SEED picks an initial seed value for UNIFORM.' write ( *, '(a)' ) ' The value chosen should vary over time, because' write ( *, '(a)' ) ' the seed is based on reading the clock.' write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' This is just the "calendar" clock, which does' write ( *, '(a)' ) ' not change very fast, so calling GET_SEED several' write ( *, '(a)' ) ' times in a row may result in the same value.' seed = 12345678 seed_old = seed write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' Initial SEED is ', seed write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' Next 3 values of R8_UNIFORM:' write ( *, '(a)' ) ' ' do j = 1, 3 write ( *, '(2x,f14.8)' ) r8_uniform_01 ( seed ) end do do i = 1, 4 do call get_seed ( seed ) if ( seed /= seed_old ) then seed_old = seed exit end if end do write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' New seed from GET_SEED is ', seed write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' Next 3 values of R8_UNIFORM_01:' write ( *, '(a)' ) ' ' do j = 1, 3 write ( *, '(2x,f14.8)' ) r8_uniform_01 ( seed ) end do end do return end subroutine test065 ( ) !*****************************************************************************80 ! !! TEST065 tests I4_SEED_ADVANCE. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 14 December 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ) i4_seed_advance integer ( kind = 4 ) seed integer ( kind = 4 ) seed_new integer ( kind = 4 ) step write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST065' write ( *, '(a)' ) ' I4_SEED_ADVANCE advances the seed.' write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' Step SEED input SEED output' write ( *, '(a)' ) ' ' seed_new = 12345 do step = 1, 10 seed = seed_new seed_new = i4_seed_advance ( seed ) write ( *, '(2x,i4,2x,i16,2x,i16)' ) step, seed, seed_new end do return end subroutine test07 ( ) !*****************************************************************************80 ! !! TEST07 tests I4_UNIFORM. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ), parameter :: a = 6 integer ( kind = 4 ), parameter :: b = 10 integer ( kind = 4 ) freq(a:b) integer ( kind = 4 ) i integer ( kind = 4 ) i4_uniform integer ( kind = 4 ) j integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 integer ( kind = 4 ) test integer ( kind = 4 ), parameter :: test_num = 10000 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST07' write ( *, '(a)' ) ' I4_UNIFORM computes pseudorandom values ' write ( *, '(a)' ) ' in an interval [A,B].' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The lower endpoint A = ', a write ( *, '(a,i12)' ) ' The upper endpoint B = ', b write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' freq(a:b) = 0 do test = 1, test_num j = i4_uniform ( a, b, seed ) if ( j < a ) then write ( *, '(a,i8)' ) ' Illegal value J = ', j else if ( j <= b ) then freq(j) = freq(j) + 1 else write ( *, '(a,i8)' ) ' Illegal value J = ', j end if end do write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' I Frequency' write ( *, '(a)' ) ' ' do i = a, b write ( *, '(2x,i8,2x,i8)' ) i, freq(i) end do return end subroutine test08 ( ) !*****************************************************************************80 ! !! TEST08 tests I4_UNIFORM. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ), parameter :: a = -100 integer ( kind = 4 ), parameter :: b = 200 integer ( kind = 4 ) i integer ( kind = 4 ) i4_uniform integer ( kind = 4 ) j integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST08' write ( *, '(a)' ) ' I4_UNIFORM computes pseudorandom values ' write ( *, '(a)' ) ' in an interval [A,B].' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The lower endpoint A = ', a write ( *, '(a,i12)' ) ' The upper endpoint B = ', b write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 20 j = i4_uniform ( a, b, seed ) write ( *, '(2x,i8,2x,i8)' ) i, j end do return end subroutine test09 ( ) !*****************************************************************************80 ! !! TEST09 tests I4_UNIFORM_0I ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ) i integer ( kind = 4 ) i4_uniform_0i real ( kind = 4 ) mean integer ( kind = 4 ), parameter :: n = 1000 integer ( kind = 4 ) seed real ( kind = 4 ) variance integer ( kind = 4 ) x(n) write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST09' write ( *, '(a)' ) ' I4_UNIFORM_0I samples a uniform random' write ( *, '(a)' ) ' integer distribution in [0,2**31-1].' seed = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' Starting with seed = ', seed do i = 1, n x(i) = i4_uniform_0i ( seed ) end do write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' First few values:' write ( *, '(a)' ) ' ' do i = 1, 5 write ( *, '(2x,i8,2x,i12)' ) i, x(i) end do mean = sum ( real ( x(1:n), kind = 4 ) / real ( n, kind = 4 ) ) variance = sum ( ( real ( x(1:n), kind = 4 ) - mean )**2 ) & / real ( n - 1, kind = 4 ) write ( *, '(a)' ) ' ' write ( *, '(a,i8)' ) ' Number of values computed was N = ', n write ( *, '(a,g14.6)' ) ' Average value was ', mean write ( *, '(a,i12)' ) ' Minimum value was ', minval ( x(1:n) ) write ( *, '(a,i12)' ) ' Maximum value was ', maxval ( x(1:n) ) write ( *, '(a,g14.6)' ) ' Variance was ', variance return end subroutine test10 ( ) !*****************************************************************************80 ! !! TEST10 tests I4VEC_UNIFORM. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ), parameter :: n = 10000 integer ( kind = 4 ), parameter :: a = 6 integer ( kind = 4 ), parameter :: b = 10 integer ( kind = 4 ) freq(a:b) integer ( kind = 4 ) i integer ( kind = 4 ) i4vec(n) integer ( kind = 4 ) j integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST10' write ( *, '(a)' ) ' I4VEC_UNIFORM computes a vector of pseudorandom values ' write ( *, '(a)' ) ' in an interval [A,B].' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The lower endpoint A = ', a write ( *, '(a,i12)' ) ' The upper endpoint B = ', b write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' freq(a:b) = 0 call i4vec_uniform ( n, a, b, seed, i4vec ) do i = 1, n if ( i4vec(i) < a ) then write ( *, '(a,i8)' ) ' Illegal value J = ', i4vec(i) else if ( i4vec(i) <= b ) then freq(i4vec(i)) = freq(i4vec(i)) + 1 else write ( *, '(a,i8)' ) ' Illegal value J = ', i4vec(i) end if end do write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' I Frequency' write ( *, '(a)' ) ' ' do i = a, b write ( *, '(2x,i8,2x,i8)' ) i, freq(i) end do return end subroutine test11 ( ) !*****************************************************************************80 ! !! TEST11 tests I8_UNIFORM. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 22 May 2008 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 8 ) a integer ( kind = 8 ) b integer ( kind = 8 ) i integer ( kind = 8 ) i8_uniform integer ( kind = 8 ) seed ! integer ( kind = 8 ), parameter :: seed_init = 123456789 integer ( kind = 8 ), parameter :: seed_init = 123456789987654321_8 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST11' write ( *, '(a)' ) ' I8_UNIFORM computes pseudorandom values ' write ( *, '(a)' ) ' in an interval [A,B].' ! a = 100000 a = 1000000000_8 ! b = 800000 b = 8000000000_8 seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i24)' ) ' The lower endpoint A = ', a write ( *, '(a,i24)' ) ' The upper endpoint B = ', b write ( *, '(a,i24)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,i24)' ) i, i8_uniform ( a, b, seed ) end do return end subroutine test111 ( ) !*****************************************************************************80 ! !! TEST111 tests L_UNIFORM. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 01 December 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ) i logical l_uniform integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST111' write ( *, '(a)' ) ' L_UNIFORM computes pseudorandom logical values.' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,l1)' ) i, l_uniform ( seed ) end do return end subroutine test112 ( ) !*****************************************************************************80 ! !! TEST112 tests LVEC_UNIFORM. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 01 December 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ), parameter :: n = 10 integer ( kind = 4 ) i logical lvec(n) integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST112' write ( *, '(a)' ) ' LVEC_UNIFORM_01 computes a vector of' write ( *, '(a)' ) ' pseudorandom logical values.' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init call lvec_uniform ( n, seed, lvec ) write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,l1)' ) i, lvec(i) end do return end subroutine test118 ( ) !*****************************************************************************80 ! !! TEST118 tests LCRG_ANBN. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 22 April 2008 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ) a integer ( kind = 4 ) an integer ( kind = 4 ) b integer ( kind = 4 ) bn integer ( kind = 4 ) c integer ( kind = 4 ) n write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST118' write ( *, '(a)' ) ' LCRG_ANBN determines a linear congruential random' write ( *, '(a)' ) ' number generator equivalent to N steps of a given one.' ! ! These parameters define the old (1969) IBM 360 random number generator: ! a = 16807 b = 0 c = 2147483647 write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' LCRG parameters:' write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' A = ', a write ( *, '(a,i12)' ) ' B = ', b write ( *, '(a,i12)' ) ' C = ', c write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' N A B' write ( *, '(a)' ) ' ' do n = 0, 10 call lcrg_anbn ( a, b, c, n, an, bn ) write ( *, '(2x,i12,2x,i12,2x,i12)' ) n, an, bn end do return end subroutine test119 ( ) !*****************************************************************************80 ! !! TEST119 tests LCRG_ANBN. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 22 April 2008 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ) a integer ( kind = 4 ) an integer ( kind = 4 ) b integer ( kind = 4 ) bn integer ( kind = 4 ) c integer ( kind = 4 ) j integer ( kind = 4 ) k integer ( kind = 4 ) n integer ( kind = 4 ) u integer ( kind = 4 ) v integer ( kind = 4 ), allocatable, dimension ( : ) :: x integer ( kind = 4 ), allocatable, dimension ( : ) :: y write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST119' write ( *, '(a)' ) ' LCRG_ANBN determines a linear congruential random' write ( *, '(a)' ) ' number generator equivalent to N steps of a given one.' ! ! These parameters define the old (1969) IBM 360 random number generator: ! a = 16807 b = 0 c = 2147483647 write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' LCRG parameters:' write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' A = ', a write ( *, '(a,i12)' ) ' B = ', b write ( *, '(a,i12)' ) ' C = ', c write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' N In Out' write ( *, '(a)' ) ' ' k = 0 u = 12345 write ( *, '(2x,12x,2x,i12,2x,12x,2x,i12)' ) k, u do k = 1, 11 call lcrg_evaluate ( a, b, c, u, v ) write ( *, '(2x,12x,2x,i12,2x,i12,2x,i12)' ) k, u, v u = v end do ! ! Now try to replicate these results using N procesors. ! n = 4 allocate ( x(1:n) ) allocate ( y(1:n) ) call lcrg_anbn ( a, b, c, n, an, bn ) write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' LCRG parameters:' write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' AN = ', an write ( *, '(a,i12)' ) ' BN = ', bn write ( *, '(a,i12)' ) ' C = ', c write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' J N In Out' write ( *, '(a)' ) ' ' x(1) = 12345 do j = 2, n call lcrg_evaluate ( a, b, c, x(j-1), x(j) ) end do do j = 1, n write ( *, '(2x,i12,2x,i12,2x,12x,2x,i12)' ) j, j-1, x(j) end do do k = n + 1, 12, n do j = 1, n call lcrg_evaluate ( an, bn, c, x(j), y(j) ) write ( *, '(2x,i12,2x,i12,2x,i12,2x,i12)' ) j, k+j-2, x(j), y(j) x(j) = y(j) end do end do deallocate ( x ) deallocate ( y ) return end subroutine test12 ( ) !*****************************************************************************80 ! !! TEST12 tests LCRG_SEED. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ) a integer ( kind = 4 ) b integer ( kind = 4 ) c integer ( kind = 4 ) i real ( kind = 4 ) r4_uniform_01 integer ( kind = 4 ) seed integer ( kind = 4 ) seed_in integer ( kind = 4 ) seed_lcrg integer ( kind = 4 ) seed_out integer ( kind = 4 ) seed_start real ( kind = 4 ) u write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST12' write ( *, '(a)' ) ' LCRG_SEED directly computes the updated value of a' write ( *, '(a)' ) ' seed used by an linear congruential random number' write ( *, '(a)' ) ' generator.' write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' I SEED SEED SEED U' write ( *, '(a)' ) ' Input Output LCRG' write ( *, '(a)' ) ' ' ! ! These parameters define the old (1969) IBM 360 random number generator: ! a = 16807 b = 0 c = 2147483647 ! ! This seed value was used in Pierre L'Ecuyer's article. ! seed_start = 12345 seed = seed_start ! ! Compute 1000 random numbers "the hard way", that is, sequentially. ! Every now and then, call LCRG_SEED to compute SEED directly. ! do i = 1, 1000 seed_in = seed u = r4_uniform_01 ( seed ) seed_out = seed if ( i <= 10 .or. i == 100 .or. i == 1000 ) then call lcrg_seed ( a, b, c, i, seed_start, seed_lcrg ) write ( *, '(2x,i8,2x,i12,2x,i12,2x,i12,2x,g14.6)' ) & i, seed_in, seed_out, seed_lcrg, u end if end do return end subroutine test13 ( ) !*****************************************************************************80 ! !! TEST13 tests R4_UNIFORM. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none real ( kind = 4 ) a real ( kind = 4 ) b integer ( kind = 4 ) i real ( kind = 4 ) r4_uniform integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST13' write ( *, '(a)' ) ' R4_UNIFORM computes pseudorandom values ' write ( *, '(a)' ) ' in an interval [A,B].' a = 5.0E+00 b = 10.0E+00 seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,g14.6)' ) ' The lower endpoint A = ', a write ( *, '(a,g14.6)' ) ' The upper endpoint B = ', b write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,g14.6)' ) i, r4_uniform ( a, b, seed ) end do return end subroutine test14 ( ) !*****************************************************************************80 ! !! TEST14 tests R4_UNIFORM_01. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ) i real ( kind = 4 ) r4_uniform_01 integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST14' write ( *, '(a)' ) ' R4_UNIFORM_01 computes pseudorandom values ' write ( *, '(a)' ) ' in the interval [0,1].' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,g14.6)' ) i, r4_uniform_01 ( seed ) end do return end subroutine test15 ( ) !*****************************************************************************80 ! !! TEST15 tests R8_UNIFORM. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none real ( kind = 8 ) a real ( kind = 8 ) b real ( kind = 8 ) r8_uniform integer ( kind = 4 ) i integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST15' write ( *, '(a)' ) ' R8_UNIFORM computes pseudorandom values ' write ( *, '(a)' ) ' in an interval [A,B].' a = 5.0D+00 b = 10.0D+00 seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,g14.6)' ) ' The lower endpoint A = ', a write ( *, '(a,g14.6)' ) ' The upper endpoint B = ', b write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,g14.6)' ) i, r8_uniform ( a, b, seed ) end do return end subroutine test16 ( ) !*****************************************************************************80 ! !! TEST16 tests R8_UNIFORM_01. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none real ( kind = 8 ) r8_uniform_01 integer ( kind = 4 ) i integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST16' write ( *, '(a)' ) ' R8_UNIFORM_01 computes pseudorandom values ' write ( *, '(a)' ) ' in the interval [0,1].' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,g14.6)' ) i, r8_uniform_01 ( seed ) end do return end subroutine test17 ( ) !*****************************************************************************80 ! !! TEST17 tests R8_UNIFORM_01. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer, parameter :: n = 1000 integer ( kind = 4 ) i real ( kind = 8 ) r8_uniform_01 integer ( kind = 4 ) seed integer ( kind = 4 ) seed_in integer ( kind = 4 ) seed_out real ( kind = 8 ) u(n) real ( kind = 8 ) u_avg real ( kind = 8 ) u_var write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST17' write ( *, '(a)' ) ' R8_UNIFORM_01 computes a sequence of ' write ( *, '(a)' ) ' uniformly distributed pseudorandom numbers.' ! ! Start with a known seed. ! seed = 12345 write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' Initial SEED = ', seed write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' First 10 values:' write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' I Input Output R8_UNIFORM_01' write ( *, '(a)' ) ' SEED SEED' write ( *, '(a)' ) ' ' do i = 1, 10 seed_in = seed u(i) = r8_uniform_01 ( seed ) seed_out = seed write ( *, '(i8,2x,i12,2x,i12,2x,g14.6)' ) i, seed_in, seed_out, u(i) end do write ( *, '(a)' ) ' ' write ( *, '(a,i10,a)' ) ' Now compute ', n, ' elements.' write ( *, '(a)' ) ' ' u_avg = 0.0D+00 do i = 1, n u(i) = r8_uniform_01 ( seed ) u_avg = u_avg + u(i) end do u_avg = u_avg / real ( n, kind = 8 ) u_var = sum ( ( u(1:n) - u_avg )**2 ) / real ( n - 1, kind = 8 ) write ( *, '(a)' ) ' ' write ( *, '(a,f10.6)' ) ' Average value = ', u_avg write ( *, '(a,f10.6)' ) ' Expecting ', 0.5D+00 write ( *, '(a)' ) ' ' write ( *, '(a,f10.6)' ) ' Variance = ', u_var write ( *, '(a,f10.6)' ) ' Expecting ', 1.0D+00 / 12.0D+00 return end subroutine test18 ( ) !*****************************************************************************80 ! !! TEST18 tests R8_UNIFORM_01. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ) i real ( kind = 8 ) r8_uniform_01 integer ( kind = 4 ) seed integer ( kind = 4 ) seed_in integer ( kind = 4 ) seed_out integer ( kind = 4 ) seed_save real ( kind = 8 ) x write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST18' write ( *, '(a)' ) ' R8_UNIFORM_01 computes a sequence of pseudorandom' write ( *, '(a)' ) ' numbers but all computations depend on the seed value.' write ( *, '(a)' ) ' In this test, we show how a sequence of "random"' write ( *, '(a)' ) ' values can be manipulated by accessing the seed.' seed = 1066 write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' Initial SEED is ', seed write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' Call R8_UNIFORM_01 10 times, and watch SEED.' write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' I Input Output R8_UNIFORM_01' write ( *, '(a)' ) ' SEED SEED' write ( *, '(a)' ) ' ' do i = 1, 10 seed_in = seed if ( i == 5 ) then seed_save = seed end if x = r8_uniform_01 ( seed ) seed_out = seed write ( *, '(i8,2x,i12,2x,i12,2x,g14.6)' ) i, seed_in, seed_out,x end do seed = seed_save write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' Reset SEED to its value at step 5, = ', seed write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' Now call R8_UNIFORM_01 10 times, and watch how SEED' write ( *, '(a)' ) ' and R8_UNIFORM_01 restart themselves.' write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' I Input Output R8_UNIFORM_01' write ( *, '(a)' ) ' SEED SEED' write ( *, '(a)' ) ' ' do i = 1, 10 seed_in = seed x = r8_uniform_01 ( seed ) seed_out = seed write ( *, '(i8,2x,i12,2x,i12,2x,g14.6)' ) i, seed_in, seed_out,x end do seed = -12345678 write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' What happens with a negative SEED?' write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' I Input Output R8_UNIFORM_01' write ( *, '(a)' ) ' SEED SEED' write ( *, '(a)' ) ' ' do i = 1, 10 seed_in = seed x = r8_uniform_01 ( seed ) seed_out = seed write ( *, '(i8,2x,i12,2x,i12,2x,g14.6)' ) i, seed_in, seed_out,x end do return end subroutine test19 ( ) !*****************************************************************************80 ! !! TEST19 tests R8_UNIFORM_01 and R8MAT_UNIFORM_01. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ), parameter :: m = 100 integer ( kind = 4 ), parameter :: n = 10 real ( kind = 8 ) a(m,n) real ( kind = 8 ) b(m,n) integer ( kind = 4 ) i integer ( kind = 4 ) j integer ( kind = 4 ) k real ( kind = 8 ) r8_uniform_01 integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST19' write ( *, '(a)' ) ' R8_UNIFORM_01 computes pseudorandom values ' write ( *, '(a)' ) ' one at a time.' write ( *, '(a)' ) ' R8MAT_UNIFORM_01 computes a matrix of values.' write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' For the same initial seed, the results should ' write ( *, '(a)' ) ' be identical, but R8MAT_UNIFORM_01 might be faster.' write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init seed = seed_init do j = 1, n do i = 1, m a(i,j) = r8_uniform_01 ( seed ) end do end do seed = seed_init; call r8mat_uniform_01 ( m, n, seed, b ) write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' I J A(I,J) B(I,J)' write ( *, '(a)' ) ' (R8_UNIFORM_01) (R8MAT_UNIFORM_01)' write ( *, '(a)' ) ' ' do k = 0, 10 i = ( k * m + ( 10 - k ) * 1 ) / 10 j = ( k * n + ( 10 - k ) * 1 ) / 10 write ( *, '(2x,i8,2x,i8,2x,g14.6,2x,g14.6)' ) i, j, a(i,j), b(i,j) end do return end subroutine test20 ( ) !*****************************************************************************80 ! !! TEST20 tests R8_UNIFORM_01 and R8VEC_UNIFORM_01. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none integer ( kind = 4 ), parameter :: n = 10 real ( kind = 8 ) a(n) real ( kind = 8 ) b(n) real ( kind = 8 ) r8_uniform_01 integer ( kind = 4 ) i integer ( kind = 4 ) seed integer ( kind = 4 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST20' write ( *, '(a)' ) ' R8_UNIFORM_01 computes pseudorandom values ' write ( *, '(a)' ) ' one at a time.' write ( *, '(a)' ) ' R8VEC_UNIFORM_01 computes a vector of values.' write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' For the same initial seed, the results should ' write ( *, '(a)' ) ' be identical, but R8VEC_UNIFORM_01 might be faster.' write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init seed = seed_init do i = 1, n a(i) = r8_uniform_01 ( seed ) end do seed = seed_init; call r8vec_uniform_01 ( n, seed, b ) write ( *, '(a)' ) ' ' write ( *, '(a)' ) ' I A(I) B(I)' write ( *, '(a)' ) ' (R8_UNIFORM_01) (R8VEC_UNIFORM_01)' write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,g14.6,2x,g14.6)' ) i, a(i), b(i) end do return end subroutine test21 ( ) !*****************************************************************************80 ! !! TEST21 tests R8I8_UNIFORM. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none real ( kind = 8 ) a real ( kind = 8 ) b real ( kind = 8 ) r8i8_uniform integer ( kind = 8 ) i integer ( kind = 8 ) seed integer ( kind = 8 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST21' write ( *, '(a)' ) ' R8I8_UNIFORM computes pseudorandom values ' write ( *, '(a)' ) ' in an interval [A,B] using an I8 seed.' a = 5.0D+00 b = 10.0D+00 seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,g14.6)' ) ' The lower endpoint A = ', a write ( *, '(a,g14.6)' ) ' The upper endpoint B = ', b write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,g14.6)' ) i, r8i8_uniform ( a, b, seed ) end do return end subroutine test22 ( ) !*****************************************************************************80 ! !! TEST22 tests R8I8_UNIFORM_01. ! ! Licensing: ! ! This code is distributed under the GNU LGPL license. ! ! Modified: ! ! 31 May 2007 ! ! Author: ! ! John Burkardt ! implicit none real ( kind = 8 ) r8i8_uniform_01 integer ( kind = 8 ) i integer ( kind = 8 ) seed integer ( kind = 8 ), parameter :: seed_init = 123456789 write ( *, '(a)' ) ' ' write ( *, '(a)' ) 'TEST22' write ( *, '(a)' ) ' R8I8_UNIFORM_01 computes pseudorandom values ' write ( *, '(a)' ) ' in the interval [0,1] using an I8 seed.' seed = seed_init write ( *, '(a)' ) ' ' write ( *, '(a,i12)' ) ' The initial seed is ', seed_init write ( *, '(a)' ) ' ' do i = 1, 10 write ( *, '(2x,i8,2x,g14.6)' ) i, r8i8_uniform_01 ( seed ) end do return end