[cig-commits] commit: Make Mesh_HexType_ElementHasPoint2DWithIncidence work with quad elements and at least abort in 3D. Also fixed some indexing bugs in Mesh_HexType_ElementHasPoint3DWithIncidence that assigned a point to the wrong face or edge of an element
Mercurial
hg at geodynamics.org
Mon Sep 26 17:07:17 PDT 2011
changeset: 613:23dfbddfe253
tag: tip
user: Walter Landry <wlandry at caltech.edu>
date: Mon Sep 26 17:02:02 2011 -0700
files: Mesh/src/Mesh_HexType.cxx
description:
Make Mesh_HexType_ElementHasPoint2DWithIncidence work with quad elements and at least abort in 3D. Also fixed some indexing bugs in Mesh_HexType_ElementHasPoint3DWithIncidence that assigned a point to the wrong face or edge of an element
diff -r c21b59af4867 -r 23dfbddfe253 Mesh/src/Mesh_HexType.cxx
--- a/Mesh/src/Mesh_HexType.cxx Wed Sep 21 23:29:58 2011 -0700
+++ b/Mesh/src/Mesh_HexType.cxx Mon Sep 26 17:02:02 2011 -0700
@@ -416,505 +416,603 @@ Bool Mesh_HexType_ElementHasPoint3DWithI
Bool Mesh_HexType_ElementHasPoint3DWithIncidence( Mesh_HexType* self, unsigned elInd, double* point,
MeshTopology_Dim* dim, unsigned* ind )
{
- Mesh* mesh;
- unsigned nInc;
- Bool fnd;
- double bc[4];
- IGraph* topo;
- unsigned inside;
- const int* inc;
+ Mesh* mesh;
+ unsigned nInc;
+ Bool fnd;
+ double bc[4];
+ IGraph* topo;
+ unsigned inside;
+ const int* inc;
- assert( self && Stg_CheckType( self, Mesh_HexType ) );
- assert( Mesh_GetDimSize( self->mesh ) == 3 );
- assert( elInd < Mesh_GetDomainSize( self->mesh, Mesh_GetDimSize( self->mesh ) ) );
- assert( point );
- assert( dim );
- assert( ind );
+ assert( self && Stg_CheckType( self, Mesh_HexType ) );
+ assert( Mesh_GetDimSize( self->mesh ) == 3 );
+ assert( elInd < Mesh_GetDomainSize( self->mesh, Mesh_GetDimSize( self->mesh ) ) );
+ assert( point );
+ assert( dim );
+ assert( ind );
- /* Shortcuts. */
- mesh = self->mesh;
- topo = (IGraph*)mesh->topo;
+ /* Shortcuts. */
+ mesh = self->mesh;
+ topo = (IGraph*)mesh->topo;
- /* Get element to vertex incidence. */
- Mesh_GetIncidence( mesh, Mesh_GetDimSize( mesh ), elInd, MT_VERTEX, self->incArray );
- nInc = IArray_GetSize( self->incArray );
- inc = IArray_GetPtr( self->incArray );
+ /* Get element to vertex incidence. */
+ Mesh_GetIncidence( mesh, Mesh_GetDimSize( mesh ), elInd, MT_VERTEX, self->incArray );
+ nInc = IArray_GetSize( self->incArray );
+ inc = IArray_GetPtr( self->incArray );
- /* Search for tetrahedra. */
- if( self->mapSize ) {
- unsigned v_i;
+ /* Search for tetrahedra. */
+ if( self->mapSize ) {
+ unsigned v_i;
- for( v_i = 0; v_i < self->mapSize; v_i++ )
- self->inc[v_i] = inc[self->vertMap[v_i]];
- fnd = Simplex_Search3D( mesh->verts, self->inc,
- self->num_simplexes[1], self->tetInds,
- point, bc, &inside );
- }
- else
- fnd = Simplex_Search3D( mesh->verts, (unsigned*)inc,
- self->num_simplexes[1], self->tetInds,
- point, bc, &inside );
- if( fnd ) {
- unsigned* inds = self->tetInds[inside];
+ for( v_i = 0; v_i < self->mapSize; v_i++ )
+ self->inc[v_i] = inc[self->vertMap[v_i]];
+ fnd = Simplex_Search3D( mesh->verts, self->inc,
+ self->num_simplexes[1], self->tetInds,
+ point, bc, &inside );
+ }
+ else
+ fnd = Simplex_Search3D( mesh->verts, (unsigned*)inc,
+ self->num_simplexes[1], self->tetInds,
+ point, bc, &inside );
+ if( fnd ) {
+ unsigned* inds = self->tetInds[inside];
- /* Check boundary ownership. */
- if( bc[0] == 0.0 || bc[0] == -0.0 ) {
- if( bc[1] == 0.0 || bc[1] == -0.0 ) {
- if( bc[2] == 0.0 || bc[2] == -0.0 ) {
- *dim = MT_VERTEX;
- *ind = topo->incEls[MT_VOLUME][MT_VERTEX][elInd][inds[3]];
- }
- else if( bc[3] == 0.0 || bc[3] == -0.0 ) {
- *dim = MT_VERTEX;
- *ind = topo->incEls[MT_VOLUME][MT_VERTEX][elInd][inds[2]];
- }
- else {
- if( inside == 0 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
- }
- else if( inside == 1 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][11];
- }
- else if( inside == 2 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][7];
- }
- else if( inside == 3 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][5];
- }
- else if( inside == 4 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
- }
- else if( inside == 5 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
- }
- else if( inside == 6 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
- }
- else if( inside == 7 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
- }
- else if( inside == 8 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][5];
- }
- else {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
- }
- }
- }
- else if( bc[2] == 0.0 || bc[2] == -0.0 ) {
- if( bc[3] == 0.0 || bc[3] == -0.0 ) {
- *dim = MT_VERTEX;
- *ind = topo->incEls[MT_VOLUME][MT_VERTEX][elInd][inds[1]];
- }
- else {
- if( inside == 0 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
- }
- else if( inside == 1 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
- }
- else if( inside == 2 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
- }
- else if( inside == 3 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
- }
- else if( inside == 4 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
- }
- else if( inside == 5 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][9];
- }
- else if( inside == 6 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][6];
- }
- else if( inside == 7 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][10];
- }
- else if( inside == 8 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][7];
- }
- else {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
- }
- }
- }
- else if( bc[3] == 0.0 || bc[3] == -0.0 ) {
- if( inside == 0 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
- }
- else if( inside == 1 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][1];
- }
- else if( inside == 2 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][4];
- }
- else if( inside == 3 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][6];
- }
- else if( inside == 4 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
- }
- else if( inside == 5 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][3];
- }
- else if( inside == 6 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][4];
- }
- else if( inside == 7 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][1];
- }
- else if( inside == 8 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
- }
- else {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
- }
- }
- else {
- if( inside == 0 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else if( inside == 1 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
- }
- else if( inside == 2 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
- }
- else if( inside == 3 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
- }
- else if( inside == 4 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else if( inside == 5 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
- }
- else if( inside == 6 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
- }
- else if( inside == 7 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
- }
- else if( inside == 8 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
- }
- else {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- }
- }
- else if( bc[1] == 0.0 || bc[1] == -0.0 ) {
- if( bc[2] == 0.0 || bc[2] == -0.0 ) {
- if( bc[3] == 0.0 || bc[3] == -0.0 ) {
- *dim = MT_VERTEX;
- *ind = topo->incEls[MT_VOLUME][MT_VERTEX][elInd][inds[0]];
- }
- else {
- if( inside == 0 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][8];
- }
- else if( inside == 1 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
- }
- else if( inside == 2 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
- }
- else if( inside == 3 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
- }
- else if( inside == 4 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
- }
- else if( inside == 5 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
- }
- else if( inside == 6 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
- }
- else if( inside == 7 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
- }
- else if( inside == 8 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][7];
- }
- else {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
- }
- }
- }
- else if( bc[3] == 0.0 || bc[3] == -0.0 ) {
- if( inside == 0 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][2];
- }
- else if( inside == 1 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][3];
- }
- else if( inside == 2 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][9];
- }
- else if( inside == 3 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][10];
- }
- else if( inside == 4 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
- }
- else if( inside == 5 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
- }
- else if( inside == 6 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
- }
- else if( inside == 7 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
- }
- else if( inside == 8 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
- }
- else {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
- }
- }
- else {
- if( inside == 0 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
- }
- else if( inside == 1 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
- }
- else if( inside == 2 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
- }
- else if( inside == 3 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
- }
- else if( inside == 4 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else if( inside == 5 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else if( inside == 6 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else if( inside == 7 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else if( inside == 8 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
- }
- else {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- }
- }
- else if( bc[2] == 0.0 || bc[2] == -0.0 ) {
- if( bc[3] == 0.0 || bc[3] == -0.0 ) {
- if( inside == 0 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][0];
- }
- else if( inside == 1 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
- }
- else if( inside == 2 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
- }
- else if( inside == 3 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
- }
- else if( inside == 4 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
- }
- else if( inside == 5 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][0];
- }
- else if( inside == 6 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][8];
- }
- else if( inside == 7 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][2];
- }
- else if( inside == 8 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
- }
- else {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
- }
- }
- else {
- if( inside == 0 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
- }
- else if( inside == 1 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else if( inside == 2 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else if( inside == 3 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else if( inside == 4 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else if( inside == 5 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
- }
- else if( inside == 6 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
- }
- else if( inside == 7 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
- }
- else if( inside == 8 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
- }
- else {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- }
- }
- else if( bc[3] == 0.0 || bc[3] == -0.0 ) {
- if( inside == 0 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
- }
- else if( inside == 1 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
- }
- else if( inside == 2 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
- }
- else if( inside == 3 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
- }
- else if( inside == 4 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else if( inside == 5 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
- }
- else if( inside == 6 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
- }
- else if( inside == 7 ) {
- *dim = MT_FACE;
- *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
- }
- else if( inside == 8 ) {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- else {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
- }
- else {
- *dim = MT_VOLUME;
- *ind = elInd;
- }
-
- return True;
- }
-
- return False;
+ /* Check boundary ownership. */
+ if( bc[0] == 0.0 || bc[0] == -0.0 ) {
+ if( bc[1] == 0.0 || bc[1] == -0.0 ) {
+ if( bc[2] == 0.0 || bc[2] == -0.0 ) {
+ *dim = MT_VERTEX;
+ *ind = topo->incEls[MT_VOLUME][MT_VERTEX][elInd][inds[3]];
+ }
+ else if( bc[3] == 0.0 || bc[3] == -0.0 ) {
+ *dim = MT_VERTEX;
+ *ind = topo->incEls[MT_VOLUME][MT_VERTEX][elInd][inds[2]];
+ }
+ else {
+ switch(self->num_simplexes[1])
+ {
+ case 10:
+ if( inside == 0 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
+ }
+ else if( inside == 1 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][11];
+ }
+ else if( inside == 2 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][7];
+ }
+ else if( inside == 3 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][5];
+ }
+ else if( inside == 4 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
+ }
+ else if( inside == 5 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
+ }
+ else if( inside == 6 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
+ }
+ else if( inside == 7 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
+ }
+ else if( inside == 8 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][5];
+ }
+ else {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
+ }
+ break;
+ case 80:
+ abort();
+ break;
+ default:
+ abort;
+ }
+ }
+ }
+ else if( bc[2] == 0.0 || bc[2] == -0.0 ) {
+ if( bc[3] == 0.0 || bc[3] == -0.0 ) {
+ *dim = MT_VERTEX;
+ *ind = topo->incEls[MT_VOLUME][MT_VERTEX][elInd][inds[1]];
+ }
+ else {
+ switch(self->num_simplexes[1])
+ {
+ case 10:
+ if( inside == 0 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
+ }
+ else if( inside == 1 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
+ }
+ else if( inside == 2 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
+ }
+ else if( inside == 3 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
+ }
+ else if( inside == 4 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
+ }
+ else if( inside == 5 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][9];
+ }
+ else if( inside == 6 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][6];
+ }
+ else if( inside == 7 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][10];
+ }
+ else if( inside == 8 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][7];
+ }
+ else {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
+ }
+ break;
+ case 80:
+ abort();
+ break;
+ default:
+ abort;
+ }
+ }
+ }
+ else if( bc[3] == 0.0 || bc[3] == -0.0 ) {
+ switch(self->num_simplexes[1])
+ {
+ case 10:
+ if( inside == 0 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
+ }
+ else if( inside == 1 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][1];
+ }
+ else if( inside == 2 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][4];
+ }
+ else if( inside == 3 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][6];
+ }
+ else if( inside == 4 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
+ }
+ else if( inside == 5 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][3];
+ }
+ else if( inside == 6 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][4];
+ }
+ else if( inside == 7 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][1];
+ }
+ else if( inside == 8 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
+ }
+ else {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
+ }
+ break;
+ case 80:
+ abort();
+ break;
+ default:
+ abort;
+ }
+ }
+ else {
+ switch(self->num_simplexes[1])
+ {
+ case 10:
+ if( inside == 0 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else if( inside == 1 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
+ }
+ else if( inside == 2 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
+ }
+ else if( inside == 3 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
+ }
+ else if( inside == 4 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else if( inside == 5 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
+ }
+ else if( inside == 6 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
+ }
+ else if( inside == 7 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
+ }
+ else if( inside == 8 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][1];
+ }
+ else {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ break;
+ case 80:
+ abort();
+ break;
+ default:
+ abort;
+ }
+ }
+ }
+ else if( bc[1] == 0.0 || bc[1] == -0.0 ) {
+ if( bc[2] == 0.0 || bc[2] == -0.0 ) {
+ if( bc[3] == 0.0 || bc[3] == -0.0 ) {
+ *dim = MT_VERTEX;
+ *ind = topo->incEls[MT_VOLUME][MT_VERTEX][elInd][inds[0]];
+ }
+ else {
+ switch(self->num_simplexes[1])
+ {
+ case 10:
+ if( inside == 0 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][8];
+ }
+ else if( inside == 1 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
+ }
+ else if( inside == 2 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
+ }
+ else if( inside == 3 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
+ }
+ else if( inside == 4 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
+ }
+ else if( inside == 5 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
+ }
+ else if( inside == 6 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
+ }
+ else if( inside == 7 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
+ }
+ else if( inside == 8 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][11];
+ }
+ else {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
+ }
+ break;
+ case 80:
+ abort();
+ break;
+ default:
+ abort;
+ }
+ }
+ }
+ else if( bc[3] == 0.0 || bc[3] == -0.0 ) {
+ switch(self->num_simplexes[1])
+ {
+ case 10:
+ if( inside == 0 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][2];
+ }
+ else if( inside == 1 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][3];
+ }
+ else if( inside == 2 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][9];
+ }
+ else if( inside == 3 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][10];
+ }
+ else if( inside == 4 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
+ }
+ else if( inside == 5 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
+ }
+ else if( inside == 6 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
+ }
+ else if( inside == 7 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
+ }
+ else if( inside == 8 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
+ }
+ else {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
+ }
+ break;
+ case 80:
+ abort();
+ break;
+ default:
+ abort;
+ }
+ }
+ else {
+ switch(self->num_simplexes[1])
+ {
+ case 10:
+ if( inside == 0 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
+ }
+ else if( inside == 1 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
+ }
+ else if( inside == 2 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
+ }
+ else if( inside == 3 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
+ }
+ else if( inside == 4 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else if( inside == 5 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else if( inside == 6 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else if( inside == 7 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else if( inside == 8 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][3];
+ }
+ else {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ break;
+ case 80:
+ abort();
+ break;
+ default:
+ abort;
+ }
+ }
+ }
+ else if( bc[2] == 0.0 || bc[2] == -0.0 ) {
+ if( bc[3] == 0.0 || bc[3] == -0.0 ) {
+ switch(self->num_simplexes[1])
+ {
+ case 10:
+ if( inside == 0 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][0];
+ }
+ else if( inside == 1 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
+ }
+ else if( inside == 2 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
+ }
+ else if( inside == 3 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
+ }
+ else if( inside == 4 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
+ }
+ else if( inside == 5 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][0];
+ }
+ else if( inside == 6 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][8];
+ }
+ else if( inside == 7 ) {
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_VOLUME][MT_EDGE][elInd][2];
+ }
+ else if( inside == 8 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
+ }
+ else {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
+ }
+ break;
+ case 80:
+ abort();
+ break;
+ default:
+ abort;
+ }
+ }
+ else {
+ switch(self->num_simplexes[1])
+ {
+ case 10:
+ if( inside == 0 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
+ }
+ else if( inside == 1 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else if( inside == 2 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else if( inside == 3 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else if( inside == 4 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else if( inside == 5 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
+ }
+ else if( inside == 6 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
+ }
+ else if( inside == 7 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
+ }
+ else if( inside == 8 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][5];
+ }
+ else {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ break;
+ case 80:
+ abort();
+ break;
+ default:
+ abort;
+ }
+ }
+ }
+ else if( bc[3] == 0.0 || bc[3] == -0.0 ) {
+ switch(self->num_simplexes[1])
+ {
+ case 10:
+ if( inside == 0 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
+ }
+ else if( inside == 1 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
+ }
+ else if( inside == 2 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
+ }
+ else if( inside == 3 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][4];
+ }
+ else if( inside == 4 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else if( inside == 5 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
+ }
+ else if( inside == 6 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][2];
+ }
+ else if( inside == 7 ) {
+ *dim = MT_FACE;
+ *ind = topo->incEls[MT_VOLUME][MT_FACE][elInd][0];
+ }
+ else if( inside == 8 ) {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ else {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ break;
+ case 80:
+ abort();
+ break;
+ default:
+ abort;
+ }
+ }
+ else {
+ *dim = MT_VOLUME;
+ *ind = elInd;
+ }
+ return True;
+ }
+ return False;
}
Bool Mesh_HexType_ElementHasPoint2DGeneral( Mesh_HexType* self, unsigned elInd, double* point,
@@ -968,104 +1066,191 @@ Bool Mesh_HexType_ElementHasPoint2DWithI
Bool Mesh_HexType_ElementHasPoint2DWithIncidence( Mesh_HexType* self, unsigned elInd, double* point,
MeshTopology_Dim* dim, unsigned* ind )
{
- Mesh* mesh;
- unsigned nInc;
- Bool fnd;
- double bc[3];
- IGraph* topo;
- unsigned inside;
- const int* inc;
+ Mesh* mesh;
+ unsigned nInc;
+ Bool fnd;
+ double bc[3];
+ IGraph* topo;
+ unsigned inside;
+ const int* inc;
- assert( self && Stg_CheckType( self, Mesh_HexType ) );
- assert( Mesh_GetDimSize( self->mesh ) == 2 );
- assert( elInd < Mesh_GetDomainSize( self->mesh, Mesh_GetDimSize( self->mesh ) ) );
- assert( point );
- assert( dim );
- assert( ind );
+ assert( self && Stg_CheckType( self, Mesh_HexType ) );
+ assert( Mesh_GetDimSize( self->mesh ) == 2 );
+ assert( elInd < Mesh_GetDomainSize( self->mesh, Mesh_GetDimSize( self->mesh ) ) );
+ assert( point );
+ assert( dim );
+ assert( ind );
- /* Shortcuts. */
- mesh = self->mesh;
- topo = (IGraph*)mesh->topo;
+ /* Shortcuts. */
+ mesh = self->mesh;
+ topo = (IGraph*)mesh->topo;
- /* Get element to vertex incidence. */
- Mesh_GetIncidence( mesh, Mesh_GetDimSize( mesh ), elInd, MT_VERTEX, self->incArray );
- nInc = IArray_GetSize( self->incArray );
- inc = IArray_GetPtr( self->incArray );
+ /* Get element to vertex incidence. */
+ Mesh_GetIncidence( mesh, Mesh_GetDimSize( mesh ), elInd, MT_VERTEX, self->incArray );
+ nInc = IArray_GetSize( self->incArray );
+ inc = IArray_GetPtr( self->incArray );
- /* Search for triangle. */
- if( self->mapSize ) {
- unsigned v_i;
+ /* Search for triangle. */
+ if( self->mapSize ) {
+ unsigned v_i;
- for( v_i = 0; v_i < self->mapSize; v_i++ )
- self->inc[v_i] = inc[self->vertMap[v_i]];
- fnd = Simplex_Search2D( mesh->verts, self->inc,
- self->num_simplexes[0],
- self->triInds, point, bc,
- &inside );
- }
- else
- fnd = Simplex_Search2D( mesh->verts, (unsigned*)inc,
- self->num_simplexes[0],
- self->triInds, point, bc, &inside );
- if( fnd ) {
- unsigned *inds = self->triInds[inside];
+ for( v_i = 0; v_i < self->mapSize; v_i++ )
+ self->inc[v_i] = inc[self->vertMap[v_i]];
+ fnd = Simplex_Search2D( mesh->verts, self->inc,
+ self->num_simplexes[0],
+ self->triInds, point, bc,
+ &inside );
+ }
+ else
+ fnd = Simplex_Search2D( mesh->verts, (unsigned*)inc,
+ self->num_simplexes[0],
+ self->triInds, point, bc, &inside );
+ if( fnd ) {
+ unsigned *inds = self->triInds[inside];
- /* Check boundary ownership. */
- if( bc[0] == 0.0 || bc[0] == -0.0 ) {
- if( bc[1] == 0.0 || bc[1] == -0.0 ) {
- *dim = MT_VERTEX;
- *ind = topo->incEls[MT_FACE][MT_VERTEX][elInd][inds[2]];
- }
- else if( bc[2] == 0.0 || bc[2] == -0.0 ) {
- *dim = MT_VERTEX;
- *ind = topo->incEls[MT_FACE][MT_VERTEX][elInd][inds[1]];
- }
- else {
- if( inside == 0 ) {
- *dim = MT_FACE;
- *ind = elInd;
- }
- else if( inside == 1 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][1];
- }
- }
- }
- else if( bc[1] == 0.0 || bc[1] == -0.0 ) {
- if( bc[2] == 0.0 || bc[2] == -0.0 ) {
- *dim = MT_VERTEX;
- *ind = topo->incEls[MT_FACE][MT_VERTEX][elInd][inds[0]];
- }
- else {
- if( inside == 0 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][2];
- }
- else if( inside == 1 ) {
- *dim = MT_FACE;
- *ind = elInd;
- }
- }
- }
- else if( bc[2] == 0.0 || bc[2] == -0.0 ) {
- if( inside == 0 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][0];
- }
- else if( inside == 1 ) {
- *dim = MT_EDGE;
- *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][3];
- }
- }
- else {
- *dim = MT_FACE;
- *ind = elInd;
- }
-
- return True;
- }
-
- return False;
+ /* Check boundary ownership. */
+ if( bc[0] == 0.0 || bc[0] == -0.0 ) {
+ if( bc[1] == 0.0 || bc[1] == -0.0 ) {
+ *dim = MT_VERTEX;
+ *ind = topo->incEls[MT_FACE][MT_VERTEX][elInd][inds[2]];
+ }
+ else if( bc[2] == 0.0 || bc[2] == -0.0 ) {
+ *dim = MT_VERTEX;
+ *ind = topo->incEls[MT_FACE][MT_VERTEX][elInd][inds[1]];
+ }
+ else {
+ switch(self->num_simplexes[0])
+ {
+ case 2:
+ switch(inside)
+ {
+ case 0:
+ *dim = MT_FACE;
+ *ind = elInd;
+ break;
+ case 1:
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][1];
+ break;
+ }
+ break;
+ case 8:
+ switch(inside)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 6:
+ *dim = MT_FACE;
+ *ind = elInd;
+ break;
+ case 5:
+ case 7:
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][1];
+ break;
+ }
+ break;
+ default:
+ abort();
+ }
+ }
+ }
+ else if( bc[1] == 0.0 || bc[1] == -0.0 ) {
+ if( bc[2] == 0.0 || bc[2] == -0.0 ) {
+ *dim = MT_VERTEX;
+ *ind = topo->incEls[MT_FACE][MT_VERTEX][elInd][inds[0]];
+ }
+ else {
+ switch(self->num_simplexes[0])
+ {
+ case 2:
+ switch(inside)
+ {
+ case 0:
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][2];
+ break;
+ case 1:
+ *dim = MT_FACE;
+ *ind = elInd;
+ break;
+ }
+ break;
+ case 8:
+ switch(inside)
+ {
+ case 0:
+ case 4:
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][2];
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 5:
+ case 6:
+ case 7:
+ *dim = MT_FACE;
+ *ind = elInd;
+ break;
+ }
+ default:
+ abort;
+ }
+ }
+ }
+ else if( bc[2] == 0.0 || bc[2] == -0.0 ) {
+ switch(self->num_simplexes[0])
+ {
+ case 2:
+ switch(inside)
+ {
+ case 0:
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][0];
+ break;
+ case 1:
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][3];
+ break;
+ }
+ break;
+ case 8:
+ switch(inside)
+ {
+ case 0:
+ case 2:
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][0];
+ break;
+ case 1:
+ case 4:
+ case 5:
+ case 6:
+ *dim = MT_FACE;
+ *ind = elInd;
+ break;
+ case 3:
+ case 7:
+ *dim = MT_EDGE;
+ *ind = topo->incEls[MT_FACE][MT_EDGE][elInd][3];
+ break;
+ }
+ break;
+ default:
+ abort;
+ }
+ }
+ else {
+ *dim = MT_FACE;
+ *ind = elInd;
+ }
+ return True;
+ }
+ return False;
}
Bool Mesh_HexType_ElementHasPoint1DGeneral( Mesh_HexType* self, unsigned elInd, double* point,
More information about the CIG-COMMITS
mailing list