Source code for pmesh.whitenoise
from . import _whitenoise
import numpy
[docs]def generate(complex, start, Nmesh, seed, unitary):
"""
The result is always hermitian.
Depending on the shape of complex, the routine will fill
either the half or the full representation of the field.
unitary : bool
True for a unitary gaussian field (amplitude is fixed to 1)
False for a true gaussian field
"""
_start = numpy.empty(complex.ndim, dtype='intp')
_Nmesh = numpy.empty(complex.ndim, dtype='intp')
_start[:] = start
_Nmesh[:] = Nmesh
if complex.ndim == 3:
_whitenoise.generate(complex, _start, _Nmesh, seed, unitary)
elif complex.ndim <= 2:
# FIXME: this is not scale invariant though it is at least invariant
# against partition. Since 2d and 1d is only used for testing this
# may be good enough.
rng = numpy.random.RandomState(seed)
real = rng.normal(size=_Nmesh)
full = numpy.fft.fftn(real)
full[...] *= numpy.prod(_Nmesh) ** -0.5
slices = tuple([slice(a, a + b) for a, b in zip(_start, complex.shape)])
complex[...] = full[slices]
if unitary:
# there is a problem when the amplitude is too small,
# but because we do not use 1d and 2d for anything serious
# it is probably OK assuming they just have phase of zero.
complex[...] = numpy.exp(1j * numpy.angle(complex))
else:
raise ValueError("Only knows how to make a whitenoise up to 3d")