/* ************************************************************** * Prototype: ZOLTAN_EDGE_LIST_MULTI_FN * For every vertex in the ID list, return a list of all its * adjacent vertices, and the processes on which they reside. * Also include the edge weights if any. * For graph methods. ************************************************************** */ static void get_edge_list(void *data, int sizeGID, int sizeLID, int num_obj, ZOLTAN_ID_PTR globalID, ZOLTAN_ID_PTR localID, int *num_edges, ZOLTAN_ID_PTR nborGID, int *nborProc, int wgt_dim, float *ewgts, int *ierr) { UZData *uz = (UZData *) data; int i, id, r, c, r2, c2, e; ZOLTAN_ID_PTR nextID; int *nextProc; if ( (sizeGID != 1) || (sizeLID != 1) || (wgt_dim != 0)){ /* we are not using edge weights */ *ierr = ZOLTAN_FATAL; return; } nextID = nborGID; nextProc = nborProc; /* printf("querying %d vertices\n", num_obj); */ for (i=0; i < num_obj ; ++i) { id = globalID[i]; r = getR(id); c = getC(id); /* printf(" %d (%d,%d) : ", id, r, c); */ for (e=0; e<uz->stencil; ++e) { r2 = r+neig[e].r; c2 = c+neig[e].c; if (r2>=0 && r2<uz->meshR && c2>=0 && c2<uz->meshC) { *nextID++ = gID(r2, c2); *nextProc++ = pID(r2/(uz->meshR/uz->procR), c2/(uz->meshC/uz->procC)); /* printf(" %d (%d, %d) [%d] ", *(nextID-1), r2, c2, *(nextProc-1)); */ } } if (uz->redgeto && (uz->redgeto[i]>=0)) { r2 = getR(uz->redgeto[i]); c2 = getC(uz->redgeto[i]); *nextID++ = gID(r2, c2); *nextProc++ = pID(r2/(uz->meshR/uz->procR), c2/(uz->meshC/uz->procC)); /* printf(" %d (%d, %d) [%d] ", *(nextID-1), r2, c2, *(nextProc-1)); */ } /* printf("\n"); */ *ierr = ZOLTAN_OK; } }
static int filledges(int lid, int *adjID, int *adjProc, UZData *uz) { int *nextID = adjID, *ptr; int *nextProc = adjProc; int gid = gIDfLID(lid); int r = getR(gid), r2; int c = getC(gid), c2, e, j; /* printf(" %d (%d,%d) : ", id, r, c); */ for (e=0; e<uz->stencil; ++e) { r2 = r+neig[e].r; c2 = c+neig[e].c; if (r2>=0 && r2<uz->meshR && c2>=0 && c2<uz->meshC) { *nextID++ = gID(r2, c2); if (adjProc) *nextProc++ = pID(r2/(uz->meshR/uz->procR), c2/(uz->meshC/uz->procC)); /* printf(" %d (%d, %d) [%d] ", *(nextID-1), r2, c2, *(nextProc-1)); */ } } if (uz->redgeto && (uz->redgeto[lid]>=0)) { for (ptr=adjID; ptr<nextID && *ptr!=uz->redgeto[lid]; ++ptr); if (ptr>=nextID) { r2 = getR(uz->redgeto[lid]); c2 = getC(uz->redgeto[lid]); *nextID++ = uz->redgeto[lid]; if (adjProc) *nextProc++ = pID(r2/(uz->meshR/uz->procR), c2/(uz->meshC/uz->procC)); /* printf(" %d (%d, %d) [%d] ", *(nextID-1), r2, c2, *(nextProc-1)); */ } } if (xadj) { for (j=xadj[lid]; j<xadj[lid+1]; ++j) { for (ptr=adjID; ptr<nextID && *ptr!=uz->redgeto[lid]; ++ptr); if (ptr>=nextID) { *nextID++ = adj[j]; if (adjProc) *nextProc++ = pIDfGID(adj[j]); } } } /* printf("\n"); */ return nextID-adjID; }