1#ifndef AMREX_MLPOISSON_H_
2#define AMREX_MLPOISSON_H_
3#include <AMReX_Config.H>
7#include <AMReX_MLPoisson_K.H>
22 using FAB =
typename MF::fab_type;
23 using RT =
typename MF::value_type;
61 [[nodiscard]]
bool isSingular (
int amrlev) const final {
return m_is_singular[amrlev]; }
63 void Fapply (
int amrlev,
int mglev, MF& out,
const MF& in)
const final;
64 void Fsmooth (
int amrlev,
int mglev, MF& sol,
const MF& rhs,
int redblack)
const final;
67 const FAB& sol,
Location loc,
int face_only=0) const final;
69 void normalize (
int amrlev,
int mglev, MF& mf) const final;
73 [[nodiscard]] MF
const*
getACoeffs (
int ,
int )
const final {
return nullptr; }
77 [[nodiscard]] std::unique_ptr<MLLinOpT<MF>>
makeNLinOp (
int grid_size)
const final;
99 define(a_geom, a_grids, a_dmap, a_info, a_factory);
102template <
typename MF>
110 define(a_geom, a_grids, a_dmap, a_overset_mask, a_info, a_factory);
113template <
typename MF>
125template <
typename MF>
138template <
typename MF>
141template <
typename MF>
149 m_is_singular.clear();
160 m_is_singular[alev] =
true;
168 auto bbox = this->
m_grids[0][0].minimalBox();
169 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
177 if (this->
m_geom[0][0].Domain().contains(bbox)) {
178 m_is_singular[0] =
true;
183template <
typename MF>
189 const Real* dxinv = this->
m_geom[amrlev][mglev].InvCellSize();
192 const RT dhy =
RT(dxinv[1]*dxinv[1]);,
193 const RT dhz =
RT(dxinv[2]*dxinv[2]););
195#if (AMREX_SPACEDIM == 3)
196 RT dh0 = this->
get_d0(dhx, dhy, dhz);
197 RT dh1 = this->
get_d1(dhx, dhy, dhz);
200#if (AMREX_SPACEDIM < 3)
201 const RT dx =
RT(this->
m_geom[amrlev][mglev].CellSize(0));
202 const RT probxlo =
RT(this->
m_geom[amrlev][mglev].ProbLo(0));
207 auto const& xma = in.const_arrays();
208 auto const& yma = out.arrays();
211 const auto& osmma = this->
m_overset_mask[amrlev][mglev]->const_arrays();
216 mlpoisson_adotx_os(
AMREX_D_DECL(i,j,k), yma[box_no], xma[box_no], osmma[box_no],
220#if (AMREX_SPACEDIM < 3)
226 mlpoisson_adotx_m(
AMREX_D_DECL(i,j,k), yma[box_no], xma[box_no],
236 mlpoisson_adotx(
AMREX_D_DECL(i,j,k), yma[box_no], xma[box_no],
248#pragma omp parallel if (Gpu::notInLaunchRegion())
252 const Box& bx = mfi.tilebox();
253 const auto& xfab = in.array(mfi);
254 const auto& yfab = out.array(mfi);
258 const auto& osm = this->
m_overset_mask[amrlev][mglev]->const_array(mfi);
262 mlpoisson_adotx_os(
AMREX_D_DECL(i,j,k), yfab, xfab, osm,
266#if (AMREX_SPACEDIM == 3)
274 TwoD::mlpoisson_adotx(i, j, yfab2d, xfab2d, dh0, dh1);
279 mlpoisson_adotx(i, j, k, yfab, xfab, dhx, dhy, dhz);
282#elif (AMREX_SPACEDIM == 2)
287 mlpoisson_adotx_m(i, j, yfab, xfab, dhx, dhy, dx, probxlo);
293 mlpoisson_adotx(i, j, yfab, xfab, dhx, dhy);
296#elif (AMREX_SPACEDIM == 1)
301 mlpoisson_adotx_m(i, yfab, xfab, dhx, dx, probxlo);
307 mlpoisson_adotx(i, yfab, xfab, dhx);
316template <
typename MF>
321#if (AMREX_SPACEDIM != 3)
326 const Real* dxinv = this->
m_geom[amrlev][mglev].InvCellSize();
328 const RT dhy =
RT(dxinv[1]*dxinv[1]);,
329 const RT dhz =
RT(dxinv[2]*dxinv[2]););
330 const RT dx =
RT(this->
m_geom[amrlev][mglev].CellSize(0));
331 const RT probxlo =
RT(this->
m_geom[amrlev][mglev].ProbLo(0));
335 auto const& ma = mf.arrays();
339 mlpoisson_normalize(i,j,k, ma[box_no],
AMREX_D_DECL(dhx,dhy,dhz), dx, probxlo);
348#pragma omp parallel if (Gpu::notInLaunchRegion())
352 const Box& bx = mfi.tilebox();
353 const auto& fab = mf.array(mfi);
355#if (AMREX_SPACEDIM == 2)
358 mlpoisson_normalize(i,j,k, fab, dhx, dhy, dx, probxlo);
363 mlpoisson_normalize(i,j,k, fab, dhx, dx, probxlo);
371template <
typename MF>
379 Ax.define(sol.boxArray(), sol.DistributionMap(), sol.nComp(), 0);
380 Fapply(amrlev, mglev, Ax, sol);
383 const auto& undrrelxr = this->
m_undrrelxr[amrlev][mglev];
384 const auto& maskvals = this->
m_maskvals [amrlev][mglev];
388 const auto& f0 = undrrelxr[oitr()]; ++oitr;
389 const auto& f1 = undrrelxr[oitr()]; ++oitr;
390#if (AMREX_SPACEDIM > 1)
391 const auto& f2 = undrrelxr[oitr()]; ++oitr;
392 const auto& f3 = undrrelxr[oitr()]; ++oitr;
393#if (AMREX_SPACEDIM > 2)
394 const auto& f4 = undrrelxr[oitr()]; ++oitr;
395 const auto& f5 = undrrelxr[oitr()]; ++oitr;
401#if (AMREX_SPACEDIM > 1)
404#if (AMREX_SPACEDIM > 2)
410 const Real* dxinv = this->
m_geom[amrlev][mglev].InvCellSize();
412 const RT dhy =
RT(dxinv[1]*dxinv[1]);,
413 const RT dhz =
RT(dxinv[2]*dxinv[2]););
415#if (AMREX_SPACEDIM == 3)
420#if (AMREX_SPACEDIM < 3)
421 const RT dx =
RT(this->
m_geom[amrlev][mglev].CellSize(0));
422 const RT probxlo =
RT(this->
m_geom[amrlev][mglev].ProbLo(0));
430 && ! this->hasHiddenDimension())
434#if (AMREX_SPACEDIM > 1)
437#if (AMREX_SPACEDIM > 2)
443 const auto& solnma = sol.arrays();
444 const auto& rhsma = rhs.const_arrays();
448 const auto& f0ma = f0.const_arrays();
449 const auto& f1ma = f1.const_arrays();
450#if (AMREX_SPACEDIM > 1)
451 const auto& f2ma = f2.const_arrays();
452 const auto& f3ma = f3.const_arrays();
453#if (AMREX_SPACEDIM > 2)
454 const auto& f4ma = f4.const_arrays();
455 const auto& f5ma = f5.const_arrays();
461 const auto& osmma = this->
m_overset_mask[amrlev][mglev]->const_arrays();
466 Box vbx(rhsma[box_no]);
467 mlpoisson_gsrb_os(i, j, k, solnma[box_no], rhsma[box_no],
469 f0ma[box_no], m0ma[box_no],
470 f1ma[box_no], m1ma[box_no],
471#
if (AMREX_SPACEDIM > 1)
472 f2ma[box_no], m2ma[box_no],
473 f3ma[box_no], m3ma[box_no],
474#
if (AMREX_SPACEDIM > 2)
475 f4ma[box_no], m4ma[box_no],
476 f5ma[box_no], m5ma[box_no],
482 const auto& axma = Ax.const_arrays();
486 Box vbx(rhsma[box_no]);
487 mlpoisson_jacobi_os(i, j, k, solnma[box_no], rhsma[box_no],
488 axma[box_no], osmma[box_no],
490 f0ma[box_no], m0ma[box_no],
491 f1ma[box_no], m1ma[box_no],
492#
if (AMREX_SPACEDIM > 1)
493 f2ma[box_no], m2ma[box_no],
494 f3ma[box_no], m3ma[box_no],
495#
if (AMREX_SPACEDIM > 2)
496 f4ma[box_no], m4ma[box_no],
497 f5ma[box_no], m5ma[box_no],
504#if (AMREX_SPACEDIM < 3)
510 Box vbx(rhsma[box_no]);
511 mlpoisson_gsrb_m(i, j, k, solnma[box_no], rhsma[box_no],
513 f0ma[box_no], m0ma[box_no],
514 f1ma[box_no], m1ma[box_no],
515#
if (AMREX_SPACEDIM > 1)
516 f2ma[box_no], m2ma[box_no],
517 f3ma[box_no], m3ma[box_no],
523 const auto& axma = Ax.const_arrays();
527 Box vbx(rhsma[box_no]);
528 mlpoisson_jacobi_m(i, j, k, solnma[box_no], rhsma[box_no],
530 f0ma[box_no], m0ma[box_no],
531 f1ma[box_no], m1ma[box_no],
532#
if (AMREX_SPACEDIM > 1)
533 f2ma[box_no], m2ma[box_no],
534 f3ma[box_no], m3ma[box_no],
546 Box vbx(rhsma[box_no]);
547 mlpoisson_gsrb(i, j, k, solnma[box_no], rhsma[box_no],
549 f0ma[box_no], m0ma[box_no],
550 f1ma[box_no], m1ma[box_no],
551#
if (AMREX_SPACEDIM > 1)
552 f2ma[box_no], m2ma[box_no],
553 f3ma[box_no], m3ma[box_no],
554#
if (AMREX_SPACEDIM > 2)
555 f4ma[box_no], m4ma[box_no],
556 f5ma[box_no], m5ma[box_no],
562 const auto& axma = Ax.const_arrays();
566 Box vbx(rhsma[box_no]);
567 mlpoisson_jacobi(i, j, k, solnma[box_no], rhsma[box_no],
569 f0ma[box_no], m0ma[box_no],
570 f1ma[box_no], m1ma[box_no],
571#
if (AMREX_SPACEDIM > 1)
572 f2ma[box_no], m2ma[box_no],
573 f3ma[box_no], m3ma[box_no],
574#
if (AMREX_SPACEDIM > 2)
575 f4ma[box_no], m4ma[box_no],
576 f5ma[box_no], m5ma[box_no],
587#pragma omp parallel if (Gpu::notInLaunchRegion())
591 const auto& m0 = mm0.
array(mfi);
592 const auto& m1 = mm1.
array(mfi);
593#if (AMREX_SPACEDIM > 1)
594 const auto& m2 = mm2.
array(mfi);
595 const auto& m3 = mm3.
array(mfi);
596#if (AMREX_SPACEDIM > 2)
597 const auto& m4 = mm4.
array(mfi);
598 const auto& m5 = mm5.
array(mfi);
602 const Box& tbx = mfi.tilebox();
603 const Box& vbx = mfi.validbox();
604 const auto& solnfab = sol.array(mfi);
605 const auto& rhsfab = rhs.array(mfi);
607 const auto& f0fab = f0.array(mfi);
608 const auto& f1fab = f1.array(mfi);
609#if (AMREX_SPACEDIM > 1)
610 const auto& f2fab = f2.array(mfi);
611 const auto& f3fab = f3.array(mfi);
612#if (AMREX_SPACEDIM > 2)
613 const auto& f4fab = f4.array(mfi);
614 const auto& f5fab = f5.array(mfi);
618#if (AMREX_SPACEDIM == 1)
621 const auto& osm = this->
m_overset_mask[amrlev][mglev]->const_array(mfi);
625 mlpoisson_gsrb_os(i, j, k, solnfab, rhsfab, osm, dhx,
631 const auto& axfab = Ax.const_array(mfi);
634 mlpoisson_jacobi_os(i, j, k, solnfab, rhsfab, axfab,
645 mlpoisson_gsrb_m(i, j, k, solnfab, rhsfab, dhx,
652 const auto& axfab = Ax.const_array(mfi);
655 mlpoisson_jacobi_m(i, j, k, solnfab, rhsfab, axfab, dhx,
665 mlpoisson_gsrb(i, j, k, solnfab, rhsfab, dhx,
671 const auto& axfab = Ax.const_array(mfi);
674 mlpoisson_jacobi(i, j, k, solnfab, rhsfab, axfab, dhx,
683#if (AMREX_SPACEDIM == 2)
686 const auto& osm = this->
m_overset_mask[amrlev][mglev]->const_array(mfi);
690 mlpoisson_gsrb_os(i, j, k, solnfab, rhsfab, osm, dhx, dhy,
698 const auto& axfab = Ax.const_array(mfi);
701 mlpoisson_jacobi_os(i, j, k, solnfab, rhsfab, axfab,
714 mlpoisson_gsrb_m(i, j, k, solnfab, rhsfab, dhx, dhy,
723 const auto& axfab = Ax.const_array(mfi);
726 mlpoisson_jacobi_m(i, j, k, solnfab, rhsfab, axfab, dhx, dhy,
738 mlpoisson_gsrb(i, j, k, solnfab, rhsfab, dhx, dhy,
746 const auto& axfab = Ax.const_array(mfi);
749 mlpoisson_jacobi(i, j, k, solnfab, rhsfab, axfab, dhx, dhy,
760#if (AMREX_SPACEDIM == 3)
763 const auto& osm = this->
m_overset_mask[amrlev][mglev]->const_array(mfi);
767 mlpoisson_gsrb_os(i, j, k, solnfab, rhsfab, osm, dhx, dhy, dhz,
777 const auto& axfab = Ax.const_array(mfi);
780 mlpoisson_jacobi_os(i, j, k, solnfab, rhsfab, axfab,
794 const auto& solnfab_2d = this->
compactify(solnfab);
795 const auto& rhsfab_2d = this->
compactify(rhsfab);
807 TwoD::mlpoisson_gsrb(i, j, k, solnfab_2d, rhsfab_2d, dh0, dh1,
815 const auto& axfab = Ax.const_array(mfi);
816 const auto& axfab_2d = this->
compactify(axfab);
819 TwoD::mlpoisson_jacobi(i, j, k, solnfab_2d, rhsfab_2d,
832 mlpoisson_gsrb(i, j, k, solnfab, rhsfab, dhx, dhy, dhz,
842 const auto& axfab = Ax.const_array(mfi);
845 mlpoisson_jacobi(i, j, k, solnfab, rhsfab, axfab,
862template <
typename MF>
866 const FAB& sol,
Location,
const int face_only)
const
872 const Real* dxinv = this->
m_geom[amrlev][mglev].InvCellSize();
875 const auto& fyarr = flux[1]->array();,
876 const auto& fzarr = flux[2]->array(););
877 const auto& solarr = sol.array();
879#if (AMREX_SPACEDIM != 3)
880 const RT dx =
RT(this->
m_geom[amrlev][mglev].CellSize(0));
881 const RT probxlo =
RT(this->
m_geom[amrlev][mglev].ProbLo(0));
884#if (AMREX_SPACEDIM == 3)
887 RT fac =
RT(dxinv[0]);
892 mlpoisson_flux_xface(tbox, fxarr, solarr, fac, blen);
895 flux[0]->template setVal<RunOn::Device>(
RT(0.0));
898 RT fac =
RT(dxinv[1]);
903 mlpoisson_flux_yface(tbox, fyarr, solarr, fac, blen);
906 flux[1]->template setVal<RunOn::Device>(
RT(0.0));
909 RT fac =
RT(dxinv[2]);
914 mlpoisson_flux_zface(tbox, fzarr, solarr, fac, blen);
917 flux[2]->template setVal<RunOn::Device>(
RT(0.0));
921 RT fac =
RT(dxinv[0]);
925 mlpoisson_flux_x(tbox, fxarr, solarr, fac);
928 flux[0]->template setVal<RunOn::Device>(
RT(0.0));
931 RT fac =
RT(dxinv[1]);
935 mlpoisson_flux_y(tbox, fyarr, solarr, fac);
938 flux[1]->template setVal<RunOn::Device>(
RT(0.0));
941 RT fac =
RT(dxinv[2]);
945 mlpoisson_flux_z(tbox, fzarr, solarr, fac);
948 flux[2]->template setVal<RunOn::Device>(
RT(0.0));
951#elif (AMREX_SPACEDIM == 2)
954 RT fac =
RT(dxinv[0]);
960 mlpoisson_flux_xface_m(tbox, fxarr, solarr, fac, blen, dx, probxlo);
965 mlpoisson_flux_xface(tbox, fxarr, solarr, fac, blen);
969 flux[0]->template setVal<RunOn::Device>(
RT(0.0));
972 RT fac =
RT(dxinv[1]);
978 mlpoisson_flux_yface_m(tbox, fyarr, solarr, fac, blen, dx, probxlo);
983 mlpoisson_flux_yface(tbox, fyarr, solarr, fac, blen);
987 flux[1]->template setVal<RunOn::Device>(
RT(0.0));
991 RT fac =
RT(dxinv[0]);
996 mlpoisson_flux_x_m(tbox, fxarr, solarr, fac, dx, probxlo);
1001 mlpoisson_flux_x(tbox, fxarr, solarr, fac);
1005 flux[0]->template setVal<RunOn::Device>(
RT(0.0));
1008 RT fac =
RT(dxinv[1]);
1013 mlpoisson_flux_y_m(tbox, fyarr, solarr, fac, dx, probxlo);
1018 mlpoisson_flux_y(tbox, fyarr, solarr, fac);
1022 flux[1]->template setVal<RunOn::Device>(
RT(0.0));
1027 RT fac =
RT(dxinv[0]);
1029 int blen = box.
length(0);
1033 mlpoisson_flux_xface_m(tbox, fxarr, solarr, fac, blen, dx, probxlo);
1038 mlpoisson_flux_xface(tbox, fxarr, solarr, fac, blen);
1042 RT fac =
RT(dxinv[0]);
1047 mlpoisson_flux_x_m(tbox, fxarr, solarr, fac, dx, probxlo);
1052 mlpoisson_flux_x(tbox, fxarr, solarr, fac);
1059template <
typename MF>
1063 bool support =
true;
1066 if (AMREX_SPACEDIM != 3) { support =
false; }
1070template <
typename MF>
1071std::unique_ptr<MLLinOpT<MF>>
1083 for (
int iproc = 0; iproc < nprocs; ++iproc) {
1084 for (
int ibox : sfc[iproc]) {
1088 dm.
define(std::move(pmap));
1094 std::unique_ptr<MLLinOpT<MF>> r{
new MLALaplacianT<MF>({geom}, {ba}, {dm}, minfo)};
1103 nop->setVerbose(this->
verbose);
1109 const Real* dx0 = this->
m_geom[0][0].CellSize();
1113 nop->setCoarseFineBCLocation(cbloc);
1116 nop->setScalars(1.0, -1.0);
1119 RT dxscale =
RT(dxinv[0]);
1120#if (AMREX_SPACEDIM >= 2)
1121 dxscale = std::max(dxscale,
RT(dxinv[1]));
1123#if (AMREX_SPACEDIM == 3)
1124 dxscale = std::max(dxscale,
RT(dxinv[2]));
1127 MF alpha(ba, dm, 1, 0);
1128 alpha.setVal(
RT(1.e30)*dxscale*dxscale);
1132 alpha.setVal(
RT(0.0), cpc, 0, 1);
1134 nop->setACoeffs(0, alpha);
1139template <
typename MF>
1143 dst.ParallelCopy(src);
1146template <
typename MF>
1157 Box const& domain0 = this->
m_geom[0][0].Domain();
1159 const RT dyi =
RT(this->
m_geom[0][0].InvCellSize(1));,
1160 const RT dzi =
RT(this->
m_geom[0][0].InvCellSize(2));)
1165 for (
MFIter mfi(phi); mfi.isValid(); ++mfi)
1167 Box const& vbx = mfi.validbox();
1170 if (vbx[face] == domain0[face]) {
1172 auto const& p = phi.const_array(mfi);
1173 auto const& gp = dpdn[dir]->array(mfi);
1177 RT fac = dxi * (face.
isLow() ?
RT(-1.0) :
RT(1.));
1180 gp(i,j,k) = fac * (p(i,j,k) - p(i-1,j,k));
1183#if (AMREX_SPACEDIM > 1)
1184 else if (dir == 1) {
1185 RT fac = dyi * (face.
isLow() ?
RT(-1.0) :
RT(1.));
1188 gp(i,j,k) = fac * (p(i,j,k) - p(i,j-1,k));
1191#if (AMREX_SPACEDIM > 2)
1193 RT fac = dzi * (face.
isLow() ?
RT(-1.0) :
RT(1.));
1196 gp(i,j,k) = fac * (p(i,j,k) - p(i,j,k-1));
#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_HOST_DEVICE_PARALLEL_FOR_3D(...)
Definition AMReX_GpuLaunchMacrosC.nolint.H:110
#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
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:567
Long size() const noexcept
Return the number of boxes in the BoxArray.
Definition AMReX_BoxArray.H:614
__host__ __device__ IntVectND< dim > length() const noexcept
Return the length of the BoxND.
Definition AMReX_Box.H:154
const Real * InvCellSize() const noexcept
Returns the inverse cellsize for each coordinate direction.
Definition AMReX_CoordSys.H:82
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:43
void define(const BoxArray &boxes, int nprocs=ParallelDescriptor::NProcs())
Build mapping out of BoxArray over nprocs processors. You need to call this if you built your Distrib...
Definition AMReX_DistributionMapping.cpp:345
static DistributionMapping makeSFC(const MultiFab &weight, bool sort=true)
Definition AMReX_DistributionMapping.cpp:1756
Definition AMReX_FabFactory.H:50
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:74
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:85
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:169
Definition AMReX_MLALaplacian.H:14
Definition AMReX_MLCellABecLap.H:14
Vector< Vector< std::unique_ptr< iMultiFab > > > m_overset_mask
Definition AMReX_MLCellABecLap.H:86
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={})
Definition AMReX_MLCellABecLap.H:95
void prepareForSolve() override
Definition AMReX_MLCellABecLap.H:250
BoxArray makeNGrids(int grid_size) const
Definition AMReX_MLCellLinOp.H:930
Vector< Vector< BndryRegisterT< MF > > > m_undrrelxr
Definition AMReX_MLCellLinOp.H:219
bool m_has_metric_term
Definition AMReX_MLCellLinOp.H:164
bool m_use_gauss_seidel
Definition AMReX_MLCellLinOp.H:228
Vector< Vector< Array< MultiMask, 2 *3 > > > m_maskvals
Definition AMReX_MLCellLinOp.H:222
T get_d0(T const &dx, T const &dy, T const &) const noexcept
Definition AMReX_MLLinOp.H:735
bool doAgglomeration() const noexcept
Definition AMReX_MLLinOp.H:690
Vector< Array< BCType, 3 > > m_hibc
Definition AMReX_MLLinOp.H:580
Vector< Vector< BoxArray > > m_grids
Definition AMReX_MLLinOp.H:616
Vector< Vector< DistributionMapping > > m_dmap
Definition AMReX_MLLinOp.H:617
int verbose
Definition AMReX_MLLinOp.H:594
IntVect m_coarse_data_crse_ratio
Definition AMReX_MLLinOp.H:645
bool needsCoarseDataForBC() const noexcept
Needs coarse data for bc?
Definition AMReX_MLLinOp.H:181
bool hasHiddenDimension() const noexcept
Definition AMReX_MLLinOp.H:716
int hiddenDirection() const noexcept
Definition AMReX_MLLinOp.H:717
Vector< Array< BCType, 3 > > m_lobc
Definition AMReX_MLLinOp.H:579
Vector< int > m_domain_covered
Definition AMReX_MLLinOp.H:619
const MLLinOpT< MF > * m_parent
Definition AMReX_MLLinOp.H:604
Vector< Vector< Geometry > > m_geom
first Vector is for amr level and second is mg level
Definition AMReX_MLLinOp.H:615
Box compactify(Box const &b) const noexcept
Definition AMReX_MLLinOp.H:1293
bool m_needs_coarse_data_for_bc
Definition AMReX_MLLinOp.H:643
int maxorder
Definition AMReX_MLLinOp.H:596
LPInfo info
Definition AMReX_MLLinOp.H:592
T get_d1(T const &, T const &dy, T const &dz) const noexcept
Definition AMReX_MLLinOp.H:745
LinOpBCType m_coarse_fine_bc_type
Definition AMReX_MLLinOp.H:644
int m_num_amr_levels
Definition AMReX_MLLinOp.H:600
Definition AMReX_MLPoisson.H:19
typename MF::value_type RT
Definition AMReX_MLPoisson.H:23
MLPoissonT< MF > & operator=(const MLPoissonT< MF > &)=delete
void copyNSolveSolution(MF &dst, MF const &src) const final
Definition AMReX_MLPoisson.H:1141
void get_dpdn_on_domain_faces(Array< MF *, 3 > const &dpdn, MF const &phi)
Compute dphi/dn on domain faces after the solver has converged.
Definition AMReX_MLPoisson.H:1148
bool isBottomSingular() const final
Is the bottom of MG singular?
Definition AMReX_MLPoisson.H:62
void prepareForSolve() final
Definition AMReX_MLPoisson.H:143
void Fapply(int amrlev, int mglev, MF &out, const MF &in) const final
Definition AMReX_MLPoisson.H:185
void normalize(int amrlev, int mglev, MF &mf) const final
Divide mf by the diagonal component of the operator. Used by bicgstab.
Definition AMReX_MLPoisson.H:318
typename MF::fab_type FAB
Definition AMReX_MLPoisson.H:22
Array< MF const *, 3 > getBCoeffs(int, int) const final
Definition AMReX_MLPoisson.H:74
bool isSingular(int amrlev) const final
Is it singular on given AMR level?
Definition AMReX_MLPoisson.H:61
MLPoissonT(const MLPoissonT< MF > &)=delete
bool supportNSolve() const final
Definition AMReX_MLPoisson.H:1061
MLPoissonT(MLPoissonT< MF > &&)=delete
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={})
Definition AMReX_MLPoisson.H:115
RT getAScalar() const final
Definition AMReX_MLPoisson.H:71
RT getBScalar() const final
Definition AMReX_MLPoisson.H:72
MF const * getACoeffs(int, int) const final
Definition AMReX_MLPoisson.H:73
void FFlux(int amrlev, const MFIter &mfi, const Array< FAB *, 3 > &flux, const FAB &sol, Location loc, int face_only=0) const final
Definition AMReX_MLPoisson.H:864
typename MLLinOpT< MF >::Location Location
Definition AMReX_MLPoisson.H:26
void Fsmooth(int amrlev, int mglev, MF &sol, const MF &rhs, int redblack) const final
Definition AMReX_MLPoisson.H:373
std::unique_ptr< MLLinOpT< MF > > makeNLinOp(int grid_size) const final
Definition AMReX_MLPoisson.H:1072
Definition AMReX_MultiMask.H:18
MultiArray4< int const > const_arrays() const noexcept
Definition AMReX_MultiMask.H:48
Array4< int const > array(const MFIter &mfi) const noexcept
Definition AMReX_MultiMask.H:40
An Iterator over the Orientation of Faces of a Box.
Definition AMReX_Orientation.H:135
__host__ __device__ bool isValid() const noexcept
Is the iterator valid?
Definition AMReX_Orientation.H:156
Encapsulation of the Orientation of the Faces of a Box.
Definition AMReX_Orientation.H:29
__host__ __device__ bool isLow() const noexcept
Returns true if Orientation is low.
Definition AMReX_Orientation.H:89
__host__ __device__ int coordDir() const noexcept
Returns the coordinate direction.
Definition AMReX_Orientation.H:83
static const Periodicity & NonPeriodic() noexcept
Definition AMReX_Periodicity.cpp:52
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
std::array< T, N > Array
Definition AMReX_Array.H:26
int NProcs() noexcept
Definition AMReX_ParallelDescriptor.H:255
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:263
bool inLaunchRegion() noexcept
Definition AMReX_GpuControl.H:92
bool notInLaunchRegion() noexcept
Definition AMReX_GpuControl.H:93
bool inNoSyncRegion() noexcept
Definition AMReX_GpuControl.H:152
MPI_Comm CommunicatorSub() noexcept
sub-communicator for current frame
Definition AMReX_ParallelContext.H:70
MPI_Comm Communicator() noexcept
Definition AMReX_ParallelDescriptor.H:223
Definition AMReX_Amr.cpp:49
__host__ __device__ void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:138
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:193
__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:1522
__host__ __device__ BoxND< dim > bdryLo(const BoxND< dim > &b, int dir, int len=1) noexcept
Return the edge-centered BoxND (in direction dir) defining the low side of BoxND b.
Definition AMReX_Box.H:1625
__host__ __device__ Dim3 begin(BoxND< dim > const &box) noexcept
Definition AMReX_Box.H:2006
LinOpBCType
Definition AMReX_LO_BCTYPES.H:22
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:33
__host__ __device__ BoxND< dim > bdryNode(const BoxND< dim > &b, Orientation face, int len=1) noexcept
Similar to bdryLo and bdryHi except that it operates on the given face of box b.
Definition AMReX_Box.H:1672
bool TilingIfNotGPU() noexcept
Definition AMReX_MFIter.H:12
__host__ __device__ Dim3 end(BoxND< dim > const &box) noexcept
Definition AMReX_Box.H:2015
parallel copy or add
Definition AMReX_FabArrayBase.H:538
Definition AMReX_MLLinOp.H:36
bool has_metric_term
Definition AMReX_MLLinOp.H:44
Location
Definition AMReX_MLLinOp.H:90
FabArray memory allocation information.
Definition AMReX_FabArray.H:66
Definition AMReX_MFIter.H:20
MFItInfo & SetDynamic(bool f) noexcept
Definition AMReX_MFIter.H:40
MFItInfo & EnableTiling(const IntVect &ts=FabArrayBase::mfiter_tile_size) noexcept
Definition AMReX_MFIter.H:31