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); }
/*@ 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, p; 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->arrayValid[v]) { /* Check whether point exists */ ierr = PetscFindInt(point, label->stratumSizes[v], &label->points[v][0], &p);CHKERRQ(ierr); if (p >= 0) { ierr = PetscMemmove(&label->points[v][p], &label->points[v][p+1], (label->stratumSizes[v]-p-1) * sizeof(PetscInt));CHKERRQ(ierr); --label->stratumSizes[v]; 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); } } } else { ierr = PetscHashIDelKey(label->ht[v], point);CHKERRQ(ierr); } 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); }
/*@ 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); }
/*@ ISDifference - Computes the difference between two index sets. Collective on IS Input Parameter: + is1 - first index, to have items removed from it - is2 - index values to be removed Output Parameters: . isout - is1 - is2 Notes: Negative values are removed from the lists. is2 may have values that are not in is1. This requires O(imax-imin) memory and O(imax-imin) work, where imin and imax are the bounds on the indices in is1. Level: intermediate Concepts: index sets^difference Concepts: IS^difference .seealso: ISDestroy(), ISView(), ISSum(), ISExpand() @*/ PetscErrorCode ISDifference(IS is1,IS is2,IS *isout) { PetscErrorCode ierr; PetscInt i,n1,n2,imin,imax,nout,*iout; const PetscInt *i1,*i2; PetscBT mask; MPI_Comm comm; PetscFunctionBegin; PetscValidHeaderSpecific(is1,IS_CLASSID,1); PetscValidHeaderSpecific(is2,IS_CLASSID,2); PetscValidPointer(isout,3); ierr = ISGetIndices(is1,&i1);CHKERRQ(ierr); ierr = ISGetLocalSize(is1,&n1);CHKERRQ(ierr); /* Create a bit mask array to contain required values */ if (n1) { imin = PETSC_MAX_INT; imax = 0; for (i=0; i<n1; i++) { if (i1[i] < 0) continue; imin = PetscMin(imin,i1[i]); imax = PetscMax(imax,i1[i]); } } else imin = imax = 0; ierr = PetscBTCreate(imax-imin,&mask);CHKERRQ(ierr); /* Put the values from is1 */ for (i=0; i<n1; i++) { if (i1[i] < 0) continue; ierr = PetscBTSet(mask,i1[i] - imin);CHKERRQ(ierr); } ierr = ISRestoreIndices(is1,&i1);CHKERRQ(ierr); /* Remove the values from is2 */ ierr = ISGetIndices(is2,&i2);CHKERRQ(ierr); ierr = ISGetLocalSize(is2,&n2);CHKERRQ(ierr); for (i=0; i<n2; i++) { if (i2[i] < imin || i2[i] > imax) continue; ierr = PetscBTClear(mask,i2[i] - imin);CHKERRQ(ierr); } ierr = ISRestoreIndices(is2,&i2);CHKERRQ(ierr); /* Count the number in the difference */ nout = 0; for (i=0; i<imax-imin+1; i++) { if (PetscBTLookup(mask,i)) nout++; } /* create the new IS containing the difference */ ierr = PetscMalloc1(nout,&iout);CHKERRQ(ierr); nout = 0; for (i=0; i<imax-imin+1; i++) { if (PetscBTLookup(mask,i)) iout[nout++] = i + imin; } ierr = PetscObjectGetComm((PetscObject)is1,&comm);CHKERRQ(ierr); ierr = ISCreateGeneral(comm,nout,iout,PETSC_OWN_POINTER,isout);CHKERRQ(ierr); ierr = PetscBTDestroy(&mask);CHKERRQ(ierr); PetscFunctionReturn(0); }