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

walter at geodynamics.org walter at geodynamics.org
Thu Jul 6 02:06:09 PDT 2006


Author: walter
Date: 2006-07-06 02:06:09 -0700 (Thu, 06 Jul 2006)
New Revision: 3940

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
Log:
 r2468 at earth:  boo | 2006-07-06 02:02:40 -0700
  r2457 at earth (orig r3660):  RaquibulHassan | 2006-06-29 02:26:03 -0700
  Adding an offset to the node numbering scheme which will be used in the parallel
  version of the delaunay algorithm.
  
  
 



Property changes on: long/3D/Gale/trunk/src/StGermain
___________________________________________________________________
Name: svk:merge
   - 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2467
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3659
   + 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2468
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3660

Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c	2006-07-06 09:06:05 UTC (rev 3939)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.c	2006-07-06 09:06:09 UTC (rev 3940)
@@ -88,6 +88,7 @@
 			NULL,
 			NULL,
 			0,
+			0,
 			NULL );
 
 	return d;
@@ -98,6 +99,7 @@
 	Dictionary*					dictionary,
 	CoordF						*sites,
 	int							numSites,
+	int							idOffset,
 	DelaunayAttributes			*attr )
 {
 	Delaunay *d = _Delaunay_New(
@@ -117,6 +119,7 @@
 			dictionary,
 			sites,
 			numSites,
+			idOffset,
 			attr );
 	
 	return d;
@@ -129,6 +132,7 @@
 	Dictionary*					dictionary,
 	CoordF						*sites,
 	int							numSites,
+	int							idOffset,
 	DelaunayAttributes			*attr )
 {
 	int i = 0;
@@ -159,6 +163,7 @@
 	}
 	
 	self->numInputSites = numSites;
+	self->idOffset = idOffset;
 	
 	self->sites = Memory_Alloc_Array_Unnamed( Site, sizeof( Site ) * self->numSites );
 	memset( self->boundingTriangle, 0, sizeof( self->boundingTriangle ) );
@@ -170,7 +175,7 @@
 		else{
 			self->sites[i].coord = &(self->boundingTriangle[i%3]);
 		}
-		self->sites[i].id = i;
+		self->sites[i].id = i + self->idOffset;
 	}
 
 	_Stg_Class_Init( (Stg_Class*)self );
@@ -197,6 +202,7 @@
 	Dictionary					*dictionary,
 	CoordF						*sites,
 	int							numSites,
+	int							idOffset,
 	DelaunayAttributes			*attr )
 {
 	Delaunay *self = NULL;
@@ -217,6 +223,7 @@
 	}
 	
 	self->numInputSites = numSites;
+	self->idOffset = idOffset;
 	
 	self->sites = Memory_Alloc_Array_Unnamed( Site, sizeof( Site ) * self->numSites );
 	memset( self->boundingTriangle, 0, sizeof( self->boundingTriangle ) );
@@ -228,7 +235,7 @@
 		else{
 			self->sites[i].coord = &(self->boundingTriangle[i%3]);
 		}
-		self->sites[i].id = i;
+		self->sites[i].id = i + idOffset;
 	}
 
 
@@ -240,9 +247,33 @@
 }
 
 #define PI 3.1415926535897932384626
