/*@ DMLabelSetValue - Set the value a label assigns to a point. If the value is the same as the label's default value (which is initially -1, and can be changed with DMLabelSetDefaultValue() to somethingg different), then this function will do nothing. Input Parameters: + label - the DMLabel . point - the point - value - The point value Level: intermediate .seealso: DMLabelCreate(), DMLabelGetValue(), DMLabelClearValue(), DMLabelGetDefaultValue(), DMLabelSetDefaultValue() @*/ PetscErrorCode DMLabelSetValue(DMLabel label, PetscInt point, PetscInt value) { PETSC_UNUSED PetscHashIIter iter, ret; PetscInt v; PetscErrorCode ierr; PetscFunctionBegin; /* Find, or add, label value */ if (value == label->defaultValue) PetscFunctionReturn(0); for (v = 0; v < label->numStrata; ++v) { if (label->stratumValues[v] == value) break; } /* Create new table */ if (v >= label->numStrata) {ierr = DMLabelAddStratum(label, value);CHKERRQ(ierr);} ierr = DMLabelMakeInvalid_Private(label, v);CHKERRQ(ierr); /* Set key */ PetscHashIPut(label->ht[v], point, ret, iter); PetscFunctionReturn(0); }
/*@ DMLabelClearValue - Clear the value a label assigns to a point Input Parameters: + label - the DMLabel . point - the point - value - The point value Level: intermediate .seealso: DMLabelCreate(), DMLabelGetValue(), DMLabelSetValue() @*/ PetscErrorCode DMLabelClearValue(DMLabel label, PetscInt point, PetscInt value) { PetscInt v; PetscErrorCode ierr; PetscFunctionBegin; /* Find label value */ for (v = 0; v < label->numStrata; ++v) { if (label->stratumValues[v] == value) break; } if (v >= label->numStrata) PetscFunctionReturn(0); if (label->validIS[v]) { ierr = DMLabelMakeInvalid_Private(label,v);CHKERRQ(ierr); } if (label->bt) { 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 = PetscBTClear(label->bt, point - label->pStart);CHKERRQ(ierr); } ierr = PetscHashIDelKey(label->ht[v], point);CHKERRQ(ierr); PetscFunctionReturn(0); }