cburstedde / p4est

The "p4est" forest-of-octrees library

Home Page:www.p4est.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

ico_extra_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 -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:

ico_extra_corners2

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.

ico_extra_corners0

ico_extra_corners0_refined

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).

kcdodd/p4est@fb111f0

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.