1
0
Fork 0
mirror of https://github.com/cosmo-sims/MUSIC.git synced 2024-09-19 17:03:46 +02:00

fixed bug in N-GenIC random number generator

This commit is contained in:
Oliver Hahn 2024-02-27 01:54:25 +08:00
parent fdb8f8dcff
commit 75587bbf26

View file

@ -16,6 +16,10 @@ void music_wnoise_generator<T>:: gen_topgrid_NGenIC(size_t res, long baseseed) {
"Generating large-scale random numbers using N-GenIC RNG with seed %ld",
baseseed);
rnums_.push_back(new Meshvar<T>(res, 0, 0, 0));
cubemap_[0] = 0; // create dummy map index
register_cube(0, 0, 0);
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// execute N-GenIC rando number generator
unsigned *seedtable = new unsigned[res * res];
@ -48,27 +52,23 @@ void music_wnoise_generator<T>:: gen_topgrid_NGenIC(size_t res, long baseseed) {
real_t *rnoise = new real_t[res * res * (res + 2)];
complex_t *knoise = reinterpret_cast<complex_t *>(rnoise);
double fnorm = 1. / sqrt(res * res * res);
double fnorm = pow((double)res, -1.5);
// #warning need to check for race conditions below
//#pragma omp parallel for
for (size_t i = 0; i < res; i++)
{
// /#warning need to check for race conditions below
//#pragma omp parallel for
for (size_t i = 0; i < res; i++) {
int ii = (int)res - (int)i;
if (ii == (int)res)
ii = 0;
for (size_t j = 0; j < res; j++)
{
for (size_t j = 0; j < res; j++) {
gsl_rng_set(random_generator, seedtable[i * res + j]);
for (size_t k = 0; k < res / 2; k++)
{
for (size_t k = 0; k < res / 2; k++) {
double phase = gsl_rng_uniform(random_generator) * 2 * M_PI;
double ampl;
do
do {
ampl = gsl_rng_uniform(random_generator);
while (ampl == 0);
} while (ampl == 0);
if (i == res / 2 || j == res / 2 || k == res / 2)
continue;
@ -78,20 +78,17 @@ void music_wnoise_generator<T>:: gen_topgrid_NGenIC(size_t res, long baseseed) {
T rp = -sqrt(-log(ampl)) * cos(phase) * fnorm;
T ip = -sqrt(-log(ampl)) * sin(phase) * fnorm;
if (k > 0)
{
if (k > 0) {
RE(knoise[(i * res + j) * (res / 2 + 1) + k]) = rp;
IM(knoise[(i * res + j) * (res / 2 + 1) + k]) = ip;
}
else /* k=0 plane needs special treatment */
} else /* k=0 plane needs special treatment */
{
if (i == 0)
{
if (j >= res / 2)
if (i == 0) {
if (j >= res / 2) {
continue;
else
{
int jj = (int)res - (int)j; /* note: j!=0 surely holds at this point */
} else {
int jj =
(int)res - (int)j; /* note: j!=0 surely holds at this point */
RE(knoise[(i * res + j) * (res / 2 + 1) + k]) = rp;
IM(knoise[(i * res + j) * (res / 2 + 1) + k]) = ip;
@ -99,13 +96,10 @@ void music_wnoise_generator<T>:: gen_topgrid_NGenIC(size_t res, long baseseed) {
RE(knoise[(i * res + jj) * (res / 2 + 1) + k]) = rp;
IM(knoise[(i * res + jj) * (res / 2 + 1) + k]) = -ip;
}
}
else
{
if (i >= res / 2)
} else {
if (i >= res / 2) {
continue;
else
{
} else {
int ii = (int)res - (int)i;
if (ii == (int)res)
ii = 0;
@ -116,8 +110,7 @@ void music_wnoise_generator<T>:: gen_topgrid_NGenIC(size_t res, long baseseed) {
RE(knoise[(i * res + j) * (res / 2 + 1) + k]) = rp;
IM(knoise[(i * res + j) * (res / 2 + 1) + k]) = ip;
if (ii >= 0 && ii < (int)res)
{
if (ii >= 0 && ii < (int)res) {
RE(knoise[(ii * res + jj) * (res / 2 + 1) + k]) = rp;
IM(knoise[(ii * res + jj) * (res / 2 + 1) + k]) = -ip;
}
@ -140,7 +133,7 @@ void music_wnoise_generator<T>:: gen_topgrid_NGenIC(size_t res, long baseseed) {
for (int i = 0; i < (int)res; ++i)
for (size_t j = 0; j < res; ++j)
for (size_t k = 0; k < res; ++k)
(*this)(i, j, k) = rnoise[((size_t)i * res + j) * res + k];
(*this)(i, j, k) = -rnoise[((size_t)i * res + j) * (res + 2) + k];
delete[] rnoise;
}
@ -168,8 +161,6 @@ music_wnoise_generator<T>::music_wnoise_generator( unsigned res, unsigned cubes
if( bUseNGenIC ){
cubesize_ = res;
ncubes_ = 1;
rnums_.push_back(new Meshvar<T>(res, 0, 0, 0));
cubemap_[0] = 0; // create dummy map index
}
initialize();