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>
45 using namespace dealii;
48 const unsigned int dim = 2;
61 template <
int dim,
int fe_degree,
typename number>
63 :
public MatrixFreeOperators::
64 Base<dim, LinearAlgebra::distributed::Vector<number>>
77 void clear()
override;
104 return diffusion_coefficient;
114 return transport_coefficient;
124 return reaction_coefficient;
134 return forcing_term_coefficient;
144 virtual void apply_add(
145 LinearAlgebra::distributed::Vector<number> &dst,
146 const LinearAlgebra::distributed::Vector<number> &src)
const override;
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;
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;
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;
190 template <
int dim,
int degree_finite_element = 2>
207 DTRProblem(std::ofstream& dimension_time_file,
bool verbose =
true);
220 void run(
unsigned int n_initial_refinements = 3,
unsigned int n_cycles = 9);
228 double compute_error(
const VectorTools::NormType &norm_type)
const;
235 unsigned int get_cells()
const {
return triangulation.n_global_active_cells(); }
242 unsigned int get_dofs()
const {
return dof_handler.n_dofs(); }
279 void output_results(
const unsigned int cycle)
const;
281#ifdef DEAL_II_WITH_P4EST
282 parallel::distributed::Triangulation<dim> triangulation;
284 Triangulation<dim> triangulation;
295 DoFHandler<dim> dof_handler;
300 MappingQ1<dim> mapping;
305 AffineConstraints<double> constraints;
310 using SystemMatrixType =
316 SystemMatrixType system_matrix;
321 MGConstrainedDoFs mg_constrained_dofs;
331 MGLevelObject<LevelMatrixType> mg_matrices;
336 LinearAlgebra::distributed::Vector<double> solution;
341 LinearAlgebra::distributed::Vector<double> lifting;
346 LinearAlgebra::distributed::Vector<double> system_rhs;
356 ConditionalOStream pcout;
361 ConditionalOStream time_details;
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
const unsigned int dim
Definition DTR_mf.hpp:48