generate a seed respecting the lapack constraints, - values between 0..4095 (2**12-1) - iseed(4) odd also try to avoid iseed that are zero. Have but with a unique 2D mapping (irow,icol), and a 'mini-seed' ival
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | irow |
1..nrow nrow 1..ncol ncol mini-seed |
||
integer, | intent(in) | :: | nrow |
1..nrow nrow 1..ncol ncol mini-seed |
||
integer, | intent(in) | :: | icol |
1..nrow nrow 1..ncol ncol mini-seed |
||
integer, | intent(in) | :: | ncol |
1..nrow nrow 1..ncol ncol mini-seed |
||
integer, | intent(in) | :: | ival |
1..nrow nrow 1..ncol ncol mini-seed |
||
integer, | intent(out) | :: | iseed(4) |
a lapack compatible seed |
SUBROUTINE set_larnv_seed(irow, nrow, icol, ncol, ival, iseed)
!! generate a seed respecting the lapack constraints,
!! - values between 0..4095 (2**12-1)
!! - iseed(4) odd
!! also try to avoid iseed that are zero.
!! Have but with a unique 2D mapping (irow,icol), and a 'mini-seed' ival
INTEGER, INTENT(IN) :: irow, nrow, icol, ncol, ival
!! 1..nrow
!! nrow
!! 1..ncol
!! ncol
!! mini-seed
INTEGER, INTENT(OUT) :: iseed(4)
!! a lapack compatible seed
INTEGER(KIND=int_8) :: map
map = ((irow - 1 + icol*INT(nrow, int_8))*(1 + MODULO(ival, 2**16)))*2 + 1 + 0*ncol ! ncol used
iseed(4) = INT(MODULO(map, 2_int_8**12)); map = map/2_int_8**12; ! keep odd
iseed(3) = INT(MODULO(IEOR(map, 3541_int_8), 2_int_8**12)); map = map/2_int_8**12
iseed(2) = INT(MODULO(IEOR(map, 1153_int_8), 2_int_8**12)); map = map/2_int_8**12
iseed(1) = INT(MODULO(IEOR(map, 2029_int_8), 2_int_8**12)); map = map/2_int_8**12
END SUBROUTINE set_larnv_seed