xref: /petsc/src/dm/label/tutorials/ex1.c (revision 970231d20df44f79b27787157e39d441e79f434b)
1c4762a1bSJed Brown static char help[] = "Tests DMLabel operations.\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscdm.h>
4c4762a1bSJed Brown #include <petscdmplex.h>
5217f7fc6SMatthew G. Knepley #include <petscdmplextransform.h>
6c4762a1bSJed Brown 
ViewLabels(DM dm,PetscViewer viewer)7d71ae5a4SJacob Faibussowitsch PetscErrorCode ViewLabels(DM dm, PetscViewer viewer)
8d71ae5a4SJacob Faibussowitsch {
9c4762a1bSJed Brown   DMLabel     label;
10217f7fc6SMatthew 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));
22217f7fc6SMatthew G. Knepley     PetscCall(DMLabelGetType(label, &typeName));
23217f7fc6SMatthew G. Knepley     PetscCall(PetscViewerASCIIPrintf(viewer, "Label %" PetscInt_FMT ": name: %s type: %s\n", l, labelName, typeName));
24217f7fc6SMatthew 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   }
463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
47c4762a1bSJed Brown }
48c4762a1bSJed Brown 
CheckLabelsSame(DMLabel label0,DMLabel label1)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);
60*00045ab3SPierre Jolivet   PetscCheck(same, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels \"%s\" and \"%s\" should not differ! Message: %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));
643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6574d235b2SVaclav Hapla }
6674d235b2SVaclav Hapla 
CheckLabelsNotSame(DMLabel label0,DMLabel label1)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));
813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8274d235b2SVaclav Hapla }
8374d235b2SVaclav Hapla 
CheckDMLabelsSame(DM dm0,DM dm1)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);
95*00045ab3SPierre Jolivet   PetscCheck(same, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels of DMs \"%s\" and \"%s\" should not differ! Message: %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));
993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10074d235b2SVaclav Hapla }
10174d235b2SVaclav Hapla 
CheckDMLabelsNotSame(DM dm0,DM dm1)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));
1163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
11774d235b2SVaclav Hapla }
11874d235b2SVaclav Hapla 
CreateMesh(const char name[],DM * newdm)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;
1423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
14374d235b2SVaclav Hapla }
144c4762a1bSJed Brown 
TestEphemeralLabels(DM dm)145217f7fc6SMatthew G. Knepley static PetscErrorCode TestEphemeralLabels(DM dm)
146217f7fc6SMatthew G. Knepley {
147217f7fc6SMatthew G. Knepley   DMPlexTransform tr;
148217f7fc6SMatthew G. Knepley   DM              tdm;
149217f7fc6SMatthew G. Knepley   DMLabel         label, labelTmp;
150217f7fc6SMatthew G. Knepley 
151217f7fc6SMatthew G. Knepley   PetscFunctionBeginUser;
152217f7fc6SMatthew G. Knepley   PetscCall(DMPlexTransformCreate(PetscObjectComm((PetscObject)dm), &tr));
153217f7fc6SMatthew G. Knepley   PetscCall(PetscObjectSetName((PetscObject)tr, "Transform"));
154217f7fc6SMatthew G. Knepley   PetscCall(DMPlexTransformSetDM(tr, dm));
155217f7fc6SMatthew G. Knepley   PetscCall(DMPlexTransformSetFromOptions(tr));
156217f7fc6SMatthew G. Knepley   PetscCall(DMPlexTransformSetUp(tr));
157217f7fc6SMatthew G. Knepley 
1580528010dSStefano Zampini   PetscCall(DMPlexCreateEphemeral(tr, "eph_", &tdm));
159217f7fc6SMatthew G. Knepley   PetscCall(DMPlexTransformDestroy(&tr));
160217f7fc6SMatthew G. Knepley   PetscCall(PetscObjectSetName((PetscObject)tdm, "Ephemeral Mesh"));
161217f7fc6SMatthew G. Knepley 
1623d9b5e0bSMatthew G. Knepley   PetscCall(DMGetLabel(tdm, "OuterBoundary", &label));
163217f7fc6SMatthew G. Knepley   PetscCall(DMLabelDuplicate(label, &labelTmp));
164217f7fc6SMatthew G. Knepley   PetscCall(CheckLabelsSame(label, labelTmp));
165217f7fc6SMatthew G. Knepley   PetscCall(DMLabelDestroy(&labelTmp));
166217f7fc6SMatthew G. Knepley   PetscCall(DMDestroy(&tdm));
1673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
168217f7fc6SMatthew G. Knepley }
169217f7fc6SMatthew G. Knepley 
main(int argc,char ** argv)170d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
171d71ae5a4SJacob Faibussowitsch {
17274d235b2SVaclav Hapla   DM dm;
17374d235b2SVaclav Hapla 
174327415f7SBarry Smith   PetscFunctionBeginUser;
1759566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
1769566063dSJacob Faibussowitsch   PetscCall(CreateMesh("plex0", &dm));
177c4762a1bSJed Brown   /* add custom labels to test adding/removal */
178c4762a1bSJed Brown   {
179c4762a1bSJed Brown     DMLabel  label0, label1, label2, label3;
180c4762a1bSJed Brown     PetscInt p, pStart, pEnd;
1819566063dSJacob Faibussowitsch     PetscCall(DMPlexGetChart(dm, &pStart, &pEnd));
182c4762a1bSJed Brown     /* create label in DM and get from DM */
1839566063dSJacob Faibussowitsch     PetscCall(DMCreateLabel(dm, "label0"));
1849566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label0", &label0));
185c4762a1bSJed Brown     /* alternative: create standalone label and add to DM; needs to be destroyed */
1869566063dSJacob Faibussowitsch     PetscCall(DMLabelCreate(PETSC_COMM_SELF, "label1", &label1));
1879566063dSJacob Faibussowitsch     PetscCall(DMAddLabel(dm, label1));
188c4762a1bSJed Brown 
18974d235b2SVaclav Hapla     pEnd = PetscMin(pEnd, pStart + 5);
190c4762a1bSJed Brown     for (p = pStart; p < pEnd; p++) {
1919566063dSJacob Faibussowitsch       PetscCall(DMLabelSetValue(label0, p, 1));
1929566063dSJacob Faibussowitsch       PetscCall(DMLabelSetValue(label1, p, 2));
193c4762a1bSJed Brown     }
194c4762a1bSJed Brown     /* duplicate label */
1959566063dSJacob Faibussowitsch     PetscCall(DMLabelDuplicate(label0, &label2));
1969566063dSJacob Faibussowitsch     PetscCall(DMLabelDuplicate(label1, &label3));
1979566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)label2, "label2"));
1989566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)label3, "label3"));
1999566063dSJacob Faibussowitsch     PetscCall(DMAddLabel(dm, label2));
2009566063dSJacob Faibussowitsch     PetscCall(DMAddLabel(dm, label3));
201c4762a1bSJed Brown     /* remove the labels in this scope */
2029566063dSJacob Faibussowitsch     PetscCall(DMLabelDestroy(&label1));
2039566063dSJacob Faibussowitsch     PetscCall(DMLabelDestroy(&label2));
2049566063dSJacob Faibussowitsch     PetscCall(DMLabelDestroy(&label3));
205c4762a1bSJed Brown   }
206c4762a1bSJed Brown 
2079566063dSJacob Faibussowitsch   PetscCall(ViewLabels(dm, PETSC_VIEWER_STDOUT_WORLD));
208c4762a1bSJed Brown 
20974d235b2SVaclav Hapla   /* do label perturbations and comparisons */
21074d235b2SVaclav Hapla   {
21174d235b2SVaclav Hapla     DMLabel  label0, label1, label2, label3;
21274d235b2SVaclav Hapla     PetscInt val;
21374d235b2SVaclav Hapla     PetscInt p, pStart, pEnd;
21474d235b2SVaclav Hapla 
2159566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label0", &label0));
2169566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label1", &label1));
2179566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label2", &label2));
2189566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label3", &label3));
21974d235b2SVaclav Hapla 
2209566063dSJacob Faibussowitsch     PetscCall(CheckLabelsNotSame(label0, label1));
2219566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label0, label2));
2229566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label1, label3));
22374d235b2SVaclav Hapla 
2249566063dSJacob Faibussowitsch     PetscCall(DMLabelGetDefaultValue(label1, &val));
2259566063dSJacob Faibussowitsch     PetscCall(DMLabelSetDefaultValue(label1, 333));
2269566063dSJacob Faibussowitsch     PetscCall(CheckLabelsNotSame(label1, label3));
2279566063dSJacob Faibussowitsch     PetscCall(DMLabelSetDefaultValue(label1, val));
2289566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label1, label3));
22974d235b2SVaclav Hapla 
2309566063dSJacob Faibussowitsch     PetscCall(DMLabelGetBounds(label1, &pStart, &pEnd));
23174d235b2SVaclav Hapla 
23274d235b2SVaclav Hapla     for (p = pStart; p < pEnd; p++) {
2339566063dSJacob Faibussowitsch       PetscCall(DMLabelGetValue(label1, p, &val));
23474d235b2SVaclav Hapla       // This is weird. Perhaps we should not need to call DMLabelClearValue()
2359566063dSJacob Faibussowitsch       PetscCall(DMLabelClearValue(label1, p, val));
23674d235b2SVaclav Hapla       val++;
2379566063dSJacob Faibussowitsch       PetscCall(DMLabelSetValue(label1, p, val));
23874d235b2SVaclav Hapla     }
2399566063dSJacob Faibussowitsch     PetscCall(CheckLabelsNotSame(label1, label3));
24074d235b2SVaclav Hapla     for (p = pStart; p < pEnd; p++) {
2419566063dSJacob Faibussowitsch       PetscCall(DMLabelGetValue(label1, p, &val));
24274d235b2SVaclav Hapla       // This is weird. Perhaps we should not need to call DMLabelClearValue()
2439566063dSJacob Faibussowitsch       PetscCall(DMLabelClearValue(label1, p, val));
24474d235b2SVaclav Hapla       val--;
2459566063dSJacob Faibussowitsch       PetscCall(DMLabelSetValue(label1, p, val));
24674d235b2SVaclav Hapla     }
2479566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label1, label3));
24874d235b2SVaclav Hapla 
2499566063dSJacob Faibussowitsch     PetscCall(DMLabelGetValue(label3, pEnd - 1, &val));
2509566063dSJacob Faibussowitsch     PetscCall(DMLabelSetValue(label3, pEnd, val));
2519566063dSJacob Faibussowitsch     PetscCall(CheckLabelsNotSame(label1, label3));
25274d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
2539566063dSJacob Faibussowitsch     PetscCall(DMLabelClearValue(label3, pEnd, val));
2549566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label1, label3));
25574d235b2SVaclav Hapla   }
25674d235b2SVaclav Hapla 
25774d235b2SVaclav Hapla   {
25874d235b2SVaclav Hapla     DM       dm1;
25974d235b2SVaclav Hapla     DMLabel  label02, label12;
26074d235b2SVaclav Hapla     PetscInt p = 0, val;
26174d235b2SVaclav Hapla 
2629566063dSJacob Faibussowitsch     PetscCall(CreateMesh("plex1", &dm1));
2639566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsNotSame(dm, dm1));
26474d235b2SVaclav Hapla 
2659566063dSJacob Faibussowitsch     PetscCall(DMCopyLabels(dm, dm1, PETSC_OWN_POINTER, PETSC_FALSE, DM_COPY_LABELS_REPLACE));
2669566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsSame(dm, dm1));
26774d235b2SVaclav Hapla 
2689566063dSJacob Faibussowitsch     PetscCall(DMCopyLabels(dm, dm1, PETSC_COPY_VALUES, PETSC_FALSE, DM_COPY_LABELS_REPLACE));
2699566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label2", &label02));
2709566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm1, "label2", &label12));
2719566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label02, label12));
27274d235b2SVaclav Hapla 
2739566063dSJacob Faibussowitsch     PetscCall(DMLabelGetValue(label12, p, &val));
27474d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
2759566063dSJacob Faibussowitsch     PetscCall(DMLabelClearValue(label12, p, val));
2769566063dSJacob Faibussowitsch     PetscCall(DMLabelSetValue(label12, p, val + 1));
2779566063dSJacob Faibussowitsch     PetscCall(CheckLabelsNotSame(label02, label12));
2789566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsNotSame(dm, dm1));
27974d235b2SVaclav Hapla 
28074d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
2819566063dSJacob Faibussowitsch     PetscCall(DMLabelClearValue(label12, p, val + 1));
2829566063dSJacob Faibussowitsch     PetscCall(DMLabelSetValue(label12, p, val));
2839566063dSJacob Faibussowitsch     PetscCall(CheckLabelsSame(label02, label12));
2849566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsSame(dm, dm1));
28574d235b2SVaclav Hapla 
2869566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)label12, "label12"));
2879566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsNotSame(dm, dm1));
2889566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)label12, "label2"));
2899566063dSJacob Faibussowitsch     PetscCall(CheckDMLabelsSame(dm, dm1));
29074d235b2SVaclav Hapla 
2919566063dSJacob Faibussowitsch     PetscCall(DMDestroy(&dm1));
29274d235b2SVaclav Hapla   }
293217f7fc6SMatthew G. Knepley   // Test adding strata and filtering
294217f7fc6SMatthew G. Knepley   {
295217f7fc6SMatthew G. Knepley     DMLabel  labelA, labelB;
296217f7fc6SMatthew G. Knepley     IS       valueIS;
297217f7fc6SMatthew G. Knepley     PetscInt pStart, pEnd, lStart = 5, lEnd = 19;
298217f7fc6SMatthew G. Knepley 
299217f7fc6SMatthew G. Knepley     PetscCall(DMPlexGetChart(dm, &pStart, &pEnd));
300217f7fc6SMatthew G. Knepley     PetscCall(DMCreateLabel(dm, "labelA"));
301217f7fc6SMatthew G. Knepley     PetscCall(DMCreateLabel(dm, "labelB"));
302217f7fc6SMatthew G. Knepley     PetscCall(DMGetLabel(dm, "labelA", &labelA));
303217f7fc6SMatthew G. Knepley     PetscCall(DMGetLabel(dm, "labelB", &labelB));
304217f7fc6SMatthew G. Knepley     for (PetscInt p = pStart; p < pEnd; ++p) {
305217f7fc6SMatthew G. Knepley       if (p < lStart || p >= lEnd) continue;
306217f7fc6SMatthew G. Knepley       if (p % 2) PetscCall(DMLabelSetValue(labelA, p, 19));
307217f7fc6SMatthew G. Knepley       else PetscCall(DMLabelSetValue(labelA, p, 17));
308217f7fc6SMatthew G. Knepley     }
309217f7fc6SMatthew G. Knepley     PetscCall(DMLabelGetValueIS(labelA, &valueIS));
310217f7fc6SMatthew G. Knepley     PetscCall(DMLabelAddStrataIS(labelA, valueIS));
311217f7fc6SMatthew G. Knepley     PetscCall(ISDestroy(&valueIS));
312217f7fc6SMatthew G. Knepley     for (PetscInt p = pStart; p < pEnd; ++p) {
313217f7fc6SMatthew G. Knepley       if (p % 2) PetscCall(DMLabelSetValue(labelB, p, 19));
314217f7fc6SMatthew G. Knepley       else PetscCall(DMLabelSetValue(labelB, p, 17));
315217f7fc6SMatthew G. Knepley     }
316217f7fc6SMatthew G. Knepley     PetscCall(DMLabelFilter(labelB, lStart, lEnd));
3173ba16761SJacob Faibussowitsch     PetscCall(CheckLabelsSame(labelA, labelB));
318217f7fc6SMatthew G. Knepley     PetscCall(DMRemoveLabel(dm, "labelA", NULL));
319217f7fc6SMatthew G. Knepley     PetscCall(DMRemoveLabel(dm, "labelB", NULL));
320217f7fc6SMatthew G. Knepley   }
32174d235b2SVaclav Hapla 
322c4762a1bSJed Brown   /* remove label0 and label1 just to test manual removal; let label3 be removed automatically by DMDestroy() */
323c4762a1bSJed Brown   {
324c4762a1bSJed Brown     DMLabel label0, label1, label2;
3259566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label0", &label0));
3269566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label1", &label1));
32728b400f6SJacob Faibussowitsch     PetscCheck(label0, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must not be NULL now");
32828b400f6SJacob Faibussowitsch     PetscCheck(label1, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must not be NULL now");
3299566063dSJacob Faibussowitsch     PetscCall(DMRemoveLabel(dm, "label1", NULL));
3309566063dSJacob Faibussowitsch     PetscCall(DMRemoveLabel(dm, "label2", &label2));
3319566063dSJacob Faibussowitsch     PetscCall(DMRemoveLabelBySelf(dm, &label0, PETSC_TRUE));
3329566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label0", &label0));
3339566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label1", &label1));
33428b400f6SJacob Faibussowitsch     PetscCheck(!label0, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must be NULL now");
33528b400f6SJacob Faibussowitsch     PetscCheck(!label1, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must be NULL now");
33628b400f6SJacob Faibussowitsch     PetscCheck(label2, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now");
3379566063dSJacob Faibussowitsch     PetscCall(DMRemoveLabelBySelf(dm, &label2, PETSC_FALSE)); /* this should do nothing */
33828b400f6SJacob Faibussowitsch     PetscCheck(label2, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now");
3399566063dSJacob Faibussowitsch     PetscCall(DMLabelDestroy(&label2));
3409566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "label2", &label2));
34128b400f6SJacob Faibussowitsch     PetscCheck(!label2, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must be NULL now");
342c4762a1bSJed Brown   }
343c4762a1bSJed Brown 
344217f7fc6SMatthew G. Knepley   PetscCall(TestEphemeralLabels(dm));
345217f7fc6SMatthew G. Knepley 
3469566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dm));
3479566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
348b122ec5aSJacob Faibussowitsch   return 0;
349c4762a1bSJed Brown }
350c4762a1bSJed Brown 
351c4762a1bSJed Brown /*TEST
352c4762a1bSJed Brown 
353c4762a1bSJed Brown   test:
354c4762a1bSJed Brown     suffix: 0
35574d235b2SVaclav Hapla     nsize: {{1 2}separate output}
35646ac1a18SMatthew G. Knepley     args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/blockcylinder-50.exo -interpolate
357c4762a1bSJed Brown     requires: exodusii
358c4762a1bSJed Brown 
359c4762a1bSJed Brown TEST*/
360