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); }
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); }
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); }
float fbcCbrt(float value) { return cubeRoot(value); }
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); }