Subdivide hex into 8**order sub-cells. Corner ordering: Edge orders: 7 _______ 6 ___2___ /: /| 7/: 6/| z 4 /______/ | /___1__/ | | | : 5| | | 11 | |10 | y | :... |.| 8
(corners, order)
| 224 | return mesh, hex_indices |
| 225 | |
| 226 | def subdivide_hex(corners, order): |
| 227 | """ Subdivide hex into 8**order sub-cells. |
| 228 | Corner ordering: Edge orders: |
| 229 | 7 _______ 6 ___2___ |
| 230 | /: /| 7/: 6/| z |
| 231 | 4 /______/ | /___1__/ | | |
| 232 | | : 5| | | 11 | |10 | y |
| 233 | | :... |.| 8| :.3. |.| | / |
| 234 | | . 3 | /2 | 4 9| / |/ |
| 235 | |_______|/ |_______|/5 /-------x |
| 236 | 0 1 0 |
| 237 | """ |
| 238 | if order == 0: |
| 239 | return [corners] |
| 240 | else: |
| 241 | corners = np.array(corners) |
| 242 | centroid = np.mean(corners, axis=0) |
| 243 | |
| 244 | faces = np.array([ |
| 245 | [0, 3, 2, 1], # bottom |
| 246 | [4, 5, 6, 7], # top |
| 247 | [1, 2, 6, 5], # right |
| 248 | [0, 4, 7, 3], # left |
| 249 | [0, 1, 5, 4], # front |
| 250 | [7, 6, 2, 3], # back |
| 251 | ]) |
| 252 | face_centers = np.array([np.mean(corners[face], axis=0) |
| 253 | for face in faces]) |
| 254 | |
| 255 | edge = np.array([ |
| 256 | [0, 1], [4, 5], [7, 6], [3, 2], # along X |
| 257 | [0, 3], [1, 2], [5, 6], [4, 7], # along Y |
| 258 | [0, 4], [1, 5], [2, 6], [3, 7], # along Z |
| 259 | ]) |
| 260 | edge_centers = np.mean(corners[edge], axis=1) |
| 261 | |
| 262 | subcells = [ |
| 263 | [corners[0], edge_centers[0], face_centers[0], edge_centers[4], |
| 264 | edge_centers[8], face_centers[4], centroid, face_centers[3] ], |
| 265 | [edge_centers[0], corners[1], edge_centers[5], face_centers[0], |
| 266 | face_centers[4], edge_centers[9], face_centers[2], centroid], |
| 267 | [edge_centers[4], face_centers[0], edge_centers[3], corners[3], |
| 268 | face_centers[3], centroid, face_centers[5], edge_centers[11]], |
| 269 | [face_centers[0], edge_centers[5], corners[2], edge_centers[3], |
| 270 | centroid, face_centers[2], edge_centers[10], face_centers[5]], |
| 271 | |
| 272 | [edge_centers[8], face_centers[4], centroid, face_centers[3], |
| 273 | corners[4], edge_centers[1], face_centers[1], edge_centers[7]], |
| 274 | [face_centers[4], edge_centers[9], face_centers[2], centroid, |
| 275 | edge_centers[1], corners[5], edge_centers[6], face_centers[1]], |
| 276 | [face_centers[3], centroid, face_centers[5], edge_centers[11], |
| 277 | edge_centers[7], face_centers[1], edge_centers[2], corners[7]], |
| 278 | [centroid, face_centers[2], edge_centers[10], face_centers[5], |
| 279 | face_centers[1], edge_centers[6], corners[6], edge_centers[2]] ] |
| 280 | subcell_corners = [] |
| 281 | for cell in subcells: |
| 282 | subcell_corners += subdivide_hex(cell, order-1) |
| 283 | return subcell_corners |
no outgoing calls
no test coverage detected