Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
O
ogs
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Yuhao Liu
ogs
Commits
137c20eb
Commit
137c20eb
authored
8 years ago
by
Norihiro Watanabe
Browse files
Options
Downloads
Patches
Plain Diff
[PCS/LIE] support multiple fractures in getFractureMatrixDataInMesh()
parent
5d94b225
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
ProcessLib/SmallDeformationWithLIE/Common/MeshUtils.cpp
+71
-38
71 additions, 38 deletions
ProcessLib/SmallDeformationWithLIE/Common/MeshUtils.cpp
ProcessLib/SmallDeformationWithLIE/Common/MeshUtils.h
+9
-6
9 additions, 6 deletions
ProcessLib/SmallDeformationWithLIE/Common/MeshUtils.h
with
80 additions
and
44 deletions
ProcessLib/SmallDeformationWithLIE/Common/MeshUtils.cpp
+
71
−
38
View file @
137c20eb
...
@@ -62,73 +62,106 @@ private:
...
@@ -62,73 +62,106 @@ private:
void
getFractureMatrixDataInMesh
(
void
getFractureMatrixDataInMesh
(
MeshLib
::
Mesh
const
&
mesh
,
MeshLib
::
Mesh
const
&
mesh
,
std
::
vector
<
MeshLib
::
Element
*>&
vec_matrix_elements
,
std
::
vector
<
MeshLib
::
Element
*>&
vec_matrix_elements
,
std
::
vector
<
MeshLib
::
Element
*>&
vec_fracture_elements
,
std
::
vector
<
int
>&
vec_fracture_mat_IDs
,
std
::
vector
<
MeshLib
::
Element
*>&
vec_fracture_matrix_elements
,
std
::
vector
<
std
::
vector
<
MeshLib
::
Element
*>>&
vec_fracture_elements
,
std
::
vector
<
MeshLib
::
Node
*>&
vec_fracture_nodes
std
::
vector
<
std
::
vector
<
MeshLib
::
Element
*>>&
vec_fracture_matrix_elements
,
std
::
vector
<
std
::
vector
<
MeshLib
::
Node
*>>&
vec_fracture_nodes
)
)
{
{
IsCrackTip
isCrackTip
(
mesh
);
IsCrackTip
isCrackTip
(
mesh
);
// get vectors of matrix elements and fracture elements
// get vectors of matrix elements and fracture elements
vec_matrix_elements
.
reserve
(
mesh
.
getNumberOfElements
());
vec_matrix_elements
.
reserve
(
mesh
.
getNumberOfElements
());
std
::
vector
<
MeshLib
::
Element
*>
all_fracture_elements
;
for
(
MeshLib
::
Element
*
e
:
mesh
.
getElements
())
for
(
MeshLib
::
Element
*
e
:
mesh
.
getElements
())
{
{
if
(
e
->
getDimension
()
==
mesh
.
getDimension
())
if
(
e
->
getDimension
()
==
mesh
.
getDimension
())
vec_matrix_elements
.
push_back
(
e
);
vec_matrix_elements
.
push_back
(
e
);
else
else
vec
_fracture_elements
.
push_back
(
e
);
all
_fracture_elements
.
push_back
(
e
);
}
}
DBUG
(
"-> found total %d matrix elements and %d fracture elements"
,
DBUG
(
"-> found total %d matrix elements and %d fracture elements"
,
vec_matrix_elements
.
size
(),
vec_fracture_elements
.
size
());
vec_matrix_elements
.
size
(),
all_fracture_elements
.
size
());
// get fracture material IDs
auto
opt_material_ids
(
mesh
.
getProperties
().
getPropertyVector
<
int
>
(
"MaterialIDs"
));
if
(
!
opt_material_ids
)
OGS_FATAL
(
"MaterialIDs propery vector not found in a mesh"
);
for
(
MeshLib
::
Element
*
e
:
all_fracture_elements
)
vec_fracture_mat_IDs
.
push_back
((
*
opt_material_ids
)[
e
->
getID
()]);
std
::
sort
(
vec_fracture_mat_IDs
.
begin
(),
vec_fracture_mat_IDs
.
end
());
vec_fracture_mat_IDs
.
erase
(
std
::
unique
(
vec_fracture_mat_IDs
.
begin
(),
vec_fracture_mat_IDs
.
end
()),
vec_fracture_mat_IDs
.
end
());
DBUG
(
"-> found %d fracture material groups"
,
vec_fracture_mat_IDs
.
size
());
// create a vector of fracture elements for each group
vec_fracture_elements
.
resize
(
vec_fracture_mat_IDs
.
size
());
for
(
unsigned
frac_id
=
0
;
frac_id
<
vec_fracture_mat_IDs
.
size
();
frac_id
++
)
{
const
auto
frac_mat_id
=
vec_fracture_mat_IDs
[
frac_id
];
std
::
vector
<
MeshLib
::
Element
*>
&
vec_elements
=
vec_fracture_elements
[
frac_id
];
for
(
MeshLib
::
Element
*
e
:
all_fracture_elements
)
{
if
((
*
opt_material_ids
)[
e
->
getID
()]
==
frac_mat_id
)
vec_elements
.
push_back
(
e
);
}
DBUG
(
"-> found %d elements on the fracture %d"
,
vec_elements
.
size
(),
frac_id
);
}
// get a vector of fracture nodes
// get a vector of fracture nodes
for
(
MeshLib
::
Element
*
e
:
vec_fracture_elements
)
vec_fracture_nodes
.
resize
(
vec_fracture_mat_IDs
.
size
());
for
(
unsigned
frac_id
=
0
;
frac_id
<
vec_fracture_mat_IDs
.
size
();
frac_id
++
)
{
{
for
(
unsigned
i
=
0
;
i
<
e
->
getNumberOfNodes
();
i
++
)
std
::
vector
<
MeshLib
::
Node
*>
&
vec_nodes
=
vec_fracture_nodes
[
frac_id
];
for
(
MeshLib
::
Element
*
e
:
vec_fracture_elements
[
frac_id
])
{
{
if
(
isCrackTip
(
*
e
->
getNode
(
i
)))
for
(
unsigned
i
=
0
;
i
<
e
->
getNumberOfNodes
();
i
++
)
continue
;
{
vec_fracture_nodes
.
push_back
(
const_cast
<
MeshLib
::
Node
*>
(
e
->
getNode
(
i
)));
if
(
isCrackTip
(
*
e
->
getNode
(
i
)))
continue
;
vec_nodes
.
push_back
(
const_cast
<
MeshLib
::
Node
*>
(
e
->
getNode
(
i
)));
}
}
}
std
::
sort
(
vec_nodes
.
begin
(),
vec_nodes
.
end
(),
[](
MeshLib
::
Node
*
node1
,
MeshLib
::
Node
*
node2
)
{
return
(
node1
->
getID
()
<
node2
->
getID
());
}
);
vec_nodes
.
erase
(
std
::
unique
(
vec_nodes
.
begin
(),
vec_nodes
.
end
()),
vec_nodes
.
end
());
DBUG
(
"-> found %d nodes on the fracture %d"
,
vec_nodes
.
size
(),
frac_id
);
}
}
std
::
sort
(
vec_fracture_nodes
.
begin
(),
vec_fracture_nodes
.
end
(),
[](
MeshLib
::
Node
*
node1
,
MeshLib
::
Node
*
node2
)
{
return
(
node1
->
getID
()
<
node2
->
getID
());
}
);
vec_fracture_nodes
.
erase
(
std
::
unique
(
vec_fracture_nodes
.
begin
(),
vec_fracture_nodes
.
end
()),
vec_fracture_nodes
.
end
());
DBUG
(
"-> found %d nodes on the fracture"
,
vec_fracture_nodes
.
size
());
// create a vector fracture elements and connected matrix elements,
// create a vector fracture elements and connected matrix elements,
// which are passed to a DoF table
// which are passed to a DoF table
// first, collect matrix elements
for
(
auto
fracture_elements
:
vec_fracture_elements
)
for
(
MeshLib
::
Element
*
e
:
vec_fracture_elements
)
{
{
for
(
unsigned
i
=
0
;
i
<
e
->
getNumberOfBaseNodes
();
i
++
)
std
::
vector
<
MeshLib
::
Element
*>
vec_ele
;
// first, collect matrix elements
for
(
MeshLib
::
Element
*
e
:
fracture_elements
)
{
{
MeshLib
::
Node
const
*
node
=
e
->
getNode
(
i
);
for
(
unsigned
i
=
0
;
i
<
e
->
getNumberOfBaseNodes
();
i
++
)
if
(
isCrackTip
(
*
node
))
continue
;
for
(
unsigned
j
=
0
;
j
<
node
->
getNumberOfElements
();
j
++
)
{
{
// only matrix elements
MeshLib
::
Node
const
*
node
=
e
->
getNode
(
i
);
if
(
node
->
getElement
(
j
)
->
getDimension
()
==
mesh
.
getDimension
()
-
1
)
if
(
isCrackTip
(
*
node
)
)
continue
;
continue
;
vec_fracture_matrix_elements
.
push_back
(
const_cast
<
MeshLib
::
Element
*>
(
node
->
getElement
(
j
)));
for
(
unsigned
j
=
0
;
j
<
node
->
getNumberOfElements
();
j
++
)
{
// only matrix elements
if
(
node
->
getElement
(
j
)
->
getDimension
()
<
mesh
.
getDimension
())
continue
;
vec_ele
.
push_back
(
const_cast
<
MeshLib
::
Element
*>
(
node
->
getElement
(
j
)));
}
}
}
}
}
std
::
sort
(
vec_ele
.
begin
(),
vec_ele
.
end
(),
[](
MeshLib
::
Element
*
p1
,
MeshLib
::
Element
*
p2
)
{
return
(
p1
->
getID
()
<
p2
->
getID
());
}
);
vec_ele
.
erase
(
std
::
unique
(
vec_ele
.
begin
(),
vec_ele
.
end
()),
vec_ele
.
end
());
// second, append fracture elements
vec_ele
.
insert
(
vec_ele
.
end
(),
fracture_elements
.
begin
(),
fracture_elements
.
end
());
vec_fracture_matrix_elements
.
push_back
(
vec_ele
);
}
}
std
::
sort
(
vec_fracture_matrix_elements
.
begin
(),
vec_fracture_matrix_elements
.
end
(),
[](
MeshLib
::
Element
*
p1
,
MeshLib
::
Element
*
p2
)
{
return
(
p1
->
getID
()
<
p2
->
getID
());
}
);
vec_fracture_matrix_elements
.
erase
(
std
::
unique
(
vec_fracture_matrix_elements
.
begin
(),
vec_fracture_matrix_elements
.
end
()),
vec_fracture_matrix_elements
.
end
());
// second, append fracture elements
vec_fracture_matrix_elements
.
insert
(
vec_fracture_matrix_elements
.
end
(),
vec_fracture_elements
.
begin
(),
vec_fracture_elements
.
end
());
}
}
}
// namespace SmallDeformationWithLIE
}
// namespace SmallDeformationWithLIE
...
...
This diff is collapsed.
Click to expand it.
ProcessLib/SmallDeformationWithLIE/Common/MeshUtils.h
+
9
−
6
View file @
137c20eb
...
@@ -26,16 +26,19 @@ namespace SmallDeformationWithLIE
...
@@ -26,16 +26,19 @@ namespace SmallDeformationWithLIE
* @param mesh A mesh which includes fracture elements, i.e. lower-dimensional elements.
* @param mesh A mesh which includes fracture elements, i.e. lower-dimensional elements.
* It is assumed that elements forming a fracture have a distinct material ID.
* It is assumed that elements forming a fracture have a distinct material ID.
* @param vec_matrix_elements a vector of matrix elements
* @param vec_matrix_elements a vector of matrix elements
* @param vec_fracture_elements a vector of fracture elements
* @param vec_fracture_mat_IDs fracture material IDs found in the mesh
* @param vec_fracture_matrix_elements a vector of fracture elements and matrix elements connecting to the fracture
* @param vec_fracture_elements a vector of fracture elements (grouped by fracture IDs)
* @param vec_fracture_nodes a vector of fracture element nodes
* @param vec_fracture_matrix_elements a vector of fracture elements and matrix elements
* connecting to the fracture (grouped by fracture IDs)
* @param vec_fracture_nodes a vector of fracture element nodes (grouped by fracture IDs)
*/
*/
void
getFractureMatrixDataInMesh
(
void
getFractureMatrixDataInMesh
(
MeshLib
::
Mesh
const
&
mesh
,
MeshLib
::
Mesh
const
&
mesh
,
std
::
vector
<
MeshLib
::
Element
*>&
vec_matrix_elements
,
std
::
vector
<
MeshLib
::
Element
*>&
vec_matrix_elements
,
std
::
vector
<
MeshLib
::
Element
*>&
vec_fracture_elements
,
std
::
vector
<
int
>&
vec_fracture_mat_IDs
,
std
::
vector
<
MeshLib
::
Element
*>&
vec_fracture_matrix_elements
,
std
::
vector
<
std
::
vector
<
MeshLib
::
Element
*>>&
vec_fracture_elements
,
std
::
vector
<
MeshLib
::
Node
*>&
vec_fracture_nodes
std
::
vector
<
std
::
vector
<
MeshLib
::
Element
*>>&
vec_fracture_matrix_elements
,
std
::
vector
<
std
::
vector
<
MeshLib
::
Node
*>>&
vec_fracture_nodes
);
);
}
// namespace SmallDeformationWithLIE
}
// namespace SmallDeformationWithLIE
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment