PetscErrorCode DMLabelSetStratumIS(DMLabel label, PetscInt value, IS is) { PetscInt v, numStrata; PetscErrorCode ierr; PetscFunctionBegin; numStrata = label->numStrata; for (v = 0; v < numStrata; v++) { if (label->stratumValues[v] == value) break; } if (v >= numStrata) {ierr = DMLabelAddStratum(label,value);CHKERRQ(ierr);} if (is == label->points[v]) PetscFunctionReturn(0); ierr = DMLabelClearStratum(label,value);CHKERRQ(ierr); ierr = ISGetLocalSize(is,&(label->stratumSizes[v]));CHKERRQ(ierr); label->stratumValues[v] = value; label->validIS[v] = PETSC_TRUE; ierr = PetscObjectReference((PetscObject)is);CHKERRQ(ierr); ierr = ISDestroy(&(label->points[v]));CHKERRQ(ierr); if (label->bt) { const PetscInt *points; PetscInt p; ierr = ISGetIndices(is,&points);CHKERRQ(ierr); for (p = 0; p < label->stratumSizes[v]; ++p) { const PetscInt point = points[p]; if ((point < label->pStart) || (point >= label->pEnd)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Label point %D is not in [%D, %D)", point, label->pStart, label->pEnd); ierr = PetscBTSet(label->bt, point - label->pStart);CHKERRQ(ierr); } } label->points[v] = is; PetscFunctionReturn(0); }
/*@C DMPlexClearLabelStratum - Remove all points from a stratum from a Sieve Label Not Collective Input Parameters: + dm - The DMPlex object . name - The label name - value - The label value for this point Output Parameter: Level: beginner .keywords: mesh .seealso: DMLabelClearStratum(), DMPlexSetLabelValue(), DMPlexGetStratumIS(), DMPlexClearLabelValue() @*/ PetscErrorCode DMPlexClearLabelStratum(DM dm, const char name[], PetscInt value) { DMLabel label; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(dm, DM_CLASSID, 1); PetscValidCharPointer(name, 2); ierr = DMPlexGetLabel(dm, name, &label);CHKERRQ(ierr); if (!label) PetscFunctionReturn(0); ierr = DMLabelClearStratum(label, value);CHKERRQ(ierr); PetscFunctionReturn(0); }