Exemple #1
0
int joinCubes (struct PlexCube *cube1, struct PlexCube *cube2)
{
	struct PlexCube *rcube1, *rcube2;
	
	if (cube1 == NULL || cube2 == NULL) return (0);
	/* find root of each growing component tree */
	rcube1 = cubeRoot (cube1);
	rcube2 = cubeRoot (cube2);
	if (rcube1 == NULL || rcube2 == NULL) return (0);
	if (rcube1 == rcube2) return (1);	/* already joined */
	/* connect roots */
	rcube1 -> next = rcube2;
	return (1);
}
Exemple #2
0
int numberCubes(struct Plex *plex)
{
	long idx, comp, n_cube;
	struct PlexCube *plexcubes, *cube, *rcube;
	long ncomps[512];
	char message[MAXLINE];
	
	n_cube = plex -> n_cube;
	plexcubes = plex -> plexcubes;
	for (comp = 0; comp < 512; comp++)
		ncomps[comp] = 0;
	for (idx = 0; idx < n_cube; idx++) {
		cube = plexcubes + idx;
		if (cube -> type == PartialCube) continue;	/* surface cubes out of it */
		if (cube -> next == NULL) {
			comp = cube -> comp;
			ncomps[comp]++;
			continue;			/* root cubes already handled */
		}
		rcube = cubeRoot (cube);					/* find representative */
		if (rcube == NULL) continue;
		cube -> comp = rcube -> comp;
		comp = cube -> comp;
		ncomps[comp]++;
	}
	if (plex -> dimension == 3)
	for (comp = 0; comp < 512; comp++)
		if (ncomps[comp] > 0) {
			sprintf (message, "%8ld cubes in component %4ld",
				ncomps[comp], comp);
			inform (message);
		}
	return (1);
}
Exemple #3
0
inline int ColLen3D(int npes)
{
    int len= (int)cubeRoot((double)npes);
    //    ComlibPrintf("%d:collen len = %d\n", CkMyPe(), len);
    if (npes > (len * len * len)) len++;
    return(len);
}
Exemple #4
0
float fbcCbrt(float value)
{
	return cubeRoot(value);
}
Exemple #5
0
int inoroutCubes (struct Plex *plex)
{
	int inside, dim, onedge, result;
	long idx, n_cube, nin, nout, nsurf;
	long nx, ny, nz, x, y, z;
	long indices[3];
	double center[3];
	struct PlexCube *plexcubes, *cube, *rcube;
	char message[MAXLINE];
	
	n_cube = plex -> n_cube;
	dim = plex -> dimension;
	nin = 0; nout = 0; nsurf = 0;
	plexcubes = plex -> plexcubes;
	nx = plex -> dimensions[0];
	ny = plex -> dimensions[1];
	nz = plex -> dimensions[2];
	/* first check the root cubes, to save time */
	for (z = 0; z < nz; z++)
		for (y = 0; y < ny; y++)
			for (x = 0; x < nx; x++) { 
				idx = z * (nx * ny) + y * nx + x;
				rcube = plexcubes + idx;
				/* skip surface cubes */
				if (rcube -> type == PartialCube) continue;
				if (rcube -> next != NULL) continue;
				/* we have a root cube (one per connected component) */
				/* special case: cubes at edges of bounding box */
				onedge = (x == 0 || x == nx-1 || y == 0 || y == ny-1 ||
						(dim == 3 && (z == 0 || z == nz-1)));
				if (onedge) inside = 0;
				else {
					/* use winding number or solid angle as check */
					indices[0] = x; indices[1] = y; indices[2] = z;
					result = indices2center (plex, indices, center, 1);
					if (result == 0) return (0);
					inside = insidePoly (plex, center);
				}
				if (inside) rcube -> type = FullCube;
				else rcube -> type = EmptyCube;
			}
	for (idx = 0; idx < n_cube; idx++) {
		cube = plexcubes + idx;
		if (cube -> type == PartialCube) {
			nsurf++;
			continue;
		}
		/* copy info from root cube */
		rcube = cubeRoot (cube);
		if (rcube -> type == FullCube) {
			cube -> type = FullCube;
			nin++;
		}
		else if (rcube -> type == EmptyCube) {
			cube -> type = EmptyCube;
			nout++;
		}
	}
	sprintf (message, "%8ld cubes inside", nin);
	inform (message);
	sprintf (message, "%8ld cubes outside", nout);
	inform (message);
	sprintf (message, "%8ld cubes surface", nsurf);
	inform (message);
	return (1);
}