Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_MLNodeTensorLaplacian.H
Go to the documentation of this file.
1#ifndef AMREX_MLNODETENSORLAPLACIAN_H_
2#define AMREX_MLNODETENSORLAPLACIAN_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_MLNodeLinOp.H>
6
7namespace amrex {
8
16// del dot (sigma grad phi) = rhs
17// where phi and rhs are nodal multifab, and sigma is a tensor constant.
18// It is assumed that tensor is symmetric tensor of rank AMREX_SPACEDIM.
19// Only periodic and Dirichlet are supported.
20
22 : public MLNodeLinOp
23{
24public:
25
26#if (AMREX_SPACEDIM == 2)
27 static constexpr int nelems = 3; // number of unique elements in sigma
28#else
29 static constexpr int nelems = 6;
30#endif
31
34 const Vector<BoxArray>& a_grids,
35 const Vector<DistributionMapping>& a_dmap,
36 const LPInfo& a_info = LPInfo());
37 ~MLNodeTensorLaplacian () override = default;
38
43
52 void setSigma (Array<Real,nelems> const& a_sigma) noexcept;
58 void setBeta (Array<Real,AMREX_SPACEDIM> const& a_beta) noexcept;
59
68 void define (const Vector<Geometry>& a_geom,
69 const Vector<BoxArray>& a_grids,
70 const Vector<DistributionMapping>& a_dmap,
71 const LPInfo& a_info = LPInfo());
72
73 [[nodiscard]] std::string name () const override { return std::string("MLNodeTensorLaplacian"); }
74
79 void restriction (int amrlev, int cmglev, MultiFab& crse, MultiFab& fine) const final;
84 void interpolation (int amrlev, int fmglev, MultiFab& fine, const MultiFab& crse) const final;
89 void averageDownSolutionRHS (int camrlev, MultiFab& crse_sol, MultiFab& crse_rhs,
90 const MultiFab& fine_sol, const MultiFab& fine_rhs) final;
91
96 void reflux (int crse_amrlev,
97 MultiFab& res, const MultiFab& crse_sol, const MultiFab& crse_rhs,
98 MultiFab& fine_res, MultiFab& fine_sol, const MultiFab& fine_rhs) const final;
99
105 void smooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs,
106 bool skip_fillboundary, int niter) const final;
107
109 void prepareForSolve () final;
111 void Fapply (int amrlev, int mglev, MultiFab& out, const MultiFab& in) const final;
120 void Fsmooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs) const final;
122 void normalize (int amrlev, int mglev, MultiFab& mf) const final;
123
125 void fixUpResidualMask (int amrlev, iMultiFab& resmsk) final;
126
127#if (AMREX_SPACEDIM > 1)
128#if defined(AMREX_USE_HYPRE)
139 void fillIJMatrix (MFIter const& mfi,
141 Array4<int const> const& lid,
142 HypreNodeLap::Int* ncols,
143 HypreNodeLap::Int* cols,
144 Real* mat) const override;
145#endif
146
147 [[nodiscard]] bool supportsAlgMG () const override { return true; }
149 [[nodiscard]] bool needsUpdate () const final { return m_needs_update; }
150 void update () final { m_needs_update = false; }
151 void fillAlgMatrix (int mglev, MFIter const& mfi,
152 Array4<Long const> const& gid,
153 Array4<int const> const& lid,
154 Long* ncols, Long* cols, Real* mat) const override;
155
165 void fillRHS (int mglev, MFIter const& mfi,
166 Array4<int const> const& lid,
167 Real* rhs,
168 Array4<Real const> const& bfab) const override;
169
170 // Public for nvcc.
171 template <typename AlgInt, typename AlgGid>
172 void fillMatrix_doit (int mglev, MFIter const& mfi,
173 Array4<AlgGid const> const& gid,
174 Array4<int const> const& lid,
175 AlgInt* ncols, AlgInt* cols, Real* mat) const;
176#endif
177
178private:
179
180 GpuArray<Real,nelems> scaledSigma (int amrlev, int mglev) const noexcept;
181
182 GpuArray<Real,nelems> m_sigma;
183 bool m_needs_update = false;
184};
185
186}
187
188#endif
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
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_MLNodeLinOp.H:23
Definition AMReX_MLNodeTensorLaplacian.H:23
MLNodeTensorLaplacian(MLNodeTensorLaplacian &&)=delete
static constexpr int nelems
Definition AMReX_MLNodeTensorLaplacian.H:29
std::string name() const override
Definition AMReX_MLNodeTensorLaplacian.H:73
bool supportsAlgMG() const override
True if makeAlgMG is implemented for this operator.
Definition AMReX_MLNodeTensorLaplacian.H:147
MLNodeTensorLaplacian(const MLNodeTensorLaplacian &)=delete
void define(const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info=LPInfo())
Bind the tensor operator to the AMR hierarchy (no EB support).
Definition AMReX_MLNodeTensorLaplacian.cpp:66
bool needsUpdate() const final
True after setSigma or setBeta, so that cached matrices are rebuilt.
Definition AMReX_MLNodeTensorLaplacian.H:149
void fillRHS(int mglev, MFIter const &mfi, Array4< int const > const &lid, Real *rhs, Array4< Real const > const &bfab) const override
Fill the RHS vector for nodal tensor solves.
Definition AMReX_MLNodeTensorLaplacian.cpp:415
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_MLNodeTensorLaplacian.cpp:361
void smooth(int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs, bool skip_fillboundary, int niter) const final
Tensor-aware smoother override for nodal data (updates sol against rhs for niter passes; set skip_fil...
Definition AMReX_MLNodeTensorLaplacian.cpp:256
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_MLNodeTensorLaplacian.cpp:334
void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const final
Apply the tensor Laplacian to in at (amrlev,mglev).
Definition AMReX_MLNodeTensorLaplacian.cpp:231
MLNodeTensorLaplacian & operator=(const MLNodeTensorLaplacian &)=delete
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_MLNodeTensorLaplacian.cpp:143
void setBeta(Array< Real, 3 > const &a_beta) noexcept
Convenience helper that sets sigma = I - beta beta^T.
Definition AMReX_MLNodeTensorLaplacian.cpp:24
void Fsmooth(int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs) const final
Execute the nodal tensor smoother on (amrlev,mglev).
Definition AMReX_MLNodeTensorLaplacian.cpp:273
~MLNodeTensorLaplacian() override=default
void setSigma(Array< Real, nelems > const &a_sigma) noexcept
Configure the symmetric tensor sigma.
Definition AMReX_MLNodeTensorLaplacian.cpp:17
void prepareForSolve() final
Finalize tensor coefficients and BC caches before solving.
Definition AMReX_MLNodeTensorLaplacian.cpp:220
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_MLNodeTensorLaplacian.cpp:371
void averageDownSolutionRHS(int camrlev, MultiFab &crse_sol, MultiFab &crse_rhs, const MultiFab &fine_sol, const MultiFab &fine_rhs) final
Average fine AMR data (fine_sol, fine_rhs) into coarse arrays (crse_sol, crse_rhs) on level camrlev.
Definition AMReX_MLNodeTensorLaplacian.cpp:199
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 between coarse/fine tensor solves; updates res and fine_res using solutions and ...
Definition AMReX_MLNodeTensorLaplacian.cpp:212
void restriction(int amrlev, int cmglev, MultiFab &crse, MultiFab &fine) const final
Restrict nodal tensor data from fine to coarse on AMR level amrlev / MG level cmglev.
Definition AMReX_MLNodeTensorLaplacian.cpp:84
void update() final
Update for reuse.
Definition AMReX_MLNodeTensorLaplacian.H:150
void fixUpResidualMask(int amrlev, iMultiFab &resmsk) final
Adjust residual masks resmsk so tensor Dirichlet EB nodes remain fixed.
Definition AMReX_MLNodeTensorLaplacian.cpp:340
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
std::array< T, N > Array
Definition AMReX_Array.H:31
Definition AMReX_Amr.cpp:50
A multidimensional array accessor.
Definition AMReX_Array4.H:289
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:52
Configuration knobs for multilevel linear operators (grid agglomeration, metrics, etc....
Definition AMReX_MLLinOp.H:53