32
32
(1 , 4 , 5 , 8 ): 4 ,
33
33
(1 , 2 , 3 , 4 ): 5 ,
34
34
(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 },
35
49
'TETRA' : {
36
50
(1 , 2 , 4 ): 1 ,
37
51
(2 , 3 , 4 ): 2 ,
41
55
(1 , 5 , 2 , 9 , 4 , 8 ): 1 ,
42
56
(2 , 6 , 3 , 10 , 4 , 9 ): 2 ,
43
57
(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' ]
45
134
46
135
items_connectivity = CONNECTIVITY_SIDES .items ()
47
136
SIDES_CONNECTIVITY = {
@@ -379,6 +468,8 @@ def __init__(self, filename, **kwargs):
379
468
dimensions = 'num_elem' , fill_value = 1 )
380
469
dataset .createVariable (
381
470
'node_id_map' , self .int_type , dimensions = 'num_nodes' )
471
+ self .put_node_id_map (
472
+ np .arange (dimensions ['num_nodes' ].size ) + 1 )
382
473
383
474
# node and side set variables
384
475
if self .get_num_node_sets () > 0 :
@@ -829,7 +920,8 @@ def get_elem_id_map(self):
829
920
A `numpy.ndarray` of all 1-based element element IDs (ints)
830
921
"""
831
922
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
833
925
return np .arange (1 , self .num_elems () + 1 )
834
926
835
927
def get_elem_num_map (self ):
@@ -1124,7 +1216,7 @@ def get_ids(self):
1124
1216
warn ('Method not implemented: get_ids' )
1125
1217
1126
1218
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.
1128
1220
1129
1221
Args:
1130
1222
id_blk (int): Element block ID.
@@ -1135,6 +1227,18 @@ def get_ids_elem_in_blk(self, id_blk):
1135
1227
idxs_elem_in_blk = self .get_idxs_elem_in_blk (id_blk )
1136
1228
return self .get_elem_id_map ()[idxs_elem_in_blk ]
1137
1229
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
+
1138
1242
def get_idxs_elem_in_blk (self , id_blk ):
1139
1243
"""Return the indices of the elements in a given block
1140
1244
@@ -1156,6 +1260,18 @@ def get_idxs_elem_start_blk(self):
1156
1260
ids_blk = self .get_elem_blk_ids ()
1157
1261
return np .cumsum ([0 ] + [self .num_elems_in_blk (i ) for i in ids_blk ])
1158
1262
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
+
1159
1275
def get_info_records (self ) -> list :
1160
1276
"""Get a list of info records where each entry in the list is one info
1161
1277
record, e.g. a line of an input deck.
@@ -1214,9 +1330,11 @@ def get_node_id_map(self):
1214
1330
A `numpy.array` of node IDs (ints).
1215
1331
"""
1216
1332
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
1218
1335
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
1220
1338
return np .arange (self .get_num_nodes ()) + 1
1221
1339
1222
1340
def get_node_num_map (self ) -> None :
@@ -1587,8 +1705,27 @@ def get_side_set_names(self) -> list:
1587
1705
ss_names = self .dataset .variables .get ('ss_names' , ARRAY_EMPTY )
1588
1706
return [char_to_string (name )[0 ] for name in ss_names ]
1589
1707
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
1592
1729
1593
1730
def get_side_set_params (self , id_ss ):
1594
1731
"""Get the number of sides and nodal distribution factors (e.g. nodal
0 commit comments