Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 22 additions & 22 deletions source/source_base/math_integral.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ void Integral::Simpson_Integral

// simpson's rule integrator for function stored on the
// radial logarithmic mesh
// routine assumes that mesh is an odd number so run check
// routine assumes that mesh is an odd number so run check
if (mesh % 2 == 0)
{
std::cout << "\n error in subroutine simpson ";
Expand Down Expand Up @@ -83,21 +83,21 @@ void Integral::Simpson_Integral
*/
// simpson's rule integrator for function stored on the
// radial logarithmic mesh
// routine assumes that mesh is an odd number so run check
// routine assumes that mesh is an odd number so run check
assert(mesh&1);

asum = 0.00;
const size_t end = mesh-2;
const size_t end = mesh-2;
for( size_t i=1; i!=end; i+=2 )
{
const double f1 = func[i]*rab[i];
asum += f1 + f1 + func[i+1]*rab[i+1];
const double f1 = func[i]*rab[i];
asum += f1 + f1 + func[i+1]*rab[i+1];
}
const double f1 = func[mesh-2]*rab[mesh-2];
asum += f1+f1;
asum += asum;
asum += func[0]*rab[0] + func[mesh-1]*rab[mesh-1];
asum /= 3.0;
const double f1 = func[mesh-2]*rab[mesh-2];
asum += f1+f1;
asum += asum;
asum += func[0]*rab[0] + func[mesh-1]*rab[mesh-1];
asum /= 3.0;
return;
}// end subroutine simpson

Expand All @@ -124,21 +124,21 @@ void Integral::Simpson_Integral
*/
// simpson's rule integrator for function stored on the
// radial logarithmic mesh
// routine assumes that mesh is an odd number so run check
// routine assumes that mesh is an odd number so run check
assert(mesh&1);

asum = 0.00;
const size_t end = mesh-2;
const size_t end = mesh-2;
for(size_t i=1; i!=end; i+=2 )
{
const double f1 = func[i];
asum += f1 + f1 + func[i+1];
const double f1 = func[i];
asum += f1 + f1 + func[i+1];
}
const double f1 = func[mesh-2];
asum += f1+f1;
asum += asum;
asum += func[0] + func[mesh-1];
asum *= dr/3.0;
const double f1 = func[mesh-2];
asum += f1+f1;
asum += asum;
asum += func[0] + func[mesh-1];
asum *= dr/3.0;
return;
}// end subroutine simpson

Expand Down Expand Up @@ -220,10 +220,10 @@ void Integral::Simpson_Integral_alltoinf

const double asum_all = asum[mesh-1];
for (int i = 0;i < mesh; ++i)
{
{
asum[i] = asum_all - asum[i];
}
return;
}
return;
}

