t8  UNKNOWN
t8code is a C library to manage a forest of adaptive space-trees of general element classes in parallel.
t8_default_quad_cxx.hxx
1 /*
2  This file is part of t8code.
3  t8code is a C library to manage a collection (a forest) of multiple
4  connected adaptive space-trees of general element classes in parallel.
5 
6  Copyright (C) 2015 the developers
7 
8  t8code is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12 
13  t8code is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with t8code; if not, write to the Free Software Foundation, Inc.,
20  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 */
22 
31 #ifndef T8_DEFAULT_QUAD_CXX_HXX
32 #define T8_DEFAULT_QUAD_CXX_HXX
33 
34 #include <p4est.h>
35 #include <t8_element_cxx.hxx>
38 #include <t8_schemes/t8_default/t8_default_line/t8_default_line_cxx.hxx>
40 
45 typedef p4est_quadrant_t t8_pquad_t;
46 
48 #define T8_QUAD_GET_TDIM(quad) ((int) (quad)->pad8)
49 
53 #define T8_QUAD_GET_TNORMAL(quad) (T8_ASSERT (T8_QUAD_GET_TDIM (quad) == 3), ((int) (quad)->pad16))
54 
58 #define T8_QUAD_GET_TCOORD(quad) (T8_ASSERT (T8_QUAD_GET_TDIM (quad) == 3), ((int) (quad)->p.user_long))
59 
61 #define T8_QUAD_SET_TDIM(quad, dim) \
62  do { \
63  T8_ASSERT ((dim) == 2 || (dim) == 3); \
64  (quad)->pad8 = (int8_t) (dim); \
65  } while (0)
66 
68 #define T8_QUAD_SET_TNORMAL(quad, normal) \
69  do { \
70  T8_ASSERT ((normal) >= 0 && (normal) < 3); \
71  (quad)->pad16 = (int16_t) (normal); \
72  } while (0)
73 
75 #define T8_QUAD_SET_TCOORD(quad, coord) \
76  do { \
77  (quad)->p.user_long = (long) (coord); \
78  } while (0)
79 
81 {
82  public:
87 
89 
107  virtual void
108  t8_element_new (int length, t8_element_t **elem) const;
109 
127  virtual void
128  t8_element_init (int length, t8_element_t *elem, int called_new) const;
129 
134  virtual int
135  t8_element_level (const t8_element_t *elem) const;
136 
140  virtual int
141  t8_element_maxlevel (void) const;
142 
150  virtual void
151  t8_element_copy (const t8_element_t *source, t8_element_t *dest) const;
152 
160  virtual int
161  t8_element_compare (const t8_element_t *elem1, const t8_element_t *elem2) const;
162 
169  virtual int
170  t8_element_equal (const t8_element_t *elem1, const t8_element_t *elem2) const;
171 
184  virtual void
185  t8_element_parent (const t8_element_t *elem, t8_element_t *parent) const;
186 
198  virtual void
199  t8_element_sibling (const t8_element_t *elem, int sibid, t8_element_t *sibling) const;
200 
205  virtual int
206  t8_element_num_faces (const t8_element_t *elem) const;
207 
213  virtual int
214  t8_element_max_num_faces (const t8_element_t *elem) const;
215 
220  virtual int
221  t8_element_num_children (const t8_element_t *elem) const;
222 
228  virtual int
229  t8_element_num_face_children (const t8_element_t *elem, int face) const;
236  virtual int
237  t8_element_get_face_corner (const t8_element_t *element, int face, int corner) const;
238 
245  virtual int
246  t8_element_get_corner_face (const t8_element_t *element, int corner, int face) const;
247 
253  virtual t8_eclass_t
254  t8_element_child_eclass (int childid) const;
255 
265  virtual void
266  t8_element_child (const t8_element_t *elem, int childid, t8_element_t *child) const;
267 
279  virtual void
280  t8_element_children (const t8_element_t *elem, int length, t8_element_t *c[]) const;
281 
286  virtual int
287  t8_element_child_id (const t8_element_t *elem) const;
288 
295  virtual int
296  t8_element_ancestor_id (const t8_element_t *elem, int level) const;
297 
304  virtual int
305  t8_element_is_family (t8_element_t **fam) const;
306 
317  virtual void
318  t8_element_nca (const t8_element_t *elem1, const t8_element_t *elem2, t8_element_t *nca) const;
319 
325  virtual t8_element_shape_t
326  t8_element_face_shape (const t8_element_t *elem, int face) const;
327 
342  virtual void
343  t8_element_children_at_face (const t8_element_t *elem, int face, t8_element_t *children[], int num_children,
344  int *child_indices) const;
345 
366  virtual int
367  t8_element_face_child_face (const t8_element_t *elem, int face, int face_child) const;
368 
379  virtual int
380  t8_element_face_parent_face (const t8_element_t *elem, int face) const;
381 
391  virtual int
392  t8_element_tree_face (const t8_element_t *elem, int face) const;
393 
415  virtual void
416  t8_element_transform_face (const t8_element_t *elem1, t8_element_t *elem2, int orientation, int sign,
417  int is_smaller_face) const;
418 
432  virtual int
433  t8_element_extrude_face (const t8_element_t *face, const t8_eclass_scheme_c *face_scheme, t8_element_t *elem,
434  int root_face) const;
435 
444  virtual void
445  t8_element_first_descendant_face (const t8_element_t *elem, int face, t8_element_t *first_desc, int level) const;
446 
455  virtual void
456  t8_element_last_descendant_face (const t8_element_t *elem, int face, t8_element_t *last_desc, int level) const;
457 
467  virtual void
468  t8_element_boundary_face (const t8_element_t *elem, int face, t8_element_t *boundary,
469  const t8_eclass_scheme_c *boundary_scheme) const;
470 
476  virtual int
477  t8_element_is_root_boundary (const t8_element_t *elem, int face) const;
478 
494  virtual int
495  t8_element_face_neighbor_inside (const t8_element_t *elem, t8_element_t *neigh, int face, int *neigh_face) const;
496 
504  virtual void
505  t8_element_set_linear_id (t8_element_t *elem, int level, t8_linearidx_t id) const;
506 
513  virtual t8_linearidx_t
514  t8_element_get_linear_id (const t8_element_t *elem, int level) const;
515 
522  virtual void
523  t8_element_first_descendant (const t8_element_t *elem, t8_element_t *desc, int level) const;
524 
531  virtual void
532  t8_element_last_descendant (const t8_element_t *elem, t8_element_t *desc, int level) const;
533 
539  virtual void
540  t8_element_successor (const t8_element_t *t, t8_element_t *s, int level) const;
541 
552  virtual void
553  t8_element_anchor (const t8_element_t *elem, int anchor[3]) const;
554 
565  virtual void
566  t8_element_vertex_coords (const t8_element_t *elem, int vertex, int coords[]) const;
567 
575  virtual void
576  t8_element_vertex_reference_coords (const t8_element_t *elem, const int vertex, double coords[]) const;
577 
588  virtual void
589  t8_element_reference_coords (const t8_element_t *elem, const double *ref_coords, const size_t num_coords,
590  double *out_coords) const;
591 
596  virtual int
597  t8_element_refines_irregular (void) const;
598 
599 #ifdef T8_ENABLE_DEBUG
614  virtual int
615  t8_element_is_valid (const t8_element_t *t) const;
616 
624  virtual void
625  t8_element_to_string (const t8_element_t *elem, char *debug_string, const int string_size) const;
626 #endif
627 };
628 
629 #endif /* !T8_DEFAULT_QUAD_CXX_HXX */
Definition: t8_default_common_cxx.hxx:36
Definition: t8_default_quad_cxx.hxx:81
virtual int t8_element_extrude_face(const t8_element_t *face, const t8_eclass_scheme_c *face_scheme, t8_element_t *elem, int root_face) const
Given a boundary face inside a root tree's face construct the element inside the root tree that has t...
Definition: t8_default_quad_cxx.cxx:496
virtual void t8_element_copy(const t8_element_t *source, t8_element_t *dest) const
Copy all entries of source to dest.
Definition: t8_default_quad_cxx.cxx:73
virtual int t8_element_equal(const t8_element_t *elem1, const t8_element_t *elem2) const
Check if two elements are equal.
Definition: t8_default_quad_cxx.cxx:98
virtual int t8_element_maxlevel(void) const
Return the maximum allowed level for this element class.
Definition: t8_default_quad_cxx.cxx:41
virtual t8_element_shape_t t8_element_face_shape(const t8_element_t *elem, int face) const
Compute the shape of the face of an element.
Definition: t8_default_quad_cxx.cxx:317
virtual void t8_element_boundary_face(const t8_element_t *elem, int face, t8_element_t *boundary, const t8_eclass_scheme_c *boundary_scheme) const
Construct the boundary element at a specific face.
Definition: t8_default_quad_cxx.cxx:594
virtual int t8_element_tree_face(const t8_element_t *elem, int face) const
Given an element and a face of this element.
Definition: t8_default_quad_cxx.cxx:549
virtual void t8_element_children_at_face(const t8_element_t *elem, int face, t8_element_t *children[], int num_children, int *child_indices) const
Given an element and a face of the element, compute all children of the element that touch the face.
Definition: t8_default_quad_cxx.cxx:324
virtual void t8_element_init(int length, t8_element_t *elem, int called_new) const
Initialize an array of allocated quad elements.
Definition: t8_default_quad_cxx.cxx:733
virtual void t8_element_children(const t8_element_t *elem, int length, t8_element_t *c[]) const
Construct all children of a given element.
Definition: t8_default_quad_cxx.cxx:205
virtual int t8_element_num_face_children(const t8_element_t *elem, int face) const
Return the number of children of an element's face when the element is refined.
Definition: t8_default_quad_cxx.cxx:148
virtual void t8_element_successor(const t8_element_t *t, t8_element_t *s, int level) const
Construct the successor in a uniform refinement of a given element.
Definition: t8_default_quad_cxx.cxx:293
virtual void t8_element_transform_face(const t8_element_t *elem1, t8_element_t *elem2, int orientation, int sign, int is_smaller_face) const
Suppose we have two trees that share a common face f.
Definition: t8_default_quad_cxx.cxx:418
virtual void t8_element_to_string(const t8_element_t *elem, char *debug_string, const int string_size) const
Print a given element.
Definition: t8_default_quad_cxx.cxx:769
virtual int t8_element_is_family(t8_element_t **fam) const
Query whether a given set of elements is a family or not.
Definition: t8_default_quad_cxx.cxx:241
virtual t8_eclass_t t8_element_child_eclass(int childid) const
Return the type of each child in the ordering of the implementation.
Definition: t8_default_quad_cxx.cxx:47
virtual int t8_element_max_num_faces(const t8_element_t *elem) const
Compute the maximum number of faces of a given element and all of its descendants.
Definition: t8_default_quad_cxx.cxx:135
virtual void t8_element_anchor(const t8_element_t *elem, int anchor[3]) const
Get the integer coordinates of the anchor node of an element.
Definition: t8_default_quad_cxx.cxx:664
virtual void t8_element_nca(const t8_element_t *elem1, const t8_element_t *elem2, t8_element_t *nca) const
Compute the nearest common ancestor of two elements.
Definition: t8_default_quad_cxx.cxx:303
virtual void t8_element_vertex_coords(const t8_element_t *elem, int vertex, int coords[]) const
Compute the integer coordinates of a given element vertex.
Definition: t8_default_quad_cxx.cxx:677
virtual void t8_element_last_descendant(const t8_element_t *elem, t8_element_t *desc, int level) const
Compute the last descendant of a given element.
Definition: t8_default_quad_cxx.cxx:283
virtual int t8_element_face_parent_face(const t8_element_t *elem, int face) const
Given a face of an element return the face number of the parent of the element that matches the eleme...
Definition: t8_default_quad_cxx.cxx:399
virtual int t8_element_ancestor_id(const t8_element_t *elem, int level) const
Compute the ancestor id of an element, that is the child id at a given level.
Definition: t8_default_quad_cxx.cxx:235
virtual int t8_element_num_faces(const t8_element_t *elem) const
Compute the number of faces of a given element.
Definition: t8_default_quad_cxx.cxx:128
virtual int t8_element_child_id(const t8_element_t *elem) const
Compute the child id of an element.
Definition: t8_default_quad_cxx.cxx:228
virtual int t8_element_num_children(const t8_element_t *elem) const
Return the number of children of an element when it is refined.
Definition: t8_default_quad_cxx.cxx:141
virtual void t8_element_new(int length, t8_element_t **elem) const
Allocate memory for an array of quadrilaterals and initialize them.
Definition: t8_default_quad_cxx.cxx:717
virtual int t8_element_is_root_boundary(const t8_element_t *elem, int face) const
Compute whether a given element shares a given face with its root tree.
Definition: t8_default_quad_cxx.cxx:623
virtual int t8_element_level(const t8_element_t *elem) const
Return the refinement level of an element.
Definition: t8_default_quad_cxx.cxx:56
virtual int t8_element_refines_irregular(void) const
Returns true, if there is one element in the tree, that does not refine into 2^dim children.
Definition: t8_default_quad_cxx.cxx:753
virtual int t8_element_is_valid(const t8_element_t *t) const
Query whether a given element can be considered as 'valid' and it is safe to perform any of the above...
Definition: t8_default_quad_cxx.cxx:761
virtual int t8_element_face_child_face(const t8_element_t *elem, int face, int face_child) const
Given a face of an element and a child number of a child of that face, return the face number of the ...
Definition: t8_default_quad_cxx.cxx:391
virtual int t8_element_get_face_corner(const t8_element_t *element, int face, int corner) const
Return the corner number of an element's face corner.
Definition: t8_default_quad_cxx.cxx:155
t8_default_scheme_quad_c()
The virtual table for a particular implementation of an element class.
Definition: t8_default_quad_cxx.cxx:780
virtual void t8_element_reference_coords(const t8_element_t *elem, const double *ref_coords, const size_t num_coords, double *out_coords) const
Convert points in the reference space of an element to points in the reference space of the tree.
Definition: t8_default_quad_cxx.cxx:709
virtual int t8_element_face_neighbor_inside(const t8_element_t *elem, t8_element_t *neigh, int face, int *neigh_face) const
Construct the face neighbor of a given element if this face neighbor is inside the root tree.
Definition: t8_default_quad_cxx.cxx:641
virtual int t8_element_get_corner_face(const t8_element_t *element, int corner, int face) const
Return the face numbers of the faces sharing an element's corner.
Definition: t8_default_quad_cxx.cxx:173
virtual void t8_element_vertex_reference_coords(const t8_element_t *elem, const int vertex, double coords[]) const
Compute the coordinates of a given element vertex inside a reference tree that is embedded into [0,...
Definition: t8_default_quad_cxx.cxx:693
virtual void t8_element_parent(const t8_element_t *elem, t8_element_t *parent) const
Compute the parent of a given element elem and store it in parent.
Definition: t8_default_quad_cxx.cxx:104
virtual void t8_element_child(const t8_element_t *elem, int childid, t8_element_t *child) const
Construct the child element of a given number.
Definition: t8_default_quad_cxx.cxx:182
virtual void t8_element_first_descendant_face(const t8_element_t *elem, int face, t8_element_t *first_desc, int level) const
Construct the first descendant of an element at a given level that touches a given face.
Definition: t8_default_quad_cxx.cxx:559
virtual void t8_element_last_descendant_face(const t8_element_t *elem, int face, t8_element_t *last_desc, int level) const
Construct the last descendant of an element at a given level that touches a given face.
Definition: t8_default_quad_cxx.cxx:577
virtual void t8_element_sibling(const t8_element_t *elem, int sibid, t8_element_t *sibling) const
Compute a specific sibling of a given quad element elem and store it in sibling.
Definition: t8_default_quad_cxx.cxx:116
virtual void t8_element_set_linear_id(t8_element_t *elem, int level, t8_linearidx_t id) const
Initialize the entries of an allocated element according to a given linear id in a uniform refinement...
Definition: t8_default_quad_cxx.cxx:253
virtual t8_linearidx_t t8_element_get_linear_id(const t8_element_t *elem, int level) const
Compute the linear id of a given element in a hypothetical uniform refinement of a given level.
Definition: t8_default_quad_cxx.cxx:264
virtual int t8_element_compare(const t8_element_t *elem1, const t8_element_t *elem2) const
Compare two elements.
Definition: t8_default_quad_cxx.cxx:89
virtual void t8_element_first_descendant(const t8_element_t *elem, t8_element_t *desc, int level) const
Compute the first descendant of a given element.
Definition: t8_default_quad_cxx.cxx:273
This struct holds virtual functions for a particular element class.
Definition: t8_element_cxx.hxx:47
uint64_t t8_linearidx_t
A type for storing SFC indices.
Definition: t8.h:107
We provide some functions that are useful across element classes.
p4est_quadrant_t t8_pquad_t
The structure holding a quadrilateral element in the default scheme.
Definition: t8_default_quad.h:41
TODO: document this.
Definitions of quad-specific functions.
enum t8_eclass t8_eclass_t
This enumeration contains all possible element classes.
struct t8_element t8_element_t
Opaque structure for a generic element, only used as pointer.
Definition: t8_element.h:42
This file defines basic operations on an element in a refinement tree.
t8_eclass_t t8_element_shape_t
Type definition for the geometric shape of an element.
Definition: t8_element_shape.h:38