int orderLoad ( Order * const ordeptr, FILE * const stream) { PASTIX_INT versval; /* Version number */ PASTIX_INT cblknbr; PASTIX_INT cblknum; PASTIX_INT vertnbr; PASTIX_INT vertnum; PASTIX_INT vertnnd; PASTIX_INT * permtax; PASTIX_INT * peritax; int i; if ((intLoad (stream, &versval) + intLoad (stream, &cblknbr) + intLoad (stream, &vertnbr) != 3) || (versval != 0) || (cblknbr > vertnbr)) { errorPrint ("orderLoad: bad input (1)"); return (1); } if (((ordeptr->rangtab = (PASTIX_INT *) memAlloc ((cblknbr + 1) * sizeof (PASTIX_INT))) == NULL) || ((ordeptr->permtab = (PASTIX_INT *) memAlloc (vertnbr * sizeof (PASTIX_INT))) == NULL) || ((ordeptr->peritab = (PASTIX_INT *) memAlloc (vertnbr * sizeof (PASTIX_INT))) == NULL)) { errorPrint ("orderLoad: out of memory"); orderExit (ordeptr); orderInit (ordeptr); return (1); } ordeptr->cblknbr = cblknbr; for (cblknum = 0, i = 1; (i == 1) && (cblknum <= cblknbr); cblknum ++) /* Read column-block data */ i = intLoad (stream, &ordeptr->rangtab[cblknum]); for (vertnum = 0; (i == 1) && (vertnum < vertnbr); vertnum ++) /* Read direct permutation */ i = intLoad (stream, &ordeptr->permtab[vertnum]); if (i != 1) { errorPrint ("orderLoad: bad input (2)"); orderExit (ordeptr); orderInit (ordeptr); return (1); } permtax = ordeptr->permtab - ordeptr->rangtab[0]; peritax = ordeptr->peritab - ordeptr->rangtab[0]; for (vertnum = ordeptr->rangtab[0], vertnnd = vertnum + vertnbr; /* Build inverse permutation */ vertnum < vertnnd; vertnum ++) peritax[permtax[vertnum]] = vertnum; return (0); }
int SCOTCH_graphOrderInit ( const SCOTCH_Graph * const grafptr, /*+ Graph to order +*/ SCOTCH_Ordering * const ordeptr, /*+ Ordering structure to initialize +*/ SCOTCH_Num * const permtab, /*+ Direct permutation array +*/ SCOTCH_Num * const peritab, /*+ Inverse permutation array +*/ SCOTCH_Num * const cblkptr, /*+ Pointer to number of column blocks +*/ SCOTCH_Num * const rangtab, /*+ Column block range array +*/ SCOTCH_Num * const treetab) /*+ Separator tree array +*/ { Graph * srcgrafptr; LibOrder * libordeptr; #ifdef SCOTCH_DEBUG_LIBRARY1 if (sizeof (SCOTCH_Ordering) < sizeof (LibOrder)) { errorPrint ("SCOTCH_graphOrderInit: internal error"); return (1); } #endif /* SCOTCH_DEBUG_LIBRARY1 */ srcgrafptr = (Graph *) grafptr; /* Use structure as source graph */ libordeptr = (LibOrder *) ordeptr; libordeptr->permtab = ((permtab == NULL) || ((void *) permtab == (void *) grafptr)) ? NULL : (Gnum *) permtab; libordeptr->peritab = ((peritab == NULL) || ((void *) peritab == (void *) grafptr)) ? NULL : (Gnum *) peritab; libordeptr->cblkptr = ((cblkptr == NULL) || ((void *) cblkptr == (void *) grafptr)) ? NULL : (Gnum *) cblkptr; libordeptr->rangtab = ((rangtab == NULL) || ((void *) rangtab == (void *) grafptr)) ? NULL : (Gnum *) rangtab; libordeptr->treetab = ((treetab == NULL) || ((void *) treetab == (void *) grafptr)) ? NULL : (Gnum *) treetab; return (orderInit (&libordeptr->o, srcgrafptr->baseval, srcgrafptr->vertnbr, libordeptr->peritab)); }