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 : 26616 : std::map<size_t, Refinement_State>& data() { 19 : 26616 : 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 : 3132163 : 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 [ + - ]: 3132163 : ); 54 : : 55 [ + - ][ + - ]: 3132163 : master_elements.insert( std::pair<size_t, Refinement_State>(element_number, d)); 56 : : 57 : 6264326 : return element_number; 58 : : } 59 : : 60 : : /** 61 : : * @brief Add a master element, with a specified parent_id which is 62 : : * used to udpate the refinement_level 63 : : * 64 : : * @param element_number The element number to add 65 : : * @param refinement_case The refinement_case which gave rise to 66 : : * this element 67 : : * @param parent_id The id of the parent element 68 : : * 69 : : * @return The id of the added element 70 : : */ 71 : : size_t add( 72 : : size_t element_number, 73 : : Refinement_Case refinement_case, 74 : : size_t parent_id 75 : : ) 76 : : { 77 : : size_t refinement_level = 78 : : get(parent_id).refinement_level + 1; 79 : : 80 : : trace_out << "Refinement Level " << refinement_level << 81 : : std::endl; 82 : : 83 : : add(element_number, refinement_case, 84 : : refinement_level, parent_id); 85 : : 86 : : return element_number; 87 : : } 88 : : 89 : : /** 90 : : * @brief Accessor method to retrieve master element by element id 91 : : * 92 : : * @param id The element_id of the master_element to fetch 93 : : * 94 : : * @return The master_element which represents the corresponding tet 95 : : */ 96 : 8193036 : Refinement_State& get(size_t id) 97 : : { 98 : : // cppcheck-suppress assertWithSideEffect 99 [ - + ]: 8193036 : assert( exists(id) ); 100 : 8193036 : return master_elements.at(id); 101 : : } 102 : : 103 : 8836038 : const Refinement_State& get(size_t id) const 104 : : { 105 [ - + ]: 8836038 : assert( exists(id) ); 106 : 8836038 : return master_elements.at(id); 107 : : } 108 : : 109 : : /** 110 : : * @brief Function to check if master element entry exists. Useful 111 : : * for debugging access to invalid elements, or trying to re-create 112 : : * an element which already exists 113 : : * 114 : : * @param id Id to check 115 : : * 116 : : * @return Bool stating if the element already exists 117 : : */ 118 : 17029074 : bool exists(size_t id) const 119 : : { 120 [ + - ]: 17029074 : auto f = master_elements.find(id); 121 [ + - ]: 17029074 : if (f != master_elements.end()) 122 : : { 123 : : //trace_out << "master_elements " << id << " exists." << std::endl; 124 : 17029074 : return true; 125 : : } 126 : 0 : return false; 127 : : } 128 : : 129 : : /** 130 : : * @brief Getting function to access parent of a given ID 131 : : * 132 : : * @param id ID to find parent of 133 : : * 134 : : * @return ID of parent 135 : : */ 136 : 672 : size_t get_parent(size_t id) const 137 : : { 138 : 672 : return get(id).parent_id; 139 : : } 140 : : 141 : : /** 142 : : * @brief Getting function to find child id for a given parent 143 : : * 144 : : * @param parent_id ID of parent 145 : : * @param offset Offset into child list (i.e child number) 146 : : * 147 : : * @return ID of the child 148 : : */ 149 : 1541272 : size_t get_child_id(size_t parent_id, size_t offset) const 150 : : { 151 : : // cppcheck-suppress assertWithSideEffect 152 [ - + ]: 1541272 : assert(offset < get(parent_id).children.size()); 153 : 1541272 : return get(parent_id).children[offset]; 154 : : } 155 : : 156 : : /** 157 : : * @brief Wrapper function to calculate number of master elements 158 : : * 159 : : * @return total number of master elements 160 : : */ 161 : : size_t size() { 162 : : return master_elements.size(); 163 : : } 164 : : 165 : : /** 166 : : * @brief Add child to a given node, to track the relationship and 167 : : * allow graph traversal 168 : : * 169 : : * @param parent_id ID of the parent 170 : : * @param child_id ID of the child 171 : : */ 172 : 792886 : void add_child(size_t parent_id, size_t child_id) 173 : : { 174 : 792886 : get(parent_id).children.push_back(child_id); 175 : : 176 : : // cppcheck-suppress assertWithSideEffect 177 [ - + ]: 792886 : assert( get(parent_id).children.size() <= 8); 178 : 792886 : } 179 : : 180 : : /** 181 : : * @brief Remove id from master_element (relevant for 182 : : * de-refinement) 183 : : * 184 : : * @param id ID of element to remove 185 : : */ 186 : 324418 : void erase(size_t id) { 187 : 324418 : master_elements.erase(id); 188 : 324418 : } 189 : : 190 : : 191 : : }; 192 : : } 193 : : 194 : : #endif // guard