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>
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>
13#include <deal.II/fe/fe_q.h>
14#include <deal.II/fe/mapping_q1.h>
16#include <deal.II/grid/tria.h>
17#include <deal.II/grid/grid_generator.h>
18#include <deal.II/grid/grid_in.h>
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>
27#include <deal.II/numerics/data_out.h>
28#include <deal.II/numerics/vector_tools.h>
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>
43 using namespace dealii;
46 const unsigned int dim = 2;
47 const char bcs[4] = {
'D',
'N',
'D',
'N'};
53 virtual double value(
const Point<dim> &p,
const unsigned int component = 0)
const override
58 template <
typename number>
59 number
value(
const Point<dim, number> & ,
const unsigned int = 0)
const
69 virtual void vector_value(
const Point<dim> &p, Vector<double> &values)
const override
74 template <
typename number>
75 void vector_value(
const Point<dim, number> & , Vector<number> &values)
const
81 virtual double value(
const Point<dim> &p,
const unsigned int component = 0)
const override
86 template <
typename number>
87 number
value(
const Point<dim, number> & ,
const unsigned int component = 0)
const
95 template <
typename number>
96 void tensor_value(
const Point<dim, number> & , Tensor<1, dim, number> &values)
const
107 virtual double value(
const Point<dim> &p,
const unsigned int component = 0)
const override
112 template <
typename number>
113 number
value(
const Point<dim, number> & ,
const unsigned int = 0)
const
123 virtual double value(
const Point<dim> &p,
const unsigned int component = 0)
const override
128 template <
typename number>
129 number
value(
const Point<dim, number> &p,
const unsigned int = 0)
const
131 return number(1.) - number(2.) * exp(p[0]);
138 virtual double value(
const Point<dim> &p,
const unsigned int component = 0)
const override
142 template <
typename number>
143 double value(
const Point<dim, number> & p,
const unsigned int = 0)
const
145 return number(2.)*exp(p[1]) - number(1.);
152 virtual double value(
const Point<dim> &p,
const unsigned int component = 0)
const override
156 template <
typename number>
157 double value(
const Point<dim, number> & p,
const unsigned int = 0)
const
159 return number(2.)*exp(p[0]) - number(1.);
166 virtual double value(
const Point<dim> &p,
const unsigned int component = 0)
const override
171 template <
typename number>
172 number
value(
const Point<dim, number> &p,
const unsigned int = 0)
const
174 return number(2.)*exp(p[0]) * (number(2.)*exp(p[1]) - number(1.));
181 virtual double value(
const Point<dim> &p,
const unsigned int component = 0)
const override
186 template <
typename number>
187 number
value(
const Point<dim, number> &p,
const unsigned int = 0)
const
189 return number(2.)*exp(p[1]) * (number(2.)*exp(p[0]) - number(1.));
196 virtual double value(
const Point<dim> &p,
const unsigned int = 0)
const override
198 return (2.*exp(p[0]) - 1.)*(2.*exp(p[1]) - 1.);
201 virtual Tensor<1, dim>
gradient(
const Point<dim> &p,
const unsigned int = 0)
const override
203 Tensor<1, dim> result;
205 result[0] = 2.*exp(p[0]) * (2.*exp(p[1]) - 1.);
206 result[1] = 2.*exp(p[1]) * (2.*exp(p[0]) - 1.);
215 template <
int dim,
int fe_degree,
typename number>
217 :
public MatrixFreeOperators::
218 Base<dim, LinearAlgebra::distributed::Vector<number>>
236 return diffusion_coefficient;
241 return transport_coefficient;
246 return reaction_coefficient;
251 return forcing_term_coefficient;
255 virtual void apply_add(
256 LinearAlgebra::distributed::Vector<number> &dst,
257 const LinearAlgebra::distributed::Vector<number> &src)
const override;
260 local_apply(
const MatrixFree<dim, number> &data,
261 LinearAlgebra::distributed::Vector<number> &dst,
262 const LinearAlgebra::distributed::Vector<number> &src,
263 const std::pair<unsigned int, unsigned int> &cell_range)
const;
265 void local_compute_diagonal(
266 const MatrixFree<dim, number> &data,
267 LinearAlgebra::distributed::Vector<number> &dst,
268 const unsigned int &dummy,
269 const std::pair<unsigned int, unsigned int> &cell_range)
const;
271 Table<2, VectorizedArray<number>> diffusion_coefficient;
272 Table<2, Tensor<1, dim, VectorizedArray<number>>> transport_coefficient;
273 Table<2, VectorizedArray<number>> reaction_coefficient;
274 Table<2, VectorizedArray<number>> forcing_term_coefficient;
277 template <
int dim,
int degree_finite_element = 2>
282 DTRProblem(std::ofstream& dimension_time_file,
bool verbose =
true);
294 void run(
unsigned int n_initial_refinements = 3,
unsigned int n_cycles = 9);
297 unsigned int get_cells()
const {
return triangulation.n_global_active_cells(); }
298 unsigned int get_dofs()
const {
return dof_handler.n_dofs(); }
305 void output_results(
const unsigned int cycle)
const;
307#ifdef DEAL_II_WITH_P4EST
308 parallel::distributed::Triangulation<dim> triangulation;
310 Triangulation<dim> triangulation;
314 DoFHandler<dim> dof_handler;
317 MappingQ1<dim> mapping;
319 AffineConstraints<double> constraints;
320 using SystemMatrixType =
322 SystemMatrixType system_matrix;
324 MGConstrainedDoFs mg_constrained_dofs;
326 MGLevelObject<LevelMatrixType> mg_matrices;
328 LinearAlgebra::distributed::Vector<double> solution;
329 LinearAlgebra::distributed::Vector<double> lifting;
330 LinearAlgebra::distributed::Vector<double> system_rhs;
333 ConditionalOStream pcout;
334 ConditionalOStream time_details;
The DTROperation class implements the DTR linear operation needed at each iteration of the linear sol...
Definition DTR_mf.hpp:219
virtual void compute_diagonal() override
const Table< 2, Tensor< 1, dim, VectorizedArray< number > > > & get_transport_coefficient() const
Definition DTR_mf.hpp:239
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
Definition DTR_mf.hpp:234
number value_type
Definition DTR_mf.hpp:67
const Table< 2, VectorizedArray< number > > & get_forcing_term_coefficient() const
Definition DTR_mf.hpp:249
const Table< 2, VectorizedArray< number > > & get_reaction_coefficient() const
Definition DTR_mf.hpp:244
The DTRProblem class represents the DTR problem and provides methods to solve it.
Definition DTR_mf.hpp:279
DTRProblem(std::ofstream &dimension_time_file, bool verbose=true)
unsigned int get_cells() const
Definition DTR_mf.hpp:297
double compute_error(const VectorTools::NormType &norm_type) const
unsigned int get_dofs() const
Definition DTR_mf.hpp:298
DTRProblem(bool verbose=true)
void run(unsigned int n_initial_refinements=3, unsigned int n_cycles=9)
Compute the solution of the ADR problem. It executes the setup, rhs assembly, solve,...
unsigned int get_fe_degree() const
Definition DTR_mf.hpp:299
number value(const Point< dim, number > &, const unsigned int=0) const
Definition DTR_mf.hpp:59
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Definition DTR_mf.hpp:53
Definition DTR_mf.hpp:136
double value(const Point< dim, number > &p, const unsigned int=0) const
Definition DTR_mf.hpp:143
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Definition DTR_mf.hpp:138
Definition DTR_mf.hpp:150
double value(const Point< dim, number > &p, const unsigned int=0) const
Definition DTR_mf.hpp:157
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Definition DTR_mf.hpp:152
Definition DTR_mf.hpp:194
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int=0) const override
Definition DTR_mf.hpp:201
virtual double value(const Point< dim > &p, const unsigned int=0) const override
Definition DTR_mf.hpp:196
Definition DTR_mf.hpp:121
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Definition DTR_mf.hpp:123
number value(const Point< dim, number > &p, const unsigned int=0) const
Definition DTR_mf.hpp:129
Definition DTR_mf.hpp:164
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Definition DTR_mf.hpp:166
number value(const Point< dim, number > &p, const unsigned int=0) const
Definition DTR_mf.hpp:172
Definition DTR_mf.hpp:179
number value(const Point< dim, number > &p, const unsigned int=0) const
Definition DTR_mf.hpp:187
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Definition DTR_mf.hpp:181
Definition DTR_mf.hpp:105
number value(const Point< dim, number > &, const unsigned int=0) const
Definition DTR_mf.hpp:113
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Definition DTR_mf.hpp:107
number value(const Point< dim, number > &, const unsigned int component=0) const
Definition DTR_mf.hpp:87
virtual void vector_value(const Point< dim > &p, Vector< double > &values) const override
Definition DTR_mf.hpp:69
void vector_value(const Point< dim, number > &, Vector< number > &values) const
Definition DTR_mf.hpp:75
void tensor_value(const Point< dim, number > &, Tensor< 1, dim, number > &values) const
Definition DTR_mf.hpp:96
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
Definition DTR_mf.hpp:81
const std::string output_dir
Definition DTR_mf.hpp:41
const char bcs[4]
Definition DTR_mf.hpp:47
const unsigned int dim
Definition DTR_mf.hpp:48