1c4762a1bSJed Brown static char help[] = "Tests DMLabel operations.\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscdm.h> 4c4762a1bSJed Brown #include <petscdmplex.h> 5*217f7fc6SMatthew G. Knepley #include <petscdmplextransform.h> 6c4762a1bSJed Brown 7d71ae5a4SJacob Faibussowitsch PetscErrorCode ViewLabels(DM dm, PetscViewer viewer) 8d71ae5a4SJacob Faibussowitsch { 9c4762a1bSJed Brown DMLabel label; 10*217f7fc6SMatthew G. Knepley const char *labelName, *typeName; 11c4762a1bSJed Brown PetscInt numLabels, l; 12c4762a1bSJed Brown 13c4762a1bSJed Brown PetscFunctionBegin; 14c4762a1bSJed Brown /* query the number and name of labels*/ 159566063dSJacob Faibussowitsch PetscCall(DMGetNumLabels(dm, &numLabels)); 1663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Number of labels: %" PetscInt_FMT "\n", numLabels)); 17c4762a1bSJed Brown for (l = 0; l < numLabels; ++l) { 1874d235b2SVaclav Hapla IS labelIS, tmpIS; 1974d235b2SVaclav Hapla 209566063dSJacob Faibussowitsch PetscCall(DMGetLabelName(dm, l, &labelName)); 219566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, labelName, &label)); 22*217f7fc6SMatthew G. Knepley PetscCall(DMLabelGetType(label, &typeName)); 23*217f7fc6SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "Label %" PetscInt_FMT ": name: %s type: %s\n", l, labelName, typeName)); 24*217f7fc6SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "IS of values\n")); 259566063dSJacob Faibussowitsch PetscCall(DMLabelGetValueIS(label, &labelIS)); 269566063dSJacob Faibussowitsch PetscCall(ISOnComm(labelIS, PetscObjectComm((PetscObject)viewer), PETSC_USE_POINTER, &tmpIS)); 279566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 289566063dSJacob Faibussowitsch PetscCall(ISView(tmpIS, viewer)); 299566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 309566063dSJacob Faibussowitsch PetscCall(ISDestroy(&tmpIS)); 319566063dSJacob Faibussowitsch PetscCall(ISDestroy(&labelIS)); 329566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "\n")); 33c4762a1bSJed Brown } 34c4762a1bSJed Brown /* Making sure that string literals work */ 359566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "\n\nCell Set label IS\n")); 369566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "Cell Sets", &label)); 37c4762a1bSJed Brown if (label) { 3874d235b2SVaclav Hapla IS labelIS, tmpIS; 3974d235b2SVaclav Hapla 409566063dSJacob Faibussowitsch PetscCall(DMLabelGetValueIS(label, &labelIS)); 419566063dSJacob Faibussowitsch PetscCall(ISOnComm(labelIS, PetscObjectComm((PetscObject)viewer), PETSC_USE_POINTER, &tmpIS)); 429566063dSJacob Faibussowitsch PetscCall(ISView(tmpIS, viewer)); 439566063dSJacob Faibussowitsch PetscCall(ISDestroy(&tmpIS)); 449566063dSJacob Faibussowitsch PetscCall(ISDestroy(&labelIS)); 45c4762a1bSJed Brown } 46c4762a1bSJed Brown PetscFunctionReturn(0); 47c4762a1bSJed Brown } 48c4762a1bSJed Brown 49d71ae5a4SJacob Faibussowitsch PetscErrorCode CheckLabelsSame(DMLabel label0, DMLabel label1) 50d71ae5a4SJacob Faibussowitsch { 5174d235b2SVaclav Hapla const char *name0, *name1; 5274d235b2SVaclav Hapla PetscBool same; 5374d235b2SVaclav Hapla char *msg; 5474d235b2SVaclav Hapla 5574d235b2SVaclav Hapla PetscFunctionBegin; 569566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)label0, &name0)); 579566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)label1, &name1)); 589566063dSJacob Faibussowitsch PetscCall(DMLabelCompare(PETSC_COMM_WORLD, label0, label1, &same, &msg)); 591dca8a05SBarry Smith PetscCheck(same == (PetscBool)!msg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMLabelCompare returns inconsistent same=%d msg=\"%s\"", same, msg); 6028b400f6SJacob Faibussowitsch PetscCheck(same, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels \"%s\" and \"%s\" should not differ! Message:\n%s", name0, name1, msg); 6174d235b2SVaclav Hapla /* Test passing NULL, must not fail */ 629566063dSJacob Faibussowitsch PetscCall(DMLabelCompare(PETSC_COMM_WORLD, label0, label1, NULL, NULL)); 639566063dSJacob Faibussowitsch PetscCall(PetscFree(msg)); 6474d235b2SVaclav Hapla PetscFunctionReturn(0); 6574d235b2SVaclav Hapla } 6674d235b2SVaclav Hapla 67d71ae5a4SJacob Faibussowitsch PetscErrorCode CheckLabelsNotSame(DMLabel label0, DMLabel label1) 68d71ae5a4SJacob Faibussowitsch { 6974d235b2SVaclav Hapla const char *name0, *name1; 7074d235b2SVaclav Hapla PetscBool same; 7174d235b2SVaclav Hapla char *msg; 7274d235b2SVaclav Hapla 7374d235b2SVaclav Hapla PetscFunctionBegin; 749566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)label0, &name0)); 759566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)label1, &name1)); 769566063dSJacob Faibussowitsch PetscCall(DMLabelCompare(PETSC_COMM_WORLD, label0, label1, &same, &msg)); 771dca8a05SBarry Smith PetscCheck(same == (PetscBool)!msg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMLabelCompare returns inconsistent same=%d msg=\"%s\"", same, msg); 7828b400f6SJacob Faibussowitsch PetscCheck(!same, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels \"%s\" and \"%s\" should differ!", name0, name1); 799566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Compare label \"%s\" with \"%s\": %s\n", name0, name1, msg)); 809566063dSJacob Faibussowitsch PetscCall(PetscFree(msg)); 8174d235b2SVaclav Hapla PetscFunctionReturn(0); 8274d235b2SVaclav Hapla } 8374d235b2SVaclav Hapla 84d71ae5a4SJacob Faibussowitsch PetscErrorCode CheckDMLabelsSame(DM dm0, DM dm1) 85d71ae5a4SJacob Faibussowitsch { 8674d235b2SVaclav Hapla const char *name0, *name1; 8774d235b2SVaclav Hapla PetscBool same; 8874d235b2SVaclav Hapla char *msg; 8974d235b2SVaclav Hapla 9074d235b2SVaclav Hapla PetscFunctionBegin; 919566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)dm0, &name0)); 929566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)dm1, &name1)); 939566063dSJacob Faibussowitsch PetscCall(DMCompareLabels(dm0, dm1, &same, &msg)); 941dca8a05SBarry Smith PetscCheck(same == (PetscBool)!msg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMCompareLabels returns inconsistent same=%d msg=\"%s\"", same, msg); 9528b400f6SJacob Faibussowitsch PetscCheck(same, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels of DMs \"%s\" and \"%s\" should not differ! Message:\n%s", name0, name1, msg); 9674d235b2SVaclav Hapla /* Test passing NULL, must not fail */ 979566063dSJacob Faibussowitsch PetscCall(DMCompareLabels(dm0, dm1, NULL, NULL)); 989566063dSJacob Faibussowitsch PetscCall(PetscFree(msg)); 9974d235b2SVaclav Hapla PetscFunctionReturn(0); 10074d235b2SVaclav Hapla } 10174d235b2SVaclav Hapla 102d71ae5a4SJacob Faibussowitsch PetscErrorCode CheckDMLabelsNotSame(DM dm0, DM dm1) 103d71ae5a4SJacob Faibussowitsch { 10474d235b2SVaclav Hapla const char *name0, *name1; 10574d235b2SVaclav Hapla PetscBool same; 10674d235b2SVaclav Hapla char *msg; 10774d235b2SVaclav Hapla 10874d235b2SVaclav Hapla PetscFunctionBegin; 1099566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)dm0, &name0)); 1109566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)dm1, &name1)); 1119566063dSJacob Faibussowitsch PetscCall(DMCompareLabels(dm0, dm1, &same, &msg)); 1121dca8a05SBarry Smith PetscCheck(same == (PetscBool)!msg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMCompareLabels returns inconsistent same=%d msg=\"%s\"", same, msg); 11328b400f6SJacob Faibussowitsch PetscCheck(!same, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels of DMs \"%s\" and \"%s\" should differ!", name0, name1); 1149566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Labels of DMs \"%s\" and \"%s\" differ: %s\n", name0, name1, msg)); 1159566063dSJacob Faibussowitsch PetscCall(PetscFree(msg)); 11674d235b2SVaclav Hapla PetscFunctionReturn(0); 11774d235b2SVaclav Hapla } 11874d235b2SVaclav Hapla 119d71ae5a4SJacob Faibussowitsch PetscErrorCode CreateMesh(const char name[], DM *newdm) 120d71ae5a4SJacob Faibussowitsch { 121c4762a1bSJed Brown DM dm, dmDist; 122c4762a1bSJed Brown char filename[PETSC_MAX_PATH_LEN] = ""; 123c4762a1bSJed Brown PetscBool interpolate = PETSC_FALSE; 124c4762a1bSJed Brown 12574d235b2SVaclav Hapla PetscFunctionBegin; 126c4762a1bSJed Brown /* initialize and get options */ 127d0609cedSBarry Smith PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "DMLabel ex1 Options", "DMLabel"); 1289566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-i", "filename to read", "ex1.c", filename, filename, sizeof(filename), NULL)); 1299566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-interpolate", "Generate intermediate mesh elements", "ex1.c", interpolate, &interpolate, NULL)); 130d0609cedSBarry Smith PetscOptionsEnd(); 131c4762a1bSJed Brown 132c4762a1bSJed Brown /* create and distribute DM */ 1339566063dSJacob Faibussowitsch PetscCall(DMPlexCreateFromFile(PETSC_COMM_WORLD, filename, "ex1_plex", interpolate, &dm)); 1349566063dSJacob Faibussowitsch PetscCall(DMPlexDistribute(dm, 0, NULL, &dmDist)); 135c4762a1bSJed Brown if (dmDist) { 1369566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm)); 137c4762a1bSJed Brown dm = dmDist; 138c4762a1bSJed Brown } 1399566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(dm)); 1409566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)dm, name)); 14174d235b2SVaclav Hapla *newdm = dm; 14274d235b2SVaclav Hapla PetscFunctionReturn(0); 14374d235b2SVaclav Hapla } 144c4762a1bSJed Brown 145*217f7fc6SMatthew G. Knepley static PetscErrorCode TestEphemeralLabels(DM dm) 146*217f7fc6SMatthew G. Knepley { 147*217f7fc6SMatthew G. Knepley DMPlexTransform tr; 148*217f7fc6SMatthew G. Knepley DM tdm; 149*217f7fc6SMatthew G. Knepley DMLabel label, labelTmp; 150*217f7fc6SMatthew G. Knepley 151*217f7fc6SMatthew G. Knepley PetscFunctionBeginUser; 152*217f7fc6SMatthew G. Knepley PetscCall(DMPlexTransformCreate(PetscObjectComm((PetscObject)dm), &tr)); 153*217f7fc6SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)tr, "Transform")); 154*217f7fc6SMatthew G. Knepley PetscCall(DMPlexTransformSetDM(tr, dm)); 155*217f7fc6SMatthew G. Knepley PetscCall(DMPlexTransformSetFromOptions(tr)); 156*217f7fc6SMatthew G. Knepley PetscCall(DMPlexTransformSetUp(tr)); 157*217f7fc6SMatthew G. Knepley 158*217f7fc6SMatthew G. Knepley PetscCall(DMPlexCreateEphemeral(tr, &tdm)); 159*217f7fc6SMatthew G. Knepley PetscCall(DMPlexTransformDestroy(&tr)); 160*217f7fc6SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)tdm, "Ephemeral Mesh")); 161*217f7fc6SMatthew G. Knepley PetscCall(PetscObjectSetOptionsPrefix((PetscObject)tdm, "eph_")); 162*217f7fc6SMatthew G. Knepley 163*217f7fc6SMatthew G. Knepley PetscCall(DMGetLabel(tdm, "marker", &label)); 164*217f7fc6SMatthew G. Knepley PetscCall(DMLabelDuplicate(label, &labelTmp)); 165*217f7fc6SMatthew G. Knepley PetscCall(CheckLabelsSame(label, labelTmp)); 166*217f7fc6SMatthew G. Knepley PetscCall(DMLabelDestroy(&labelTmp)); 167*217f7fc6SMatthew G. Knepley PetscCall(DMDestroy(&tdm)); 168*217f7fc6SMatthew G. Knepley PetscFunctionReturn(0); 169*217f7fc6SMatthew G. Knepley } 170*217f7fc6SMatthew G. Knepley 171d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 172d71ae5a4SJacob Faibussowitsch { 17374d235b2SVaclav Hapla DM dm; 17474d235b2SVaclav Hapla 175327415f7SBarry Smith PetscFunctionBeginUser; 1769566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 1779566063dSJacob Faibussowitsch PetscCall(CreateMesh("plex0", &dm)); 178c4762a1bSJed Brown /* add custom labels to test adding/removal */ 179c4762a1bSJed Brown { 180c4762a1bSJed Brown DMLabel label0, label1, label2, label3; 181c4762a1bSJed Brown PetscInt p, pStart, pEnd; 1829566063dSJacob Faibussowitsch PetscCall(DMPlexGetChart(dm, &pStart, &pEnd)); 183c4762a1bSJed Brown /* create label in DM and get from DM */ 1849566063dSJacob Faibussowitsch PetscCall(DMCreateLabel(dm, "label0")); 1859566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "label0", &label0)); 186c4762a1bSJed Brown /* alternative: create standalone label and add to DM; needs to be destroyed */ 1879566063dSJacob Faibussowitsch PetscCall(DMLabelCreate(PETSC_COMM_SELF, "label1", &label1)); 1889566063dSJacob Faibussowitsch PetscCall(DMAddLabel(dm, label1)); 189c4762a1bSJed Brown 19074d235b2SVaclav Hapla pEnd = PetscMin(pEnd, pStart + 5); 191c4762a1bSJed Brown for (p = pStart; p < pEnd; p++) { 1929566063dSJacob Faibussowitsch PetscCall(DMLabelSetValue(label0, p, 1)); 1939566063dSJacob Faibussowitsch PetscCall(DMLabelSetValue(label1, p, 2)); 194c4762a1bSJed Brown } 195c4762a1bSJed Brown /* duplicate label */ 1969566063dSJacob Faibussowitsch PetscCall(DMLabelDuplicate(label0, &label2)); 1979566063dSJacob Faibussowitsch PetscCall(DMLabelDuplicate(label1, &label3)); 1989566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)label2, "label2")); 1999566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)label3, "label3")); 2009566063dSJacob Faibussowitsch PetscCall(DMAddLabel(dm, label2)); 2019566063dSJacob Faibussowitsch PetscCall(DMAddLabel(dm, label3)); 202c4762a1bSJed Brown /* remove the labels in this scope */ 2039566063dSJacob Faibussowitsch PetscCall(DMLabelDestroy(&label1)); 2049566063dSJacob Faibussowitsch PetscCall(DMLabelDestroy(&label2)); 2059566063dSJacob Faibussowitsch PetscCall(DMLabelDestroy(&label3)); 206c4762a1bSJed Brown } 207c4762a1bSJed Brown 2089566063dSJacob Faibussowitsch PetscCall(ViewLabels(dm, PETSC_VIEWER_STDOUT_WORLD)); 209c4762a1bSJed Brown 21074d235b2SVaclav Hapla /* do label perturbations and comparisons */ 21174d235b2SVaclav Hapla { 21274d235b2SVaclav Hapla DMLabel label0, label1, label2, label3; 21374d235b2SVaclav Hapla PetscInt val; 21474d235b2SVaclav Hapla PetscInt p, pStart, pEnd; 21574d235b2SVaclav Hapla 2169566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "label0", &label0)); 2179566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "label1", &label1)); 2189566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "label2", &label2)); 2199566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "label3", &label3)); 22074d235b2SVaclav Hapla 2219566063dSJacob Faibussowitsch PetscCall(CheckLabelsNotSame(label0, label1)); 2229566063dSJacob Faibussowitsch PetscCall(CheckLabelsSame(label0, label2)); 2239566063dSJacob Faibussowitsch PetscCall(CheckLabelsSame(label1, label3)); 22474d235b2SVaclav Hapla 2259566063dSJacob Faibussowitsch PetscCall(DMLabelGetDefaultValue(label1, &val)); 2269566063dSJacob Faibussowitsch PetscCall(DMLabelSetDefaultValue(label1, 333)); 2279566063dSJacob Faibussowitsch PetscCall(CheckLabelsNotSame(label1, label3)); 2289566063dSJacob Faibussowitsch PetscCall(DMLabelSetDefaultValue(label1, val)); 2299566063dSJacob Faibussowitsch PetscCall(CheckLabelsSame(label1, label3)); 23074d235b2SVaclav Hapla 2319566063dSJacob Faibussowitsch PetscCall(DMLabelGetBounds(label1, &pStart, &pEnd)); 23274d235b2SVaclav Hapla 23374d235b2SVaclav Hapla for (p = pStart; p < pEnd; p++) { 2349566063dSJacob Faibussowitsch PetscCall(DMLabelGetValue(label1, p, &val)); 23574d235b2SVaclav Hapla // This is weird. Perhaps we should not need to call DMLabelClearValue() 2369566063dSJacob Faibussowitsch PetscCall(DMLabelClearValue(label1, p, val)); 23774d235b2SVaclav Hapla val++; 2389566063dSJacob Faibussowitsch PetscCall(DMLabelSetValue(label1, p, val)); 23974d235b2SVaclav Hapla } 2409566063dSJacob Faibussowitsch PetscCall(CheckLabelsNotSame(label1, label3)); 24174d235b2SVaclav Hapla for (p = pStart; p < pEnd; p++) { 2429566063dSJacob Faibussowitsch PetscCall(DMLabelGetValue(label1, p, &val)); 24374d235b2SVaclav Hapla // This is weird. Perhaps we should not need to call DMLabelClearValue() 2449566063dSJacob Faibussowitsch PetscCall(DMLabelClearValue(label1, p, val)); 24574d235b2SVaclav Hapla val--; 2469566063dSJacob Faibussowitsch PetscCall(DMLabelSetValue(label1, p, val)); 24774d235b2SVaclav Hapla } 2489566063dSJacob Faibussowitsch PetscCall(CheckLabelsSame(label1, label3)); 24974d235b2SVaclav Hapla 2509566063dSJacob Faibussowitsch PetscCall(DMLabelGetValue(label3, pEnd - 1, &val)); 2519566063dSJacob Faibussowitsch PetscCall(DMLabelSetValue(label3, pEnd, val)); 2529566063dSJacob Faibussowitsch PetscCall(CheckLabelsNotSame(label1, label3)); 25374d235b2SVaclav Hapla // This is weird. Perhaps we should not need to call DMLabelClearValue() 2549566063dSJacob Faibussowitsch PetscCall(DMLabelClearValue(label3, pEnd, val)); 2559566063dSJacob Faibussowitsch PetscCall(CheckLabelsSame(label1, label3)); 25674d235b2SVaclav Hapla } 25774d235b2SVaclav Hapla 25874d235b2SVaclav Hapla { 25974d235b2SVaclav Hapla DM dm1; 26074d235b2SVaclav Hapla DMLabel label02, label12; 26174d235b2SVaclav Hapla PetscInt p = 0, val; 26274d235b2SVaclav Hapla 2639566063dSJacob Faibussowitsch PetscCall(CreateMesh("plex1", &dm1)); 2649566063dSJacob Faibussowitsch PetscCall(CheckDMLabelsNotSame(dm, dm1)); 26574d235b2SVaclav Hapla 2669566063dSJacob Faibussowitsch PetscCall(DMCopyLabels(dm, dm1, PETSC_OWN_POINTER, PETSC_FALSE, DM_COPY_LABELS_REPLACE)); 2679566063dSJacob Faibussowitsch PetscCall(CheckDMLabelsSame(dm, dm1)); 26874d235b2SVaclav Hapla 2699566063dSJacob Faibussowitsch PetscCall(DMCopyLabels(dm, dm1, PETSC_COPY_VALUES, PETSC_FALSE, DM_COPY_LABELS_REPLACE)); 2709566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "label2", &label02)); 2719566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm1, "label2", &label12)); 2729566063dSJacob Faibussowitsch PetscCall(CheckLabelsSame(label02, label12)); 27374d235b2SVaclav Hapla 2749566063dSJacob Faibussowitsch PetscCall(DMLabelGetValue(label12, p, &val)); 27574d235b2SVaclav Hapla // This is weird. Perhaps we should not need to call DMLabelClearValue() 2769566063dSJacob Faibussowitsch PetscCall(DMLabelClearValue(label12, p, val)); 2779566063dSJacob Faibussowitsch PetscCall(DMLabelSetValue(label12, p, val + 1)); 2789566063dSJacob Faibussowitsch PetscCall(CheckLabelsNotSame(label02, label12)); 2799566063dSJacob Faibussowitsch PetscCall(CheckDMLabelsNotSame(dm, dm1)); 28074d235b2SVaclav Hapla 28174d235b2SVaclav Hapla // This is weird. Perhaps we should not need to call DMLabelClearValue() 2829566063dSJacob Faibussowitsch PetscCall(DMLabelClearValue(label12, p, val + 1)); 2839566063dSJacob Faibussowitsch PetscCall(DMLabelSetValue(label12, p, val)); 2849566063dSJacob Faibussowitsch PetscCall(CheckLabelsSame(label02, label12)); 2859566063dSJacob Faibussowitsch PetscCall(CheckDMLabelsSame(dm, dm1)); 28674d235b2SVaclav Hapla 2879566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)label12, "label12")); 2889566063dSJacob Faibussowitsch PetscCall(CheckDMLabelsNotSame(dm, dm1)); 2899566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)label12, "label2")); 2909566063dSJacob Faibussowitsch PetscCall(CheckDMLabelsSame(dm, dm1)); 29174d235b2SVaclav Hapla 2929566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm1)); 29374d235b2SVaclav Hapla } 294*217f7fc6SMatthew G. Knepley // Test adding strata and filtering 295*217f7fc6SMatthew G. Knepley { 296*217f7fc6SMatthew G. Knepley DMLabel labelA, labelB; 297*217f7fc6SMatthew G. Knepley IS valueIS; 298*217f7fc6SMatthew G. Knepley PetscInt pStart, pEnd, lStart = 5, lEnd = 19; 299*217f7fc6SMatthew G. Knepley 300*217f7fc6SMatthew G. Knepley PetscCall(DMPlexGetChart(dm, &pStart, &pEnd)); 301*217f7fc6SMatthew G. Knepley PetscCall(DMCreateLabel(dm, "labelA")); 302*217f7fc6SMatthew G. Knepley PetscCall(DMCreateLabel(dm, "labelB")); 303*217f7fc6SMatthew G. Knepley PetscCall(DMGetLabel(dm, "labelA", &labelA)); 304*217f7fc6SMatthew G. Knepley PetscCall(DMGetLabel(dm, "labelB", &labelB)); 305*217f7fc6SMatthew G. Knepley for (PetscInt p = pStart; p < pEnd; ++p) { 306*217f7fc6SMatthew G. Knepley if (p < lStart || p >= lEnd) continue; 307*217f7fc6SMatthew G. Knepley if (p % 2) PetscCall(DMLabelSetValue(labelA, p, 19)); 308*217f7fc6SMatthew G. Knepley else PetscCall(DMLabelSetValue(labelA, p, 17)); 309*217f7fc6SMatthew G. Knepley } 310*217f7fc6SMatthew G. Knepley PetscCall(DMLabelGetValueIS(labelA, &valueIS)); 311*217f7fc6SMatthew G. Knepley PetscCall(DMLabelAddStrataIS(labelA, valueIS)); 312*217f7fc6SMatthew G. Knepley PetscCall(ISDestroy(&valueIS)); 313*217f7fc6SMatthew G. Knepley for (PetscInt p = pStart; p < pEnd; ++p) { 314*217f7fc6SMatthew G. Knepley if (p % 2) PetscCall(DMLabelSetValue(labelB, p, 19)); 315*217f7fc6SMatthew G. Knepley else PetscCall(DMLabelSetValue(labelB, p, 17)); 316*217f7fc6SMatthew G. Knepley } 317*217f7fc6SMatthew G. Knepley PetscCall(DMLabelFilter(labelB, lStart, lEnd)); 318*217f7fc6SMatthew G. Knepley CheckLabelsSame(labelA, labelB); 319*217f7fc6SMatthew G. Knepley PetscCall(DMRemoveLabel(dm, "labelA", NULL)); 320*217f7fc6SMatthew G. Knepley PetscCall(DMRemoveLabel(dm, "labelB", NULL)); 321*217f7fc6SMatthew G. Knepley } 32274d235b2SVaclav Hapla 323c4762a1bSJed Brown /* remove label0 and label1 just to test manual removal; let label3 be removed automatically by DMDestroy() */ 324c4762a1bSJed Brown { 325c4762a1bSJed Brown DMLabel label0, label1, label2; 3269566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "label0", &label0)); 3279566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "label1", &label1)); 32828b400f6SJacob Faibussowitsch PetscCheck(label0, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must not be NULL now"); 32928b400f6SJacob Faibussowitsch PetscCheck(label1, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must not be NULL now"); 3309566063dSJacob Faibussowitsch PetscCall(DMRemoveLabel(dm, "label1", NULL)); 3319566063dSJacob Faibussowitsch PetscCall(DMRemoveLabel(dm, "label2", &label2)); 3329566063dSJacob Faibussowitsch PetscCall(DMRemoveLabelBySelf(dm, &label0, PETSC_TRUE)); 3339566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "label0", &label0)); 3349566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "label1", &label1)); 33528b400f6SJacob Faibussowitsch PetscCheck(!label0, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must be NULL now"); 33628b400f6SJacob Faibussowitsch PetscCheck(!label1, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must be NULL now"); 33728b400f6SJacob Faibussowitsch PetscCheck(label2, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now"); 3389566063dSJacob Faibussowitsch PetscCall(DMRemoveLabelBySelf(dm, &label2, PETSC_FALSE)); /* this should do nothing */ 33928b400f6SJacob Faibussowitsch PetscCheck(label2, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now"); 3409566063dSJacob Faibussowitsch PetscCall(DMLabelDestroy(&label2)); 3419566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "label2", &label2)); 34228b400f6SJacob Faibussowitsch PetscCheck(!label2, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must be NULL now"); 343c4762a1bSJed Brown } 344c4762a1bSJed Brown 345*217f7fc6SMatthew G. Knepley PetscCall(TestEphemeralLabels(dm)); 346*217f7fc6SMatthew G. Knepley 3479566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm)); 3489566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 349b122ec5aSJacob Faibussowitsch return 0; 350c4762a1bSJed Brown } 351c4762a1bSJed Brown 352c4762a1bSJed Brown /*TEST 353c4762a1bSJed Brown 354c4762a1bSJed Brown test: 355c4762a1bSJed Brown suffix: 0 35674d235b2SVaclav Hapla nsize: {{1 2}separate output} 357c4762a1bSJed Brown args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/blockcylinder-50.exo -interpolate 358c4762a1bSJed Brown requires: exodusii 359c4762a1bSJed Brown 360c4762a1bSJed Brown TEST*/ 361