p4est  2.8.7
p4est is a software library for parallel adaptive mesh refinement.
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
p8est_bits.h
Go to the documentation of this file.
1 /*
2  This file is part of p4est.
3  p4est is a C library to manage a collection (a forest) of multiple
4  connected adaptive quadtrees or octrees in parallel.
5 
6  Copyright (C) 2010 The University of Texas System
7  Additional copyright (C) 2011 individual authors
8  Written by Carsten Burstedde, Lucas C. Wilcox, and Tobin Isaac
9 
10  p4est is free software; you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation; either version 2 of the License, or
13  (at your option) any later version.
14 
15  p4est is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with p4est; if not, write to the Free Software Foundation, Inc.,
22  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 */
24 
32 #ifndef P8EST_BITS_H
33 #define P8EST_BITS_H
34 
35 #include <p8est.h>
36 #include <sc_random.h>
37 
38 SC_EXTERN_C_BEGIN;
39 
41 #define P8EST_COORDINATES_IS_VALID(c) \
42  (p8est_coordinates_is_valid ((c), P8EST_MAXLEVEL))
43 
48 
54 void p8est_quadrant_print (int log_priority,
55  const p8est_quadrant_t * q);
56 
61  const p8est_quadrant_t * q2);
62 
69  p8est_quadrant_t * copy);
70 
76  const p8est_quadrant_t * q2);
77 
83  q1,
84  const p8est_quadrant_t *
85  q2);
86 
93 int p8est_quadrant_compare (const void *v1, const void *v2);
94 
105  const p4est_qcoord_t v2[]);
106 
113 int p8est_quadrant_disjoint (const void *v1, const void *v2);
114 
121 int p8est_quadrant_compare_piggy (const void *v1,
122  const void *v2);
123 
130  const void *v2);
131 
135 int p8est_quadrant_equal_fn (const void *v1, const void *v2,
136  const void *u);
137 
140 unsigned p8est_quadrant_hash_fn (const void *v, const void *u);
141 
147 int p8est_node_equal_piggy_fn (const void *v1,
148  const void *v2, const void *u);
149 
154 unsigned p8est_node_hash_piggy_fn (const void *v, const void *u);
155 
161  p8est_quadrant_t * r);
162 
167 
174  int level, p8est_quadrant_t * q);
175 
181  const p8est_quadrant_t * n);
182 
188  int level);
189 
194 
202  coord[]);
203 
209  q);
210 
216 
222  q);
223 
229  q);
230 
239  q, int *edge);
240 
246  q);
247 
255  int inside);
256 
263  int level);
264 
270 
276 
283  const p8est_quadrant_t * q2);
284 
292  p8est_quadrant_t * r, int child_id);
293 
299  const p8est_quadrant_t * q2);
300 
304  const p8est_quadrant_t * q1,
305  const p8est_quadrant_t * q2,
306  const p8est_quadrant_t * q3,
307  const p8est_quadrant_t * q4,
308  const p8est_quadrant_t * q5,
309  const p8est_quadrant_t * q6,
310  const p8est_quadrant_t * q7);
311 
316 
321 
328  const p8est_quadrant_t * r);
329 
335  const p8est_quadrant_t * r);
336 
343  const p8est_quadrant_t * r);
344 
351  const p8est_quadrant_t * r);
352 
360  const p8est_quadrant_t * r);
361 
367  const p8est_quadrant_t * r);
368 
372  const p8est_quadrant_t * q);
373 
377  const p8est_quadrant_t *
378  q);
379 
390  const p8est_quadrant_t * l,
391  const p8est_quadrant_t * a);
392 
402  p8est_quadrant_t * q);
403 
413  p8est_quadrant_t * q);
414 
423 
433  int level, p8est_quadrant_t * r);
434 
444  p8est_quadrant_t * r);
445 
453  p8est_quadrant_t * r,
454  int sibling_id);
455 
461  (const p8est_quadrant_t * q, p4est_qcoord_t coords[]);
462 
470  int face,
471  p8est_quadrant_t * r);
472 
490  * q, p4est_topidx_t t,
491  int face,
492  p8est_quadrant_t * r,
493  int *nface,
495  conn);
496 
511  * q, int face,
512  p8est_quadrant_t n[4],
514  nur[4]);
515 
535  * q, int face,
536  p8est_quadrant_t n[6]);
537 
545  (const p8est_quadrant_t * q, int face, p4est_qcoord_t coords[]);
546 
554  int edge,
555  p8est_quadrant_t * r);
556 
574  * q, p4est_locidx_t t,
575  int edge, sc_array_t *
576  quads, sc_array_t *
577  treeids,
578  sc_array_t * nedges,
580  conn);
581 
589  (const p8est_quadrant_t * q, int edge, p4est_qcoord_t coords[]);
590 
598  q, int corner,
599  p8est_quadrant_t * r);
600 
617  q, p4est_locidx_t t,
618  int corner,
619  sc_array_t * quads,
620  sc_array_t *
621  treeids,
622  sc_array_t *
623  ncorners,
625  * conn);
626 
634  p8est_quadrant_t * q,
635  int corner,
637  r);
638 
646  int corner,
647  p8est_quadrant_t * r);
648 
655  (const p8est_quadrant_t * q, int corner, p4est_qcoord_t coords[]);
656 
671  p8est_quadrant_t * c0,
672  p8est_quadrant_t * c1,
673  p8est_quadrant_t * c2,
674  p8est_quadrant_t * c3,
675  p8est_quadrant_t * c4,
676  p8est_quadrant_t * c5,
677  p8est_quadrant_t * c6,
678  p8est_quadrant_t * c7);
679 
687  p8est_quadrant_t c[]);
688 
696  p8est_quadrant_t * c[]);
697 
704  q, p8est_quadrant_t * fd,
705  int level);
706 
713  q, p8est_quadrant_t * ld,
714  int level);
715 
724  q, p8est_quadrant_t * r,
725  int c, int level);
726 
736  q1,
737  const p8est_quadrant_t *
738  q2, p8est_quadrant_t * r);
739 
745  q1,
746  const p8est_quadrant_t *
747  q2,
748  p8est_quadrant_t * r);
749 
760  p8est_quadrant_t * r,
761  const int ftransform[]);
762 
772  coords_in[],
774  coords_out[],
775  const int ftransform[]);
776 
780  int edge, int inside);
781 
790  p8est_quadrant_t * r,
791  const p8est_edge_info_t *
792  ei,
793  const
795  et, int inside);
796 
804  coords_in[],
806  coords_out[],
807  const
809  ei,
810  const
812  et);
813 
832  p8est_quadrant_t * r,
833  p8est_quadrant_t * rup,
834  p8est_quadrant_t * rdown,
835  int edge);
836 
846  int corner, int inside);
847 
853  (p4est_qcoord_t coords[], int corner);
854 
861  int corner, int inside);
862 
869  p8est_quadrant_t * r,
870  int corner);
871 
890  quadrant, int level);
891 
900  int level, uint64_t id);
901 
909  quadrant,
910  p8est_quadrant_t * result);
911 
919  quadrant,
920  p8est_quadrant_t * result);
921 
928  sc_rand_state_t * rstate);
929 
941  (const p8est_neighbor_transform_t * nt,
942  const p8est_quadrant_t * self_quad, p8est_quadrant_t * neigh_quad);
943 
955  (const p8est_neighbor_transform_t * nt,
956  const p8est_quadrant_t * neigh_quad, p8est_quadrant_t * self_quad);
957 
967  descendant,
968  const p8est_quadrant_t *
969  ancestor, int face);
970 
980  * descendant,
981  const p8est_quadrant_t
982  * ancestor,
983  int corner);
984 
985 SC_EXTERN_C_END;
986 
987 #endif /* !P8EST_BITS_H */
int32_t p4est_qcoord_t
Typedef for quadrant coordinates.
Definition: p4est_base.h:81
int32_t p4est_topidx_t
Typedef for counting topological entities (trees, tree vertices).
Definition: p4est_base.h:93
int32_t p4est_locidx_t
Typedef for processor-local indexing of quadrants and nodes.
Definition: p4est_base.h:106
The top-level 3D p8est interface.
void p8est_quadrant_set_morton(p8est_quadrant_t *quadrant, int level, uint64_t id)
Set quadrant Morton indices based on linear position in uniform grid.
int p8est_quadrant_contains_node(const p8est_quadrant_t *q, const p8est_quadrant_t *n)
Decide if a node is completely contained within a quadrant.
int p8est_quadrant_is_parent_D(const p8est_quadrant_t *q, const p8est_quadrant_t *r)
Test if a quadrant is the parent of another quadrant.
void p8est_neighbor_transform_quadrant(const p8est_neighbor_transform_t *nt, const p8est_quadrant_t *self_quad, p8est_quadrant_t *neigh_quad)
Transform a quadrant from self's coordinate system to neighbor's coordinate system.
void p8est_quadrant_parent(const p8est_quadrant_t *q, p8est_quadrant_t *r)
Compute the parent of a quadrant.
int p8est_quadrant_is_first_last(const p8est_quadrant_t *f, const p8est_quadrant_t *l, const p8est_quadrant_t *a)
Whether two descendants of a quadrant are first and last, up to size.
void p8est_quadrant_corner_descendant(const p8est_quadrant_t *q, p8est_quadrant_t *r, int c, int level)
Compute the descendant of a quadrant touching a given corner.
int p8est_quadrant_is_outside_edge_extra(const p8est_quadrant_t *q, int *edge)
Test if a quadrant is outside a tree edge boundary (no corner).
void p8est_quadrant_half_face_neighbors(const p8est_quadrant_t *q, int face, p8est_quadrant_t n[4], p8est_quadrant_t nur[4])
Get the smaller face neighbors of q.
int p8est_quadrant_is_equal(const p8est_quadrant_t *q1, const p8est_quadrant_t *q2)
Test if two quadrants have equal Morton indices.
int p8est_quadrant_is_node(const p8est_quadrant_t *q, int inside)
Test if a quadrant is used to represent a mesh node.
void p8est_quadrant_child(const p8est_quadrant_t *q, p8est_quadrant_t *r, int child_id)
Compute a specific child of a quadrant.
int p8est_quadrant_compare_local_num(const void *v1, const void *v2)
Compare two quadrants with respect to their local_num in the piggy3 member.
int p8est_quadrant_is_sibling_D(const p8est_quadrant_t *q1, const p8est_quadrant_t *q2)
Test if two quadrants are siblings.
void p8est_quadrant_edge_neighbor(const p8est_quadrant_t *q, int edge, p8est_quadrant_t *r)
Compute the edge neighbor of a quadrant.
void p8est_quadrant_edge_neighbor_extra(const p8est_quadrant_t *q, p4est_locidx_t t, int edge, sc_array_t *quads, sc_array_t *treeids, sc_array_t *nedges, p8est_connectivity_t *conn)
Compute the edge neighbors of a quadrant, transforming across tree boundaries if necessary.
void p8est_quadrant_transform_edge(const p8est_quadrant_t *q, p8est_quadrant_t *r, const p8est_edge_info_t *ei, const p8est_edge_transform_t *et, int inside)
Transforms a quadrant across an edge between trees.
void p8est_quadrant_root(p8est_quadrant_t *root)
Generate the root quadrant of any tree.
void p8est_quadrant_face_coordinates(const p8est_quadrant_t *q, int face, p4est_qcoord_t coords[])
Compute the coordinates of a specific quadrant face's midpoint.
void p8est_quadrant_transform_corner(p8est_quadrant_t *q, int corner, int inside)
Move a quadrant inside or diagonally outside a corner position.
void p8est_quadrant_transform_face(const p8est_quadrant_t *q, p8est_quadrant_t *r, const int ftransform[])
Transforms a quadrant/node across a face between trees.
int p8est_quadrant_is_inside_root(const p8est_quadrant_t *q)
Test if a quadrant is inside the unit tree.
void p8est_quadrant_predecessor(const p8est_quadrant_t *quadrant, p8est_quadrant_t *result)
Compute the predecessor according to the Morton index in a uniform mesh.
void p8est_quadrant_corner_neighbor(const p8est_quadrant_t *q, int corner, p8est_quadrant_t *r)
Compute the corner neighbor of a quadrant.
int p8est_quadrant_is_ancestor(const p8est_quadrant_t *q, const p8est_quadrant_t *r)
Test if a quadrant is an ancestor of another quadrant.
void p8est_quadrant_ancestor(const p8est_quadrant_t *q, int level, p8est_quadrant_t *r)
Compute the ancestor of a quadrant at a given level.
void p8est_quadrant_corner_node(const p8est_quadrant_t *q, int corner, p8est_quadrant_t *r)
Compute a corner node of a quadrant.
int p8est_quadrant_compare(const void *v1, const void *v2)
Compare two quadrants in their Morton ordering.
int p8est_quadrant_overlaps(const p8est_quadrant_t *q1, const p8est_quadrant_t *q2)
Test if two quadrants overlap.
int p8est_coordinates_is_inside_root(const p4est_qcoord_t coord[])
Test if Morton indices are inside the unit tree or on its boundary.
void p8est_quadrant_edge_coordinates(const p8est_quadrant_t *q, int edge, p4est_qcoord_t coords[])
Compute the coordinates of a specific quadrant edge's midpoint.
void p8est_quadrant_enlarge_first(const p8est_quadrant_t *a, p8est_quadrant_t *q)
Enlarge a quadrant as long as its first corner stays the same.
void p8est_quadrant_shift_corner(const p8est_quadrant_t *q, p8est_quadrant_t *r, int corner)
Shifts a quadrant until it touches the specified corner from the inside.
int p8est_quadrant_is_family(const p8est_quadrant_t *q0, const p8est_quadrant_t *q1, const p8est_quadrant_t *q2, const p8est_quadrant_t *q3, const p8est_quadrant_t *q4, const p8est_quadrant_t *q5, const p8est_quadrant_t *q6, const p8est_quadrant_t *q7)
Test if 8 quadrants are siblings in Morton ordering.
void p8est_neighbor_transform_quadrant_reverse(const p8est_neighbor_transform_t *nt, const p8est_quadrant_t *neigh_quad, p8est_quadrant_t *self_quad)
Transform a quadrant from a neighbors's coordinate system to self's coordinate system.
void p8est_coordinates_transform_corner(p4est_qcoord_t coords[], int corner)
Set a coordinate location to a given tree (root quadrant) corner.
void p8est_quadrant_enlarge_last(const p8est_quadrant_t *a, p8est_quadrant_t *q)
Enlarge a quadrant as long as its last corner stays the same.
int p8est_node_equal_piggy_fn(const void *v1, const void *v2, const void *u)
Test if two nodes are in the same tree and have equal Morton indices.
int p8est_coordinates_compare(const p4est_qcoord_t v1[], const p4est_qcoord_t v2[])
Compare two sets of coordinates in their Morton ordering.
int p8est_quadrant_is_inside_3x3(const p8est_quadrant_t *q)
Test if a quadrant is inside the 3x3 box around the root tree.
int p8est_quadrant_compare_piggy(const void *v1, const void *v2)
Compare two quadrants in their Morton ordering and the which_tree member.
void p8est_quadrant_volume_coordinates(const p8est_quadrant_t *q, p4est_qcoord_t coords[])
Compute the coordinates of a quadrant's midpoint.
void p8est_node_clamp_inside(const p8est_quadrant_t *n, p8est_quadrant_t *r)
Clamp a node inside the unit tree if it sits on a high border.
int p8est_quadrant_touches_corner(const p8est_quadrant_t *q, int corner, int inside)
Checks if a quadrant touches a corner (diagonally inside or outside).
void p8est_quadrant_corner_neighbor_extra(const p8est_quadrant_t *q, p4est_locidx_t t, int corner, sc_array_t *quads, sc_array_t *treeids, sc_array_t *ncorners, p8est_connectivity_t *conn)
Compute the corner neighbors of a quadrant, transforming across tree boundaries if necessary.
void p8est_quadrant_pad(p8est_quadrant_t *q)
Write -1 into the pad8 and pad16 members of a quadrant.
void p8est_quadrant_srand(const p8est_quadrant_t *q, sc_rand_state_t *rstate)
Initialize a random number generator by quadrant coordinates.
void p8est_node_to_quadrant(const p8est_quadrant_t *n, int level, p8est_quadrant_t *q)
Find the enclosing quadrant of a given node at a given level.
int p8est_quadrant_equal_fn(const void *v1, const void *v2, const void *u)
Test if two quadrants have equal Morton indices, callback version.
void p8est_quadrant_children(const p8est_quadrant_t *q, p8est_quadrant_t *c0, p8est_quadrant_t *c1, p8est_quadrant_t *c2, p8est_quadrant_t *c3, p8est_quadrant_t *c4, p8est_quadrant_t *c5, p8est_quadrant_t *c6, p8est_quadrant_t *c7)
Compute the 8 children of a quadrant.
int p8est_quadrant_is_next_D(const p8est_quadrant_t *q, const p8est_quadrant_t *r)
Test if two quadrants follow each other in the tree with no holes.
void p8est_quadrant_print(int log_priority, const p8est_quadrant_t *q)
Prints one line with quadrant's x, y, z and level.
unsigned p8est_quadrant_hash_fn(const void *v, const void *u)
Computes a hash value for a quadrant by the lookup3 method.
int p8est_coordinates_is_valid(const p4est_qcoord_t coord[], int level)
Test if Morton indices are valid and inside the unit tree.
int p8est_quadrant_is_ancestor_corner(const p8est_quadrant_t *descendant, const p8est_quadrant_t *ancestor, int corner)
Check if a descendant shares a corner with a (strict) ancestor.
int p8est_quadrant_is_next(const p8est_quadrant_t *q, const p8est_quadrant_t *r)
Test if two quadrants follow each other in the tree with no holes.
void p8est_quadrant_half_corner_neighbor(const p8est_quadrant_t *q, int corner, p8est_quadrant_t *r)
Compute the half size corner neighbor of a quadrant.
int p8est_quadrant_touches_edge(const p8est_quadrant_t *q, int edge, int inside)
Checks if a quadrant touches an edge (diagonally inside or outside).
int p8est_quadrant_is_parent(const p8est_quadrant_t *q, const p8est_quadrant_t *r)
Test if a quadrant is the parent of another quadrant.
int p8est_quadrant_disjoint(const void *v1, const void *v2)
Compare two quadrants in their Morton ordering, with equivalence if the two quadrants overlap.
int p8est_quadrant_is_equal_piggy(const p8est_quadrant_t *q1, const p8est_quadrant_t *q2)
Test if two quadrants have equal Morton indices and the same tree id.
void p8est_node_unclamp(p8est_quadrant_t *n)
Move a clamped node out on the border.
void p8est_coordinates_transform_face(const p4est_qcoord_t coords_in[], p4est_qcoord_t coords_out[], const int ftransform[])
Transforms coordinates across a face between trees.
int p8est_quadrant_is_ancestor_D(const p8est_quadrant_t *q, const p8est_quadrant_t *r)
Test if a quadrant is an ancestor of another quadrant.
void p8est_quadrant_shift_edge(const p8est_quadrant_t *q, p8est_quadrant_t *r, p8est_quadrant_t *rup, p8est_quadrant_t *rdown, int edge)
Shifts a quadrant until it touches the specified edge from the inside.
uint64_t p8est_quadrant_linear_id(const p8est_quadrant_t *quadrant, int level)
Computes the linear position of a quadrant in a uniform grid.
void p8est_quadrant_face_neighbor(const p8est_quadrant_t *q, int face, p8est_quadrant_t *r)
Compute the face neighbor of a quadrant.
unsigned p8est_node_hash_piggy_fn(const void *v, const void *u)
Compute hash value of a node based on its tree and Morton index.
int p8est_quadrant_is_inside_tree(p8est_tree_t *tree, const p8est_quadrant_t *q)
Test if a quadrant is completely contained within a tree.
void p8est_quadrant_sibling(const p8est_quadrant_t *q, p8est_quadrant_t *r, int sibling_id)
Compute a specific sibling of a quadrant.
int p8est_quadrant_is_outside_face(const p8est_quadrant_t *q)
Test if a quadrant is outside a tree face boundary (no edge or corner).
int p8est_quadrant_is_extended(const p8est_quadrant_t *q)
Test if a quadrant has valid Morton indices in the 3x3 box around root.
int p8est_quadrant_is_familypv(p8est_quadrant_t *q[])
Test if 8 quadrants are siblings in Morton ordering, array version.
int p8est_quadrant_overlaps_tree(p8est_tree_t *tree, const p8est_quadrant_t *q)
Test if a quadrant has at least partial overlap with a tree.
void p8est_quadrant_copy(const p8est_quadrant_t *q, p8est_quadrant_t *copy)
Copy the Morton indices of the quadrant q.
void p8est_quadrant_last_descendant(const p8est_quadrant_t *q, p8est_quadrant_t *ld, int level)
Compute the last descendant of a quadrant on a given level.
void p8est_quadrant_all_face_neighbors(const p8est_quadrant_t *q, int face, p8est_quadrant_t n[6])
Create all possible face neighbors of q.
p4est_locidx_t p8est_quadrant_face_neighbor_extra(const p8est_quadrant_t *q, p4est_topidx_t t, int face, p8est_quadrant_t *r, int *nface, p8est_connectivity_t *conn)
Compute the face neighbor of a quadrant, transforming across tree boundaries if necessary.
int p8est_quadrant_is_outside_corner(const p8est_quadrant_t *q)
Test if a quadrant is outside a tree corner boundary.
int p8est_quadrant_ancestor_id(const p8est_quadrant_t *q, int level)
Compute the position of the ancestor of this child at level level within its siblings.
int p8est_quadrant_is_valid(const p8est_quadrant_t *q)
Test if a quadrant has valid Morton indices and is inside the unit tree.
void p8est_quadrant_first_descendant(const p8est_quadrant_t *q, p8est_quadrant_t *fd, int level)
Compute the first descendant of a quadrant on a given level.
int p8est_quadrant_is_familyv(const p8est_quadrant_t q[])
Test if 8 quadrants are siblings in Morton ordering, array version.
void p8est_quadrant_childrenpv(const p8est_quadrant_t *q, p8est_quadrant_t *c[])
Compute the 8 children of a quadrant, array version.
void p8est_quadrant_corner_coordinates(const p8est_quadrant_t *q, int corner, p4est_qcoord_t coords[])
Compute the coordinates of a specific quadrant corner.
int p8est_quadrant_child_id(const p8est_quadrant_t *q)
Compute the position of this child within its siblings.
void p8est_quadrant_childrenv(const p8est_quadrant_t *q, p8est_quadrant_t c[])
Compute the 8 children of a quadrant, array version.
void p8est_quadrant_successor(const p8est_quadrant_t *quadrant, p8est_quadrant_t *result)
Compute the successor according to the Morton index in a uniform mesh.
void p8est_coordinates_transform_edge(const p4est_qcoord_t coords_in[], p4est_qcoord_t coords_out[], const p8est_edge_info_t *ei, const p8est_edge_transform_t *et)
Transforms coordinates on an edge between trees.
void p8est_nearest_common_ancestor_D(const p8est_quadrant_t *q1, const p8est_quadrant_t *q2, p8est_quadrant_t *r)
Computes the nearest common ancestor of two quadrants in the same tree.
void p8est_nearest_common_ancestor(const p8est_quadrant_t *q1, const p8est_quadrant_t *q2, p8est_quadrant_t *r)
Computes the nearest common ancestor of two quadrants in the same tree.
int p8est_quadrant_is_sibling(const p8est_quadrant_t *q1, const p8est_quadrant_t *q2)
Test if two quadrants are siblings.
int p8est_quadrant_is_outside_edge(const p8est_quadrant_t *q)
Test if a quadrant is outside a tree edge boundary (no corner).
int p8est_quadrant_is_ancestor_face(const p8est_quadrant_t *descendant, const p8est_quadrant_t *ancestor, int face)
Check if a descendant shares a face with a (strict) ancestor.
This structure holds the 3D inter-tree connectivity information.
Definition: p8est_connectivity.h:216
Information about the neighbors of an edge.
Definition: p8est_connectivity.h:299
Generic interface for transformations between a tree and any of its edge.
Definition: p8est_connectivity.h:288
Generic interface for transformations between a tree and any of its neighbors.
Definition: p8est_connectivity.h:325
The 3D quadrant (i.e., octant) datatype.
Definition: p8est.h:72
The p8est tree datatype.
Definition: p8est.h:125