xref: /petsc/src/dm/label/tutorials/ex1.c (revision 0e03b746557e2551025fde0294144c0532d12f68)
1 static char help[] = "Tests DMLabel operations.\n\n";
2 
3 #include <petscdm.h>
4 #include <petscdmplex.h>
5 
6 PetscErrorCode ViewLabels(DM dm, PetscViewer viewer)
7 {
8   DMLabel        label;
9   IS             labelIS;
10   const char    *labelName;
11   PetscInt       numLabels, l;
12   PetscErrorCode ierr;
13 
14   PetscFunctionBegin;
15   /* query the number and name of labels*/
16   ierr = DMGetNumLabels(dm, &numLabels);CHKERRQ(ierr);
17   ierr = PetscViewerASCIIPrintf(viewer, "Number of labels: %d\n", numLabels);CHKERRQ(ierr);
18   for (l = 0; l < numLabels; ++l) {
19     ierr = DMGetLabelName(dm, l, &labelName);CHKERRQ(ierr);
20     ierr = PetscViewerASCIIPrintf(viewer, "Label %d: name: %s\n", l, labelName);CHKERRQ(ierr);
21     ierr = PetscViewerASCIIPrintf(viewer, "IS of values\n");CHKERRQ(ierr);
22     ierr = DMGetLabel(dm, labelName, &label);CHKERRQ(ierr);
23     ierr = DMLabelGetValueIS(label, &labelIS);CHKERRQ(ierr);
24     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
25     ierr = ISView(labelIS, viewer);CHKERRQ(ierr);
26     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
27     ierr = ISDestroy(&labelIS);CHKERRQ(ierr);
28     ierr = PetscViewerASCIIPrintf(viewer, "\n");CHKERRQ(ierr);
29   }
30   /* Making sure that string literals work */
31   ierr = PetscViewerASCIIPrintf(viewer,"\n\nCell Set label IS\n");CHKERRQ(ierr);
32   ierr = DMGetLabel(dm, "Cell Sets", &label);CHKERRQ(ierr);
33   if (label) {
34     ierr = DMLabelGetValueIS(label, &labelIS);CHKERRQ(ierr);
35     ierr = ISView(labelIS, viewer);CHKERRQ(ierr);
36     ierr = ISDestroy(&labelIS);CHKERRQ(ierr);
37   }
38   PetscFunctionReturn(0);
39 }
40 
41 int main(int argc, char **argv)
42 {
43   DM             dm, dmDist;
44   char           filename[PETSC_MAX_PATH_LEN]="";
45   PetscBool      interpolate = PETSC_FALSE;
46   PetscErrorCode ierr;
47 
48   /* initialize and get options */
49   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
50   ierr = PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "DMLabel ex1 Options", "DMLabel");CHKERRQ(ierr);
51   ierr = PetscOptionsString("-i", "filename to read", "ex1.c", filename, filename, sizeof(filename), NULL);CHKERRQ(ierr);
52   ierr = PetscOptionsBool("-interpolate", "Generate intermediate mesh elements", "ex1.c", interpolate, &interpolate, NULL);CHKERRQ(ierr);
53   ierr = PetscOptionsEnd();CHKERRQ(ierr);
54 
55   /* create and distribute DM */
56   ierr = DMPlexCreateFromFile(PETSC_COMM_WORLD, filename, interpolate, &dm);CHKERRQ(ierr);
57   ierr = DMPlexDistribute(dm, 0, NULL, &dmDist);CHKERRQ(ierr);
58   if (dmDist) {
59     ierr = DMDestroy(&dm);CHKERRQ(ierr);
60     dm   = dmDist;
61   }
62   ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
63 
64   /* add custom labels to test adding/removal */
65   {
66     DMLabel label0, label1, label2, label3;
67     PetscInt p, pStart, pEnd;
68     ierr = DMPlexGetChart(dm, &pStart, &pEnd);CHKERRQ(ierr);
69     /* create label in DM and get from DM */
70     ierr = DMCreateLabel(dm, "label0");CHKERRQ(ierr);
71     ierr = DMGetLabel(dm, "label0", &label0);CHKERRQ(ierr);
72     /* alternative: create standalone label and add to DM; needs to be destroyed */
73     ierr = DMLabelCreate(PETSC_COMM_SELF, "label1", &label1);CHKERRQ(ierr);
74     ierr = DMAddLabel(dm, label1);CHKERRQ(ierr);
75 
76     pEnd = pStart + (pEnd-pStart)/3; /* we will mark the first third of points */
77     for (p=pStart; p < pEnd; p++) {
78       ierr = DMLabelSetValue(label0, p, 1);CHKERRQ(ierr);
79       ierr = DMLabelSetValue(label1, p, 2);CHKERRQ(ierr);
80     }
81     /* duplicate label */
82     ierr = DMLabelDuplicate(label0, &label2);CHKERRQ(ierr);
83     ierr = DMLabelDuplicate(label1, &label3);CHKERRQ(ierr);
84     ierr = PetscObjectSetName((PetscObject)label2, "label2");CHKERRQ(ierr);
85     ierr = PetscObjectSetName((PetscObject)label3, "label3");CHKERRQ(ierr);
86     ierr = DMAddLabel(dm, label2);CHKERRQ(ierr);
87     ierr = DMAddLabel(dm, label3);CHKERRQ(ierr);
88     /* remove the labels in this scope */
89     ierr = DMLabelDestroy(&label1);CHKERRQ(ierr);
90     ierr = DMLabelDestroy(&label2);CHKERRQ(ierr);
91     ierr = DMLabelDestroy(&label3);CHKERRQ(ierr);
92   }
93 
94   ierr = ViewLabels(dm, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
95 
96   /* remove label0 and label1 just to test manual removal; let label3 be removed automatically by DMDestroy() */
97   {
98     DMLabel label0, label1, label2;
99     ierr = DMGetLabel(dm, "label0", &label0);CHKERRQ(ierr);
100     ierr = DMGetLabel(dm, "label1", &label1);CHKERRQ(ierr);
101     if (!label0) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must not be NULL now");
102     if (!label1) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must not be NULL now");
103     ierr = DMRemoveLabel(dm, "label1", NULL);CHKERRQ(ierr);
104     ierr = DMRemoveLabel(dm, "label2", &label2);CHKERRQ(ierr);
105     ierr = DMRemoveLabelBySelf(dm, &label0, PETSC_TRUE);CHKERRQ(ierr);
106     ierr = DMGetLabel(dm, "label0", &label0);CHKERRQ(ierr);
107     ierr = DMGetLabel(dm, "label1", &label1);CHKERRQ(ierr);
108     if (label0) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label0 must be NULL now");
109     if (label1) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label1 must be NULL now");
110     if (!label2) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now");
111     ierr = DMRemoveLabelBySelf(dm, &label2, PETSC_FALSE);CHKERRQ(ierr); /* this should do nothing */
112     if (!label2) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must not be NULL now");
113     ierr = DMLabelDestroy(&label2);CHKERRQ(ierr);
114     ierr = DMGetLabel(dm, "label2", &label2);CHKERRQ(ierr);
115     if (label2) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "label2 must be NULL now");
116   }
117 
118   ierr = DMDestroy(&dm);CHKERRQ(ierr);
119   ierr = PetscFinalize();
120   return ierr;
121 }
122 
123 /*TEST
124 
125   test:
126     suffix: 0
127     args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/blockcylinder-50.exo -interpolate
128     requires: exodusii
129 
130 TEST*/
131