1#ifndef AMREX_ML_NODE_LAPLACIAN_H_
2#define AMREX_ML_NODE_LAPLACIAN_H_
3#include <AMReX_Config.H>
17#define AMREX_MLNODELAP_HAS_MKNEWU_HA 1
98 std::string
name ()
const override {
return std::string(
"MLNodeLaplacian"); }
113 if (m_normalization_threshold != t) {
114 m_normalization_threshold = t;
115 m_needs_update =
true;
160 if (m_use_harmonic_average != flag) {
161 m_use_harmonic_average = flag;
162 m_needs_update =
true;
172 if (m_use_mapped != flag) {
174 m_needs_update =
true;
188 m_needs_update =
true;
209 void reflux (
int crse_amrlev,
216 [[nodiscard]]
bool needsUpdate () const final {
return m_needs_update; }
247 amrex::Abort(
"MLNodeLaplacian::getFluxes: How did we get here?");
256 MultiFab const& rhs)
const override;
272 amrex::Abort(
"MLNodeLaplacian::compGrad: How did we get here?");
308#if defined(AMREX_USE_HYPRE) && (AMREX_SPACEDIM > 1)
309 void fillIJMatrix (
MFIter const& mfi,
314 Real* mat)
const override;
317 void fillIJMatrix_gpu (
MFIter const& mfi,
325 void fillIJMatrix_cpu (
MFIter const& mfi,
350 Real m_normalization_threshold =
Real(1.e-8);
355 bool m_integral_built =
false;
358 bool m_surface_integral_built =
false;
359 bool m_build_surface_integral =
false;
363 bool m_use_gauss_seidel =
true;
364 bool m_use_harmonic_average =
false;
365 bool m_use_mapped =
false;
366 bool m_needs_update =
true;
368 void checkPoint (std::string
const& file_name)
const final;
Array4< int const > offset
Definition AMReX_HypreMLABecLap.cpp:1129
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
Reference-counted collection of Boxes.
Definition AMReX_BoxArray.H:676
Definition AMReX_FabFactory.H:50
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:75
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
Definition AMReX_MLNodeLaplacian.H:33
void restrictInteriorNodes(int camrlev, MultiFab &crhs, MultiFab &frhs) const
Restrict interior-node RHS from fine to coarse when syncing.
Definition AMReX_MLNodeLaplacian.cpp:768
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_MLNodeLaplacian.cpp:862
void FillBoundaryCoeff(MultiFab &sigma, const Geometry &geom)
Fill ghost cells of sigma using geom for BC inference.
Definition AMReX_MLNodeLaplacian.cpp:409
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< FArrayBox > const * > &a_factory={}, Real a_const_sigma=Real(0.0))
Bind the nodal operator (no EB data).
Definition AMReX_MLNodeLaplacian.cpp:39
void setHarmonicAverage(bool flag) noexcept
Toggle harmonic averaging when coarsening sigma.
Definition AMReX_MLNodeLaplacian.H:159
void averageDownSolutionRHS(int camrlev, MultiFab &crse_sol, MultiFab &crse_rhs, const MultiFab &fine_sol, const MultiFab &fine_rhs) final
Average solution/RHS pairs from fine AMR levels onto (camrlev).
Definition AMReX_MLNodeLaplacian.cpp:753
std::string name() const override
Definition AMReX_MLNodeLaplacian.H:98
void prepareForSolve() final
Finalize metric terms, sigma averages, and BC caches before solving.
Definition AMReX_MLNodeLaplacian.cpp:457
void fixUpResidualMask(int amrlev, iMultiFab &resmsk) final
Adjust residual masks so EB Dirichlet nodes remain constrained.
Definition AMReX_MLNodeLaplacian.cpp:435
MLNodeLaplacian(const MLNodeLaplacian &)=delete
void compSyncResidualFine(MultiFab &sync_resid, const MultiFab &phi, const MultiFab &vold, const MultiFab *rhcc)
Build fine-level sync residuals for multilevel projections.
Definition AMReX_MLNodeLaplacian_sync.cpp:413
void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const final
Apply the nodal Laplacian to in at (amrlev,mglev).
Definition AMReX_MLNodeLaplacian_misc.cpp:212
void setSigma(int amrlev, const MultiFab &a_sigma)
Provide per-level conductivity (cell-centered MultiFab). A multi-component input also triggers mapped...
Definition AMReX_MLNodeLaplacian.cpp:381
void setNormalizationThreshold(Real t) noexcept
Threshold for normalization (prevents dividing by tiny averages).
Definition AMReX_MLNodeLaplacian.H:112
void buildStencil()
Build nodal operator stencils reflecting current sigma and metrics.
Definition AMReX_MLNodeLaplacian_sten.cpp:18
void compRHS(const Vector< MultiFab * > &rhs, const Vector< MultiFab * > &vel, const Vector< const MultiFab * > &rhnd, const Vector< MultiFab * > &rhcc)
Assemble RHS including nodal/cell-centered forcing terms.
Definition AMReX_MLNodeLaplacian_misc.cpp:1063
MLNodeLaplacian()=default
Construct an empty operator; call define() before solving.
void setEBInflowVelocity(int amrlev, const MultiFab &eb_vel)
Definition AMReX_MLNodeLaplacian.cpp:1047
void buildIntegral()
Definition AMReX_MLNodeLaplacian_eb.cpp:15
void updateVelocity(const Vector< MultiFab * > &vel, const Vector< MultiFab const * > &sol) const
Update velocities using the Poisson solution (projection correction).
Definition AMReX_MLNodeLaplacian_misc.cpp:728
void update() final
Refresh sigma averages/stencils and clear the dirty flag.
Definition AMReX_MLNodeLaplacian.cpp:478
~MLNodeLaplacian() override=default
Vector< Real > getSolvabilityOffset(int amrlev, int mglev, MultiFab const &rhs) const override
Compute component-wise offsets needed for solvability enforcement.
Definition AMReX_MLNodeLaplacian.cpp:169
void getFluxes(const Vector< Array< MultiFab *, 3 > > &a_flux, const Vector< MultiFab * > &a_sol, Location a_loc) const final
This overload is unused for nodal Laplacians (only cell-centered flux extraction is supported).
Definition AMReX_MLNodeLaplacian.H:243
MLNodeLaplacian(MLNodeLaplacian &&)=delete
void setMapped(bool flag) noexcept
Enable mapped-coordinate metrics (non-orthogonal grids).
Definition AMReX_MLNodeLaplacian.H:171
void setGaussSeidel(bool flag) noexcept
Choose red-black Gauss-Seidel instead of Jacobi smoothing.
Definition AMReX_MLNodeLaplacian.H:153
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_MLNodeLaplacian.cpp:603
BottomSolver getDefaultBottomSolver() const final
Definition AMReX_MLNodeLaplacian.H:192
void restriction(int amrlev, int cmglev, MultiFab &crse, MultiFab &fine) const final
Restrict nodal data from fine grids to coarse MG level cmglev.
Definition AMReX_MLNodeLaplacian.cpp:489
void Fsmooth(int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs) const final
Execute the smoother on (amrlev,mglev).
Definition AMReX_MLNodeLaplacian_misc.cpp:360
MLNodeLaplacian & operator=(const MLNodeLaplacian &)=delete
void reflux(int crse_amrlev, MultiFab &res, const MultiFab &crse_sol, const MultiFab &crse_rhs, MultiFab &fine_res, MultiFab &fine_sol, const MultiFab &fine_rhs) const final
Flux register reflux coupling coarse/fine nodal solves (updates res using the solution and RHS arrays...
Definition AMReX_MLNodeLaplacian_sync.cpp:779
void averageDownCoeffs()
Average conductivity down across all AMR and MG levels.
Definition AMReX_MLNodeLaplacian_misc.cpp:17
void buildSurfaceIntegral()
Definition AMReX_MLNodeLaplacian_eb.cpp:84
void compGrad(int amrlev, const Array< MultiFab *, 3 > &grad, MultiFab &sol, Location loc) const final
Unsupported flux-style gradient extractor (kept for interface completeness).
Definition AMReX_MLNodeLaplacian.H:269
void setRZCorrection(bool rz) noexcept
Enable cylindrical (RZ) metric terms.
Definition AMReX_MLNodeLaplacian.H:105
void compDivergence(const Vector< MultiFab * > &rhs, const Vector< MultiFab * > &vel)
Compute rhs = div(vel) on nodal grids (used for projections).
Definition AMReX_MLNodeLaplacian_misc.cpp:1057
void fixSolvabilityByOffset(int amrlev, int mglev, MultiFab &rhs, Vector< Real > const &offset) const override
Subtract solvability offsets from rhs.
Definition AMReX_MLNodeLaplacian.cpp:284
void averageDownCoeffsToCoarseAmrLevel(int flev)
Average coefficients from fine AMR level flev to coarse AMR level flev-1.
Definition AMReX_MLNodeLaplacian_misc.cpp:86
void unimposeNeumannBC(int amrlev, MultiFab &rhs) const final
Remove Neumann contributions previously imposed on rhs.
Definition AMReX_MLNodeLaplacian.cpp:147
void resizeMultiGrid(int new_size) final
Definition AMReX_MLNodeLaplacian.cpp:123
bool needsUpdate() const final
True if sigma-derived data need to be refreshed before reuse.
Definition AMReX_MLNodeLaplacian.H:216
void setCoarseningStrategy(CoarseningStrategy cs) noexcept
Pick between sigma-weighted or RAP coarsening (ignored if sigma constant).
Definition AMReX_MLNodeLaplacian.H:183
void compSyncResidualCoarse(MultiFab &sync_resid, const MultiFab &phi, const MultiFab &vold, const MultiFab *rhcc, const BoxArray &fine_grids, const IntVect &ref_ratio)
Build coarse-level sync residuals for multilevel projections.
Definition AMReX_MLNodeLaplacian_sync.cpp:16
void averageDownCoeffsSameAmrLevel(int amrlev)
Average coefficients across MG levels within AMR level amrlev.
Definition AMReX_MLNodeLaplacian_misc.cpp:115
Definition AMReX_MLNodeLinOp.H:23
bool m_masks_built
Definition AMReX_MLNodeLinOp.H:279
CoarseningStrategy
Definition AMReX_MLNodeLinOp.H:26
Vector< MultiFab > m_precond_weight_mask
Definition AMReX_MLNodeLinOp.H:269
CoarseningStrategy m_coarsening_strategy
Definition AMReX_MLNodeLinOp.H:274
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:79
std::array< T, N > Array
Definition AMReX_Array.H:31
Definition AMReX_Amr.cpp:50
__host__ __device__ void ignore_unused(const Ts &...)
No-op helper that marks variables as intentionally unused.
Definition AMReX.H:259
BottomSolver
Definition AMReX_MLLinOp.H:40
void Abort(const std::string &msg)
Print a fatal-error message to stderr and abort execution.
Definition AMReX.cpp:241
A multidimensional array accessor.
Definition AMReX_Array4.H:288
Configuration knobs for multilevel linear operators (grid agglomeration, metrics, etc....
Definition AMReX_MLLinOp.H:51
Location
Definition AMReX_MLLinOp.H:119