Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_MLNodeLaplacian.H
Go to the documentation of this file.
1#ifndef AMREX_ML_NODE_LAPLACIAN_H_
2#define AMREX_ML_NODE_LAPLACIAN_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_iMultiFab.H>
6#include <AMReX_MLNodeLinOp.H>
7#include <AMReX_MultiFab.H>
8#include <AMReX_Vector.H>
9
10// Feature macro: when defined, MLNodeLaplacian::updateVelocity and
11// MLNodeLaplacian::getFluxes correctly route through the anisotropic
12// (harmonic-average) mknewu kernel when setMapped(true) was used. Prior
13// to this, both functions only used sigma component 0 (sigma_x) for all
14// velocity/flux components, producing the wrong correction for
15// non-identity mesh mappings. EB is not covered by this feature (see
16// comments in AMReX_MLNodeLaplacian_misc.cpp).
17#define AMREX_MLNODELAP_HAS_MKNEWU_HA 1
18
19namespace amrex {
20
27// del dot (sigma grad phi) = rhs
28// where phi and rhs are nodal, and sigma is cell-centered.
29
32 : public MLNodeLinOp
33{
34public :
35
37 MLNodeLaplacian () = default;
49 MLNodeLaplacian (const Vector<Geometry>& a_geom,
50 const Vector<BoxArray>& a_grids,
51 const Vector<DistributionMapping>& a_dmap,
52 const LPInfo& a_info = LPInfo(),
53 const Vector<FabFactory<FArrayBox> const*>& a_factory = {},
54 Real a_const_sigma = Real(0.0));
55#ifdef AMREX_USE_EB
57 MLNodeLaplacian (const Vector<Geometry>& a_geom,
58 const Vector<BoxArray>& a_grids,
59 const Vector<DistributionMapping>& a_dmap,
60 const LPInfo& a_info,
61 const Vector<EBFArrayBoxFactory const*>& a_factory,
62 Real a_const_sigma = Real(0.0));
63#endif
64 ~MLNodeLaplacian () override = default;
65
70
82 void define (const Vector<Geometry>& a_geom,
83 const Vector<BoxArray>& a_grids,
84 const Vector<DistributionMapping>& a_dmap,
85 const LPInfo& a_info = LPInfo(),
86 const Vector<FabFactory<FArrayBox> const*>& a_factory = {},
87 Real a_const_sigma = Real(0.0));
88
89#ifdef AMREX_USE_EB
90 void define (const Vector<Geometry>& a_geom,
91 const Vector<BoxArray>& a_grids,
92 const Vector<DistributionMapping>& a_dmap,
93 const LPInfo& a_info,
94 const Vector<EBFArrayBoxFactory const*>& a_factory,
95 Real a_const_sigma = Real(0.0));
96#endif
97
98 std::string name () const override { return std::string("MLNodeLaplacian"); }
99
105 void setRZCorrection (bool rz) noexcept { m_is_rz = rz; }
106
112 void setNormalizationThreshold (Real t) noexcept {
113 if (m_normalization_threshold != t) {
114 m_normalization_threshold = t;
115 m_needs_update = true;
116 }
117 }
118
126 void setSigma (int amrlev, const MultiFab& a_sigma);
127
129 void compDivergence (const Vector<MultiFab*>& rhs, const Vector<MultiFab*>& vel);
130
132 void compRHS (const Vector<MultiFab*>& rhs, const Vector<MultiFab*>& vel,
133 const Vector<const MultiFab*>& rhnd,
134 const Vector<MultiFab*>& rhcc);
135
137 void updateVelocity (const Vector<MultiFab*>& vel, const Vector<MultiFab const*>& sol) const;
138
140 void compSyncResidualCoarse (MultiFab& sync_resid, const MultiFab& phi,
141 const MultiFab& vold, const MultiFab* rhcc,
142 const BoxArray& fine_grids, const IntVect& ref_ratio);
143
145 void compSyncResidualFine (MultiFab& sync_resid, const MultiFab& phi, const MultiFab& vold,
146 const MultiFab* rhcc);
147
153 void setGaussSeidel (bool flag) noexcept { m_use_gauss_seidel = flag; }
159 void setHarmonicAverage (bool flag) noexcept {
160 if (m_use_harmonic_average != flag) {
161 m_use_harmonic_average = flag;
162 m_needs_update = true;
163 }
164 }
165
171 void setMapped (bool flag) noexcept {
172 if (m_use_mapped != flag) {
173 m_use_mapped = flag;
174 m_needs_update = true;
175 }
176 }
177
184 if (m_const_sigma == Real(0.0) && m_coarsening_strategy != cs) {
186 m_masks_built = false;
187 m_precond_weight_mask.clear();
188 m_needs_update = true;
189 }
190 }
191
196
198 void restriction (int amrlev, int cmglev, MultiFab& crse, MultiFab& fine) const final;
200 void interpolation (int amrlev, int fmglev, MultiFab& fine, const MultiFab& crse) const final;
202 void averageDownSolutionRHS (int camrlev, MultiFab& crse_sol, MultiFab& crse_rhs,
203 const MultiFab& fine_sol, const MultiFab& fine_rhs) final;
204
209 void reflux (int crse_amrlev,
210 MultiFab& res, const MultiFab& crse_sol, const MultiFab& crse_rhs,
211 MultiFab& fine_res, MultiFab& fine_sol, const MultiFab& fine_rhs) const final;
212
214 void prepareForSolve () final;
216 [[nodiscard]] bool needsUpdate () const final { return m_needs_update; }
218 void update () final;
220 void Fapply (int amrlev, int mglev, MultiFab& out, const MultiFab& in) const final;
229 void Fsmooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs) const final;
231 void normalize (int amrlev, int mglev, MultiFab& mf) const final;
232
234 void fixUpResidualMask (int amrlev, iMultiFab& resmsk) final;
235
243 void getFluxes (const Vector<Array<MultiFab*,AMREX_SPACEDIM> >& a_flux,
244 const Vector<MultiFab*>& a_sol,
245 Location a_loc) const final {
246 amrex::ignore_unused(a_flux, a_sol, a_loc);
247 amrex::Abort("MLNodeLaplacian::getFluxes: How did we get here?");
248 }
250 void getFluxes (const Vector<MultiFab*>& a_flux,
251 const Vector<MultiFab*>& a_sol) const final;
253 void unimposeNeumannBC (int amrlev, MultiFab& rhs) const final;
255 Vector<Real> getSolvabilityOffset (int amrlev, int mglev,
256 MultiFab const& rhs) const override;
258 void fixSolvabilityByOffset (int amrlev, int mglev, MultiFab& rhs,
259 Vector<Real> const& offset) const override;
260
269 void compGrad (int amrlev, const Array<MultiFab*,AMREX_SPACEDIM>& grad,
270 MultiFab& sol, Location loc) const final {
271 amrex::ignore_unused(amrlev, grad, sol, loc);
272 amrex::Abort("MLNodeLaplacian::compGrad: How did we get here?");
273 }
281 void compGrad (int amrlev, MultiFab& grad, MultiFab& sol) const;
282
284 void averageDownCoeffs ();
286 void averageDownCoeffsToCoarseAmrLevel (int flev);
288 void averageDownCoeffsSameAmrLevel (int amrlev);
289
291 void restrictInteriorNodes (int camrlev, MultiFab& crhs, MultiFab& frhs) const;
292
294 void FillBoundaryCoeff (MultiFab& sigma, const Geometry& geom);
295
297 void buildStencil ();
298
299#ifdef AMREX_USE_EB
300 void buildIntegral ();
301 void buildSurfaceIntegral ();
302
303 // Tells the solver that EB boundaries have inflow specified by "eb_vel"
304 void setEBInflowVelocity (int amrlev, const MultiFab& eb_vel);
305
306#endif
307
308#if defined(AMREX_USE_HYPRE) && (AMREX_SPACEDIM > 1)
309 void fillIJMatrix (MFIter const& mfi,
311 Array4<int const> const& lid,
312 HypreNodeLap::Int* ncols,
313 HypreNodeLap::Int* cols,
314 Real* mat) const override;
315
316#ifdef AMREX_USE_GPU
317 void fillIJMatrix_gpu (MFIter const& mfi,
319 Array4<int const> const& lid,
320 HypreNodeLap::Int* ncols,
321 HypreNodeLap::Int* cols,
322 Real* mat) const;
323#endif
324
325 void fillIJMatrix_cpu (MFIter const& mfi,
327 Array4<int const> const& lid,
328 HypreNodeLap::Int* ncols,
329 HypreNodeLap::Int* cols,
330 Real* mat) const;
331
332 void fillRHS (MFIter const& mfi, Array4<int const> const& lid,
333 Real* rhs, Array4<Real const> const& bfab) const override;
334#endif
335
336protected:
337
338 void resizeMultiGrid (int new_size) final;
339
340private:
341
342 int m_is_rz = 0;
343
344 Real m_const_sigma = Real(0.0);
345 Vector<Vector<Array<std::unique_ptr<MultiFab>,AMREX_SPACEDIM> > > m_sigma;
347 Vector<std::unique_ptr<MultiFab> > m_nosigma_stencil;
348 Vector<Vector<Real> > m_s0_norm0;
349
350 Real m_normalization_threshold = Real(1.e-8);
351
352#ifdef AMREX_USE_EB
353 // they could be MultiCutFab
355 bool m_integral_built = false;
356
357 Vector<std::unique_ptr<MultiFab> > m_surface_integral;
358 bool m_surface_integral_built = false;
359 bool m_build_surface_integral = false;
360 Vector<std::unique_ptr<MultiFab> > m_eb_vel_dot_n;
361#endif
362
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;
367
368 void checkPoint (std::string const& file_name) const final;
369};
370
371}
372
373#endif
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