PetscErrorCode DMLabelPermute(DMLabel label, IS permutation, DMLabel *labelNew) { const PetscInt *perm; PetscInt numValues, numPoints, v, q; PetscErrorCode ierr; PetscFunctionBegin; ierr = DMLabelMakeAllValid_Private(label);CHKERRQ(ierr); ierr = DMLabelDuplicate(label, labelNew);CHKERRQ(ierr); ierr = DMLabelGetNumValues(*labelNew, &numValues);CHKERRQ(ierr); ierr = ISGetLocalSize(permutation, &numPoints);CHKERRQ(ierr); ierr = ISGetIndices(permutation, &perm);CHKERRQ(ierr); for (v = 0; v < numValues; ++v) { const PetscInt size = (*labelNew)->stratumSizes[v]; for (q = 0; q < size; ++q) { const PetscInt point = (*labelNew)->points[v][q]; if ((point < 0) || (point >= numPoints)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Label point %D is not in [0, %D) for the remapping", point, numPoints); (*labelNew)->points[v][q] = perm[point]; } ierr = PetscSortInt(size, &(*labelNew)->points[v][0]);CHKERRQ(ierr); } ierr = ISRestoreIndices(permutation, &perm);CHKERRQ(ierr); if (label->bt) { ierr = PetscBTDestroy(&label->bt);CHKERRQ(ierr); ierr = DMLabelCreateIndex(label, label->pStart, label->pEnd);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@ DMPlexCopyLabels - Copy labels from one mesh to another with a superset of the points Collective on DM Input Parameter: . dmA - The DMPlex object with initial labels Output Parameter: . dmB - The DMPlex object with copied labels Level: intermediate Note: This is typically used when interpolating or otherwise adding to a mesh .keywords: mesh .seealso: DMCopyCoordinates(), DMGetCoordinates(), DMGetCoordinatesLocal(), DMGetCoordinateDM(), DMGetCoordinateSection() @*/ PetscErrorCode DMPlexCopyLabels(DM dmA, DM dmB) { PetscInt numLabels, l; PetscErrorCode ierr; PetscFunctionBegin; if (dmA == dmB) PetscFunctionReturn(0); ierr = DMPlexGetNumLabels(dmA, &numLabels);CHKERRQ(ierr); for (l = 0; l < numLabels; ++l) { DMLabel label, labelNew; const char *name; PetscBool flg; ierr = DMPlexGetLabelName(dmA, l, &name);CHKERRQ(ierr); ierr = PetscStrcmp(name, "depth", &flg);CHKERRQ(ierr); if (flg) continue; ierr = DMPlexGetLabel(dmA, name, &label);CHKERRQ(ierr); ierr = DMLabelDuplicate(label, &labelNew);CHKERRQ(ierr); ierr = DMPlexAddLabel(dmB, labelNew);CHKERRQ(ierr); } PetscFunctionReturn(0); }