[cig-commits] r4140 - in long/3D/Gale/trunk/src/StGermain: . Discretisation/Geometry/src Discretisation/Geometry/tests

walter at geodynamics.org walter at geodynamics.org
Tue Aug 1 01:53:20 PDT 2006


Author: walter
Date: 2006-08-01 01:53:20 -0700 (Tue, 01 Aug 2006)
New Revision: 4140

Modified:
   long/3D/Gale/trunk/src/StGermain/
   long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c
   long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.h
   long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testDelaunay.c
Log:
 r2606 at earth:  boo | 2006-08-01 01:50:35 -0700
  r2585 at earth (orig r3708):  RaquibulHassan | 2006-07-26 02:47:31 -0700
  Adding functionality to the Delaunay class to be able to identify the neighbouring
  triangles of each triangle. The neighbouring triangles of each trianglular element are 
  a requirement for Finite element analysis.
  
  
 



Property changes on: long/3D/Gale/trunk/src/StGermain
___________________________________________________________________
Name: svk:merge
   - 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2605
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3707
   + 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2606
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3708

Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c	2006-08-01 08:53:16 UTC (rev 4139)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c	2006-08-01 08:53:20 UTC (rev 4140)
@@ -609,6 +609,8 @@
 	Site *sites = NULL;
 	int maxEdges = 0;
 	int **triIndices = NULL;
+	int **edgeToTriangle = NULL;
+	int index = 0;
 
 	assert( delaunay );
 	
@@ -616,9 +618,34 @@
 	delaunay->triangleIndices[0] = Memory_Alloc_Array_Unnamed( int, delaunay->numFaces * 3 );
 	memset( delaunay->triangleIndices[0] , 0, sizeof(int) * delaunay->numFaces * 3 );
 	
+	if( delaunay->attributes->BuildTriangleNeighbours ){
+		delaunay->triangleNeighbours = Memory_Alloc_Array_Unnamed( int*, delaunay->numFaces );
+		delaunay->triangleNeighbours[0] = Memory_Alloc_Array_Unnamed( int, delaunay->numFaces * 3 );
+
+		edgeToTriangle = Memory_Alloc_Array_Unnamed( int*, delaunay->qp->numQuadEdges );
+		edgeToTriangle[0] = Memory_Alloc_Array_Unnamed( int, delaunay->qp->numQuadEdges * 2 );
+	}
+	
 	for( i=0; i<delaunay->numFaces; i++ ){
 		delaunay->triangleIndices[i] = delaunay->triangleIndices[0]+i*3;
+
+		if( delaunay->attributes->BuildTriangleNeighbours ){
+			delaunay->triangleNeighbours[i] = delaunay->triangleNeighbours[0]+i*3;
+			
+			delaunay->triangleNeighbours[i][0] = delaunay->numFaces;
+			delaunay->triangleNeighbours[i][1] = delaunay->numFaces;
+			delaunay->triangleNeighbours[i][2] = delaunay->numFaces;
+		}
 	}
+	
+	if( delaunay->attributes->BuildTriangleNeighbours ){
+		for( i=0; i<delaunay->qp->numQuadEdges; i++ ){
+			edgeToTriangle[i] = edgeToTriangle[0]+i*2;
+			
+			edgeToTriangle[i][0] = delaunay->numFaces;
+			edgeToTriangle[i][1] = delaunay->numFaces;
+		}
+	}
 		
 	triIndices = delaunay->triangleIndices;
 	
@@ -653,6 +680,16 @@
 								triIndices[triCount][0] = (((Site*)ORG(e))->id);
 								triIndices[triCount][1] = (((Site*)DEST(e))->id);
 								triIndices[triCount][2] = (((Site*)DEST(eOnext))->id);
