LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
codim_mesh_data_set.h
1#ifndef __bae24f2390174bff85f65c2c2e558a9e
2#define __bae24f2390174bff85f65c2c2e558a9e
3
4#include <boost/container/vector.hpp>
5#include <utility>
6
7#include "mesh_data_set.h"
8
9namespace lf::mesh::utils {
10
17template <class T>
18class CodimMeshDataSet : public MeshDataSet<T> {
19 public:
22
32 CodimMeshDataSet(std::shared_ptr<const Mesh> mesh, dim_t codim)
33 : MeshDataSet<T>(),
34 mesh_(std::move(mesh)),
35 data_(mesh_->NumEntities(codim)),
36 codim_(codim) {}
37
45 template <class = typename std::enable_if<
46 std::is_copy_constructible<T>::value>::type>
47 CodimMeshDataSet(std::shared_ptr<const Mesh> mesh, dim_t codim, T init)
48 : MeshDataSet<T>(),
49 mesh_(std::move(mesh)),
50 data_(mesh_->NumEntities(codim), init),
51 codim_(codim) {}
52
60 [[nodiscard]] T& operator()(const Entity& e) {
61 LF_ASSERT_MSG(DefinedOn(e), "MeshDataSet is not defined on this entity.");
62 return data_[mesh_->Index(e)];
63 }
64 // NOLINTNEXTLINE(readability-const-return-type)
65 [[nodiscard]] const T& operator()(const Entity& e) const override {
66 LF_ASSERT_MSG(DefinedOn(e), "MeshDataSet not defined on this entity.");
67 return data_[mesh_->Index(e)];
68 }
69 [[nodiscard]] bool DefinedOn(const Entity& e) const override {
70 return e.Codim() == codim_ && mesh_->Contains(e);
71 }
72
73 private:
75 std::shared_ptr<const Mesh> mesh_;
77 boost::container::vector<T> data_;
80};
81
91template <class T>
92std::shared_ptr<CodimMeshDataSet<T>> make_CodimMeshDataSet(
93 const std::shared_ptr<const lf::mesh::Mesh>& mesh, base::dim_t codim) {
94 using impl_t = CodimMeshDataSet<T>;
95 return std::shared_ptr<impl_t>(new impl_t(mesh, codim));
96}
97
106template <class T, class = typename std::enable_if<
107 std::is_copy_constructible<T>::value>::type>
108std::shared_ptr<CodimMeshDataSet<T>> make_CodimMeshDataSet(
109 const std::shared_ptr<const Mesh>& mesh, base::dim_t codim, T init) {
110 using impl_t = CodimMeshDataSet<T>;
111 return std::shared_ptr<impl_t>(new impl_t(mesh, codim, init));
112}
113
114} // namespace lf::mesh::utils
115
116#endif // __bae24f2390174bff85f65c2c2e558a9e
unsigned int dim_t
Definition: ref_el.h:129
Interface class representing a topological entity in a cellular complex
Definition: entity.h:39
virtual unsigned Codim() const =0
The codimension of this entity w.r.t. the Mesh.dimMesh() of the owning mesh manager.
lf::base::size_type size_type
A MeshDataSet that attaches data of type T to every entity of a mesh that has a specified codimension...
boost::container::vector< T > data_
CodimMeshDataSet(std::shared_ptr< const Mesh > mesh, dim_t codim, T init)
construct and initialize data vector indexed by entities of a particula co-dimension
bool DefinedOn(const Entity &e) const override
Does the dataset store information with this entity?
std::shared_ptr< const Mesh > mesh_
T & operator()(const Entity &e)
Get a (modifiable) reference to the data stored with entity e.
CodimMeshDataSet(std::shared_ptr< const Mesh > mesh, dim_t codim)
construct data vector indexed by entities of a particular co-dimension
const T & operator()(const Entity &e) const override
Get the data stored with entity e.
Interface that specifies how data is stored with an entity.
Definition: mesh_data_set.h:36
unsigned int dim_t
type for dimensions and co-dimensions and numbers derived from them
Definition: base.h:36
Contains helper functions and classes that all operate on the interface classes defined in lf::mesh.
std::shared_ptr< CodimMeshDataSet< T > > make_CodimMeshDataSet(const std::shared_ptr< const lf::mesh::Mesh > &mesh, base::dim_t codim)
Create a new CodimMeshDataSet that attaches data of type T with every entity with codimension codim....