double Integral::simpson(const int n, const double* const f, const double dx)
Expand Down
114 changes: 80 additions & 34 deletions source/source_base/module_fft/fft_cpu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -344,60 +344,86 @@ void FFT_CPU<double>::clear()
template <>
void FFT_CPU<double>::fftxyfor(std::complex<double>* in, std::complex<double>* out) const
{
int npy = this->nplane * this->ny;
const int npy = this->nplane * this->ny;
const int nx = this->nx;
const int lixy = this->lixy;
const int rixy = this->rixy;
const int nplane = this->nplane;
const fftw_plan planyfor = this->planyfor;
const fftw_plan planxfor1 = this->planxfor1;
const fftw_plan planxfor2 = this->planxfor2;
if (this->xprime)
{

fftw_execute_dft(this->planxfor1, (fftw_complex*)in, (fftw_complex*)out);
fftw_execute_dft(planxfor1, (fftw_complex*)in, (fftw_complex*)out);
#ifdef _OPENMP
#pragma omp parallel for
for (int i = 0; i < this->lixy + 1; ++i)
#endif
for (int i = 0; i < lixy + 1; ++i)
{
fftw_execute_dft(this->planyfor, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
fftw_execute_dft(planyfor, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
}
#ifdef _OPENMP
#pragma omp parallel for
for (int i = rixy; i < this->nx; ++i)
#endif
for (int i = rixy; i < nx; ++i)
{
fftw_execute_dft(this->planyfor, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
fftw_execute_dft(planyfor, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
}
}
else
{
#ifdef _OPENMP
#pragma omp parallel for
for (int i = 0; i < this->nx; ++i)
#endif
for (int i = 0; i < nx; ++i)
{
fftw_execute_dft(this->planyfor, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
fftw_execute_dft(planyfor, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
}
fftw_execute_dft(this->planxfor1, (fftw_complex*)in, (fftw_complex*)out);
fftw_execute_dft(this->planxfor2, (fftw_complex*)&in[rixy * nplane], (fftw_complex*)&out[rixy * nplane]);
fftw_execute_dft(planxfor1, (fftw_complex*)in, (fftw_complex*)out);
fftw_execute_dft(planxfor2, (fftw_complex*)&in[rixy * nplane], (fftw_complex*)&out[rixy * nplane]);
}
}

template <>
void FFT_CPU<double>::fftxybac(std::complex<double>* in,std::complex<double>* out) const
{
int npy = this->nplane * this->ny;
const int npy = this->nplane * this->ny;
const int nx = this->nx;
const int lixy = this->lixy;
const int rixy = this->rixy;
const int nplane = this->nplane;
const fftw_plan planybac = this->planybac;
const fftw_plan planxbac1 = this->planxbac1;
const fftw_plan planxbac2 = this->planxbac2;
if (this->xprime)
{
#ifdef _OPENMP
#pragma omp parallel for
for (int i = 0; i < this->lixy + 1; ++i)
#endif
for (int i = 0; i < lixy + 1; ++i)
{
fftw_execute_dft(this->planybac, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
fftw_execute_dft(planybac, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
}
#ifdef _OPENMP
#pragma omp parallel for
for (int i = rixy; i < this->nx; ++i)
#endif
for (int i = rixy; i < nx; ++i)
{
fftw_execute_dft(this->planybac, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
fftw_execute_dft(planybac, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
}
fftw_execute_dft(this->planxbac1, (fftw_complex*)in, (fftw_complex*)out);
fftw_execute_dft(planxbac1, (fftw_complex*)in, (fftw_complex*)out);
}
else
{
fftw_execute_dft(this->planxbac1, (fftw_complex*)in, (fftw_complex*)out);
fftw_execute_dft(this->planxbac2, (fftw_complex*)&in[rixy * nplane], (fftw_complex*)&out[rixy * nplane]);
fftw_execute_dft(planxbac1, (fftw_complex*)in, (fftw_complex*)out);
fftw_execute_dft(planxbac2, (fftw_complex*)&in[rixy * nplane], (fftw_complex*)&out[rixy * nplane]);
#ifdef _OPENMP
#pragma omp parallel for
for (int i = 0; i < this->nx; ++i)
#endif
for (int i = 0; i < nx; ++i)
{
fftw_execute_dft(this->planybac, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
fftw_execute_dft(planybac, (fftw_complex*)&in[i * npy], (fftw_complex*)&out[i * npy]);
}
}
}
Expand All @@ -417,47 +443,67 @@ void FFT_CPU<double>::fftzbac(std::complex<double>* in, std::complex<double>* ou
template <>
void FFT_CPU<double>::fftxyr2c(double* in, std::complex<double>* out) const
{
int npy = this->nplane * this->ny;
const int npy = this->nplane * this->ny;
const int nx = this->nx;
const int lixy = this->lixy;
const fftw_plan planxr2c = this->planxr2c;
const fftw_plan planyfor = this->planyfor;
const fftw_plan planyr2c = this->planyr2c;
const fftw_plan planxfor1 = this->planxfor1;
if (this->xprime)
{
fftw_execute_dft_r2c(this->planxr2c, in, (fftw_complex*)out);
fftw_execute_dft_r2c(planxr2c, in, (fftw_complex*)out);
#ifdef _OPENMP
#pragma omp parallel for
for (int i = 0; i < this->lixy + 1; ++i)
#endif
for (int i = 0; i < lixy + 1; ++i)
{
fftw_execute_dft(this->planyfor, (fftw_complex*)&out[i * npy], (fftw_complex*)&out[i * npy]);
fftw_execute_dft(planyfor, (fftw_complex*)&out[i * npy], (fftw_complex*)&out[i * npy]);
}
}
else
{
#ifdef _OPENMP
#pragma omp parallel for
for (int i = 0; i < this->nx; ++i)
#endif
for (int i = 0; i < nx; ++i)
{
fftw_execute_dft_r2c(this->planyr2c, &in[i * npy], (fftw_complex*)&out[i * npy]);
fftw_execute_dft_r2c(planyr2c, &in[i * npy], (fftw_complex*)&out[i * npy]);
}
fftw_execute_dft(this->planxfor1, (fftw_complex*)out, (fftw_complex*)out);
fftw_execute_dft(planxfor1, (fftw_complex*)out, (fftw_complex*)out);
}
}

template <>
void FFT_CPU<double>::fftxyc2r(std::complex<double> *in,double *out) const
{
int npy = this->nplane * this->ny;
const int npy = this->nplane * this->ny;
const int nx = this->nx;
const int lixy = this->lixy;
const fftw_plan planybac = this->planybac;
const fftw_plan planxc2r = this->planxc2r;
const fftw_plan planxbac1 = this->planxbac1;
const fftw_plan planyc2r = this->planyc2r;
if (this->xprime)
{
#ifdef _OPENMP
#pragma omp parallel for
for (int i = 0; i < this->lixy + 1; ++i)
#endif
for (int i = 0; i < lixy + 1; ++i)
{
fftw_execute_dft(this->planybac, (fftw_complex*)&in[i * npy], (fftw_complex*)&in[i * npy]);
fftw_execute_dft(planybac, (fftw_complex*)&in[i * npy], (fftw_complex*)&in[i * npy]);
}
fftw_execute_dft_c2r(this->planxc2r, (fftw_complex*)in, out);
fftw_execute_dft_c2r(planxc2r, (fftw_complex*)in, out);
}
else
{
fftw_execute_dft(this->planxbac1, (fftw_complex*)in, (fftw_complex*)in);
fftw_execute_dft(planxbac1, (fftw_complex*)in, (fftw_complex*)in);
#ifdef _OPENMP
#pragma omp parallel for
for (int i = 0; i < this->nx; ++i)
#endif
for (int i = 0; i < nx; ++i)
{
fftw_execute_dft_c2r(this->planyc2r, (fftw_complex*)&in[i * npy], &out[i * npy]);
fftw_execute_dft_c2r(planyc2r, (fftw_complex*)&in[i * npy], &out[i * npy]);
}
}
}
Expand Down
Loading
Loading