void Zoltan_Transform_Box_Points( double *lo, double *hi, /* input: bounds of 2D or 3D axis-aligned box */ double (*m)[3], /* input: linear transformation */ int *perm, /* input: coordinate permutation */ int d, /* dimension of box (2 or 3) */ int ndims, /* dimension of transformed box (1, 2 or 3) */ double (*v)[3]) /* output: 4 or 8 vertices of resulting box */ { int i; if (d == 2){ v[0][0] = lo[0]; v[0][1] = lo[1]; v[1][0] = lo[0]; v[1][1] = hi[1]; v[2][0] = hi[0]; v[2][1] = hi[1]; v[3][0] = hi[0]; v[3][1] = lo[1]; for (i=0; i<4; i++){ Zoltan_Transform_Point(v[i], m, perm, 2, ndims, v[i]); } } else if (d == 3) { v[0][0] = lo[0]; v[0][1] = lo[1]; v[0][2] = lo[2]; v[1][0] = lo[0]; v[1][1] = hi[1]; v[1][2] = lo[2]; v[2][0] = lo[0]; v[2][1] = hi[1]; v[2][2] = hi[2]; v[3][0] = lo[0]; v[3][1] = lo[1]; v[3][2] = hi[2]; v[4][0] = hi[0]; v[4][1] = lo[1]; v[4][2] = lo[2]; v[5][0] = hi[0]; v[5][1] = hi[1]; v[5][2] = lo[2]; v[6][0] = hi[0]; v[6][1] = hi[1]; v[6][2] = hi[2]; v[7][0] = hi[0]; v[7][1] = lo[1]; v[7][2] = hi[2]; for (i=0; i<8; i++){ Zoltan_Transform_Point(v[i], m, perm, 3, ndims, v[i]); } } }
/* Point drop for refinement after above partitioning */ int Zoltan_HSFC_Point_Assign ( ZZ *zz, double *x, int *proc, int *part) { double scaled[3]; double pt[3]; double fsfc; Partition *p; int i; int dim; HSFC_Data *d; int err; char *yo = "Zoltan_HSFC_Point_Assign"; ZOLTAN_TRACE_ENTER (zz, yo); d = (HSFC_Data *) zz->LB.Data_Structure; if (d == NULL) ZOLTAN_HSFC_ERROR (ZOLTAN_FATAL, "No Decomposition Data available; use KEEP_CUTS parameter."); for (i=0; i<d->ndimension; i++){ pt[i] = x[i]; /* we don't want to change caller's "x" */ } if (d->tran.Target_Dim > 0){ /* degenerate geometry */ dim = d->tran.Target_Dim; Zoltan_Transform_Point(pt, d->tran.Transformation, d->tran.Permutation, d->ndimension, dim, pt); } else{ dim = d->ndimension; } /* Calculate scaled coordinates, calculate HSFC coordinate */ for (i = 0; i < dim; i++) { scaled[i] = (pt[i] - d->bbox_lo[i]) / d->bbox_extent[i]; if (scaled[i] < HSFC_EPSILON) scaled[i] = HSFC_EPSILON; if (scaled[i] > 1.0 - HSFC_EPSILON) scaled[i] = 1.0 - HSFC_EPSILON; } fsfc = d->fhsfc (zz, scaled); /* Note, this is a function call */ /* Find partition containing point and return its number */ p = (Partition *) bsearch (&fsfc, d->final_partition, zz->LB.Num_Global_Parts, sizeof (Partition), Zoltan_HSFC_compare); if (p == NULL) ZOLTAN_HSFC_ERROR (ZOLTAN_FATAL, "programming error, shouldn't happen"); if (part != NULL) { if (zz->LB.Remap) *part = zz->LB.Remap[p->index]; else *part = p->index; } if (proc != NULL) { if (zz->LB.Remap) *proc = Zoltan_LB_Part_To_Proc(zz, zz->LB.Remap[p->index], NULL); else *proc = Zoltan_LB_Part_To_Proc(zz, p->index, NULL); } err = ZOLTAN_OK; End: ZOLTAN_TRACE_EXIT (zz, yo); return err; }