Skip to content

Commit 462e362

Browse files
committed
Added get_side_set_node_list method
1 parent 28d459e commit 462e362

File tree

2 files changed

+145
-8
lines changed

2 files changed

+145
-8
lines changed

exodus_helper/core.py

Lines changed: 144 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,20 @@
3232
(1, 4, 5, 8): 4,
3333
(1, 2, 3, 4): 5,
3434
(5, 6, 7, 8): 6},
35+
'HEX27': {
36+
(1, 2, 6, 5, 9, 14, 17, 13, 26): 1,
37+
(2, 3, 7, 6, 10, 15, 18, 14, 25): 2,
38+
(3, 4, 8, 7, 11, 16, 19, 15, 27): 3,
39+
(1, 5, 8, 4, 13, 20, 16, 12, 24): 4,
40+
(1, 4, 3, 2, 12, 11, 10, 9, 22): 5,
41+
(5, 6, 7, 8, 17, 18, 19, 20, 23): 6},
42+
'HEX16': {
43+
(1, 2, 6, 5, 9, 13, 0, 0): 1,
44+
(2, 3, 7, 6, 10, 14, 0, 0): 2,
45+
(3, 4, 8, 7, 11, 15, 0, 0): 3,
46+
(4, 1, 5, 8, 12, 16, 0, 0): 4,
47+
(1, 4, 3, 2, 12, 11, 10, 9): 5,
48+
(5, 6, 7, 8, 13, 14, 15, 16): 6},
3549
'TETRA': {
3650
(1, 2, 4): 1,
3751
(2, 3, 4): 2,
@@ -41,7 +55,82 @@
4155
(1, 5, 2, 9, 4, 8): 1,
4256
(2, 6, 3, 10, 4, 9): 2,
4357
(1, 7, 3, 10, 4, 8): 3,
44-
(1, 5, 2, 6, 3, 7): 4}}
58+
(1, 5, 2, 6, 3, 7): 4},
59+
'TETRA14': {
60+
(1, 2, 4, 5, 9, 8, 14): 1,
61+
(2, 3, 4, 6, 10, 9, 12): 2,
62+
(1, 4, 3, 8, 10, 7, 13): 3,
63+
(1, 3, 2, 7, 6, 5, 11): 4},
64+
'TRI': {
65+
(1, 2, 4): 1,
66+
(2, 3, 5): 2,
67+
(3, 1, 6): 3},
68+
'TRI3': {
69+
(1, 2, 3, 4, 5, 6, 7): 1,
70+
(3, 2, 1, 6, 5, 4, 7): 2,
71+
(1, 2, 4, 0, 0, 0, 0): 3,
72+
(2, 3, 5, 0, 0, 0, 0): 4,
73+
(3, 1, 6, 0, 0, 0, 0): 5},
74+
'QUAD': {
75+
(1, 2, 5): 1,
76+
(2, 3, 6): 2,
77+
(3, 4, 7): 3,
78+
(4, 1, 8): 4},
79+
'SHELL': {
80+
(1, 2, 3, 4, 5, 6, 7, 8, 9): 1,
81+
(1, 4, 3, 2, 8, 7, 6, 5, 9): 2,
82+
(1, 2, 5, 0, 0, 0, 0, 0, 0): 3,
83+
(2, 3, 6, 0, 0, 0, 0, 0, 0): 4,
84+
(3, 4, 7, 0, 0, 0, 0, 0, 0): 5,
85+
(4, 1, 8, 0, 0, 0, 0, 0, 0): 6},
86+
'SHELL4': {
87+
(1, 2, 3, 4): 1,
88+
(1, 4, 3, 2): 2},
89+
'WEDGE6': {
90+
(1, 2, 5, 4): 1,
91+
(2, 3, 6, 5): 2,
92+
(1, 4, 6, 3): 3,
93+
(1, 3, 2, 0): 4,
94+
(4, 5, 6, 0): 5},
95+
'WEDGE12': {
96+
(1, 2, 5, 4, 7, 10): 1,
97+
(2, 3, 6, 5, 8, 11): 2,
98+
(1, 4, 6, 3, 9, 12): 3,
99+
(1, 3, 2, 9, 8, 7): 4,
100+
(4, 5, 6, 10, 11, 12): 5},
101+
'WEDGE15': {
102+
(1, 2, 5, 4, 7, 11, 13, 10): 1,
103+
(2, 3, 6, 5, 8, 12, 14, 11): 2,
104+
(1, 4, 6, 3, 10, 15, 12, 9): 3,
105+
(1, 3, 2, 9, 8, 7, 0, 0): 4,
106+
(4, 5, 6, 13, 14, 15, 0, 0): 5},
107+
'WEDGE20': {
108+
(1, 2, 5, 4, 7, 11, 13, 10, 20): 1,
109+
(2, 3, 6, 5, 8, 12, 14, 11, 18): 2,
110+
(1, 4, 6, 3, 10, 15, 12, 9, 19): 3,
111+
(1, 3, 2, 9, 8, 7, 16, 0, 0): 4,
112+
(4, 5, 6, 13, 14, 15, 17, 0, 0): 5},
113+
'WEDGE21': {
114+
(1, 2, 5, 4, 7, 11, 13, 10, 21): 1,
115+
(2, 3, 6, 5, 8, 12, 14, 11, 19): 2,
116+
(1, 4, 6, 3, 10, 15, 12, 9, 20): 3,
117+
(1, 3, 2, 9, 8, 7, 17, 0, 0): 4,
118+
(4, 5, 6, 13, 14, 15, 18, 0, 0): 5},
119+
'WEDGE18': {
120+
(1, 2, 5, 4, 7, 11, 13, 10, 16): 1,
121+
(2, 3, 6, 5, 8, 12, 14, 11, 17): 2,
122+
(1, 4, 6, 3, 10, 15, 12, 9, 18): 3,
123+
(1, 3, 2, 9, 8, 7, 0, 0, 0): 4,
124+
(4, 5, 6, 13, 14, 15, 0, 0, 0): 5},
125+
'PYRAMID': {
126+
(1, 2, 5, 0, 6, 11, 10, 0, 15): 1,
127+
(2, 3, 5, 0, 7, 12, 11, 0, 16): 2,
128+
(3, 4, 5, 0, 8, 13, 12, 0, 17): 3,
129+
(1, 5, 4, 0, 10, 13, 9, 0, 18): 4,
130+
(1, 4, 3, 2, 9, 8, 7, 6, 14): 5}}
131+
132+
CONNECTIVITY_SIDES['HEX8'] = CONNECTIVITY_SIDES['HEX']
133+
CONNECTIVITY_SIDES['TETRA4'] = CONNECTIVITY_SIDES['TETRA']
45134

