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

walter at geodynamics.org walter at geodynamics.org
Thu Aug 17 17:16:22 PDT 2006


Author: walter
Date: 2006-08-17 17:16:22 -0700 (Thu, 17 Aug 2006)
New Revision: 4309

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/ParallelDelaunay.c
   long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testParallelDelaunay.c
Log:
 r2686 at earth:  boo | 2006-08-17 17:14:09 -0700
  r2640 at earth (orig r3721):  RaquibulHassan | 2006-07-27 04:28:28 -0700
  Adding a function that can gather the indices of neighbouring triangles of each triangle in a parallel triangulation.
  
  
 



Property changes on: long/3D/Gale/trunk/src/StGermain
___________________________________________________________________
Name: svk:merge
   - 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2685
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3720
   + 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2686
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3721

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-18 00:16:18 UTC (rev 4308)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c	2006-08-18 00:16:22 UTC (rev 4309)
@@ -681,14 +681,16 @@
 								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;
+								if( delaunay->attributes->BuildTriangleNeighbours ){
+									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*)eOnext)) - delaunay->qp->quadEdges);
+									edgeToTriangle[index][COUNT(eOnext)] = triCount;
 								
-								index = (int)(((QuadEdge*)((void*)eLnext)) - delaunay->qp->quadEdges);
-								edgeToTriangle[index][COUNT(eLnext)] = triCount;
+									index = (int)(((QuadEdge*)((void*)eLnext)) - delaunay->qp->quadEdges);
+									edgeToTriangle[index][COUNT(eLnext)] = triCount;
+								}
 								
 								triCount++;
 							}
@@ -698,15 +700,17 @@
 							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;
+							if( delaunay->attributes->BuildTriangleNeighbours ){
+								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*)eOnext)) - delaunay->qp->quadEdges);
+								edgeToTriangle[index][COUNT(eOnext)] = triCount;
 								
-							index = (int)(((QuadEdge*)((void*)eLnext)) - delaunay->qp->quadEdges);
-							edgeToTriangle[index][COUNT(eLnext)] = triCount;
-							
+								index = (int)(((QuadEdge*)((void*)eLnext)) - delaunay->qp->quadEdges);
+								edgeToTriangle[index][COUNT(eLnext)] = triCount;
+							}
+
 							triCount++;
 						}
 

Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/ParallelDelaunay.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/ParallelDelaunay.c	2006-08-18 00:16:18 UTC (rev 4308)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/ParallelDelaunay.c	2006-08-18 00:16:22 UTC (rev 4309)
@@ -587,6 +587,8 @@
 	int pass = 0;
 	int **triIndices = NULL;
 	Delaunay *delaunay = NULL;
+	int **edgeToTriangle = NULL;
+	int index = 0;
 
 	delaunay = pd->localTriangulation;
 
@@ -595,11 +597,36 @@
 	delaunay->triangleIndices = Memory_Alloc_Array_Unnamed( int*, delaunay->numFaces );
 	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;
 	
 	edges = delaunay->qp->quadEdges;
@@ -647,6 +674,19 @@
 							triIndices[triCount][0] = ParallelDelaunay_TranslateLocalToGlobal(pd, ((Site*)ORG(e))->id);
 							triIndices[triCount][1] = ParallelDelaunay_TranslateLocalToGlobal(pd, ((Site*)DEST(e))->id);
 							triIndices[triCount][2] = ParallelDelaunay_TranslateLocalToGlobal(pd, ((Site*)DEST(eOnext))->id);
+
+							if ( delaunay->attributes->BuildTriangleNeighbours ){
+								
+								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,7 +700,28 @@
 		}while( e != eStart );
 	}
 	
-	delaunay->numTriangles = triCount;	
+	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 );
+	}
 }
 
 #define NEIGHBOURS_TAG 1<<4
@@ -819,6 +880,11 @@
 			pd->triangleIndices = Memory_Alloc_Array_Unnamed( int*,  sizeof(int*) * globalNumTriangles );
 			pd->triangleIndices[0] = Memory_Alloc_Array_Unnamed( int, sizeof(int) * globalNumTriangles*3 );
 
+			if ( pd->attributes->BuildTriangleNeighbours ){
+				pd->triangleNeighbours = Memory_Alloc_Array_Unnamed( int*,  sizeof(int*) * globalNumTriangles );
+				pd->triangleNeighbours[0] = Memory_Alloc_Array_Unnamed( int, sizeof(int) * globalNumTriangles*3 );
+			}
+
 			triCountArray[0] = triCount;
 			for( i=1; i<pd->numProcs; i++ ){
 				MPI_Recv( &(triCountArray[i]), 1, MPI_INT, i, DATA_TAG, MPI_COMM_WORLD, &st );					
@@ -826,15 +892,29 @@
 
 			for( i=0; i<globalNumTriangles; i++ ){
 				pd->triangleIndices[i] = pd->triangleIndices[0] + i*3;
+	
+				if ( pd->attributes->BuildTriangleNeighbours ){
+					pd->triangleNeighbours[i] = pd->triangleNeighbours[0] + i*3;
+				}
 			}
 
 			for(j=0; j<triCountArray[0]; j++){
 				memcpy( pd->triangleIndices[j], triIndices[j], sizeof(int)*3 );
+				
+				if ( pd->attributes->BuildTriangleNeighbours ){
+					memcpy( pd->triangleNeighbours[j], pd->localTriangulation->triangleNeighbours[j], sizeof(int)*3 );
+				}
 			}
 		
 			for( i=1; i<pd->numProcs; i++ ){
 				for( count=0; count < triCountArray[i]; count++ ){
-					MPI_Recv( pd->triangleIndices[j++], 3, MPI_INT, i, DATA_TAG, MPI_COMM_WORLD, &st );					
+					MPI_Recv( pd->triangleIndices[j], 3, MPI_INT, i, DATA_TAG, MPI_COMM_WORLD, &st );					
+					
+					if ( pd->attributes->BuildTriangleNeighbours ){
+						MPI_Recv( pd->triangleNeighbours[j], 3, MPI_INT, i, DATA_TAG, MPI_COMM_WORLD, &st );
+					}
+
+					j++;
 				}
 			}
 
@@ -852,6 +932,10 @@
 			MPI_Send( &triCount, 1, MPI_INT, MASTER_PROC, DATA_TAG, MPI_COMM_WORLD );
 			for( j=0; j<triCount; j++ ){
 				MPI_Send( triIndices[j], 3, MPI_INT, MASTER_PROC, DATA_TAG, MPI_COMM_WORLD );
+				
+				if ( pd->attributes->BuildTriangleNeighbours ){
+					MPI_Send( pd->localTriangulation->triangleNeighbours[j], 3, MPI_INT, MASTER_PROC, DATA_TAG, MPI_COMM_WORLD );
+				}
 			}
 		}
 

Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testParallelDelaunay.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testParallelDelaunay.c	2006-08-18 00:16:18 UTC (rev 4308)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testParallelDelaunay.c	2006-08-18 00:16:22 UTC (rev 4309)
@@ -122,6 +122,7 @@
 	
 	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