/home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/FEM/dg.hh Source File#

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/FEM/dg.hh Source File
DiFfRG
dg.hh
Go to the documentation of this file.
1#pragma once
2
3// external libraries
4#include <deal.II/base/point.h>
5#include <deal.II/dofs/dof_handler.h>
6// #include <deal.II/dofs/dof_renumbering.h>
7#include <deal.II/dofs/dof_tools.h>
8#include <deal.II/fe/fe_dgq.h>
9#include <deal.II/fe/fe_system.h>
10#include <deal.II/fe/mapping_q1.h>
11#include <deal.II/lac/affine_constraints.h>
12
13// DiFfRG
18
19namespace DiFfRG
20{
21 namespace DG
22 {
23 using namespace dealii;
24
31 template <typename Components_, typename NumberType_, typename Mesh_> class Discretization
32 {
33 public:
34 using Components = Components_;
35 using NumberType = NumberType_;
36 using VectorType = Vector<NumberType>;
37 using SparseMatrixType = SparseMatrix<NumberType>;
38 using Mesh = Mesh_;
39 static constexpr uint dim = Mesh::dim;
40
42 : mesh(mesh), json(json),
43 fe(std::make_shared<FESystem<dim>>(FE_DGQ<dim>(json.get_uint("/discretization/fe_order")),
44 Components::count_fe_functions(0))),
46 {
47 setup_dofs();
48 };
49
50 const auto &get_constraints(const uint i = 0) const
51 {
52 (void)i;
53 return constraints;
54 }
55 auto &get_constraints(const uint i = 0)
56 {
57 (void)i;
58 return constraints;
59 }
60 const auto &get_dof_handler(const uint i = 0) const
61 {
62 (void)i;
63 return dof_handler;
64 }
65 auto &get_dof_handler(const uint i = 0)
66 {
67 (void)i;
68 return dof_handler;
69 }
70 const auto &get_fe(uint i = 0) const
71 {
72 if (i != 0) throw std::runtime_error("Wrong FE index");
73 return *fe;
74 }
75 const auto &get_mapping() const { return mapping; }
76 const auto &get_triangulation() const { return mesh.get_triangulation(); }
77 auto &get_triangulation() { return mesh.get_triangulation(); }
78 const Point<dim> &get_support_point(const uint &dof) const { return support_points[dof]; }
79 const auto &get_support_points() const { return support_points; }
80 const auto &get_json() const { return json; }
81
82 void reinit() { setup_dofs(); }
83
84 uint get_closest_dof(const Point<dim> &p) const
85 {
86 uint dof = 0;
87 double min_dist = std::numeric_limits<double>::max();
88 for (uint i = 0; i < support_points.size(); ++i) {
89 const auto dist = p.distance(support_points[i]);
90 if (dist < min_dist) {
91 min_dist = dist;
92 dof = i;
93 }
94 }
95 return dof;
96 }
97
98 std::vector<uint> get_block_structure() const
99 {
100 std::vector<uint> block_structure{dof_handler.n_dofs()};
101 if (Components::count_variables() > 0) block_structure.push_back(Components::count_variables());
102 return block_structure;
103 }
104
105 protected:
107 {
108 dof_handler.distribute_dofs(*fe);
109
110 spdlog::get("log")->info("FEM: Number of active cells: {}", mesh.get_triangulation().n_active_cells());
111 spdlog::get("log")->info("FEM: Number of degrees of freedom: {}", dof_handler.n_dofs());
112
113 constraints.clear();
114 DoFTools::make_hanging_node_constraints(dof_handler, constraints);
115 constraints.close();
116
117 support_points.resize(dof_handler.n_dofs());
118 DoFTools::map_dofs_to_support_points(mapping, dof_handler, support_points);
119 }
120
123
124 std::shared_ptr<FESystem<dim>> fe;
125 DoFHandler<dim> dof_handler;
126 AffineConstraints<NumberType> constraints;
127 MappingQ1<dim> mapping;
128 std::vector<Point<dim>> support_points;
129 };
130 } // namespace DG
131} // namespace DiFfRG
Class to manage the system on which we solve, i.e. fe spaces, grids, etc. This class is a System for ...
Definition dg.hh:32
static constexpr uint dim
Definition dg.hh:39
AffineConstraints< NumberType > constraints
Definition dg.hh:126
DoFHandler< dim > dof_handler
Definition dg.hh:125
std::shared_ptr< FESystem< dim > > fe
Definition dg.hh:124
const auto & get_triangulation() const
Definition dg.hh:76
auto & get_constraints(const uint i=0)
Definition dg.hh:55
Mesh_ Mesh
Definition dg.hh:38
std::vector< Point< dim > > support_points
Definition dg.hh:128
void setup_dofs()
Definition dg.hh:106
SparseMatrix< NumberType > SparseMatrixType
Definition dg.hh:37
Vector< NumberType > VectorType
Definition dg.hh:36
const auto & get_fe(uint i=0) const
Definition dg.hh:70
Discretization(Mesh &mesh, const JSONValue &json)
Definition dg.hh:41
const auto & get_constraints(const uint i=0) const
Definition dg.hh:50
void reinit()
Definition dg.hh:82
const auto & get_dof_handler(const uint i=0) const
Definition dg.hh:60
const auto & get_mapping() const
Definition dg.hh:75
NumberType_ NumberType
Definition dg.hh:35
auto & get_triangulation()
Definition dg.hh:77
const auto & get_json() const
Definition dg.hh:80
const Point< dim > & get_support_point(const uint &dof) const
Definition dg.hh:78
uint get_closest_dof(const Point< dim > &p) const
Definition dg.hh:84
auto & get_dof_handler(const uint i=0)
Definition dg.hh:65
const auto & get_support_points() const
Definition dg.hh:79
std::vector< uint > get_block_structure() const
Definition dg.hh:98
MappingQ1< dim > mapping
Definition dg.hh:127
Components_ Components
Definition dg.hh:34
Mesh & mesh
Definition dg.hh:121
JSONValue json
Definition dg.hh:122
A wrapper around the boost json value class.
Definition json.hh:19
Definition complex_math.hh:10
unsigned int uint
Definition utils.hh:24