46135
items_connectivity = CONNECTIVITY_SIDES.items()
47136
SIDES_CONNECTIVITY = {
@@ -379,6 +468,8 @@ def __init__(self, filename, **kwargs):
379468
dimensions='num_elem', fill_value=1)
380469
dataset.createVariable(
381470
'node_id_map', self.int_type, dimensions='num_nodes')
471+
self.put_node_id_map(
472+
np.arange(dimensions['num_nodes'].size) + 1)
382473

383474
# node and side set variables
384475
if self.get_num_node_sets() > 0:
@@ -829,7 +920,8 @@ def get_elem_id_map(self):
829920
A `numpy.ndarray` of all 1-based element element IDs (ints)
830921
"""
831922
if 'elem_id_map' in self.dataset.variables:
832-
return self.dataset.variables['elem_id_map'][:].data
923+
if not np.all(self.dataset.variables['elem_id_map'][:].mask):
924+
return self.dataset.variables['elem_id_map'][:].data
833925
return np.arange(1, self.num_elems() + 1)
834926

835927
def get_elem_num_map(self):
@@ -1124,7 +1216,7 @@ def get_ids(self):
11241216
warn('Method not implemented: get_ids')
11251217

11261218
def get_ids_elem_in_blk(self, id_blk):
1127-
"""Get element IDs for each element element in an element block.
1219+
"""Get element IDs for each element in an element block.
11281220
11291221
Args:
11301222
id_blk (int): Element block ID.
@@ -1135,6 +1227,18 @@ def get_ids_elem_in_blk(self, id_blk):
11351227
idxs_elem_in_blk = self.get_idxs_elem_in_blk(id_blk)
11361228
return self.get_elem_id_map()[idxs_elem_in_blk]
11371229

1230+
def get_idxs_elem(self, ids_elem):
1231+
"""Get indices of elements with given ids
1232+
1233+
Args:
1234+
ids_elem (array-like): Element ids to query
1235+
1236+
Returns:
1237+
A `numpy.ndarray` of element indices (int)
1238+
"""
1239+
elem_id_map = self.get_elem_id_map()
1240+
return np.array([np.where(elem_id_map == i)[0][0] for i in ids_elem])
1241+
11381242
def get_idxs_elem_in_blk(self, id_blk):
11391243
"""Return the indices of the elements in a given block
11401244
@@ -1156,6 +1260,18 @@ def get_idxs_elem_start_blk(self):
11561260
ids_blk = self.get_elem_blk_ids()
11571261
return np.cumsum([0] + [self.num_elems_in_blk(i) for i in ids_blk])
11581262

