Adding corners leads to "Unreachable code" during balance
kcdodd opened this issue · comments
I have been running into an issue on how "corners" are used by p4est (both in my understanding, and in practice). I am currently working on a Python interface based on the branch prev3-develop (up-to-date). A lot of these arrays are being derived, so it could also be some other issue with the generated connectivity.
However, an error during "balancing" the trees for two cases shown below:
...
Abort: Unreachable code
Abort: ../../src/p4est_algorithms.c:1037
Since I do not fully understand corners, I do not really know if this an error on my part, or with p4est. Basically, should these "corner" configurations work?
Problem Cases
- In the images, specified corners are marked with red dots
- The values of the connectivity arrays initially passed to p4est are given as part of the print-out
- The arrays are specified in Python:
https://github.com/kcdodd/p4est/blob/bdacf90603ed472e2acb27af8cc7402a5d27505b/pypkg/p4est/mesh/quad.py#L637
- The arrays are specified in Python:
vertices
vert 0: [0.5 0.8660254 0. ]
vert 1: [1.5 0.8660254 0. ]
vert 2: [2.5 0.8660254 0. ]
vert 3: [3.5 0.8660254 0. ]
vert 4: [4.5 0.8660254 0. ]
vert 5: [0. 0. 0.]
vert 6: [1. 0. 0.]
vert 7: [2. 0. 0.]
vert 8: [3. 0. 0.]
vert 9: [4. 0. 0.]
vert 10: [5. 0. 0.]
vert 11: [ 0.5 -0.8660254 0. ]
vert 12: [ 1.5 -0.8660254 0. ]
vert 13: [ 2.5 -0.8660254 0. ]
vert 14: [ 3.5 -0.8660254 0. ]
vert 15: [ 4.5 -0.8660254 0. ]
vert 16: [ 5.5 -0.8660254 0. ]
vert 17: [ 1. -1.73205081 0. ]
vert 18: [ 2. -1.73205081 0. ]
vert 19: [ 3. -1.73205081 0. ]
vert 20: [ 4. -1.73205081 0. ]
vert 21: [ 5. -1.73205081 0. ]
tree_to_vertex
tree 0: [ 5 11 0 6]
tree 1: [11 17 6 12]
tree 2: [ 6 12 1 7]
tree 3: [12 18 7 13]
tree 4: [ 7 13 2 8]
tree 5: [13 19 8 14]
tree 6: [ 8 14 3 9]
tree 7: [14 20 9 15]
tree 8: [ 9 15 4 10]
tree 9: [15 21 10 16]
tree_to_tree
tree 0: [0 1 0 0]
tree 1: [0 1 1 2]
tree 2: [2 3 1 2]
tree 3: [2 3 3 4]
tree 4: [4 5 3 4]
tree 5: [4 5 5 6]
tree 6: [6 7 5 6]
tree 7: [6 7 7 8]
tree 8: [8 9 7 8]
tree 9: [8 9 9 9]
tree_to_face
tree 0: [0 0 2 3]
tree 1: [1 1 2 2]
tree 2: [0 0 3 3]
tree 3: [1 1 2 2]
tree 4: [0 0 3 3]
tree 5: [1 1 2 2]
tree 6: [0 0 3 3]
tree 7: [1 1 2 2]
tree 8: [0 0 3 3]
tree 9: [1 1 2 3]
tree_to_corner
tree 0: [ 2 3 0 -1]
tree 1: [ 3 1 -1 -1]
tree 2: [-1 -1 0 -1]
tree 3: [-1 1 -1 -1]
tree 4: [-1 -1 0 -1]
tree 5: [-1 1 -1 -1]
tree 6: [-1 -1 0 -1]
tree 7: [-1 1 -1 -1]
tree 8: [-1 -1 0 2]
tree 9: [-1 1 2 3]
ctt_offset
[ 0 5 10 13 16]
corner_to_tree
corner 0: [0 6 8 2 4]
corner 1: [1 7 9 5 3]
corner 2: [8 0 9]
corner 3: [1 0 9]
corner_to_corner
corner 0: [2 2 2 2 2]
corner 1: [1 1 1 1 1]
corner 2: [3 0 2]
corner 3: [0 1 3]
Abort: Unreachable code
Abort: ../../src/p4est_algorithms.c:1037
Traceback, excluding frames outside of p4est:
#5 0x00007fffbe8ff66b in sc_abort_handler () at ../../subprojects/sc/src/sc.c:1031
#6 0x00007fffbe8ff49d in sc_abort () at ../../subprojects/sc/src/sc.c:981
#7 0x00007fffbe8ff705 in sc_abort_verbose (filename=0x7fffbea29c75 "../../src/p4est_algorithms.c", lineno=1037, msg=0x7fffbea2a064 "Unreachable code") at ../../subprojects/sc/src/sc.c:1039
#8 0x00007fffbe955aaf in p4est_tree_compute_overlap (p4est=0x35f5d70, in=0x35cf1f8, out=0x35cf1d8, balance=P4EST_CONNECT_CORNER, borders=0x12cbb30, inseeds=0x12cbec0) at ../../src/p4est_algorithms.c:1037
#9 0x00007fffbe94b8e6 in p4est_balance_response (p4est=0x35f5d70, peer=0x35cf1a0, balance=P4EST_CONNECT_CORNER, borders=0x12cbb30) at ../../src/p4est.c:1221
#10 0x00007fffbe94e232 in p4est_balance_ext (p4est=0x35f5d70, btype=P4EST_CONNECT_CORNER, init_fn=0x7fffbea6d428 <__pyx_f_5p4est_4core_6_p4est__init_quadrant>,
replace_fn=0x7fffbea6d497 <__pyx_f_5p4est_4core_6_p4est__replace_quadrants>) at ../../src/p4est.c:2137
Also tried setting all corners:
vertices
vert 0: [0.5 0.8660254 0. ]
vert 1: [1.5 0.8660254 0. ]
vert 2: [2.5 0.8660254 0. ]
vert 3: [3.5 0.8660254 0. ]
vert 4: [4.5 0.8660254 0. ]
vert 5: [0. 0. 0.]
vert 6: [1. 0. 0.]
vert 7: [2. 0. 0.]
vert 8: [3. 0. 0.]
vert 9: [4. 0. 0.]
vert 10: [5. 0. 0.]
vert 11: [ 0.5 -0.8660254 0. ]
vert 12: [ 1.5 -0.8660254 0. ]
vert 13: [ 2.5 -0.8660254 0. ]
vert 14: [ 3.5 -0.8660254 0. ]
vert 15: [ 4.5 -0.8660254 0. ]
vert 16: [ 5.5 -0.8660254 0. ]
vert 17: [ 1. -1.73205081 0. ]
vert 18: [ 2. -1.73205081 0. ]
vert 19: [ 3. -1.73205081 0. ]
vert 20: [ 4. -1.73205081 0. ]
vert 21: [ 5. -1.73205081 0. ]
tree_to_vertex
tree 0: [ 5 11 0 6]
tree 1: [11 17 6 12]
tree 2: [ 6 12 1 7]
tree 3: [12 18 7 13]
tree 4: [ 7 13 2 8]
tree 5: [13 19 8 14]
tree 6: [ 8 14 3 9]
tree 7: [14 20 9 15]
tree 8: [ 9 15 4 10]
tree 9: [15 21 10 16]
tree_to_tree
tree 0: [0 1 0 0]
tree 1: [0 1 1 2]
tree 2: [2 3 1 2]
tree 3: [2 3 3 4]
tree 4: [4 5 3 4]
tree 5: [4 5 5 6]
tree 6: [6 7 5 6]
tree 7: [6 7 7 8]
tree 8: [8 9 7 8]
tree 9: [8 9 9 9]
tree_to_face
tree 0: [0 0 2 3]
tree 1: [1 1 2 2]
tree 2: [0 0 3 3]
tree 3: [1 1 2 2]
tree 4: [0 0 3 3]
tree 5: [1 1 2 2]
tree 6: [0 0 3 3]
tree 7: [1 1 2 2]
tree 8: [0 0 3 3]
tree 9: [1 1 2 3]
tree_to_corner
tree 0: [2 3 0 4]
tree 1: [3 1 4 8]
tree 2: [4 8 0 5]
tree 3: [8 1 5 9]
tree 4: [5 9 0 6]
tree 5: [ 9 1 6 10]
tree 6: [ 6 10 0 7]
tree 7: [10 1 7 11]
tree 8: [ 7 11 0 2]
tree 9: [11 1 2 3]
ctt_offset
[ 0 5 10 13 16 19 22 25 28 31 34 37 40]
corner_to_tree
corner 0: [0 8 6 2 4]
corner 1: [9 1 7 5 3]
corner 2: [0 8 9]
corner 3: [9 0 1]
corner 4: [0 1 2]
corner 5: [3 4 2]
corner 6: [6 4 5]
corner 7: [6 7 8]
corner 8: [3 2 1]
corner 9: [5 4 3]
corner 10: [6 7 5]
corner 11: [7 8 9]
corner_to_corner
corner 0: [2 2 2 2 2]
corner 1: [1 1 1 1 1]
corner 2: [0 3 2]
corner 3: [3 1 0]
corner 4: [3 2 0]
corner 5: [2 0 3]
corner 6: [0 3 2]
corner 7: [3 2 0]
corner 8: [0 1 3]
corner 9: [0 1 3]
corner 10: [1 0 3]
corner 11: [3 1 0]
Abort: Unreachable code
Abort: ../../src/p4est_algorithms.c:1037
Expected Case
If the "left" and "right" sides are not connected (but top and and bottom are, as the built-in icosahedron example), the refine and balance routines function as expected.
vertices
vert 0: [0.5 0.8660254 0. ]
vert 1: [1.5 0.8660254 0. ]
vert 2: [2.5 0.8660254 0. ]
vert 3: [3.5 0.8660254 0. ]
vert 4: [4.5 0.8660254 0. ]
vert 5: [0. 0. 0.]
vert 6: [1. 0. 0.]
vert 7: [2. 0. 0.]
vert 8: [3. 0. 0.]
vert 9: [4. 0. 0.]
vert 10: [5. 0. 0.]
vert 11: [ 0.5 -0.8660254 0. ]
vert 12: [ 1.5 -0.8660254 0. ]
vert 13: [ 2.5 -0.8660254 0. ]
vert 14: [ 3.5 -0.8660254 0. ]
vert 15: [ 4.5 -0.8660254 0. ]
vert 16: [ 5.5 -0.8660254 0. ]
vert 17: [ 1. -1.73205081 0. ]
vert 18: [ 2. -1.73205081 0. ]
vert 19: [ 3. -1.73205081 0. ]
vert 20: [ 4. -1.73205081 0. ]
vert 21: [ 5. -1.73205081 0. ]
tree_to_vertex
tree 0: [ 5 11 0 6]
tree 1: [11 17 6 12]
tree 2: [ 6 12 1 7]
tree 3: [12 18 7 13]
tree 4: [ 7 13 2 8]
tree 5: [13 19 8 14]
tree 6: [ 8 14 3 9]
tree 7: [14 20 9 15]
tree 8: [ 9 15 4 10]
tree 9: [15 21 10 16]
tree_to_tree
tree 0: [0 1 0 0]
tree 1: [0 1 1 2]
tree 2: [2 3 1 2]
tree 3: [2 3 3 4]
tree 4: [4 5 3 4]
tree 5: [4 5 5 6]
tree 6: [6 7 5 6]
tree 7: [6 7 7 8]
tree 8: [8 9 7 8]
tree 9: [8 9 9 9]
tree_to_face
tree 0: [0 0 2 3]
tree 1: [1 1 2 2]
tree 2: [0 0 3 3]
tree 3: [1 1 2 2]
tree 4: [0 0 3 3]
tree 5: [1 1 2 2]
tree 6: [0 0 3 3]
tree 7: [1 1 2 2]
tree 8: [0 0 3 3]
tree 9: [1 1 2 3]
tree_to_corner
tree 0: [-1 -1 0 -1]
tree 1: [-1 1 -1 -1]
tree 2: [-1 -1 0 -1]
tree 3: [-1 1 -1 -1]
tree 4: [-1 -1 0 -1]
tree 5: [-1 1 -1 -1]
tree 6: [-1 -1 0 -1]
tree 7: [-1 1 -1 -1]
tree 8: [-1 -1 0 -1]
tree 9: [-1 1 -1 -1]
ctt_offset
[ 0 5 10]
corner_to_tree
corner 0: [6 8 0 4 2]
corner 1: [7 5 1 3 9]
corner_to_corner
corner 0: [2 2 2 2 2]
corner 1: [1 1 1 1 1]
I think I discovered the issue, which was in the generated face adjacency that did not account for the additional nodes (tree_to_tree did not match tree_to_corner).
Now corrected, no more "Unreachable code":
vertices
vert 0: [0.5 0.8660254 0. ]
vert 1: [1.5 0.8660254 0. ]
vert 2: [2.5 0.8660254 0. ]
vert 3: [3.5 0.8660254 0. ]
vert 4: [4.5 0.8660254 0. ]
vert 5: [0. 0. 0.]
vert 6: [1. 0. 0.]
vert 7: [2. 0. 0.]
vert 8: [3. 0. 0.]
vert 9: [4. 0. 0.]
vert 10: [5. 0. 0.]
vert 11: [ 0.5 -0.8660254 0. ]
vert 12: [ 1.5 -0.8660254 0. ]
vert 13: [ 2.5 -0.8660254 0. ]
vert 14: [ 3.5 -0.8660254 0. ]
vert 15: [ 4.5 -0.8660254 0. ]
vert 16: [ 5.5 -0.8660254 0. ]
vert 17: [ 1. -1.73205081 0. ]
vert 18: [ 2. -1.73205081 0. ]
vert 19: [ 3. -1.73205081 0. ]
vert 20: [ 4. -1.73205081 0. ]
vert 21: [ 5. -1.73205081 0. ]
tree_to_vertex
tree 0: [ 5 11 0 6]
tree 1: [11 17 6 12]
tree 2: [ 6 12 1 7]
tree 3: [12 18 7 13]
tree 4: [ 7 13 2 8]
tree 5: [13 19 8 14]
tree 6: [ 8 14 3 9]
tree 7: [14 20 9 15]
tree 8: [ 9 15 4 10]
tree 9: [15 21 10 16]
tree_to_tree
tree 0: [8 1 9 2]
tree 1: [0 3 9 2]
tree 2: [0 3 1 4]
tree 3: [2 5 1 4]
tree 4: [2 5 3 6]
tree 5: [4 7 3 6]
tree 6: [4 7 5 8]
tree 7: [6 9 5 8]
tree 8: [6 9 7 0]
tree 9: [8 1 7 0]
tree_to_face
tree 0: [7 0 3 4]
tree 1: [1 6 5 2]
tree 2: [7 0 3 4]
tree 3: [1 6 5 2]
tree 4: [7 0 3 4]
tree 5: [1 6 5 2]
tree 6: [7 0 3 4]
tree 7: [1 6 5 2]
tree 8: [7 0 3 4]
tree 9: [1 6 5 2]
tree_to_corner
tree 0: [ 2 3 0 -1]
tree 1: [ 3 1 -1 -1]
tree 2: [-1 -1 0 -1]
tree 3: [-1 1 -1 -1]
tree 4: [-1 -1 0 -1]
tree 5: [-1 1 -1 -1]
tree 6: [-1 -1 0 -1]
tree 7: [-1 1 -1 -1]
tree 8: [-1 -1 0 2]
tree 9: [-1 1 2 3]
ctt_offset
[ 0 5 10 13 16]
corner_to_tree
corner 0: [0 6 8 2 4]
corner 1: [1 7 9 5 3]
corner 2: [8 0 9]
corner 3: [1 0 9]
corner_to_corner
corner 0: [2 2 2 2 2]
corner 1: [1 1 1 1 1]
corner 2: [3 0 2]
corner 3: [0 1 3]
Cool, glad you made it work.