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

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/FEM/ldg.hh Source File
DiFfRG
ldg.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
17
18namespace DiFfRG
19{
20 namespace LDG
21 {
22 using namespace dealii;
23
30 template <typename Components_, typename NumberType_, typename Mesh_> class Discretization
31 {
32 public:
33 using Components = Components_;
34 using NumberType = NumberType_;
35 using VectorType = Vector<NumberType>;
36 using SparseMatrixType = BlockSparseMatrix<NumberType>;
37 using Mesh = Mesh_;
38 static constexpr uint dim = Mesh::dim;
39
41 {
42 static_assert(Components::count_fe_subsystems() > 1,
43 "LDG must have a defined submodel of the Model with index 1.");
44 for (uint i = 0; i < Components::count_fe_subsystems(); ++i) {
45 fe.emplace_back(std::make_shared<FESystem<dim>>(FE_DGQ<dim>(json.get_uint("/discretization/fe_order")),
46 Components::count_fe_functions(i)));
47 dof_handler.emplace_back(std::make_shared<DoFHandler<dim>>(mesh.get_triangulation()));
48 constraints.emplace_back();
49 }
50 setup_dofs();
51 };
52
53 const auto &get_constraints(const uint i = 0) const { return constraints[i]; }
54 auto &get_constraints(const uint i = 0)
55 {
56 (void)i;
57 return constraints[i];
58 }
59 const auto &get_dof_handler(const uint i = 0) const { return *(dof_handler[i]); }
60 auto &get_dof_handler(const uint i = 0) { return *(dof_handler[i]); }
61 const auto get_dof_handler_list() const
62 {
63 std::vector<const DoFHandler<dim> *> ret;
64 for (uint i = 0; i < Components::count_fe_subsystems(); ++i)
65 ret.push_back(&(get_dof_handler(i)));
66 return ret;
67 }
68 const auto &get_fe(uint i = 0) const { return *(fe[i]); }
69 const auto &get_mapping() const { return mapping; }
70 const auto &get_triangulation() const { return mesh.get_triangulation(); }
71 auto &get_triangulation() { return mesh.get_triangulation(); }
72 const Point<dim> &get_support_point(const uint &dof) const { return support_points[dof]; }
73 const auto &get_support_points() const { return support_points; }
74 const auto &get_json() const { return json; }
75
76 void reinit() { setup_dofs(); }
77
78 uint get_closest_dof(const Point<dim> &p) const
79 {
80 uint dof = 0;
81 double min_dist = std::numeric_limits<double>::max();
82 for (uint i = 0; i < support_points.size(); ++i) {
83 const auto dist = p.distance(support_points[i]);
84 if (dist < min_dist) {
85 min_dist = dist;
86 dof = i;
87 }
88 }
89 return dof;
90 }
91
92 std::vector<uint> get_block_structure() const
93 {
94 std::vector<uint> block_structure{dof_handler[0]->n_dofs()};
95 if (Components::count_variables() > 0) block_structure.push_back(Components::count_variables());
96 return block_structure;
97 }
98
99 protected:
101 {
102 spdlog::get("log")->info("FEM: Number of active cells: {}", mesh.get_triangulation().n_active_cells());
103
104 for (uint i = 0; i < Components::count_fe_subsystems(); ++i) {
105 dof_handler[i]->distribute_dofs(*(fe[i]));
106 DoFRenumbering::component_wise(*(dof_handler[i]));
107 constraints[i].clear();
108 DoFTools::make_hanging_node_constraints(*(dof_handler[i]), constraints[i]);
109 constraints[i].close();
110
111 if (i == 0) spdlog::get("log")->info("FEM: Number of degrees of freedom: {}", dof_handler[0]->n_dofs());
112 }
113
114 support_points.resize(dof_handler[0]->n_dofs());
115 DoFTools::map_dofs_to_support_points(mapping, *dof_handler[0], support_points);
116 }
117
120
121 std::vector<std::shared_ptr<FESystem<dim>>> fe;
122 std::vector<std::shared_ptr<DoFHandler<dim>>> dof_handler;
123 std::vector<AffineConstraints<NumberType>> constraints;
124 MappingQ1<dim> mapping;
125 std::vector<Point<dim>> support_points;
126 };
127 } // namespace LDG
128} // namespace DiFfRG
A wrapper around the boost json value class.
Definition json.hh:19
uint get_uint(const std::string &key) const
Get the value of a key in the json object.
Class to manage the system on which we solve, i.e. fe spaces, grids, etc. This class is a System for ...
Definition ldg.hh:31
uint get_closest_dof(const Point< dim > &p) const
Definition ldg.hh:78
const auto & get_constraints(const uint i=0) const
Definition ldg.hh:53
const auto & get_support_points() const
Definition ldg.hh:73
std::vector< uint > get_block_structure() const
Definition ldg.hh:92
NumberType_ NumberType
Definition ldg.hh:34
std::vector< std::shared_ptr< FESystem< dim > > > fe
Definition ldg.hh:121
Components_ Components
Definition ldg.hh:33
const auto get_dof_handler_list() const
Definition ldg.hh:61
Mesh_ Mesh
Definition ldg.hh:37
const auto & get_mapping() const
Definition ldg.hh:69
std::vector< Point< dim > > support_points
Definition ldg.hh:125
void setup_dofs()
Definition ldg.hh:100
void reinit()
Definition ldg.hh:76
static constexpr uint dim
Definition ldg.hh:38
const auto & get_json() const
Definition ldg.hh:74
const auto & get_dof_handler(const uint i=0) const
Definition ldg.hh:59
auto & get_dof_handler(const uint i=0)
Definition ldg.hh:60
const auto & get_triangulation() const
Definition ldg.hh:70
auto & get_triangulation()
Definition ldg.hh:71
std::vector< AffineConstraints< NumberType > > constraints
Definition ldg.hh:123
auto & get_constraints(const uint i=0)
Definition ldg.hh:54
const auto & get_fe(uint i=0) const
Definition ldg.hh:68
Vector< NumberType > VectorType
Definition ldg.hh:35
MappingQ1< dim > mapping
Definition ldg.hh:124
JSONValue json
Definition ldg.hh:119
Discretization(Mesh &mesh, const JSONValue &json)
Definition ldg.hh:40
BlockSparseMatrix< NumberType > SparseMatrixType
Definition ldg.hh:36
std::vector< std::shared_ptr< DoFHandler< dim > > > dof_handler
Definition ldg.hh:122
Mesh & mesh
Definition ldg.hh:118
const Point< dim > & get_support_point(const uint &dof) const
Definition ldg.hh:72
Definition complex_math.hh:10
unsigned int uint
Definition utils.hh:24