1263+
def get_idxs_node(self, ids_node):
1264+
"""Get indices of nodes with given ids
1265+
1266+
Args:
1267+
ids_node (array-like): Node ids to query
1268+
1269+
Returns:
1270+
A `numpy.ndarray` of node indices (int)
1271+
"""
1272+
elem_id_map = self.get_elem_id_map()
1273+
return np.array([np.where(elem_id_map == i)[0][0] for i in ids_node])
1274+
11591275
def get_info_records(self) -> list:
11601276
"""Get a list of info records where each entry in the list is one info
11611277
record, e.g. a line of an input deck.
@@ -1214,9 +1330,11 @@ def get_node_id_map(self):
12141330
A `numpy.array` of node IDs (ints).
12151331
"""
12161332
if 'node_id_map' in self.dataset.variables:
1217-
return self.dataset.variables['node_id_map'][:].data
1333+
if not np.all(self.dataset.variables['node_id_map'][:].mask):
1334+
return self.dataset.variables['node_id_map'][:].data
12181335
if 'node_num_map' in self.dataset.variables:
1219-
return self.dataset.variables['node_num_map'][:].data
1336+
if not np.all(self.dataset.variables['node_num_map'][:].mask):
1337+
return self.dataset.variables['node_num_map'][:].data
12201338
return np.arange(self.get_num_nodes()) + 1
12211339

12221340
def get_node_num_map(self) -> None:
@@ -1587,8 +1705,27 @@ def get_side_set_names(self) -> list:
15871705
ss_names = self.dataset.variables.get('ss_names', ARRAY_EMPTY)
15881706
return [char_to_string(name)[0] for name in ss_names]
15891707

1590-
def get_side_set_node_list(self):
1591-
warn('Method not implemented: get_side_set_node_list')
1708+
def get_side_set_node_list(self, id_ss):
1709+
"""Get the node ids for nodes on sides in a side set with given id
1710+
1711+
Args:
1712+
id_ss (int): Side set ID
1713+
1714+
Returns:
1715+
A `numpy.ndarray` of node ids (int)
1716+
"""
1717+
1718+
ids_elem, ids_side = self.get_side_set(id_ss)
1719+
connectivity = self.get_elem_connectivity_full()
1720+
ids_node = connectivity[self.get_idxs_elem(ids_elem)]
1721+
1722+
type_elem = self.get_elem_type(self.get_element_blk_ids()[0])
1723+
sides = SIDES_CONNECTIVITY[type_elem]
1724+
idxs_node = np.array([sides[i] for i in ids_side]) - 1
1725+
ids_nodes_sides = np.unique(
1726+
[ids_node[i, idx] for i, idx in enumerate(idxs_node)])
1727+
1728+
return len(ids_nodes_sides), ids_nodes_sides
15921729

15931730
def get_side_set_params(self, id_ss):
15941731
"""Get the number of sides and nodal distribution factors (e.g. nodal

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = 'poetry.core.masonry.api'
44

55
[tool.poetry]
66
name = 'exodus_helper'
7-
version = '1.3.3'
7+
version = '1.4.0'
88
description = 'A package for manipulating ExodusII databases'
99
license = 'BSD-3-Clause'
1010
authors = ['Coleman Alleman <callema@sandia.gov>']

0 commit comments

Comments
 (0)