[cig-commits] commit: Add a triInds and tetInds mapping for Q2 elements. Seems to work completely for Q2P-1 elements.

Mercurial hg at geodynamics.org
Wed Sep 21 23:32:14 PDT 2011


changeset:   612:c21b59af4867
tag:         tip
user:        Walter Landry <wlandry at caltech.edu>
date:        Wed Sep 21 23:29:58 2011 -0700
files:       Mesh/src/Mesh_HexType.cxx Mesh/src/Mesh_HexType.h
description:
Add a triInds and tetInds mapping for Q2 elements.  Seems to work completely for Q2P-1 elements.


diff -r 2fd6d91e1309 -r c21b59af4867 Mesh/src/Mesh_HexType.cxx
--- a/Mesh/src/Mesh_HexType.cxx	Mon Sep 12 14:38:51 2011 -0700
+++ b/Mesh/src/Mesh_HexType.cxx	Wed Sep 21 23:29:58 2011 -0700
@@ -51,6 +51,7 @@
 /* Textual name of this class */
 const Type Mesh_HexType_Type = "Mesh_HexType";
 
+const int max_vertices(27);
 
 /*----------------------------------------------------------------------------------------------------------------------------------
 ** Constructors
@@ -89,8 +90,10 @@ void _Mesh_HexType_Init( Mesh_HexType* s
 void _Mesh_HexType_Init( Mesh_HexType* self ) {
 	assert( self && Stg_CheckType( self, Mesh_HexType ) );
 
-	self->vertMap = AllocArray( unsigned, 8 );
-	self->inc = AllocArray( unsigned, 8 );
+        self->num_simplexes[0]=2;
+        self->num_simplexes[1]=10;
+	self->vertMap = AllocArray( unsigned, max_vertices );
+	self->inc = AllocArray( unsigned, max_vertices );
 	Mesh_HexType_SetVertexMap( self, NULL );
 
 	self->elementHasPoint = NULL;
@@ -307,9 +310,51 @@ void Mesh_HexType_SetVertexMap( void* he
 	}
 	else {
 		self->mapSize = 0;
-		for( v_i = 0; v_i < 8; v_i++ )
+		for( v_i = 0; v_i < max_vertices; v_i++ )
 			self->vertMap[v_i] = v_i;
 	}
+}
+
+/* Modify triInds and tetInds for Q2 elements */
+
+void Mesh_HexType_SetQ2Inds( void* hexType) {
+  Mesh_HexType*	self = (Mesh_HexType*)hexType;
+
+  unsigned index_map[]={0,1,3,4,9,10,12,13};
+  unsigned start_index[]={0,1,3,4,9,10,12,13};
+
+  /* Set vertmap so that MinimumSeparation will work */
+  for(int i=0; i<max_vertices; i++)
+    self->vertMap[i] = index_map[i];
+
+  unsigned triInds[8][3], tetInds[80][4];
+
+  for(int n=0;n<4;++n)
+    for(int i=0;i<2;++i)
+      for(int j=0;j<3;++j)
+        {
+          triInds[2*n+i][j]=index_map[self->triInds[i][j]]+start_index[n];
+        }
+
+  self->triInds = ReallocArray2D( self->triInds, unsigned, 8, 3 );
+  for(int i=0;i<8;++i)
+    for(int j=0;j<3;++j)
+      self->triInds[i][j]=triInds[i][j];
+
+  for(int n=0;n<8;++n)
+    for(int i=0;i<10;++i)
+      for(int j=0;j<4;++j)
+        {
+          tetInds[10*n+i][j]=index_map[self->tetInds[i][j]]+start_index[n];
+        }
+
+  self->tetInds = ReallocArray2D( self->tetInds, unsigned, 80, 4 );
+  for(int i=0;i<80;++i)
+    for(int j=0;j<4;++j)
+      self->tetInds[i][j]=tetInds[i][j];
+
+  self->num_simplexes[0]=8;
+  self->num_simplexes[1]=80;
 }
 
 
@@ -347,14 +392,18 @@ Bool Mesh_HexType_ElementHasPoint3DGener
 
 		for( v_i = 0; v_i < self->mapSize; v_i++ )
 			self->inc[v_i] = inc[self->vertMap[v_i]];
