pf_random_fill_normal Interface

public interface pf_random_fill_normal

Fills v with consecutive standard normal draws of one stream, starting at draw.

v is a rank-1 real(real64) array, intent(out); i is integer(int32) or integer(int64); seed and draw are integer(int64). Element k is exactly pf_random_normal_at(seed, i, draw+k-1), so a prefix is a prefix and a chunked fill agrees with a whole one. A zero-sized v is a defined no-op.

This is why the coordinate-addressed realisation exists. Each element runs its own rejection loop in its own sub-stream, so the fill splits at any boundary and gives the same answer at any thread count -- which a stream walk cannot, at any speed. It takes no threads= for exactly that reason: the caller wraps !$omp parallel do around whatever chunking they like.

It does not agree with a loop of %normal. See pf_random_normal_at.


Module Procedures

private pure subroutine pf_random_fill_normal_i32(seed, i, v, draw)

pf_random_fill_normal from an integer(int32) stream index.

Arguments

Type IntentOptional Attributes Name
integer(kind=int64), intent(in) :: seed

the stream family's seed

integer(kind=int32), intent(in) :: i

stream index; sign-extends, so any value is valid

real(kind=real64), intent(out) :: v(:)

filled with values draw .. draw+size(v)-1

integer(kind=int64), intent(in), optional :: draw

1-based starting value index; absent means 1

private pure subroutine pf_random_fill_normal_i64(seed, i, v, draw)

pf_random_fill_normal from an integer(int64) stream index.

Arguments

Type IntentOptional Attributes Name
integer(kind=int64), intent(in) :: seed

the stream family's seed

integer(kind=int64), intent(in) :: i

stream index; every value is valid

real(kind=real64), intent(out) :: v(:)

filled with values draw .. draw+size(v)-1

integer(kind=int64), intent(in), optional :: draw

1-based starting value index; absent means 1