From 299d9e6bc45d770fb9ec02981b1fa952debb055f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 30 Aug 2012 14:58:30 +0000 Subject: [PATCH] fixed bug in seed initialization that didn't allow to redo calculations that started with a random seed. Now the whole random seed array is set to one value, previously only the first one was reported and the remaining ones were random removed old random function used by halton --- code/math.f90 | 72 ++++++--------------------------------------------- 1 file changed, 8 insertions(+), 64 deletions(-) diff --git a/code/math.f90 b/code/math.f90 index c28bcedf5..a4b887e58 100644 --- a/code/math.f90 +++ b/code/math.f90 @@ -220,27 +220,29 @@ subroutine math_init if (allocated(randInit)) deallocate(randInit) allocate(randInit(randSize)) if (fixedSeed > 0_pInt) then - randInit(1:randSize) = int(fixedSeed) ! fixedSeed is of type pInt, randInit not + randInit(1:randSize) = int(fixedSeed) ! fixedSeed is of type pInt, randInit not call random_seed(put=randInit) else call random_seed() + call random_seed(get = randInit) + randInit(2:randSize) = randInit(1) + call random_seed(put = randInit) endif - call random_seed(get=randInit) - do i = 1_pInt, 4_pInt call random_number(randTest(i)) enddo !$OMP CRITICAL (write2out) - write(6,*) 'value of random seed: ', randInit(1) write(6,*) 'size of random seed: ', randSize + do i =1, randSize + write(6,*) 'value of random seed: ', i, randInit(i) + enddo write(6,'(a,4(/,26x,f17.14))') ' start of random sequence: ', randTest write(6,*) '' !$OMP END CRITICAL (write2out) - call random_seed(put=randInit) - call random_seed(get=randInit) + call random_seed(put = randInit) call halton_seed_set(int(randInit(1), pInt)) call halton_ndim_set(3_pInt) @@ -2159,64 +2161,6 @@ pure subroutine math_hi(M,HI1M,HI2M,HI3M) end subroutine math_hi -!-------------------------------------------------------------------------------------------------- -!> @brief GET_SEED returns a seed for the random number generator. -! -! The seed depends on the current time, and ought to be (slightly) -! different every millisecond. Once the seed is obtained, a random -! number generator should be called a few times to further process -! the seed. -! -! Parameters: -! Output, integer SEED, a pseudorandom seed value. -! -! Modified: 27 June 2000 -! Author: John Burkardt -! -! Modified: 29 April 2005 -! Author: Franz Roters -!-------------------------------------------------------------------------------------------------- -subroutine get_seed(seed) - implicit none - - integer(pInt) :: seed - real(pReal) :: temp = 0.0_pReal - character(len = 10) :: time - character(len = 8) :: today - integer(pInt) :: values(8) - character(len = 5) :: zone - - call date_and_time (today, time, zone, values) - - temp = temp + real(values(2)- 1_pInt, pReal) / 11.0_pReal - temp = temp + real(values(3)- 1_pInt, pReal) / 30.0_pReal - temp = temp + real(values(5), pReal) / 23.0_pReal - temp = temp + real(values(6), pReal) / 59.0_pReal - temp = temp + real(values(7), pReal) / 59.0_pReal - temp = temp + real(values(8), pReal) / 999.0_pReal - temp = temp / 6.0_pReal - - if (temp <= 0.0_pReal) then - temp = 1.0_pReal / 3.0_pReal - else if (1.0_pReal <= temp) then - temp = 2.0_pReal / 3.0_pReal - end if - - seed = int(real(huge(1_pInt),pReal)*temp, pInt) -! -! Never use a seed of 0 or maximum integer. -! - if (seed == 0_pInt) then - seed = 1_pInt - end if - - if (seed == huge(1_pInt)) then - seed = seed -1_pInt - end if - -end subroutine get_seed - - !-------------------------------------------------------------------------------------------------- !> @brief HALTON computes the next element in the Halton sequence. !