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.hpp
Go to the documentation of this file.
1#ifndef DTR_HPP
2#define DTR_HPP
3
4#include <deal.II/base/conditional_ostream.h>
5#include <deal.II/base/quadrature_lib.h>
6
7#include <deal.II/distributed/fully_distributed_tria.h>
8
9#include <deal.II/dofs/dof_handler.h>
10#include <deal.II/dofs/dof_tools.h>
11
12/*#include <deal.II/fe/fe_simplex_p.h>
13#include <deal.II/fe/fe_values.h>
14#include <deal.II/fe/mapping_fe.h>*/
15
16#include <deal.II/fe/fe_q.h>
17#include <deal.II/fe/fe_values.h>
18#include <deal.II/fe/mapping_q1.h>
19
20#include <deal.II/grid/grid_generator.h>
21#include <deal.II/grid/grid_in.h>
22#include <deal.II/grid/grid_out.h>
23#include <deal.II/grid/tria.h>
24#include <deal.II/grid/grid_tools.h>
25
26#include <deal.II/lac/dynamic_sparsity_pattern.h>
27#include <deal.II/lac/precondition.h>
28#include <deal.II/lac/solver_cg.h>
29#include <deal.II/lac/solver_gmres.h>
30#include <deal.II/lac/trilinos_precondition.h>
31#include <deal.II/lac/trilinos_sparse_matrix.h>
32#include <deal.II/lac/vector.h>
33
34#include <deal.II/numerics/data_out.h>
35#include <deal.II/numerics/matrix_tools.h>
36#include <deal.II/numerics/vector_tools.h>
37#include <deal.II/base/timer.h>
38
39
40#include <filesystem>
41#include <fstream>
42#include <iostream>
43
44static const std::string output_dir = "./output_mb/";
45
46using namespace dealii;
47
51class DTR
52{
53public:
54 // Physical dimension (1D, 2D, 3D)
55 static constexpr unsigned int dim = 2;
56
57 // Diffusion coefficient.
58 // In deal.ii, functions are implemented by deriving the dealii::Function
59 // class, which provides an interface for the computation of function values
60 // and their derivatives.
61 class DiffusionCoefficient : public Function<dim>
62 {
63 public:
64 // Constructor.
67
68 // Evaluation.
69 virtual double
70 value(const Point<dim> &/*p*/,
71 const unsigned int /*component*/ = 0) const override
72 {
73 // EXAM: DIFFUSION COEFFICIENT
74 return 1.;
75 }
76 };
77
78 // Transport coefficient.
79 class TransportCoefficient : public Function<dim>
80 {
81 public:
82 // Constructor.
85
86 virtual void
87 vector_value(const Point<dim> & /*p*/,
88 Vector<double> &values) const override
89 {
90 values[0] = 1.;
91 values[1] = 0.;
92 }
93
94 virtual double
95 value(const Point<dim> & /*p*/,
96 const unsigned int component = 0) const override
97 {
98 if (component == 0)
99 return 1.;
100 else
101 return 0.;
102 }
103 };
104
105 // Reaction coefficient.
106 class ReactionCoefficient : public Function<dim>
107 {
108 public:
109 // Constructor.
112
113 // Evaluation.
114 virtual double
115 value(const Point<dim> &/*p*/,
116 const unsigned int /*component*/ = 0) const override
117 {
118 // EXAM: REACTION COEFFICIENT
119 return 1.;
120 }
121 };
122
123 // Forcing term.
124 class ForcingTerm : public Function<dim>
125 {
126 public:
127 // Constructor.
129 {}
130
131 // Evaluation.
132 virtual double
133 value(const Point<dim> & p,
134 const unsigned int /*component*/ = 0) const override
135 {
136 return 1. - 2. * exp(p[0]);
137 }
138 };
139
140 class DirichletBC1 : public Function<dim>
141 {
142 public:
143 virtual double value(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
144 {
145 return 2.*exp(p[1]) - 1.;
146 }
147 };
148
149 class DirichletBC2 : public Function<dim>
150 {
151 public:
152 virtual double value(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
153 {
154 return 2.*exp(p[0]) - 1.;
155 }
156 };
157
158 class NeumannBC1 : public Function<dim>
159 {
160 public:
161 virtual double value(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
162 {
163 return 2.*exp(p[0]) * (2.*exp(p[1]) - 1.);
164 }
165 };
166
167 class NeumannBC2 : public Function<dim>
168 {
169 public:
170 virtual double value(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
171 {
172 return 2.*exp(p[1]) * (2.*exp(p[0]) - 1.);
173 }
174 };
175
176 // Exact solution.
177 class ExactSolution : public Function<dim>
178 {
179 public:
180 virtual double value(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
181 {
182 return (2.*exp(p[0]) - 1.)*(2.*exp(p[1]) - 1.);
183 }
184
185 virtual Tensor<1, dim> gradient(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
186 {
187 Tensor<1, dim> result;
188
189 result[0] = 2.*exp(p[0]) * (2.*exp(p[1]) - 1.);
190 result[1] = 2.*exp(p[1]) * (2.*exp(p[0]) - 1.);
191
192 return result;
193 }
194 };
195
196 // Constructor.
197 DTR(const unsigned int &r_, std::ofstream& dimension_time_file)
198 : r(r_)
199 , mpi_size(Utilities::MPI::n_mpi_processes(MPI_COMM_WORLD))
200 , mpi_rank(Utilities::MPI::this_mpi_process(MPI_COMM_WORLD))
201 , mesh(MPI_COMM_WORLD)
202 , pcout(std::cout, true && Utilities::MPI::this_mpi_process(MPI_COMM_WORLD) == 0)
203 , time_details(dimension_time_file, true && Utilities::MPI::this_mpi_process(MPI_COMM_WORLD) == 0)
204 , setup_time(0.)
205 {}
206
207 DTR(const unsigned int &r_)
208 : r(r_)
209 , mpi_size(Utilities::MPI::n_mpi_processes(MPI_COMM_WORLD))
210 , mpi_rank(Utilities::MPI::this_mpi_process(MPI_COMM_WORLD))
211 , mesh(MPI_COMM_WORLD)
212 , pcout(std::cout, true && Utilities::MPI::this_mpi_process(MPI_COMM_WORLD) == 0)
213 , time_details(std::cout, false && Utilities::MPI::this_mpi_process(MPI_COMM_WORLD) == 0)
214 , setup_time(0.)
215 {}
216
217 // Initialization.
218 void
219 setup(unsigned int n_initial_refinements = 8);
220
221 // System assembly.
222 void
224
225 // System solution.
226 void
228
229 // Output.
230 void
231 output() const;
232
233 // Compute the error.
234 double
235 compute_error(const VectorTools::NormType &norm_type) const;
236
237protected:
238 // Path to the mesh file.
239 const std::string mesh_file_name;
240
241 // Polynomial degree.
242 const unsigned int r;
243
244 // Number of MPI processes.
245 const unsigned int mpi_size;
246
247 // This MPI process.
248 const unsigned int mpi_rank;
249
250 // Diffusion coefficient.
252
253 // Reaction coefficient.
255
256 // Transport coefficient.
258
259 // Forcing term.
261
262 // Dirichlet boundary conditions.
267
268 // Triangulation. The parallel::fullydistributed::Triangulation class manages
269 // a triangulation that is completely distributed (i.e. each process only
270 // knows about the elements it owns and its ghost elements).
271 parallel::fullydistributed::Triangulation<dim> mesh;
272
273 // Finite element space.
274 // We use a unique_ptr here so that we can choose the type and degree of the
275 // finite elements at runtime (the degree is a constructor parameter). The
276 // class FiniteElement<dim> is an abstract class from which all types of
277 // finite elements implemented by deal.ii inherit.
278 std::unique_ptr<FiniteElement<dim>> fe;
279
280 // Quadrature formula.
281 // We use a unique_ptr here so that we can choose the type and order of the
282 // quadrature formula at runtime (the order is a constructor parameter).
283 std::unique_ptr<Quadrature<dim>> quadrature;
284
285 std::unique_ptr<Quadrature<dim - 1>> quadrature_boundary;
286
287 // DoF handler.
288 DoFHandler<dim> dof_handler;
289
290 // System matrix.
291 TrilinosWrappers::SparseMatrix system_matrix;
292
293 // System right-hand side.
294 TrilinosWrappers::MPI::Vector system_rhs;
295
296 // System solution.
297 TrilinosWrappers::MPI::Vector solution;
298
299 // Parallel output stream.
300 ConditionalOStream pcout;
301 ConditionalOStream time_details;
302
303
304 // DoFs owned by current process.
305 IndexSet locally_owned_dofs;
306
307 double setup_time;
308};
309
310#endif
Definition DTR.hpp:62
virtual double value(const Point< dim > &, const unsigned int=0) const override
Definition DTR.hpp:70
DiffusionCoefficient()
Definition DTR.hpp:65
Definition DTR.hpp:141
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR.hpp:143
Definition DTR.hpp:150
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR.hpp:152
Definition DTR.hpp:178
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR.hpp:180
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int=0) const override
Definition DTR.hpp:185
Definition DTR.hpp:125
ForcingTerm()
Definition DTR.hpp:128
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR.hpp:133
Definition DTR.hpp:159
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR.hpp:161
Definition DTR.hpp:168
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR.hpp:170
Definition DTR.hpp:107
virtual double value(const Point< dim > &, const unsigned int=0) const override
Definition DTR.hpp:115
ReactionCoefficient()
Definition DTR.hpp:110
Definition DTR.hpp:80
TransportCoefficient()
Definition DTR.hpp:83
virtual void vector_value(const Point< dim > &, Vector< double > &values) const override
Definition DTR.hpp:87
virtual double value(const Point< dim > &, const unsigned int component=0) const override
Definition DTR.hpp:95
Class managing the differential problem.
Definition DTR.hpp:52
ConditionalOStream time_details
Output stream for timing details.
Definition DTR.hpp:217
const unsigned int mpi_rank
Rank of this MPI process.
Definition DTR.hpp:127
NeumannBC2 neumannBC2
Definition DTR.hpp:266
DTR(const unsigned int &r_)
Definition DTR.hpp:207
DirichletBC1 dirichletBC1
Definition DTR.hpp:263
DiffusionCoefficient diffusion_coefficient
Definition DTR.hpp:251
double setup_time
Time taken for setup.
Definition DTR.hpp:227
void output() const
const unsigned int r
Polynomial degree.
Definition DTR.hpp:117
double compute_error(const VectorTools::NormType &norm_type) const
std::unique_ptr< FiniteElement< dim > > fe
Finite element space.
Definition DTR.hpp:177
const std::string mesh_file_name
Path to the mesh file.
Definition DTR.hpp:112
DTR(const unsigned int &r_, std::ofstream &dimension_time_file)
Definition DTR.hpp:197
ForcingTerm forcing_term
Definition DTR.hpp:260
IndexSet locally_owned_dofs
Index set for locally owned degrees of freedom.
Definition DTR.hpp:222
void setup(unsigned int n_initial_refinements=8)
TrilinosWrappers::MPI::Vector solution
Solution vector.
Definition DTR.hpp:207
NeumannBC1 neumannBC1
Definition DTR.hpp:265
std::unique_ptr< Quadrature< dim > > quadrature
Quadrature formula for integration.
Definition DTR.hpp:182
ConditionalOStream pcout
Parallel output stream.
Definition DTR.hpp:212
ReactionCoefficient reaction_coefficient
Definition DTR.hpp:254
TrilinosWrappers::MPI::Vector system_rhs
System right-hand side vector.
Definition DTR.hpp:202
void assemble()
std::unique_ptr< Quadrature< dim - 1 > > quadrature_boundary
Quadrature formula for boundary integration.
Definition DTR.hpp:187
TrilinosWrappers::SparseMatrix system_matrix
System matrix.
Definition DTR.hpp:197
static constexpr unsigned int dim
Physical dimension (1D, 2D, 3D)
Definition DTR.hpp:55
void solve()
const unsigned int mpi_size
Number of MPI processes.
Definition DTR.hpp:122
parallel::fullydistributed::Triangulation< dim > mesh
Triangulation object for managing the mesh.
Definition DTR.hpp:172
DoFHandler< dim > dof_handler
DoF handler for managing degrees of freedom.
Definition DTR.hpp:192
DirichletBC2 dirichletBC2
Definition DTR.hpp:264
TransportCoefficient transport_coefficient
Definition DTR.hpp:257
const std::string output_dir
Definition DTR_mf.hpp:41