1 #ifndef AMREX_FFT_POISSON_H_
2 #define AMREX_FFT_POISSON_H_
11 template <
typename MF>
13 Array<std::pair<Boundary,Boundary>,AMREX_SPACEDIM>
const& bc);
20 template <
typename MF = MultiFab>
25 template <
typename FA=MF, std::enable_if_t<IsFabArray_v<FA>,
int> = 0>
27 Array<std::pair<Boundary,Boundary>,AMREX_SPACEDIM>
const& bc)
30 bool all_periodic =
true;
31 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
32 all_periodic = all_periodic
33 && (bc[idim].first == Boundary::periodic)
34 && (bc[idim].
second == Boundary::periodic);
43 template <
typename FA=MF, std::enable_if_t<IsFabArray_v<FA>,
int> = 0>
47 std::make_pair(Boundary::periodic,Boundary::periodic),
48 std::make_pair(Boundary::periodic,Boundary::periodic))}
64 void solve (MF& soln, MF
const& rhs);
69 std::unique_ptr<R2X<typename MF::value_type>>
m_r2x;
70 std::unique_ptr<R2C<typename MF::value_type>>
m_r2c;
73 #if (AMREX_SPACEDIM == 3)
77 template <
typename MF = MultiFab>
82 template <
typename FA=MF, std::enable_if_t<IsFabArray_v<FA>,
int> = 0>
83 explicit PoissonOpenBC (
Geometry const& geom,
87 void solve (MF& soln, MF
const& rhs);
104 template <
typename MF = MultiFab>
108 using T =
typename MF::value_type;
110 template <
typename FA=MF, std::enable_if_t<IsFabArray_v<FA>,
int> = 0>
112 Array<std::pair<Boundary,Boundary>,AMREX_SPACEDIM>
const& bc)
115 #if (AMREX_SPACEDIM < 3)
119 bool periodic_xy =
true;
120 for (
int idim = 0; idim < 2; ++idim) {
122 periodic_xy = periodic_xy && (bc[idim].first == Boundary::periodic);
124 bc[idim].
second == Boundary::periodic) ||
125 (bc[idim].first != Boundary::periodic &&
126 bc[idim].
second != Boundary::periodic));
141 template <
typename FA=MF, std::enable_if_t<IsFabArray_v<FA>,
int> = 0>
145 std::make_pair(Boundary::periodic,Boundary::periodic),
146 std::make_pair(Boundary::even,Boundary::even))},
147 m_r2c(std::make_unique<
R2C<typename MF::value_type>>
148 (geom.Domain(),
Info().setBatchMode(true)))
150 #if (AMREX_SPACEDIM == 3)
166 void solve (MF& soln, MF
const& rhs);
170 template <
typename TRIA,
typename TRIC>
171 void solve (MF& soln, MF
const& rhs, TRIA
const& tria, TRIC
const& tric);
174 template <
typename FA,
typename TRIA,
typename TRIC>
175 void solve_z (FA& spmf, TRIA
const& tria, TRIC
const& tric);
185 std::unique_ptr<R2X<typename MF::value_type>>
m_r2x;
186 std::unique_ptr<R2C<typename MF::value_type>>
m_r2c;
192 template <
typename MF>
197 AMREX_ASSERT(soln.is_cell_centered() && rhs.is_cell_centered());
199 using T =
typename MF::value_type;
202 {
AMREX_D_DECL(Math::pi<T>()/T(m_geom.Domain().length(0)),
203 Math::pi<T>()/T(m_geom.Domain().length(1)),
204 Math::pi<T>()/T(m_geom.Domain().length(2)))};
205 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
206 if (m_bc[idim].first == Boundary::periodic) {
211 {
AMREX_D_DECL(T(2)/T(m_geom.CellSize(0)*m_geom.CellSize(0)),
212 T(2)/T(m_geom.CellSize(1)*m_geom.CellSize(1)),
213 T(2)/T(m_geom.CellSize(2)*m_geom.CellSize(2)))};
214 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
215 if (m_geom.Domain().length(idim) == 1) {
219 auto scale = (m_r2x) ? m_r2x->scalingFactor() : m_r2c->scalingFactor();
222 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
223 if (m_bc[idim].first == Boundary::odd &&
224 m_bc[idim].
second == Boundary::odd)
228 else if ((m_bc[idim].first == Boundary::odd &&
229 m_bc[idim].
second == Boundary::even) ||
230 (m_bc[idim].first == Boundary::even &&
231 m_bc[idim].
second == Boundary::odd))
242 T c = fac[2]*(k+
offset[2]));
244 +dxfac[1]*(std::cos(
b)-T(1)),
245 +dxfac[2]*(std::cos(c)-T(1)));
249 spectral_data *=
scale;
255 m_r2x->template forwardThenBackward_doit<0>(rhs, soln,
f, ng, m_geom.periodicity());
259 m_r2c->template post_forward_doit<0>(
f);
260 m_r2c->backward_doit(soln, ng, m_geom.periodicity());
264 #if (AMREX_SPACEDIM == 3)
266 template <
typename MF>
267 template <
typename FA, std::enable_if_t<IsFabArray_v<FA>,
int> FOO>
273 m_solver(m_grown_domain)
278 template <
typename MF>
279 void PoissonOpenBC<MF>::define_doit ()
281 using T =
typename MF::value_type;
282 auto const& lo = m_grown_domain.smallEnd();
283 auto const dx = T(m_geom.CellSize(0));
284 auto const dy = T(m_geom.CellSize(1));
285 auto const dz = T(m_geom.CellSize(2));
286 auto const gfac = T(1)/T(
std::sqrt(T(12)));
288 auto const fac = T(-0.125) * (dx*dy*dz) / (T(4)*Math::pi<T>());
291 auto x = (T(i-lo[0]) - gfac) * dx;
292 auto y = (T(j-lo[1]) - gfac) * dy;
293 auto z = (T(k-lo[2]) - gfac) * dz;
295 for (
int gx = 0; gx < 2; ++gx) {
296 for (
int gy = 0; gy < 2; ++gy) {
297 for (
int gz = 0; gz < 2; ++gz) {
298 auto xg =
x + 2*gx*gfac*dx;
299 auto yg = y + 2*gy*gfac*dy;
300 auto zg = z + 2*gz*gfac*dz;
307 template <
typename MF>
308 void PoissonOpenBC<MF>::solve (MF& soln, MF
const& rhs)
310 AMREX_ASSERT(m_grown_domain.ixType() == soln.ixType() && m_grown_domain.ixType() == rhs.ixType());
311 m_solver.solve(soln, rhs);
316 namespace fft_poisson_detail {
317 template <
typename T>
327 template <
typename T>
337 template <
typename T>
348 template <
typename MF>
349 std::pair<BoxArray,DistributionMapping>
352 if (!m_spmf_r.empty()) {
353 return std::make_pair(m_spmf_r.boxArray(), m_spmf_r.DistributionMap());
355 return std::make_pair(m_spmf_c.boxArray(), m_spmf_c.DistributionMap());
359 template <
typename MF>
362 #if (AMREX_SPACEDIM == 3)
364 (m_geom.Domain().length(0) > 1 ||
365 m_geom.Domain().length(1) > 1));
368 Box cdomain = m_geom.Domain();
369 if (cdomain.
length(0) > 1) {
377 m_spmf_c.define(cba, dm, 1, 0);
378 }
else if (m_geom.Domain().length(0) > 1 &&
379 m_geom.Domain().length(1) > 1) {
380 if (m_r2x->m_cy.empty()) {
382 {AMREX_D_DECL(true,true,false)});
384 m_spmf_r.define(sba, dm, 1, 0);
386 Box cdomain = m_geom.Domain();
387 if (m_bc[0].first == Boundary::periodic) {
395 m_spmf_c.define(cba, dm, 1, 0);
400 {AMREX_D_DECL(true,true,false)});
402 m_spmf_r.define(sba, dm, 1, 0);
409 template <
typename MF>
412 auto delz =
T(m_geom.CellSize(AMREX_SPACEDIM-1));
418 template <
typename MF>
421 auto const* pdz = dz.
dataPtr();
427 template <
typename MF>
430 AMREX_ASSERT(soln.is_cell_centered() && rhs.is_cell_centered());
435 auto const* pdz = d_dz.
data();
437 auto const* pdz = dz.data();
444 template <
typename MF>
445 template <
typename TRIA,
typename TRIC>
451 AMREX_ASSERT(soln.is_cell_centered() && rhs.is_cell_centered());
453 #if (AMREX_SPACEDIM < 3)
461 m_r2c->forward(rhs, m_spmf_c);
462 solve_z(m_spmf_c, tria, tric);
463 m_r2c->backward_doit(m_spmf_c, soln, ng, m_geom.periodicity());
467 if (m_r2x->m_cy.empty()) {
468 m_r2x->forward(rhs, m_spmf_r);
469 solve_z(m_spmf_r, tria, tric);
470 m_r2x->backward(m_spmf_r, soln, ng, m_geom.periodicity());
472 m_r2x->forward(rhs, m_spmf_c);
473 solve_z(m_spmf_c, tria, tric);
474 m_r2x->backward(m_spmf_c, soln, ng, m_geom.periodicity());
482 template <
typename MF>
483 template <
typename FA,
typename TRIA,
typename TRIC>
488 #if (AMREX_SPACEDIM < 3)
491 auto facx = Math::pi<T>()/
T(m_geom.Domain().length(0));
492 auto facy = Math::pi<T>()/
T(m_geom.Domain().length(1));
493 if (m_bc[0].first == Boundary::periodic) { facx *=
T(2); }
494 if (m_bc[1].first == Boundary::periodic) { facy *=
T(2); }
495 auto dxfac =
T(2)/
T(m_geom.CellSize(0)*m_geom.CellSize(0));
496 auto dyfac =
T(2)/
T(m_geom.CellSize(1)*m_geom.CellSize(1));
497 auto scale = (m_r2x) ? m_r2x->scalingFactor() : m_r2c->scalingFactor();
499 if (m_geom.Domain().length(0) == 1) { dxfac = 0; }
500 if (m_geom.Domain().length(1) == 1) { dyfac = 0; }
503 for (
int idim = 0; idim < AMREX_SPACEDIM-1; ++idim) {
504 if (m_geom.Domain().length(idim) > 1) {
505 if (m_bc[idim].first == Boundary::odd &&
506 m_bc[idim].
second == Boundary::odd)
510 else if ((m_bc[idim].first == Boundary::odd &&
511 m_bc[idim].
second == Boundary::even) ||
512 (m_bc[idim].first == Boundary::even &&
513 m_bc[idim].
second == Boundary::odd))
522 auto nz = m_geom.Domain().length(2);
526 auto const& spectral = spmf.array(mfi);
527 auto const& box = mfi.validbox();
536 auto const& ald = tridiag_workspace.
array(0);
537 auto const& bd = tridiag_workspace.
array(1);
538 auto const& cud = tridiag_workspace.
array(2);
539 auto const& scratch = tridiag_workspace.
array(3);
545 T k2 = dxfac * (std::cos(a)-
T(1))
546 + dyfac * (std::cos(
b)-
T(1));
549 for(
int k=0; k < nz; k++) {
552 cud(i,j,k) = tric(i,j,k);
553 bd(i,j,k) = k2 -ald(i,j,k)-cud(i,j,k);
554 }
else if (k == nz-1) {
555 ald(i,j,k) = tria(i,j,k);
557 bd(i,j,k) = k2 -ald(i,j,k)-cud(i,j,k);
558 if (i == 0 && j == 0 && !has_dirichlet) {
562 ald(i,j,k) = tria(i,j,k);
563 cud(i,j,k) = tric(i,j,k);
564 bd(i,j,k) = k2 -ald(i,j,k)-cud(i,j,k);
568 scratch(i,j,0) = cud(i,j,0)/bd(i,j,0);
569 spectral(i,j,0) = spectral(i,j,0)/bd(i,j,0);
571 for (
int k = 1; k < nz; k++) {
573 scratch(i,j,k) = cud(i,j,k) / (bd(i,j,k) - ald(i,j,k) * scratch(i,j,k-1));
575 spectral(i,j,k) = (spectral(i,j,k) - ald(i,j,k) * spectral(i,j,k - 1))
576 / (bd(i,j,k) - ald(i,j,k) * scratch(i,j,k-1));
579 for (
int k = nz - 2; k >= 0; k--) {
580 spectral(i,j,k) -= scratch(i,j,k) * spectral(i,j,k + 1);
583 for (
int k = 0; k < nz; ++k) {
584 spectral(i,j,k) *=
scale;
600 T k2 = dxfac * (std::cos(a)-
T(1))
601 + dyfac * (std::cos(
b)-
T(1));
604 for(
int k=0; k < nz; k++) {
607 cud[k] = tric(i,j,k);
608 bd[k] = k2 -ald[k]-cud[k];
609 }
else if (k == nz-1) {
610 ald[k] = tria(i,j,k);
612 bd[k] = k2 -ald[k]-cud[k];
613 if (i == 0 && j == 0 && !has_dirichlet) {
617 ald[k] = tria(i,j,k);
618 cud[k] = tric(i,j,k);
619 bd[k] = k2 -ald[k]-cud[k];
623 scratch[0] = cud[0]/bd[0];
624 spectral(i,j,0) = spectral(i,j,0)/bd[0];
626 for (
int k = 1; k < nz; k++) {
628 scratch[k] = cud[k] / (bd[k] - ald[k] * scratch[k-1]);
630 spectral(i,j,k) = (spectral(i,j,k) - ald[k] * spectral(i,j,k - 1))
631 / (bd[k] - ald[k] * scratch[k-1]);
634 for (
int k = nz - 2; k >= 0; k--) {
635 spectral(i,j,k) -= scratch[k] * spectral(i,j,k + 1);
638 for (
int k = 0; k < nz; ++k) {
639 spectral(i,j,k) *=
scale;
660 template <
typename MF>
662 Array<std::pair<Boundary,Boundary>,AMREX_SPACEDIM>
const& bc)
664 using T =
typename MF::value_type;
670 auto const& box = mfi.fabbox();
671 auto const& arr = mf.array(mfi);
679 fbc = bc[idim].first;
682 fbc = bc[idim].second;
685 if (
b.ok() && fbc != Boundary::periodic) {
686 tags.push_back({arr,
b, fbc, face});
691 #if defined(AMREX_USE_GPU)
693 Tag
const& tag) noexcept
695 auto ntags =
int(tags.
size());
697 #pragma omp parallel
for
699 for (
int itag = 0; itag < ntags; ++itag) {
700 Tag
const& tag = tags[itag];
704 int sgn = tag.face.isLow() ? 1 : -1;
705 IntVect siv = IntVect(AMREX_D_DECL(i,j,k))
706 + sgn * IntVect::TheDimensionVector(tag.face.coordDir());
707 if (tag.bc == Boundary::odd) {
708 tag.dfab(i,j,k) = -tag.dfab(siv);
710 tag.dfab(i,j,k) = tag.dfab(siv);
713 #if !defined(AMREX_USE_GPU)
#define BL_PROFILE(a)
Definition: AMReX_BLProfiler.H:551
#define AMREX_ASSERT(EX)
Definition: AMReX_BLassert.H:38
#define AMREX_ALWAYS_ASSERT(EX)
Definition: AMReX_BLassert.H:50
#define AMREX_FORCE_INLINE
Definition: AMReX_Extension.H:119
#define AMREX_GPU_DEVICE
Definition: AMReX_GpuQualifiers.H:18
#define AMREX_GPU_HOST_DEVICE
Definition: AMReX_GpuQualifiers.H:20
Array4< int const > offset
Definition: AMReX_HypreMLABecLap.cpp:1089
#define AMREX_D_TERM(a, b, c)
Definition: AMReX_SPACE.H:129
#define AMREX_D_DECL(a, b, c)
Definition: AMReX_SPACE.H:104
AMREX_FORCE_INLINE Array4< T const > array() const noexcept
Definition: AMReX_BaseFab.H:379
AMREX_GPU_HOST_DEVICE const IntVectND< dim > & smallEnd() const &noexcept
Get the smallend of the BoxND.
Definition: AMReX_Box.H:105
AMREX_GPU_HOST_DEVICE const IntVectND< dim > & bigEnd() const &noexcept
Get the bigend.
Definition: AMReX_Box.H:116
AMREX_GPU_HOST_DEVICE IntVectND< dim > length() const noexcept
Return the length of the BoxND.
Definition: AMReX_Box.H:146
AMREX_GPU_HOST_DEVICE BoxND & setBig(const IntVectND< dim > &bg) noexcept
Redefine the big end of the BoxND.
Definition: AMReX_Box.H:474
Calculates the distribution of FABs to MPI processes.
Definition: AMReX_DistributionMapping.H:41
A Fortran Array of REALs.
Definition: AMReX_FArrayBox.H:229
Definition: AMReX_FFT_OpenBCSolver.H:11
3D Poisson solver for periodic, Dirichlet & Neumann boundaries in the first two dimensions,...
Definition: AMReX_FFT_Poisson.H:106
void solve(MF &soln, MF const &rhs)
Definition: AMReX_FFT_Poisson.H:410
std::unique_ptr< R2C< typename MF::value_type > > m_r2c
Definition: AMReX_FFT_Poisson.H:186
typename MF::value_type T
Definition: AMReX_FFT_Poisson.H:108
Array< std::pair< Boundary, Boundary >, AMREX_SPACEDIM > m_bc
Definition: AMReX_FFT_Poisson.H:184
cMF m_spmf_c
Definition: AMReX_FFT_Poisson.H:189
void solve_z(FA &spmf, TRIA const &tria, TRIC const &tric)
Definition: AMReX_FFT_Poisson.H:484
MF m_spmf_r
Definition: AMReX_FFT_Poisson.H:187
std::unique_ptr< R2X< typename MF::value_type > > m_r2x
Definition: AMReX_FFT_Poisson.H:185
Geometry m_geom
Definition: AMReX_FFT_Poisson.H:183
std::pair< BoxArray, DistributionMapping > getSpectralDataLayout() const
Definition: AMReX_FFT_Poisson.H:350
PoissonHybrid(Geometry const &geom, Array< std::pair< Boundary, Boundary >, AMREX_SPACEDIM > const &bc)
Definition: AMReX_FFT_Poisson.H:111
void build_spmf()
Definition: AMReX_FFT_Poisson.H:360
PoissonHybrid(Geometry const &geom)
Definition: AMReX_FFT_Poisson.H:142
Poisson solver for periodic, Dirichlet & Neumann boundaries using FFT.
Definition: AMReX_FFT_Poisson.H:22
Poisson(Geometry const &geom, Array< std::pair< Boundary, Boundary >, AMREX_SPACEDIM > const &bc)
Definition: AMReX_FFT_Poisson.H:26
std::unique_ptr< R2X< typename MF::value_type > > m_r2x
Definition: AMReX_FFT_Poisson.H:69
Geometry m_geom
Definition: AMReX_FFT_Poisson.H:67
Array< std::pair< Boundary, Boundary >, AMREX_SPACEDIM > m_bc
Definition: AMReX_FFT_Poisson.H:68
Poisson(Geometry const &geom)
Definition: AMReX_FFT_Poisson.H:44
void solve(MF &soln, MF const &rhs)
Definition: AMReX_FFT_Poisson.H:193
std::unique_ptr< R2C< typename MF::value_type > > m_r2c
Definition: AMReX_FFT_Poisson.H:70
Parallel Discrete Fourier Transform.
Definition: AMReX_FFT_R2C.H:36
An Array of FortranArrayBox(FAB)-like Objects.
Definition: AMReX_FabArray.H:344
Rectangular problem domain geometry.
Definition: AMReX_Geometry.H:73
const Box & Domain() const noexcept
Returns our rectangular domain.
Definition: AMReX_Geometry.H:210
bool isAllPeriodic() const noexcept
Is domain periodic in all directions?
Definition: AMReX_Geometry.H:338
bool isPeriodic(int dir) const noexcept
Is the domain periodic in the specified direction?
Definition: AMReX_Geometry.H:331
AMREX_GPU_HOST_DEVICE static constexpr AMREX_FORCE_INLINE IndexTypeND< dim > TheCellType() noexcept
This static member function returns an IndexTypeND object of value IndexTypeND::CELL....
Definition: AMReX_IndexType.H:149
Definition: AMReX_MFIter.H:57
bool isValid() const noexcept
Is the iterator valid i.e. is it associated with a FAB?
Definition: AMReX_MFIter.H:141
An Iterator over the Orientation of Faces of a Box.
Definition: AMReX_Orientation.H:135
Encapsulation of the Orientation of the Faces of a Box.
Definition: AMReX_Orientation.H:29
AMREX_GPU_HOST_DEVICE int coordDir() const noexcept
Returns the coordinate direction.
Definition: AMReX_Orientation.H:83
AMREX_GPU_HOST_DEVICE bool isLow() const noexcept
Returns true if Orientation is low.
Definition: AMReX_Orientation.H:89
Definition: AMReX_PODVector.H:246
T * data() noexcept
Definition: AMReX_PODVector.H:593
T * dataPtr() noexcept
Definition: AMReX_PODVector.H:597
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition: AMReX_Vector.H:27
Long size() const noexcept
Definition: AMReX_Vector.H:50
void fill_physbc(MF &mf, Geometry const &geom, Array< std::pair< Boundary, Boundary >, AMREX_SPACEDIM > const &bc)
Definition: AMReX_FFT_Poisson.H:661
DistributionMapping make_iota_distromap(Long n)
Definition: AMReX_FFT.cpp:88
Definition: AMReX_FFT.cpp:7
void streamSynchronize() noexcept
Definition: AMReX_GpuDevice.H:237
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition: AMReX_GpuDevice.H:251
int NProcsSub() noexcept
number of ranks in current frame
Definition: AMReX_ParallelContext.H:74
static int f(amrex::Real t, N_Vector y_data, N_Vector y_rhs, void *user_data)
Definition: AMReX_SundialsIntegrator.H:44
Definition: AMReX_Amr.cpp:49
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:200
AMREX_ATTRIBUTE_FLATTEN_FOR void LoopOnCpu(Dim3 lo, Dim3 hi, F const &f) noexcept
Definition: AMReX_Loop.H:355
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE BoxND< dim > grow(const BoxND< dim > &b, int i) noexcept
Grow BoxND in all directions by given amount.
Definition: AMReX_Box.H:1211
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE BoxND< dim > convert(const BoxND< dim > &b, const IntVectND< dim > &typ) noexcept
Returns a BoxND with different type.
Definition: AMReX_Box.H:1435
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
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE IntVectND< dim > scale(const IntVectND< dim > &p, int s) noexcept
Returns a IntVectND obtained by multiplying each of the components of this IntVectND by s.
Definition: AMReX_IntVect.H:1006
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
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE BoxND< dim > makeSlab(BoxND< dim > const &b, int direction, int slab_index) noexcept
Definition: AMReX_Box.H:1998
AMREX_GPU_HOST_DEVICE constexpr AMREX_FORCE_INLINE T elemwiseMin(T const &a, T const &b) noexcept
Definition: AMReX_Algorithm.H:49
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > sqrt(const GpuComplex< T > &a_z) noexcept
Return the square root of a complex number.
Definition: AMReX_GpuComplex.H:373
std::array< T, N > Array
Definition: AMReX_Array.H:24
Definition: AMReX_FabArrayCommI.H:896
Definition: AMReX_Array4.H:61
Definition: AMReX_FFT_Helper.H:58
Info & setBatchMode(bool x)
Definition: AMReX_FFT_Helper.H:67
Definition: AMReX_FFT_Poisson.H:650
Orientation face
Definition: AMReX_FFT_Poisson.H:654
Boundary bc
Definition: AMReX_FFT_Poisson.H:653
Array4< T > dfab
Definition: AMReX_FFT_Poisson.H:651
Box dbox
Definition: AMReX_FFT_Poisson.H:652
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Box const & box() const noexcept
Definition: AMReX_FFT_Poisson.H:657
Definition: AMReX_FFT_Poisson.H:328
T const * m_dz
Definition: AMReX_FFT_Poisson.H:334
AMREX_GPU_DEVICE AMREX_FORCE_INLINE T operator()(int, int, int k) const
Definition: AMReX_FFT_Poisson.H:330
Definition: AMReX_FFT_Poisson.H:338
AMREX_GPU_DEVICE AMREX_FORCE_INLINE T operator()(int, int, int k) const
Definition: AMReX_FFT_Poisson.H:340
T const * m_dz
Definition: AMReX_FFT_Poisson.H:344
Definition: AMReX_Array.H:34
Definition: AMReX_MFIter.H:20
MFItInfo & DisableDeviceSync() noexcept
Definition: AMReX_MFIter.H:38