/* DMLabelMakeValid_Private - Transfer stratum data from the hash format to the sorted list format Input parameter: + label - The DMLabel - v - The stratum value Output parameter: . label - The DMLabel with stratum in sorted list format Level: developer .seealso: DMLabelCreate() */ static PetscErrorCode DMLabelMakeValid_Private(DMLabel label, PetscInt v) { PetscInt off; PetscErrorCode ierr; if (label->arrayValid[v]) return 0; if (v >= label->numStrata) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Trying to access invalid stratum %D in DMLabelMakeValid_Private\n", v); PetscFunctionBegin; PetscHashISize(label->ht[v], label->stratumSizes[v]); ierr = PetscMalloc1(label->stratumSizes[v], &label->points[v]);CHKERRQ(ierr); off = 0; ierr = PetscHashIGetKeys(label->ht[v], &off, &(label->points[v][0]));CHKERRQ(ierr); if (off != label->stratumSizes[v]) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid number of contributed points %D from value %D should be %D", off, label->stratumValues[v], label->stratumSizes[v]); PetscHashIClear(label->ht[v]); ierr = PetscSortInt(label->stratumSizes[v], label->points[v]);CHKERRQ(ierr); if (label->bt) { PetscInt p; for (p = 0; p < label->stratumSizes[v]; ++p) { const PetscInt point = label->points[v][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->arrayValid[v] = PETSC_TRUE; ++label->state; PetscFunctionReturn(0); }
PetscErrorCode DMLabelClearStratum(DMLabel label, PetscInt value) { PetscInt v; PetscErrorCode ierr; PetscFunctionBegin; for (v = 0; v < label->numStrata; ++v) { if (label->stratumValues[v] == value) break; } if (v >= label->numStrata) PetscFunctionReturn(0); if (label->bt) { PetscInt i; for (i = 0; i < label->stratumSizes[v]; ++i) { const PetscInt point = label->points[v][i]; 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); } } if (label->arrayValid[v]) { label->stratumSizes[v] = 0; } else { PetscHashIClear(label->ht[v]); } PetscFunctionReturn(0); }
PetscErrorCode DMLabelClearStratum(DMLabel label, PetscInt value) { PetscInt v; PetscErrorCode ierr; PetscFunctionBegin; for (v = 0; v < label->numStrata; ++v) { if (label->stratumValues[v] == value) break; } if (v >= label->numStrata) PetscFunctionReturn(0); if (label->validIS[v]) { if (label->bt) { PetscInt i; const PetscInt *points; ierr = ISGetIndices(label->points[v], &points);CHKERRQ(ierr); for (i = 0; i < label->stratumSizes[v]; ++i) { const PetscInt point = points[i]; 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 = ISRestoreIndices(label->points[v], &points);CHKERRQ(ierr); } ierr = ISDestroy(&(label->points[v]));CHKERRQ(ierr); label->stratumSizes[v] = 0; ierr = ISCreateGeneral(PETSC_COMM_SELF,0,NULL,PETSC_OWN_POINTER,&(label->points[v]));CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) (label->points[v]), "indices");CHKERRQ(ierr); } else { PetscHashIClear(label->ht[v]); } PetscFunctionReturn(0); }