1#ifndef AMREX_MLEBNODEFDLAPLACIAN_H_
2#define AMREX_MLEBNODEFDLAPLACIAN_H_
3#include <AMReX_Config.H>
91 void setRZ (
bool flag);
106 template <
typename F>
142 [[nodiscard]] std::string
name ()
const override {
return std::string(
"MLEBNodeFDLaplacian"); }
188 [[nodiscard]]
bool isSingular (
int) const final {
return false; }
204#if (AMREX_SPACEDIM > 1)
205#if defined(AMREX_USE_HYPRE)
206 void fillIJMatrix (
MFIter const& mfi,
211 Real* mat)
const override;
232 template <
typename AlgInt,
typename AlgG
id>
236 AlgInt* ncols, AlgInt* cols,
Real* mat)
const;
249 Real eps_rel,
Real eps_abs,
int maxiter)
override;
257 Vector<std::unique_ptr<MultiFab>> m_sigma_mf;
259 Vector<Vector<Array<MultiFab,AMREX_SPACEDIM>>> m_sigma_edge;
260 bool m_has_sigma_mf =
false;
261 bool m_needs_update =
true;
262 Real m_s_phi_eb = std::numeric_limits<Real>::lowest();
263 Vector<MultiFab> m_phi_eb;
265 Real m_rz_alpha = 0._rt;
269 Vector<Vector<MultiFab>> m_levset;
272 Vector<Vector<Array<MultiFab,AMREX_SPACEDIM>>> m_eb_pos;
275 Vector<Vector<LayoutData<int>>> m_has_eb;
278 Vector<Vector<Gpu::DeviceVector<int>>> m_has_eb_d;
282 Vector<Vector<int>> m_eb_lost;
284 Vector<Vector<MultiFab>> m_row_scale;
286 Vector<Vector<MultiFab>> m_row_scale_crse;
307 m_s_phi_eb = std::numeric_limits<Real>::lowest();
308 m_phi_eb.resize(m_num_amr_levels);
309 for (
int amrlev = 0; amrlev < m_num_amr_levels; ++amrlev) {
310 auto const* factory =
dynamic_cast<EBFArrayBoxFactory const*
>(m_factory[amrlev][0].get());
312 Geometry const& geom = m_geom[amrlev][0];
315 if (m_phi_eb[amrlev].empty()) {
317 m_dmap[amrlev][0], 1, 1);
318 m_phi_eb[amrlev].setVal(0.0);
320 auto const& flags = factory->getMultiEBCellFlagFab();
321 auto const&
levset = factory->getLevelSet();
323#pragma omp parallel if (Gpu::notInLaunchRegion())
327 const Box& ndbx = mfi.growntilebox();
328 const auto& flag = flags[mfi];
334 if (lstarr(i,j,k) >=
Real(0.0)) {
336 problo[1]+
Real(j)*cellsize[1],
337 problo[2]+
Real(k)*cellsize[2]));
Fixed-size array types for use on GPU and CPU.
#define AMREX_HOST_DEVICE_FOR_3D(...)
Definition AMReX_GpuLaunchMacrosC.nolint.H:106
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
Array4< Real const > levset
Definition AMReX_MLEBNodeFDLaplacian.cpp:2089
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
GpuArray< Real, 3 > CellSizeArray() const noexcept
Returns the cell sizes as a GpuArray for use on host or device.
Definition AMReX_CoordSys.H:85
Definition AMReX_EBFabFactory.H:32
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:85
GpuArray< Real, 3 > ProbLoArray() const noexcept
Return the lo end of the problem domain in a GpuArray for device code.
Definition AMReX_Geometry.H:217
HYPRE_Int Int
Definition AMReX_HypreNodeLap.H:59
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:88
bool isValid() const noexcept
Is the iterator valid i.e. is it associated with a FAB?
Definition AMReX_MFIter.H:176
Nodal finite-difference Laplacian with optional embedded boundaries.
Definition AMReX_MLEBNodeFDLaplacian.H:50
void restriction(int amrlev, int cmglev, MultiFab &crse, MultiFab &fine) const final
Restrict nodal data from fine to coarse MG levels.
Definition AMReX_MLEBNodeFDLaplacian.cpp:802
std::string name() const override
Definition AMReX_MLEBNodeFDLaplacian.H:142
bool isBottomSingular() const final
Is the bottom of the multigrid hierarchy singular?
Definition AMReX_MLEBNodeFDLaplacian.H:189
void fillRHS(int mglev, MFIter const &mfi, Array4< int const > const &lid, Real *rhs, Array4< Real const > const &bfab) const override
Fill the right-hand side of the rows of one box on MG level mglev.
Definition AMReX_MLEBNodeFDLaplacian.cpp:1614
void buildMGHierarchy() override
Build the MG levels of AMR level 0 below the finest one.
Definition AMReX_MLEBNodeFDLaplacian.cpp:789
MLEBNodeFDLaplacian & operator=(const MLEBNodeFDLaplacian &)=delete
bool needsUpdate() const override
Does it need update if it's reused?
Definition AMReX_MLEBNodeFDLaplacian.H:164
void compGrad(int amrlev, const Array< MultiFab *, 3 > &grad, MultiFab &sol, Location) const override
Compute gradients of sol into grad.
Definition AMReX_MLEBNodeFDLaplacian.cpp:1342
void Fsmooth(int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs) const final
Perform the nodal smoother on (amrlev,mglev).
Definition AMReX_MLEBNodeFDLaplacian.cpp:1210
void interpolation(int amrlev, int fmglev, MultiFab &fine, const MultiFab &crse) const final
Add the prolongation of coarse data onto the fine grid (fine += prolong(crse)).
Definition AMReX_MLEBNodeFDLaplacian.cpp:897
void setAlpha(Real a_alpha)
Set the radial alpha/r^2 term used when RZ is enabled.
Definition AMReX_MLEBNodeFDLaplacian.cpp:362
void setEBDirichlet(Real a_phi_eb)
Override phi on embedded boundaries (constant value).
Definition AMReX_MLEBNodeFDLaplacian.cpp:374
MLEBNodeFDLaplacian(const MLEBNodeFDLaplacian &)=delete
bool supportCustomBottomSolver() const override
Does this operator provide its own bottom solver (BottomSolver::custom)?
Definition AMReX_MLEBNodeFDLaplacian.H:246
bool scaleRHS(int amrlev, MultiFab *rhs) const final
Optionally scale the RHS to fix solvability.
Definition AMReX_MLEBNodeFDLaplacian.cpp:1085
MLEBNodeFDLaplacian()=default
BottomSolver getDefaultBottomSolver() const override
Definition AMReX_MLEBNodeFDLaplacian.H:242
void setRZ(bool flag)
Definition AMReX_MLEBNodeFDLaplacian.cpp:352
bool supportsAlgMG() const override
True if makeAlgMG is implemented for this operator.
Definition AMReX_MLEBNodeFDLaplacian.H:219
bool supportsAnisotropicCoarsening() const override
True if the operator supports MG levels coarsened in any subset of directions. Then MLMG coarsens str...
Definition AMReX_MLEBNodeFDLaplacian.H:214
GpuArray< Real, 3 > anisotropicCoarseningCellSize(Geometry const &geom) const override
Cell size used to pick the directions to coarsen when supportsAnisotropicCoarsening() is true....
Definition AMReX_MLEBNodeFDLaplacian.cpp:323
void customBottomSolve(MLMGT< MultiFab > *mlmg, MultiFab &x, const MultiFab &b, Real eps_rel, Real eps_abs, int maxiter) override
Definition AMReX_MLEBNodeFDLaplacian.cpp:2097
void define(const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info, const Vector< EBFArrayBoxFactory const * > &a_factory)
Define the hierarchy using EB factories (captures cut-cell layout).
Definition AMReX_MLEBNodeFDLaplacian.cpp:380
void build_eb_data()
Definition AMReX_MLEBNodeFDLaplacian.cpp:435
void limit_coarsening()
Drop coarse MG levels with too few unknowns, no EB, or a hidden EB feature.
Definition AMReX_MLEBNodeFDLaplacian.cpp:648
void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const final
Apply the nodal operator to in and write to out.
Definition AMReX_MLEBNodeFDLaplacian.cpp:1120
void fillMatrix_doit(int mglev, MFIter const &mfi, Array4< AlgGid const > const &gid, Array4< int const > const &lid, AlgInt *ncols, AlgInt *cols, Real *mat) const
Definition AMReX_MLEBNodeFDLaplacian.cpp:1477
void update_sigma()
Definition AMReX_MLEBNodeFDLaplacian.cpp:1691
void normalize(int amrlev, int mglev, MultiFab &mf) const final
Divide mf by the diagonal of the operator (used by CG-family bottom solvers).
Definition AMReX_MLEBNodeFDLaplacian.cpp:1330
void setSigma(Array< Real, 3 > const &a_sigma) noexcept
Assign constant diagonal conductivity tensor sigma.
Definition AMReX_MLEBNodeFDLaplacian.cpp:313
void update() override
Update for reuse.
Definition AMReX_MLEBNodeFDLaplacian.cpp:1678
MLEBNodeFDLaplacian(MLEBNodeFDLaplacian &&)=delete
void prepareForSolve() final
Finalize sigma/alpha/EB data prior to invoking MLMG.
Definition AMReX_MLEBNodeFDLaplacian.cpp:962
~MLEBNodeFDLaplacian() override=default
void fillAlgMatrix(int mglev, MFIter const &mfi, Array4< Long const > const &gid, Array4< int const > const &lid, Long *ncols, Long *cols, Real *mat) const override
Fill the matrix rows of one box for the algebraic solver.
Definition AMReX_MLEBNodeFDLaplacian.cpp:1467
void compGrad_doit(int amrlev, const Array< MultiFab *, 3 > &grad, MultiFab &sol) const
Definition AMReX_MLEBNodeFDLaplacian.cpp:1363
void fixUpResidualMask(int amrlev, iMultiFab &resmsk) final
Adjust the residual mask resmsk to honor EB Dirichlet nodes (not yet implemented).
Definition AMReX_MLEBNodeFDLaplacian.cpp:1336
void postSolve(Vector< MultiFab * > const &sol) const override
Post-process the solution hierarchy.
Definition AMReX_MLEBNodeFDLaplacian.cpp:1641
bool isSingular(int) const final
Is it singular on AMR level amrlev?
Definition AMReX_MLEBNodeFDLaplacian.H:188
virtual bool needsUpdate() const
Does it need update if it's reused?
Definition AMReX_MLLinOp.H:362
LinOpEnumType::Location Location
Definition AMReX_MLLinOp.H:155
Definition AMReX_MLMG.H:39
Definition AMReX_MLNodeLinOp.H:23
A collection (stored as an array) of FArrayBox objects.
Definition AMReX_MultiFab.H:40
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:29
A Collection of IArrayBoxes.
Definition AMReX_iMultiFab.H:34
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:80
amrex_long Long
Definition AMReX_INT.H:30
@ regular
Every cell in the region is regular.
__host__ __device__ BoxND< dim > convert(const BoxND< dim > &b, const IntVectND< dim > &typ) noexcept
Return a copy of b converted to the nodal flags typ.
Definition AMReX_Box.H:1630
std::array< T, N > Array
Definition AMReX_Array.H:31
Definition AMReX_Amr.cpp:50
BottomSolver
Definition AMReX_MLLinOp.H:42
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:38
bool TilingIfNotGPU() noexcept
Definition AMReX_MFIter.H:12
A multidimensional array accessor.
Definition AMReX_Array4.H:289
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:52
Test if a given type T is callable with arguments of type Args...
Definition AMReX_TypeTraits.H:214
Configuration knobs for multilevel linear operators (grid agglomeration, metrics, etc....
Definition AMReX_MLLinOp.H:53