Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
SimplexChild.h
Go to the documentation of this file.
1/* This file is part of MoDELib, distributed under GNU GPL v2. */
2#ifndef model_SimplexChild_H_
3#define model_SimplexChild_H_
4#include <memory>
5#include <map>
6#include <set>
7#include <SimplexTraits.h>
8#include <BoundarySimplex.h>
9namespace model
10{
11 template <short int dim, short int order> class SimplexChild
12 {
13 public:
17 using ParentContainerType = std::map<ParentSimplexIDType, std::shared_ptr<ParentSimplexType>>;
18 using ParentLinks = std::map<ParentSimplexIDType, std::weak_ptr<ParentSimplexType>>;
20 std::map<typename SimplexTraits<dim, order>::SimplexIDType, std::shared_ptr<SimplexType>>;
21
22 private:
23 ParentLinks parentLinks_;
24
25 public:
26 void addParent(const std::shared_ptr<ParentSimplexType> &parent)
27 {
28 const auto found = parentLinks_.find(parent->xID);
29 if (found != parentLinks_.end())
30 {
31 if (const auto existing = found->second.lock(); existing && existing != parent)
32 {
33 throw std::runtime_error("Conflicting simplex parent identity");
34 }
35 }
36 parentLinks_.insert_or_assign(parent->xID, parent);
37 }
38 const ParentLinks &parentLinks() const
39 {
40 return parentLinks_;
41 }
42 // A temporary locked view; expired entries never affect topology queries.
44 {
46 for (const auto &entry : parentLinks_)
47 {
48 if (const auto parent = entry.second.lock())
49 {
50 result.emplace(entry.first, parent);
51 }
52 }
53 return result;
54 }
56 {
58 for (const auto &parent : parents())
59 {
60 for (const auto &child : parent.second->children())
61 {
62 result.emplace(child->xID, child);
63 }
64 }
65 return result;
66 }
75 bool isInRegion(const size_t &id) const
76 {
77 return regionIDs().count(id) != 0;
78 }
79 std::set<size_t> regionIDs() const
80 {
81 std::set<size_t> result;
82 for (const auto &parent : parents())
83 {
84 const auto ids = parent.second->regionIDs();
85 result.insert(ids.begin(), ids.end());
86 }
87 return result;
88 }
89 };
90} // namespace model
91#endif
ParentContainerType parents() const
std::map< ParentSimplexIDType, std::shared_ptr< ParentSimplexType > > ParentContainerType
SiblingsContainerType siblings() const
typename SimplexTraits< dim, order >::SimplexType SimplexType
void addParent(const std::shared_ptr< ParentSimplexType > &parent)
typename SimplexTraits< dim, order+1 >::SimplexIDType ParentSimplexIDType
bool isBoundarySimplex() const
bool isRegionBoundarySimplex() const
const ParentLinks & parentLinks() const
std::map< ParentSimplexIDType, std::weak_ptr< ParentSimplexType > > ParentLinks
typename SimplexTraits< dim, order+1 >::SimplexType ParentSimplexType
std::set< size_t > regionIDs() const
std::map< typename SimplexTraits< dim, order >::SimplexIDType, std::shared_ptr< SimplexType > > SiblingsContainerType
bool isInRegion(const size_t &id) const
static bool isBoundarySimplex(const SimplexChild< dim, dim-dmo > &simplexChild)
static bool isRegionBoundarySimplex(const SimplexChild< dim, dim-dmo > &simplexChild)
Simplex< dim, order > SimplexType
SimplexID< nVertices > SimplexIDType
int parent
result