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) {
148 if (bc[idim].first == Boundary::periodic ||
149 bc[idim].
second == Boundary::periodic) {
173 m_rx.define(bax, dmx, 1, 0,
MFInfo().SetAlloc(
false));
176 if (bc[0].first == Boundary::periodic) {
182 for (
auto &
b : bl) {
189#if (AMREX_SPACEDIM >= 2)
191#if (AMREX_SPACEDIM == 2)
192 bool batch_on_y =
false;
197 if ((domain.
length(1) > 1) && !batch_on_y) {
222 if (ba.size() ==
m_rx.size()) {
223 dm =
m_rx.DistributionMap();
227 m_ry.define(ba, dm, 1, 0,
MFInfo().SetAlloc(
false));
232 if (bc[1].first == Boundary::periodic) {
237 for (
auto &
b : bl) {
247#if (AMREX_SPACEDIM == 3)
273 if (ba.size() ==
m_ry.size()) {
274 dm =
m_ry.DistributionMap();
278 m_rz.define(ba, dm, 1, 0,
MFInfo().SetAlloc(
false));
283 if (bc[2].first == Boundary::periodic) {
288 for (
auto &
b : bl) {
338#if (AMREX_SPACEDIM >= 2)
342 m_cmd_cx2cy = std::make_unique<MultiBlockCommMetaData>
344 m_cmd_cy2cx = std::make_unique<MultiBlockCommMetaData>
348 m_cmd_rx2ry = std::make_unique<MultiBlockCommMetaData>
350 m_cmd_ry2rx = std::make_unique<MultiBlockCommMetaData>
356#if (AMREX_SPACEDIM == 3)
360 m_cmd_cy2cz = std::make_unique<MultiBlockCommMetaData>
362 m_cmd_cz2cy = std::make_unique<MultiBlockCommMetaData>
366 m_cmd_ry2rz = std::make_unique<MultiBlockCommMetaData>
368 m_cmd_rz2ry = std::make_unique<MultiBlockCommMetaData>
380 if (myproc <
m_rx.size())
382 Box const& box =
m_rx.box(myproc);
383 auto* pf =
m_rx[myproc].dataPtr();
384 if (bc[0].first == Boundary::periodic) {
385 auto* pb = (VendorComplex*)
m_cx[myproc].dataPtr();
386 m_fft_fwd_x.template init_r2c<Direction::forward>(box, pf, pb);
387#if defined(AMREX_USE_SYCL)
390 m_fft_bwd_x.template init_r2c<Direction::backward>(box, pf, pb);
393 m_fft_fwd_x.template init_r2r<Direction::forward>(box, pf, bc[0]);
394#if defined(AMREX_USE_GPU)
395 if ((bc[0].first == Boundary::even && bc[0].
second == Boundary::odd) ||
396 (bc[0].first == Boundary::odd && bc[0].
second == Boundary::even)) {
401 m_fft_bwd_x.template init_r2r<Direction::backward>(box, pf, bc[0]);
406#if (AMREX_SPACEDIM >= 2)
407 if (
m_ry.empty() &&
m_bc[1].first == Boundary::periodic) {
410 auto* p = (VendorComplex *)
m_cy[myproc].dataPtr();
411 m_fft_fwd_y.template init_c2c<Direction::forward>(box, p);
412#if defined(AMREX_USE_SYCL)
415 m_fft_bwd_y.template init_c2c<Direction::backward>(box, p);
418 }
else if (!
m_ry.empty() &&
m_bc[1].first == Boundary::periodic) {
419 if (myproc <
m_ry.size()) {
420 Box const& box =
m_ry.box(myproc);
421 auto* pr =
m_ry[myproc].dataPtr();
422 auto* pc = (VendorComplex*)
m_cy[myproc].dataPtr();
423 m_fft_fwd_y.template init_r2c<Direction::forward>(box, pr, pc);
424#if defined(AMREX_USE_SYCL)
427 m_fft_bwd_y.template init_r2c<Direction::backward>(box, pr, pc);
433 auto* p = (VendorComplex*)
m_cy[myproc].dataPtr();
434 m_fft_fwd_y.template init_r2r<Direction::forward>(box, p, bc[1]);
435#if defined(AMREX_USE_GPU)
436 if ((bc[1].first == Boundary::even && bc[1].
second == Boundary::odd) ||
437 (bc[1].first == Boundary::odd && bc[1].
second == Boundary::even)) {
442 m_fft_bwd_y.template init_r2r<Direction::backward>(box, p, bc[1]);
446 if (myproc <
m_ry.size()) {
447 Box const& box =
m_ry.box(myproc);
448 auto* p =
m_ry[myproc].dataPtr();
449 m_fft_fwd_y.template init_r2r<Direction::forward>(box, p, bc[1]);
450#if defined(AMREX_USE_GPU)
451 if ((bc[1].first == Boundary::even && bc[1].
second == Boundary::odd) ||
452 (bc[1].first == Boundary::odd && bc[1].
second == Boundary::even)) {
457 m_fft_bwd_y.template init_r2r<Direction::backward>(box, p, bc[1]);
463#if (AMREX_SPACEDIM == 3)
464 if (
m_rz.empty() &&
m_bc[2].first == Boundary::periodic) {
467 auto* p = (VendorComplex*)
m_cz[myproc].dataPtr();
468 m_fft_fwd_z.template init_c2c<Direction::forward>(box, p);
469#if defined(AMREX_USE_SYCL)
472 m_fft_bwd_z.template init_c2c<Direction::backward>(box, p);
475 }
else if (!
m_rz.empty() &&
m_bc[2].first == Boundary::periodic) {
476 if (myproc <
m_rz.size()) {
477 Box const& box =
m_rz.box(myproc);
478 auto* pr =
m_rz[myproc].dataPtr();
479 auto* pc = (VendorComplex*)
m_cz[myproc].dataPtr();
480 m_fft_fwd_z.template init_r2c<Direction::forward>(box, pr, pc);
481#if defined(AMREX_USE_SYCL)
484 m_fft_bwd_z.template init_r2c<Direction::backward>(box, pr, pc);
490 auto* p = (VendorComplex*)
m_cz[myproc].dataPtr();
491 m_fft_fwd_z.template init_r2r<Direction::forward>(box, p, bc[2]);
492#if defined(AMREX_USE_GPU)
493 if ((bc[2].first == Boundary::even && bc[2].
second == Boundary::odd) ||
494 (bc[2].first == Boundary::odd && bc[2].
second == Boundary::even)) {
499 m_fft_bwd_z.template init_r2r<Direction::backward>(box, p, bc[2]);
503 if (myproc <
m_rz.size()) {
504 Box const& box =
m_rz.box(myproc);
505 auto* p =
m_rz[myproc].dataPtr();
506 m_fft_fwd_z.template init_r2r<Direction::forward>(box, p, bc[2]);
507#if defined(AMREX_USE_GPU)
508 if ((bc[2].first == Boundary::even && bc[2].
second == Boundary::odd) ||
509 (bc[2].first == Boundary::odd && bc[2].
second == Boundary::even)) {
514 m_fft_bwd_z.template init_r2r<Direction::backward>(box, p, bc[2]);
524 if (m_fft_bwd_x.plan != m_fft_fwd_x.plan) {
525 m_fft_bwd_x.destroy();
527 if (m_fft_bwd_y.plan != m_fft_fwd_y.plan) {
528 m_fft_bwd_y.destroy();
530 if (m_fft_bwd_z.plan != m_fft_fwd_z.plan) {
531 m_fft_bwd_z.destroy();
533 m_fft_fwd_x.destroy();
534 m_fft_fwd_y.destroy();
535 m_fft_fwd_z.destroy();
542 int ndims = m_info.twod_mode ? AMREX_SPACEDIM-1 : AMREX_SPACEDIM;
543#if (AMREX_SPACEDIM == 3)
544 if (m_info.twod_mode && m_dom_0.length(2) == 1) { ndims = 1; };
546 for (
int idim = 0; idim < ndims; ++idim) {
547 r *= m_dom_0.length(idim);
548 if (m_bc[idim].first != Boundary::periodic && (m_dom_0.length(idim) > 1)) {
559 forwardThenBackward_doit_0(inmf, outmf, post_forward);
565 F const& post_forward,
572 bool inmf_safe = m_sub_helper.ghost_safe(inmf.nGrowVect());
573 MF inmf_sub, inmf_tmp;
575 inmf_sub = m_sub_helper.make_alias_mf(inmf);
577 inmf_tmp.define(inmf.boxArray(), inmf.DistributionMap(), 1, 0);
578 inmf_tmp.LocalCopy(inmf, 0, 0, 1,
IntVect(0));
579 inmf_sub = m_sub_helper.make_alias_mf(inmf_tmp);
582 bool outmf_safe = m_sub_helper.ghost_safe(outmf.nGrowVect());
583 MF outmf_sub, outmf_tmp;
585 outmf_sub = m_sub_helper.make_alias_mf(outmf);
587 IntVect const& ngtmp = m_sub_helper.make_safe_ghost(outmf.nGrowVect());
588 outmf_tmp.define(outmf.boxArray(), outmf.DistributionMap(), 1, ngtmp);
589 outmf_sub = m_sub_helper.make_alias_mf(outmf_tmp);
592 IntVect const& subngout = m_sub_helper.make_iv(ngout);
593 Periodicity const& subperiod = m_sub_helper.make_periodicity(period);
595 m_r2x_sub->forwardThenBackward_doit_1
596 (inmf_sub, outmf_sub,
600 post_forward(idx[order[0]], idx[order[1]], idx[order[2]], sp);
602 subngout, subperiod);
605 outmf.LocalCopy(outmf_tmp, 0, 0, 1, outmf_tmp.nGrowVect());
610 this->forwardThenBackward_doit_1(inmf, outmf, post_forward, ngout, period);
617 F const& post_forward,
624 amrex::Abort(
"R2X::forwardThenBackward_doit_1: How did this happen?");
632 int actual_dim = AMREX_SPACEDIM;
633#if (AMREX_SPACEDIM >= 2)
634 if (m_dom_0.length(1) == 1) { actual_dim = 1; }
636#if (AMREX_SPACEDIM == 3)
637 if ((m_dom_0.length(2) == 1) && (m_dom_0.length(1) > 1)) { actual_dim = 2; }
640 if (actual_dim == 1) {
647#if (AMREX_SPACEDIM >= 2)
648 else if (actual_dim == 2) {
656#if (AMREX_SPACEDIM == 3)
657 else if (actual_dim == 3) {
668 outmf.ParallelCopy(m_rx, 0, 0, 1,
IntVect(0),
679 if (m_sub_helper.ghost_safe(inmf.nGrowVect())) {
680 m_r2x_sub->forward(m_sub_helper.make_alias_mf(inmf));
682 MF tmp(inmf.boxArray(), inmf.DistributionMap(), 1, 0);
683 tmp.LocalCopy(inmf, 0, 0, 1,
IntVect(0));
684 m_r2x_sub->forward(m_sub_helper.make_alias_mf(tmp));
689 m_rx.ParallelCopy(inmf, 0, 0, 1);
690 if (m_bc[0].first == Boundary::periodic) {
691 m_fft_fwd_x.template compute_r2c<Direction::forward>();
693 m_fft_fwd_x.template compute_r2r<Direction::forward>();
696#if (AMREX_SPACEDIM >= 2)
698 ParallelCopy(m_cy, m_cx, *m_cmd_cx2cy, 0, 0, 1, m_dtos_x2y);
699 }
else if ( m_cmd_rx2ry) {
700 ParallelCopy(m_ry, m_rx, *m_cmd_rx2ry, 0, 0, 1, m_dtos_x2y);
702 if (m_bc[1].first != Boundary::periodic)
704 m_fft_fwd_y.template compute_r2r<Direction::forward>();
706 else if (m_bc[0].first == Boundary::periodic)
708 m_fft_fwd_y.template compute_c2c<Direction::forward>();
712 m_fft_fwd_y.template compute_r2c<Direction::forward>();
716#if (AMREX_SPACEDIM == 3)
718 ParallelCopy(m_cz, m_cy, *m_cmd_cy2cz, 0, 0, 1, m_dtos_y2z);
719 }
else if ( m_cmd_ry2rz) {
720 ParallelCopy(m_rz, m_ry, *m_cmd_ry2rz, 0, 0, 1, m_dtos_y2z);
722 if (m_bc[2].first != Boundary::periodic)
724 m_fft_fwd_z.template compute_r2r<Direction::forward>();
726 else if (m_bc[0].first == Boundary::periodic ||
727 m_bc[1].first == Boundary::periodic)
729 m_fft_fwd_z.template compute_c2c<Direction::forward>();
733 m_fft_fwd_z.template compute_r2c<Direction::forward>();
743 bool inmf_safe = m_sub_helper.ghost_safe(inmf.nGrowVect());
744 MF inmf_sub, inmf_tmp;
746 inmf_sub = m_sub_helper.make_alias_mf(inmf);
748 inmf_tmp.define(inmf.boxArray(), inmf.DistributionMap(), 1, 0);
749 inmf_tmp.LocalCopy(inmf, 0, 0, 1,
IntVect(0));
750 inmf_sub = m_sub_helper.make_alias_mf(inmf_tmp);
753 bool outmf_safe = m_sub_helper.ghost_safe(outmf.nGrowVect());
754 MF outmf_sub, outmf_tmp;
756 outmf_sub = m_sub_helper.make_alias_mf(outmf);
758 outmf_tmp.define(outmf.boxArray(), outmf.DistributionMap(), 1, 0);
759 outmf_sub = m_sub_helper.make_alias_mf(outmf_tmp);
762 m_r2x_sub->forward(inmf_sub, outmf_sub);
765 outmf.LocalCopy(outmf_tmp, 0, 0, 1,
IntVect(0));
772#if (AMREX_SPACEDIM == 3)
773 if (m_info.twod_mode) {
774 if (m_cy.empty() && !m_ry.empty()) {
776 }
else if (m_ry.empty() && m_cy.empty() && m_cx.empty()) {
777 outmf.ParallelCopy(m_rx, 0, 0, 1);
779 amrex::Abort(
"R2X::forward(MF,MF): How did this happen?");
795 bool inmf_safe = m_sub_helper.ghost_safe(inmf.nGrowVect());
796 MF inmf_sub, inmf_tmp;
798 inmf_sub = m_sub_helper.make_alias_mf(inmf);
800 inmf_tmp.define(inmf.boxArray(), inmf.DistributionMap(), 1, 0);
801 inmf_tmp.LocalCopy(inmf, 0, 0, 1,
IntVect(0));
802 inmf_sub = m_sub_helper.make_alias_mf(inmf_tmp);
805 bool outmf_safe = m_sub_helper.ghost_safe(outmf.
nGrowVect());
806 cMF outmf_sub, outmf_tmp;
808 outmf_sub = m_sub_helper.make_alias_mf(outmf);
811 outmf_sub = m_sub_helper.make_alias_mf(outmf_tmp);
814 m_r2x_sub->forward(inmf_sub, outmf_sub);
824#if (AMREX_SPACEDIM == 3)
825 if (m_info.twod_mode) {
827 auto lo = m_dom_cy.smallEnd();
828 auto hi = m_dom_cy.bigEnd();
829 std::swap(lo[0],lo[1]);
830 std::swap(hi[0],hi[1]);
833 }
else if (m_ry.empty() && m_cy.empty() && !m_cx.empty()) {
836 amrex::Abort(
"R2X::forward(MF,cMF): How did this happen?");
854#if (AMREX_SPACEDIM == 3)
855 if (m_bc[2].first != Boundary::periodic)
857 m_fft_bwd_z.template compute_r2r<Direction::backward>();
859 else if (m_bc[0].first == Boundary::periodic ||
860 m_bc[1].first == Boundary::periodic)
862 m_fft_bwd_z.template compute_c2c<Direction::backward>();
866 m_fft_bwd_z.template compute_r2c<Direction::backward>();
869 ParallelCopy(m_cy, m_cz, *m_cmd_cz2cy, 0, 0, 1, m_dtos_z2y);
870 }
else if ( m_cmd_rz2ry) {
871 ParallelCopy(m_ry, m_rz, *m_cmd_rz2ry, 0, 0, 1, m_dtos_z2y);
875#if (AMREX_SPACEDIM >= 2)
876 if (m_bc[1].first != Boundary::periodic)
878 m_fft_bwd_y.template compute_r2r<Direction::backward>();
880 else if (m_bc[0].first == Boundary::periodic)
882 m_fft_bwd_y.template compute_c2c<Direction::backward>();
886 m_fft_bwd_y.template compute_r2c<Direction::backward>();
889 ParallelCopy(m_cx, m_cy, *m_cmd_cy2cx, 0, 0, 1, m_dtos_y2x);
890 }
else if ( m_cmd_ry2rx) {
891 ParallelCopy(m_rx, m_ry, *m_cmd_ry2rx, 0, 0, 1, m_dtos_y2x);
895 if (m_bc[0].first == Boundary::periodic) {
896 m_fft_bwd_x.template compute_r2c<Direction::backward>();
898 m_fft_bwd_x.template compute_r2r<Direction::backward>();
908 bool inmf_safe = m_sub_helper.ghost_safe(inmf.nGrowVect());
909 MF inmf_sub, inmf_tmp;
911 inmf_sub = m_sub_helper.make_alias_mf(inmf);
913 inmf_tmp.define(inmf.boxArray(), inmf.DistributionMap(), 1, 0);
914 inmf_tmp.LocalCopy(inmf, 0, 0, 1,
IntVect(0));
915 inmf_sub = m_sub_helper.make_alias_mf(inmf_tmp);
918 bool outmf_safe = m_sub_helper.ghost_safe(outmf.nGrowVect());
919 MF outmf_sub, outmf_tmp;
921 outmf_sub = m_sub_helper.make_alias_mf(outmf);
923 IntVect const& ngtmp = m_sub_helper.make_safe_ghost(outmf.nGrowVect());
924 outmf_tmp.define(outmf.boxArray(), outmf.DistributionMap(), 1, ngtmp);
925 outmf_sub = m_sub_helper.make_alias_mf(outmf_tmp);
928 IntVect const& subngout = m_sub_helper.make_iv(ngout);
929 Periodicity const& subperiod = m_sub_helper.make_periodicity(period);
930 m_r2x_sub->backward(inmf_sub, outmf_sub, subngout, subperiod);
933 outmf.LocalCopy(outmf_tmp, 0, 0, 1, outmf_tmp.nGrowVect());
938#if (AMREX_SPACEDIM == 3)
939 if (m_info.twod_mode) {
940 if (m_cy.empty() && !m_ry.empty()) {
942 }
else if (m_ry.empty() && m_cy.empty() && m_cx.empty()) {
943 m_rx.ParallelCopy(inmf, 0, 0, 1);
945 amrex::Abort(
"R2X::backward(MF,MF): How did this happen?");
956 outmf.ParallelCopy(m_rx, 0, 0, 1,
IntVect(0),
967 bool inmf_safe = m_sub_helper.ghost_safe(inmf.
nGrowVect());
968 cMF inmf_sub, inmf_tmp;
970 inmf_sub = m_sub_helper.make_alias_mf(inmf);
974 inmf_sub = m_sub_helper.make_alias_mf(inmf_tmp);
977 bool outmf_safe = m_sub_helper.ghost_safe(outmf.nGrowVect());
978 MF outmf_sub, outmf_tmp;
980 outmf_sub = m_sub_helper.make_alias_mf(outmf);
982 IntVect const& ngtmp = m_sub_helper.make_safe_ghost(outmf.nGrowVect());
983 outmf_tmp.define(outmf.boxArray(), outmf.DistributionMap(), 1, ngtmp);
984 outmf_sub = m_sub_helper.make_alias_mf(outmf_tmp);
987 IntVect const& subngout = m_sub_helper.make_iv(ngout);
988 Periodicity const& subperiod = m_sub_helper.make_periodicity(period);
989 m_r2x_sub->backward(inmf_sub, outmf_sub, subngout, subperiod);
992 outmf.LocalCopy(outmf_tmp, 0, 0, 1, outmf_tmp.nGrowVect());
997#if (AMREX_SPACEDIM == 3)
998 if (m_info.twod_mode) {
1001 }
else if (m_ry.empty() && m_cy.empty() && !m_cx.empty()) {
1002 m_cx.ParallelCopy(inmf, 0, 0, 1);
1004 amrex::Abort(
"R2X::backward(cMF,MF): How did this happen?");
1015 outmf.ParallelCopy(m_rx, 0, 0, 1,
IntVect(0),
1020template <
typename T>
1021template <
int dim,
typename FAB,
typename F>
1024 if (m_info.twod_mode) {
1028 auto const& a = fab->array();
1032 if constexpr (dim == 0) {
1034 }
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
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:550
A class for managing a List of Boxes that share a common IndexType. This class implements operations ...
Definition AMReX_BoxList.H:52
AMREX_GPU_HOST_DEVICE IntVectND< dim > size() const noexcept
Return the length of the BoxND.
Definition AMReX_Box.H:139
AMREX_GPU_HOST_DEVICE IntVectND< dim > length() const noexcept
Return the length of the BoxND.
Definition AMReX_Box.H:146
AMREX_GPU_HOST_DEVICE Long numPts() const noexcept
Returns the number of points contained in the BoxND.
Definition AMReX_Box.H:346
AMREX_GPU_HOST_DEVICE const IntVectND< dim > & bigEnd() const &noexcept
Get the bigend.
Definition AMReX_Box.H:116
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:106
Poisson solver for periodic, Dirichlet & Neumann boundaries using FFT.
Definition AMReX_FFT_Poisson.H:22
Discrete Fourier Transform.
Definition AMReX_FFT_R2X.H:25
MF m_rz
Definition AMReX_FFT_R2X.H:102
Array< std::pair< Boundary, Boundary >, AMREX_SPACEDIM > m_bc
Definition AMReX_FFT_R2X.H:76
void post_forward_doit(FAB *fab, F const &f)
Definition AMReX_FFT_R2X.H:1022
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:962
void backward(MF const &inmf, MF &outmf, IntVect const &ngout, Periodicity const &period)
Definition AMReX_FFT_R2X.H:903
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:674
Swap02 m_dtos_y2z
Definition AMReX_FFT_R2X.H:97
~R2X()
Definition AMReX_FFT_R2X.H:522
void forward(MF const &inmf, MF &outmf)
Definition AMReX_FFT_R2X.H:739
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:557
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:791
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
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:539
Box m_dom_ry
Definition AMReX_FFT_R2X.H:111
void backward()
Definition AMReX_FFT_R2X.H:848
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
R2X(Box const &domain, Array< std::pair< Boundary, Boundary >, AMREX_SPACEDIM > const &bc, Info const &info=Info{})
Definition AMReX_FFT_R2X.H:124
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:616
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:564
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:79
int size() const noexcept
Return the number of FABs in the FabArray.
Definition AMReX_FabArrayBase.H:109
const DistributionMapping & DistributionMap() const noexcept
Return constant reference to associated DistributionMapping.
Definition AMReX_FabArrayBase.H:130
bool empty() const noexcept
Definition AMReX_FabArrayBase.H:88
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:100
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:94
An Array of FortranArrayBox(FAB)-like Objects.
Definition AMReX_FabArray.H:344
void ParallelCopy(const FabArray< FAB > &src, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:840
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:1942
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:1733
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:1383
FA::FABType::value_type * get_fab(FA &fa)
Definition AMReX_FFT_Helper.H:1372
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
std::enable_if_t< std::is_integral_v< T > > ParallelFor(TypeList< CTOs... > ctos, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
Definition AMReX_CTOParallelForImpl.H:191
BoxND< AMREX_SPACEDIM > Box
Definition AMReX_BaseFwd.H:27
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE constexpr T elemwiseMin(T const &a, T const &b) noexcept
Definition AMReX_Algorithm.H:49
double second() noexcept
Definition AMReX_Utility.cpp:922
IntVectND< AMREX_SPACEDIM > IntVect
Definition AMReX_BaseFwd.H:30
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:111
BoxArray decompose(Box const &domain, int nboxes, Array< bool, AMREX_SPACEDIM > const &decomp={AMREX_D_DECL(true, true, true)}, bool no_overlap=false)
Decompose domain box into BoxArray.
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:225
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:1873
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
int batch_size
Batched FFT size. Only support in R2C, not R2X.
Definition AMReX_FFT_Helper.H:72
int nprocs
Max number of processes to use.
Definition AMReX_FFT_Helper.H:75
Definition AMReX_FFT_Helper.H:126
std::conditional_t< std::is_same_v< float, T >, cuComplex, cuDoubleComplex > VendorComplex
Definition AMReX_FFT_Helper.H:130
Definition AMReX_FFT_Helper.H:1424
Definition AMReX_FFT_Helper.H:1447
Definition AMReX_FFT_Helper.H:1522
T make_array(T const &a) const
Definition AMReX_FFT_Helper.H:1542
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