xref: /petsc/src/dm/impls/plex/tests/ex6.c (revision 030f984af8d8bb4c203755d35bded3c05b3d83ce)
1 static char help[] = "Tests for DMLabel lookup\n\n";
2 
3 #include <petscdmplex.h>
4 
5 typedef struct {
6   PetscInt  debug;        /* The debugging level */
7   PetscInt  pStart, pEnd; /* The label chart */
8   PetscInt  numStrata;    /* The number of label strata */
9   PetscReal fill;         /* Percentage of label to fill */
10   PetscInt  size;         /* The number of set values */
11 } AppCtx;
12 
13 PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
14 {
15   PetscErrorCode ierr;
16 
17   PetscFunctionBegin;
18   options->debug     = 0;
19   options->pStart    = 0;
20   options->pEnd      = 1000;
21   options->numStrata = 5;
22   options->fill      = 0.10;
23 
24   ierr = PetscOptionsBegin(comm, "", "Meshing Problem Options", "DMPLEX");CHKERRQ(ierr);
25   ierr = PetscOptionsBoundedInt("-debug", "The debugging level", "ex6.c", options->debug, &options->debug, NULL,0);CHKERRQ(ierr);
26   ierr = PetscOptionsBoundedInt("-num_strata", "The number of label values", "ex6.c", options->numStrata, &options->numStrata, NULL,0);CHKERRQ(ierr);
27   ierr = PetscOptionsBoundedInt("-pend", "The label point limit", "ex6.c", options->pEnd, &options->pEnd, NULL,0);CHKERRQ(ierr);
28   ierr = PetscOptionsReal("-fill", "The percentage of label chart to set", "ex6.c", options->fill, &options->fill, NULL);CHKERRQ(ierr);
29   ierr = PetscOptionsEnd();CHKERRQ(ierr);
30   PetscFunctionReturn(0);
31 }
32 
33 PetscErrorCode TestSetup(DMLabel label, AppCtx *user)
34 {
35   PetscRandom    r;
36   PetscInt       n = (PetscInt) (user->fill*(user->pEnd - user->pStart)), i;
37   PetscErrorCode ierr;
38 
39   PetscFunctionBegin;
40   ierr = PetscRandomCreate(PETSC_COMM_SELF, &r);CHKERRQ(ierr);
41   ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr);/* -random_type <> */
42   ierr = PetscRandomSetInterval(r, user->pStart, user->pEnd);CHKERRQ(ierr);
43   ierr = PetscRandomSetSeed(r, 123456789L);CHKERRQ(ierr);
44   ierr = PetscRandomSeed(r);CHKERRQ(ierr);
45   user->size = 0;
46   for (i = 0; i < n; ++i) {
47     PetscReal p;
48     PetscInt  val;
49 
50     ierr = PetscRandomGetValueReal(r, &p);CHKERRQ(ierr);
51     ierr = DMLabelGetValue(label, (PetscInt) p, &val);CHKERRQ(ierr);
52     if (val < 0) {
53       ++user->size;
54       ierr = DMLabelSetValue(label, (PetscInt) p, i % user->numStrata);CHKERRQ(ierr);
55     }
56   }
57   ierr = PetscRandomDestroy(&r);CHKERRQ(ierr);
58   ierr = DMLabelCreateIndex(label, user->pStart, user->pEnd);CHKERRQ(ierr);
59   ierr = PetscPrintf(PETSC_COMM_SELF, "Created label with chart [%D, %D) and set %D values\n", user->pStart, user->pEnd, user->size);CHKERRQ(ierr);
60   PetscFunctionReturn(0);
61 }
62 
63 PetscErrorCode TestLookup(DMLabel label, AppCtx *user)
64 {
65   const PetscInt pStart = user->pStart;
66   const PetscInt pEnd   = user->pEnd;
67   PetscInt       p, n = 0;
68   PetscErrorCode ierr;
69 
70   PetscFunctionBegin;
71   for (p = pStart; p < pEnd; ++p) {
72     PetscInt  val;
73     PetscBool has;
74 
75     ierr = DMLabelGetValue(label, p, &val);CHKERRQ(ierr);
76     ierr = DMLabelHasPoint(label, p, &has);CHKERRQ(ierr);
77     if (((val >= 0) && !has) || ((val < 0) && has)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Label value %D does not match contains check %D for point %D", val, (PetscInt) has, p);
78     if (has) ++n;
79   }
80   if (n != user->size) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid number of label points detected %D does not match number set %D", n, user->size);
81   /* Also put in timing code */
82   PetscFunctionReturn(0);
83 }
84 
85 PetscErrorCode TestClear(DMLabel label, AppCtx *user)
86 {
87   PetscInt       pStart = user->pStart, pEnd = user->pEnd, p;
88   PetscInt       defaultValue;
89   PetscErrorCode ierr;
90 
91   PetscFunctionBegin;
92   ierr = DMLabelGetDefaultValue(label,&defaultValue);CHKERRQ(ierr);
93   for (p = pStart; p < pEnd; p++) {
94     PetscInt  val;
95     PetscBool hasPoint;
96 
97     ierr = DMLabelGetValue(label,p,&val);CHKERRQ(ierr);
98     if (val != defaultValue) {
99       ierr = DMLabelClearValue(label,p,val);CHKERRQ(ierr);
100     }
101     ierr = DMLabelGetValue(label,p,&val);CHKERRQ(ierr);
102     ierr = DMLabelHasPoint(label,p,&hasPoint);CHKERRQ(ierr);
103     if (val != defaultValue) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Expected default value %D after clearing point %D, got %D",defaultValue,p,val);
104     if (hasPoint) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Label contains %D after clearing",p);
105   }
106   PetscFunctionReturn(0);
107 }
108 
109 int main(int argc, char **argv)
110 {
111   DMLabel        label;
112   AppCtx         user;                 /* user-defined work context */
113   PetscErrorCode ierr;
114 
115   ierr = PetscInitialize(&argc, &argv, NULL,help);if (ierr) return ierr;
116   ierr = ProcessOptions(PETSC_COMM_WORLD, &user);CHKERRQ(ierr);
117   ierr = DMLabelCreate(PETSC_COMM_SELF, "Test Label", &label);CHKERRQ(ierr);
118   ierr = TestSetup(label, &user);CHKERRQ(ierr);
119   ierr = TestLookup(label, &user);CHKERRQ(ierr);
120   ierr = TestClear(label,&user);CHKERRQ(ierr);
121   ierr = DMLabelDestroy(&label);CHKERRQ(ierr);
122   ierr = PetscFinalize();
123   return ierr;
124 }
125 
126 /*TEST
127 
128   test:
129     suffix: 0
130     args: -malloc_dump
131   test:
132     suffix: 1
133     args: -malloc_dump -pend 10000
134   test:
135     suffix: 2
136     args: -malloc_dump -pend 10000 -fill 0.05
137   test:
138     suffix: 3
139     args: -malloc_dump -pend 10000 -fill 0.25
140 
141 TEST*/
142