65 MeshLib::Mesh const& mesh, std::vector<int>
const& vec_fracture_mat_IDs,
66 std::vector<std::vector<MeshLib::Node*>>
const& vec_fracture_nodes,
67 std::vector<std::vector<MeshLib::Element*>>& intersected_fracture_elements,
68 std::vector<std::pair<std::size_t, std::vector<int>>>&
69 vec_branch_nodeID_matIDs,
70 std::vector<std::pair<std::size_t, std::vector<int>>>&
71 vec_junction_nodeID_matIDs)
73 auto const n_fractures = vec_fracture_mat_IDs.size();
74 std::map<unsigned, unsigned> matID_to_fid;
75 for (
unsigned i = 0; i < n_fractures; i++)
77 matID_to_fid[vec_fracture_mat_IDs[i]] = i;
81 std::vector<std::size_t> all_fracture_nodes;
82 for (
auto& vec : vec_fracture_nodes)
84 transform(cbegin(vec), cend(vec), back_inserter(all_fracture_nodes),
85 [](
auto*
const n) {
return n->getID(); });
89 std::map<std::size_t, std::vector<std::size_t>> frac_nodeID_to_matIDs;
90 for (
unsigned i = 0; i < n_fractures; i++)
92 for (
auto* node : vec_fracture_nodes[i])
94 frac_nodeID_to_matIDs[node->getID()].push_back(
95 vec_fracture_mat_IDs[i]);
102 intersected_fracture_elements.resize(n_fractures);
103 for (
auto frac_nodeID_to_matID : frac_nodeID_to_matIDs)
105 auto nodeID = frac_nodeID_to_matID.first;
106 auto const* node = mesh.
getNode(frac_nodeID_to_matID.first);
107 auto const& matIDs = frac_nodeID_to_matID.second;
108 if (matIDs.size() < 2)
113 auto const elements_connected_to_node =
115 std::vector<MeshLib::Element*> conn_fracture_elements;
117 for (
auto const* e : elements_connected_to_node)
121 conn_fracture_elements.push_back(
127 std::map<int, int> vec_matID_counts;
129 for (
auto matid : matIDs)
131 vec_matID_counts[matid] = 0;
134 for (
auto const* e : conn_fracture_elements)
136 auto matid = (*opt_material_ids)[e->getID()];
137 vec_matID_counts[matid]++;
141 for (
auto matid : matIDs)
143 auto fid = matID_to_fid[matid];
144 for (
auto* e : conn_fracture_elements)
146 auto e_matid = (*opt_material_ids)[e->getID()];
147 if (matID_to_fid[e_matid] != fid)
149 intersected_fracture_elements[fid].push_back(e);
154 bool isBranch =
false;
156 for (
auto vec_matID_count : vec_matID_counts)
158 auto count = vec_matID_count.second;
169 std::vector<int> branch_matIDs(2);
170 for (
auto vec_matID_count : vec_matID_counts)
172 auto matid = vec_matID_count.first;
173 auto count = vec_matID_count.second;
176 branch_matIDs[0] = matid;
180 branch_matIDs[1] = matid;
183 vec_branch_nodeID_matIDs.emplace_back(nodeID, branch_matIDs);
187 std::vector<int> junction_matIDs(2);
188 junction_matIDs[0] = std::min(vec_matID_counts.begin()->first,
189 vec_matID_counts.rbegin()->first);
190 junction_matIDs[1] = std::max(vec_matID_counts.begin()->first,
191 vec_matID_counts.rbegin()->first);
192 vec_junction_nodeID_matIDs.emplace_back(nodeID, junction_matIDs);
196 for (
auto& elements : intersected_fracture_elements)
201 DBUG(
"-> found {:d} branches and {:d} junctions",
202 vec_branch_nodeID_matIDs.size(), vec_junction_nodeID_matIDs.size());