32 : _mesh(mesh), _fracture_element_dim(_mesh.
getDimension() - 1)
34 _is_internal_node.resize(_mesh.getNumberOfNodes(),
true);
40 _is_internal_node[i] =
false;
46 if (!_is_internal_node[node.
getID()] ||
47 !
isBaseNode(node, _mesh.getElementsConnectedToNode(node)))
52 auto const elements_connected_to_node =
53 _mesh.getElementsConnectedToNode(node);
54 auto const n_connected_fracture_elements =
55 count_if(cbegin(elements_connected_to_node),
56 cend(elements_connected_to_node),
58 {
return e->getDimension() == _fracture_element_dim; });
59 assert(n_connected_fracture_elements > 0);
61 return (n_connected_fracture_elements == 1);
71 MeshLib::Mesh const& mesh, std::vector<int>
const& vec_fracture_mat_IDs,
72 std::vector<std::vector<MeshLib::Node*>>
const& vec_fracture_nodes,
73 std::vector<std::vector<MeshLib::Element*>>& intersected_fracture_elements,
74 std::vector<std::pair<std::size_t, std::vector<int>>>&
75 vec_branch_nodeID_matIDs,
76 std::vector<std::pair<std::size_t, std::vector<int>>>&
77 vec_junction_nodeID_matIDs)
79 auto const n_fractures = vec_fracture_mat_IDs.size();
80 std::map<unsigned, unsigned> matID_to_fid;
81 for (
unsigned i = 0; i < n_fractures; i++)
83 matID_to_fid[vec_fracture_mat_IDs[i]] = i;
87 std::vector<std::size_t> all_fracture_nodes;
88 for (
auto& vec : vec_fracture_nodes)
90 transform(cbegin(vec), cend(vec), back_inserter(all_fracture_nodes),
91 [](
auto*
const n) {
return n->getID(); });
95 std::map<std::size_t, std::vector<std::size_t>> frac_nodeID_to_matIDs;
96 for (
unsigned i = 0; i < n_fractures; i++)
98 for (
auto* node : vec_fracture_nodes[i])
100 frac_nodeID_to_matIDs[node->getID()].push_back(
101 vec_fracture_mat_IDs[i]);
108 intersected_fracture_elements.resize(n_fractures);
109 for (
auto frac_nodeID_to_matID : frac_nodeID_to_matIDs)
111 auto nodeID = frac_nodeID_to_matID.first;
112 auto const* node = mesh.
getNode(frac_nodeID_to_matID.first);
113 auto const& matIDs = frac_nodeID_to_matID.second;
114 if (matIDs.size() < 2)
119 auto const elements_connected_to_node =
121 std::vector<MeshLib::Element*> conn_fracture_elements;
123 for (
auto const* e : elements_connected_to_node)
127 conn_fracture_elements.push_back(
133 std::map<int, int> vec_matID_counts;
135 for (
auto matid : matIDs)
137 vec_matID_counts[matid] = 0;
140 for (
auto const* e : conn_fracture_elements)
142 auto matid = (*opt_material_ids)[e->getID()];
143 vec_matID_counts[matid]++;
147 for (
auto matid : matIDs)
149 auto fid = matID_to_fid[matid];
150 for (
auto* e : conn_fracture_elements)
152 auto e_matid = (*opt_material_ids)[e->getID()];
153 if (matID_to_fid[e_matid] != fid)
155 intersected_fracture_elements[fid].push_back(e);
160 bool isBranch =
false;
162 for (
auto vec_matID_count : vec_matID_counts)
164 auto count = vec_matID_count.second;
175 std::vector<int> branch_matIDs(2);
176 for (
auto vec_matID_count : vec_matID_counts)
178 auto matid = vec_matID_count.first;
179 auto count = vec_matID_count.second;
182 branch_matIDs[0] = matid;
186 branch_matIDs[1] = matid;
189 vec_branch_nodeID_matIDs.emplace_back(nodeID, branch_matIDs);
193 std::vector<int> junction_matIDs(2);
194 junction_matIDs[0] = std::min(vec_matID_counts.begin()->first,
195 vec_matID_counts.rbegin()->first);
196 junction_matIDs[1] = std::max(vec_matID_counts.begin()->first,
197 vec_matID_counts.rbegin()->first);
198 vec_junction_nodeID_matIDs.emplace_back(nodeID, junction_matIDs);
202 for (
auto& elements : intersected_fracture_elements)
207 DBUG(
"-> found {:d} branches and {:d} junctions",
208 vec_branch_nodeID_matIDs.size(), vec_junction_nodeID_matIDs.size());
215 std::vector<MeshLib::Element*>& vec_matrix_elements,
216 std::vector<int>& vec_fracture_mat_IDs,
217 std::vector<std::vector<MeshLib::Element*>>& vec_fracture_elements,
218 std::vector<std::vector<MeshLib::Element*>>& vec_fracture_matrix_elements,
219 std::vector<std::vector<MeshLib::Node*>>& vec_fracture_nodes,
220 std::vector<std::pair<std::size_t, std::vector<int>>>&
221 vec_branch_nodeID_matIDs,
222 std::vector<std::pair<std::size_t, std::vector<int>>>&
223 vec_junction_nodeID_matIDs)
225 IsCrackTip isCrackTip(mesh);
229 std::vector<MeshLib::Element*> all_fracture_elements;
234 vec_matrix_elements.push_back(e);
238 all_fracture_elements.push_back(e);
241 DBUG(
"-> found total {:d} matrix elements and {:d} fracture elements",
242 vec_matrix_elements.size(), all_fracture_elements.size());
248 OGS_FATAL(
"Could not access MaterialIDs property from mesh.");
250 transform(cbegin(all_fracture_elements), cend(all_fracture_elements),
251 back_inserter(vec_fracture_mat_IDs),
252 [&material_ids](
auto const* e)
253 {
return (*material_ids)[e->getID()]; });
256 DBUG(
"-> found {:d} fracture material groups", vec_fracture_mat_IDs.size());
259 vec_fracture_elements.resize(vec_fracture_mat_IDs.size());
260 for (
unsigned frac_id = 0; frac_id < vec_fracture_mat_IDs.size(); frac_id++)
262 const auto frac_mat_id = vec_fracture_mat_IDs[frac_id];
263 std::vector<MeshLib::Element*>& vec_elements =
264 vec_fracture_elements[frac_id];
265 std::copy_if(all_fracture_elements.begin(), all_fracture_elements.end(),
266 std::back_inserter(vec_elements),
268 { return (*material_ids)[e->getID()] == frac_mat_id; });
269 DBUG(
"-> found {:d} elements on the fracture {:d}", vec_elements.size(),
274 vec_fracture_nodes.resize(vec_fracture_mat_IDs.size());
275 for (
unsigned frac_id = 0; frac_id < vec_fracture_mat_IDs.size(); frac_id++)
277 std::vector<MeshLib::Node*>& vec_nodes = vec_fracture_nodes[frac_id];
280 for (
unsigned i = 0; i < e->getNumberOfNodes(); i++)
282 if (isCrackTip(*e->getNode(i)))
286 vec_nodes.push_back(
const_cast<MeshLib::Node*
>(e->getNode(i)));
292 DBUG(
"-> found {:d} nodes on the fracture {:d}", vec_nodes.size(),
297 std::vector<std::vector<MeshLib::Element*>> intersected_fracture_elements;
299 intersected_fracture_elements,
300 vec_branch_nodeID_matIDs,
301 vec_junction_nodeID_matIDs);
305 for (
unsigned fid = 0; fid < vec_fracture_elements.size(); fid++)
307 auto const& fracture_elements = vec_fracture_elements[fid];
308 std::vector<MeshLib::Element*> vec_ele;
314 for (
unsigned i = 0; i < e->getNumberOfBaseNodes(); i++)
317 if (isCrackTip(*node))
321 auto const& elements_connected_to_node =
323 for (
unsigned j = 0; j < elements_connected_to_node.size(); j++)
332 elements_connected_to_node[j]));
341 std::copy(fracture_elements.begin(), fracture_elements.end(),
342 std::back_inserter(vec_ele));
344 std::copy(intersected_fracture_elements[fid].begin(),
345 intersected_fracture_elements[fid].end(),
346 std::back_inserter(vec_ele));
348 vec_fracture_matrix_elements.push_back(vec_ele);
Definition of the Element class.
void DBUG(char const *fmt, Args const &... args)
Definition of the Mesh class.
Definition of the Node class.
std::size_t getID() const
virtual std::size_t getID() const final
Returns the ID of the element.
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
std::vector< Element const * > const & getElementsConnectedToNode(std::size_t node_id) const
const Node * getNode(std::size_t idx) const
Get the node with the given index.
std::size_t getNumberOfElements() const
Get the number of elements.
std::size_t searchBoundaryNodes()
Marks all boundary nodes.
const std::vector< std::size_t > & getSearchedNodeIDs() const
return marked node IDs
unsigned const _fracture_element_dim
MeshLib::Mesh const & _mesh
bool operator()(MeshLib::Node const &node) const
IsCrackTip(MeshLib::Mesh const &mesh)
std::vector< bool > _is_internal_node
void makeVectorUnique(std::vector< T > &v)
void copy(PETScVector const &x, PETScVector &y)
PropertyVector< int > const * materialIDs(Mesh const &mesh)
bool isBaseNode(Node const &node, std::vector< Element const * > const &elements_connected_to_node)
void findFracutreIntersections(MeshLib::Mesh const &mesh, std::vector< int > const &vec_fracture_mat_IDs, std::vector< std::vector< MeshLib::Node * >> const &vec_fracture_nodes, std::vector< std::vector< MeshLib::Element * >> &intersected_fracture_elements, std::vector< std::pair< std::size_t, std::vector< int >>> &vec_branch_nodeID_matIDs, std::vector< std::pair< std::size_t, std::vector< int >>> &vec_junction_nodeID_matIDs)
void getFractureMatrixDataInMesh(MeshLib::Mesh const &mesh, std::vector< MeshLib::Element * > &vec_matrix_elements, std::vector< int > &vec_fracture_mat_IDs, std::vector< std::vector< MeshLib::Element * >> &vec_fracture_elements, std::vector< std::vector< MeshLib::Element * >> &vec_fracture_matrix_elements, std::vector< std::vector< MeshLib::Node * >> &vec_fracture_nodes, std::vector< std::pair< std::size_t, std::vector< int >>> &vec_branch_nodeID_matIDs, std::vector< std::pair< std::size_t, std::vector< int >>> &vec_junction_nodeID_matIDs)
unsigned getDimension(MeshLib::MeshElemType eleType)