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_mg.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/conditional_ostream.h>
4#include <deal.II/base/data_out_base.h>
5#include <deal.II/base/index_set.h>
6#include <deal.II/base/logstream.h>
7#include <deal.II/base/quadrature_lib.h>
8#include <deal.II/base/timer.h>
9#include <deal.II/base/parameter_handler.h>
10#include <deal.II/distributed/grid_refinement.h>
11#include <deal.II/distributed/tria.h>
12#include <deal.II/dofs/dof_tools.h>
13#include <deal.II/fe/fe_q.h>
14#include <deal.II/fe/fe_values.h>
15#include <deal.II/fe/mapping_q1.h>
16#include <deal.II/grid/grid_generator.h>
17#include <deal.II/grid/grid_refinement.h>
18#include <deal.II/grid/tria.h>
19#include <deal.II/lac/affine_constraints.h>
20#include <deal.II/lac/dynamic_sparsity_pattern.h>
21#include <deal.II/lac/sparsity_tools.h>
22#include <deal.II/lac/solver_cg.h>
23#include <deal.II/lac/solver_gmres.h>
24
25#include <deal.II/lac/generic_linear_algebra.h>
26
27#include <deal.II/multigrid/mg_coarse.h>
28#include <deal.II/multigrid/mg_constrained_dofs.h>
29#include <deal.II/multigrid/mg_matrix.h>
30#include <deal.II/multigrid/mg_smoother.h>
31#include <deal.II/multigrid/mg_tools.h>
32#include <deal.II/multigrid/mg_transfer.h>
33#include <deal.II/multigrid/multigrid.h>
34#include <deal.II/multigrid/mg_transfer_matrix_free.h>
35#include <deal.II/numerics/data_out.h>
36#include <deal.II/numerics/vector_tools.h>
37
38// The following files are used to assemble the error estimator like in step-12:
39#include <deal.II/fe/fe_interface_values.h>
40#include <deal.II/meshworker/mesh_loop.h>
41
42#include <filesystem>
43
44const std::string output_dir = "./output_mg/";
45
46using namespace dealii;
47
48namespace DTR_mg
49{
50
51 const char bcs[4] = {'Z', 'N', 'Z', 'N'};
52
53 // This is the main class of the program.
54 template <int dim>
56 {
57 public:
58 class DiffusionCoefficient : public Function<dim>
59 {
60 public:
61 virtual double
62 value(const Point<dim> & /*p*/,
63 const unsigned int /*component*/ = 0) const override
64 {
65 // EXAM: DIFFUSION COEFFICIENT
66 return 1.;
67 }
68 };
69
70 // Transport coefficient.
71 class TransportCoefficient : public Function<dim>
72 {
73 public:
74 virtual void
75 vector_value(const Point<dim> & /*p*/,
76 Vector<double> &values) const override
77 {
78 values[0] = 1.;
79 values[1] = 0.;
80 }
81
82 virtual double
83 value(const Point<dim> & /*p*/,
84 const unsigned int component = 0) const override
85 {
86 if (component == 0)
87 return 1.;
88 else
89 return 0.;
90 }
91 };
92
93 // Reaction coefficient.
94 class ReactionCoefficient : public Function<dim>
95 {
96 public:
97 virtual double
98 value(const Point<dim> & /*p*/,
99 const unsigned int /*component*/ = 0) const override
100 {
101 return 1.;
102 }
103 };
104
105 // Forcing term.
106 class ForcingTerm : public Function<dim>
107 {
108 public:
109 virtual double
110 value(const Point<dim> &p,
111 const unsigned int /*component*/ = 0) const override
112 {
113 return 1. - 2. * exp(p[0]);
114 }
115 };
116
117 class DirichletBC1 : public Function<dim>
118 {
119 public:
120 virtual double value(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
121 {
122 return 2.*exp(p[1]) - 1.;
123 }
124 };
125
126 class DirichletBC2 : public Function<dim>
127 {
128 public:
129 virtual double value(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
130 {
131 return 2.*exp(p[0]) - 1.;
132 }
133 };
134
135 class NeumannBC1 : public Function<dim>
136 {
137 public:
138 virtual double value(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
139 {
140 return 2.*exp(p[0]) * (2.*exp(p[1]) - 1.);
141 }
142 };
143
144 class NeumannBC2 : public Function<dim>
145 {
146 public:
147 virtual double value(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
148 {
149 return 2.*exp(p[1]) * (2.*exp(p[0]) - 1.);
150 }
151 };
152
153 class ExactSolution : public Function<dim>
154 {
155 public:
156 virtual double value(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
157 {
158 return (2.*exp(p[0]) - 1.)*(2.*exp(p[1]) - 1.);
159 }
160
161 virtual Tensor<1, dim> gradient(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
162 {
163 Tensor<1, dim> result;
164
165 result[0] = 2.*exp(p[0]) * (2.*exp(p[1]) - 1.);
166 result[1] = 2.*exp(p[1]) * (2.*exp(p[0]) - 1.);
167
168 return result;
169 }
170 };
171
172 DTRProblem(unsigned int degree);
173 DTRProblem(unsigned int degree, std::ofstream& dimension_time_file);
174 void run(unsigned int n_initial_refinements = 3, unsigned int n_cycles = 9);
175
176 private:
177 using MatrixType = LinearAlgebraTrilinos::MPI::SparseMatrix;
178 using VectorType = LinearAlgebraTrilinos::MPI::Vector;
179
180 void setup_system();
181 void setup_multigrid();
182 void assemble_system();
183 void assemble_multigrid();
184 void solve();
185 void output_results(const unsigned int cycle);
186
187 MPI_Comm mpi_communicator;
188 ConditionalOStream pcout;
189 ConditionalOStream time_details;
190 double setup_time;
191
192
193 // p4est triangulation
194 parallel::distributed::Triangulation<dim> triangulation;
195 const MappingQ1<dim> mapping;
196 const FE_Q<dim> fe;
197
198 DoFHandler<dim> dof_handler;
199
200 IndexSet locally_owned_dofs;
201 IndexSet locally_relevant_dofs;
202 AffineConstraints<double> constraints;
203
204 MatrixType system_matrix;
205 VectorType solution;
206 VectorType right_hand_side;
207 Vector<double> estimated_error_square_per_cell;
208
209 MGLevelObject<MatrixType> mg_matrix;
210 MGLevelObject<MatrixType> mg_interface_in;
211 MGConstrainedDoFs mg_constrained_dofs;
212
213 // Coefficients and forcing term
214 DiffusionCoefficient diffusion_coefficient;
215 ReactionCoefficient reaction_coefficient;
216 TransportCoefficient transport_coefficient;
217 ForcingTerm forcing_term;
218
219 DirichletBC1 dirichletBC1;
220 DirichletBC2 dirichletBC2;
221 NeumannBC1 neumannBC1;
222 NeumannBC2 neumannBC2;
223 };
224
225}
226
227#include "DTR_mg.cpp"
virtual double value(const Point< dim > &, const unsigned int=0) const override
Definition DTR_mg.hpp:62
Definition DTR_mg.hpp:118
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR_mg.hpp:120
Definition DTR_mg.hpp:127
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR_mg.hpp:129
Definition DTR_mg.hpp:154
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR_mg.hpp:156
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int=0) const override
Definition DTR_mg.hpp:161
Definition DTR_mg.hpp:107
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR_mg.hpp:110
Definition DTR_mg.hpp:136
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR_mg.hpp:138
Definition DTR_mg.hpp:145
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR_mg.hpp:147
virtual double value(const Point< dim > &, const unsigned int=0) const override
Definition DTR_mg.hpp:98
virtual void vector_value(const Point< dim > &, Vector< double > &values) const override
Definition DTR_mg.hpp:75
virtual double value(const Point< dim > &, const unsigned int component=0) const override
Definition DTR_mg.hpp:83
The main class of the program.
Definition DTR_mg.hpp:56
DTRProblem(unsigned int degree, std::ofstream &dimension_time_file)
DTRProblem(unsigned int degree)
void run(unsigned int n_initial_refinements=3, unsigned int n_cycles=9)
Definition DTR_mg.hpp:51
const char bcs[4]
Definition DTR_mg.hpp:51
const std::string output_dir
Definition DTR_mg.hpp:44