1 #pragma once // Ensure that file is included only once in a single compilation.
25 template <
typename vectorT>
29 std::sort(x.begin(), x.end());
30 return (std::adjacent_find(x.begin(), x.end()) == x.end());
51 template <
unsigned int hyEdge_dim,
52 unsigned int space_dim,
53 template <
typename...>
56 typename hyEdge_index_t =
unsigned int,
57 typename hyNode_index_t = hyEdge_index_t,
58 typename pt_index_t = hyNode_index_t>
89 const hyEdge_index_t n_hyEdge,
90 const hyNode_index_t n_hyNode,
91 const pt_index_t n_point)
109 [&](std::array<hyNode_index_t, 2 * hyEdge_dim> hyEdge) {
110 for (unsigned int i = 0; i < hyEdge.size(); ++i)
112 consistent = (hyEdge[i] < n_hyNodes && hyEdge[i] >= 0);
113 hy_assert(consistent,
"At least one hypernode index is invalid!");
118 [&](std::array<pt_index_t, 1 << hyEdge_dim> hyEdge) {
119 for (unsigned int i = 0; i < hyEdge.size(); ++i)
121 consistent = (hyEdge[i] < n_points && hyEdge[i] >= 0);
122 hy_assert(consistent,
"At least one point index is invalid!");
165 template <
unsigned int hyEdge_dim,
166 unsigned int space_dim,
167 template <
typename...>
typename vectorT = std::vector,
169 typename hyEdge_index_t =
unsigned int,
170 typename hyNode_index_t = hyEdge_index_t,
171 typename pt_index_t = hyNode_index_t>
175 hy_assert(filename.substr(filename.size() - 4, filename.size()) ==
".geo",
176 "The given file needs to be a .geo file for this function to be applicable!");
178 std::ifstream infile(filename);
179 std::istringstream linestream;
180 std::string line, keyword, equal_sign;
182 unsigned int Space_Dim, HyperEdge_Dim;
183 pt_index_t N_Points = 0, pt_iter;
184 hyEdge_index_t N_HyperEdges = 0, hyEdge_iter;
185 hyNode_index_t N_HyperNodes = 0;
188 while (keyword !=
"Space_Dim" && std::getline(infile, line))
190 linestream = std::istringstream(line);
191 linestream >> keyword;
193 linestream >> equal_sign >> Space_Dim;
196 "The keyword Space_Dim has not been found in the file " << filename <<
"!");
197 hy_assert(equal_sign ==
"=",
"The keyword " << keyword <<
" has not been followd by = symbol!");
198 hy_assert(Space_Dim == space_dim,
"Space_Dim in " << filename <<
" is " << Space_Dim
199 <<
", but should be " << space_dim <<
"!");
201 while (keyword !=
"HyperEdge_Dim" && std::getline(infile, line))
203 linestream = std::istringstream(line);
204 linestream >> keyword;
206 linestream >> equal_sign >> HyperEdge_Dim;
209 "The keyword HyperEdge_Dim has not been found in the file " << filename <<
"!");
210 hy_assert(equal_sign ==
"=",
"The keyword " << keyword <<
" has not been followd by = symbol!");
211 hy_assert(HyperEdge_Dim == hyEdge_dim,
"HyperEdge_Dim in " << filename <<
" is " << Space_Dim
212 <<
", but should be " << hyEdge_dim
215 while (keyword !=
"N_Points" && std::getline(infile, line))
217 linestream = std::istringstream(line);
218 linestream >> keyword;
220 linestream >> equal_sign >> N_Points;
223 "The keyword N_Points has not been found in the file " << filename <<
"!");
224 hy_assert(equal_sign ==
"=",
"The keyword " << keyword <<
" has not been followd by = symbol!");
225 hy_assert(N_Points != 0,
"The value of N_Points has not been set correctly!");
227 while (keyword !=
"N_HyperNodes" && std::getline(infile, line))
229 linestream = std::istringstream(line);
230 linestream >> keyword;
232 linestream >> equal_sign >> N_HyperNodes;
235 "The keyword N_Points has not been found in the file " << filename <<
"!");
236 hy_assert(equal_sign ==
"=",
"The keyword " << keyword <<
" has not been followd by = symbol!");
237 hy_assert(N_HyperNodes != 0,
"The value of N_HyperNodes has not been set correctly!");
239 while (keyword !=
"N_HyperEdges" && std::getline(infile, line))
241 linestream = std::istringstream(line);
242 linestream >> keyword;
244 linestream >> equal_sign >> N_HyperEdges;
247 "The keyword N_Points has not been found in the file " << filename <<
"!");
248 hy_assert(equal_sign ==
"=",
"The keyword " << keyword <<
" has not been followd by = symbol!");
249 hy_assert(N_HyperEdges != 0,
"The value of N_HyperEdges has not been set correctly!");
252 domain_info(N_Points, N_HyperEdges, N_HyperNodes, N_Points);
254 while (keyword !=
"POINTS:" && std::getline(infile, line))
256 linestream = std::istringstream(line);
257 linestream >> keyword;
261 "The keyword 'POINTS:' has not been found in the file " << filename <<
"!");
263 for (pt_iter = 0; pt_iter < N_Points && std::getline(infile, line); ++pt_iter)
265 linestream = std::istringstream(line);
266 for (
unsigned int dim = 0; dim < space_dim; ++dim)
267 linestream >> pt[dim];
268 domain_info.
points[pt_iter] = pt;
271 hy_assert(pt_iter == N_Points,
"Not all points have been added to the list!");
273 while (keyword !=
"HYPERNODES_OF_HYPEREDGES:" && std::getline(infile, line))
275 linestream = std::istringstream(line);
276 linestream >> keyword;
280 keyword ==
"HYPERNODES_OF_HYPEREDGES:",
281 "The keyword 'HYPERNODES_OF_HYPEREDGES:' has not been found in the file " << filename <<
"!");
283 for (hyEdge_iter = 0; hyEdge_iter < N_HyperEdges && std::getline(infile, line); ++hyEdge_iter)
285 linestream = std::istringstream(line);
286 for (
unsigned int i = 0; i < domain_info.
hyNodes_hyEdge[hyEdge_iter].size(); ++i)
290 hy_assert(hyEdge_iter == N_HyperEdges,
"Not all hyperedges have been added to the list!");
292 while (keyword !=
"TYPES_OF_HYPERFACES:" && std::getline(infile, line))
294 linestream = std::istringstream(line);
295 linestream >> keyword;
299 keyword ==
"TYPES_OF_HYPERFACES:",
300 "The keyword 'TYPES_OF_HYPERFACES:' has not been found in the file " << filename <<
"!");
302 for (hyEdge_iter = 0; hyEdge_iter < N_HyperEdges && std::getline(infile, line); ++hyEdge_iter)
304 linestream = std::istringstream(line);
305 for (
unsigned int i = 0; i < domain_info.
hyFaces_hyEdge[hyEdge_iter].size(); ++i)
309 hy_assert(hyEdge_iter == N_HyperEdges,
"Not all hyperedges have been added to the list!");
311 while (keyword !=
"POINTS_OF_HYPEREDGES:" && std::getline(infile, line))
313 linestream = std::istringstream(line);
314 linestream >> keyword;
318 keyword ==
"POINTS_OF_HYPEREDGES:",
319 "The keyword 'POINTS_OF_HYPEREDGES:' has not been found in the file " << filename <<
"!");
321 for (hyEdge_iter = 0; hyEdge_iter < N_HyperEdges && std::getline(infile, line); ++hyEdge_iter)
323 linestream = std::istringstream(line);
324 for (
unsigned int i = 0; i < domain_info.
points_hyEdge[hyEdge_iter].size(); ++i)
328 hy_assert(hyEdge_iter == N_HyperEdges,
"Not all hyperedges have been added to the list!");
354 template <
unsigned int hyEdge_dim,
355 unsigned int space_dim,
356 template <
typename...>
typename vectorT = std::vector,
358 typename hyEdge_index_t =
unsigned int,
359 typename hyNode_index_t = hyEdge_index_t,
360 typename pt_index_t = hyNode_index_t>
364 hy_assert(std::filesystem::exists(filename),
"File does not exist.");
366 if (filename.substr(filename.size() - 4, filename.size()) ==
".pts")
368 hy_assert(hyEdge_dim == 1,
"This only works for graphs, so far!");
369 make_epsilon_neighborhood_graph<space_dim, vectorT, pointT, hyEdge_index_t>(filename);
372 hy_assert(filename.substr(filename.size() - 4, filename.size()) ==
".geo",
373 "The given file needs to be a .geo file, since no other input file types are currently"
377 domain_info =
read_domain_geo<hyEdge_dim, space_dim, vectorT, pointT, hyEdge_index_t,
378 hyNode_index_t, pt_index_t>(filename);
381 "Domain info appears to be inconsistent!"
383 <<
"This assertion is never to be thrown since it can only be caused by internal "
384 <<
"assertions of DomainInfo.check_consistency()!");