Branch data Line data Source code
1 : : #ifndef AMR_master_element_store_h
2 : : #define AMR_master_element_store_h
3 : :
4 : : #include <map>
5 : : #include <algorithm>
6 : : #include <cassert>
7 : :
8 : : #include "Refinement_State.hpp"
9 : : #include "AMR/Loggers.hpp" // for trace_out
10 : :
11 : : namespace AMR {
12 : :
13 : : class master_element_store_t {
14 : : private:
15 : : std::map<size_t, Refinement_State> master_elements;
16 : : public:
17 : : //! Non-const-ref access to state
18 : 13616 : std::map<size_t, Refinement_State>& data() {
19 : 13616 : return master_elements;
20 : : }
21 : :
22 : : /**
23 : : * @brief Add an element to the master element list.
24 : : *
25 : : * @param element_number The element number to add (currently
26 : : * somewhat redundant?)
27 : : * @param refinement_case The refinement_case which gave rise to
28 : : * this element
29 : : * @param refinement_level The level of refinement
30 : : * @param parent_id The id of the parent element
31 : : * @param has_parent True if element has a parent, default is true
32 : : *
33 : : * @return The id of the added element
34 : : */
35 : : // TODO: These add methods could probably be much tidier. The
36 : : // current none reliance on default input values is nice, as it
37 : : // means that we don't have to do any checks on if a valid value
38 : : // was passed for the base case..
39 : 1200605 : size_t add(
40 : : size_t element_number,
41 : : Refinement_Case refinement_case,
42 : : size_t refinement_level,
43 : : size_t parent_id,
44 : : bool has_parent=true
45 : : )
46 : : {
47 : : Refinement_State d = Refinement_State(
48 : : element_number,
49 : : refinement_case,
50 : : refinement_level,
51 : : parent_id,
52 : : has_parent
53 [ + - ]: 1200605 : );
54 : :
55 [ + - ][ + - ]: 1200605 : master_elements.insert( std::pair<size_t, Refinement_State>(element_number, d));
56 : :
57 : 1200605 : return element_number;
58 : 1200605 : }
59 : :
60 : : /**
61 : : * @brief Accessor method to retrieve master element by element id
62 : : *
63 : : * @param id The element_id of the master_element to fetch
64 : : *
65 : : * @return The master_element which represents the corresponding tet
66 : : */
67 : 1041268 : Refinement_State& get(size_t id)
68 : : {
69 : : // cppcheck-suppress assertWithSideEffect
70 [ - + ]: 1041268 : assert( exists(id) );
71 : 1041268 : return master_elements.at(id);
72 : : }
73 : :
74 : 685376 : const Refinement_State& get(size_t id) const
75 : : {
76 [ - + ]: 685376 : assert( exists(id) );
77 : 685376 : return master_elements.at(id);
78 : : }
79 : :
80 : : /**
81 : : * @brief Function to check if master element entry exists. Useful
82 : : * for debugging access to invalid elements, or trying to re-create
83 : : * an element which already exists
84 : : *
85 : : * @param id Id to check
86 : : *
87 : : * @return Bool stating if the element already exists
88 : : */
89 : 1726644 : bool exists(size_t id) const
90 : : {
91 [ + - ]: 1726644 : auto f = master_elements.find(id);
92 [ + - ]: 1726644 : if (f != master_elements.end())
93 : : {
94 : : //trace_out << "master_elements " << id << " exists." << std::endl;
95 : 1726644 : return true;
96 : : }
97 : 0 : return false;
98 : : }
99 : :
100 : : /**
101 : : * @brief Getting function to access parent of a given ID
102 : : *
103 : : * @param id ID to find parent of
104 : : *
105 : : * @return ID of parent
106 : : */
107 : 0 : size_t get_parent(size_t id) const
108 : : {
109 : 0 : return get(id).parent_id;
110 : : }
111 : :
112 : : /**
113 : : * @brief Getting function to find child id for a given parent
114 : : *
115 : : * @param parent_id ID of parent
116 : : * @param offset Offset into child list (i.e child number)
117 : : *
118 : : * @return ID of the child
119 : : */
120 : 136844 : size_t get_child_id(size_t parent_id, size_t offset) const
121 : : {
122 : : // cppcheck-suppress assertWithSideEffect
123 [ - + ]: 136844 : assert(offset < get(parent_id).children.size());
124 : 136844 : return get(parent_id).children[offset];
125 : : }
126 : :
127 : : /**
128 : : * @brief Wrapper function to calculate number of master elements
129 : : *
130 : : * @return total number of master elements
131 : : */
132 : : size_t size() {
133 : : return master_elements.size();
134 : : }
135 : :
136 : : /**
137 : : * @brief Add child to a given node, to track the relationship and
138 : : * allow graph traversal
139 : : *
140 : : * @param parent_id ID of the parent
141 : : * @param child_id ID of the child
142 : : */
143 : 112028 : void add_child(size_t parent_id, size_t child_id)
144 : : {
145 : 112028 : get(parent_id).children.push_back(child_id);
146 : :
147 : : // cppcheck-suppress assertWithSideEffect
148 [ - + ]: 112028 : assert( get(parent_id).children.size() <= 8);
149 : 112028 : }
150 : :
151 : : /**
152 : : * @brief Remove id from master_element (relevant for
153 : : * de-refinement)
154 : : *
155 : : * @param id ID of element to remove
156 : : */
157 : 48756 : void erase(size_t id) {
158 : 48756 : master_elements.erase(id);
159 : 48756 : }
160 : :
161 : :
162 : : };
163 : : }
164 : :
165 : : #endif // guard
|