xref: /petsc/src/dm/label/tutorials/ex1.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
1c4762a1bSJed Brown static char help[] = "Tests DMLabel operations.\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscdm.h>
4c4762a1bSJed Brown #include <petscdmplex.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown PetscErrorCode ViewLabels(DM dm, PetscViewer viewer)
7c4762a1bSJed Brown {
8c4762a1bSJed Brown   DMLabel        label;
9c4762a1bSJed Brown   const char    *labelName;
10c4762a1bSJed Brown   PetscInt       numLabels, l;
11c4762a1bSJed Brown 
12c4762a1bSJed Brown   PetscFunctionBegin;
13c4762a1bSJed Brown   /* query the number and name of labels*/
14*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetNumLabels(dm, &numLabels));
15*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer, "Number of labels: %d\n", numLabels));
16c4762a1bSJed Brown   for (l = 0; l < numLabels; ++l) {
1774d235b2SVaclav Hapla     IS labelIS, tmpIS;
1874d235b2SVaclav Hapla 
19*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabelName(dm, l, &labelName));
20*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer, "Label %d: name: %s\n", l, labelName));
21*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer, "IS of values\n"));
22*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, labelName, &label));
23*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetValueIS(label, &labelIS));
24*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISOnComm(labelIS, PetscObjectComm((PetscObject)viewer), PETSC_USE_POINTER, &tmpIS));
25*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPushTab(viewer));
26*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISView(tmpIS, viewer));
27*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPopTab(viewer));
28*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISDestroy(&tmpIS));
29*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISDestroy(&labelIS));
30*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer, "\n"));
31c4762a1bSJed Brown   }
32c4762a1bSJed Brown   /* Making sure that string literals work */
33*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"\n\nCell Set label IS\n"));
34*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetLabel(dm, "Cell Sets", &label));
35c4762a1bSJed Brown   if (label) {
3674d235b2SVaclav Hapla     IS labelIS, tmpIS;
3774d235b2SVaclav Hapla 
38*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetValueIS(label, &labelIS));
39*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISOnComm(labelIS, PetscObjectComm((PetscObject)viewer), PETSC_USE_POINTER, &tmpIS));
40*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISView(tmpIS, viewer));
41*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISDestroy(&tmpIS));
42*5f80ce2aSJacob Faibussowitsch     CHKERRQ(ISDestroy(&labelIS));
43c4762a1bSJed Brown   }
44c4762a1bSJed Brown   PetscFunctionReturn(0);
45c4762a1bSJed Brown }
46c4762a1bSJed Brown 
4774d235b2SVaclav Hapla PetscErrorCode CheckLabelsSame(DMLabel label0, DMLabel label1)
4874d235b2SVaclav Hapla {
4974d235b2SVaclav Hapla   const char     *name0, *name1;
5074d235b2SVaclav Hapla   PetscBool       same;
5174d235b2SVaclav Hapla   char           *msg;
5274d235b2SVaclav Hapla 
5374d235b2SVaclav Hapla   PetscFunctionBegin;
54*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName((PetscObject)label0, &name0));
55*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName((PetscObject)label1, &name1));
56*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelCompare(PETSC_COMM_WORLD, label0, label1, &same, &msg));
572c71b3e2SJacob Faibussowitsch   PetscCheckFalse(same != (PetscBool) !msg,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMLabelCompare returns inconsistent same=%d msg=\"%s\"", same, msg);
582c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!same,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels \"%s\" and \"%s\" should not differ! Message:\n%s", name0, name1, msg);
5974d235b2SVaclav Hapla   /* Test passing NULL, must not fail */
60*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelCompare(PETSC_COMM_WORLD, label0, label1, NULL, NULL));
61*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(msg));
6274d235b2SVaclav Hapla   PetscFunctionReturn(0);
6374d235b2SVaclav Hapla }
6474d235b2SVaclav Hapla 
6574d235b2SVaclav Hapla PetscErrorCode CheckLabelsNotSame(DMLabel label0, DMLabel label1)
6674d235b2SVaclav Hapla {
6774d235b2SVaclav Hapla   const char     *name0, *name1;
6874d235b2SVaclav Hapla   PetscBool       same;
6974d235b2SVaclav Hapla   char           *msg;
7074d235b2SVaclav Hapla 
7174d235b2SVaclav Hapla   PetscFunctionBegin;
72*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName((PetscObject)label0, &name0));
73*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName((PetscObject)label1, &name1));
74*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelCompare(PETSC_COMM_WORLD, label0, label1, &same, &msg));
752c71b3e2SJacob Faibussowitsch   PetscCheckFalse(same != (PetscBool) !msg,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMLabelCompare returns inconsistent same=%d msg=\"%s\"", same, msg);
762c71b3e2SJacob Faibussowitsch   PetscCheckFalse(same,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels \"%s\" and \"%s\" should differ!", name0, name1);
77*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD, "Compare label \"%s\" with \"%s\": %s\n", name0, name1, msg));
78*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(msg));
7974d235b2SVaclav Hapla   PetscFunctionReturn(0);
8074d235b2SVaclav Hapla }
8174d235b2SVaclav Hapla 
8274d235b2SVaclav Hapla PetscErrorCode CheckDMLabelsSame(DM dm0, DM dm1)
8374d235b2SVaclav Hapla {
8474d235b2SVaclav Hapla   const char     *name0, *name1;
8574d235b2SVaclav Hapla   PetscBool       same;
8674d235b2SVaclav Hapla   char           *msg;
8774d235b2SVaclav Hapla 
8874d235b2SVaclav Hapla   PetscFunctionBegin;
89*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName((PetscObject)dm0, &name0));
90*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName((PetscObject)dm1, &name1));
91*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCompareLabels(dm0, dm1, &same, &msg));
922c71b3e2SJacob Faibussowitsch   PetscCheckFalse(same != (PetscBool) !msg,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMCompareLabels returns inconsistent same=%d msg=\"%s\"", same, msg);
932c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!same,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels of DMs \"%s\" and \"%s\" should not differ! Message:\n%s", name0, name1, msg);
9474d235b2SVaclav Hapla   /* Test passing NULL, must not fail */
95*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCompareLabels(dm0, dm1, NULL, NULL));
96*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(msg));
9774d235b2SVaclav Hapla   PetscFunctionReturn(0);
9874d235b2SVaclav Hapla }
9974d235b2SVaclav Hapla 
10074d235b2SVaclav Hapla PetscErrorCode CheckDMLabelsNotSame(DM dm0, DM dm1)
10174d235b2SVaclav Hapla {
10274d235b2SVaclav Hapla   const char     *name0, *name1;
10374d235b2SVaclav Hapla   PetscBool       same;
10474d235b2SVaclav Hapla   char           *msg;
10574d235b2SVaclav Hapla 
10674d235b2SVaclav Hapla   PetscFunctionBegin;
107*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName((PetscObject)dm0, &name0));
108*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName((PetscObject)dm1, &name1));
109*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCompareLabels(dm0, dm1, &same, &msg));
1102c71b3e2SJacob Faibussowitsch   PetscCheckFalse(same != (PetscBool) !msg,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "DMCompareLabels returns inconsistent same=%d msg=\"%s\"", same, msg);
1112c71b3e2SJacob Faibussowitsch   PetscCheckFalse(same,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Labels of DMs \"%s\" and \"%s\" should differ!", name0, name1);
112*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD, "Labels of DMs \"%s\" and \"%s\" differ: %s\n", name0, name1, msg));
113*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(msg));
11474d235b2SVaclav Hapla   PetscFunctionReturn(0);
11574d235b2SVaclav Hapla }
11674d235b2SVaclav Hapla 
11774d235b2SVaclav Hapla PetscErrorCode CreateMesh(const char name[], DM *newdm)
118c4762a1bSJed Brown {
119c4762a1bSJed Brown   DM             dm, dmDist;
120c4762a1bSJed Brown   char           filename[PETSC_MAX_PATH_LEN]="";
121c4762a1bSJed Brown   PetscBool      interpolate = PETSC_FALSE;
122c4762a1bSJed Brown   PetscErrorCode ierr;
123c4762a1bSJed Brown 
12474d235b2SVaclav Hapla   PetscFunctionBegin;
125c4762a1bSJed Brown   /* initialize and get options */
126c4762a1bSJed Brown   ierr = PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "DMLabel ex1 Options", "DMLabel");CHKERRQ(ierr);
127*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsString("-i", "filename to read", "ex1.c", filename, filename, sizeof(filename), NULL));
128*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-interpolate", "Generate intermediate mesh elements", "ex1.c", interpolate, &interpolate, NULL));
129c4762a1bSJed Brown   ierr = PetscOptionsEnd();CHKERRQ(ierr);
130c4762a1bSJed Brown 
131c4762a1bSJed Brown   /* create and distribute DM */
132*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexCreateFromFile(PETSC_COMM_WORLD, filename, "ex1_plex", interpolate, &dm));
133*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexDistribute(dm, 0, NULL, &dmDist));
134c4762a1bSJed Brown   if (dmDist) {
135*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMDestroy(&dm));
136c4762a1bSJed Brown     dm   = dmDist;
137c4762a1bSJed Brown   }
138*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetFromOptions(dm));
139*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject)dm, name));
14074d235b2SVaclav Hapla   *newdm = dm;
14174d235b2SVaclav Hapla   PetscFunctionReturn(0);
14274d235b2SVaclav Hapla }
143c4762a1bSJed Brown 
14474d235b2SVaclav Hapla int main(int argc, char **argv)
14574d235b2SVaclav Hapla {
14674d235b2SVaclav Hapla   DM             dm;
14774d235b2SVaclav Hapla   PetscErrorCode ierr;
14874d235b2SVaclav Hapla 
14974d235b2SVaclav Hapla   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
150*5f80ce2aSJacob Faibussowitsch   CHKERRQ(CreateMesh("plex0", &dm));
151c4762a1bSJed Brown   /* add custom labels to test adding/removal */
152c4762a1bSJed Brown   {
153c4762a1bSJed Brown     DMLabel label0, label1, label2, label3;
154c4762a1bSJed Brown     PetscInt p, pStart, pEnd;
155*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexGetChart(dm, &pStart, &pEnd));
156c4762a1bSJed Brown     /* create label in DM and get from DM */
157*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCreateLabel(dm, "label0"));
158*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, "label0", &label0));
159c4762a1bSJed Brown     /* alternative: create standalone label and add to DM; needs to be destroyed */
160*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelCreate(PETSC_COMM_SELF, "label1", &label1));
161*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMAddLabel(dm, label1));
162c4762a1bSJed Brown 
16374d235b2SVaclav Hapla     pEnd = PetscMin(pEnd, pStart + 5);
164c4762a1bSJed Brown     for (p=pStart; p < pEnd; p++) {
165*5f80ce2aSJacob Faibussowitsch       CHKERRQ(DMLabelSetValue(label0, p, 1));
166*5f80ce2aSJacob Faibussowitsch       CHKERRQ(DMLabelSetValue(label1, p, 2));
167c4762a1bSJed Brown     }
168c4762a1bSJed Brown     /* duplicate label */
169*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelDuplicate(label0, &label2));
170*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelDuplicate(label1, &label3));
171*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectSetName((PetscObject)label2, "label2"));
172*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectSetName((PetscObject)label3, "label3"));
173*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMAddLabel(dm, label2));
174*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMAddLabel(dm, label3));
175c4762a1bSJed Brown     /* remove the labels in this scope */
176*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelDestroy(&label1));
177*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelDestroy(&label2));
178*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelDestroy(&label3));
179c4762a1bSJed Brown   }
180c4762a1bSJed Brown 
181*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ViewLabels(dm, PETSC_VIEWER_STDOUT_WORLD));
182c4762a1bSJed Brown 
18374d235b2SVaclav Hapla   /* do label perturbations and comparisons */
18474d235b2SVaclav Hapla   {
18574d235b2SVaclav Hapla     DMLabel   label0, label1, label2, label3;
18674d235b2SVaclav Hapla     PetscInt  val;
18774d235b2SVaclav Hapla     PetscInt  p, pStart, pEnd;
18874d235b2SVaclav Hapla 
189*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, "label0", &label0));
190*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, "label1", &label1));
191*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, "label2", &label2));
192*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, "label3", &label3));
19374d235b2SVaclav Hapla 
194*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsNotSame(label0, label1));
195*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsSame(label0, label2));
196*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsSame(label1, label3));
19774d235b2SVaclav Hapla 
198*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetDefaultValue(label1, &val));
199*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelSetDefaultValue(label1, 333));
200*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsNotSame(label1, label3));
201*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelSetDefaultValue(label1, val));
202*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsSame(label1, label3));
20374d235b2SVaclav Hapla 
204*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetBounds(label1, &pStart, &pEnd));
20574d235b2SVaclav Hapla 
20674d235b2SVaclav Hapla     for (p=pStart; p<pEnd; p++) {
207*5f80ce2aSJacob Faibussowitsch       CHKERRQ(DMLabelGetValue(label1, p, &val));
20874d235b2SVaclav Hapla       // This is weird. Perhaps we should not need to call DMLabelClearValue()
209*5f80ce2aSJacob Faibussowitsch       CHKERRQ(DMLabelClearValue(label1, p, val));
21074d235b2SVaclav Hapla       val++;
211*5f80ce2aSJacob Faibussowitsch       CHKERRQ(DMLabelSetValue(label1, p, val));
21274d235b2SVaclav Hapla     }
213*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsNotSame(label1, label3));
21474d235b2SVaclav Hapla     for (p=pStart; p<pEnd; p++) {
215*5f80ce2aSJacob Faibussowitsch       CHKERRQ(DMLabelGetValue(label1, p, &val));
21674d235b2SVaclav Hapla       // This is weird. Perhaps we should not need to call DMLabelClearValue()
217*5f80ce2aSJacob Faibussowitsch       CHKERRQ(DMLabelClearValue(label1, p, val));
21874d235b2SVaclav Hapla       val--;
219*5f80ce2aSJacob Faibussowitsch       CHKERRQ(DMLabelSetValue(label1, p, val));
22074d235b2SVaclav Hapla     }
221*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsSame(label1, label3));
22274d235b2SVaclav Hapla 
223*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetValue(label3, pEnd-1, &val));
224*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelSetValue(label3, pEnd, val));
225*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsNotSame(label1, label3));
22674d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
227*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelClearValue(label3, pEnd, val));
228*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsSame(label1, label3));
22974d235b2SVaclav Hapla   }
23074d235b2SVaclav Hapla 
23174d235b2SVaclav Hapla   {
23274d235b2SVaclav Hapla     DM        dm1;
23374d235b2SVaclav Hapla     DMLabel   label02, label12;
23474d235b2SVaclav Hapla     PetscInt  p = 0, val;
23574d235b2SVaclav Hapla 
236*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CreateMesh("plex1", &dm1));
237*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckDMLabelsNotSame(dm, dm1));
23874d235b2SVaclav Hapla 
239*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCopyLabels(dm, dm1, PETSC_OWN_POINTER, PETSC_FALSE, DM_COPY_LABELS_REPLACE));
240*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckDMLabelsSame(dm, dm1));
24174d235b2SVaclav Hapla 
242*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCopyLabels(dm, dm1, PETSC_COPY_VALUES, PETSC_FALSE, DM_COPY_LABELS_REPLACE));
243*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, "label2", &label02));
244*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm1, "label2", &label12));
245*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsSame(label02, label12));
24674d235b2SVaclav Hapla 
247*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetValue(label12, p, &val));
24874d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
249*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelClearValue(label12, p, val));
250*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelSetValue(label12, p, val+1));
251*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsNotSame(label02, label12));
252*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckDMLabelsNotSame(dm, dm1));
25374d235b2SVaclav Hapla 
25474d235b2SVaclav Hapla     // This is weird. Perhaps we should not need to call DMLabelClearValue()
255*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelClearValue(label12, p, val+1));
256*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelSetValue(label12, p, val));
257*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckLabelsSame(label02, label12));
258*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckDMLabelsSame(dm, dm1));
25974d235b2SVaclav Hapla 
260*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectSetName((PetscObject)label12, "label12"));
261*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckDMLabelsNotSame(dm, dm1));
262*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectSetName((PetscObject)label12, "label2"));
263*5f80ce2aSJacob Faibussowitsch     CHKERRQ(CheckDMLabelsSame(dm, dm1));
26474d235b2SVaclav Hapla 
265*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMDestroy(&dm1));
26674d235b2SVaclav Hapla   }
26774d235b2SVaclav Hapla 
268c4762a1bSJed Brown   /* remove label0 and label1 just to test manual removal; let label3 be removed automatically by DMDestroy() */
269c4762a1bSJed Brown   {
270c4762a1bSJed Brown     DMLabel label0, label1, label2;
271*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, "label0", &label0));
272*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, "label1", &label1));
2732c71b3e2SJacob Faibussowitsch     PetscCheckFalse(!label0,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must not be NULL now");
2742c71b3e2SJacob Faibussowitsch     PetscCheckFalse(!label1,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must not be NULL now");
275*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMRemoveLabel(dm, "label1", NULL));
276*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMRemoveLabel(dm, "label2", &label2));
277*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMRemoveLabelBySelf(dm, &label0, PETSC_TRUE));
278*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, "label0", &label0));
279*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, "label1", &label1));
2802c71b3e2SJacob Faibussowitsch     PetscCheckFalse(label0,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must be NULL now");
2812c71b3e2SJacob Faibussowitsch     PetscCheckFalse(label1,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must be NULL now");
2822c71b3e2SJacob Faibussowitsch     PetscCheckFalse(!label2,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now");
283*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMRemoveLabelBySelf(dm, &label2, PETSC_FALSE)); /* this should do nothing */
2842c71b3e2SJacob Faibussowitsch     PetscCheckFalse(!label2,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now");
285*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelDestroy(&label2));
286*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetLabel(dm, "label2", &label2));
2872c71b3e2SJacob Faibussowitsch     PetscCheckFalse(label2,PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must be NULL now");
288c4762a1bSJed Brown   }
289c4762a1bSJed Brown 
290*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&dm));
291c4762a1bSJed Brown   ierr = PetscFinalize();
292c4762a1bSJed Brown   return ierr;
293c4762a1bSJed Brown }
294c4762a1bSJed Brown 
295c4762a1bSJed Brown /*TEST
296c4762a1bSJed Brown 
297c4762a1bSJed Brown   test:
298c4762a1bSJed Brown     suffix: 0
29974d235b2SVaclav Hapla     nsize: {{1 2}separate output}
300c4762a1bSJed Brown     args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/blockcylinder-50.exo -interpolate
301c4762a1bSJed Brown     requires: exodusii
302c4762a1bSJed Brown 
303c4762a1bSJed Brown TEST*/
304