29 typedef std::complex<double>
DType;
45 const double pi = std::acos(-1);
46 const std::complex<double> I(0, 1);
47 return std::exp(2.0 * pi * I * x);
51 const double pi = std::acos(-1);
52 const std::complex<double> I(0, 1);
53 return - 4.0 * pi * pi * std::exp(2.0 * pi * I * x);
61 int N = rho_mg.
get_N();
67 for(
int i = 0; i < Ntot; i++){
68 double xx = ((i % N) + 0.5) /
double(N);
77 rhomean = rhomean/
double(Ntot);
78 std::cout <<
"set_rho :: Box average of source |<rho>| = " <<
std::sqrt(std::norm(rhomean)) << std::endl;
92 for(
int i = 0; i < Ntot; i++){
93 drho_complex[i] = drho[i];
94 sol_complex[i] = drho[i];
97 for(
int i = 0; i < Ntot; i++){
98 sol[i] = sol_complex[i].real();
103 int N = drho.get_N(), Nover2 = N/2, Ntot = drho.get_Ntot();
105 fftw_complex *in =
reinterpret_cast<fftw_complex*
>(drho.get_y());
106 fftw_complex *out =
reinterpret_cast<fftw_complex*
>(sol.get_y());
109 fftw_plan fwd = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
110 fftw_plan bwd = fftw_plan_dft_1d(N, out, out, FFTW_BACKWARD, FFTW_ESTIMATE);
112 fftw_plan fwd = fftw_plan_dft_2d(N, N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
113 fftw_plan bwd = fftw_plan_dft_2d(N, N, out, out, FFTW_BACKWARD, FFTW_ESTIMATE);
115 fftw_plan fwd = fftw_plan_dft_3d(N, N, N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
116 fftw_plan bwd = fftw_plan_dft_3d(N, N, N, out, out, FFTW_BACKWARD, FFTW_ESTIMATE);
118 std::vector<int> inds(
_NDIM, N);
119 fftw_plan fwd = fftw_plan_dft(
_NDIM, &inds[0], in, out, FFTW_FORWARD, FFTW_ESTIMATE);
120 fftw_plan bwd = fftw_plan_dft(
_NDIM, &inds[0], out, out, FFTW_BACKWARD, FFTW_ESTIMATE);
127 double fac = -1.0 / ( 4.0 * std::acos(-1) * std::acos(-1) *
double(Ntot) );
128 for(
int i = 0; i < Ntot; i++){
131 for(
int j = 0, Npow = 1; j <
_NDIM; j++, Npow *= N){
132 int coord = i / Npow % N;
133 int kval = coord < Nover2 ? coord : coord - N;
138 double facnow = fac/k2;
139 out[ind][0] *= facnow;
140 out[ind][1] *= facnow;
153 int NgridPerDim = 256;
159 set_rho(rho, analytical_solution);
178 Grid<_NDIM, DType> err = (solution - analytical_solution) / (analytical_solution) * std::complex<double>(100.0);
179 std::cout <<
"The rms error in the solution: " << err.
rms_norm() <<
" %" << std::endl;
185 std::ofstream fp(
"test_poisson_solver_complex.txt");
186 int N = sol.
get_N(0);
187 for(
int i = 0; i < N; i++){
188 fp << (i+0.5)/
double(N) <<
" " << solution[i].real() <<
" " << fft_sol[i].real() <<
" " << analytical_solution[i].real() << std::endl;
Grid< NDIM, T > & get_grid(size_t level=0)
void set_ngs_sweeps(size_t ngs_fine, size_t ngs_coarse)
size_t get_Ntot(size_t level=0) const
void solve_with_fft(Grid< 1, std::complex< double > > &drho, Grid< 1, std::complex< double > > &sol)
void set_epsilon(double eps_converge)
size_t get_N(size_t level=0) const
size_t get_N(size_t level=0) const
void set_rho(MultiGrid< 1, DType > &rho_mg, Grid< 1, DType > &analytical_solution)
Grid< NDIM, T > sqrt(Grid< NDIM, T > lhs)
static CCL_BEGIN_DECLS double x[111][8]
T * get_y(size_t level=0)
DType laplacian_f_analytical(double x)
Grid< NDIM, T > & get_grid(size_t level=0)
void add_external_grid(MultiGrid< NDIM, T > *field)
int main(int argv, char **argc)
DType f_analytical(double x)
std::complex< double > DType