| 137 | } |
| 138 | |
| 139 | void MshLoader::parse_elements(std::ifstream& fin) { |
| 140 | size_t num_elements; |
| 141 | fin >> num_elements; |
| 142 | |
| 143 | // Tmp storage of elements; |
| 144 | std::vector<int> triangle_element_idx; |
| 145 | std::vector<int> triangle_elements; |
| 146 | std::vector<int> quad_element_idx; |
| 147 | std::vector<int> quad_elements; |
| 148 | std::vector<int> tet_element_idx; |
| 149 | std::vector<int> tet_elements; |
| 150 | std::vector<int> hex_element_idx; |
| 151 | std::vector<int> hex_elements; |
| 152 | |
| 153 | auto get_element_storage = [&](int elem_type) -> std::vector<int>* { |
| 154 | switch (elem_type) { |
| 155 | case 2: |
| 156 | return &triangle_elements; |
| 157 | case 3: |
| 158 | return &quad_elements; |
| 159 | case 4: |
| 160 | return &tet_elements; |
| 161 | case 5: |
| 162 | return &hex_elements; |
| 163 | default: |
| 164 | throw IOError("Unsupported element type encountered"); |
| 165 | }; |
| 166 | }; |
| 167 | |
| 168 | auto get_element_idx_storage = [&](int elem_type) -> std::vector<int>* { |
| 169 | switch (elem_type) { |
| 170 | case 2: |
| 171 | return &triangle_element_idx; |
| 172 | case 3: |
| 173 | return &quad_element_idx; |
| 174 | case 4: |
| 175 | return &tet_element_idx; |
| 176 | case 5: |
| 177 | return &hex_element_idx; |
| 178 | default: |
| 179 | throw IOError("Unsupported element type encountered"); |
| 180 | }; |
| 181 | }; |
| 182 | |
| 183 | size_t nodes_per_element; |
| 184 | |
| 185 | if (m_binary) { |
| 186 | IOUtils::eat_white_space(fin); |
| 187 | int elem_read = 0; |
| 188 | while (elem_read < num_elements) { |
| 189 | // Parse element header. |
| 190 | int elem_type, num_elems, num_tags; |
| 191 | fin.read((char*)&elem_type, sizeof(int)); |
| 192 | fin.read((char*)&num_elems, sizeof(int)); |
| 193 | fin.read((char*)&num_tags, sizeof(int)); |
| 194 | nodes_per_element = num_nodes_per_elem_type(elem_type); |
| 195 | std::vector<int>& elements = *get_element_storage(elem_type); |
| 196 | std::vector<int>& element_idx = *get_element_idx_storage(elem_type); |