chombo-discharge
Loading...
Searching...
No Matches
CD_CdrMultigrid.H
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021-2026 SINTEF Energy Research
3 *
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
13#ifndef CD_CDRMULTIGRID_H
14#define CD_CDRMULTIGRID_H
15
16// Std includes
17#include <random>
18#include <time.h>
19#include <chrono>
20
21// Chombo includes
22#include <AMRMultiGrid.H>
23#include <BiCGStabSolver.H>
24#include <EBSimpleSolver.H>
25#include <GMRESSolver.H>
26
27// Our includes
29#include <CD_CdrSolver.H>
31#include <CD_NamespaceHeader.H>
32
36class CdrMultigrid : public CdrSolver
37{
38protected:
43 {
44 Simple,
45 BiCGStab,
46 GMRES
47 };
48
52 enum class MultigridType
53 {
54 VCycle,
55 WCycle,
56 };
57
58public:
63
67 virtual ~CdrMultigrid();
68
72 virtual void
73 parseOptions() override = 0;
74
78 virtual void
79 parseRuntimeOptions() override = 0;
80
84 virtual void
85 registerOperators() override;
86
90 virtual void
91 allocate() override;
92
99 virtual void
100 preRegrid(const int a_lbase, const int a_oldFinestLevel) override;
101
114 virtual void
115 computeDivJ(EBAMRCellData& a_divJ,
116 EBAMRCellData& a_phi,
117 const Real a_extrapDt,
118 const bool a_conservativeOnly,
119 const bool a_ebFlux,
120 const bool a_domainFlux) override final;
121
136 virtual void
137 computeDivF(EBAMRCellData& a_divF,
138 EBAMRCellData& a_phi,
139 const Real a_extrapDt,
140 const bool a_conservativeOnly,
141 const bool a_ebFlux,
142 const bool a_domainFlux) override final;
143
155 virtual void
156 computeDivD(EBAMRCellData& a_divD,
157 EBAMRCellData& a_phi,
158 const bool a_conservativeOnly,
159 const bool a_ebFlux,
160 const bool a_domainFlux) override final;
161
171 virtual void
172 advanceEuler(EBAMRCellData& a_newPhi,
173 const EBAMRCellData& a_oldPhi,
174 const EBAMRCellData& a_source,
175 const Real a_dt) override final;
176
186 virtual void
187 advanceCrankNicholson(EBAMRCellData& a_newPhi,
188 const EBAMRCellData& a_oldPhi,
189 const EBAMRCellData& a_source,
190 const Real a_dt) override final;
191
192protected:
197
202
207
213
218
222 RefCountedPtr<AMRMultiGrid<LevelData<EBCellFAB>>> m_multigridSolver;
223
227 RefCountedPtr<EBHelmholtzOpFactory> m_helmholtzOpFactory;
228
232 BiCGStabSolver<LevelData<EBCellFAB>> m_bicgstab;
233
237 EBSimpleSolver m_simpleSolver;
238
242 GMRESSolver<LevelData<EBCellFAB>> m_gmres;
243
248
253
258
263
268
272 EBAMRCellData m_helmAcoef;
273
277 EBAMRCellData m_residual;
278
283
288
293
298
303
308
313
318
323
328
333
340 virtual void
341 advectToFaces(EBAMRFluxData& a_facePhi, const EBAMRCellData& a_phi, const Real a_extrapDt) override = 0;
342
346 virtual void
348
352 virtual void
354
358 virtual void
360
365 virtual void
367
373 virtual void
374 resetAlphaAndBeta(const Real a_alpha, const Real a_beta);
375
382 virtual void
383 computeKappaLphi(EBAMRCellData& a_kappaLphi, const EBAMRCellData& a_phi);
384
388 virtual void
390};
391
392#include <CD_NamespaceFooter.H>
393
394#endif
Declaration of an abstract class for solving scalar convection-diffusion-reaction problems.
Declaration of a factory class for making Poisson operators for multigrid.
Declaration of outer Krylov solves (GMRES/BiCGStab) preconditioned by an AMR-multigrid cycle.
Extension class of CdrSolver that uses multigrid for diffusion part. Can also solve for stochastic di...
Definition CD_CdrMultigrid.H:37
virtual void registerOperators() override
Register operator.
Definition CD_CdrMultigrid.cpp:37
MultigridType
Enum for multigrid cycle types.
Definition CD_CdrMultigrid.H:53
virtual void setMultigridSolverCoefficients()
Set the multigrid solver coefficients.
Definition CD_CdrMultigrid.cpp:95
virtual void advanceEuler(EBAMRCellData &a_newPhi, const EBAMRCellData &a_oldPhi, const EBAMRCellData &a_source, const Real a_dt) override final
Implicit diffusion Euler advance with source term.
Definition CD_CdrMultigrid.cpp:164
CdrMultigrid()
Constructor.
Definition CD_CdrMultigrid.cpp:25
EBSimpleSolver m_simpleSolver
Simple solver.
Definition CD_CdrMultigrid.H:237
bool m_multigridRefluxFree
Use reflux-free AMR operator in GMG.
Definition CD_CdrMultigrid.H:267
MultigridType m_multigridType
GMG multigrid type.
Definition CD_CdrMultigrid.H:217
RefCountedPtr< AMRMultiGrid< LevelData< EBCellFAB > > > m_multigridSolver
Geometric multigrid solver.
Definition CD_CdrMultigrid.H:222
virtual void computeDivD(EBAMRCellData &a_divD, EBAMRCellData &a_phi, const bool a_conservativeOnly, const bool a_ebFlux, const bool a_domainFlux) override final
Compute div(D*grad(phi)) explicitly.
Definition CD_CdrMultigrid.cpp:766
bool m_hasMultigridSolver
Is multigrid solver defined or not?
Definition CD_CdrMultigrid.H:262
BottomSolverType
Enum class for supported bottom solvers in multigrid.
Definition CD_CdrMultigrid.H:43
int m_multigridVerbosity
Verbosity for geometric multigrid.
Definition CD_CdrMultigrid.H:282
EllipticSolverChain::KrylovSolver< EBCellFAB > m_krylov
Outer-Krylov driver (V-cycle-preconditioned BiCGStab/GMRES with persistent work vectors)
Definition CD_CdrMultigrid.H:257
int m_numSmoothingsForSimpleSolver
Number of smoothing for bottom solver.
Definition CD_CdrMultigrid.H:317
virtual void computeKappaLphi(EBAMRCellData &a_kappaLphi, const EBAMRCellData &a_phi)
Compute kappa * L(phi) using the multigrid operator. This is different from computeDivD.
Definition CD_CdrMultigrid.cpp:140
int m_rasInnerSweeps
Number of inner frozen-ghost sweeps per restricted-additive-Schwarz iteration (only used when m_smoot...
Definition CD_CdrMultigrid.H:212
virtual void parseMultigridSettings()
Parse solver settings for geometric multigrid.
Definition CD_CdrMultigrid.cpp:807
EBAMRCellData m_residual
Storage for multigrid residual.
Definition CD_CdrMultigrid.H:277
int m_chebyOrder
Chebyshev polynomial degree (only used when m_smoother is Smoother::Chebyshev)
Definition CD_CdrMultigrid.H:201
int m_multigridBottomSmooth
Number of smoothing before bottom solver.
Definition CD_CdrMultigrid.H:297
int m_minCellsBottom
Set bottom drop depth.
Definition CD_CdrMultigrid.H:322
EBAMRCellData m_helmAcoef
Storage for Helmholtz a-coefficient. Always 1.
Definition CD_CdrMultigrid.H:272
EllipticSolverChain::Settings m_krylovSettings
Outer-Krylov settings (selects gmg/gmres/bicgstab and the krylov_* parameters)
Definition CD_CdrMultigrid.H:247
virtual void preRegrid(const int a_lbase, const int a_oldFinestLevel) override
Perform pre-regrid operations.
Definition CD_CdrMultigrid.cpp:63
Real m_multigridExitHang
Multigrid hand.
Definition CD_CdrMultigrid.H:332
BiCGStabSolver< LevelData< EBCellFAB > > m_bicgstab
Conjugate gradient solver bottom MG level.
Definition CD_CdrMultigrid.H:232
virtual void parseRuntimeOptions() override=0
Parse class options.
virtual void resetAlphaAndBeta(const Real a_alpha, const Real a_beta)
Reset alpha and beta-coefficients in the multigrid solvers.
Definition CD_CdrMultigrid.cpp:76
virtual void setupMultigrid()
Setup multigrid.
Definition CD_CdrMultigrid.cpp:543
BottomSolverType m_bottomSolverType
Bottom solver type.
Definition CD_CdrMultigrid.H:312
virtual void allocate() override
Allocate internal storage.
Definition CD_CdrMultigrid.cpp:52
int m_multigridPreSmooth
Number of smoothings before averaging.
Definition CD_CdrMultigrid.H:287
Real m_chebyEigRatio
Chebyshev eigenvalue ratio lambda_max/lambda_min (only used when m_smoother is Smoother::Chebyshev)
Definition CD_CdrMultigrid.H:206
GMRESSolver< LevelData< EBCellFAB > > m_gmres
GMRES solver.
Definition CD_CdrMultigrid.H:242
virtual void setupDiffusionSolver()
Set up diffusion solver.
Definition CD_CdrMultigrid.cpp:445
virtual void setupHelmholtzFactory()
Setup the operator factory.
Definition CD_CdrMultigrid.cpp:470
virtual void computeDivF(EBAMRCellData &a_divF, EBAMRCellData &a_phi, const Real a_extrapDt, const bool a_conservativeOnly, const bool a_ebFlux, const bool a_domainFlux) override final
Compute div(v*phi) explicitly.
Definition CD_CdrMultigrid.cpp:720
int m_multigridPostSmooth
Number of smoothings before averaging.
Definition CD_CdrMultigrid.H:292
EBHelmholtzOp::Smoother m_smoother
Relaxation type for gmg.
Definition CD_CdrMultigrid.H:196
virtual void computeDivJ(EBAMRCellData &a_divJ, EBAMRCellData &a_phi, const Real a_extrapDt, const bool a_conservativeOnly, const bool a_ebFlux, const bool a_domainFlux) override final
Compute div(J) explicitly, where J = nV - D*grad(n).
Definition CD_CdrMultigrid.cpp:657
virtual void advectToFaces(EBAMRFluxData &a_facePhi, const EBAMRCellData &a_phi, const Real a_extrapDt) override=0
Advection-only extrapolation to faces.
RefCountedPtr< EBHelmholtzOpFactory > m_helmholtzOpFactory
Operator factory.
Definition CD_CdrMultigrid.H:227
virtual void parseOptions() override=0
Parse class options.
Real m_multigridExitTolerance
Multigrid tolerance.
Definition CD_CdrMultigrid.H:327
int m_multigridMinIterations
Minimum number of iterations.
Definition CD_CdrMultigrid.H:307
int m_multigridMaxIterations
Maximum number of iterations.
Definition CD_CdrMultigrid.H:302
EllipticSolverChain::FallbackPolicy m_fallbackPolicy
Fallback-chain latch policy (persists across regrids; re-probes GMG every krylov_retry_interval solve...
Definition CD_CdrMultigrid.H:252
virtual ~CdrMultigrid()
Destructor.
virtual void advanceCrankNicholson(EBAMRCellData &a_newPhi, const EBAMRCellData &a_oldPhi, const EBAMRCellData &a_source, const Real a_dt) override final
Implicit diffusion Crank-Nicholson advance with source term.
Definition CD_CdrMultigrid.cpp:295
Base class for solving convection-diffusion-reaction equations.
Definition CD_CdrSolver.H:36
Smoother
Relaxation method for the operators.
Definition CD_EBHelmholtzOp.H:48
Stateful owner of the outer-Krylov solver path.
Definition CD_EllipticSolverChain.H:312
Stateful policy for the solver fallback chain.
Definition CD_EllipticSolverChain.H:130
Outer-Krylov configuration. Defaults reproduce stand-alone multigrid (solvers == {GMG}).
Definition CD_EllipticSolverChain.H:64