/* DMLabelMakeAllValid_Private - Transfer all strata from the hash format to the sorted list format Input parameter: . label - The DMLabel Output parameter: . label - The DMLabel with all strata in sorted list format Level: developer .seealso: DMLabelCreate() */ static PetscErrorCode DMLabelMakeAllValid_Private(DMLabel label) { PetscInt v; PetscErrorCode ierr; PetscFunctionBegin; for (v = 0; v < label->numStrata; v++){ ierr = DMLabelMakeValid_Private(label, v);CHKERRQ(ierr); } PetscFunctionReturn(0); }
PetscErrorCode DMLabelGetStratumSize(DMLabel label, PetscInt value, PetscInt *size) { PetscInt v; PetscErrorCode ierr; PetscFunctionBegin; PetscValidPointer(size, 3); *size = 0; for (v = 0; v < label->numStrata; ++v) { if (label->stratumValues[v] == value) { ierr = DMLabelMakeValid_Private(label, v);CHKERRQ(ierr); *size = label->stratumSizes[v]; break; } } PetscFunctionReturn(0); }
PetscErrorCode DMLabelGetStratumBounds(DMLabel label, PetscInt value, PetscInt *start, PetscInt *end) { PetscInt v; PetscErrorCode ierr; PetscFunctionBegin; if (start) {PetscValidPointer(start, 3); *start = 0;} if (end) {PetscValidPointer(end, 4); *end = 0;} for (v = 0; v < label->numStrata; ++v) { if (label->stratumValues[v] != value) continue; ierr = DMLabelMakeValid_Private(label, v);CHKERRQ(ierr); if (start) *start = label->points[v][0]; if (end) *end = label->points[v][label->stratumSizes[v]-1]+1; break; } PetscFunctionReturn(0); }
PetscErrorCode DMLabelGetStratumIS(DMLabel label, PetscInt value, IS *points) { PetscInt v; PetscErrorCode ierr; PetscFunctionBegin; PetscValidPointer(points, 3); *points = NULL; for (v = 0; v < label->numStrata; ++v) { if (label->stratumValues[v] == value) { ierr = DMLabelMakeValid_Private(label, v);CHKERRQ(ierr); if (label->arrayValid[v]) { ierr = ISCreateGeneral(PETSC_COMM_SELF, label->stratumSizes[v], &label->points[v][0], PETSC_COPY_VALUES, points);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) *points, "indices");CHKERRQ(ierr); } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Need to implement this to speedup Stratify"); break; } } PetscFunctionReturn(0); }
PetscErrorCode DMLabelGetStratumIS(DMLabel label, PetscInt value, IS *points) { PetscInt v; PetscErrorCode ierr; PetscFunctionBegin; PetscValidPointer(points, 3); *points = NULL; for (v = 0; v < label->numStrata; ++v) { if (label->stratumValues[v] == value) { ierr = DMLabelMakeValid_Private(label, v);CHKERRQ(ierr); if (label->validIS[v]) { ierr = PetscObjectReference((PetscObject) label->points[v]);CHKERRQ(ierr); *points = label->points[v]; } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Need to implement this to speedup Stratify"); break; } } PetscFunctionReturn(0); }