1#ifndef AMREX_MLALAPLACIAN_H_
2#define AMREX_MLALAPLACIAN_H_
3#include <AMReX_Config.H>
6#include <AMReX_MLALap_K.H>
25 using FAB =
typename MF::fab_type;
26 using RT =
typename MF::value_type;
81 [[nodiscard]]
int getNComp ()
const override {
return m_ncomp; }
91 [[nodiscard]]
bool isSingular (
int amrlev) const final {
return m_is_singular[amrlev]; }
95 void Fapply (
int amrlev,
int mglev, MF& out,
const MF& in)
const final;
97 void Fsmooth (
int amrlev,
int mglev, MF& sol,
const MF& rhs,
int redblack)
const final;
106 int face_only=0) const final;
109 void normalize (
int amrlev,
int mglev, MF& mf) const final;
116 [[nodiscard]] MF
const*
getACoeffs (
int amrlev,
int mglev)
const final
117 {
return &(m_a_coeffs[amrlev][mglev]); }
122 [[nodiscard]] std::unique_ptr<MLLinOpT<MF>>
makeNLinOp (
int )
const final {
123 amrex::Abort(
"MLALaplacian::makeNLinOp: Not implemented");
124 return std::unique_ptr<MLLinOpT<MF>>{};
145 bool m_needs_update =
true;
147 RT m_a_scalar = std::numeric_limits<RT>::quiet_NaN();
148 RT m_b_scalar = std::numeric_limits<RT>::quiet_NaN();
155 void updateSingularFlag ();
158template <
typename MF>
167 define(a_geom, a_grids, a_dmap, a_info, a_factory);
170template <
typename MF>
190 m_a_coeffs[amrlev][mglev].define(this->
m_grids[amrlev][mglev],
191 this->
m_dmap[amrlev][mglev], ncomp, 0);
196template <
typename MF>
199template <
typename MF>
209 m_a_coeffs[amrlev][0].setVal(
RT(0.0));
212 m_needs_update =
true;
215template <
typename MF>
220 m_a_coeffs[amrlev][0].LocalCopy(alpha, 0, 0, ncomp,
IntVect(0));
221 m_needs_update =
true;
224template <
typename MF>
228 BL_PROFILE(
"MLALaplacian::averageDownCoeffs()");
232 auto& fine_a_coeffs = m_a_coeffs[amrlev];
241template <
typename MF>
246 const int nmglevs = a.
size();
247 for (
int mglev = 1; mglev < nmglevs; ++mglev)
249 if (m_a_scalar ==
RT(0.0))
251 a[mglev].setVal(
RT(0.0));
262template <
typename MF>
267 auto& fine_a_coeffs = m_a_coeffs[flev ].back();
268 auto& crse_a_coeffs = m_a_coeffs[flev-1].front();
270 if (m_a_scalar !=
RT(0.0)) {
277template <
typename MF>
279MLALaplacianT<MF>::updateSingularFlag ()
281 m_is_singular.clear();
282 m_is_singular.resize(this->m_num_amr_levels,
false);
283 auto itlo = std::ranges::find(this->m_lobc[0], BCType::Dirichlet);
284 auto ithi = std::ranges::find(this->m_hibc[0], BCType::Dirichlet);
285 if (itlo == this->m_lobc[0].
end() && ithi == this->m_hibc[0].
end())
287 for (
int alev = 0; alev < this->m_num_amr_levels; ++alev)
289 if (this->m_domain_covered[alev])
291 if (m_a_scalar == RT(0.0))
293 m_is_singular[alev] =
true;
299 RT asum = m_a_coeffs[alev].back().sum(0,
IntVect(0));
300 RT amax = m_a_coeffs[alev].back().norminf(0,1,
IntVect(0));
301 m_is_singular[alev] = (std::abs(asum) <= amax * RT(1.e-12));
307 if (!m_is_singular[0] && this->m_needs_coarse_data_for_bc &&
308 this->m_coarse_fine_bc_type == BCType::Neumann)
310 bool lev0_a_is_zero =
false;
311 if (m_a_scalar == RT(0.0)) {
312 lev0_a_is_zero =
true;
314 RT asum = m_a_coeffs[0].back().sum(0,
IntVect(0));
315 RT amax = m_a_coeffs[0].back().norminf(0,1,
IntVect(0));
316 lev0_a_is_zero = std::abs(asum) <= amax * RT(1.e-12);
319 if (lev0_a_is_zero) {
320 auto bbox = this->m_grids[0][0].minimalBox();
321 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
322 if (this->m_lobc[0][idim] == BCType::Dirichlet) {
325 if (this->m_hibc[0][idim] == BCType::Dirichlet) {
329 if (this->m_geom[0][0].Domain().contains(bbox)) {
330 m_is_singular[0] =
true;
336template <
typename MF>
340 BL_PROFILE(
"MLALaplacian::prepareForSolve()");
343 updateSingularFlag();
344 m_needs_update =
false;
347template <
typename MF>
353 updateSingularFlag();
354 m_needs_update =
false;
357template <
typename MF>
365 const MF& acoef = m_a_coeffs[amrlev][mglev];
369 RT(this->
m_geom[amrlev][mglev].InvCellSize(1)),
370 RT(this->
m_geom[amrlev][mglev].InvCellSize(2)))};
371#if (AMREX_SPACEDIM < 3)
372 const RT dx =
RT(this->
m_geom[amrlev][mglev].CellSize(0));
373 const RT probxlo =
RT(this->
m_geom[amrlev][mglev].ProbLo(0));
376#if (AMREX_SPACEDIM == 3)
378 this->
get_d1(dxinv[0], dxinv[1], dxinv[2])};
381 const RT ascalar = m_a_scalar;
382 const RT bscalar = m_b_scalar;
385#pragma omp parallel if (Gpu::notInLaunchRegion())
389 const Box& bx = mfi.tilebox();
390 const auto& xfab = in.array(mfi);
391 const auto& yfab = out.array(mfi);
392 const auto& afab = acoef.array(mfi);
394#if (AMREX_SPACEDIM != 3)
398 mlalap_adotx_m(tbx, yfab, xfab, afab, dxinv, ascalar, bscalar, dx, probxlo, ncomp);
403 mlalap_adotx(tbx, yfab, xfab, afab, dxinv, ascalar, bscalar, ncomp);
414 TwoD::mlalap_adotx(tbx2d, yfab2d, xfab2d, afab2d, dhinv, ascalar, bscalar, ncomp);
419 mlalap_adotx(tbx, yfab, xfab, afab, dxinv, ascalar, bscalar, ncomp);
426template <
typename MF>
434 const MF& acoef = m_a_coeffs[amrlev][mglev];
438 RT(this->
m_geom[amrlev][mglev].InvCellSize(1)),
439 RT(this->
m_geom[amrlev][mglev].InvCellSize(2)))};
440#if (AMREX_SPACEDIM < 3)
441 const RT dx =
RT(this->
m_geom[amrlev][mglev].CellSize(0));
442 const RT probxlo =
RT(this->
m_geom[amrlev][mglev].ProbLo(0));
445#if (AMREX_SPACEDIM == 3)
447 this->
get_d1(dxinv[0], dxinv[1], dxinv[2])};
450 const RT ascalar = m_a_scalar;
451 const RT bscalar = m_b_scalar;
454#pragma omp parallel if (Gpu::notInLaunchRegion())
458 const Box& bx = mfi.tilebox();
459 const auto& fab = mf.array(mfi);
460 const auto& afab = acoef.array(mfi);
462#if (AMREX_SPACEDIM != 3)
466 mlalap_normalize_m(tbx, fab, afab, dxinv, ascalar, bscalar, dx, probxlo, ncomp);
471 mlalap_normalize(tbx, fab, afab, dxinv, ascalar, bscalar, ncomp);
481 TwoD::mlalap_normalize(tbx2d, fab2d, afab2d, dhinv, ascalar, bscalar, ncomp);
486 mlalap_normalize(tbx, fab, afab, dxinv, ascalar, bscalar, ncomp);
493template <
typename MF>
501 const MF& acoef = m_a_coeffs[amrlev][mglev];
502 const auto& undrrelxr = this->
m_undrrelxr[amrlev][mglev];
503 const auto& maskvals = this->
m_maskvals [amrlev][mglev];
507 const auto& f0 = undrrelxr[oitr()]; ++oitr;
508 const auto& f1 = undrrelxr[oitr()]; ++oitr;
509#if (AMREX_SPACEDIM > 1)
510 const auto& f2 = undrrelxr[oitr()]; ++oitr;
511 const auto& f3 = undrrelxr[oitr()]; ++oitr;
512#if (AMREX_SPACEDIM > 2)
513 const auto& f4 = undrrelxr[oitr()]; ++oitr;
514 const auto& f5 = undrrelxr[oitr()]; ++oitr;
520#if (AMREX_SPACEDIM > 1)
523#if (AMREX_SPACEDIM > 2)
529 const Real* dxinv = this->
m_geom[amrlev][mglev].InvCellSize();
531 const RT dhy = m_b_scalar*
RT(dxinv[1]*dxinv[1]);,
532 const RT dhz = m_b_scalar*
RT(dxinv[2]*dxinv[2]););
534#if (AMREX_SPACEDIM == 3)
535 RT dh0 = this->
get_d0(dhx, dhy, dhz);
536 RT dh1 = this->
get_d1(dhx, dhy, dhz);
539#if (AMREX_SPACEDIM < 3)
540 const RT dx =
RT(this->
m_geom[amrlev][mglev].CellSize(0));
541 const RT probxlo =
RT(this->
m_geom[amrlev][mglev].ProbLo(0));
544 const RT alpha = m_a_scalar;
551 const auto& f0ma = f0.const_arrays();
552 const auto& f1ma = f1.const_arrays();
553#if (AMREX_SPACEDIM > 1)
556 const auto& f2ma = f2.const_arrays();
557 const auto& f3ma = f3.const_arrays();
558#if (AMREX_SPACEDIM > 2)
561 const auto& f4ma = f4.const_arrays();
562 const auto& f5ma = f5.const_arrays();
565 const auto& solnma = sol.arrays();
566 const auto& rhsma = rhs.const_arrays();
567 const auto& ama = acoef.const_arrays();
569#if (AMREX_SPACEDIM < 3)
574 Box vbx(ama[box_no]);
575 mlalap_gsrb_m(i,j,k,n, solnma[box_no], rhsma[box_no], alpha,
577 f0ma[box_no], m0ma[box_no],
578 f1ma[box_no], m1ma[box_no],
579#
if (AMREX_SPACEDIM > 1)
580 f2ma[box_no], m2ma[box_no],
581 f3ma[box_no], m3ma[box_no],
583 vbx, redblack, dx, probxlo);
591 Box vbx(ama[box_no]);
592 mlalap_gsrb(i,j,k,n, solnma[box_no], rhsma[box_no], alpha,
594 f0ma[box_no], m0ma[box_no],
595 f1ma[box_no], m1ma[box_no],
596#
if (AMREX_SPACEDIM > 1)
597 f2ma[box_no], m2ma[box_no],
598 f3ma[box_no], m3ma[box_no],
599#
if (AMREX_SPACEDIM > 2)
600 f4ma[box_no], m4ma[box_no],
601 f5ma[box_no], m5ma[box_no],
618#pragma omp parallel if (Gpu::notInLaunchRegion())
622 const auto& m0 = mm0.
array(mfi);
623 const auto& m1 = mm1.
array(mfi);
624#if (AMREX_SPACEDIM > 1)
625 const auto& m2 = mm2.
array(mfi);
626 const auto& m3 = mm3.
array(mfi);
627#if (AMREX_SPACEDIM > 2)
628 const auto& m4 = mm4.
array(mfi);
629 const auto& m5 = mm5.
array(mfi);
633 const Box& tbx = mfi.tilebox();
634 const Box& vbx = mfi.validbox();
635 const auto& solnfab = sol.array(mfi);
636 const auto& rhsfab = rhs.array(mfi);
637 const auto& afab = acoef.array(mfi);
639 const auto& f0fab = f0.array(mfi);
640 const auto& f1fab = f1.array(mfi);
641#if (AMREX_SPACEDIM > 1)
642 const auto& f2fab = f2.array(mfi);
643 const auto& f3fab = f3.array(mfi);
644#if (AMREX_SPACEDIM > 2)
645 const auto& f4fab = f4.array(mfi);
646 const auto& f5fab = f5.array(mfi);
650#if (AMREX_SPACEDIM == 1)
654 mlalap_gsrb_m(thread_box, solnfab, rhsfab, alpha, dhx,
664 mlalap_gsrb(thread_box, solnfab, rhsfab, alpha, dhx,
668 vbx, redblack, ncomp);
674#if (AMREX_SPACEDIM == 2)
678 mlalap_gsrb_m(thread_box, solnfab, rhsfab, alpha, dhx, dhy,
690 mlalap_gsrb(thread_box, solnfab, rhsfab, alpha, dhx, dhy,
696 vbx, redblack, ncomp);
701#if (AMREX_SPACEDIM == 3)
705 const auto& solnfab_2d = this->
compactify(solnfab);
706 const auto& rhsfab_2d = this->
compactify(rhsfab);
718 TwoD::mlalap_gsrb(thread_box, solnfab_2d, rhsfab_2d, alpha, dh0, dh1,
724 vbx_2d, redblack, ncomp);
729 mlalap_gsrb(thread_box, solnfab, rhsfab, alpha, dhx, dhy, dhz,
737 vbx, redblack, ncomp);
744template <
typename MF>
755 const Real* dxinv = this->
m_geom[amrlev][mglev].InvCellSize();
758 const auto& fyarr = flux[1]->array();,
759 const auto& fzarr = flux[2]->array(););
760 const auto& solarr = sol.array();
762#if (AMREX_SPACEDIM != 3)
763 const RT dx =
RT(this->
m_geom[amrlev][mglev].CellSize(0));
764 const RT probxlo =
RT(this->
m_geom[amrlev][mglev].ProbLo(0));
767#if (AMREX_SPACEDIM == 3)
770 RT fac = m_b_scalar *
RT(dxinv[0]);
775 mlalap_flux_xface(tbox, fxarr, solarr, fac, blen, ncomp);
781 RT fac = m_b_scalar *
RT(dxinv[1]);
786 mlalap_flux_yface(tbox, fyarr, solarr, fac, blen, ncomp);
792 RT fac = m_b_scalar *
RT(dxinv[2]);
797 mlalap_flux_zface(tbox, fzarr, solarr, fac, blen, ncomp);
804 RT fac = m_b_scalar *
RT(dxinv[0]);
808 mlalap_flux_x(tbox, fxarr, solarr, fac, ncomp);
814 RT fac = m_b_scalar *
RT(dxinv[1]);
818 mlalap_flux_y(tbox, fyarr, solarr, fac, ncomp);
824 RT fac = m_b_scalar *
RT(dxinv[2]);
828 mlalap_flux_z(tbox, fzarr, solarr, fac, ncomp);
834#elif (AMREX_SPACEDIM == 2)
837 RT fac = m_b_scalar *
RT(dxinv[0]);
843 mlalap_flux_xface_m(tbox, fxarr, solarr, fac, blen, dx, probxlo, ncomp);
848 mlalap_flux_xface(tbox, fxarr, solarr, fac, blen, ncomp);
855 RT fac = m_b_scalar *
RT(dxinv[1]);
861 mlalap_flux_yface_m(tbox, fyarr, solarr, fac, blen, dx, probxlo, ncomp);
866 mlalap_flux_yface(tbox, fyarr, solarr, fac, blen, ncomp);
874 RT fac = m_b_scalar *
RT(dxinv[0]);
879 mlalap_flux_x_m(tbox, fxarr, solarr, fac, dx, probxlo, ncomp);
884 mlalap_flux_x(tbox, fxarr, solarr, fac, ncomp);
891 RT fac = m_b_scalar *
RT(dxinv[1]);
896 mlalap_flux_y_m(tbox, fyarr, solarr, fac, dx, probxlo, ncomp);
901 mlalap_flux_y(tbox, fyarr, solarr, fac, ncomp);
910 RT fac = m_b_scalar *
RT(dxinv[0]);
916 mlalap_flux_xface_m(tbox, fxarr, solarr, fac, blen, dx, probxlo, ncomp);
921 mlalap_flux_xface(tbox, fxarr, solarr, fac, blen, ncomp);
925 RT fac = m_b_scalar *
RT(dxinv[0]);
930 mlalap_flux_x_m(tbox, fxarr, solarr, fac, dx, probxlo, ncomp);
935 mlalap_flux_x(tbox, fxarr, solarr, fac, ncomp);
#define BL_PROFILE(a)
Definition AMReX_BLProfiler.H:593
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_GPU_LAUNCH_HOST_DEVICE_LAMBDA_RANGE(TN, TI, block)
Definition AMReX_GpuLaunchMacrosC.nolint.H:4
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
#define AMREX_D_TERM(a, b, c)
Definition AMReX_SPACE.H:172
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
__host__ __device__ IntVectND< dim > length() const noexcept
Return the length of the BoxND.
Definition AMReX_Box.H:167
Abstract factory interface for creating, aliasing, and destroying FAB objects.
Definition AMReX_FabFactory.H:73
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:88
Box tilebox() const noexcept
Return the tile Box at the current index.
Definition AMReX_MFIter.cpp:389
bool isValid() const noexcept
Is the iterator valid i.e. is it associated with a FAB?
Definition AMReX_MFIter.H:176
Multi-component ALaplacian (a scalar plus optional spatial a coeffs).
Definition AMReX_MLALaplacian.H:22
RT getAScalar() const final
Definition AMReX_MLALaplacian.H:112
MLALaplacianT< MF > & operator=(const MLALaplacianT< MF > &)=delete
MLALaplacianT(const MLALaplacianT< MF > &)=delete
void averageDownCoeffsToCoarseAmrLevel(int flev)
Average a coefficients from fine AMR level flev to flev-1.
Definition AMReX_MLALaplacian.H:264
~MLALaplacianT() override
typename MF::fab_type FAB
Definition AMReX_MLALaplacian.H:25
void setScalars(RT a, RT b) noexcept
Set constant scalars a and b in a \phi - b \nabla^2 \phi.
Definition AMReX_MLALaplacian.H:201
void FFlux(int amrlev, const MFIter &mfi, const Array< FAB *, 3 > &flux, const FAB &sol, Location, int face_only=0) const final
Produce face fluxes on AMR level amrlev for the tilebox described by mfi using sol,...
Definition AMReX_MLALaplacian.H:746
void update() override
Update for reuse.
Definition AMReX_MLALaplacian.H:349
bool isBottomSingular() const final
Shortcut for the coarsest level singular flag.
Definition AMReX_MLALaplacian.H:93
std::unique_ptr< MLLinOpT< MF > > makeNLinOp(int) const final
Create the NSolve counterpart of this operator with the requested grid size.
Definition AMReX_MLALaplacian.H:122
Array< MF const *, 3 > getBCoeffs(int, int) const final
ALaplacian has no b coefficients; this returns null pointers.
Definition AMReX_MLALaplacian.H:119
MF const * getACoeffs(int amrlev, int mglev) const final
Access the stored a coefficient MultiFab for (amrlev,mglev).
Definition AMReX_MLALaplacian.H:116
void prepareForSolve() final
Complete per-level setup (averaging, singularity flags) before solving.
Definition AMReX_MLALaplacian.H:338
MLALaplacianT(const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info=LPInfo(), const Vector< FabFactory< FAB > const * > &a_factory={}, int a_ncomp=1)
Convenience constructor that forwards to define().
Definition AMReX_MLALaplacian.H:159
void Fapply(int amrlev, int mglev, MF &out, const MF &in) const final
Apply the ALaplacian to in (writing out) on (amrlev,mglev).
Definition AMReX_MLALaplacian.H:359
LinOpBCType BCType
Definition AMReX_MLALaplacian.H:28
void averageDownCoeffs()
Average a coefficients down across all AMR and MG levels.
Definition AMReX_MLALaplacian.H:226
MLALaplacianT(MLALaplacianT< MF > &&)=delete
bool isSingular(int amrlev) const final
Definition AMReX_MLALaplacian.H:91
MLALaplacianT()=default
Construct an empty operator; call define() before use.
void normalize(int amrlev, int mglev, MultiFab &mf) const final
void Fsmooth(int amrlev, int mglev, MF &sol, const MF &rhs, int redblack) const final
Run a smoothing sweep on (amrlev,mglev). redblack selects the red (0) or black (1) half of the grid.
Definition AMReX_MLALaplacian.H:495
bool needsUpdate() const override
Does it need update if it's reused?
Definition AMReX_MLALaplacian.H:83
void define(const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info=LPInfo(), const Vector< FabFactory< FAB > const * > &a_factory={})
Bind the operator to an AMR hierarchy (no overset support).
Definition AMReX_MLALaplacian.H:172
RT getBScalar() const final
Scalar beta applied to the Laplacian term.
Definition AMReX_MLALaplacian.H:114
void averageDownCoeffsSameAmrLevel(int amrlev, Vector< MF > &a)
Average a coefficients down within a single AMR level (fine-to-coarse MG).
Definition AMReX_MLALaplacian.H:243
typename MF::value_type RT
Definition AMReX_MLALaplacian.H:26
int getNComp() const override
Return number of components.
Definition AMReX_MLALaplacian.H:81
void setACoeffs(int amrlev, const MF &alpha)
Provide per-cell a coefficients on AMR level amrlev (stored directly in alpha).
Definition AMReX_MLALaplacian.H:217
typename MLLinOpT< MF >::Location Location
Definition AMReX_MLALaplacian.H:29
bool needsUpdate() const override
Does it need update if it's reused?
Definition AMReX_MLCellABecLap.H:75
void define(const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info=LPInfo(), const Vector< FabFactory< FAB > const * > &a_factory={})
Describe the AMR hierarchy when overset masks are not required.
Definition AMReX_MLCellABecLap.H:160
void prepareForSolve() override
Standard hook called before MLMG iterates (fixes BC data, etc.).
Definition AMReX_MLCellABecLap.H:319
void update() override
Average coefficients/metrics when marked dirty.
Definition AMReX_MLCellABecLap.H:312
Vector< Vector< BndryRegisterT< MF > > > m_undrrelxr
Definition AMReX_MLCellLinOp.H:489
bool m_has_metric_term
Definition AMReX_MLCellLinOp.H:434
Vector< Vector< Array< MultiMask, 2 *3 > > > m_maskvals
Definition AMReX_MLCellLinOp.H:492
T get_d0(T const &dx, T const &dy, T const &) const noexcept
Definition AMReX_MLLinOp.H:1126
Vector< Vector< BoxArray > > m_grids
Definition AMReX_MLLinOp.H:977
static constexpr int mg_coarsen_ratio
Definition AMReX_MLLinOp.H:943
Vector< int > m_num_mg_levels
Definition AMReX_MLLinOp.H:964
Vector< Vector< DistributionMapping > > m_dmap
Definition AMReX_MLLinOp.H:978
bool hasHiddenDimension() const noexcept
Definition AMReX_MLLinOp.H:1107
int hiddenDirection() const noexcept
Definition AMReX_MLLinOp.H:1108
Vector< Vector< Geometry > > m_geom
first Vector is for amr level and second is mg level
Definition AMReX_MLLinOp.H:976
Box compactify(Box const &b) const noexcept
Definition AMReX_MLLinOp.H:1862
Vector< IntVect > mg_coarsen_ratio_vec
Definition AMReX_MLLinOp.H:973
LinOpEnumType::Location Location
Definition AMReX_MLLinOp.H:159
T get_d1(T const &, T const &dy, T const &dz) const noexcept
Definition AMReX_MLLinOp.H:1136
int m_num_amr_levels
Definition AMReX_MLLinOp.H:961
Definition AMReX_MultiMask.H:23
MultiArray4< int const > const_arrays() const noexcept
Return const multi-array views (alias of arrays()).
Definition AMReX_MultiMask.H:86
Array4< int const > array(const MFIter &mfi) const noexcept
Return an Array4 view (const) for iterator mfi.
Definition AMReX_MultiMask.H:69
An Iterator over the Orientation of Faces of a Box.
Definition AMReX_Orientation.H:135
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:29
Long size() const noexcept
Definition AMReX_Vector.H:54
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:80
__host__ __device__ BoxND< dim > surroundingNodes(const BoxND< dim > &b, int dir) noexcept
Return a BoxND with NODE based coordinates in direction dir that encloses BoxND b.
Definition AMReX_Box.H:1584
__host__ __device__ BoxND< dim > bdryLo(const BoxND< dim > &b, int dir, int len=1) noexcept
Return the BoxND of length len on the low boundary of b along coordinate direction dir.
Definition AMReX_Box.H:1717
std::array< T, N > Array
Definition AMReX_Array.H:31
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:329
bool inLaunchRegion() noexcept
Definition AMReX_GpuControl.H:88
bool notInLaunchRegion() noexcept
Definition AMReX_GpuControl.H:89
bool inNoSyncRegion() noexcept
Definition AMReX_GpuControl.H:148
Definition AMReX_Amr.cpp:50
void average_down(const MultiFab &S_fine, MultiFab &S_crse, const Geometry &fgeom, const Geometry &cgeom, int scomp, int ncomp, int rr)
Definition AMReX_MultiFabUtil.cpp:360
void ParallelForRedBlack(MF const &mf, int redblack, F &&f)
ParallelFor over the red or black points of the valid region of a MultiFab/FabArray.
Definition AMReX_MFParallelFor.H:529
BoxND< 3 > Box
Box is an alias for amrex::BoxND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:35
LinOpBCType
Definition AMReX_LO_BCTYPES.H:27
MLALaplacianT< MultiFab > MLALaplacian
Definition AMReX_MLALaplacian.H:944
bool TilingIfNotGPU() noexcept
Definition AMReX_MFIter.H:12
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:38
void Abort(const std::string &msg)
Print a fatal-error message to stderr and abort execution.
Definition AMReX.cpp:244
__host__ __device__ Dim3 end(BoxND< dim > const &box) noexcept
Return the iterator end coordinate of box as Dim3.
Definition AMReX_Box.H:2259
void setVal(MF &dst, typename MF::value_type val)
dst = val
Definition AMReX_FabArrayUtility.H:2166
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:52
Configuration knobs for multilevel linear operators (grid agglomeration, metrics, etc....
Definition AMReX_MLLinOp.H:53
Definition AMReX_MFIter.H:20
MFItInfo & SetDynamic(bool f) noexcept
Definition AMReX_MFIter.H:43
MFItInfo & EnableTiling(const IntVect &ts=FabArrayBase::mfiter_tile_size) noexcept
Definition AMReX_MFIter.H:31