Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
pugs
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
code
pugs
Compare revisions
b507753f094613e111e9bcf9cd368803753bb3e1 to dbc6302d7d0ccda97e9c256ffc615bf794c34dda
Compare revisions
Changes are shown as if the
source
revision was being merged into the
target
revision.
Learn more about comparing revisions.
Source
code/pugs
Select target project
No results found
dbc6302d7d0ccda97e9c256ffc615bf794c34dda
Select Git revision
Branches
Nodal_diffusion
develop
feature/Navier-Stokes
feature/Nodal_diffusion
feature/composite-scheme
feature/composite-scheme-other-fluxes
feature/composite-scheme-sources
feature/coupling_module
feature/discontinuous-galerkin
feature/escobar-smoother
feature/explicit-gp-cfl
feature/gks
feature/gmsh-reader
feature/hypoelasticity
feature/hypoelasticity-clean
feature/implicit-solver
feature/implicit-solver-o2
feature/kinetic-schemes
feature/local-dt-fsi
feature/merge-local-dt-fsi
feature/polynomials
feature/reconstruction
feature/serraille
feature/variational-hydro
hyperplastic
master
navier-stokes
origin/stage/bouguettaia
save_clemence
test/voronoi1d
Tags
Kidder
v0
v0.0.1
v0.0.2
v0.0.3
v0.0.4
v0.1.0
v0.2.0
v0.3.0
v0.4.0
v0.4.1
v0.5.0
42 results
Swap
Target
code/pugs
Select target project
code/pugs
1 result
b507753f094613e111e9bcf9cd368803753bb3e1
Select Git revision
Branches
Nodal_diffusion
develop
feature/Navier-Stokes
feature/Nodal_diffusion
feature/composite-scheme
feature/composite-scheme-other-fluxes
feature/composite-scheme-sources
feature/coupling_module
feature/discontinuous-galerkin
feature/escobar-smoother
feature/explicit-gp-cfl
feature/gks
feature/gmsh-reader
feature/hypoelasticity
feature/hypoelasticity-clean
feature/implicit-solver
feature/implicit-solver-o2
feature/kinetic-schemes
feature/local-dt-fsi
feature/merge-local-dt-fsi
feature/polynomials
feature/reconstruction
feature/serraille
feature/variational-hydro
hyperplastic
master
navier-stokes
origin/stage/bouguettaia
save_clemence
test/voronoi1d
Tags
Kidder
v0
v0.0.1
v0.0.2
v0.0.3
v0.0.4
v0.1.0
v0.2.0
v0.3.0
v0.4.0
v0.4.1
v0.5.0
42 results
Show changes
Only incoming changes from source
Include changes to target since source was created
Compare
Commits on Source
2
Read only the first field as physical tag for Gmsh 2.2 file format
· 01ce1fb6
Stéphane Del Pino
authored
3 weeks ago
This is a limitation of the file format
01ce1fb6
Continue code clean-up [ci-skip]
· dbc6302d
Stéphane Del Pino
authored
3 weeks ago
dbc6302d
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/mesh/GmshReader.cpp
+290
-348
290 additions, 348 deletions
src/mesh/GmshReader.cpp
src/mesh/GmshReader.hpp
+45
-48
45 additions, 48 deletions
src/mesh/GmshReader.hpp
with
335 additions
and
396 deletions
src/mesh/GmshReader.cpp
View file @
dbc6302d
...
...
@@ -16,10 +16,9 @@
#include
<pegtl.hpp>
#include
<rang.hpp>
#include
<
fstream
>
#include
<
charconv
>
#include
<iostream>
#include
<map>
#include
<regex>
#include
<set>
#include
<sstream>
#include
<unordered_map>
...
...
@@ -36,17 +35,18 @@ GmshConnectivityBuilder<1>::GmshConnectivityBuilder(const GmshReader::GmshData&
{
ConnectivityDescriptor
descriptor
;
descriptor
.
setNodeNumberVector
(
gmsh_data
.
__verticesN
umber
s
);
descriptor
.
setNodeNumberVector
(
gmsh_data
.
node_n
umber
);
Array
<
CellType
>
cell_type_vector
(
nb_cells
);
Array
<
int
>
cell_number_vector
(
nb_cells
);
Array
<
unsigned
int
>
cell_to_node_row
(
nb_cells
+
1
);
parallel_for
(
cell_to_node_row
.
size
(),
PUGS_LAMBDA
(
const
CellId
cell_id
)
{
cell_to_node_row
[
cell_id
]
=
2
*
cell_id
;
});
parallel_for
(
cell_to_node_row
.
size
(),
PUGS_LAMBDA
(
const
CellId
cell_id
)
{
cell_to_node_row
[
cell_id
]
=
2
*
cell_id
;
});
Array
<
unsigned
int
>
cell_to_node_list
(
cell_to_node_row
[
cell_to_node_row
.
size
()
-
1
]);
for
(
CellId
cell_id
=
0
;
cell_id
<
nb_cells
;
++
cell_id
)
{
for
(
int
i_node
=
0
;
i_node
<
2
;
++
i_node
)
{
cell_to_node_list
[
2
*
cell_id
+
i_node
]
=
gmsh_data
.
__
edge
s
[
cell_id
][
i_node
];
cell_to_node_list
[
2
*
cell_id
+
i_node
]
=
gmsh_data
.
edge
_entity
[
cell_id
][
i_node
];
}
}
descriptor
.
setCellToNodeMatrix
(
ConnectivityMatrix
(
cell_to_node_row
,
cell_to_node_list
));
...
...
@@ -55,16 +55,14 @@ GmshConnectivityBuilder<1>::GmshConnectivityBuilder(const GmshReader::GmshData&
descriptor
.
setCellTypeVector
(
cell_type_vector
);
for
(
size_t
j
=
0
;
j
<
nb_cells
;
++
j
)
{
cell_number_vector
[
j
]
=
gmsh_data
.
__
edge
s
_number
[
j
];
cell_number_vector
[
j
]
=
gmsh_data
.
edge
_entity
_number
[
j
];
}
descriptor
.
setCellNumberVector
(
cell_number_vector
);
std
::
map
<
unsigned
int
,
std
::
vector
<
unsigned
int
>>
ref_points_map
;
for
(
unsigned
int
r
=
0
;
r
<
gmsh_data
.
__points
.
size
();
++
r
)
{
const
unsigned
int
point_number
=
gmsh_data
.
__points
[
r
];
for
(
auto
ref
:
gmsh_data
.
__points_ref
[
r
])
{
ref_points_map
[
ref
].
push_back
(
point_number
);
}
for
(
unsigned
int
r
=
0
;
r
<
gmsh_data
.
point_entity
.
size
();
++
r
)
{
const
unsigned
int
point_number
=
gmsh_data
.
point_entity
[
r
];
ref_points_map
[
gmsh_data
.
point_entity_ref
[
r
]].
push_back
(
point_number
);
}
Array
<
size_t
>
node_nb_cell
(
descriptor
.
nodeNumberVector
().
size
());
...
...
@@ -111,8 +109,8 @@ GmshConnectivityBuilder<1>::GmshConnectivityBuilder(const GmshReader::GmshData&
}();
auto
ref_id
=
[
&
]
{
if
(
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_point_list
.
first
);
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
{
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_point_list
.
first
);
if
((
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
and
(
i_physical_ref
->
second
.
dimension
()
==
0
))
{
return
i_physical_ref
->
second
.
refId
();
}
else
{
return
RefId
{
ref_point_list
.
first
};
...
...
@@ -123,11 +121,9 @@ GmshConnectivityBuilder<1>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
std
::
map
<
unsigned
int
,
std
::
vector
<
unsigned
int
>>
ref_cells_map
;
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
__
edge
s
_ref
.
size
();
++
j
)
{
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
edge
_entity
_ref
.
size
();
++
j
)
{
const
unsigned
int
elem_number
=
j
;
for
(
auto
ref
:
gmsh_data
.
__edges_ref
[
j
])
{
ref_cells_map
[
ref
].
push_back
(
elem_number
);
}
ref_cells_map
[
gmsh_data
.
edge_entity_ref
[
j
]].
push_back
(
elem_number
);
}
for
(
const
auto
&
ref_cell_list
:
ref_cells_map
)
{
...
...
@@ -137,8 +133,8 @@ GmshConnectivityBuilder<1>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
auto
ref_id
=
[
&
]
{
if
(
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_cell_list
.
first
);
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
{
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_cell_list
.
first
);
if
((
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
and
(
i_physical_ref
->
second
.
dimension
()
==
1
))
{
return
i_physical_ref
->
second
.
refId
();
}
else
{
return
RefId
{
ref_cell_list
.
first
};
...
...
@@ -168,18 +164,18 @@ GmshConnectivityBuilder<2>::GmshConnectivityBuilder(const GmshReader::GmshData&
{
ConnectivityDescriptor
descriptor
;
descriptor
.
setNodeNumberVector
(
gmsh_data
.
__verticesN
umber
s
);
descriptor
.
setNodeNumberVector
(
gmsh_data
.
node_n
umber
);
Array
<
CellType
>
cell_type_vector
(
nb_cells
);
Array
<
int
>
cell_number_vector
(
nb_cells
);
Array
<
unsigned
int
>
cell_to_node_row
(
gmsh_data
.
__
triangle
s
.
size
()
+
gmsh_data
.
__
quadrangle
s
.
size
()
+
1
);
Array
<
unsigned
int
>
cell_to_node_row
(
gmsh_data
.
triangle
_entity
.
size
()
+
gmsh_data
.
quadrangle
_entity
.
size
()
+
1
);
{
cell_to_node_row
[
0
]
=
0
;
size_t
i_cell
=
0
;
for
(
size_t
i_triangle
=
0
;
i_triangle
<
gmsh_data
.
__
triangle
s
.
size
();
++
i_triangle
,
++
i_cell
)
{
for
(
size_t
i_triangle
=
0
;
i_triangle
<
gmsh_data
.
triangle
_entity
.
size
();
++
i_triangle
,
++
i_cell
)
{
cell_to_node_row
[
i_cell
+
1
]
=
cell_to_node_row
[
i_cell
]
+
3
;
}
for
(
size_t
i_quadrangle
=
0
;
i_quadrangle
<
gmsh_data
.
__
quadrangle
s
.
size
();
++
i_quadrangle
,
++
i_cell
)
{
for
(
size_t
i_quadrangle
=
0
;
i_quadrangle
<
gmsh_data
.
quadrangle
_entity
.
size
();
++
i_quadrangle
,
++
i_cell
)
{
cell_to_node_row
[
i_cell
+
1
]
=
cell_to_node_row
[
i_cell
]
+
4
;
}
}
...
...
@@ -187,50 +183,46 @@ GmshConnectivityBuilder<2>::GmshConnectivityBuilder(const GmshReader::GmshData&
Array
<
unsigned
int
>
cell_to_node_list
(
cell_to_node_row
[
cell_to_node_row
.
size
()
-
1
]);
{
size_t
i_cell_node
=
0
;
for
(
size_t
i_triangle
=
0
;
i_triangle
<
gmsh_data
.
__
triangle
s
.
size
();
++
i_triangle
)
{
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
triangle
s
[
i_triangle
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
triangle
s
[
i_triangle
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
triangle
s
[
i_triangle
][
2
];
for
(
size_t
i_triangle
=
0
;
i_triangle
<
gmsh_data
.
triangle
_entity
.
size
();
++
i_triangle
)
{
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
triangle
_entity
[
i_triangle
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
triangle
_entity
[
i_triangle
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
triangle
_entity
[
i_triangle
][
2
];
}
for
(
size_t
i_quadrangle
=
0
;
i_quadrangle
<
gmsh_data
.
__
quadrangle
s
.
size
();
++
i_quadrangle
)
{
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
quadrangle
s
[
i_quadrangle
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
quadrangle
s
[
i_quadrangle
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
quadrangle
s
[
i_quadrangle
][
2
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
quadrangle
s
[
i_quadrangle
][
3
];
for
(
size_t
i_quadrangle
=
0
;
i_quadrangle
<
gmsh_data
.
quadrangle
_entity
.
size
();
++
i_quadrangle
)
{
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
quadrangle
_entity
[
i_quadrangle
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
quadrangle
_entity
[
i_quadrangle
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
quadrangle
_entity
[
i_quadrangle
][
2
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
quadrangle
_entity
[
i_quadrangle
][
3
];
}
}
descriptor
.
setCellToNodeMatrix
(
ConnectivityMatrix
(
cell_to_node_row
,
cell_to_node_list
));
const
size_t
nb_triangles
=
gmsh_data
.
__
triangle
s
.
size
();
const
size_t
nb_triangles
=
gmsh_data
.
triangle
_entity
.
size
();
for
(
size_t
i_triangle
=
0
;
i_triangle
<
nb_triangles
;
++
i_triangle
)
{
cell_type_vector
[
i_triangle
]
=
CellType
::
Triangle
;
cell_number_vector
[
i_triangle
]
=
gmsh_data
.
__
triangle
s
_number
[
i_triangle
];
cell_number_vector
[
i_triangle
]
=
gmsh_data
.
triangle
_entity
_number
[
i_triangle
];
}
const
size_t
nb_quadrangles
=
gmsh_data
.
__
quadrangle
s
.
size
();
const
size_t
nb_quadrangles
=
gmsh_data
.
quadrangle
_entity
.
size
();
for
(
size_t
i_quadrangle
=
0
;
i_quadrangle
<
nb_quadrangles
;
++
i_quadrangle
)
{
const
size_t
i_cell
=
i_quadrangle
+
nb_triangles
;
cell_type_vector
[
i_cell
]
=
CellType
::
Quadrangle
;
cell_number_vector
[
i_cell
]
=
gmsh_data
.
__
quadrangle
s
_number
[
i_quadrangle
];
cell_number_vector
[
i_cell
]
=
gmsh_data
.
quadrangle
_entity
_number
[
i_quadrangle
];
}
descriptor
.
setCellNumberVector
(
cell_number_vector
);
descriptor
.
setCellTypeVector
(
cell_type_vector
);
std
::
map
<
unsigned
int
,
std
::
vector
<
unsigned
int
>>
ref_cells_map
;
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
__
triangle
s
_ref
.
size
();
++
j
)
{
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
triangle
_entity
_ref
.
size
();
++
j
)
{
const
unsigned
int
elem_number
=
j
;
for
(
auto
ref
:
gmsh_data
.
__triangles_ref
[
j
])
{
ref_cells_map
[
ref
].
push_back
(
elem_number
);
}
ref_cells_map
[
gmsh_data
.
triangle_entity_ref
[
j
]].
push_back
(
elem_number
);
}
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
__
quadrangle
s
_ref
.
size
();
++
j
)
{
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
quadrangle
_entity
_ref
.
size
();
++
j
)
{
const
size_t
elem_number
=
nb_triangles
+
j
;
for
(
auto
ref
:
gmsh_data
.
__quadrangles_ref
[
j
])
{
ref_cells_map
[
ref
].
push_back
(
elem_number
);
}
ref_cells_map
[
gmsh_data
.
quadrangle_entity_ref
[
j
]].
push_back
(
elem_number
);
}
for
(
const
auto
&
ref_cell_list
:
ref_cells_map
)
{
...
...
@@ -240,8 +232,8 @@ GmshConnectivityBuilder<2>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
auto
ref_id
=
[
&
]
{
if
(
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_cell_list
.
first
);
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
{
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_cell_list
.
first
);
if
((
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
and
(
i_physical_ref
->
second
.
dimension
()
==
2
))
{
return
i_physical_ref
->
second
.
refId
();
}
else
{
return
RefId
{
ref_cell_list
.
first
};
...
...
@@ -263,12 +255,12 @@ GmshConnectivityBuilder<2>::GmshConnectivityBuilder(const GmshReader::GmshData&
return
mutable_face_number_id_map
;
}();
const
auto
&
node_number
_vector
=
descriptor
.
nodeNumberVector
();
const
auto
&
node_number
=
descriptor
.
nodeNumberVector
();
const
auto
&
node_to_face_matrix
=
descriptor
.
nodeToFaceMatrix
();
const
auto
&
face_to_node_matrix
=
descriptor
.
faceToNodeMatrix
();
const
auto
find_face
=
[
&
](
uint32_t
node0
,
uint32_t
node1
)
{
if
(
node_number
_vector
[
node0
]
>
node_number
_vector
[
node1
])
{
if
(
node_number
[
node0
]
>
node_number
[
node1
])
{
std
::
swap
(
node0
,
node1
);
}
const
auto
&
face_id_vector
=
node_to_face_matrix
[
node0
];
...
...
@@ -287,15 +279,13 @@ GmshConnectivityBuilder<2>::GmshConnectivityBuilder(const GmshReader::GmshData&
Array
<
int
>
face_number_vector
=
copy
(
descriptor
.
faceNumberVector
());
std
::
map
<
unsigned
int
,
std
::
vector
<
unsigned
int
>>
ref_faces_map
;
for
(
unsigned
int
e
=
0
;
e
<
gmsh_data
.
__
edge
s
.
size
();
++
e
)
{
const
unsigned
int
edge_id
=
find_face
(
gmsh_data
.
__
edge
s
[
e
][
0
],
gmsh_data
.
__
edge
s
[
e
][
1
]);
for
(
unsigned
int
e
=
0
;
e
<
gmsh_data
.
edge
_entity
.
size
();
++
e
)
{
const
unsigned
int
edge_id
=
find_face
(
gmsh_data
.
edge
_entity
[
e
][
0
],
gmsh_data
.
edge
_entity
[
e
][
1
]);
for
(
auto
ref
:
gmsh_data
.
__edges_ref
[
e
])
{
ref_faces_map
[
ref
].
push_back
(
edge_id
);
}
ref_faces_map
[
gmsh_data
.
edge_entity_ref
[
e
]].
push_back
(
edge_id
);
if
(
face_number_vector
[
edge_id
]
!=
gmsh_data
.
__
edge
s
_number
[
e
])
{
if
(
auto
i_face
=
face_number_id_map
.
find
(
gmsh_data
.
__
edge
s
_number
[
e
]);
i_face
!=
face_number_id_map
.
end
())
{
if
(
face_number_vector
[
edge_id
]
!=
gmsh_data
.
edge
_entity
_number
[
e
])
{
if
(
auto
i_face
=
face_number_id_map
.
find
(
gmsh_data
.
edge
_entity
_number
[
e
]);
i_face
!=
face_number_id_map
.
end
())
{
const
int
other_edge_id
=
i_face
->
second
;
std
::
swap
(
face_number_vector
[
edge_id
],
face_number_vector
[
other_edge_id
]);
...
...
@@ -306,7 +296,7 @@ GmshConnectivityBuilder<2>::GmshConnectivityBuilder(const GmshReader::GmshData&
face_number_id_map
[
face_number_vector
[
other_edge_id
]]
=
other_edge_id
;
}
else
{
face_number_id_map
.
erase
(
face_number_vector
[
edge_id
]);
face_number_vector
[
edge_id
]
=
gmsh_data
.
__
edge
s
_number
[
e
];
face_number_vector
[
edge_id
]
=
gmsh_data
.
edge
_entity
_number
[
e
];
face_number_id_map
[
face_number_vector
[
edge_id
]]
=
edge_id
;
}
}
...
...
@@ -331,8 +321,8 @@ GmshConnectivityBuilder<2>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
auto
ref_id
=
[
&
]
{
if
(
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_face_list
.
first
);
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
{
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_face_list
.
first
);
if
((
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
and
(
i_physical_ref
->
second
.
dimension
()
==
1
))
{
return
i_physical_ref
->
second
.
refId
();
}
else
{
return
RefId
{
ref_face_list
.
first
};
...
...
@@ -368,7 +358,7 @@ GmshConnectivityBuilder<2>::GmshConnectivityBuilder(const GmshReader::GmshData&
descriptor
.
addRefItemList
(
RefFaceList
{
ref_id
,
face_list
,
list_type
});
}
Array
<
bool
>
is_boundary_node
(
node_number
_vector
.
size
());
Array
<
bool
>
is_boundary_node
(
node_number
.
size
());
is_boundary_node
.
fill
(
false
);
for
(
size_t
i_face
=
0
;
i_face
<
face_nb_cell
.
size
();
++
i_face
)
{
...
...
@@ -381,11 +371,9 @@ GmshConnectivityBuilder<2>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
std
::
map
<
unsigned
int
,
std
::
vector
<
unsigned
int
>>
ref_points_map
;
for
(
unsigned
int
r
=
0
;
r
<
gmsh_data
.
__points
.
size
();
++
r
)
{
const
unsigned
int
point_number
=
gmsh_data
.
__points
[
r
];
for
(
auto
ref
:
gmsh_data
.
__points_ref
[
r
])
{
ref_points_map
[
ref
].
push_back
(
point_number
);
}
for
(
unsigned
int
r
=
0
;
r
<
gmsh_data
.
point_entity
.
size
();
++
r
)
{
const
unsigned
int
point_number
=
gmsh_data
.
point_entity
[
r
];
ref_points_map
[
gmsh_data
.
point_entity_ref
[
r
]].
push_back
(
point_number
);
}
for
(
const
auto
&
ref_point_list
:
ref_points_map
)
{
...
...
@@ -395,8 +383,8 @@ GmshConnectivityBuilder<2>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
auto
ref_id
=
[
&
]
{
if
(
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_point_list
.
first
);
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
{
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_point_list
.
first
);
if
((
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
and
(
i_physical_ref
->
second
.
dimension
()
==
0
))
{
return
i_physical_ref
->
second
.
refId
();
}
else
{
return
RefId
{
ref_point_list
.
first
};
...
...
@@ -434,7 +422,7 @@ GmshConnectivityBuilder<2>::GmshConnectivityBuilder(const GmshReader::GmshData&
}());
descriptor
.
setNodeOwnerVector
([
&
]
{
Array
<
int
>
node_owner_vector
(
node_number
_vector
.
size
());
Array
<
int
>
node_owner_vector
(
node_number
.
size
());
node_owner_vector
.
fill
(
parallel
::
rank
());
return
node_owner_vector
;
}());
...
...
@@ -447,14 +435,14 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
{
ConnectivityDescriptor
descriptor
;
descriptor
.
setNodeNumberVector
(
gmsh_data
.
__verticesN
umber
s
);
descriptor
.
setNodeNumberVector
(
gmsh_data
.
node_n
umber
);
Array
<
CellType
>
cell_type_vector
(
nb_cells
);
Array
<
int
>
cell_number_vector
(
nb_cells
);
const
size_t
nb_tetrahedra
=
gmsh_data
.
__
tetrahedr
a
.
size
();
const
size_t
nb_hexahedra
=
gmsh_data
.
__
hexahedr
a
.
size
();
const
size_t
nb_prisms
=
gmsh_data
.
__
prism
s
.
size
();
const
size_t
nb_pyramids
=
gmsh_data
.
__
pyramid
s
.
size
();
const
size_t
nb_tetrahedra
=
gmsh_data
.
tetrahedr
on_entity
.
size
();
const
size_t
nb_hexahedra
=
gmsh_data
.
hexahedr
on_entity
.
size
();
const
size_t
nb_prisms
=
gmsh_data
.
prism
_entity
.
size
();
const
size_t
nb_pyramids
=
gmsh_data
.
pyramid
_entity
.
size
();
Array
<
unsigned
int
>
cell_to_node_row
(
nb_cells
+
1
);
{
...
...
@@ -478,62 +466,62 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
{
size_t
i_cell_node
=
0
;
for
(
size_t
i_tetrahedron
=
0
;
i_tetrahedron
<
nb_tetrahedra
;
++
i_tetrahedron
)
{
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
tetrahedr
a
[
i_tetrahedron
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
tetrahedr
a
[
i_tetrahedron
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
tetrahedr
a
[
i_tetrahedron
][
2
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
tetrahedr
a
[
i_tetrahedron
][
3
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
tetrahedr
on_entity
[
i_tetrahedron
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
tetrahedr
on_entity
[
i_tetrahedron
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
tetrahedr
on_entity
[
i_tetrahedron
][
2
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
tetrahedr
on_entity
[
i_tetrahedron
][
3
];
}
for
(
size_t
i_hexahedron
=
0
;
i_hexahedron
<
nb_hexahedra
;
++
i_hexahedron
)
{
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
hexahedr
a
[
i_hexahedron
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
hexahedr
a
[
i_hexahedron
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
hexahedr
a
[
i_hexahedron
][
2
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
hexahedr
a
[
i_hexahedron
][
3
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
hexahedr
a
[
i_hexahedron
][
4
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
hexahedr
a
[
i_hexahedron
][
5
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
hexahedr
a
[
i_hexahedron
][
6
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
hexahedr
a
[
i_hexahedron
][
7
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
hexahedr
on_entity
[
i_hexahedron
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
hexahedr
on_entity
[
i_hexahedron
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
hexahedr
on_entity
[
i_hexahedron
][
2
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
hexahedr
on_entity
[
i_hexahedron
][
3
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
hexahedr
on_entity
[
i_hexahedron
][
4
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
hexahedr
on_entity
[
i_hexahedron
][
5
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
hexahedr
on_entity
[
i_hexahedron
][
6
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
hexahedr
on_entity
[
i_hexahedron
][
7
];
}
for
(
size_t
i_prism
=
0
;
i_prism
<
nb_prisms
;
++
i_prism
)
{
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
prism
s
[
i_prism
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
prism
s
[
i_prism
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
prism
s
[
i_prism
][
2
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
prism
s
[
i_prism
][
3
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
prism
s
[
i_prism
][
4
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
prism
s
[
i_prism
][
5
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
prism
_entity
[
i_prism
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
prism
_entity
[
i_prism
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
prism
_entity
[
i_prism
][
2
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
prism
_entity
[
i_prism
][
3
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
prism
_entity
[
i_prism
][
4
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
prism
_entity
[
i_prism
][
5
];
}
for
(
size_t
i_pyramid
=
0
;
i_pyramid
<
nb_pyramids
;
++
i_pyramid
)
{
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
pyramid
s
[
i_pyramid
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
pyramid
s
[
i_pyramid
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
pyramid
s
[
i_pyramid
][
2
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
pyramid
s
[
i_pyramid
][
3
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
__
pyramid
s
[
i_pyramid
][
4
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
pyramid
_entity
[
i_pyramid
][
0
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
pyramid
_entity
[
i_pyramid
][
1
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
pyramid
_entity
[
i_pyramid
][
2
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
pyramid
_entity
[
i_pyramid
][
3
];
cell_to_node_list
[
i_cell_node
++
]
=
gmsh_data
.
pyramid
_entity
[
i_pyramid
][
4
];
}
}
for
(
size_t
j
=
0
;
j
<
nb_tetrahedra
;
++
j
)
{
cell_type_vector
[
j
]
=
CellType
::
Tetrahedron
;
cell_number_vector
[
j
]
=
gmsh_data
.
__
tetrahedr
a
_number
[
j
];
cell_number_vector
[
j
]
=
gmsh_data
.
tetrahedr
on_entity
_number
[
j
];
}
for
(
size_t
j
=
0
;
j
<
nb_hexahedra
;
++
j
)
{
const
size_t
jh
=
nb_tetrahedra
+
j
;
cell_type_vector
[
jh
]
=
CellType
::
Hexahedron
;
cell_number_vector
[
jh
]
=
gmsh_data
.
__
hexahedr
a
_number
[
j
];
cell_number_vector
[
jh
]
=
gmsh_data
.
hexahedr
on_entity
_number
[
j
];
}
for
(
size_t
j
=
0
;
j
<
nb_prisms
;
++
j
)
{
const
size_t
jp
=
nb_tetrahedra
+
nb_hexahedra
+
j
;
cell_type_vector
[
jp
]
=
CellType
::
Prism
;
cell_number_vector
[
jp
]
=
gmsh_data
.
__
prism
s
_number
[
j
];
cell_number_vector
[
jp
]
=
gmsh_data
.
prism
_entity
_number
[
j
];
}
for
(
size_t
j
=
0
;
j
<
nb_pyramids
;
++
j
)
{
const
size_t
jh
=
nb_tetrahedra
+
nb_hexahedra
+
nb_prisms
+
j
;
cell_type_vector
[
jh
]
=
CellType
::
Pyramid
;
cell_number_vector
[
jh
]
=
gmsh_data
.
__
pyramid
s
_number
[
j
];
cell_number_vector
[
jh
]
=
gmsh_data
.
pyramid
_entity
_number
[
j
];
}
descriptor
.
setCellNumberVector
(
cell_number_vector
);
...
...
@@ -541,32 +529,24 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
descriptor
.
setCellToNodeMatrix
(
ConnectivityMatrix
(
cell_to_node_row
,
cell_to_node_list
));
std
::
map
<
unsigned
int
,
std
::
vector
<
unsigned
int
>>
ref_cells_map
;
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
__
tetrahedr
a
_ref
.
size
();
++
j
)
{
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
tetrahedr
on_entity
_ref
.
size
();
++
j
)
{
const
unsigned
int
elem_number
=
j
;
for
(
auto
ref
:
gmsh_data
.
__tetrahedra_ref
[
j
])
{
ref_cells_map
[
ref
].
push_back
(
elem_number
);
}
ref_cells_map
[
gmsh_data
.
tetrahedron_entity_ref
[
j
]].
push_back
(
elem_number
);
}
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
__
hexahedr
a
_ref
.
size
();
++
j
)
{
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
hexahedr
on_entity
_ref
.
size
();
++
j
)
{
const
size_t
elem_number
=
nb_tetrahedra
+
j
;
for
(
auto
ref
:
gmsh_data
.
__hexahedra_ref
[
j
])
{
ref_cells_map
[
ref
].
push_back
(
elem_number
);
}
ref_cells_map
[
gmsh_data
.
hexahedron_entity_ref
[
j
]].
push_back
(
elem_number
);
}
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
__
prism
s
_ref
.
size
();
++
j
)
{
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
prism
_entity
_ref
.
size
();
++
j
)
{
const
size_t
elem_number
=
nb_tetrahedra
+
nb_hexahedra
+
j
;
for
(
auto
ref
:
gmsh_data
.
__prisms_ref
[
j
])
{
ref_cells_map
[
ref
].
push_back
(
elem_number
);
}
ref_cells_map
[
gmsh_data
.
prism_entity_ref
[
j
]].
push_back
(
elem_number
);
}
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
__
pyramid
s
_ref
.
size
();
++
j
)
{
for
(
unsigned
int
j
=
0
;
j
<
gmsh_data
.
pyramid
_entity
_ref
.
size
();
++
j
)
{
const
size_t
elem_number
=
nb_tetrahedra
+
nb_hexahedra
+
nb_prisms
+
j
;
for
(
auto
ref
:
gmsh_data
.
__pyramids_ref
[
j
])
{
ref_cells_map
[
ref
].
push_back
(
elem_number
);
}
ref_cells_map
[
gmsh_data
.
pyramid_entity_ref
[
j
]].
push_back
(
elem_number
);
}
for
(
const
auto
&
ref_cell_list
:
ref_cells_map
)
{
...
...
@@ -576,8 +556,8 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
auto
ref_id
=
[
&
]
{
if
(
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_cell_list
.
first
);
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
{
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_cell_list
.
first
);
if
((
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
and
(
i_physical_ref
->
second
.
dimension
()
==
3
))
{
return
i_physical_ref
->
second
.
refId
();
}
else
{
return
RefId
{
ref_cell_list
.
first
};
...
...
@@ -589,7 +569,7 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
ConnectivityBuilderBase
::
_computeCellFaceAndFaceNodeConnectivities
<
3
>
(
descriptor
);
const
auto
&
node_number
_vector
=
descriptor
.
nodeNumberVector
();
const
auto
&
node_number
=
descriptor
.
nodeNumberVector
();
Array
<
size_t
>
face_nb_cell
(
descriptor
.
faceNumberVector
().
size
());
face_nb_cell
.
fill
(
0
);
...
...
@@ -617,10 +597,10 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
const
auto
&
node_to_face_matrix
=
descriptor
.
nodeToFaceMatrix
();
const
auto
&
face_to_node_matrix
=
descriptor
.
faceToNodeMatrix
();
const
auto
find_face
=
[
&
](
std
::
vector
<
u
int32_
t
>
node_list
)
{
const
auto
find_face
=
[
&
](
std
::
vector
<
u
nsigned
in
t
>
node_list
)
{
size_t
i_node_smallest_number
=
0
;
for
(
size_t
i_node
=
1
;
i_node
<
node_list
.
size
();
++
i_node
)
{
if
(
node_number
_vector
[
node_list
[
i_node
]]
<
node_number
_vector
[
node_list
[
i_node_smallest_number
]])
{
if
(
node_number
[
node_list
[
i_node
]]
<
node_number
[
node_list
[
i_node_smallest_number
]])
{
i_node_smallest_number
=
i_node
;
}
}
...
...
@@ -639,7 +619,7 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
}
if
(
node_number
_vector
[
node_list
[
1
]]
>
node_number
_vector
[
node_list
[
node_list
.
size
()
-
1
]])
{
if
(
node_number
[
node_list
[
1
]]
>
node_number
[
node_list
[
node_list
.
size
()
-
1
]])
{
for
(
size_t
i_node
=
1
;
i_node
<=
(
node_list
.
size
()
+
1
)
/
2
-
1
;
++
i_node
)
{
std
::
swap
(
node_list
[
i_node
],
node_list
[
node_list
.
size
()
-
i_node
]);
}
...
...
@@ -672,16 +652,14 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
Array
<
int
>
face_number_vector
=
copy
(
descriptor
.
faceNumberVector
());
std
::
map
<
unsigned
int
,
std
::
vector
<
unsigned
int
>>
ref_faces_map
;
for
(
unsigned
int
f
=
0
;
f
<
gmsh_data
.
__
triangle
s
.
size
();
++
f
)
{
for
(
unsigned
int
f
=
0
;
f
<
gmsh_data
.
triangle
_entity
.
size
();
++
f
)
{
const
unsigned
int
face_id
=
find_face
({
gmsh_data
.
__
triangle
s
[
f
][
0
],
gmsh_data
.
__
triangle
s
[
f
][
1
],
gmsh_data
.
__
triangle
s
[
f
][
2
]});
find_face
({
gmsh_data
.
triangle
_entity
[
f
][
0
],
gmsh_data
.
triangle
_entity
[
f
][
1
],
gmsh_data
.
triangle
_entity
[
f
][
2
]});
for
(
auto
ref
:
gmsh_data
.
__triangles_ref
[
f
])
{
ref_faces_map
[
ref
].
push_back
(
face_id
);
}
ref_faces_map
[
gmsh_data
.
triangle_entity_ref
[
f
]].
push_back
(
face_id
);
if
(
face_number_vector
[
face_id
]
!=
gmsh_data
.
__
triangle
s
_number
[
f
])
{
if
(
auto
i_face
=
face_number_id_map
.
find
(
gmsh_data
.
__
triangle
s
_number
[
f
]);
if
(
face_number_vector
[
face_id
]
!=
gmsh_data
.
triangle
_entity
_number
[
f
])
{
if
(
auto
i_face
=
face_number_id_map
.
find
(
gmsh_data
.
triangle
_entity
_number
[
f
]);
i_face
!=
face_number_id_map
.
end
())
{
const
int
other_face_id
=
i_face
->
second
;
std
::
swap
(
face_number_vector
[
face_id
],
face_number_vector
[
other_face_id
]);
...
...
@@ -693,21 +671,20 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
face_number_id_map
[
face_number_vector
[
other_face_id
]]
=
other_face_id
;
}
else
{
face_number_id_map
.
erase
(
face_number_vector
[
face_id
]);
face_number_vector
[
face_id
]
=
gmsh_data
.
__
triangle
s
_number
[
f
];
face_number_vector
[
face_id
]
=
gmsh_data
.
triangle
_entity
_number
[
f
];
face_number_id_map
[
face_number_vector
[
face_id
]]
=
face_id
;
}
}
}
for
(
unsigned
int
f
=
0
;
f
<
gmsh_data
.
__
quadrangle
s
.
size
();
++
f
)
{
const
unsigned
int
face_id
=
find_face
({
gmsh_data
.
__
quadrangle
s
[
f
][
0
],
gmsh_data
.
__
quadrangle
s
[
f
][
1
],
gmsh_data
.
__
quadrangle
s
[
f
][
2
],
gmsh_data
.
__
quadrangle
s
[
f
][
3
]});
for
(
unsigned
int
f
=
0
;
f
<
gmsh_data
.
quadrangle
_entity
.
size
();
++
f
)
{
const
unsigned
int
face_id
=
find_face
({
gmsh_data
.
quadrangle
_entity
[
f
][
0
],
gmsh_data
.
quadrangle
_entity
[
f
][
1
],
gmsh_data
.
quadrangle
_entity
[
f
][
2
],
gmsh_data
.
quadrangle
_entity
[
f
][
3
]});
for
(
auto
ref
:
gmsh_data
.
__quadrangles_ref
[
f
])
{
ref_faces_map
[
ref
].
push_back
(
face_id
);
}
if
(
face_number_vector
[
face_id
]
!=
gmsh_data
.
__quadrangles_number
[
f
])
{
if
(
auto
i_face
=
face_number_id_map
.
find
(
gmsh_data
.
__quadrangles_number
[
f
]);
ref_faces_map
[
gmsh_data
.
quadrangle_entity_ref
[
f
]].
push_back
(
face_id
);
if
(
face_number_vector
[
face_id
]
!=
gmsh_data
.
quadrangle_entity_number
[
f
])
{
if
(
auto
i_face
=
face_number_id_map
.
find
(
gmsh_data
.
quadrangle_entity_number
[
f
]);
i_face
!=
face_number_id_map
.
end
())
{
const
int
other_face_id
=
i_face
->
second
;
std
::
swap
(
face_number_vector
[
face_id
],
face_number_vector
[
other_face_id
]);
...
...
@@ -719,7 +696,7 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
face_number_id_map
[
face_number_vector
[
other_face_id
]]
=
other_face_id
;
}
else
{
face_number_id_map
.
erase
(
face_number_vector
[
face_id
]);
face_number_vector
[
face_id
]
=
gmsh_data
.
__
quadrangle
s
_number
[
f
];
face_number_vector
[
face_id
]
=
gmsh_data
.
quadrangle
_entity
_number
[
f
];
face_number_id_map
[
face_number_vector
[
face_id
]]
=
face_id
;
}
}
...
...
@@ -733,8 +710,8 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
auto
ref_id
=
[
&
]
{
if
(
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_face_list
.
first
);
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
{
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_face_list
.
first
);
if
((
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
and
(
i_physical_ref
->
second
.
dimension
()
==
2
))
{
return
i_physical_ref
->
second
.
refId
();
}
else
{
return
RefId
{
ref_face_list
.
first
};
...
...
@@ -792,7 +769,7 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
const
auto
&
edge_to_node_matrix
=
descriptor
.
edgeToNodeMatrix
();
const
auto
find_edge
=
[
&
](
uint32_t
node0
,
uint32_t
node1
)
{
if
(
node_number
_vector
[
node0
]
>
node_number
_vector
[
node1
])
{
if
(
node_number
[
node0
]
>
node_number
[
node1
])
{
std
::
swap
(
node0
,
node1
);
}
const
auto
&
edge_id_vector
=
node_to_edge_matrix
[
node0
];
...
...
@@ -821,15 +798,14 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
Array
<
int
>
edge_number_vector
=
copy
(
descriptor
.
edgeNumberVector
());
std
::
map
<
unsigned
int
,
std
::
vector
<
unsigned
int
>>
ref_edges_map
;
for
(
unsigned
int
e
=
0
;
e
<
gmsh_data
.
__
edge
s
.
size
();
++
e
)
{
const
unsigned
int
edge_id
=
find_edge
(
gmsh_data
.
__
edge
s
[
e
][
0
],
gmsh_data
.
__
edge
s
[
e
][
1
]);
for
(
unsigned
int
e
=
0
;
e
<
gmsh_data
.
edge
_entity
.
size
();
++
e
)
{
const
unsigned
int
edge_id
=
find_edge
(
gmsh_data
.
edge
_entity
[
e
][
0
],
gmsh_data
.
edge
_entity
[
e
][
1
]);
for
(
auto
ref
:
gmsh_data
.
__edges_ref
[
e
])
{
ref_edges_map
[
ref
].
push_back
(
edge_id
);
}
ref_edges_map
[
gmsh_data
.
edge_entity_ref
[
e
]].
push_back
(
edge_id
);
if
(
edge_number_vector
[
edge_id
]
!=
gmsh_data
.
__edges_number
[
e
])
{
if
(
auto
i_edge
=
edge_number_id_map
.
find
(
gmsh_data
.
__edges_number
[
e
]);
i_edge
!=
edge_number_id_map
.
end
())
{
if
(
edge_number_vector
[
edge_id
]
!=
gmsh_data
.
edge_entity_number
[
e
])
{
if
(
auto
i_edge
=
edge_number_id_map
.
find
(
gmsh_data
.
edge_entity_number
[
e
]);
i_edge
!=
edge_number_id_map
.
end
())
{
const
int
other_edge_id
=
i_edge
->
second
;
std
::
swap
(
edge_number_vector
[
edge_id
],
edge_number_vector
[
other_edge_id
]);
...
...
@@ -840,7 +816,7 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
edge_number_id_map
[
edge_number_vector
[
other_edge_id
]]
=
other_edge_id
;
}
else
{
edge_number_id_map
.
erase
(
edge_number_vector
[
edge_id
]);
edge_number_vector
[
edge_id
]
=
gmsh_data
.
__
edge
s
_number
[
e
];
edge_number_vector
[
edge_id
]
=
gmsh_data
.
edge
_entity
_number
[
e
];
edge_number_id_map
[
edge_number_vector
[
edge_id
]]
=
edge_id
;
}
}
...
...
@@ -854,8 +830,8 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
auto
ref_id
=
[
&
]
{
if
(
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_edge_list
.
first
);
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
{
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_edge_list
.
first
);
if
((
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
and
(
i_physical_ref
->
second
.
dimension
()
==
1
))
{
return
i_physical_ref
->
second
.
refId
();
}
else
{
return
RefId
{
ref_edge_list
.
first
};
...
...
@@ -880,7 +856,7 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
}
Array
<
bool
>
is_boundary_node
(
node_number
_vector
.
size
());
Array
<
bool
>
is_boundary_node
(
node_number
.
size
());
is_boundary_node
.
fill
(
false
);
const
auto
&
face_to_node_matrix
=
descriptor
.
faceToNodeMatrix
();
...
...
@@ -896,11 +872,9 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
std
::
map
<
unsigned
int
,
std
::
vector
<
unsigned
int
>>
ref_points_map
;
for
(
unsigned
int
r
=
0
;
r
<
gmsh_data
.
__points
.
size
();
++
r
)
{
const
unsigned
int
point_number
=
gmsh_data
.
__points
[
r
];
for
(
auto
ref
:
gmsh_data
.
__points_ref
[
r
])
{
ref_points_map
[
ref
].
push_back
(
point_number
);
}
for
(
unsigned
int
r
=
0
;
r
<
gmsh_data
.
point_entity
.
size
();
++
r
)
{
const
unsigned
int
point_number
=
gmsh_data
.
point_entity
[
r
];
ref_points_map
[
gmsh_data
.
point_entity_ref
[
r
]].
push_back
(
point_number
);
}
for
(
const
auto
&
ref_point_list
:
ref_points_map
)
{
...
...
@@ -910,8 +884,8 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
}
auto
ref_id
=
[
&
]
{
if
(
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_point_list
.
first
);
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
{
auto
i_physical_ref
=
gmsh_data
.
m_physical_ref_map
.
find
(
ref_point_list
.
first
);
if
((
i_physical_ref
!=
gmsh_data
.
m_physical_ref_map
.
end
())
and
(
i_physical_ref
->
second
.
dimension
()
==
0
))
{
return
i_physical_ref
->
second
.
refId
();
}
else
{
return
RefId
{
ref_point_list
.
first
};
...
...
@@ -954,7 +928,7 @@ GmshConnectivityBuilder<3>::GmshConnectivityBuilder(const GmshReader::GmshData&
}());
descriptor
.
setNodeOwnerVector
([
&
]
{
Array
<
int
>
node_owner_vector
(
node_number
_vector
.
size
());
Array
<
int
>
node_owner_vector
(
node_number
.
size
());
node_owner_vector
.
fill
(
parallel
::
rank
());
return
node_owner_vector
;
}());
...
...
@@ -1341,8 +1315,8 @@ struct actions<nodes_section>
throw
NormalError
(
error_msg
.
str
());
}
gmsh_data
.
__verticesN
umber
s
=
vertex_number_list
;
gmsh_data
.
__vertices
=
vertex_list
;
gmsh_data
.
node_n
umber
=
vertex_number_list
;
gmsh_data
.
node_coordinate
=
vertex_list
;
}
};
...
...
@@ -1385,9 +1359,9 @@ struct actions<elements_section>
const
size_t
number_of_elements
=
nb_elements
;
std
::
cout
<<
"- Number Of Elements: "
<<
number_of_elements
<<
'\n'
<<
std
::
flush
;
gmsh_data
.
__elementN
umber
.
resize
(
number_of_elements
);
gmsh_data
.
__elementT
ype
.
resize
(
number_of_elements
);
gmsh_data
.
_
_reference
s
.
resize
(
number_of_elements
);
gmsh_data
.
entity_n
umber
.
resize
(
number_of_elements
);
gmsh_data
.
entity_t
ype
.
resize
(
number_of_elements
);
gmsh_data
.
entity
_reference
.
resize
(
number_of_elements
);
gmsh_data
.
__elementVertices
.
resize
(
number_of_elements
);
std
::
vector
<
std
::
string_view
>
tokens
;
...
...
@@ -1412,33 +1386,29 @@ struct actions<elements_section>
throw
std
::
runtime_error
(
"empty element line"
);
}
gmsh_data
.
__elementN
umber
[
i_element
]
=
parse_int
(
tokens
[
0
]);
gmsh_data
.
entity_n
umber
[
i_element
]
=
parse_int
(
tokens
[
0
]);
const
int
e
lement
_type
=
parse_int
(
tokens
[
1
])
-
1
;
if
((
e
lement
_type
<
0
)
or
(
e
lement
_type
>
15
))
{
const
int
e
ntity
_type
=
parse_int
(
tokens
[
1
])
-
1
;
if
((
e
ntity
_type
<
0
)
or
(
e
ntity
_type
>
15
))
{
throw
std
::
runtime_error
(
"unknown element type"
);
}
if
(
not
supported_element
[
e
lement
_type
])
{
throw
std
::
runtime_error
(
std
::
string
{
element_name
[
e
lement
_type
]}
+
" is not supported"
);
if
(
not
supported_element
[
e
ntity
_type
])
{
throw
std
::
runtime_error
(
std
::
string
{
element_name
[
e
ntity
_type
]}
+
" is not supported"
);
}
gmsh_data
.
__elementT
ype
[
i_element
]
=
e
lement
_type
;
gmsh_data
.
entity_t
ype
[
i_element
]
=
e
ntity
_type
;
int
nb_tags
=
parse_int
(
tokens
[
2
]);
if
(
nb_tags
<
0
)
{
throw
std
::
runtime_error
(
std
::
string
{
element_name
[
e
lement
_type
]}
+
" number of tags is negative"
);
throw
std
::
runtime_error
(
std
::
string
{
element_name
[
e
ntity
_type
]}
+
" number of tags is negative"
);
}
const
size_t
number_of_tags
=
nb_tags
;
gmsh_data
.
__references
[
i_element
].
reserve
(
number_of_tags
);
for
(
size_t
i_tag
=
0
;
i_tag
<
number_of_tags
;
++
i_tag
)
{
gmsh_data
.
__references
[
i_element
].
push_back
(
parse_int
(
tokens
[
3
+
i_tag
]));
#warning store all referencess
break
;
}
gmsh_data
.
entity_reference
[
i_element
]
=
parse_int
(
tokens
[
3
]);
// In Gmsh file format 2.2 the first tag IS the physical tag
// other are spurious construction element tags
const
size_t
first_node_index
=
3
+
number_of_tags
;
const
size_t
number_of_nodes
=
primitive_number_of_nodes
[
e
lement
_type
];
const
size_t
number_of_nodes
=
primitive_number_of_nodes
[
e
ntity
_type
];
gmsh_data
.
__elementVertices
[
i_element
].
resize
(
number_of_nodes
);
for
(
size_t
i_node
=
0
;
i_node
<
number_of_nodes
;
++
i_node
)
{
...
...
@@ -1548,27 +1518,25 @@ GmshReader::GmshReader(const std::string& filename) : m_filename(filename)
void
GmshReader
::
__proceedData
()
{
TinyVector
<
15
,
int
>
element
N
umber
=
zero
;
std
::
vector
<
std
::
set
<
size_t
>>
element
R
eference
s
(
15
);
TinyVector
<
15
,
int
>
element
_n
umber
=
zero
;
std
::
vector
<
std
::
set
<
size_t
>>
element
_r
eference
(
15
);
for
(
size_t
i
=
0
;
i
<
m_mesh_data
.
__elementType
.
size
();
++
i
)
{
const
int
elementType
=
m_mesh_data
.
__elementType
[
i
];
elementNumber
[
elementType
]
++
;
for
(
auto
ref
:
m_mesh_data
.
__references
[
i
])
{
elementReferences
[
elementType
].
insert
(
ref
);
}
for
(
size_t
i
=
0
;
i
<
m_mesh_data
.
entity_type
.
size
();
++
i
)
{
const
int
elementType
=
m_mesh_data
.
entity_type
[
i
];
element_number
[
elementType
]
++
;
element_reference
[
elementType
].
insert
(
m_mesh_data
.
entity_reference
[
i
]);
}
for
(
size_t
i
=
0
;
i
<
element
N
umber
.
dimension
();
++
i
)
{
if
(
element
N
umber
[
i
]
>
0
)
{
std
::
cout
<<
" - Number of "
<<
gmsh_parser
::
element_name
[
i
]
<<
": "
<<
element
N
umber
[
i
];
for
(
size_t
i
=
0
;
i
<
element
_n
umber
.
dimension
();
++
i
)
{
if
(
element
_n
umber
[
i
]
>
0
)
{
std
::
cout
<<
" - Number of "
<<
gmsh_parser
::
element_name
[
i
]
<<
": "
<<
element
_n
umber
[
i
];
if
(
not
(
gmsh_parser
::
supported_element
[
i
]))
{
std
::
cout
<<
" ["
<<
rang
::
fg
::
yellow
<<
"IGNORED"
<<
rang
::
style
::
reset
<<
"]"
;
}
else
{
std
::
cout
<<
" references: "
;
for
(
std
::
set
<
size_t
>::
const_iterator
iref
=
element
R
eference
s
[
i
].
begin
();
iref
!=
element
R
eference
s
[
i
].
end
();
for
(
std
::
set
<
size_t
>::
const_iterator
iref
=
element
_r
eference
[
i
].
begin
();
iref
!=
element
_r
eference
[
i
].
end
();
++
iref
)
{
if
(
iref
!=
element
R
eference
s
[
i
].
begin
())
if
(
iref
!=
element
_r
eference
[
i
].
begin
())
std
::
cout
<<
','
;
std
::
cout
<<
*
iref
;
}
...
...
@@ -1576,51 +1544,51 @@ GmshReader::__proceedData()
switch
(
i
)
{
// Supported entities
case
0
:
{
// edges
m_mesh_data
.
__
edge
s
=
Array
<
GmshData
::
Edge
>
(
element
N
umber
[
i
]);
m_mesh_data
.
__
edge
s_ref
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
__
edge
s_number
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
edge
_entity
=
Array
<
GmshData
::
Edge
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
edge
_entity_ref
=
Array
<
int
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
edge
_entity_number
=
Array
<
int
>
(
element
_n
umber
[
i
]);
break
;
}
case
1
:
{
// triangles
m_mesh_data
.
__
triangle
s
=
Array
<
GmshData
::
Triangle
>
(
element
N
umber
[
i
]);
m_mesh_data
.
__
triangle
s_ref
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
__
triangle
s_number
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
triangle
_entity
=
Array
<
GmshData
::
Triangle
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
triangle
_entity_ref
=
Array
<
int
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
triangle
_entity_number
=
Array
<
int
>
(
element
_n
umber
[
i
]);
break
;
}
case
2
:
{
// quadrangles
m_mesh_data
.
__
quadrangle
s
=
Array
<
GmshData
::
Quadrangle
>
(
element
N
umber
[
i
]);
m_mesh_data
.
__
quadrangle
s_ref
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
__
quadrangle
s_number
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
quadrangle
_entity
=
Array
<
GmshData
::
Quadrangle
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
quadrangle
_entity_ref
=
Array
<
int
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
quadrangle
_entity_number
=
Array
<
int
>
(
element
_n
umber
[
i
]);
break
;
}
case
3
:
{
// tetrahedra
m_mesh_data
.
__
tetrahedr
a
=
Array
<
GmshData
::
Tetrahedron
>
(
element
N
umber
[
i
]);
m_mesh_data
.
__
tetrahedr
a_ref
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
__
tetrahedr
a_number
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
tetrahedr
on_entity
=
Array
<
GmshData
::
Tetrahedron
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
tetrahedr
on_entity_ref
=
Array
<
int
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
tetrahedr
on_entity_number
=
Array
<
int
>
(
element
_n
umber
[
i
]);
break
;
}
case
4
:
{
// hexahedra
m_mesh_data
.
__
hexahedr
a
=
Array
<
GmshData
::
Hexahedron
>
(
element
N
umber
[
i
]);
m_mesh_data
.
__
hexahedr
a_ref
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
__
hexahedr
a_number
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
hexahedr
on_entity
=
Array
<
GmshData
::
Hexahedron
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
hexahedr
on_entity_ref
=
Array
<
int
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
hexahedr
on_entity_number
=
Array
<
int
>
(
element
_n
umber
[
i
]);
break
;
}
case
5
:
{
// prism
m_mesh_data
.
__
prism
s
=
Array
<
GmshData
::
Prism
>
(
element
N
umber
[
i
]);
m_mesh_data
.
__
prism
s_ref
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
__
prism
s_number
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
prism
_entity
=
Array
<
GmshData
::
Prism
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
prism
_entity_ref
=
Array
<
int
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
prism
_entity_number
=
Array
<
int
>
(
element
_n
umber
[
i
]);
break
;
}
case
6
:
{
// pyramid
m_mesh_data
.
__
pyramid
s
=
Array
<
GmshData
::
Pyramid
>
(
element
N
umber
[
i
]);
m_mesh_data
.
__
pyramid
s_ref
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
__
pyramid
s_number
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
pyramid
_entity
=
Array
<
GmshData
::
Pyramid
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
pyramid
_entity_ref
=
Array
<
int
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
pyramid
_entity_number
=
Array
<
int
>
(
element
_n
umber
[
i
]);
break
;
}
case
14
:
{
// point
m_mesh_data
.
__
point
s
=
Array
<
GmshData
::
Point
>
(
element
N
umber
[
i
]);
m_mesh_data
.
__
point
s_ref
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
__
point
s_number
.
resize
(
element
N
umber
[
i
]);
m_mesh_data
.
point
_entity
=
Array
<
GmshData
::
Point
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
point
_entity_ref
=
Array
<
int
>
(
element
_n
umber
[
i
]);
m_mesh_data
.
point
_entity_number
=
Array
<
int
>
(
element
_n
umber
[
i
]);
break
;
}
// Unsupported entities
...
...
@@ -1640,156 +1608,135 @@ GmshReader::__proceedData()
}
}
const
int
min
N
umber
=
min
(
m_mesh_data
.
__verticesN
umber
s
);
const
int
max
N
umber
=
max
(
m_mesh_data
.
__verticesN
umber
s
);
const
int
min
_node_n
umber
=
min
(
m_mesh_data
.
node_n
umber
);
const
int
max
_node_n
umber
=
max
(
m_mesh_data
.
node_n
umber
);
if
(
min
N
umber
<
0
)
{
if
(
min
_node_n
umber
<
0
)
{
throw
NotImplementedError
(
"reading file '"
+
m_filename
+
"': negative vertices number"
);
}
#warning consider the case of very sparse node lists (max-min>3*nb nodes). Uses unordered_map?
// A value of -1 means that the vertex is unknown
m_mesh_data
.
__verticesC
orrepondance
.
resize
(
max
N
umber
+
1
,
-
1
);
m_mesh_data
.
gmsh_node_to_node_id_c
orre
s
pondance
.
resize
(
max
_node_n
umber
+
1
,
-
1
);
for
(
size_t
i
=
0
;
i
<
m_mesh_data
.
__verticesN
umber
s
.
size
();
++
i
)
{
m_mesh_data
.
__verticesC
orrepondance
[
m_mesh_data
.
__verticesN
umber
s
[
i
]]
=
i
;
for
(
size_t
i
=
0
;
i
<
m_mesh_data
.
node_n
umber
.
size
();
++
i
)
{
m_mesh_data
.
gmsh_node_to_node_id_c
orre
s
pondance
[
m_mesh_data
.
node_n
umber
[
i
]]
=
i
;
}
// reset element number to count them while filling structures
element
N
umber
=
zero
;
element
_n
umber
=
zero
;
// Element structures filling
for
(
size_t
i
=
0
;
i
<
m_mesh_data
.
__elementT
ype
.
size
();
++
i
)
{
for
(
size_t
i
=
0
;
i
<
m_mesh_data
.
entity_t
ype
.
size
();
++
i
)
{
std
::
vector
<
int
>&
elementVertices
=
m_mesh_data
.
__elementVertices
[
i
];
switch
(
m_mesh_data
.
__elementT
ype
[
i
])
{
switch
(
m_mesh_data
.
entity_t
ype
[
i
])
{
// Supported entities
case
0
:
{
// edge
int
&
edgeNumber
=
elementNumber
[
0
];
const
int
a
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
0
]];
const
int
b
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
1
]];
if
((
a
<
0
)
or
(
b
<
0
))
{
throw
NormalError
(
"reading file '"
+
m_filename
+
"': error reading element "
+
stringify
(
i
)
+
" [bad vertices definition]"
);
}
m_mesh_data
.
__edges
[
edgeNumber
]
=
GmshData
::
Edge
(
a
,
b
);
m_mesh_data
.
__edges_ref
[
edgeNumber
]
=
std
::
move
(
m_mesh_data
.
__references
[
i
]);
m_mesh_data
.
__edges_number
[
edgeNumber
]
=
m_mesh_data
.
__elementNumber
[
i
];
edgeNumber
++
;
// one more edge
int
&
edge_number
=
element_number
[
0
];
const
auto
a
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
0
]];
const
auto
b
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
1
]];
m_mesh_data
.
edge_entity
[
edge_number
]
=
GmshData
::
Edge
{
a
,
b
};
m_mesh_data
.
edge_entity_ref
[
edge_number
]
=
m_mesh_data
.
entity_reference
[
i
];
m_mesh_data
.
edge_entity_number
[
edge_number
]
=
m_mesh_data
.
entity_number
[
i
];
edge_number
++
;
// one more edge
break
;
}
case
1
:
{
// triangles
int
&
triangleNumber
=
elementNumber
[
1
];
const
int
a
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
0
]];
const
int
b
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
1
]];
const
int
c
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
2
]];
if
((
a
<
0
)
or
(
b
<
0
)
or
(
c
<
0
))
{
throw
NormalError
(
"reading file '"
+
m_filename
+
"': error reading element "
+
stringify
(
i
)
+
" [bad vertices definition]"
);
}
m_mesh_data
.
__triangles
[
triangleNumber
]
=
GmshData
::
Triangle
(
a
,
b
,
c
);
m_mesh_data
.
__triangles_ref
[
triangleNumber
]
=
std
::
move
(
m_mesh_data
.
__references
[
i
]);
m_mesh_data
.
__triangles_number
[
triangleNumber
]
=
m_mesh_data
.
__elementNumber
[
i
];
triangleNumber
++
;
// one more triangle
int
&
triangle_number
=
element_number
[
1
];
const
auto
a
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
0
]];
const
auto
b
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
1
]];
const
auto
c
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
2
]];
m_mesh_data
.
triangle_entity
[
triangle_number
]
=
GmshData
::
Triangle
{
a
,
b
,
c
};
m_mesh_data
.
triangle_entity_ref
[
triangle_number
]
=
m_mesh_data
.
entity_reference
[
i
];
m_mesh_data
.
triangle_entity_number
[
triangle_number
]
=
m_mesh_data
.
entity_number
[
i
];
triangle_number
++
;
// one more triangle
break
;
}
case
2
:
{
// quadrangle
int
&
quadrilateralNumber
=
elementNumber
[
2
];
const
int
a
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
0
]];
const
int
b
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
1
]];
const
int
c
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
2
]];
const
int
d
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
3
]];
if
((
a
<
0
)
or
(
b
<
0
)
or
(
c
<
0
)
or
(
d
<
0
))
{
throw
NormalError
(
"reading file '"
+
m_filename
+
"': error reading element "
+
stringify
(
i
)
+
" [bad vertices definition]"
);
}
m_mesh_data
.
__quadrangles
[
quadrilateralNumber
]
=
GmshData
::
Quadrangle
(
a
,
b
,
c
,
d
);
m_mesh_data
.
__quadrangles_ref
[
quadrilateralNumber
]
=
std
::
move
(
m_mesh_data
.
__references
[
i
]);
m_mesh_data
.
__quadrangles_number
[
quadrilateralNumber
]
=
m_mesh_data
.
__elementNumber
[
i
];
quadrilateralNumber
++
;
// one more quadrangle
int
&
quadrilateral_number
=
element_number
[
2
];
const
auto
a
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
0
]];
const
auto
b
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
1
]];
const
auto
c
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
2
]];
const
auto
d
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
3
]];
m_mesh_data
.
quadrangle_entity
[
quadrilateral_number
]
=
GmshData
::
Quadrangle
{
a
,
b
,
c
,
d
};
m_mesh_data
.
quadrangle_entity_ref
[
quadrilateral_number
]
=
m_mesh_data
.
entity_reference
[
i
];
m_mesh_data
.
quadrangle_entity_number
[
quadrilateral_number
]
=
m_mesh_data
.
entity_number
[
i
];
quadrilateral_number
++
;
// one more quadrangle
break
;
}
case
3
:
{
// tetrahedra
int
&
tetrahedronNumber
=
elementNumber
[
3
];
const
int
a
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
0
]];
const
int
b
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
1
]];
const
int
c
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
2
]];
const
int
d
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
3
]];
if
((
a
<
0
)
or
(
b
<
0
)
or
(
c
<
0
)
or
(
d
<
0
))
{
throw
NormalError
(
"reading file '"
+
m_filename
+
"': error reading element "
+
stringify
(
i
)
+
" [bad vertices definition]"
);
}
m_mesh_data
.
__tetrahedra
[
tetrahedronNumber
]
=
GmshData
::
Tetrahedron
(
a
,
b
,
c
,
d
);
m_mesh_data
.
__tetrahedra_ref
[
tetrahedronNumber
]
=
std
::
move
(
m_mesh_data
.
__references
[
i
]);
m_mesh_data
.
__tetrahedra_number
[
tetrahedronNumber
]
=
m_mesh_data
.
__elementNumber
[
i
];
tetrahedronNumber
++
;
// one more tetrahedron
int
&
tetrahedron_number
=
element_number
[
3
];
const
auto
a
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
0
]];
const
auto
b
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
1
]];
const
auto
c
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
2
]];
const
auto
d
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
3
]];
m_mesh_data
.
tetrahedron_entity
[
tetrahedron_number
]
=
GmshData
::
Tetrahedron
{
a
,
b
,
c
,
d
};
m_mesh_data
.
tetrahedron_entity_ref
[
tetrahedron_number
]
=
m_mesh_data
.
entity_reference
[
i
];
m_mesh_data
.
tetrahedron_entity_number
[
tetrahedron_number
]
=
m_mesh_data
.
entity_number
[
i
];
tetrahedron_number
++
;
// one more tetrahedron
break
;
}
case
4
:
{
// hexaredron
int
&
hexahedronNumber
=
elementNumber
[
4
];
const
int
a
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
0
]];
const
int
b
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
1
]];
const
int
c
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
2
]];
const
int
d
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
3
]];
const
int
e
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
4
]];
const
int
f
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
5
]];
const
int
g
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
6
]];
const
int
h
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
7
]];
if
((
a
<
0
)
or
(
b
<
0
)
or
(
c
<
0
)
or
(
d
<
0
)
or
(
e
<
0
)
or
(
f
<
0
)
or
(
g
<
0
)
or
(
h
<
0
))
{
throw
NormalError
(
"reading file '"
+
m_filename
+
"': error reading element "
+
stringify
(
i
)
+
" [bad vertices definition]"
);
}
m_mesh_data
.
__hexahedra
[
hexahedronNumber
]
=
GmshData
::
Hexahedron
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
);
m_mesh_data
.
__hexahedra_ref
[
hexahedronNumber
]
=
std
::
move
(
m_mesh_data
.
__references
[
i
]);
m_mesh_data
.
__hexahedra_number
[
hexahedronNumber
]
=
m_mesh_data
.
__elementNumber
[
i
];
hexahedronNumber
++
;
// one more hexahedron
int
&
hexahedron_number
=
element_number
[
4
];
const
auto
a
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
0
]];
const
auto
b
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
1
]];
const
auto
c
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
2
]];
const
auto
d
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
3
]];
const
auto
e
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
4
]];
const
auto
f
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
5
]];
const
auto
g
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
6
]];
const
auto
h
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
7
]];
m_mesh_data
.
hexahedron_entity
[
hexahedron_number
]
=
GmshData
::
Hexahedron
{
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
};
m_mesh_data
.
hexahedron_entity_ref
[
hexahedron_number
]
=
m_mesh_data
.
entity_reference
[
i
];
m_mesh_data
.
hexahedron_entity_number
[
hexahedron_number
]
=
m_mesh_data
.
entity_number
[
i
];
hexahedron_number
++
;
// one more hexahedron
break
;
}
case
5
:
{
// prism
int
&
prism_number
=
elementNumber
[
5
];
const
int
a
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
0
]];
const
int
b
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
1
]];
const
int
c
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
2
]];
const
int
d
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
3
]];
const
int
e
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
4
]];
const
int
f
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
5
]];
if
((
a
<
0
)
or
(
b
<
0
)
or
(
c
<
0
)
or
(
d
<
0
)
or
(
e
<
0
)
or
(
f
<
0
))
{
throw
NormalError
(
"reading file '"
+
m_filename
+
"': error reading element "
+
stringify
(
i
)
+
" [bad vertices definition]"
);
}
m_mesh_data
.
__prisms
[
prism_number
]
=
GmshData
::
Prism
(
a
,
b
,
c
,
d
,
e
,
f
);
m_mesh_data
.
__prisms_ref
[
prism_number
]
=
std
::
move
(
m_mesh_data
.
__references
[
i
]);
m_mesh_data
.
__prisms_number
[
prism_number
]
=
m_mesh_data
.
__elementNumber
[
i
];
int
&
prism_number
=
element_number
[
5
];
const
auto
a
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
0
]];
const
auto
b
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
1
]];
const
auto
c
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
2
]];
const
auto
d
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
3
]];
const
auto
e
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
4
]];
const
auto
f
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
5
]];
m_mesh_data
.
prism_entity
[
prism_number
]
=
GmshData
::
Prism
{
a
,
b
,
c
,
d
,
e
,
f
};
m_mesh_data
.
prism_entity_ref
[
prism_number
]
=
m_mesh_data
.
entity_reference
[
i
];
m_mesh_data
.
prism_entity_number
[
prism_number
]
=
m_mesh_data
.
entity_number
[
i
];
prism_number
++
;
// one more prism
break
;
}
case
6
:
{
// pyramid
int
&
pyramid_number
=
elementNumber
[
6
];
const
int
a
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
0
]];
const
int
b
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
1
]];
const
int
c
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
2
]];
const
int
d
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
3
]];
const
int
e
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
4
]];
if
((
a
<
0
)
or
(
b
<
0
)
or
(
c
<
0
)
or
(
d
<
0
)
or
(
e
<
0
))
{
throw
NormalError
(
"reading file '"
+
m_filename
+
"': error reading element "
+
stringify
(
i
)
+
" [bad vertices definition]"
);
}
m_mesh_data
.
__pyramids
[
pyramid_number
]
=
GmshData
::
Pyramid
(
a
,
b
,
c
,
d
,
e
);
m_mesh_data
.
__pyramids_ref
[
pyramid_number
]
=
std
::
move
(
m_mesh_data
.
__references
[
i
]);
m_mesh_data
.
__pyramids_number
[
pyramid_number
]
=
m_mesh_data
.
__elementNumber
[
i
];
int
&
pyramid_number
=
element_number
[
6
];
const
auto
a
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
0
]];
const
auto
b
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
1
]];
const
auto
c
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
2
]];
const
auto
d
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
3
]];
const
auto
e
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
4
]];
m_mesh_data
.
pyramid_entity
[
pyramid_number
]
=
GmshData
::
Pyramid
{
a
,
b
,
c
,
d
,
e
};
m_mesh_data
.
pyramid_entity_ref
[
pyramid_number
]
=
m_mesh_data
.
entity_reference
[
i
];
m_mesh_data
.
pyramid_entity_number
[
pyramid_number
]
=
m_mesh_data
.
entity_number
[
i
];
pyramid_number
++
;
// one more hexahedron
break
;
}
// Unsupported entities
case
14
:
{
// point
int
&
point_number
=
elementNumber
[
14
];
const
int
a
=
m_mesh_data
.
__verticesCorrepondance
[
elementVertices
[
0
]];
m_mesh_data
.
__points
[
point_number
]
=
a
;
m_mesh_data
.
__points_ref
[
point_number
]
=
std
::
move
(
m_mesh_data
.
__references
[
i
]);
m_mesh_data
.
__points_number
[
point_number
]
=
m_mesh_data
.
__elementNumber
[
i
];
int
&
point_number
=
element_number
[
14
];
m_mesh_data
.
point_entity
[
point_number
]
=
m_mesh_data
.
gmsh_node_to_node_id_correspondance
[
elementVertices
[
0
]];
m_mesh_data
.
point_entity_ref
[
point_number
]
=
m_mesh_data
.
entity_reference
[
i
];
m_mesh_data
.
point_entity_number
[
point_number
]
=
m_mesh_data
.
entity_number
[
i
];
point_number
++
;
break
;
}
...
...
@@ -1802,7 +1749,7 @@ GmshReader::__proceedData()
case
13
:
{
// second order pyramid
}
default
:
{
throw
NormalError
(
"reading file '"
+
m_filename
+
"':
ff3d
cannot read this kind of element"
);
throw
NormalError
(
"reading file '"
+
m_filename
+
"': cannot read this kind of element"
);
}
}
}
...
...
@@ -1827,8 +1774,8 @@ GmshReader::__proceedData()
dimension3_mask
[
12
]
=
1
;
dimension3_mask
[
13
]
=
1
;
if
(
dot
(
dimension3_mask
,
element
N
umber
)
>
0
)
{
const
size_t
nb_cells
=
dot
(
dimension3_mask
,
element
N
umber
);
if
(
dot
(
dimension3_mask
,
element
_n
umber
)
>
0
)
{
const
size_t
nb_cells
=
dot
(
dimension3_mask
,
element
_n
umber
);
GmshConnectivityBuilder
<
3
>
connectivity_builder
(
m_mesh_data
,
nb_cells
);
...
...
@@ -1839,17 +1786,12 @@ GmshReader::__proceedData()
using
MeshType
=
Mesh
<
3
>
;
using
Rd
=
TinyVector
<
3
,
double
>
;
NodeValue
<
Rd
>
xr
(
connectivity
);
for
(
NodeId
i
=
0
;
i
<
m_mesh_data
.
__vertices
.
size
();
++
i
)
{
xr
[
i
][
0
]
=
m_mesh_data
.
__vertices
[
i
][
0
];
xr
[
i
][
1
]
=
m_mesh_data
.
__vertices
[
i
][
1
];
xr
[
i
][
2
]
=
m_mesh_data
.
__vertices
[
i
][
2
];
}
NodeValue
<
Rd
>
xr
(
connectivity
,
m_mesh_data
.
node_coordinate
);
m_mesh
=
std
::
make_shared
<
MeshVariant
>
(
std
::
make_shared
<
const
MeshType
>
(
p_connectivity
,
xr
));
this
->
_checkMesh
<
3
>
();
}
else
if
(
dot
(
dimension2_mask
,
element
N
umber
)
>
0
)
{
const
size_t
nb_cells
=
dot
(
dimension2_mask
,
element
N
umber
);
}
else
if
(
dot
(
dimension2_mask
,
element
_n
umber
)
>
0
)
{
const
size_t
nb_cells
=
dot
(
dimension2_mask
,
element
_n
umber
);
GmshConnectivityBuilder
<
2
>
connectivity_builder
(
m_mesh_data
,
nb_cells
);
...
...
@@ -1861,15 +1803,15 @@ GmshReader::__proceedData()
using
Rd
=
TinyVector
<
2
,
double
>
;
NodeValue
<
Rd
>
xr
(
connectivity
);
for
(
NodeId
i
=
0
;
i
<
m_mesh_data
.
__vertices
.
size
();
++
i
)
{
xr
[
i
][
0
]
=
m_mesh_data
.
__vertices
[
i
][
0
];
xr
[
i
][
1
]
=
m_mesh_data
.
__vertices
[
i
][
1
];
for
(
NodeId
i
=
0
;
i
<
m_mesh_data
.
node_coordinate
.
size
();
++
i
)
{
xr
[
i
][
0
]
=
m_mesh_data
.
node_coordinate
[
i
][
0
];
xr
[
i
][
1
]
=
m_mesh_data
.
node_coordinate
[
i
][
1
];
}
m_mesh
=
std
::
make_shared
<
MeshVariant
>
(
std
::
make_shared
<
const
MeshType
>
(
p_connectivity
,
xr
));
this
->
_checkMesh
<
2
>
();
}
else
if
(
dot
(
dimension1_mask
,
element
N
umber
)
>
0
)
{
const
size_t
nb_cells
=
dot
(
dimension1_mask
,
element
N
umber
);
}
else
if
(
dot
(
dimension1_mask
,
element
_n
umber
)
>
0
)
{
const
size_t
nb_cells
=
dot
(
dimension1_mask
,
element
_n
umber
);
GmshConnectivityBuilder
<
1
>
connectivity_builder
(
m_mesh_data
,
nb_cells
);
...
...
@@ -1881,8 +1823,8 @@ GmshReader::__proceedData()
using
Rd
=
TinyVector
<
1
,
double
>
;
NodeValue
<
Rd
>
xr
(
connectivity
);
for
(
NodeId
i
=
0
;
i
<
m_mesh_data
.
__vertices
.
size
();
++
i
)
{
xr
[
i
][
0
]
=
m_mesh_data
.
__vertices
[
i
][
0
];
for
(
NodeId
i
=
0
;
i
<
m_mesh_data
.
node_coordinate
.
size
();
++
i
)
{
xr
[
i
][
0
]
=
m_mesh_data
.
node_coordinate
[
i
][
0
];
}
m_mesh
=
std
::
make_shared
<
MeshVariant
>
(
std
::
make_shared
<
const
MeshType
>
(
p_connectivity
,
xr
));
...
...
This diff is collapsed.
Click to expand it.
src/mesh/GmshReader.hpp
View file @
dbc6302d
...
...
@@ -55,10 +55,7 @@ class GmshReader : public MeshBuilderBase
PhysicalRefId
&
operator
=
(
const
PhysicalRefId
&
)
=
default
;
PhysicalRefId
&
operator
=
(
PhysicalRefId
&&
)
=
default
;
PhysicalRefId
(
int
dimension
,
const
RefId
&
ref_id
)
:
m_dimension
(
dimension
),
m_ref_id
(
ref_id
)
{
;
}
PhysicalRefId
(
int
dimension
,
const
RefId
&
ref_id
)
:
m_dimension
(
dimension
),
m_ref_id
(
ref_id
)
{}
PhysicalRefId
()
=
default
;
PhysicalRefId
(
const
PhysicalRefId
&
)
=
default
;
PhysicalRefId
(
PhysicalRefId
&&
)
=
default
;
...
...
@@ -81,70 +78,70 @@ class GmshReader : public MeshBuilderBase
* Gmsh format provides a numbered, none ordrered and none dense
* vertices list, this stores the number of read vertices.
*/
Array
<
int
>
__verticesN
umber
s
;
Array
<
int
>
node_n
umber
;
Array
<
R3
>
__vertices
;
Array
<
R3
>
node_coordinate
;
using
Point
=
unsigned
int
;
Array
<
Point
>
__
point
s
;
std
::
vector
<
std
::
vector
<
int
>
>
__
point
s
_ref
;
std
::
vector
<
int
>
__
point
s
_number
;
using
Edge
=
TinyVector
<
2
,
unsigned
int
>
;
Array
<
Edge
>
__
edge
s
;
std
::
vector
<
std
::
vector
<
int
>>
__edges
_ref
;
std
::
vector
<
int
>
__
edge
s
_number
;
using
Triangle
=
TinyVector
<
3
,
unsigned
int
>
;
Array
<
Triangle
>
__
triangle
s
;
std
::
vector
<
std
::
vector
<
int
>
>
__
triangle
s
_ref
;
std
::
vector
<
int
>
__
triangle
s
_number
;
using
Quadrangle
=
TinyVector
<
4
,
unsigned
int
>
;
Array
<
Quadrangle
>
__
quadrangle
s
;
std
::
vector
<
std
::
vector
<
int
>
>
__
quadrangle
s
_ref
;
std
::
vector
<
int
>
__
quadrangle
s
_number
;
using
Tetrahedron
=
TinyVector
<
4
,
unsigned
int
>
;
Array
<
Tetrahedron
>
__
tetrahedr
a
;
std
::
vector
<
std
::
vector
<
int
>
>
__
tetrahedr
a
_ref
;
std
::
vector
<
int
>
__
tetrahedr
a
_number
;
using
Pyramid
=
TinyVector
<
5
,
unsigned
int
>
;
Array
<
Pyramid
>
__
pyramid
s
;
std
::
vector
<
std
::
vector
<
int
>
>
__
pyramid
s
_ref
;
std
::
vector
<
int
>
__
pyramid
s
_number
;
using
Prism
=
TinyVector
<
6
,
unsigned
int
>
;
Array
<
Prism
>
__
prism
s
;
std
::
vector
<
std
::
vector
<
int
>
>
__
prism
s
_ref
;
std
::
vector
<
int
>
__
prism
s
_number
;
using
Hexahedron
=
TinyVector
<
8
,
unsigned
int
>
;
Array
<
Hexahedron
>
__
hexahedr
a
;
std
::
vector
<
std
::
vector
<
int
>
>
__
hexahedr
a
_ref
;
std
::
vector
<
int
>
__
hexahedr
a
_number
;
Array
<
Point
>
point
_entity
;
Array
<
int
>
point
_entity
_ref
;
Array
<
int
>
point
_entity
_number
;
using
Edge
=
std
::
array
<
unsigned
int
,
2
>
;
Array
<
Edge
>
edge
_entity
;
Array
<
int
>
edge_entity
_ref
;
Array
<
int
>
edge
_entity
_number
;
using
Triangle
=
std
::
array
<
unsigned
int
,
3
>
;
Array
<
Triangle
>
triangle
_entity
;
Array
<
int
>
triangle
_entity
_ref
;
Array
<
int
>
triangle
_entity
_number
;
using
Quadrangle
=
std
::
array
<
unsigned
int
,
4
>
;
Array
<
Quadrangle
>
quadrangle
_entity
;
Array
<
int
>
quadrangle
_entity
_ref
;
Array
<
int
>
quadrangle
_entity
_number
;
using
Tetrahedron
=
std
::
array
<
unsigned
int
,
4
>
;
Array
<
Tetrahedron
>
tetrahedr
on_entity
;
Array
<
int
>
tetrahedr
on_entity
_ref
;
Array
<
int
>
tetrahedr
on_entity
_number
;
using
Pyramid
=
std
::
array
<
unsigned
int
,
5
>
;
Array
<
Pyramid
>
pyramid
_entity
;
Array
<
int
>
pyramid
_entity
_ref
;
Array
<
int
>
pyramid
_entity
_number
;
using
Prism
=
std
::
array
<
unsigned
int
,
6
>
;
Array
<
Prism
>
prism
_entity
;
Array
<
int
>
prism
_entity
_ref
;
Array
<
int
>
prism
_entity
_number
;
using
Hexahedron
=
std
::
array
<
unsigned
int
,
8
>
;
Array
<
Hexahedron
>
hexahedr
on_entity
;
Array
<
int
>
hexahedr
on_entity
_ref
;
Array
<
int
>
hexahedr
on_entity
_number
;
/**
* Gmsh format provides a numbered, none ordrered and none dense
* vertices list, this provides vertices renumbering correspondence
*/
std
::
vector
<
int
>
__verticesC
orrepondance
;
std
::
vector
<
unsigned
int
>
gmsh_node_to_node_id_c
orre
s
pondance
;
/**
* elements types
*/
std
::
vector
<
int
>
__elementN
umber
;
std
::
vector
<
int
>
entity_n
umber
;
/**
* elements types
*/
std
::
vector
<
short
>
__elementT
ype
;
std
::
vector
<
short
>
entity_t
ype
;
/**
* References
*/
std
::
vector
<
std
::
vector
<
int
>>
_
_reference
s
;
std
::
vector
<
int
>
entity
_reference
;
/**
* References
...
...
This diff is collapsed.
Click to expand it.