+
+								index = (int)(((QuadEdge*)((void*)e)) - delaunay->qp->quadEdges);
+								edgeToTriangle[index][COUNT(e)] = triCount;
+								
+								index = (int)(((QuadEdge*)((void*)eOnext)) - delaunay->qp->quadEdges);
+								edgeToTriangle[index][COUNT(eOnext)] = triCount;
+								
+								index = (int)(((QuadEdge*)((void*)eLnext)) - delaunay->qp->quadEdges);
+								edgeToTriangle[index][COUNT(eLnext)] = triCount;
+								
 								triCount++;
 							}
 						}
@@ -660,6 +697,16 @@
 							triIndices[triCount][0] = (((Site*)ORG(e))->id);
 							triIndices[triCount][1] = (((Site*)DEST(e))->id);
 							triIndices[triCount][2] = (((Site*)DEST(eOnext))->id);
+							
+							index = (int)(((QuadEdge*)((void*)e)) - delaunay->qp->quadEdges);
+							edgeToTriangle[index][COUNT(e)] = triCount;
+								
+							index = (int)(((QuadEdge*)((void*)eOnext)) - delaunay->qp->quadEdges);
+							edgeToTriangle[index][COUNT(eOnext)] = triCount;
+								
+							index = (int)(((QuadEdge*)((void*)eLnext)) - delaunay->qp->quadEdges);
+							edgeToTriangle[index][COUNT(eLnext)] = triCount;
+							
 							triCount++;
 						}
 
@@ -673,6 +720,27 @@
 	}
 	
 	delaunay->numTriangles = triCount;
+
+	if( delaunay->attributes->BuildTriangleNeighbours ){
+		int *triangleNeighbourCount = NULL;
+
+		triangleNeighbourCount = Memory_Alloc_Array_Unnamed( int, delaunay->numFaces );
+		memset( triangleNeighbourCount, 0, sizeof( int ) * delaunay->numFaces );
+		
+		for( i=0; i<delaunay->qp->numQuadEdges; i++ ){
+			if( IS_FREE( (QuadEdgeRef)(&(delaunay->qp->quadEdges[i])) ) ) continue;
+
+		
+			if( edgeToTriangle[i][0] != delaunay->numFaces )
+				delaunay->triangleNeighbours[edgeToTriangle[i][0]][triangleNeighbourCount[edgeToTriangle[i][0]]++] = edgeToTriangle[i][1];
+		
+			if( edgeToTriangle[i][1] > delaunay->numFaces )
+				delaunay->triangleNeighbours[edgeToTriangle[i][1]][triangleNeighbourCount[edgeToTriangle[i][1]]++] = edgeToTriangle[i][0];
+		}
+		
+		Memory_Free( edgeToTriangle );
+		Memory_Free( triangleNeighbourCount );
+	}
 }
 
 /* Function for calculating voronoi vertices */

Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.h
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.h	2006-08-01 08:53:16 UTC (rev 4139)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.h	2006-08-01 08:53:20 UTC (rev 4140)
@@ -48,6 +48,7 @@
 	typedef struct DelaunayAttributes_t{
 		int	BuildBoundingTriangle;
 		int BuildTriangleIndices;
+		int BuildTriangleNeighbours;
 		int CreateVoronoiVertices;
 		int CalculateVoronoiSides;
 		int CalculateVoronoiSurfaceArea;
@@ -75,6 +76,7 @@
 		int					numTriangles; \
 		int					numFaces; \
 		int					**triangleIndices; \
+		int					**triangleNeighbours; \
 		int					numVoronoiVertices; \
 		int					*numNeighbours; \
 		int					**neighbours; \

Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testDelaunay.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testDelaunay.c	2006-08-01 08:53:16 UTC (rev 4139)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testDelaunay.c	2006-08-01 08:53:20 UTC (rev 4140)
@@ -110,8 +110,9 @@
 		pointsType p;
 		Dictionary *dictionary = Dictionary_New();
 		
-
+		attr.BuildBoundingTriangle = 0;
 		attr.BuildTriangleIndices = 1;
+		attr.BuildTriangleNeighbours = 1;
 		attr.CreateVoronoiVertices = 1;
 		attr.CalculateVoronoiSides = 1;
 		attr.CalculateVoronoiSurfaceArea = 1;



More information about the cig-commits mailing list