1#ifndef AMREX_FFT_R2X_H_
2#define AMREX_FFT_R2X_H_
3#include <AMReX_Config.H>
14template <
typename T>
class Poisson;
15template <
typename T>
class PoissonHybrid;
23template <
typename T = Real>
27 using MF = std::conditional_t<std::is_same_v<T,Real>,
31 template <
typename U>
friend class Poisson;
35 Array<std::pair<Boundary,Boundary>,AMREX_SPACEDIM>
const& bc,
51 template <
int dim,
typename FAB,
typename F>
125 Array<std::pair<Boundary,Boundary>,AMREX_SPACEDIM>
const& bc,
129 m_sub_helper(domain),
134 static_assert(std::is_same_v<float,T> || std::is_same_v<double,T>);
137#if (AMREX_SPACEDIM == 2)
142 int(domain.
length(1) > 1) +
143 int(domain.
length(2) > 1)) >= 2);
147 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
173 m_rx.define(bax, dmx, 1, 0,
MFInfo().SetAlloc(
false));
182 for (
auto &
b : bl) {
189#if (AMREX_SPACEDIM >= 2)
215 if (ba.size() ==
m_rx.size()) {
216 dm =
m_rx.DistributionMap();
220 m_ry.define(ba, dm, 1, 0,
MFInfo().SetAlloc(
false));
230 for (
auto &
b : bl) {
240#if (AMREX_SPACEDIM == 3)
266 if (ba.size() ==
m_ry.size()) {
267 dm =
m_ry.DistributionMap();
271 m_rz.define(ba, dm, 1, 0,
MFInfo().SetAlloc(
false));
281 for (
auto &
b : bl) {
331#if (AMREX_SPACEDIM >= 2)
335 m_cmd_cx2cy = std::make_unique<MultiBlockCommMetaData>
337 m_cmd_cy2cx = std::make_unique<MultiBlockCommMetaData>
341 m_cmd_rx2ry = std::make_unique<MultiBlockCommMetaData>
343 m_cmd_ry2rx = std::make_unique<MultiBlockCommMetaData>
349#if (AMREX_SPACEDIM == 3)
353 m_cmd_cy2cz = std::make_unique<MultiBlockCommMetaData>
355 m_cmd_cz2cy = std::make_unique<MultiBlockCommMetaData>
359 m_cmd_ry2rz = std::make_unique<MultiBlockCommMetaData>
361 m_cmd_rz2ry = std::make_unique<MultiBlockCommMetaData>
373 if (myproc <
m_rx.size())
375 Box const& box =
m_rx.box(myproc);
376 auto* pf =
m_rx[myproc].dataPtr();
378 auto* pb = (VendorComplex*)
m_cx[myproc].dataPtr();
379 m_fft_fwd_x.template init_r2c<Direction::forward>(box, pf, pb);
380#if defined(AMREX_USE_SYCL)
383 m_fft_bwd_x.template init_r2c<Direction::backward>(box, pf, pb);
386 m_fft_fwd_x.template init_r2r<Direction::forward>(box, pf, bc[0]);
387#if defined(AMREX_USE_GPU)
394 m_fft_bwd_x.template init_r2r<Direction::backward>(box, pf, bc[0]);
399#if (AMREX_SPACEDIM >= 2)
403 auto* p = (VendorComplex *)
m_cy[myproc].dataPtr();
404 m_fft_fwd_y.template init_c2c<Direction::forward>(box, p);
405#if defined(AMREX_USE_SYCL)
408 m_fft_bwd_y.template init_c2c<Direction::backward>(box, p);
412 if (myproc <
m_ry.size()) {
413 Box const& box =
m_ry.box(myproc);
414 auto* pr =
m_ry[myproc].dataPtr();
415 auto* pc = (VendorComplex*)
m_cy[myproc].dataPtr();
416 m_fft_fwd_y.template init_r2c<Direction::forward>(box, pr, pc);
417#if defined(AMREX_USE_SYCL)
420 m_fft_bwd_y.template init_r2c<Direction::backward>(box, pr, pc);
426 auto* p = (VendorComplex*)
m_cy[myproc].dataPtr();
427 m_fft_fwd_y.template init_r2r<Direction::forward>(box, p, bc[1]);
428#if defined(AMREX_USE_GPU)
435 m_fft_bwd_y.template init_r2r<Direction::backward>(box, p, bc[1]);
439 if (myproc <
m_ry.size()) {
440 Box const& box =
m_ry.box(myproc);
441 auto* p =
m_ry[myproc].dataPtr();
442 m_fft_fwd_y.template init_r2r<Direction::forward>(box, p, bc[1]);
443#if defined(AMREX_USE_GPU)
450 m_fft_bwd_y.template init_r2r<Direction::backward>(box, p, bc[1]);
456#if (AMREX_SPACEDIM == 3)
460 auto* p = (VendorComplex*)
m_cz[myproc].dataPtr();
461 m_fft_fwd_z.template init_c2c<Direction::forward>(box, p);
462#if defined(AMREX_USE_SYCL)
465 m_fft_bwd_z.template init_c2c<Direction::backward>(box, p);
469 if (myproc <
m_rz.size()) {
470 Box const& box =
m_rz.box(myproc);
471 auto* pr =
m_rz[myproc].dataPtr();
472 auto* pc = (VendorComplex*)
m_cz[myproc].dataPtr();
473 m_fft_fwd_z.template init_r2c<Direction::forward>(box, pr, pc);
474#if defined(AMREX_USE_SYCL)
477 m_fft_bwd_z.template init_r2c<Direction::backward>(box, pr, pc);
483 auto* p = (VendorComplex*)
m_cz[myproc].dataPtr();
484 m_fft_fwd_z.template init_r2r<Direction::forward>(box, p, bc[2]);
485#if defined(AMREX_USE_GPU)
492 m_fft_bwd_z.template init_r2r<Direction::backward>(box, p, bc[2]);
496 if (myproc <
m_rz.size()) {
497 Box const& box =
m_rz.box(myproc);
498 auto* p =
m_rz[myproc].dataPtr();
499 m_fft_fwd_z.template init_r2r<Direction::forward>(box, p, bc[2]);
500#if defined(AMREX_USE_GPU)
507 m_fft_bwd_z.template init_r2r<Direction::backward>(box, p, bc[2]);
517 if (m_fft_bwd_x.plan != m_fft_fwd_x.plan) {
518 m_fft_bwd_x.destroy();
520 if (m_fft_bwd_y.plan != m_fft_fwd_y.plan) {
521 m_fft_bwd_y.destroy();
523 if (m_fft_bwd_z.plan != m_fft_fwd_z.plan) {
524 m_fft_bwd_z.destroy();
526 m_fft_fwd_x.destroy();
527 m_fft_fwd_y.destroy();
528 m_fft_fwd_z.destroy();
535 int ndims = m_info.twod_mode ? AMREX_SPACEDIM-1 : AMREX_SPACEDIM;
536#if (AMREX_SPACEDIM == 3)
537 if (m_info.twod_mode && m_dom_0.length(2) == 1) { ndims = 1; };
539 for (
int idim = 0; idim < ndims; ++idim) {
540 r *= m_dom_0.length(idim);
552 forwardThenBackward_doit_0(inmf, outmf, post_forward);
558 F const& post_forward,
565 bool inmf_safe = m_sub_helper.ghost_safe(inmf.nGrowVect());
566 MF inmf_sub, inmf_tmp;
568 inmf_sub = m_sub_helper.make_alias_mf(inmf);
570 inmf_tmp.define(inmf.boxArray(), inmf.DistributionMap(), 1, 0);
571 inmf_tmp.LocalCopy(inmf, 0, 0, 1,
IntVect(0));
572 inmf_sub = m_sub_helper.make_alias_mf(inmf_tmp);
575 bool outmf_safe = m_sub_helper.ghost_safe(outmf.nGrowVect());
576 MF outmf_sub, outmf_tmp;
578 outmf_sub = m_sub_helper.make_alias_mf(outmf);
580 IntVect const& ngtmp = m_sub_helper.make_safe_ghost(outmf.nGrowVect());
581 outmf_tmp.define(outmf.boxArray(), outmf.DistributionMap(), 1, ngtmp);
582 outmf_sub = m_sub_helper.make_alias_mf(outmf_tmp);
585 IntVect const& subngout = m_sub_helper.make_iv(ngout);
586 Periodicity const& subperiod = m_sub_helper.make_periodicity(period);
588 m_r2x_sub->forwardThenBackward_doit_1
589 (inmf_sub, outmf_sub,
593 post_forward(idx[order[0]], idx[order[1]], idx[order[2]], sp);
595 subngout, subperiod);
598 outmf.LocalCopy(outmf_tmp, 0, 0, 1, outmf_tmp.nGrowVect());
603 this->forwardThenBackward_doit_1(inmf, outmf, post_forward, ngout, period);
610 F const& post_forward,
617 amrex::Abort(
"R2X::forwardThenBackward_doit_1: How did this happen?");
625 int actual_dim = AMREX_SPACEDIM;
626#if (AMREX_SPACEDIM >= 2)
627 if (m_dom_0.length(1) == 1) { actual_dim = 1; }
629#if (AMREX_SPACEDIM == 3)
630 if ((m_dom_0.length(2) == 1) && (m_dom_0.length(1) > 1)) { actual_dim = 2; }
633 if (actual_dim == 1) {
640#if (AMREX_SPACEDIM >= 2)
641 else if (actual_dim == 2) {
649#if (AMREX_SPACEDIM == 3)
650 else if (actual_dim == 3) {
661 outmf.ParallelCopy(m_rx, 0, 0, 1,
IntVect(0),
672 if (m_sub_helper.ghost_safe(inmf.nGrowVect())) {
673 m_r2x_sub->forward(m_sub_helper.make_alias_mf(inmf));
675 MF tmp(inmf.boxArray(), inmf.DistributionMap(), 1, 0);
676 tmp.LocalCopy(inmf, 0, 0, 1,
IntVect(0));
677 m_r2x_sub->forward(m_sub_helper.make_alias_mf(tmp));
682 m_rx.ParallelCopy(inmf, 0, 0, 1);
684 m_fft_fwd_x.template compute_r2c<Direction::forward>();
686 m_fft_fwd_x.template compute_r2r<Direction::forward>();
689#if (AMREX_SPACEDIM >= 2)
691 ParallelCopy(m_cy, m_cx, *m_cmd_cx2cy, 0, 0, 1, m_dtos_x2y);
692 }
else if ( m_cmd_rx2ry) {
693 ParallelCopy(m_ry, m_rx, *m_cmd_rx2ry, 0, 0, 1, m_dtos_x2y);
697 m_fft_fwd_y.template compute_r2r<Direction::forward>();
701 m_fft_fwd_y.template compute_c2c<Direction::forward>();
705 m_fft_fwd_y.template compute_r2c<Direction::forward>();
709#if (AMREX_SPACEDIM == 3)
711 ParallelCopy(m_cz, m_cy, *m_cmd_cy2cz, 0, 0, 1, m_dtos_y2z);
712 }
else if ( m_cmd_ry2rz) {
713 ParallelCopy(m_rz, m_ry, *m_cmd_ry2rz, 0, 0, 1, m_dtos_y2z);
717 m_fft_fwd_z.template compute_r2r<Direction::forward>();
722 m_fft_fwd_z.template compute_c2c<Direction::forward>();
726 m_fft_fwd_z.template compute_r2c<Direction::forward>();
736 bool inmf_safe = m_sub_helper.ghost_safe(inmf.nGrowVect());
737 MF inmf_sub, inmf_tmp;
739 inmf_sub = m_sub_helper.make_alias_mf(inmf);
741 inmf_tmp.define(inmf.boxArray(), inmf.DistributionMap(), 1, 0);
742 inmf_tmp.LocalCopy(inmf, 0, 0, 1,
IntVect(0));
743 inmf_sub = m_sub_helper.make_alias_mf(inmf_tmp);
746 bool outmf_safe = m_sub_helper.ghost_safe(outmf.nGrowVect());
747 MF outmf_sub, outmf_tmp;
749 outmf_sub = m_sub_helper.make_alias_mf(outmf);
751 outmf_tmp.define(outmf.boxArray(), outmf.DistributionMap(), 1, 0);
752 outmf_sub = m_sub_helper.make_alias_mf(outmf_tmp);
755 m_r2x_sub->forward(inmf_sub, outmf_sub);
758 outmf.LocalCopy(outmf_tmp, 0, 0, 1,
IntVect(0));
765#if (AMREX_SPACEDIM == 3)
766 if (m_info.twod_mode) {
767 if (m_cy.empty() && !m_ry.empty()) {
769 }
else if (m_ry.empty() && m_cy.empty() && m_cx.empty()) {
770 outmf.ParallelCopy(m_rx, 0, 0, 1);
772 amrex::Abort(
"R2X::forward(MF,MF): How did this happen?");
788 bool inmf_safe = m_sub_helper.ghost_safe(inmf.nGrowVect());
789 MF inmf_sub, inmf_tmp;
791 inmf_sub = m_sub_helper.make_alias_mf(inmf);
793 inmf_tmp.define(inmf.boxArray(), inmf.DistributionMap(), 1, 0);
794 inmf_tmp.LocalCopy(inmf, 0, 0, 1,
IntVect(0));
795 inmf_sub = m_sub_helper.make_alias_mf(inmf_tmp);
798 bool outmf_safe = m_sub_helper.ghost_safe(outmf.
nGrowVect());
799 cMF outmf_sub, outmf_tmp;
801 outmf_sub = m_sub_helper.make_alias_mf(outmf);
804 outmf_sub = m_sub_helper.make_alias_mf(outmf_tmp);
807 m_r2x_sub->forward(inmf_sub, outmf_sub);
817#if (AMREX_SPACEDIM == 3)
818 if (m_info.twod_mode) {
820 auto lo = m_dom_cy.smallEnd();
821 auto hi = m_dom_cy.bigEnd();
822 std::swap(lo[0],lo[1]);
823 std::swap(hi[0],hi[1]);
826 }
else if (m_ry.empty() && m_cy.empty() && !m_cx.empty()) {
829 amrex::Abort(
"R2X::forward(MF,cMF): How did this happen?");
847#if (AMREX_SPACEDIM == 3)
850 m_fft_bwd_z.template compute_r2r<Direction::backward>();
855 m_fft_bwd_z.template compute_c2c<Direction::backward>();
859 m_fft_bwd_z.template compute_r2c<Direction::backward>();
862 ParallelCopy(m_cy, m_cz, *m_cmd_cz2cy, 0, 0, 1, m_dtos_z2y);
863 }
else if ( m_cmd_rz2ry) {
864 ParallelCopy(m_ry, m_rz, *m_cmd_rz2ry, 0, 0, 1, m_dtos_z2y);
868#if (AMREX_SPACEDIM >= 2)
871 m_fft_bwd_y.template compute_r2r<Direction::backward>();
875 m_fft_bwd_y.template compute_c2c<Direction::backward>();
879 m_fft_bwd_y.template compute_r2c<Direction::backward>();
882 ParallelCopy(m_cx, m_cy, *m_cmd_cy2cx, 0, 0, 1, m_dtos_y2x);
883 }
else if ( m_cmd_ry2rx) {
884 ParallelCopy(m_rx, m_ry, *m_cmd_ry2rx, 0, 0, 1, m_dtos_y2x);
889 m_fft_bwd_x.template compute_r2c<Direction::backward>();
891 m_fft_bwd_x.template compute_r2r<Direction::backward>();
901 bool inmf_safe = m_sub_helper.ghost_safe(inmf.nGrowVect());
902 MF inmf_sub, inmf_tmp;
904 inmf_sub = m_sub_helper.make_alias_mf(inmf);
906 inmf_tmp.define(inmf.boxArray(), inmf.DistributionMap(), 1, 0);
907 inmf_tmp.LocalCopy(inmf, 0, 0, 1,
IntVect(0));
908 inmf_sub = m_sub_helper.make_alias_mf(inmf_tmp);
911 bool outmf_safe = m_sub_helper.ghost_safe(outmf.nGrowVect());
912 MF outmf_sub, outmf_tmp;
914 outmf_sub = m_sub_helper.make_alias_mf(outmf);
916 IntVect const& ngtmp = m_sub_helper.make_safe_ghost(outmf.nGrowVect());
917 outmf_tmp.define(outmf.boxArray(), outmf.DistributionMap(), 1, ngtmp);
918 outmf_sub = m_sub_helper.make_alias_mf(outmf_tmp);
921 IntVect const& subngout = m_sub_helper.make_iv(ngout);
922 Periodicity const& subperiod = m_sub_helper.make_periodicity(period);
923 m_r2x_sub->backward(inmf_sub, outmf_sub, subngout, subperiod);
926 outmf.LocalCopy(outmf_tmp, 0, 0, 1, outmf_tmp.nGrowVect());
931#if (AMREX_SPACEDIM == 3)
932 if (m_info.twod_mode) {
933 if (m_cy.empty() && !m_ry.empty()) {
935 }
else if (m_ry.empty() && m_cy.empty() && m_cx.empty()) {
936 m_rx.ParallelCopy(inmf, 0, 0, 1);
938 amrex::Abort(
"R2X::backward(MF,MF): How did this happen?");
949 outmf.ParallelCopy(m_rx, 0, 0, 1,
IntVect(0),
960 bool inmf_safe = m_sub_helper.ghost_safe(inmf.
nGrowVect());
961 cMF inmf_sub, inmf_tmp;
963 inmf_sub = m_sub_helper.make_alias_mf(inmf);
967 inmf_sub = m_sub_helper.make_alias_mf(inmf_tmp);
970 bool outmf_safe = m_sub_helper.ghost_safe(outmf.nGrowVect());
971 MF outmf_sub, outmf_tmp;
973 outmf_sub = m_sub_helper.make_alias_mf(outmf);
975 IntVect const& ngtmp = m_sub_helper.make_safe_ghost(outmf.nGrowVect());
976 outmf_tmp.define(outmf.boxArray(), outmf.DistributionMap(), 1, ngtmp);
977 outmf_sub = m_sub_helper.make_alias_mf(outmf_tmp);
980 IntVect const& subngout = m_sub_helper.make_iv(ngout);
981 Periodicity const& subperiod = m_sub_helper.make_periodicity(period);
982 m_r2x_sub->backward(inmf_sub, outmf_sub, subngout, subperiod);
985 outmf.LocalCopy(outmf_tmp, 0, 0, 1, outmf_tmp.nGrowVect());
990#if (AMREX_SPACEDIM == 3)
991 if (m_info.twod_mode) {
994 }
else if (m_ry.empty() && m_cy.empty() && !m_cx.empty()) {
995 m_cx.ParallelCopy(inmf, 0, 0, 1);
997 amrex::Abort(
"R2X::backward(cMF,MF): How did this happen?");
1008 outmf.ParallelCopy(m_rx, 0, 0, 1,
IntVect(0),
1013template <
typename T>
1014template <
int dim,
typename FAB,
typename F>
1017 if (m_info.twod_mode) {
1021 auto const& a = fab->array();
1025 if constexpr (dim == 0) {
1027 }
else if constexpr (dim == 1) {
#define BL_PROFILE(a)
Definition AMReX_BLProfiler.H:551
#define AMREX_ALWAYS_ASSERT(EX)
Definition AMReX_BLassert.H:50
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:551
A class for managing a List of Boxes that share a common IndexType. This class implements operations ...
Definition AMReX_BoxList.H:52
__host__ __device__ const IntVectND< dim > & bigEnd() const &noexcept
Get the bigend.
Definition AMReX_Box.H:119
__host__ __device__ Long numPts() const noexcept
Returns the number of points contained in the BoxND.
Definition AMReX_Box.H:349
__host__ __device__ IntVectND< dim > length() const noexcept
Return the length of the BoxND.
Definition AMReX_Box.H:149
__host__ __device__ IntVectND< dim > size() const noexcept
Return the length of the BoxND.
Definition AMReX_Box.H:142
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:41
3D Poisson solver for periodic, Dirichlet & Neumann boundaries in the first two dimensions,...
Definition AMReX_FFT_Poisson.H:146
Poisson solver for periodic, Dirichlet & Neumann boundaries using FFT.
Definition AMReX_FFT_Poisson.H:58
Discrete Fourier Transform.
Definition AMReX_FFT_R2X.H:25
MF m_rz
Definition AMReX_FFT_R2X.H:102
void post_forward_doit(FAB *fab, F const &f)
Definition AMReX_FFT_R2X.H:1015
Array< std::pair< Boundary, Boundary >, 3 > m_bc
Definition AMReX_FFT_R2X.H:76
Swap01 m_dtos_x2y
Definition AMReX_FFT_R2X.H:95
void backward(cMF const &inmf, MF &outmf, IntVect const &ngout, Periodicity const &period)
Definition AMReX_FFT_R2X.H:955
void backward(MF const &inmf, MF &outmf, IntVect const &ngout, Periodicity const &period)
Definition AMReX_FFT_R2X.H:896
std::conditional_t< std::is_same_v< T, Real >, MultiFab, FabArray< BaseFab< T > > > MF
Definition AMReX_FFT_R2X.H:28
std::unique_ptr< MultiBlockCommMetaData > m_cmd_rz2ry
Definition AMReX_FFT_R2X.H:93
MF m_ry
Definition AMReX_FFT_R2X.H:101
Box m_dom_cz
Definition AMReX_FFT_R2X.H:115
void forward(MF const &inmf)
Definition AMReX_FFT_R2X.H:667
Swap02 m_dtos_y2z
Definition AMReX_FFT_R2X.H:97
~R2X()
Definition AMReX_FFT_R2X.H:515
void forward(MF const &inmf, MF &outmf)
Definition AMReX_FFT_R2X.H:732
detail::SubHelper m_sub_helper
Definition AMReX_FFT_R2X.H:118
void forwardThenBackward(MF const &inmf, MF &outmf, F const &post_forward)
Definition AMReX_FFT_R2X.H:550
std::unique_ptr< MultiBlockCommMetaData > m_cmd_ry2rx
Definition AMReX_FFT_R2X.H:91
Info m_info
Definition AMReX_FFT_R2X.H:120
std::unique_ptr< MultiBlockCommMetaData > m_cmd_cz2cy
Definition AMReX_FFT_R2X.H:92
std::unique_ptr< MultiBlockCommMetaData > m_cmd_cy2cz
Definition AMReX_FFT_R2X.H:87
Plan< T > m_fft_fwd_y
Definition AMReX_FFT_R2X.H:80
void forward(MF const &inmf, cMF &outmf)
Definition AMReX_FFT_R2X.H:784
MF m_rx
Definition AMReX_FFT_R2X.H:100
std::unique_ptr< MultiBlockCommMetaData > m_cmd_ry2rz
Definition AMReX_FFT_R2X.H:88
Box m_dom_rx
Definition AMReX_FFT_R2X.H:110
R2X(Box const &domain, Array< std::pair< Boundary, Boundary >, 3 > const &bc, Info const &info=Info{})
Definition AMReX_FFT_R2X.H:124
std::unique_ptr< MultiBlockCommMetaData > m_cmd_rx2ry
Definition AMReX_FFT_R2X.H:86
Swap01 m_dtos_y2x
Definition AMReX_FFT_R2X.H:96
Box m_dom_cy
Definition AMReX_FFT_R2X.H:114
T scalingFactor() const
Definition AMReX_FFT_R2X.H:532
Box m_dom_ry
Definition AMReX_FFT_R2X.H:111
void backward()
Definition AMReX_FFT_R2X.H:841
Plan< T > m_fft_bwd_z
Definition AMReX_FFT_R2X.H:83
std::unique_ptr< char, DataDeleter > m_data_1
Definition AMReX_FFT_R2X.H:107
Plan< T > m_fft_fwd_x
Definition AMReX_FFT_R2X.H:78
std::unique_ptr< R2X< T > > m_r2x_sub
Definition AMReX_FFT_R2X.H:117
R2X & operator=(R2X const &)=delete
std::unique_ptr< MultiBlockCommMetaData > m_cmd_cy2cx
Definition AMReX_FFT_R2X.H:90
Box m_dom_0
Definition AMReX_FFT_R2X.H:75
std::unique_ptr< MultiBlockCommMetaData > m_cmd_cx2cy
Definition AMReX_FFT_R2X.H:85
std::unique_ptr< char, DataDeleter > m_data_2
Definition AMReX_FFT_R2X.H:108
Plan< T > m_fft_fwd_z
Definition AMReX_FFT_R2X.H:82
Plan< T > m_fft_bwd_y
Definition AMReX_FFT_R2X.H:81
void forwardThenBackward_doit_1(MF const &inmf, MF &outmf, F const &post_forward, IntVect const &ngout=IntVect(0), Periodicity const &period=Periodicity::NonPeriodic())
Definition AMReX_FFT_R2X.H:609
cMF m_cx
Definition AMReX_FFT_R2X.H:103
cMF m_cz
Definition AMReX_FFT_R2X.H:105
Swap02 m_dtos_z2y
Definition AMReX_FFT_R2X.H:98
void forwardThenBackward_doit_0(MF const &inmf, MF &outmf, F const &post_forward, IntVect const &ngout=IntVect(0), Periodicity const &period=Periodicity::NonPeriodic())
Definition AMReX_FFT_R2X.H:557
cMF m_cy
Definition AMReX_FFT_R2X.H:104
Box m_dom_cx
Definition AMReX_FFT_R2X.H:113
Plan< T > m_fft_bwd_x
Definition AMReX_FFT_R2X.H:79
Box m_dom_rz
Definition AMReX_FFT_R2X.H:112
IntVect nGrowVect() const noexcept
Definition AMReX_FabArrayBase.H:80
int size() const noexcept
Return the number of FABs in the FabArray.
Definition AMReX_FabArrayBase.H:110
const DistributionMapping & DistributionMap() const noexcept
Return constant reference to associated DistributionMapping.
Definition AMReX_FabArrayBase.H:131
bool empty() const noexcept
Definition AMReX_FabArrayBase.H:89
Box box(int K) const noexcept
Return the Kth Box in the BoxArray. That is, the valid region of the Kth grid.
Definition AMReX_FabArrayBase.H:101
const BoxArray & boxArray() const noexcept
Return a constant reference to the BoxArray that defines the valid region associated with this FabArr...
Definition AMReX_FabArrayBase.H:95
An Array of FortranArrayBox(FAB)-like Objects.
Definition AMReX_FabArray.H:345
void ParallelCopy(const FabArray< FAB > &src, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:845
void define(const BoxArray &bxs, const DistributionMapping &dm, int nvar, int ngrow, const MFInfo &info=MFInfo(), const FabFactory< FAB > &factory=DefaultFabFactory< FAB >())
Define this FabArray identically to that performed by the constructor having an analogous function si...
Definition AMReX_FabArray.H:2128
void LocalCopy(FabArray< SFAB > const &src, int scomp, int dcomp, int ncomp, IntVect const &nghost)
Perform local copy of FabArray data.
Definition AMReX_FabArray.H:1909
A collection (stored as an array) of FArrayBox objects.
Definition AMReX_MultiFab.H:38
This provides length of period for periodic domains. 0 means it is not periodic in that direction....
Definition AMReX_Periodicity.H:17
static const Periodicity & NonPeriodic() noexcept
Definition AMReX_Periodicity.cpp:52
std::unique_ptr< char, DataDeleter > make_mfs_share(FA1 &fa1, FA2 &fa2)
Definition AMReX_FFT_Helper.H:1387
FA::FABType::value_type * get_fab(FA &fa)
Definition AMReX_FFT_Helper.H:1376
DistributionMapping make_iota_distromap(Long n)
Definition AMReX_FFT.cpp:88
Definition AMReX_FFT.cpp:7
int MyProcSub() noexcept
my sub-rank in current frame
Definition AMReX_ParallelContext.H:76
int NProcsSub() noexcept
number of ranks in current frame
Definition AMReX_ParallelContext.H:74
void ParallelForOMP(T n, L const &f) noexcept
Definition AMReX_GpuLaunch.H:249
__host__ __device__ void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:138
BoxND< 3 > Box
Definition AMReX_BaseFwd.H:27
double second() noexcept
Definition AMReX_Utility.cpp:940
BoxArray decompose(Box const &domain, int nboxes, Array< bool, 3 > const &decomp, bool no_overlap)
Decompose domain box into BoxArray.
Definition AMReX_BoxArray.cpp:1931
IntVectND< 3 > IntVect
Definition AMReX_BaseFwd.H:30
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:230
void ParallelCopy(MF &dst, MF const &src, int scomp, int dcomp, int ncomp, IntVect const &ng_src=IntVect(0), IntVect const &ng_dst=IntVect(0), Periodicity const &period=Periodicity::NonPeriodic())
dst = src w/ MPI communication
Definition AMReX_FabArrayUtility.H:1967
__host__ __device__ constexpr T elemwiseMin(T const &a, T const &b) noexcept
Definition AMReX_Algorithm.H:49
std::array< T, N > Array
Definition AMReX_Array.H:24
Definition AMReX_FFT_Helper.H:58
bool twod_mode
Definition AMReX_FFT_Helper.H:69
bool oned_mode
We might have a special twod_mode: nx or ny == 1 && nz > 1.
Definition AMReX_FFT_Helper.H:72
int batch_size
Batched FFT size. Only support in R2C, not R2X.
Definition AMReX_FFT_Helper.H:75
int nprocs
Max number of processes to use.
Definition AMReX_FFT_Helper.H:78
Definition AMReX_FFT_Helper.H:130
std::conditional_t< std::is_same_v< float, T >, cuComplex, cuDoubleComplex > VendorComplex
Definition AMReX_FFT_Helper.H:134
Definition AMReX_FFT_Helper.H:1428
Definition AMReX_FFT_Helper.H:1451
Definition AMReX_FFT_Helper.H:1526
T make_array(T const &a) const
Definition AMReX_FFT_Helper.H:1546
Box make_box(Box const &box) const
Definition AMReX_FFT.cpp:142
Definition AMReX_Array.H:34
FabArray memory allocation information.
Definition AMReX_FabArray.H:66