int main (int argc, char **argv) { p4est_connectivity_t *conn; int retval; char buf[BUFSIZ]; if (argc != 2) { char *cp, *bn; cp = strdup (argv[0]); bn = basename (cp); fprintf (stderr, "Usage: %s <connectivity name>\n", bn); free (cp); exit (1); } conn = p4est_connectivity_new_byname (argv[1]); if (conn == NULL) { P4EST_PRODUCTIONF ("Failed to identify connectivity \"%s\"\n", argv[1]); } else { snprintf (buf, BUFSIZ, "%s_%s.p%dc", P4EST_STRING, argv[1], P4EST_CHILDREN); P4EST_INFOF ("Write connectivity file \"%s\"\n", buf); retval = p4est_connectivity_save (buf, conn); if (retval) { P4EST_PRODUCTION ("Error writing connectivity file\n"); } p4est_connectivity_destroy (conn); } return 0; }
static int search_callback (p4est_t * p4est, p4est_topidx_t which_tree, p4est_quadrant_t * quadrant, p4est_locidx_t local_num, void *point) { test_point_t *p = (test_point_t *) point; int is_leaf; int is_match; is_leaf = local_num >= 0; P4EST_ASSERT (!is_leaf || local_num < p4est->local_num_quadrants); P4EST_ASSERT (point != NULL); P4EST_LDEBUGF ("Tree %lld quadrant %s level %d %d child %d leaf %d\n", (long long) which_tree, p->name, (int) p->quad.level, (int) quadrant->level, p4est_quadrant_child_id (quadrant), is_leaf); if (which_tree != p->quad.p.piggy3.which_tree) { return 0; } if (quadrant->level < p->quad.level) { is_match = p4est_quadrant_is_ancestor (quadrant, &p->quad); P4EST_LDEBUGF ("Ancestor for quadrant %s is %d\n", p->name, is_match); } else { is_match = !p4est_quadrant_compare (quadrant, &p->quad); P4EST_LDEBUGF ("Tree %lld same size quadrant %s match %d\n", (long long) which_tree, p->name, is_match); } if (is_match && is_leaf) { p4est_locidx_t num = -1; if (quadrant->level < p->quad.level) { num = p->quad.p.piggy3.local_num = -1; } else { P4EST_ASSERT (local_num >= 0); num = p->quad.p.piggy3.local_num = local_num; } P4EST_INFOF ("Matched quadrant %s at %lld\n", p->name, (long long) num); p4est_quadrant_print (SC_LP_INFO, quadrant); p4est_quadrant_print (SC_LP_INFO, &p->quad); ++found_count; } return is_match; }
int main (int argc, char **argv) { int i, j; int t0, t1; size_t bytes; const char *filename = "conndebug.p8c"; p4est_connectivity_t *conn; conn = p4est_connectivity_load (filename, &bytes); if (conn == NULL) { P4EST_LERRORF ("Could not read file %s\n", filename); return 1; } P4EST_INFOF ("Read %d bytes\n", (int) bytes); p4est_connectivity_complete (conn); for (i = 0; i < 4; ++i) { t0 = i + 0; t1 = i + 4; P4EST_VERBOSEF ("X face %d: %d %d\n", i, t0, t1); p4est_connectivity_join_faces (conn, t0, t1, 0, 1, 0); } for (i = 0; i < 2; ++i) { for (j = 0; j < 2; ++j) { t0 = 4 * i + j + 0; t1 = 4 * i + j + 2; P4EST_VERBOSEF ("Y face %d: %d %d\n", 2 * i + j, t0, t1); p4est_connectivity_join_faces (conn, t0, t1, 2, 3, 0); } } for (i = 0; i < 4; ++i) { t0 = 2 * i + 0; t1 = 2 * i + 1; P4EST_VERBOSEF ("Z face %d: %d %d\n", i, t0, t1); p4est_connectivity_join_faces (conn, t0, t1, 4, 5, 0); } p4est_connectivity_destroy (conn); return 0; }
static void p4est_check_local_order (p4est_t * p4est, p4est_connectivity_t * connectivity) { const double intsize = 1.0 / P4EST_ROOT_LEN; double *vertices; double h, eta1, eta2; double v0x, v0y, v0z, v1x, v1y, v1z; double v2x, v2y, v2z, v3x, v3y, v3z; double w0x, w0y, w0z, w1x, w1y, w1z; double w2x, w2y, w2z, w3x, w3y, w3z; size_t iz; size_t num_quads; size_t quad_count; p4est_topidx_t jt; p4est_topidx_t *tree_to_vertex; p4est_topidx_t first_local_tree; p4est_topidx_t last_local_tree; p4est_topidx_t v0, v1, v2, v3; p4est_locidx_t kl; p4est_locidx_t lv0, lv1, lv2, lv3; p4est_locidx_t num_uniq_local_vertices; p4est_locidx_t *quadrant_to_local_vertex; p4est_qcoord_t inth; p4est_tree_t *tree; p4est_quadrant_t *quad; p4est_vert_t *vert_locations; p4est_nodes_t *nodes; sc_array_t *trees; sc_array_t *quadrants; nodes = p4est_nodes_new (p4est, NULL); quadrant_to_local_vertex = nodes->local_nodes; num_uniq_local_vertices = nodes->num_owned_indeps; SC_CHECK_ABORT ((size_t) num_uniq_local_vertices == nodes->indep_nodes.elem_count, "Node count mismatch"); P4EST_INFOF ("Unique local vertices %lld\n", (long long) num_uniq_local_vertices); vert_locations = P4EST_ALLOC (p4est_vert_t, num_uniq_local_vertices); for (kl = 0; kl < num_uniq_local_vertices; ++kl) { vert_locations[kl].treeid = -1; } tree_to_vertex = connectivity->tree_to_vertex; vertices = connectivity->vertices; first_local_tree = p4est->first_local_tree; last_local_tree = p4est->last_local_tree; trees = p4est->trees; for (jt = first_local_tree, quad_count = 0; jt <= last_local_tree; ++jt) { tree = p4est_tree_array_index (trees, jt); P4EST_ASSERT (0 <= jt && jt < connectivity->num_trees); v0 = tree_to_vertex[jt * 4 + 0]; v1 = tree_to_vertex[jt * 4 + 1]; v2 = tree_to_vertex[jt * 4 + 2]; v3 = tree_to_vertex[jt * 4 + 3]; P4EST_ASSERT (0 <= v0 && v0 < connectivity->num_vertices); P4EST_ASSERT (0 <= v1 && v1 < connectivity->num_vertices); P4EST_ASSERT (0 <= v2 && v2 < connectivity->num_vertices); P4EST_ASSERT (0 <= v3 && v3 < connectivity->num_vertices); v0x = vertices[v0 * 3 + 0]; v0y = vertices[v0 * 3 + 1]; v0z = vertices[v0 * 3 + 2]; v1x = vertices[v1 * 3 + 0]; v1y = vertices[v1 * 3 + 1]; v1z = vertices[v1 * 3 + 2]; v2x = vertices[v2 * 3 + 0]; v2y = vertices[v2 * 3 + 1]; v2z = vertices[v2 * 3 + 2]; v3x = vertices[v3 * 3 + 0]; v3y = vertices[v3 * 3 + 1]; v3z = vertices[v3 * 3 + 2]; quadrants = &tree->quadrants; num_quads = quadrants->elem_count; /* loop over the elements in the tree */ for (iz = 0; iz < num_quads; ++iz, ++quad_count) { quad = p4est_quadrant_array_index (quadrants, iz); inth = P4EST_QUADRANT_LEN (quad->level); h = intsize * inth; eta1 = intsize * quad->x; eta2 = intsize * quad->y; w0x = v0x * (1.0 - eta1) * (1.0 - eta2) + v1x * (eta1) * (1.0 - eta2) + v2x * (1.0 - eta1) * (eta2) + v3x * (eta1) * (eta2); w0y = v0y * (1.0 - eta1) * (1.0 - eta2) + v1y * (eta1) * (1.0 - eta2) + v2y * (1.0 - eta1) * (eta2) + v3y * (eta1) * (eta2); w0z = v0z * (1.0 - eta1) * (1.0 - eta2) + v1z * (eta1) * (1.0 - eta2) + v2z * (1.0 - eta1) * (eta2) + v3z * (eta1) * (eta2); w1x = v0x * (1.0 - eta1 - h) * (1.0 - eta2) + v1x * (eta1 + h) * (1.0 - eta2) + v2x * (1.0 - eta1 - h) * (eta2) + v3x * (eta1 + h) * (eta2); w1y = v0y * (1.0 - eta1 - h) * (1.0 - eta2) + v1y * (eta1 + h) * (1.0 - eta2) + v2y * (1.0 - eta1 - h) * (eta2) + v3y * (eta1 + h) * (eta2); w1z = v0z * (1.0 - eta1 - h) * (1.0 - eta2) + v1z * (eta1 + h) * (1.0 - eta2) + v2z * (1.0 - eta1 - h) * (eta2) + v3z * (eta1 + h) * (eta2); w2x = v0x * (1.0 - eta1) * (1.0 - eta2 - h) + v1x * (eta1) * (1.0 - eta2 - h) + v2x * (1.0 - eta1) * (eta2 + h) + v3x * (eta1) * (eta2 + h); w2y = v0y * (1.0 - eta1) * (1.0 - eta2 - h) + v1y * (eta1) * (1.0 - eta2 - h) + v2y * (1.0 - eta1) * (eta2 + h) + v3y * (eta1) * (eta2 + h); w2z = v0z * (1.0 - eta1) * (1.0 - eta2 - h) + v1z * (eta1) * (1.0 - eta2 - h) + v2z * (1.0 - eta1) * (eta2 + h) + v3z * (eta1) * (eta2 + h); w3x = v0x * (1.0 - eta1 - h) * (1.0 - eta2 - h) + v1x * (eta1 + h) * (1.0 - eta2 - h) + v2x * (1.0 - eta1 - h) * (eta2 + h) + v3x * (eta1 + h) * (eta2 + h); w3y = v0y * (1.0 - eta1 - h) * (1.0 - eta2 - h) + v1y * (eta1 + h) * (1.0 - eta2 - h) + v2y * (1.0 - eta1 - h) * (eta2 + h) + v3y * (eta1 + h) * (eta2 + h); w3z = v0z * (1.0 - eta1 - h) * (1.0 - eta2 - h) + v1z * (eta1 + h) * (1.0 - eta2 - h) + v2z * (1.0 - eta1 - h) * (eta2 + h) + v3z * (eta1 + h) * (eta2 + h); P4EST_ASSERT ((p4est_locidx_t) quad_count < p4est->local_num_quadrants); lv0 = quadrant_to_local_vertex[4 * quad_count + 0]; lv1 = quadrant_to_local_vertex[4 * quad_count + 1]; lv2 = quadrant_to_local_vertex[4 * quad_count + 2]; lv3 = quadrant_to_local_vertex[4 * quad_count + 3]; P4EST_ASSERT (0 <= lv0 && lv0 < num_uniq_local_vertices); P4EST_ASSERT (0 <= lv1 && lv1 < num_uniq_local_vertices); P4EST_ASSERT (0 <= lv2 && lv2 < num_uniq_local_vertices); P4EST_ASSERT (0 <= lv3 && lv3 < num_uniq_local_vertices); vert_locations[lv0].x = w0x; vert_locations[lv0].y = w0y; vert_locations[lv0].z = w0z; P4EST_ASSERT (vert_locations[lv0].treeid == -1 || vert_locations[lv0].treeid == jt); vert_locations[lv0].treeid = jt; vert_locations[lv1].x = w1x; vert_locations[lv1].y = w1y; vert_locations[lv1].z = w1z; P4EST_ASSERT (vert_locations[lv1].treeid == -1 || vert_locations[lv1].treeid == jt); vert_locations[lv1].treeid = jt; vert_locations[lv2].x = w2x; vert_locations[lv2].y = w2y; vert_locations[lv2].z = w2z; P4EST_ASSERT (vert_locations[lv2].treeid == -1 || vert_locations[lv2].treeid == jt); vert_locations[lv2].treeid = jt; vert_locations[lv3].x = w3x; vert_locations[lv3].y = w3y; vert_locations[lv3].z = w3z; P4EST_ASSERT (vert_locations[lv3].treeid == -1 || vert_locations[lv3].treeid == jt); vert_locations[lv3].treeid = jt; } } qsort (vert_locations, num_uniq_local_vertices, sizeof (p4est_vert_t), p4est_vert_compare); /* Check to make sure that we don't have any duplicates in the list */ for (kl = 0; kl < num_uniq_local_vertices - 1; ++kl) { SC_CHECK_ABORT (p4est_vert_compare (vert_locations + kl, vert_locations + kl + 1) != 0, "local ordering not unique"); } P4EST_FREE (vert_locations); p4est_nodes_destroy (nodes); }