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