diff --git a/bfps/cpp/fluid_solver_base.cpp b/bfps/cpp/fluid_solver_base.cpp index 20772d491f94adadae3dbffc290c99c5060d4fe0..f3967ce6d03a6a9cf8787e6eb66e6c79ea98c2ba 100644 --- a/bfps/cpp/fluid_solver_base.cpp +++ b/bfps/cpp/fluid_solver_base.cpp @@ -46,6 +46,26 @@ void fluid_solver_base<rnumber>::clean_up_real_space(rnumber *a, int howmany) std::fill_n(a+rindex+this->rd->subsizes[2]*howmany, 2*howmany, 0.0); } +template <class rnumber> +rnumber fluid_solver_base<rnumber>::autocorrel(cnumber *a) +{ + double *spec = fftw_alloc_real(this->nshells*9); + double sum_local, sum; + this->cospectrum(a, a, spec); + sum_local = 0.0; + for (int n = 0; n < this->nshells; n++) + sum_local += spec[n*9] + spec[n*9 + 4] + spec[n*9 + 8]; + fftw_free(spec); + MPI_Allreduce( + &sum_local, + &sum, + 1, + MPI_DOUBLE, + MPI_SUM, + this->cd->comm); + return sum; +} + template <class rnumber> void fluid_solver_base<rnumber>::cospectrum(cnumber *a, cnumber *b, double *spec) { diff --git a/bfps/cpp/fluid_solver_base.hpp b/bfps/cpp/fluid_solver_base.hpp index 32bf6add59faa2c6a31cb245049afbd0417d3028..b393847089f9933be6d76ab7f71b745344df5acc 100644 --- a/bfps/cpp/fluid_solver_base.hpp +++ b/bfps/cpp/fluid_solver_base.hpp @@ -83,6 +83,7 @@ class fluid_solver_base void clean_up_real_space(rnumber *a, int howmany); void cospectrum(cnumber *a, cnumber *b, double *spec); void cospectrum(cnumber *a, cnumber *b, double *spec, const double k2exponent); + rnumber autocorrel(cnumber *a); void compute_rspace_stats(rnumber *a, double *moments, ptrdiff_t *hist, diff --git a/bfps/fluid_base.py b/bfps/fluid_base.py index e05373a0cfcf932a5777f78f01765ec6e7eebc6f..91086cca2a5c81c26aece60549b54937ea16915c 100644 --- a/bfps/fluid_base.py +++ b/bfps/fluid_base.py @@ -126,7 +126,7 @@ class fluid_particle_base(bfps.code): 'local_time_difference = ((unsigned int)(time1 - time0))/((double)CLOCKS_PER_SEC);\n' + 'time_difference = 0.0;\n' + 'MPI_Allreduce(&local_time_difference, &time_difference, ' + - '1, MPI_DOUBLE, MPI_SUM, fs->rd->comm);\n' + + '1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);\n' + 'if (myrank == 0) std::cout << "iteration " ' + '<< iteration << " took " ' + '<< time_difference/nprocs << " seconds" << std::endl;\n' + diff --git a/bfps/fluid_resize.py b/bfps/fluid_resize.py index 36631f9fda2cf8129be94d036e91514c3a7d37f9..755a38b36c56b9972d74c0cf112273c012103847 100644 --- a/bfps/fluid_resize.py +++ b/bfps/fluid_resize.py @@ -70,15 +70,15 @@ class fluid_resize(bfps.fluid_base.fluid_particle_base): fs1->iteration = 0; fs0->read('v', 'c'); double a, b; - a = 0.5*fs0->correl_vec(fs0->cvelocity, fs0->cvelocity); - b = 0.5*fs0->correl_vec(fs0->cvorticity, fs0->cvorticity); + a = 0.5*fs0->autocorrel(fs0->cvelocity); + b = 0.5*fs0->autocorrel(fs0->cvorticity); DEBUG_MSG("old field %d %g %g\\n", fs0->iteration, a, b); copy_complex_array<{0}>(fs0->cd, fs0->cvorticity, fs1->cd, fs1->cvorticity, 3); fs1->write('v', 'c'); - a = 0.5*fs1->correl_vec(fs1->cvelocity, fs1->cvelocity); - b = 0.5*fs1->correl_vec(fs1->cvorticity, fs1->cvorticity); + a = 0.5*fs1->autocorrel(fs1->cvelocity); + b = 0.5*fs1->autocorrel(fs1->cvorticity); DEBUG_MSG("new field %d %g %g\\n", fs1->iteration, a, b); niter_todo = 0; //endcpp