HybridADRSolver
Loading...
Searching...
No Matches
matrix_free_solver.h
Go to the documentation of this file.
1
5
6#ifndef HYBRIDADRSOLVER_MATRIX_FREE_SOLVER_H
7#define HYBRIDADRSOLVER_MATRIX_FREE_SOLVER_H
8
9#include "adr_operator.h"
11#include "core/solver.h"
12#include "core/types.h"
13
14#include <deal.II/lac/precondition.h>
15#include <deal.II/lac/solver_gmres.h>
16#include <deal.II/matrix_free/matrix_free.h>
17#include <deal.II/multigrid/mg_coarse.h>
18#include <deal.II/multigrid/mg_constrained_dofs.h>
19#include <deal.II/multigrid/mg_matrix.h>
20#include <deal.II/multigrid/mg_smoother.h>
21#include <deal.II/multigrid/mg_transfer_matrix_free.h>
22#include <deal.II/multigrid/multigrid.h>
23#include <deal.II/numerics/vector_tools.h>
24
25namespace HybridADRSolver {
26
27using namespace dealii;
28
43template <int dim, int fe_degree>
45public:
46 using Number = double;
47 using LevelNumber = float; // Use float for level matrices (memory efficiency)
48 using VectorType = LinearAlgebra::distributed::Vector<Number>;
49 using LevelVectorType = LinearAlgebra::distributed::Vector<LevelNumber>;
50
51 // Type aliases for multigrid components
55 PreconditionChebyshev<LevelMatrixType, LevelVectorType>;
57 DiagonalMatrix<LevelVectorType>;
58
66 MatrixFreeSolver(const ProblemInterface<dim>& problem, MPI_Comm comm,
67 const SolverParameters& params = SolverParameters());
68
74 void run(unsigned int n_refinements) override;
75
79 SolverType get_solver_type() const override {
81 }
82
86 std::string get_name() const override {
87 return "Matrix-Free Solver (GMG + Hybrid MPI+Threading)";
88 }
89
94 return system_operator;
95 }
96
100 const VectorType& get_solution() const { return solution; }
101
105 double compute_memory_usage() const;
106
110 double compute_l2_error() const;
111
112protected:
113 void setup_dofs() override;
114 void assemble_system() override;
115 void solve() override;
116 void output_results(unsigned int cycle) const override;
117
121 void setup_matrix_free();
122
126 void setup_multigrid();
127
131 void assemble_rhs();
132
136 void solve_gmres_gmg();
137
141 void solve_cg_gmg();
142
146 void solve_gmres_jacobi();
147
151 void solve_cg_jacobi();
152
153private:
154 const ProblemInterface<dim>& problem;
155
156 // MatrixFree data structure for finest level
157 std::shared_ptr<MatrixFree<dim, Number>> matrix_free_data;
158
159 // System operator (matrix-free) for finest level
160 SystemMatrixType system_operator;
161
162 // Vectors
163 VectorType solution;
164 VectorType system_rhs;
165
166 // Multigrid components
167 MGConstrainedDoFs mg_constrained_dofs;
168 MGLevelObject<LevelMatrixType> mg_matrices;
169 MGLevelObject<std::shared_ptr<MatrixFree<dim, LevelNumber>>>
170 mg_matrix_free_storage;
171};
172
173// Explicit instantiation declarations
174extern template class MatrixFreeSolver<2, 1>;
175extern template class MatrixFreeSolver<2, 2>;
176extern template class MatrixFreeSolver<2, 3>;
177extern template class MatrixFreeSolver<3, 1>;
178extern template class MatrixFreeSolver<3, 2>;
179extern template class MatrixFreeSolver<3, 3>;
180
181} // namespace HybridADRSolver
182
183#endif // HYBRIDADRSOLVER_MATRIX_FREE_SOLVER_H
Matrix-free operator for the ADR problem with multigrid support.
Definition adr_operator.h:36
void run(unsigned int n_refinements) override
Run the complete solve cycle.
Definition matrix_free_solver.cpp:529
double compute_memory_usage() const
Compute memory usage in MB.
Definition matrix_free_solver.cpp:516
void solve_cg_gmg()
Solve using CG with GMG preconditioning (for symmetric problems).
Definition matrix_free_solver.cpp:249
float LevelNumber
Definition matrix_free_solver.h:47
void solve() override
Definition matrix_free_solver.cpp:227
MatrixFreeSolver(const ProblemInterface< dim > &problem, MPI_Comm comm, const SolverParameters &params=SolverParameters())
Constructor.
Definition matrix_free_solver.cpp:24
void output_results(unsigned int cycle) const override
Definition matrix_free_solver.cpp:495
SolverType get_solver_type() const override
Returns the solver type identifier.
Definition matrix_free_solver.h:79
void solve_gmres_gmg()
Solve using GMRES with GMG preconditioning.
Definition matrix_free_solver.cpp:318
DiagonalMatrix< LevelVectorType > SmootherPreconditionerType
Definition matrix_free_solver.h:56
void setup_dofs() override
Definition matrix_free_solver.cpp:34
double Number
Definition matrix_free_solver.h:46
PreconditionChebyshev< LevelMatrixType, LevelVectorType > SmootherType
Definition matrix_free_solver.h:54
double compute_l2_error() const
Compute the L2 error against the exact solution.
Definition matrix_free_solver.cpp:449
const SystemMatrixType & get_system_operator() const
Get the system operator (for analysis/debugging).
Definition matrix_free_solver.h:93
LinearAlgebra::distributed::Vector< LevelNumber > LevelVectorType
Definition matrix_free_solver.h:49
void setup_multigrid()
Setup the multigrid hierarchy.
Definition matrix_free_solver.cpp:101
const VectorType & get_solution() const
Get the solution vector.
Definition matrix_free_solver.h:100
void assemble_rhs()
Assemble the right-hand side vector.
Definition matrix_free_solver.cpp:156
LinearAlgebra::distributed::Vector< Number > VectorType
Definition matrix_free_solver.h:48
void setup_matrix_free()
Setup the MatrixFree data structure for the finest level.
Definition matrix_free_solver.cpp:76
ADROperator< dim, fe_degree, LevelNumber > LevelMatrixType
Definition matrix_free_solver.h:53
ADROperator< dim, fe_degree, Number > SystemMatrixType
Definition matrix_free_solver.h:52
std::string get_name() const override
Returns a descriptive name for this solver.
Definition matrix_free_solver.h:86
void assemble_system() override
Definition matrix_free_solver.cpp:151
void solve_gmres_jacobi()
Solve using GMRES with Jacobi preconditioning (fallback).
Definition matrix_free_solver.cpp:419
void solve_cg_jacobi()
Solve using CG with Jacobi preconditioning (fallback).
Definition matrix_free_solver.cpp:393
ParallelSolverBase(MPI_Comm comm, SolverParameters params, bool construct_mg_hierarchy=false)
Definition solver.h:145
Abstract interface for defining a physical problem.
Definition problem_definition.h:39
Definition problem_definition.h:25
SolverType
Definition types.h:34
@ MatrixFree
Definition types.h:34
Defines the problem interface and a concrete Advection-Diffusion-Reaction (ADR) problem.
Abstract base class for all solvers.
Common type definitions for the hybrid solver framework.