p4est
2.8.7
p4est is a software library for parallel adaptive mesh refinement.
|
Transform from tree-local "reference" coordinate system to global "physical space" coordinates. More...
#include <p4est_lnodes.h>
Go to the source code of this file.
Data Structures | |
struct | p4est_geometry |
Encapsulates a custom transformation from tree-local coordinates to user defined physical space. More... | |
Typedefs | |
typedef struct p4est_geometry | p4est_geometry_t |
This object encapsulates a custom geometry transformation. | |
typedef void(* | p4est_geometry_X_t) (p4est_geometry_t *geom, p4est_topidx_t which_tree, const double abc[3], double xyz[3]) |
Forward transformation from the tree-local coordinates to physical space. More... | |
typedef void(* | p4est_geometry_destroy_t) (p4est_geometry_t *geom) |
Destructor prototype for a user-allocated p4est_geometry_t. More... | |
Enumerations | |
enum | pillow_disk_config_t { FIG32A = 0 , FIG32B = 1 , FIG32C = 2 , FIG32D = 3 } |
Characterize different mappings of the disk using a 1-tree connectivity. More... | |
Functions | |
void | p4est_geometry_transform_coordinates (p4est_geometry_t *geom, p4est_topidx_t which_tree, p4est_qcoord_t coords_in[2], double coords_out[3]) |
Transform a quadrant reference coordinate into the geometry. More... | |
void | p4est_geometry_destroy (p4est_geometry_t *geom) |
Can be used to conveniently destroy a geometry structure. More... | |
p4est_geometry_t * | p4est_geometry_new_connectivity (p4est_connectivity_t *conn) |
Create a geometry structure based on the vertices in a connectivity. More... | |
void | p4est_geometry_connectivity_X (p4est_geometry_t *geom, p4est_topidx_t which_tree, const double abc[3], double xyz[3]) |
Geometric coordinate transformation for geometry created with p4est_geometry_new_connectivity. More... | |
p4est_geometry_t * | p4est_geometry_new_icosahedron (p4est_connectivity_t *conn, double R) |
Create a geometry for mapping the sphere using 2d connectivity icosahedron. More... | |
p4est_geometry_t * | p4est_geometry_new_shell2d (p4est_connectivity_t *conn, double R2, double R1) |
Create a geometry for mapping the annulus. More... | |
p4est_geometry_t * | p4est_geometry_new_disk2d (p4est_connectivity_t *conn, double R0, double R1) |
Create disk2d geometry associated to disk2d connectivity. More... | |
p4est_geometry_t * | p4est_geometry_new_sphere2d (p4est_connectivity_t *conn, double R) |
Create sphere geometry associated to cubed connectivity. More... | |
p4est_geometry_t * | p4est_geometry_new_pillow (p4est_connectivity_t *conn, double R) |
Create a geometry for mapping the sphere using 2d connectivity pillow. More... | |
p4est_geometry_t * | p4est_geometry_new_pillow_disk (p4est_connectivity_t *conn, double R, pillow_disk_config_t config) |
Create a geometry for mapping the disk using 2d connectivity unit. More... | |
void | p4est_geometry_coordinates_lnodes (p4est_t *p4est, p4est_lnodes_t *lnodes, const double *refloc, p4est_geometry_t *geom, sc_array_t *coordinates, sc_array_t *element_coordinates) |
Compute node coordinates for a p4est_lnodes structure. More... | |
Transform from tree-local "reference" coordinate system to global "physical space" coordinates.
These are used in p4est_vtk.h to write global coordinate meshes to disk.
We provide several example geometries for use. You may also implement your own geometry as you see fit.
typedef void(* p4est_geometry_destroy_t) (p4est_geometry_t *geom) |
Destructor prototype for a user-allocated p4est_geometry_t.
It is invoked by p4est_geometry_destroy. If the user chooses to reserve the structure statically, there is no need to provide it.
typedef void(* p4est_geometry_X_t) (p4est_geometry_t *geom, p4est_topidx_t which_tree, const double abc[3], double xyz[3]) |
Forward transformation from the tree-local coordinates to physical space.
[in] | geom | associated geometry |
[in] | which_tree | tree id inside forest |
[in] | abc | tree-local coordinates: ![]() |
[out] | xyz | cartesian coordinates in physical space after geometry |
enum pillow_disk_config_t |
Characterize different mappings of the disk using a 1-tree connectivity.
The different mappings correspond to the ones used to produce figure 3.2 in the following publication:
"Logically rectangular grids and finite volume methods for PDEs in circular and spherical domains", Calhoun et al, SIAM Review, volume 50, Issue 4, January 2008. https://doi.org/10.1137/060664094
void p4est_geometry_connectivity_X | ( | p4est_geometry_t * | geom, |
p4est_topidx_t | which_tree, | ||
const double | abc[3], | ||
double | xyz[3] | ||
) |
Geometric coordinate transformation for geometry created with p4est_geometry_new_connectivity.
This is defined by tri/binlinear interpolation from vertex coordinates.
May also be used as a building block in custom geometric coordinate transforms. See for example p4est_geometry_new_sphere2d or p4est_geometry_new_disk2d.
[in] | geom | associated geometry |
[in] | which_tree | tree id inside forest |
[in] | abc | tree-local reference coordinates : [0,1]^3. Note: abc[2] is only accessed by the P4_TO_P8 version |
[out] | xyz | Cartesian coordinates in physical space after geometry |
void p4est_geometry_coordinates_lnodes | ( | p4est_t * | p4est, |
p4est_lnodes_t * | lnodes, | ||
const double * | refloc, | ||
p4est_geometry_t * | geom, | ||
sc_array_t * | coordinates, | ||
sc_array_t * | element_coordinates | ||
) |
Compute node coordinates for a p4est_lnodes structure.
Presently we allow for an lnodes degree of 1 or 2. Cubic or higher degrees may be transparently enabled in the future.
The simple mode assigns one tree reference coordinate to each lnode. This may not be suitable for visualizing periodic connectivities.
In a more advanced mode indicated by NULL element_coordinates
input, the coordinates are made unique by reference location: If a tree is periodic, for example, its corners reference the same lnode but will generate separate coordinate entries for proper visualization. There will be more coordinates generated than there are lnodes.
The coordinate numbers generated by the present version of the function are partition-dependent. This may be seen as a flaw. Looking into it.
[in] | p4est | A valid forest structure. |
[in] | lnodes | A valid p4est_lnodes structure of degree 1 or 2. Higher degrees not presently allowed. Must be derived from the p4est . |
[in] | refloc | Eventually used for cubic and upwards degrees. We will expect degree + 1 many values for the one-dimensional reference node spacing. Out of these, the indices from 1 to (degree - 1) / 2 inclusive will be accessed by this function. The others default by symmetry considerations. |
[in] | geom | May be NULL for generating the tree-reference coordinates, or a valid geometry object for transforming the reference into mapped space. |
[in,out] | coordinates | On input, an array with entries of 3 double variables each. Resized in this function and populated with coordinate tuples. With a NULL geometry, these are in [0, 1]**2. Otherwise, they are mapped by the geometry. |
[in,out] | element_coordinates | This may be NULL, in which case we generate one coordinate tuple for each lnode. Otherwise, this must be an array with entries of type p4est_locidx_t. Is resized to the same number of entries as lnodes->element_nodes . Its entries point into the coordinates array. The tree index of any given entry is implicit in that this array is derived from a p4est, where sets of (degree + 1)**2 entries each correspond to the forest elements in order. |
void p4est_geometry_destroy | ( | p4est_geometry_t * | geom | ) |
Can be used to conveniently destroy a geometry structure.
The user is free not to call this function at all if they handle the memory of the p4est_geometry_t in their own way.
p4est_geometry_t* p4est_geometry_new_connectivity | ( | p4est_connectivity_t * | conn | ) |
Create a geometry structure based on the vertices in a connectivity.
The transformation is constructed using bilinear interpolation.
[in] | conn | A connectivity with vertex coordinate information. We do not take ownership and expect this structure to stay alive. |
p4est_geometry_t* p4est_geometry_new_disk2d | ( | p4est_connectivity_t * | conn, |
double | R0, | ||
double | R1 | ||
) |
Create disk2d geometry associated to disk2d connectivity.
[in] | conn | The result of p4est_connectivity_new_disk2d. |
[in] | R0 | radius of the inner circle. |
[in] | R1 | radius of the outer circle (external border). |
This geometry is meant to be used with the disk2d connectivity, which is a 5-tree connectivity to map the spherical disk.
p4est_geometry_t* p4est_geometry_new_icosahedron | ( | p4est_connectivity_t * | conn, |
double | R | ||
) |
Create a geometry for mapping the sphere using 2d connectivity icosahedron.
[in] | conn | The result of p4est_connectivity_new_icosahedron. |
[in] | R | The radius of the sphere. |
p4est_geometry_t* p4est_geometry_new_pillow | ( | p4est_connectivity_t * | conn, |
double | R | ||
) |
Create a geometry for mapping the sphere using 2d connectivity pillow.
[in] | conn | The result of p4est_connectivity_new_pillow. |
[in] | R | The radius of the sphere. |
p4est_geometry_t* p4est_geometry_new_pillow_disk | ( | p4est_connectivity_t * | conn, |
double | R, | ||
pillow_disk_config_t | config | ||
) |
Create a geometry for mapping the disk using 2d connectivity unit.
See companion routine p8est_geometry_new_pillow_sphere which maps the 3d solid sphere using 1-tree unit connectivity.
[in] | conn | The result of p4est_connectivity_new_unitsquare. |
[in] | R | The radius of the disk. |
[in] | config | The configuration to identify a mapping variant. |
p4est_geometry_t* p4est_geometry_new_shell2d | ( | p4est_connectivity_t * | conn, |
double | R2, | ||
double | R1 | ||
) |
Create a geometry for mapping the annulus.
This a direct adaptation of geometric shell in 3d.
[in] | conn | The result of p4est_connectivity_new_shell2d. |
[in] | R1 | radius of the inner circle (internal border). |
[in] | R2 | radius of the outer circle (external border). |
p4est_geometry_t* p4est_geometry_new_sphere2d | ( | p4est_connectivity_t * | conn, |
double | R | ||
) |
Create sphere geometry associated to cubed connectivity.
[in] | conn | The result of p4est_connectivity_new_cubed. |
[in] | R | radius of the sphere |
This geometry is meant to be used with the cubed connectivity p4est_connectivity_new_cubed, which is a 6-tree connectivity, to map the sphere.
void p4est_geometry_transform_coordinates | ( | p4est_geometry_t * | geom, |
p4est_topidx_t | which_tree, | ||
p4est_qcoord_t | coords_in[2], | ||
double | coords_out[3] | ||
) |
Transform a quadrant reference coordinate into the geometry.
[in] | geom | Properly initialized geometry object. |
[in] | which_tree | Valid tree number relative to the connectivity that is underlying the geometry. |
[in] | coords_in | Valid quadrant reference coordinates. They must be in [0, P4EST_ROOT_LEN]^2. |
[out] | coords_out | Coordinates in the physical geometry. |