xref: /petsc/src/dm/impls/plex/tests/ex6.c (revision 1e1ea65d8de51fde77ce8a787efbef25e407badc)
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);
25c4762a1bSJed Brown   ierr = PetscOptionsBoundedInt("-debug", "The debugging level", "ex6.c", options->debug, &options->debug, NULL,0);CHKERRQ(ierr);
26c4762a1bSJed Brown   ierr = PetscOptionsBoundedInt("-num_strata", "The number of label values", "ex6.c", options->numStrata, &options->numStrata, NULL,0);CHKERRQ(ierr);
27c4762a1bSJed Brown   ierr = PetscOptionsBoundedInt("-pend", "The label point limit", "ex6.c", options->pEnd, &options->pEnd, NULL,0);CHKERRQ(ierr);
28c4762a1bSJed Brown   ierr = PetscOptionsReal("-fill", "The percentage of label chart to set", "ex6.c", options->fill, &options->fill, NULL);CHKERRQ(ierr);
29*1e1ea65dSPierre 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   PetscErrorCode ierr;
38c4762a1bSJed Brown 
39c4762a1bSJed Brown   PetscFunctionBegin;
40c4762a1bSJed Brown   ierr = PetscRandomCreate(PETSC_COMM_SELF, &r);CHKERRQ(ierr);
41c4762a1bSJed Brown   ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr);/* -random_type <> */
42c4762a1bSJed Brown   ierr = PetscRandomSetInterval(r, user->pStart, user->pEnd);CHKERRQ(ierr);
43c4762a1bSJed Brown   ierr = PetscRandomSetSeed(r, 123456789L);CHKERRQ(ierr);
44c4762a1bSJed Brown   ierr = PetscRandomSeed(r);CHKERRQ(ierr);
45c4762a1bSJed Brown   user->size = 0;
46c4762a1bSJed Brown   for (i = 0; i < n; ++i) {
47c4762a1bSJed Brown     PetscReal p;
48c4762a1bSJed Brown     PetscInt  val;
49c4762a1bSJed Brown 
50c4762a1bSJed Brown     ierr = PetscRandomGetValueReal(r, &p);CHKERRQ(ierr);
51c4762a1bSJed Brown     ierr = DMLabelGetValue(label, (PetscInt) p, &val);CHKERRQ(ierr);
52c4762a1bSJed Brown     if (val < 0) {
53c4762a1bSJed Brown       ++user->size;
54c4762a1bSJed Brown       ierr = DMLabelSetValue(label, (PetscInt) p, i % user->numStrata);CHKERRQ(ierr);
55c4762a1bSJed Brown     }
56c4762a1bSJed Brown   }
57c4762a1bSJed Brown   ierr = PetscRandomDestroy(&r);CHKERRQ(ierr);
58c4762a1bSJed Brown   ierr = DMLabelCreateIndex(label, user->pStart, user->pEnd);CHKERRQ(ierr);
59c4762a1bSJed Brown   ierr = PetscPrintf(PETSC_COMM_SELF, "Created label with chart [%D, %D) and set %D values\n", user->pStart, user->pEnd, user->size);CHKERRQ(ierr);
60c4762a1bSJed Brown   PetscFunctionReturn(0);
61c4762a1bSJed Brown }
62c4762a1bSJed Brown 
63c4762a1bSJed Brown PetscErrorCode TestLookup(DMLabel label, AppCtx *user)
64c4762a1bSJed Brown {
65c4762a1bSJed Brown   const PetscInt pStart = user->pStart;
66c4762a1bSJed Brown   const PetscInt pEnd   = user->pEnd;
67c4762a1bSJed Brown   PetscInt       p, n = 0;
68c4762a1bSJed Brown   PetscErrorCode ierr;
69c4762a1bSJed Brown 
70c4762a1bSJed Brown   PetscFunctionBegin;
71c4762a1bSJed Brown   for (p = pStart; p < pEnd; ++p) {
72c4762a1bSJed Brown     PetscInt  val;
73c4762a1bSJed Brown     PetscBool has;
74c4762a1bSJed Brown 
75c4762a1bSJed Brown     ierr = DMLabelGetValue(label, p, &val);CHKERRQ(ierr);
76c4762a1bSJed Brown     ierr = DMLabelHasPoint(label, p, &has);CHKERRQ(ierr);
77c4762a1bSJed Brown     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);
78c4762a1bSJed Brown     if (has) ++n;
79c4762a1bSJed Brown   }
80c4762a1bSJed Brown   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);
81c4762a1bSJed Brown   /* Also put in timing code */
82c4762a1bSJed Brown   PetscFunctionReturn(0);
83c4762a1bSJed Brown }
84c4762a1bSJed Brown 
85c4762a1bSJed Brown PetscErrorCode TestClear(DMLabel label, AppCtx *user)
86c4762a1bSJed Brown {
87c4762a1bSJed Brown   PetscInt       pStart = user->pStart, pEnd = user->pEnd, p;
88c4762a1bSJed Brown   PetscInt       defaultValue;
89c4762a1bSJed Brown   PetscErrorCode ierr;
90c4762a1bSJed Brown 
91c4762a1bSJed Brown   PetscFunctionBegin;
92c4762a1bSJed Brown   ierr = DMLabelGetDefaultValue(label,&defaultValue);CHKERRQ(ierr);
93c4762a1bSJed Brown   for (p = pStart; p < pEnd; p++) {
94c4762a1bSJed Brown     PetscInt  val;
95c4762a1bSJed Brown     PetscBool hasPoint;
96c4762a1bSJed Brown 
97c4762a1bSJed Brown     ierr = DMLabelGetValue(label,p,&val);CHKERRQ(ierr);
98c4762a1bSJed Brown     if (val != defaultValue) {
99c4762a1bSJed Brown       ierr = DMLabelClearValue(label,p,val);CHKERRQ(ierr);
100c4762a1bSJed Brown     }
101c4762a1bSJed Brown     ierr = DMLabelGetValue(label,p,&val);CHKERRQ(ierr);
102c4762a1bSJed Brown     ierr = DMLabelHasPoint(label,p,&hasPoint);CHKERRQ(ierr);
103c4762a1bSJed Brown     if (val != defaultValue) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Expected default value %D after clearing point %D, got %D",defaultValue,p,val);
104c4762a1bSJed Brown     if (hasPoint) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Label contains %D after clearing",p);
105c4762a1bSJed Brown   }
106c4762a1bSJed Brown   PetscFunctionReturn(0);
107c4762a1bSJed Brown }
108c4762a1bSJed Brown 
109c4762a1bSJed Brown int main(int argc, char **argv)
110c4762a1bSJed Brown {
111c4762a1bSJed Brown   DMLabel        label;
112c4762a1bSJed Brown   AppCtx         user;                 /* user-defined work context */
113c4762a1bSJed Brown   PetscErrorCode ierr;
114c4762a1bSJed Brown 
115c4762a1bSJed Brown   ierr = PetscInitialize(&argc, &argv, NULL,help);if (ierr) return ierr;
116c4762a1bSJed Brown   ierr = ProcessOptions(PETSC_COMM_WORLD, &user);CHKERRQ(ierr);
117c4762a1bSJed Brown   ierr = DMLabelCreate(PETSC_COMM_SELF, "Test Label", &label);CHKERRQ(ierr);
118c4762a1bSJed Brown   ierr = TestSetup(label, &user);CHKERRQ(ierr);
119c4762a1bSJed Brown   ierr = TestLookup(label, &user);CHKERRQ(ierr);
120c4762a1bSJed Brown   ierr = TestClear(label,&user);CHKERRQ(ierr);
121c4762a1bSJed Brown   ierr = DMLabelDestroy(&label);CHKERRQ(ierr);
122c4762a1bSJed Brown   ierr = PetscFinalize();
123c4762a1bSJed Brown   return ierr;
124c4762a1bSJed Brown }
125c4762a1bSJed Brown 
126c4762a1bSJed Brown /*TEST
127c4762a1bSJed Brown 
128c4762a1bSJed Brown   test:
129c4762a1bSJed Brown     suffix: 0
130c4762a1bSJed Brown     args: -malloc_dump
131c4762a1bSJed Brown   test:
132c4762a1bSJed Brown     suffix: 1
133c4762a1bSJed Brown     args: -malloc_dump -pend 10000
134c4762a1bSJed Brown   test:
135c4762a1bSJed Brown     suffix: 2
136c4762a1bSJed Brown     args: -malloc_dump -pend 10000 -fill 0.05
137c4762a1bSJed Brown   test:
138c4762a1bSJed Brown     suffix: 3
139c4762a1bSJed Brown     args: -malloc_dump -pend 10000 -fill 0.25
140c4762a1bSJed Brown 
141c4762a1bSJed Brown TEST*/
142