Matrix Free Solver 1.0.0
A matrix free solver for the Advection Diffusion Reaction problem implemented with deal.II
Loading...
Searching...
No Matches
problem_data.hpp
Go to the documentation of this file.
1#include <deal.II/base/function.h>
2
3namespace problem_data
4{
5 using namespace dealii;
6
8 const char bcs[4] = {'D', 'N', 'D', 'N'};
9
17 template <int dim>
18 class DiffusionCoefficient : public Function<dim>
19 {
20 public:
28 virtual double value(const Point<dim> &p, const unsigned int component = 0) const override
29 {
30 return value<double>(p, component);
31 }
32
41 template <typename number>
42 number value(const Point<dim, number> & /*p*/, const unsigned int /*component*/ = 0) const
43 {
44 return 1.;
45 }
46 };
47
55 template <int dim>
56 class TransportCoefficient : public Function<dim>
57 {
58 public:
65 virtual void vector_value(const Point<dim> &p, Vector<double> &values) const override
66 {
67 return vector_value<double>(p, values);
68 }
69
77 template <typename number>
78 void vector_value(const Point<dim, number> & /*p*/, Vector<number> &values) const
79 {
80 values[0] = 1.;
81 values[1] = 0.;
82 }
83
91 virtual double value(const Point<dim> &p, const unsigned int component = 0) const override
92 {
93 return value<double>(p, component);
94 }
95
104 template <typename number>
105 number value(const Point<dim, number> & /*p*/, const unsigned int component = 0) const
106 {
107 if (component == 0)
108 return 1.;
109 else
110 return 0.;
111 }
112
119 template <typename number>
120 void tensor_value(const Point<dim, number> & /*p*/, Tensor<1, dim, number> &values) const
121 {
122 values[0] = 1.;
123 values[1] = 0.;
124 }
125 };
126
134 template <int dim>
135 class ReactionCoefficient : public Function<dim>
136 {
137 public:
145 virtual double value(const Point<dim> &p, const unsigned int component = 0) const override
146 {
147 return value<double>(p, component);
148 }
149
158 template <typename number>
159 number value(const Point<dim, number> & /*p*/, const unsigned int /*component*/ = 0) const
160 {
161 return 1.;
162 }
163 };
164
172 template <int dim>
173 class ForcingTerm : public Function<dim>
174 {
175 public:
183 virtual double value(const Point<dim> &p, const unsigned int component = 0) const override
184 {
185 return value<double>(p, component);
186 }
187
196 template <typename number>
197 number value(const Point<dim, number> &p, const unsigned int /*component*/ = 0) const
198 {
199 return number(1.) - number(2.) * exp(p[0]);
200 }
201 };
202
210 template <int dim>
211 class DirichletBC1 : public Function<dim>
212 {
213 public:
221 virtual double value(const Point<dim> &p, const unsigned int component = 0) const override
222 {
223 return value<double>(p, component);
224 }
225
234 template <typename number>
235 double value(const Point<dim, number> &p, const unsigned int /*component*/ = 0) const
236 {
237 return number(2.) * exp(p[1]) - number(1.);
238 }
239 };
240
248 template <int dim>
249 class DirichletBC2 : public Function<dim>
250 {
251 public:
259 virtual double value(const Point<dim> &p, const unsigned int component = 0) const override
260 {
261 return value<double>(p, component);
262 }
263
272 template <typename number>
273 double value(const Point<dim, number> &p, const unsigned int /*component*/ = 0) const
274 {
275 return number(2.) * exp(p[0]) - number(1.);
276 }
277 };
278
286 template <int dim>
287 class NeumannBC1 : public Function<dim>
288 {
289 public:
297 virtual double value(const Point<dim> &p, const unsigned int component = 0) const override
298 {
299 return value<double>(p, component);
300 }
301
310 template <typename number>
311 number value(const Point<dim, number> &p, const unsigned int /*component*/ = 0) const
312 {
313 return number(2.) * exp(p[0]) * (number(2.) * exp(p[1]) - number(1.));
314 }
315 };
316
324 template <int dim>
325 class NeumannBC2 : public Function<dim>
326 {
327 public:
335 virtual double value(const Point<dim> &p, const unsigned int component = 0) const override
336 {
337 return value<double>(p, component);
338 }
339
348 template <typename number>
349 number value(const Point<dim, number> &p, const unsigned int /*component*/ = 0) const
350 {
351 return number(2.) * exp(p[1]) * (number(2.) * exp(p[0]) - number(1.));
352 }
353 };
354
362 template <int dim>
363 class ExactSolution : public Function<dim>
364 {
365 public:
373 virtual double value(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
374 {
375 return (2. * exp(p[0]) - 1.) * (2. * exp(p[1]) - 1.);
376 }
377
385 virtual Tensor<1, dim> gradient(const Point<dim> &p, const unsigned int /*component*/ = 0) const override
386 {
387 Tensor<1, dim> result;
388
389 result[0] = 2. * exp(p[0]) * (2. * exp(p[1]) - 1.);
390 result[1] = 2. * exp(p[1]) * (2. * exp(p[0]) - 1.);
391
392 return result;
393 }
394 };
395} // namespace problem_data
Diffusion coefficient function.
Definition problem_data.hpp:19
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Returns the value of the diffusion coefficient at a given point.
Definition problem_data.hpp:28
number value(const Point< dim, number > &, const unsigned int=0) const
Templated version of value() for different number types.
Definition problem_data.hpp:42
Dirichlet boundary condition (left and bottom) function.
Definition problem_data.hpp:212
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Returns the value of the Dirichlet BC at a given point.
Definition problem_data.hpp:221
double value(const Point< dim, number > &p, const unsigned int=0) const
Templated version of value() for different number types.
Definition problem_data.hpp:235
Dirichlet boundary condition (right and top) function.
Definition problem_data.hpp:250
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Returns the value of the Dirichlet BC at a given point.
Definition problem_data.hpp:259
double value(const Point< dim, number > &p, const unsigned int=0) const
Templated version of value() for different number types.
Definition problem_data.hpp:273
Exact solution function.
Definition problem_data.hpp:364
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int=0) const override
Returns the gradient of the exact solution at a given point.
Definition problem_data.hpp:385
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Returns the exact solution value at a given point.
Definition problem_data.hpp:373
Forcing term function.
Definition problem_data.hpp:174
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Returns the value of the forcing term at a given point.
Definition problem_data.hpp:183
number value(const Point< dim, number > &p, const unsigned int=0) const
Templated version of value() for different number types.
Definition problem_data.hpp:197
Neumann boundary condition (right and top) function.
Definition problem_data.hpp:288
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Returns the value of the Neumann BC at a given point.
Definition problem_data.hpp:297
number value(const Point< dim, number > &p, const unsigned int=0) const
Templated version of value() for different number types.
Definition problem_data.hpp:311
Neumann boundary condition (left and bottom) function.
Definition problem_data.hpp:326
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Returns the value of the Neumann BC at a given point.
Definition problem_data.hpp:335
number value(const Point< dim, number > &p, const unsigned int=0) const
Templated version of value() for different number types.
Definition problem_data.hpp:349
Reaction coefficient function.
Definition problem_data.hpp:136
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Returns the value of the reaction coefficient at a given point.
Definition problem_data.hpp:145
number value(const Point< dim, number > &, const unsigned int=0) const
Templated version of value() for different number types.
Definition problem_data.hpp:159
Transport coefficient function.
Definition problem_data.hpp:57
void tensor_value(const Point< dim, number > &, Tensor< 1, dim, number > &values) const
Returns the tensor value of the transport coefficient at a given point.
Definition problem_data.hpp:120
virtual void vector_value(const Point< dim > &p, Vector< double > &values) const override
Returns the vector value of the transport coefficient at a given point.
Definition problem_data.hpp:65
void vector_value(const Point< dim, number > &, Vector< number > &values) const
Templated version of vector_value() for different number types.
Definition problem_data.hpp:78
number value(const Point< dim, number > &, const unsigned int component=0) const
Templated version of value() for different number types.
Definition problem_data.hpp:105
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Returns the value of the transport coefficient for a specific component.
Definition problem_data.hpp:91
Definition problem_data.hpp:4
const char bcs[4]
Boundary conditions: 'D' for Dirichlet and 'N' for Neumann. Order: left, right, bottom,...
Definition problem_data.hpp:8