LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
product_dofhandler.cc
1#include "product_dofhandler.h"
2
3//----------------------------------------------
4// Implementation of ProductUniformFEDofHandler
5//-----------------------------------------------
6namespace projects::dpg {
7
9 std::shared_ptr<const lf::mesh::Mesh> mesh_p,
10 std::vector<dof_map_t> dofmaps)
11 : mesh_p_(std::move(mesh_p)), num_components_(dofmaps.size()) {
12 // check, that there local shape function layouts are actually specified
13 LF_ASSERT_MSG(num_components_ != 0, "dofmaps.size() = 0");
14
16 offsets_.resize(num_components_ + 1);
17 glb_idx_t offset = 0;
18
19 // initialize the component dof handlers from the specified local shape
20 // function layout for each of the components. Keep track of the offsets.
21 for (size_type component = 0; component < num_components_; ++component) {
22 component_dof_handlers_[component] =
23 std::make_shared<lf::assemble::UniformFEDofHandler>(mesh_p_,
24 dofmaps[component]);
25 offsets_[component] = offset;
26 offset += component_dof_handlers_[component]->NumDofs();
27 }
28 // offsets_[num_components_] = NoDofs()
29 offsets_[num_components_] = offset;
30
32}
33
35 // construct the index arrays based on the offsets, the component dofhandlers
36 // and the specified access pattern [codim][entity_idx][local_idx].
37 // iterate over all codimensions
38 for (int codim = 0; codim <= 2; codim++) {
39 dofs_[codim].resize(mesh_p_->NumEntities(codim));
40 internal_dofs_[codim].resize(mesh_p_->NumEntities(codim));
41 // iterate over all entities of a given codimension
42 for (glb_idx_t entity_idx = 0; entity_idx < mesh_p_->NumEntities(codim);
43 entity_idx++) {
44 // retrive entity of a certain index
45 const lf::mesh::Entity* entity_p{
46 mesh_p_->EntityByIndex(codim, entity_idx)};
47 // set up the index mapping using the component dofhandlers and
48 // the specified offsets:
49 for (size_type component = 0; component < num_components_; component++) {
50 // set up local dof indieces mapping
51 for (glb_idx_t gdof_idx :
52 component_dof_handlers_[component]->GlobalDofIndices(*entity_p)) {
53 dofs_[codim][entity_idx].push_back(gdof_idx + offsets_[component]);
54 }
55 // set up internal dof indices mapping:
56 for (glb_idx_t gdof_idx :
58 *entity_p)) {
59 internal_dofs_[codim][entity_idx].push_back(gdof_idx +
60 offsets_[component]);
61 }
62 }
63 }
64 }
65}
66
69}
70
72 return component_dof_handlers_[component]->NumDofs();
73}
74
76 const lf::mesh::Entity& entity) const {
77 const dim_t codim = 2 - entity.RefEl().Dimension();
78 const glb_idx_t entity_idx = mesh_p_->Index(entity);
79 size_type num_dofs = dofs_[codim][entity_idx].size();
80 return num_dofs;
81}
82
84 const lf::mesh::Entity& entity, size_type component) const {
85 return component_dof_handlers_[component]->NumLocalDofs(entity);
86}
87
89 const lf::mesh::Entity& entity) const {
90 const dim_t codim = 2 - entity.RefEl().Dimension();
91 const glb_idx_t entity_idx = mesh_p_->Index(entity);
92 size_type num_dofs = internal_dofs_[codim][entity_idx].size();
93 return num_dofs;
94}
95
97 const lf::mesh::Entity& entity, size_type component) const {
98 return component_dof_handlers_[component]->NumInteriorDofs(entity);
99}
100
102 const lf::mesh::Entity& entity) const {
103 const dim_t codim = 2 - entity.RefEl().Dimension();
104 const glb_idx_t entity_idx = mesh_p_->Index(entity);
105
106 const gdof_idx_t* begin = dofs_[codim][entity_idx].data();
107 const gdof_idx_t* end = begin + dofs_[codim][entity_idx].size();
108
109 return {begin, end};
110}
111
114 const lf::mesh::Entity& entity) const {
115 const dim_t codim = 2 - entity.RefEl().Dimension();
116 const glb_idx_t entity_idx = mesh_p_->Index(entity);
117
118 const gdof_idx_t* begin = internal_dofs_[codim][entity_idx].data();
119 const gdof_idx_t* end = begin + internal_dofs_[codim][entity_idx].size();
120 return {begin, end};
121}
122
123std::shared_ptr<const lf::mesh::Mesh> ProductUniformFEDofHandler::Mesh() const {
124 return mesh_p_;
125}
126
128 gdof_idx_t dofnum) const {
129 size_type component = Component(dofnum);
130 glb_idx_t offset = offsets_[component];
131 return component_dof_handlers_[component]->Entity(dofnum - offset);
132}
133
135 const lf::mesh::Entity& entity, size_type component) const {
136 size_type local_offset = 0;
137 for (size_type comp = 0; comp < component; comp++) {
138 local_offset += NumLocalDofs(entity, comp);
139 }
140 return local_offset;
141}
142
144 LF_ASSERT_MSG(dofnum < NumDofs(), "invalid global index (out of bounds)");
145 // iterate through compont offsets:
146 for (size_type component = 0; component < num_components_; component++) {
147 if (offsets_[component + 1] > dofnum) {
148 return component;
149 }
150 }
151 LF_ASSERT_MSG(false, "invalid dof number ");
152 return 0;
153}
154
155} // namespace projects::dpg
constexpr dim_t Dimension() const
Return the dimension of this reference element.
Definition: ref_el.h:201
Interface class representing a topological entity in a cellular complex
Definition: entity.h:39
virtual base::RefEl RefEl() const =0
Describes the reference element type of this entity.
size_type NumLocalDofs(const lf::mesh::Entity &entity) const override
tells the number of degrees of freedom subordinate/_belonging_ to to an entity
std::array< std::vector< std::vector< gdof_idx_t > >, 3 > dofs_
size_type NumInteriorDofs(const lf::mesh::Entity &entity) const override
provides number of shape functions associated with an entity
std::shared_ptr< const lf::mesh::Mesh > Mesh() const override
Acess to underlying mesh object.
nonstd::span< const gdof_idx_t > GlobalDofIndices(const lf::mesh::Entity &entity) const override
access to indices of global dof's belonging to an entity
std::vector< std::shared_ptr< lf::assemble::UniformFEDofHandler > > component_dof_handlers_
const lf::mesh::Entity & Entity(gdof_idx_t dofnum) const override
retrieve unique entity at which a basis function is located
void initIndexArrays()
initialization of internal index arrays.
size_type Component(glb_idx_t dofnum) const
retrive the unique index of the component to which a global basis function belongs.
nonstd::span< const gdof_idx_t > InteriorGlobalDofIndices(const lf::mesh::Entity &entity) const override
global indices of shape functions associated with an entity_
std::shared_ptr< const lf::mesh::Mesh > mesh_p_
ldof_idx_t LocalStartIndex(const lf::mesh::Entity &entity, size_type component) const
Returns the first/smallest index of a local shape functions that is associated/subordinate and that b...
ProductUniformFEDofHandler(std::shared_ptr< const lf::mesh::Mesh > mesh_p, std::vector< dof_map_t > dofmaps)
Construction from a vector of map objects.
Contains functionality for the implementation of DPG methods.
Definition: primal_dpg.h:33
lf::uscalfe::gdof_idx_t gdof_idx_t
Type for indices into global matrices/vectors.
Definition: dpg.h:11
lf::uscalfe::dim_t dim_t
Tpe for (co)-dimensions.
Definition: dpg.h:20
lf::uscalfe::ldof_idx_t ldof_idx_t
Type for indices referring to entity matrices/vectors.
Definition: dpg.h:14
lf::uscalfe::size_type size_type
Type for vector length/matrix sizes.
Definition: dpg.h:17
lf::uscalfe::glb_idx_t glb_idx_t
Type for global index of entities.
Definition: dpg.h:23