Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_MLTerrainPoisson.H
Go to the documentation of this file.
1#ifndef AMREX_ML_TERRAIN_POISSON_H_
2#define AMREX_ML_TERRAIN_POISSON_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_MLCellLinOp.H>
6#include <AMReX_MLTerrainPoisson_K.H>
8
9namespace amrex {
10
45 : public MLCellLinOpT<MultiFab>
46{
47public:
48
49 using MF = MultiFab;
50 using RT = Real;
51 using FAB = FArrayBox;
55
56 MLTerrainPoisson () = default;
57
60 const Vector<BoxArray>& a_grids,
61 const Vector<DistributionMapping>& a_dmap,
62 const LPInfo& a_info = LPInfo());
63
64 ~MLTerrainPoisson () override = default;
65
70
79 void define (const Vector<Geometry>& a_geom,
80 const Vector<BoxArray>& a_grids,
81 const Vector<DistributionMapping>& a_dmap,
82 const LPInfo& a_info = LPInfo());
83
90 void setZPhys (int amrlev, MultiFab const& z_phys_nd);
91
98 void setAreas (int amrlev, Array<MultiFab const*,AMREX_SPACEDIM> const& area);
99
106 void setDetJ (int amrlev, MultiFab const& detJ);
107
109 enum struct ZSplitSolver { Spike, Column };
110
115 void setZSplitSolver (ZSplitSolver a_solver);
116
117 [[nodiscard]] std::string name () const override { return std::string("MLTerrainPoisson"); }
118
119 [[nodiscard]] bool isCrossStencil () const override { return false; }
120
123 [[nodiscard]] BottomSolver getDefaultBottomSolver () const override {
124 Box const& cdomain = m_geom[0].back().Domain();
125 bool const few_columns = cdomain.length(0) <= 5 && cdomain.length(1) <= 5;
126 return (m_domain_covered[0] && few_columns) ? BottomSolver::smoother
128 }
129
130 void prepareForSolve () override;
131 [[nodiscard]] bool needsUpdate () const override {
132 return m_needs_update || MLCellLinOpT<MultiFab>::needsUpdate();
133 }
134 void update () override;
135 [[nodiscard]] bool isSingular (int amrlev) const override { return m_is_singular[amrlev]; }
136 [[nodiscard]] bool isBottomSingular () const override { return m_is_singular[0]; }
137
138 [[nodiscard]] bool scaleRHS (int amrlev, MultiFab* rhs) const override;
139
141 void setDirichletNodesToZero (int /*amrlev*/, int /*mglev*/, MultiFab& /*mf*/) const override {}
142
143 void applyBC (int amrlev, int mglev, MultiFab& in, BCMode bc_mode, StateMode s_mode,
144 const MLMGBndryT<MultiFab>* bndry=nullptr,
145 bool skip_fillboundary=false) const override;
146
147 void interpolation (int amrlev, int fmglev, MultiFab& fine, const MultiFab& crse) const override;
148
149 void Fapply (int amrlev, int mglev, MultiFab& out, const MultiFab& in) const override;
150 void Fsmooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs,
151 int redblack) const override;
152 void FFlux (int amrlev, const MFIter& mfi, const Array<FAB*,AMREX_SPACEDIM>& flux,
153 const FAB& sol, Location loc, int face_only=0) const override;
154
156 void compGrad (int amrlev, const Array<MultiFab*,AMREX_SPACEDIM>& grad,
157 MultiFab& sol, Location loc) const override;
158
159 struct BCTag {
162
164 Box const& box () const noexcept { return bx; }
165 };
166
167 [[nodiscard]] mlterrain::BCInfo bcInfo (int mglev) const;
168 [[nodiscard]] IntVect coarsenRatio (int mglev) const;
169 void fillZPhysGhost (MultiFab& zp, int mglev) const;
170 void updateCoefs ();
171
172private:
173
174 Vector<int> m_is_singular;
176 void defineLineSolvers ();
177 bool m_needs_update = true;
178
179 MultiFab m_zphys; // finest MG level only
180
181 // Per MG level of AMR level 0
183 Vector<MultiFab> m_column_lu;
184 Vector<MultiFab> m_rx;
185 Vector<MultiFab> m_ry;
186 Vector<MultiFab> m_zf;
187 MultiFab m_detJ;
188
189 mutable Vector<TagVector<BCTag>> m_bc_tags;
190
191 // GPU smoother: residual scratch and unallocated column slabs.
192 mutable Vector<MultiFab> m_smooth_res;
193 mutable Vector<MultiFab> m_column_slab;
194
195 // Levels whose boxes do not span z, with the same z cuts in every
196 // column: block solves coupled through spikes W, V (on this layout).
197 // Block end values go to x-y column slabs (k = block index), where the
198 // interface values are solved and sent back.
199 Vector<MultiFab> m_spike;
200 Vector<MultiFab> m_spike_end; // per column: W, V at block ends
201 mutable Vector<MultiFab> m_spike_sum; // per column: y at block ends, then l, f
202 mutable Vector<MultiFab> m_spike_buf; // per box: the same
203 mutable Vector<MultiFab> m_spike_lu; // per column: eliminated reduced rows
204 Vector<Vector<int>> m_zcut; // z cuts, p+1 values
205
206 // Other split levels: whole-column layout for the line solve, with its
207 // LU, residual and correction.
208 Vector<MultiFab> m_col_lu;
209 mutable Vector<MultiFab> m_col_res;
210 mutable Vector<MultiFab> m_col_cor;
211};
212
213}
214
215#endif
#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< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
__host__ __device__ IntVectND< dim > length() const noexcept
Return the length of the BoxND.
Definition AMReX_Box.H:167
A Fortran Array of REALs.
Definition AMReX_FArrayBox.H:237
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:88
Definition AMReX_MLCellLinOp.H:31
typename MLLinOpT< MF >::BCMode BCMode
Definition AMReX_MLCellLinOp.H:38
typename MLLinOpT< MF >::Location Location
Definition AMReX_MLCellLinOp.H:40
typename MLLinOpT< MF >::StateMode StateMode
Definition AMReX_MLCellLinOp.H:39
bool needsUpdate() const override
Does it need update if it's reused?
Definition AMReX_MLCellLinOp.H:93
Vector< int > m_domain_covered
Definition AMReX_MLLinOp.H:960
Vector< Vector< Geometry > > m_geom
first Vector is for amr level and second is mg level
Definition AMReX_MLLinOp.H:956
Boundary helper for MLMG that manages coarse/fine and physical BC metadata.
Definition AMReX_MLMGBndry.H:20
Cell-centered Poisson operator on a terrain-following mesh.
Definition AMReX_MLTerrainPoisson.H:46
bool scaleRHS(int amrlev, MultiFab *rhs) const override
Definition AMReX_MLTerrainPoisson.cpp:506
bool needsUpdate() const override
Does it need update if it's reused?
Definition AMReX_MLTerrainPoisson.H:131
bool isCrossStencil() const override
Whether the stencil is the cross shape.
Definition AMReX_MLTerrainPoisson.H:119
FArrayBox FAB
Definition AMReX_MLTerrainPoisson.H:51
std::string name() const override
Definition AMReX_MLTerrainPoisson.H:117
MLTerrainPoisson(MLTerrainPoisson &&)=delete
void update() override
Update for reuse.
Definition AMReX_MLTerrainPoisson.cpp:331
void updateCoefs()
Definition AMReX_MLTerrainPoisson.cpp:338
MLCellLinOpT< MF >::StateMode StateMode
Definition AMReX_MLTerrainPoisson.H:53
void setAreas(int amrlev, Array< MultiFab const *, 3 > const &area)
Set the face area factors (required).
Definition AMReX_MLTerrainPoisson.cpp:206
Real RT
Definition AMReX_MLTerrainPoisson.H:50
void FFlux(int amrlev, const MFIter &mfi, const Array< FAB *, 3 > &flux, const FAB &sol, Location loc, int face_only=0) const override
Definition AMReX_MLTerrainPoisson.cpp:1096
void setZSplitSolver(ZSplitSolver a_solver)
Choose the solver used when boxes are split in z: Spike (the default) or Column.
Definition AMReX_MLTerrainPoisson.cpp:80
ZSplitSolver
Line solver for levels whose boxes do not span z.
Definition AMReX_MLTerrainPoisson.H:109
bool isSingular(int amrlev) const override
Is it singular on AMR level amrlev?
Definition AMReX_MLTerrainPoisson.H:135
mlterrain::BCInfo bcInfo(int mglev) const
Definition AMReX_MLTerrainPoisson.cpp:225
void fillZPhysGhost(MultiFab &zp, int mglev) const
Definition AMReX_MLTerrainPoisson.cpp:260
void setDirichletNodesToZero(int, int, MultiFab &) const override
No-op: cell-centered unknowns are never on a Dirichlet boundary.
Definition AMReX_MLTerrainPoisson.H:141
void define(const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info=LPInfo())
Define the operator.
Definition AMReX_MLTerrainPoisson.cpp:19
void setDetJ(int amrlev, MultiFab const &detJ)
Set the cell volume factor J. If not set, J = 1.
Definition AMReX_MLTerrainPoisson.cpp:217
MLTerrainPoisson(const MLTerrainPoisson &)=delete
IntVect coarsenRatio(int mglev) const
Definition AMReX_MLTerrainPoisson.cpp:252
void interpolation(int amrlev, int fmglev, MultiFab &fine, const MultiFab &crse) const override
Definition AMReX_MLTerrainPoisson.cpp:613
MLCellLinOpT< MF >::BCMode BCMode
Definition AMReX_MLTerrainPoisson.H:52
BottomSolver getDefaultBottomSolver() const override
Definition AMReX_MLTerrainPoisson.H:123
void setZPhys(int amrlev, MultiFab const &z_phys_nd)
Set the physical height of the cell corners.
Definition AMReX_MLTerrainPoisson.cpp:197
void compGrad(int amrlev, const Array< MultiFab *, 3 > &grad, MultiFab &sol, Location loc) const override
Compute the terrain-following gradient, i.e., the negative of the flux.
Definition AMReX_MLTerrainPoisson.cpp:1130
void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const override
Definition AMReX_MLTerrainPoisson.cpp:587
void prepareForSolve() override
Prepare multilevel metadata before MLMG iterates (coefficients, BC caches, etc.).
Definition AMReX_MLTerrainPoisson.cpp:312
bool isBottomSingular() const override
Is the bottom of the multigrid hierarchy singular?
Definition AMReX_MLTerrainPoisson.H:136
MLCellLinOpT< MF >::Location Location
Definition AMReX_MLTerrainPoisson.H:54
void Fsmooth(int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs, int redblack) const override
Definition AMReX_MLTerrainPoisson.cpp:667
MLTerrainPoisson & operator=(const MLTerrainPoisson &)=delete
void applyBC(int amrlev, int mglev, MultiFab &in, BCMode bc_mode, StateMode s_mode, const MLMGBndryT< MultiFab > *bndry=nullptr, bool skip_fillboundary=false) const override
Definition AMReX_MLTerrainPoisson.cpp:518
~MLTerrainPoisson() override=default
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:80
std::array< T, N > Array
Definition AMReX_Array.H:31
Definition AMReX_Amr.cpp:50
BottomSolver
Definition AMReX_MLLinOp.H:42
Configuration knobs for multilevel linear operators (grid agglomeration, metrics, etc....
Definition AMReX_MLLinOp.H:53
Definition AMReX_MLTerrainPoisson.H:159
__host__ __device__ Box const & box() const noexcept
Definition AMReX_MLTerrainPoisson.H:164
Box bx
Definition AMReX_MLTerrainPoisson.H:160
int local_index
Definition AMReX_MLTerrainPoisson.H:161