+void findMinMax( Site *sites, int count, float *minX, float *minY, float *maxX, float *maxY )
+{
+	int i = 0;
+	
+	*maxX = -INFINITY;
+	*maxY = -INFINITY;
+	
+	*minX = INFINITY;
+	*minY = INFINITY;
+	for( i=0; i<count; i++ ){
+		if( *maxX < (*(sites[i].coord))[0] ){
+			*maxX = (*(sites[i].coord))[0];
+		}
+		if( *maxY < (*(sites[i].coord))[1] ){
+			*maxY = (*(sites[i].coord))[1];
+		}
+		if( *minX > (*(sites[i].coord))[0] ){
+			*minX = (*(sites[i].coord))[0];
+		}
+		if( *minY > (*(sites[i].coord))[1] ){
+			*minY = (*(sites[i].coord))[1];
+		}
+	}
+}
+
 void _Delaunay_Init( Delaunay* self )
 {
-	int i = 0;
 	float maxX, minX, maxY, minY;
 	float centreX, centreY;
 	float radius;
@@ -250,26 +281,8 @@
 	assert( self );
 	
 	centreX = 0; centreY = 0; 
-	maxX = -1e33;
-	minX = 1e33;
-	maxY = -1e33;
-	minY = 1e33;
 	
-	for( i=0; i<self->numSites; i++ ){
-		if ( maxX < (*(self->sites[i].coord))[0] ){
-			maxX = (*(self->sites[i].coord))[0];
-		}
-		if ( maxY < (*(self->sites[i].coord))[1] ){
-			maxY = (*(self->sites[i].coord))[1];
-		}
-		
-		if ( minX > (*(self->sites[i].coord))[0] ){
-			minX = (*(self->sites[i].coord))[0];
-		}
-		if ( minY > (*(self->sites[i].coord))[1] ){
-			minY = (*(self->sites[i].coord))[1];
-		}
-	}
+	findMinMax( self->sites, self->numSites, &minX, &minY, &maxX, &maxY );
 
 	radius = (sqrt((maxX - minX) * (maxX - minX) + (maxY - minY) * (maxY - minY)));
 			
@@ -575,8 +588,8 @@
 	memset( delaunay->hull, 0, sizeof( int ) * delaunay->numSites );
 	
 	do{
-		delaunay->hull[((Site*)ORG(le))->id] = 1;
-		delaunay->hull[((Site*)DEST(le))->id] = 1;
+		delaunay->hull[((Site*)ORG(le))->id - delaunay->idOffset] = 1;
+		delaunay->hull[((Site*)DEST(le))->id - delaunay->idOffset] = 1;
 		le = RPREV(le);
 	}while(le != start);
 }
