int Zoltan_RCB_Build_Structure(ZZ *zz, int *num_obj, int *max_obj, int wgtflag, double overalloc, int use_ids) { /* * Function to build the geometry-based data structures for * Steve Plimpton's RCB implementation. */ char *yo = "Zoltan_RCB_Build_Structure"; RCB_STRUCT *rcb; /* Data structure for RCB. */ struct rcb_tree *treeptr; int i, ierr = 0; /* * Allocate an RCB data structure for this Zoltan structure. * If the previous data structure is still there, free the Dots and IDs first; * the other fields can be reused. */ if (zz->LB.Data_Structure == NULL) { rcb = (RCB_STRUCT *) ZOLTAN_MALLOC(sizeof(RCB_STRUCT)); if (rcb == NULL) { ZOLTAN_PRINT_ERROR(zz->Proc, yo, "Insufficient memory."); return(ZOLTAN_MEMERR); } zz->LB.Data_Structure = (void *) rcb; rcb->Tree_Ptr = NULL; rcb->Box = NULL; rcb->Global_IDs = NULL; rcb->Local_IDs = NULL; rcb->Dots = NULL; Zoltan_Initialize_Transformation(&(rcb->Tran)); rcb->Tree_Ptr = (struct rcb_tree *) ZOLTAN_MALLOC(zz->LB.Num_Global_Parts * sizeof(struct rcb_tree)); rcb->Box = (struct rcb_box *) ZOLTAN_MALLOC(sizeof(struct rcb_box)); if (rcb->Tree_Ptr == NULL || rcb->Box == NULL) { ZOLTAN_PRINT_ERROR(zz->Proc, yo, "Insufficient memory."); Zoltan_RCB_Free_Structure(zz); return(ZOLTAN_MEMERR); } /* initialize Tree_Ptr */ for (i = 0; i < zz->LB.Num_Global_Parts; i++) { treeptr = &(rcb->Tree_Ptr[i]); /* initialize dim to -1 to prevent use of cut */ treeptr->dim = -1; treeptr->cut = 0.0; treeptr->parent = treeptr->left_leaf = treeptr->right_leaf = 0; } } else { rcb = (RCB_STRUCT *) zz->LB.Data_Structure; ZOLTAN_FREE(&(rcb->Global_IDs)); ZOLTAN_FREE(&(rcb->Local_IDs)); ZOLTAN_FREE(&(rcb->Dots)); } ierr = Zoltan_RB_Build_Structure(zz, &(rcb->Global_IDs), &(rcb->Local_IDs), &(rcb->Dots), num_obj, max_obj, &(rcb->Num_Dim), wgtflag, overalloc, use_ids); if (ierr) { ZOLTAN_PRINT_ERROR(zz->Proc, yo, "Error returned from Zoltan_RB_Build_Structure."); Zoltan_RCB_Free_Structure(zz); return(ierr); } return(ZOLTAN_OK); }
int Zoltan_RIB_Build_Structure(ZZ *zz, int *num_obj, int *max_obj, int wgtflag, double overalloc, int use_ids, int gen_tree) { /* Function to build the geometry-based data structures for RIB method. */ char *yo = "Zoltan_RIB_Build_Structure"; RIB_STRUCT *rib; /* Data structure for RIB. */ struct rib_tree *treeptr; int i, ierr = 0; /* Allocate an RIB data structure for this Zoltan structure. If the previous data structure is still there, free the Dots and IDs first; the other fields can be reused. */ if (zz->LB.Data_Structure == NULL) { rib = (RIB_STRUCT *) ZOLTAN_MALLOC(sizeof(RIB_STRUCT)); if (rib == NULL) { ZOLTAN_PRINT_ERROR(zz->Proc, yo, "Insufficient memory."); return(ZOLTAN_MEMERR); } zz->LB.Data_Structure = (void *) rib; rib->Tree_Ptr = NULL; rib->Global_IDs = NULL; rib->Local_IDs = NULL; Zoltan_Initialize_Transformation(&(rib->Tran)); if (gen_tree) { rib->Tree_Ptr = (struct rib_tree *) ZOLTAN_CALLOC(zz->LB.Num_Global_Parts, sizeof(struct rib_tree)); if (rib->Tree_Ptr == NULL) { ZOLTAN_PRINT_ERROR(zz->Proc, yo, "Insufficient memory."); Zoltan_RIB_Free_Structure(zz); return(ZOLTAN_MEMERR); } /* initialize Tree_Ptr */ for (i = 0; i < zz->LB.Num_Global_Parts; i++) { treeptr = &(rib->Tree_Ptr[i]); treeptr->cm[0] = treeptr->cm[1] = treeptr->cm[2] = 0.0; treeptr->ev[0] = treeptr->ev[1] = treeptr->ev[2] = 0.0; treeptr->cut = 0.0; treeptr->parent = treeptr->left_leaf = treeptr->right_leaf = 0; } } } else { rib = (RIB_STRUCT *) zz->LB.Data_Structure; ZOLTAN_FREE(&(rib->Global_IDs)); ZOLTAN_FREE(&(rib->Local_IDs)); ZOLTAN_FREE(&(rib->Dots)); } ierr = Zoltan_RB_Build_Structure(zz, &(rib->Global_IDs), &(rib->Local_IDs), &(rib->Dots), num_obj, max_obj, &(rib->Num_Geom), wgtflag, overalloc, use_ids, 0); if (ierr) { ZOLTAN_PRINT_ERROR(zz->Proc, yo, "Error returned from Zoltan_RB_Build_Structure."); Zoltan_RIB_Free_Structure(zz); return(ierr); } return(ZOLTAN_OK); }