Matrix Free Solver 1.0.0
A matrix free solver for the Advection Diffusion Reaction problem implemented with deal.II
Loading...
Searching...
No Matches
DTR_mf.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/multithread_info.h>
4#include <deal.II/base/quadrature_lib.h>
5#include <deal.II/base/function.h>
6#include <deal.II/base/timer.h>
7
8#include <deal.II/lac/affine_constraints.h>
9#include <deal.II/lac/solver_cg.h>
10#include <deal.II/lac/la_parallel_vector.h>
11#include <deal.II/lac/precondition.h>
12
13#include <deal.II/fe/fe_q.h>
14#include <deal.II/fe/mapping_q1.h>
15
16#include <deal.II/grid/tria.h>
17#include <deal.II/grid/grid_generator.h>
18#include <deal.II/grid/grid_in.h>
19
20#include <deal.II/multigrid/multigrid.h>
21#include <deal.II/multigrid/mg_transfer_matrix_free.h>
22#include <deal.II/multigrid/mg_tools.h>
23#include <deal.II/multigrid/mg_coarse.h>
24#include <deal.II/multigrid/mg_smoother.h>
25#include <deal.II/multigrid/mg_matrix.h>
26
27#include <deal.II/numerics/data_out.h>
28#include <deal.II/numerics/vector_tools.h>
29
30// Include the matrix-free headers
31#include <deal.II/matrix_free/matrix_free.h>
32#include <deal.II/matrix_free/operators.h>
33#include <deal.II/matrix_free/fe_evaluation.h>
34
35#include <filesystem>
36#include <iostream>
37#include <fstream>
38
39#include "problem_data.hpp"
40
41const std::string output_dir = "./output_mf/";
42
43namespace DTR_mf
44{
45 using namespace dealii;
46
47 // To be efficient matrix-free implementation require knowledge of loop lengths at compile time
48 const unsigned int dim = 2;
49
61 template <int dim, int fe_degree, typename number>
62 class DTROperation
63 : public MatrixFreeOperators::
64 Base<dim, LinearAlgebra::distributed::Vector<number>>
65 {
66 public:
67 using value_type = number;
68
73
77 void clear() override;
78
88 const problem_data::TransportCoefficient<dim> &transport_function,
89 const problem_data::ReactionCoefficient<dim> &reaction_function,
90 const problem_data::ForcingTerm<dim> &forcing_term_function);
91
95 virtual void compute_diagonal() override;
96
102 const Table<2, VectorizedArray<number>> &get_diffusion_coefficient() const
103 {
104 return diffusion_coefficient;
105 }
106
112 const Table<2, Tensor<1, dim, VectorizedArray<number>>> &get_transport_coefficient() const
113 {
114 return transport_coefficient;
115 }
116
122 const Table<2, VectorizedArray<number>> &get_reaction_coefficient() const
123 {
124 return reaction_coefficient;
125 }
126
132 const Table<2, VectorizedArray<number>> &get_forcing_term_coefficient() const
133 {
134 return forcing_term_coefficient;
135 }
136
137 private:
144 virtual void apply_add(
145 LinearAlgebra::distributed::Vector<number> &dst,
146 const LinearAlgebra::distributed::Vector<number> &src) const override;
147
156 void
157 local_apply(const MatrixFree<dim, number> &data,
158 LinearAlgebra::distributed::Vector<number> &dst,
159 const LinearAlgebra::distributed::Vector<number> &src,
160 const std::pair<unsigned int, unsigned int> &cell_range) const;
161
170 void local_compute_diagonal(
171 const MatrixFree<dim, number> &data,
172 LinearAlgebra::distributed::Vector<number> &dst,
173 const unsigned int &dummy,
174 const std::pair<unsigned int, unsigned int> &cell_range) const;
175
176 Table<2, VectorizedArray<number>> diffusion_coefficient;
177 Table<2, Tensor<1, dim, VectorizedArray<number>>> transport_coefficient;
178 Table<2, VectorizedArray<number>> reaction_coefficient;
179 Table<2, VectorizedArray<number>> forcing_term_coefficient;
180 };
181
190 template <int dim, int degree_finite_element = 2>
191 class DTRProblem
192 {
193 public:
199 DTRProblem(bool verbose = true);
200
207 DTRProblem(std::ofstream& dimension_time_file, bool verbose = true);
208
220 void run(unsigned int n_initial_refinements = 3, unsigned int n_cycles = 9);
221
228 double compute_error(const VectorTools::NormType &norm_type) const;
229
235 unsigned int get_cells() const { return triangulation.n_global_active_cells(); }
236
242 unsigned int get_dofs() const { return dof_handler.n_dofs(); }
243
249 unsigned int get_fe_degree() const { return degree_finite_element; }
250
251 private:
258 void setup_system();
259
265 void assemble_rhs();
266
272 void solve();
273
279 void output_results(const unsigned int cycle) const;
280
281#ifdef DEAL_II_WITH_P4EST
282 parallel::distributed::Triangulation<dim> triangulation;
283#else
284 Triangulation<dim> triangulation;
285#endif
286
290 FE_Q<dim> fe;
291
295 DoFHandler<dim> dof_handler;
296
300 MappingQ1<dim> mapping;
301
305 AffineConstraints<double> constraints;
306
310 using SystemMatrixType =
312
316 SystemMatrixType system_matrix;
317
321 MGConstrainedDoFs mg_constrained_dofs;
322
327
331 MGLevelObject<LevelMatrixType> mg_matrices;
332
336 LinearAlgebra::distributed::Vector<double> solution;
337
341 LinearAlgebra::distributed::Vector<double> lifting;
342
346 LinearAlgebra::distributed::Vector<double> system_rhs;
347
351 double setup_time;
352
356 ConditionalOStream pcout;
357
361 ConditionalOStream time_details;
362
367
372
377
382 };
383}
384
385#include "DTR_mf.cpp"
The DTROperation class implements the DTR linear operation needed at each iteration of the linear sol...
Definition DTR_mf.hpp:219
void clear() override
Clear the operation.
Definition DTR_mf.cpp:17
const Table< 2, Tensor< 1, dim, VectorizedArray< number > > > & get_transport_coefficient() const
Get the transport coefficient table.
Definition DTR_mf.hpp:112
DTROperation()
Default constructor.
Definition DTR_mf.cpp:11
void evaluate_coefficients(const problem_data::DiffusionCoefficient< dim > &diffusion_function, const problem_data::TransportCoefficient< dim > &transport_function, const problem_data::ReactionCoefficient< dim > &reaction_function, const problem_data::ForcingTerm< dim > &forcing_term_function)
Evaluate the coefficients of the DTR problem.
Definition DTR_mf.cpp:27
const Table< 2, VectorizedArray< number > > & get_diffusion_coefficient() const
Get the diffusion coefficient table.
Definition DTR_mf.hpp:102
number value_type
Definition DTR_mf.hpp:67
const Table< 2, VectorizedArray< number > > & get_forcing_term_coefficient() const
Get the forcing term coefficient table.
Definition DTR_mf.hpp:132
const Table< 2, VectorizedArray< number > > & get_reaction_coefficient() const
Get the reaction coefficient table.
Definition DTR_mf.hpp:122
virtual void compute_diagonal() override
Compute the diagonal entries of the matrix.
Definition DTR_mf.cpp:113
unsigned int get_cells() const
Get the number of global active cells in the triangulation.
Definition DTR_mf.hpp:235
double compute_error(const VectorTools::NormType &norm_type) const
Compute the error of the solution using the given norm type.
Definition DTR_mf.cpp:632
unsigned int get_dofs() const
Get the number of degrees of freedom.
Definition DTR_mf.hpp:242
DTRProblem(bool verbose=true)
Constructor for the DTRProblem class.
Definition DTR_mf.cpp:196
void run(unsigned int n_initial_refinements=3, unsigned int n_cycles=9)
Compute the solution of the DTR problem.
Definition DTR_mf.cpp:587
unsigned int get_fe_degree() const
Get the degree of the finite element.
Definition DTR_mf.hpp:249
Diffusion coefficient function.
Definition problem_data.hpp:19
Dirichlet boundary condition (left and bottom) function.
Definition problem_data.hpp:212
Dirichlet boundary condition (right and top) function.
Definition problem_data.hpp:250
Forcing term function.
Definition problem_data.hpp:174
Neumann boundary condition (right and top) function.
Definition problem_data.hpp:288
Neumann boundary condition (left and bottom) function.
Definition problem_data.hpp:326
Reaction coefficient function.
Definition problem_data.hpp:136
Transport coefficient function.
Definition problem_data.hpp:57
const std::string output_dir
Definition DTR_mf.hpp:41
Definition DTR_mf.hpp:44
const unsigned int dim
Definition DTR_mf.hpp:48