@@ -627,9 +640,9 @@
 					 ((((Site*)DEST(eLnext)) == ((Site*)DEST(eOnext)))) ){
 		
 						if( delaunay->attributes->BuildBoundingTriangle ){
-							if( (!( delaunay->hull[(((Site*)ORG(e))->id)] )) &&
-								(!( delaunay->hull[(((Site*)DEST(e))->id)] )) && 
-								(!( delaunay->hull[(((Site*)DEST(eOnext))->id)] )) )
+							if( (!( delaunay->hull[(((Site*)ORG(e))->id) - delaunay->idOffset] )) &&
+								(!( delaunay->hull[(((Site*)DEST(e))->id) - delaunay->idOffset] )) && 
+								(!( delaunay->hull[(((Site*)DEST(eOnext))->id) - delaunay->idOffset] )) )
 							{
 								triIndices[triCount][0] = (((Site*)ORG(e))->id);
 								triIndices[triCount][1] = (((Site*)DEST(e))->id);
@@ -760,11 +773,12 @@
 			src = (Site*)ORG((QuadEdgeRef)((void*)(&(edges[i]))));
 			dst = (Site*)DEST((QuadEdgeRef)((void*)(&(edges[i]))));
 
-			if( (src->id < delaunay->numInputSites) && (dst->id < delaunay->numInputSites) ){
+			if( (src->id < (delaunay->numInputSites+delaunay->idOffset)) 
+					&& (dst->id < (delaunay->numInputSites+delaunay->idOffset)) ){
 				
 				/* Finding the number of neighbours that each point has */
-				numNeighbours[src->id]++;
-				numNeighbours[dst->id]++;
+				numNeighbours[src->id - delaunay->idOffset]++;
+				numNeighbours[dst->id - delaunay->idOffset]++;
 			
 				/* NumNeighboursSum is required for allocating just enough memory for storing the
 				 * actual neighbours and the sides of the voronoi celss */
@@ -817,12 +831,13 @@
 		src = (Site*)ORG((QuadEdgeRef)((void*)(&(edges[i]))));
 		dst = (Site*)DEST((QuadEdgeRef)((void*)(&(edges[i]))));
 
-		count = tempNumNeighbours[src->id];
-		count1 = tempNumNeighbours[dst->id];
+		count = tempNumNeighbours[src->id - delaunay->idOffset];
+		count1 = tempNumNeighbours[dst->id - delaunay->idOffset];
 		
 		if( edges[i].count == 1 ){
 
-			if( (src->id < delaunay->numInputSites) && (dst->id < delaunay->numInputSites) ){
+			if( (src->id < (delaunay->numInputSites+delaunay->idOffset)) 
+					&& (dst->id < (delaunay->numInputSites+delaunay->idOffset)) ){
 
 				vsrc = (VoronoiVertex*)VORG((QuadEdgeRef)((void*)(&(edges[i]))));
 				vdst = (VoronoiVertex*)VDEST((QuadEdgeRef)((void*)(&(edges[i]))));
@@ -837,8 +852,8 @@
 				
 						dist = sqrt( diffx*diffx + diffy*diffy );
 
-						sides[src->id][--count] = dist;
-						sides[dst->id][--count1] = dist;
+						sides[src->id - delaunay->idOffset][--count] = dist;
+						sides[dst->id - delaunay->idOffset][--count1] = dist;
 					}
 				
 					if( attr->CalculateVoronoiSurfaceArea ){
@@ -846,28 +861,28 @@
 						/* calculating the voronoi surface area for each point, with the hull
 						 * nodes having an infinite unbounded area */
 
-						if( !(hull[src->id]) ){
+						if( !(hull[src->id - delaunay->idOffset]) ){
 							CCW( src->coord, &(vsrc->point), &(vdst->point), &voronoiAreaResult );
-							voronoiArea[src->id] += FABS( voronoiAreaResult ) * 0.5;
+							voronoiArea[src->id - delaunay->idOffset] += FABS( voronoiAreaResult ) * 0.5;
 						}
 						else{
-							voronoiArea[src->id] = INFINITY;
+							voronoiArea[src->id - delaunay->idOffset] = INFINITY;
 						}
 					
-						if( !(hull[dst->id]) ){
+						if( !(hull[dst->id - delaunay->idOffset]) ){
 							CCW( dst->coord, &(vsrc->point), &(vdst->point), &voronoiAreaResult );
-							voronoiArea[dst->id] += FABS( voronoiAreaResult ) * 0.5;
+							voronoiArea[dst->id - delaunay->idOffset] += FABS( voronoiAreaResult ) * 0.5;
 						}
 						else{
-							voronoiArea[dst->id] = INFINITY;
+							voronoiArea[dst->id - delaunay->idOffset] = INFINITY;
 						}
 					}
 				}
 
 				/* Storing the actual neighbours of each node */
 				if( attr->FindNeighbours ){
-					neighbours[src->id][--tempNumNeighbours[src->id]] = dst->id;
-					neighbours[dst->id][--tempNumNeighbours[dst->id]] = src->id;
+					neighbours[src->id - delaunay->idOffset][--tempNumNeighbours[src->id - delaunay->idOffset]] = dst->id;
+					neighbours[dst->id - delaunay->idOffset][--tempNumNeighbours[dst->id - delaunay->idOffset]] = src->id;
 				}
 			}
 			edges[i].count++;

Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.h
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.h	2006-07-06 09:06:05 UTC (rev 3939)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/Delaunay.h	2006-07-06 09:06:09 UTC (rev 3940)
@@ -68,6 +68,7 @@
 		int					numSites; \
 		int					numInputSites; \
 		Site				*sites; \
+		int					idOffset; \
 		CoordF				boundingTriangle[3]; \
 		int					numEdges; \
 		int					numVoronoiSites; \
@@ -99,6 +100,7 @@
 		Dictionary*					dictionary,
 		CoordF						*sites,
 		int							numSites,
+		int							idOffset,
 		DelaunayAttributes			*attr );
 	
 	/** Initialise a Delaunay */
@@ -108,6 +110,7 @@
 		Dictionary*					dictionary,
 		CoordF						*sites,
 		int							numSites,
+		int							idOffset,
 		DelaunayAttributes			*attr );
 	
 	/** Creation implementation */
@@ -128,6 +131,7 @@
 		Dictionary					*dictionary,
 		CoordF						*sites,
 		int							numSites,
+		int							idOffset,
 		DelaunayAttributes			*attr );
 	
 	void _Delaunay_Init( Delaunay* self );



More information about the cig-commits mailing list