Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_MLEBABecLap.H
Go to the documentation of this file.
1#ifndef AMREX_MLEBABECLAP_H_
2#define AMREX_MLEBABECLAP_H_
3#include <AMReX_Config.H>
4
7#include <AMReX_Array.H>
8#include <limits>
9
10namespace amrex {
11
19template <typename T>
21
22// (alpha * a - beta * (del dot b grad)) phi
23
27 : public MLCellABecLap
28{
29public:
30
32 MLEBABecLap () = default;
43 MLEBABecLap (const Vector<Geometry>& a_geom,
44 const Vector<BoxArray>& a_grids,
45 const Vector<DistributionMapping>& a_dmap,
46 const LPInfo& a_info,
47 const Vector<EBFArrayBoxFactory const*>& a_factory,
48 int a_ncomp = 1);
49
50 MLEBABecLap (const Vector<Geometry>& a_geom,
51 const Vector<BoxArray>& a_grids,
52 const Vector<DistributionMapping>& a_dmap,
53 const Vector<iMultiFab const*>& a_overset_mask, // 1: unknown, 0: known
54 const LPInfo& a_info,
55 const Vector<EBFArrayBoxFactory const*>& a_factory,
56 int a_ncomp = 1);
57
58 ~MLEBABecLap () override;
59
60 MLEBABecLap (const MLEBABecLap&) = delete;
64
75 void define (const Vector<Geometry>& a_geom,
76 const Vector<BoxArray>& a_grids,
77 const Vector<DistributionMapping>& a_dmap,
78 const LPInfo& a_info,
79 const Vector<EBFArrayBoxFactory const*>& a_factory,
80 int a_ncomp = 1);
81
82 void define (const Vector<Geometry>& a_geom,
83 const Vector<BoxArray>& a_grids,
84 const Vector<DistributionMapping>& a_dmap,
85 const Vector<iMultiFab const*>& a_overset_mask,
86 const LPInfo& a_info,
87 const Vector<EBFArrayBoxFactory const*>& a_factory,
88 int a_ncomp = 1);
89
91 void setPhiOnCentroid ();
92
99 void setScalars (Real a, Real b);
106 void setACoeffs (int amrlev, const MultiFab& alpha);
113 void setACoeffs (int amrlev, Real alpha);
114
122 void setBCoeffs (int amrlev, const Array<MultiFab const*,AMREX_SPACEDIM>& beta,
123 Location a_beta_loc);
125 {setBCoeffs (amrlev, beta, Location::FaceCenter);}
126
133 void setBCoeffs (int amrlev, Real beta);
140 void setBCoeffs (int amrlev, Vector<Real> const& beta);
141
149 void setEBDirichlet (int amrlev, const MultiFab& phi, const MultiFab& beta);
157 void setEBDirichlet (int amrlev, const MultiFab& phi, Real beta);
165 void setEBDirichlet (int amrlev, const MultiFab& phi, Vector<Real> const& beta);
166
173 void setEBHomogDirichlet (int amrlev, const MultiFab& beta);
180 void setEBHomogDirichlet (int amrlev, Real beta);
187 void setEBHomogDirichlet (int amrlev, Vector<Real> const& beta);
188
189 int getNComp () const override { return m_ncomp; }
190
191 bool needsUpdate () const override {
192 return (m_needs_update || MLCellABecLap::needsUpdate());
193 }
194 void update () override;
195
197 std::unique_ptr<FabFactory<FArrayBox> > makeFactory (int amrlev, int mglev) const final;
198
200 bool isCrossStencil () const override { return false; }
201
203 void applyBC (int amrlev, int mglev, MultiFab& in, BCMode bc_mode, StateMode s_mode,
204 const MLMGBndry* bndry=nullptr, bool skip_fillboundary=false) const final;
206 void apply (int amrlev, int mglev, MultiFab& out, MultiFab& in, BCMode bc_mode,
207 StateMode s_mode, const MLMGBndry* bndry=nullptr) const override;
209 void compGrad (int amrlev, const Array<MultiFab*,AMREX_SPACEDIM>& grad,
210 MultiFab& sol, Location loc) const final;
211
213 void prepareForSolve () override;
215 bool isSingular (int amrlev) const override { return m_is_singular[amrlev]; }
217 bool isBottomSingular () const override { return m_is_singular[0]; }
219 void Fapply (int amrlev, int mglev, MultiFab& out, const MultiFab& in) const final;
221 void Fsmooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs, int redblack) const final;
223 void FFlux (int amrlev, const MFIter& mfi,
225 const FArrayBox& sol, Location loc,
226 int face_only=0) const final;
227
229 void normalize (int amrlev, int mglev, MultiFab& mf) const final;
230
232 Real getAScalar () const final { return m_a_scalar; }
234 Real getBScalar () const final { return m_b_scalar; }
236 MultiFab const* getACoeffs (int amrlev, int mglev) const final
237 { return &(m_a_coeffs[amrlev][mglev]); }
239 Array<MultiFab const*,AMREX_SPACEDIM> getBCoeffs (int amrlev, int mglev) const final
240 { return amrex::GetArrOfConstPtrs(m_b_coeffs[amrlev][mglev]); }
241
242 std::unique_ptr<MLLinOp> makeNLinOp (int /*grid_size*/) const final {
243 amrex::Abort("MLABecLaplacian::makeNLinOp: Not implemented");
244 return std::unique_ptr<MLLinOp>{};
245 }
246
249 const Vector<MultiFab*>& b_eb);
250
259 void restriction (int amrlev, int cmglev, MultiFab& crse, MultiFab& fine) const final;
260
270 void interpolation (int amrlev, int fmglev, MultiFab& fine, const MultiFab& crse) const final;
271
273 void averageDownSolutionRHS (int camrlev, MultiFab& crse_sol, MultiFab& crse_rhs,
274 const MultiFab& fine_sol, const MultiFab& fine_rhs) final;
275
282 void getEBFluxes (const Vector<MultiFab*>& a_flux,
283 const Vector<MultiFab*>& a_sol) const override;
284
287
288#if defined(AMREX_USE_HYPRE) && (AMREX_SPACEDIM > 1)
290 [[nodiscard]] std::unique_ptr<Hypre> makeHypre (Hypre::Interface hypre_interface) const override;
291#endif
292
293#if defined(AMREX_USE_PETSC) && (AMREX_SPACEDIM > 1)
294 [[nodiscard]] std::unique_ptr<PETScABecLap> makePETSc () const override;
295#endif
296
298 Real m_a_scalar = std::numeric_limits<Real>::quiet_NaN();
299 Real m_b_scalar = std::numeric_limits<Real>::quiet_NaN();
302
303 bool m_scalars_set = false;
304 bool m_acoef_set = false;
305
306protected:
307
308 int m_ncomp = 1;
309
310 Location m_beta_loc; // Location of coefficients: face centers or face centroids
311 Location m_phi_loc; // Location of solution variable: cell centers or cell centroids
312
314
317
319
320 mutable int m_is_eb_inhomog;
321
322 //
323 // functions
324 //
325 bool isEBDirichlet () const noexcept { return m_eb_phi[0] != nullptr; }
326
328 void averageDownCoeffs ();
330 void averageDownCoeffsToCoarseAmrLevel (int flev);
331
332 [[nodiscard]] bool supportRobinBC () const noexcept override { return true; }
333
335
336private:
337
338 bool m_needs_update = true;
339
340 void define_ab_coeffs ();
341};
342
344
345// Tag for applyBC EB version
346template <typename T>
347struct MLMGABCEBTag {
350 T bcloc;
351 amrex::Box bx;
352 amrex::BoundCond bctype;
353 int blen;
354 int comp;
355 int dir;
356 int is_eb;
357 int side;
358 int local_index;
359
361 amrex::Box const& box() const noexcept { return bx; }
362};
363
365
366}
367
368#endif
Fixed-size array types for use on GPU and CPU.
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:124
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< int const > mask
Definition AMReX_InterpFaceRegister.cpp:93
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
Maintain an identifier for boundary condition types.
Definition AMReX_BoundCond.H:25
A Fortran Array of REALs.
Definition AMReX_FArrayBox.H:237
Interface
HYPRE interface modes supported.
Definition AMReX_Hypre.H:37
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:88
Cell-centered operator that exposes ABec Laplacian helpers to derived classes.
Definition AMReX_MLCellABecLap.H:22
bool needsUpdate() const override
Does it need update if it's reused?
Definition AMReX_MLCellABecLap.H:75
typename MLLinOpT< MF >::Location Location
Definition AMReX_MLCellABecLap.H:28
typename MLLinOpT< MF >::BCMode BCMode
Definition AMReX_MLCellLinOp.H:38
typename MLLinOpT< MF >::StateMode StateMode
Definition AMReX_MLCellLinOp.H:39
Embedded-boundary ABec Laplacian (alpha a - beta div(b grad phi)).
Definition AMReX_MLEBABecLap.H:28
~MLEBABecLap() override
bool isCrossStencil() const override
EB discretization uses a non-cross stencil.
Definition AMReX_MLEBABecLap.H:200
MLEBABecLap(MLEBABecLap &&)=delete
void prepareForSolve() override
Finalize EB masks, averages, and singularity flags prior to solving.
Definition AMReX_MLEBABecLap.cpp:783
int m_is_eb_inhomog
Definition AMReX_MLEBABecLap.H:320
MLEBABecLap(const MLEBABecLap &)=delete
bool m_acoef_set
Definition AMReX_MLEBABecLap.H:304
Vector< Vector< std::unique_ptr< MultiFab > > > m_eb_b_coeffs
Definition AMReX_MLEBABecLap.H:316
void setPhiOnCentroid()
Interprets phi on EB centroids instead of cell centers when set.
Definition AMReX_MLEBABecLap.cpp:143
Real getBScalar() const final
Scalar applied to the diffusion term.
Definition AMReX_MLEBABecLap.H:234
Real m_b_scalar
Definition AMReX_MLEBABecLap.H:299
std::unique_ptr< MLLinOp > makeNLinOp(int) const final
Create the NSolve counterpart of this operator with the requested grid size.
Definition AMReX_MLEBABecLap.H:242
Vector< std::unique_ptr< MultiFab > > m_eb_phi
Definition AMReX_MLEBABecLap.H:315
bool supportRobinBC() const noexcept override
Definition AMReX_MLEBABecLap.H:332
void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const final
Apply the operator on (amrlev,mglev) and write to out.
Definition AMReX_MLEBABecLap_F.cpp:12
void setBCoeffs(int amrlev, const Array< MultiFab const *, 3 > &beta, Location a_beta_loc)
Provide spatially varying b coefficients and their location.
Definition AMReX_MLEBABecLap.cpp:181
void FFlux(int amrlev, const MFIter &mfi, const Array< FArrayBox *, 3 > &flux, const FArrayBox &sol, Location loc, int face_only=0) const final
Compute EB-aware fluxes for sol on the tilebox described by mfi, storing to flux at loc (respecting f...
Definition AMReX_MLEBABecLap_F.cpp:349
void applyRobinBCTermsCoeffs()
Apply Robin BC terms to the stored coefficients when requested.
Definition AMReX_MLEBABecLap.cpp:1540
void setACoeffs(int amrlev, const MultiFab &alpha)
Provide per-cell a coefficients for AMR level amrlev.
Definition AMReX_MLEBABecLap.cpp:165
MultiFab const * getACoeffs(int amrlev, int mglev) const final
Access the a coefficient MultiFab.
Definition AMReX_MLEBABecLap.H:236
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_MLEBABecLap.cpp:955
Vector< Vector< MultiFab > > m_a_coeffs
Definition AMReX_MLEBABecLap.H:300
void averageDownSolutionRHS(int camrlev, MultiFab &crse_sol, MultiFab &crse_rhs, const MultiFab &fine_sol, const MultiFab &fine_rhs) final
Average solution/RHS from fine AMR levels into (camrlev) storage.
Definition AMReX_MLEBABecLap.cpp:1103
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_MLEBABecLap.cpp:1056
void applyBC(int amrlev, int mglev, MultiFab &in, BCMode bc_mode, StateMode s_mode, const MLMGBndry *bndry=nullptr, bool skip_fillboundary=false) const final
Apply physical BCs to in on (amrlev,mglev) using the supplied BC metadata.
Definition AMReX_MLEBABecLap.cpp:1113
void averageDownCoeffs()
Average coefficients down across all AMR and MG levels.
Definition AMReX_MLEBABecLap.cpp:647
bool isEBDirichlet() const noexcept
Definition AMReX_MLEBABecLap.H:325
void Fsmooth(int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs, int redblack) const final
Execute a smoothing sweep on (amrlev,mglev). redblack selects the red (0) or black (1) half of the gr...
Definition AMReX_MLEBABecLap_F.cpp:177
void getEBFluxes(const Vector< MultiFab * > &a_flux, const Vector< MultiFab * > &a_sol) const override
Extract EB face fluxes.
Definition AMReX_MLEBABecLap.cpp:1467
MLEBABecLap & operator=(const MLEBABecLap &)=delete
Vector< int > m_is_singular
Definition AMReX_MLEBABecLap.H:318
std::unique_ptr< FabFactory< FArrayBox > > makeFactory(int amrlev, int mglev) const final
EB-aware factory used when the solver needs auxiliary storage on (amrlev,mglev).
Definition AMReX_MLEBABecLap.cpp:44
void setEBDirichlet(int amrlev, const MultiFab &phi, const MultiFab &beta)
Specify Dirichlet values on EB faces using phi.
Definition AMReX_MLEBABecLap.cpp:230
Vector< Vector< iMultiFab > > m_cc_mask
Definition AMReX_MLEBABecLap.H:313
int m_ncomp
Definition AMReX_MLEBABecLap.H:308
void apply(int amrlev, int mglev, MultiFab &out, MultiFab &in, BCMode bc_mode, StateMode s_mode, const MLMGBndry *bndry=nullptr) const override
Apply the discrete operator to in on (amrlev,mglev) and store the result in out.
Definition AMReX_MLEBABecLap.cpp:1421
void averageDownCoeffsToCoarseAmrLevel(int flev)
Average coefficients from fine AMR level flev to coarse AMR level flev-1.
Definition AMReX_MLEBABecLap.cpp:760
bool needsUpdate() const override
Does it need update if it's reused?
Definition AMReX_MLEBABecLap.H:191
void setEBHomogDirichlet(int amrlev, const MultiFab &beta)
Mark EB faces as homogeneous Dirichlet (phi=0) with optional coefficients.
Definition AMReX_MLEBABecLap.cpp:440
void compGrad(int amrlev, const Array< MultiFab *, 3 > &grad, MultiFab &sol, Location loc) const final
Compute gradients from the solution sol on level amrlev at location loc.
Definition AMReX_MLEBABecLap.cpp:829
Real getAScalar() const final
Scalar applied to the zeroth-order term.
Definition AMReX_MLEBABecLap.H:232
MLEBABecLap()=default
Construct an empty operator; call define() before use.
void restriction(int amrlev, int cmglev, MultiFab &crse, MultiFab &fine) const final
Restrict fine-grid data onto coarse storage.
Definition AMReX_MLEBABecLap.cpp:1048
Real m_a_scalar
Scalar multiplier for the a term (set via setScalars()).
Definition AMReX_MLEBABecLap.H:298
Vector< Vector< TagVector< MLMGABCEBTag< RT > > > > m_eb_bc_tags
Definition AMReX_MLEBABecLap.H:334
int getNComp() const override
Return number of components.
Definition AMReX_MLEBABecLap.H:189
bool isSingular(int amrlev) const override
True if AMR level amrlev is singular.
Definition AMReX_MLEBABecLap.H:215
void setScalars(Real a, Real b)
Set constant scalar coefficients (see MLCellABecLap semantics).
Definition AMReX_MLEBABecLap.cpp:149
void update() override
Average coefficients/metrics when marked dirty.
Definition AMReX_MLEBABecLap.cpp:1430
void averageDownCoeffsSameAmrLevel(int amrlev, Vector< MultiFab > &a, Vector< Array< MultiFab, 3 > > &b, const Vector< MultiFab * > &b_eb)
Definition AMReX_MLEBABecLap.cpp:672
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, int a_ncomp=1)
Bind the EB operator to the AMR hierarchy.
Definition AMReX_MLEBABecLap.cpp:55
bool isBottomSingular() const override
True if the bottom level is singular.
Definition AMReX_MLEBABecLap.H:217
Location m_phi_loc
Definition AMReX_MLEBABecLap.H:311
void setBCoeffs(int amrlev, const Array< MultiFab const *, 3 > &beta)
Definition AMReX_MLEBABecLap.H:124
Array< MultiFab const *, 3 > getBCoeffs(int amrlev, int mglev) const final
Access the b coefficients for (amrlev,mglev).
Definition AMReX_MLEBABecLap.H:239
bool m_scalars_set
Definition AMReX_MLEBABecLap.H:303
Vector< Vector< Array< MultiFab, 3 > > > m_b_coeffs
Definition AMReX_MLEBABecLap.H:301
Location m_beta_loc
Definition AMReX_MLEBABecLap.H:310
Boundary helper for MLMG that manages coarse/fine and physical BC metadata.
Definition AMReX_MLMGBndry.H:20
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
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
std::array< T const *, 3 > GetArrOfConstPtrs(const std::array< T, 3 > &a) noexcept
Create an array of const-qualified pointers from an array of objects.
Definition AMReX_Array.H:1079
std::unique_ptr< Hypre > makeHypre(const BoxArray &grids, const DistributionMapping &dmap, const Geometry &geom, MPI_Comm comm_, Hypre::Interface interface, const iMultiFab *overset_mask)
Factory that instantiates the requested HYPRE interface.
Definition AMReX_Hypre.cpp:12
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
Definition AMReX_MLEBABecLap.H:20