Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_MLNodeABecLaplacian.H
Go to the documentation of this file.
1#ifndef AMREX_MLNODEABECLAPLACIAN_H_
2#define AMREX_MLNODEABECLAPLACIAN_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_MLNodeLinOp.H>
6
7namespace amrex {
8
15// (alpha * a - beta * (del dot b grad)) phi = rhs
16// a, phi and rhs are nodal. b is cell-centered.
17
19 : public MLNodeLinOp
20{
21public:
22
23 MLNodeABecLaplacian () = default;
25 const Vector<BoxArray>& a_grids,
26 const Vector<DistributionMapping>& a_dmap,
27 const LPInfo& a_info = LPInfo(),
28 const Vector<FabFactory<FArrayBox> const*>& a_factory = {});
29 ~MLNodeABecLaplacian () override = default;
30
35
45 void define (const Vector<Geometry>& a_geom,
46 const Vector<BoxArray>& a_grids,
47 const Vector<DistributionMapping>& a_dmap,
48 const LPInfo& a_info = LPInfo(),
49 const Vector<FabFactory<FArrayBox> const*>& a_factory = {});
50
51 std::string name () const override { return std::string("MLNodeABecLaplacian"); }
52
54 void setScalars (Real a, Real b) {
55 m_a_scalar = a;
56 m_b_scalar = b;
57 }
58
65 void setACoeffs (int amrlev, Real a_acoef);
72 void setACoeffs (int amrlev, const MultiFab& a_acoef);
73
80 void setBCoeffs (int amrlev, Real a_bcoef);
87 void setBCoeffs (int amrlev, const MultiFab& a_bcoef);
88
90 void Fapply (int amrlev, int mglev, MultiFab& out, const MultiFab& in) const final;
99 void Fsmooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs) const final;
100
102 void fixUpResidualMask (int amrlev, iMultiFab& resmsk) final;
103
104 bool isSingular (int /*amrlev*/) const final { return false; }
105 bool isBottomSingular () const final { return false; }
106
108 void restriction (int amrlev, int cmglev, MultiFab& crse, MultiFab& fine) const final;
110 void interpolation (int amrlev, int fmglev, MultiFab& fine, const MultiFab& crse) const final;
112 void averageDownSolutionRHS (int camrlev, MultiFab& crse_sol, MultiFab& crse_rhs,
113 const MultiFab& fine_sol, const MultiFab& fine_rhs) final;
114
116 void reflux (int crse_amrlev,
117 MultiFab& res, const MultiFab& crse_sol, const MultiFab& crse_rhs,
118 MultiFab& fine_res, MultiFab& fine_sol, const MultiFab& fine_rhs) const final;
119
121 void prepareForSolve () final;
122
123 [[nodiscard]] bool needsUpdate () const final { return m_needs_update; }
124
126 void update () final;
127
129 void averageDownCoeffs ();
131 void averageDownCoeffsToCoarseAmrLevel (int flev);
133 void averageDownCoeffsSameAmrLevel (int amrlev);
134
135private:
136
137 bool m_needs_update = true;
138
139 Real m_a_scalar = std::numeric_limits<Real>::quiet_NaN();
140 Real m_b_scalar = std::numeric_limits<Real>::quiet_NaN();
141 Vector<Vector<MultiFab> > m_a_coeffs;
142 Vector<Vector<MultiFab> > m_b_coeffs;
143};
144
145}
146
147#endif
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
Definition AMReX_FabFactory.H:50
Definition AMReX_MLNodeABecLaplacian.H:20
void setACoeffs(int amrlev, Real a_acoef)
Provide scalar nodal a coefficients for AMR level amrlev.
Definition AMReX_MLNodeABecLaplacian.cpp:55
void averageDownCoeffsSameAmrLevel(int amrlev)
Average coefficients across MG levels within the same AMR level.
Definition AMReX_MLNodeABecLaplacian.cpp:346
void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const final
Apply the nodal ABec operator on (amrlev,mglev) to in and store the result in out.
Definition AMReX_MLNodeABecLaplacian.cpp:85
void fixUpResidualMask(int amrlev, iMultiFab &resmsk) final
Enforce EB Dirichlet nodes by modifying the residual mask resmsk.
Definition AMReX_MLNodeABecLaplacian.cpp:279
std::string name() const override
Definition AMReX_MLNodeABecLaplacian.H:51
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={})
Bind the nodal ABec Laplacian to the AMR hierarchy.
Definition AMReX_MLNodeABecLaplacian.cpp:17
bool isSingular(int) const final
Is it singular on AMR level amrlev?
Definition AMReX_MLNodeABecLaplacian.H:104
~MLNodeABecLaplacian() override=default
void setBCoeffs(int amrlev, Real a_bcoef)
Provide scalar cell-centered b coefficients.
Definition AMReX_MLNodeABecLaplacian.cpp:70
void update() final
Refresh coefficients (averages them down) and clear the dirty flag.
Definition AMReX_MLNodeABecLaplacian.cpp:271
void Fsmooth(int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs) const final
Execute a smoothing sweep on (amrlev,mglev).
Definition AMReX_MLNodeABecLaplacian.cpp:118
bool isBottomSingular() const final
Is the bottom of the multigrid hierarchy singular?
Definition AMReX_MLNodeABecLaplacian.H:105
MLNodeABecLaplacian & operator=(const MLNodeABecLaplacian &)=delete
void averageDownCoeffsToCoarseAmrLevel(int flev)
Average coefficients from fine AMR level flev to coarse AMR level flev-1.
Definition AMReX_MLNodeABecLaplacian.cpp:331
MLNodeABecLaplacian(MLNodeABecLaplacian &&)=delete
void setScalars(Real a, Real b)
Set constant scalars a and b for the ABec operator.
Definition AMReX_MLNodeABecLaplacian.H:54
void prepareForSolve() final
Finalize coefficient averages and BC caches prior to solving.
Definition AMReX_MLNodeABecLaplacian.cpp:257
MLNodeABecLaplacian(const MLNodeABecLaplacian &)=delete
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 level to coarse storage.
Definition AMReX_MLNodeABecLaplacian.cpp:240
bool needsUpdate() const final
Does it need update if it's reused?
Definition AMReX_MLNodeABecLaplacian.H:123
void averageDownCoeffs()
Average a and b coefficients down across all AMR and MG levels.
Definition AMReX_MLNodeABecLaplacian.cpp:297
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 step coupling coarse and fine nodal solves.
Definition AMReX_MLNodeABecLaplacian.cpp:248
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_MLNodeABecLaplacian.cpp:210
void restriction(int amrlev, int cmglev, MultiFab &crse, MultiFab &fine) const final
Restrict nodal data from fine to coarse MG levels (AMR level amrlev, coarse MG index cmglev).
Definition AMReX_MLNodeABecLaplacian.cpp:177
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:79
Definition AMReX_Amr.cpp:50
Configuration knobs for multilevel linear operators (grid agglomeration, metrics, etc....
Definition AMReX_MLLinOp.H:51