init_rng Subroutine

public subroutine init_rng(input_seed, fwd)

initiate RNG state with reproducible state

Arguments

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

input seed

logical, intent(in), optional :: fwd

boolean that if True runs the generator for 100 steps before returning


Source Code

        subroutine init_rng(input_seed, fwd)
        !! initiate RNG state with reproducible state
            !> input seed
            integer, optional, intent(IN) :: input_seed(:)
            !> boolean that if True runs the generator for 100 steps before returning
            logical, optional, intent(IN) :: fwd

            integer, allocatable :: seed(:)
            integer              :: n, i
            logical              :: ffwd
            real(kind=wp)        :: a

            call random_seed(size=n)
            allocate(seed(n))

            if(present(input_seed))then
                seed = 0
                seed = input_seed
            else
                seed = 1234567
            end if

            if(present(fwd))then
                ffwd = fwd
            else
                ffwd = .false.
            end if
            call random_seed(put=seed)

            !fast forward rng state 100 times to avoid any potential bad seeds
            if(ffwd)then
                call random_seed(get=seed)
                do i = 1, 100
                    a = ran2()
                    call random_seed(get=seed)
                end do
            end if
        end subroutine init_rng