-		if( Simplex_Search3D( mesh->verts, self->inc, 10, self->tetInds, point, bc, &inside ) ) {
+		if( Simplex_Search3D( mesh->verts, self->inc,
+                                      self->num_simplexes[1], self->tetInds,
+                                      point, bc, &inside ) ) {
 			*dim = MT_VOLUME;
 			*ind = elInd;
 			return True;
 		}
 	}
 	else {
-		if( Simplex_Search3D( mesh->verts, (unsigned*)inc, 10, self->tetInds, point, bc, &inside ) ) {
+		if( Simplex_Search3D( mesh->verts, (unsigned*)inc,
+                                      self->num_simplexes[1], self->tetInds,
+                                      point, bc, &inside ) ) {
 			*dim = MT_VOLUME;
 			*ind = elInd;
 			return True;
@@ -397,10 +446,14 @@ Bool Mesh_HexType_ElementHasPoint3DWithI
 
 		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, 10, self->tetInds, point, bc, &inside );
+		fnd = Simplex_Search3D( mesh->verts, self->inc,
+                                        self->num_simplexes[1], self->tetInds,
+                                        point, bc, &inside );
 	}
 	else
-		fnd = Simplex_Search3D( mesh->verts, (unsigned*)inc, 10, self->tetInds, point, bc, &inside );
+		fnd = Simplex_Search3D( mesh->verts, (unsigned*)inc,
+                                        self->num_simplexes[1], self->tetInds,
+                                        point, bc, &inside );
 	if( fnd ) {
 		unsigned*	inds = self->tetInds[inside];
 
@@ -895,10 +948,14 @@ Bool Mesh_HexType_ElementHasPoint2DGener
 
 		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, 2, self->triInds, point, bc, &inside );
+		fnd = Simplex_Search2D( mesh->verts, self->inc,
+                                        self->num_simplexes[0], self->triInds,
+                                        point, bc, &inside );
 	}
 	else
-		fnd = Simplex_Search2D( mesh->verts, (unsigned*)inc, 2, self->triInds, point, bc, &inside );
+		fnd = Simplex_Search2D( mesh->verts, (unsigned*)inc,
+                                        self->num_simplexes[0], self->triInds,
+                                        point, bc, &inside );
 	if( fnd ) {
 		*dim = MT_FACE;
 		*ind = elInd;
@@ -941,10 +998,15 @@ Bool Mesh_HexType_ElementHasPoint2DWithI
 
 		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, 2, self->triInds, point, bc, &inside );
+		fnd = Simplex_Search2D( mesh->verts, self->inc,
+                                        self->num_simplexes[0],
+                                        self->triInds, point, bc,
+                                        &inside );
 	}
 	else
-		fnd = Simplex_Search2D( mesh->verts, (unsigned*)inc, 2, self->triInds, point, bc, &inside );
+		fnd = Simplex_Search2D( mesh->verts, (unsigned*)inc,
+                                        self->num_simplexes[0],
+                                        self->triInds, point, bc, &inside );
 	if( fnd ) {
 		unsigned	*inds = self->triInds[inside];
 
diff -r 2fd6d91e1309 -r c21b59af4867 Mesh/src/Mesh_HexType.h
--- a/Mesh/src/Mesh_HexType.h	Mon Sep 12 14:38:51 2011 -0700
+++ b/Mesh/src/Mesh_HexType.h	Wed Sep 21 23:29:58 2011 -0700
@@ -60,6 +60,7 @@
 		Mesh_ElementType_ElementHasPointFunc*	elementHasPoint;	\
 		unsigned**				triInds;		\
 		unsigned**				tetInds;		\
+                unsigned                                num_simplexes[2];       \
 		IArray*					incArray;
 
 	struct Mesh_HexType { __Mesh_HexType };
@@ -102,7 +103,7 @@
 	*/
 
 	void Mesh_HexType_SetVertexMap( void* hexType, unsigned* map );
-
+        void Mesh_HexType_SetQ2Inds( void* hexType);
 	/*--------------------------------------------------------------------------------------------------------------------------
 	** Private Member functions
 	*/



More information about the CIG-COMMITS mailing list