PetscErrorCode DMLabelPermute(DMLabel label, IS permutation, DMLabel *labelNew) { const PetscInt *perm; PetscInt numValues, numPoints, v, q; PetscErrorCode ierr; PetscFunctionBegin; ierr = DMLabelMakeAllValid_Private(label);CHKERRQ(ierr); ierr = DMLabelDuplicate(label, labelNew);CHKERRQ(ierr); ierr = DMLabelGetNumValues(*labelNew, &numValues);CHKERRQ(ierr); ierr = ISGetLocalSize(permutation, &numPoints);CHKERRQ(ierr); ierr = ISGetIndices(permutation, &perm);CHKERRQ(ierr); for (v = 0; v < numValues; ++v) { const PetscInt size = (*labelNew)->stratumSizes[v]; for (q = 0; q < size; ++q) { const PetscInt point = (*labelNew)->points[v][q]; if ((point < 0) || (point >= numPoints)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Label point %D is not in [0, %D) for the remapping", point, numPoints); (*labelNew)->points[v][q] = perm[point]; } ierr = PetscSortInt(size, &(*labelNew)->points[v][0]);CHKERRQ(ierr); } ierr = ISRestoreIndices(permutation, &perm);CHKERRQ(ierr); if (label->bt) { ierr = PetscBTDestroy(&label->bt);CHKERRQ(ierr); ierr = DMLabelCreateIndex(label, label->pStart, label->pEnd);CHKERRQ(ierr); } PetscFunctionReturn(0); }
PetscErrorCode DMLabelFilter(DMLabel label, PetscInt start, PetscInt end) { PetscInt v; PetscErrorCode ierr; PetscFunctionBegin; ierr = DMLabelMakeAllValid_Private(label);CHKERRQ(ierr); label->pStart = start; label->pEnd = end; if (label->bt) {ierr = PetscBTDestroy(&label->bt);CHKERRQ(ierr);} /* Could squish offsets, but would only make sense if I reallocate the storage */ for (v = 0; v < label->numStrata; ++v) { PetscInt off, q; for (off = 0, q = 0; q < label->stratumSizes[v]; ++q) { const PetscInt point = label->points[v][q]; if ((point < start) || (point >= end)) continue; label->points[v][off++] = point; } label->stratumSizes[v] = off; } ierr = DMLabelCreateIndex(label, start, end);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode TestSetup(DMLabel label, AppCtx *user) { PetscRandom r; PetscInt n = (PetscInt) (user->fill*(user->pEnd - user->pStart)), i; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscRandomCreate(PETSC_COMM_SELF, &r);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr);/* -random_type <> */ ierr = PetscRandomSetInterval(r, user->pStart, user->pEnd);CHKERRQ(ierr); ierr = PetscRandomSetSeed(r, 123456789L);CHKERRQ(ierr); ierr = PetscRandomSeed(r);CHKERRQ(ierr); user->size = 0; for(i = 0; i < n; ++i) { PetscReal p; PetscInt val; ierr = PetscRandomGetValueReal(r, &p);CHKERRQ(ierr); ierr = DMLabelGetValue(label, (PetscInt) p, &val);CHKERRQ(ierr); if (val < 0) { ++user->size; ierr = DMLabelSetValue(label, (PetscInt) p, i % user->numStrata);CHKERRQ(ierr); } } ierr = PetscRandomDestroy(&r);CHKERRQ(ierr); ierr = DMLabelCreateIndex(label, user->pStart, user->pEnd);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_SELF, "Created label with chart [%D, %D) and set %D values\n", user->pStart, user->pEnd, user->size);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode DMLabelFilter(DMLabel label, PetscInt start, PetscInt end) { PetscInt v; PetscErrorCode ierr; PetscFunctionBegin; ierr = DMLabelMakeAllValid_Private(label);CHKERRQ(ierr); label->pStart = start; label->pEnd = end; if (label->bt) {ierr = PetscBTDestroy(&label->bt);CHKERRQ(ierr);} /* Could squish offsets, but would only make sense if I reallocate the storage */ for (v = 0; v < label->numStrata; ++v) { PetscInt off, q; const PetscInt *points; PetscInt *pointsNew = NULL; ierr = ISGetIndices(label->points[v],&points);CHKERRQ(ierr); for (off = 0, q = 0; q < label->stratumSizes[v]; ++q) { const PetscInt point = points[q]; if ((point < start) || (point >= end)) { if (!pointsNew) { ierr = PetscMalloc1(label->stratumSizes[v],&pointsNew);CHKERRQ(ierr); ierr = PetscMemcpy(pointsNew,points,(size_t) off * sizeof(PetscInt));CHKERRQ(ierr); } continue; } if (pointsNew) { pointsNew[off++] = point; } } ierr = ISRestoreIndices(label->points[v],&points);CHKERRQ(ierr); if (pointsNew) { ierr = ISDestroy(&(label->points[v]));CHKERRQ(ierr); ierr = ISCreateGeneral(PETSC_COMM_SELF,off,pointsNew,PETSC_OWN_POINTER,&(label->points[v]));CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) (label->points[v]), "indices");CHKERRQ(ierr); } label->stratumSizes[v] = off; } ierr = DMLabelCreateIndex(label, start, end);CHKERRQ(ierr); PetscFunctionReturn(0); }