xref: /petsc/src/sys/tests/ex40.c (revision 57d508425293f0bb93f59574d14951d8faac9af8)
1 static char help[] = "Test PETSc integer hash map.\n\n";
2 
3 #include <petsc/private/hashmapi.h>
4 #include <petsc/private/hashmapiv.h>
5 #include <petscsys.h>
6 
7 /* Unused, keep it for testing purposes */
8 PETSC_HASH_MAP(HMapIP, PetscInt, void *, PetscHashInt, PetscHashEqual, NULL)
9 
10 /* Unused, keep it for testing purposes */
11 typedef struct {
12   double x;
13   double y;
14   double z;
15 } Point;
16 static Point origin = {0.0, 0.0, 0.0};
17 PETSC_HASH_MAP(HMapIS, PetscInt, Point, PetscHashInt, PetscHashEqual, origin)
18 
19 #define PetscTestCheck(expr) PetscCheck(expr, PETSC_COMM_SELF, PETSC_ERR_LIB, "Assertion: `%s' failed.", PetscStringize(expr))
20 
21 int main(int argc, char **argv)
22 {
23   PetscHMapI   ht = NULL, hd;
24   PetscHMapIV  htv;
25   PetscInt     n, v, koff, keys[4], voff, vals[4], na, nb, i, size, *karray, off;
26   PetscScalar *varray, *vwork;
27   PetscBool    has, flag;
28 
29   PetscFunctionBeginUser;
30   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
31 
32   PetscCall(PetscHMapICreate(&ht));
33   PetscTestCheck(ht != NULL);
34   PetscCall(PetscHMapIGetSize(ht, &n));
35   PetscTestCheck(n == 0);
36 
37   PetscCall(PetscHMapIResize(ht, 0));
38   PetscCall(PetscHMapIGetSize(ht, &n));
39   PetscTestCheck(n == 0);
40 
41   PetscCall(PetscHMapIHas(ht, 123, &has));
42   PetscTestCheck(has == PETSC_FALSE);
43   PetscCall(PetscHMapIGet(ht, 123, &v));
44   PetscTestCheck(v == -1);
45 
46   PetscCall(PetscHMapISet(ht, 123, 42));
47   PetscCall(PetscHMapIGetSize(ht, &n));
48   PetscTestCheck(n == 1);
49   PetscCall(PetscHMapIHas(ht, 123, &has));
50   PetscTestCheck(has == PETSC_TRUE);
51   PetscCall(PetscHMapIGet(ht, 123, &v));
52   PetscTestCheck(v == 42);
53 
54   PetscCall(PetscHMapIDel(ht, 123));
55   PetscCall(PetscHMapIGetSize(ht, &n));
56   PetscTestCheck(n == 0);
57   PetscCall(PetscHMapIHas(ht, 123, &has));
58   PetscTestCheck(has == PETSC_FALSE);
59   PetscCall(PetscHMapIGet(ht, 123, &v));
60   PetscTestCheck(v == -1);
61 
62   PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag));
63   PetscTestCheck(flag == PETSC_TRUE);
64   PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag));
65   PetscTestCheck(flag == PETSC_FALSE);
66   PetscCall(PetscHMapIQueryDel(ht, 123, &flag));
67   PetscTestCheck(flag == PETSC_TRUE);
68   PetscCall(PetscHMapIQueryDel(ht, 123, &flag));
69   PetscTestCheck(flag == PETSC_FALSE);
70 
71   PetscCall(PetscHMapIResize(ht, 13));
72   PetscCall(PetscHMapIGetSize(ht, &n));
73   PetscTestCheck(n == 0);
74 
75   PetscCall(PetscHMapIClear(ht));
76   PetscCall(PetscHMapIGetSize(ht, &n));
77   PetscTestCheck(n == 0);
78 
79   PetscCall(PetscHMapISet(ht, 321, 24));
80   PetscCall(PetscHMapISet(ht, 123, 42));
81   PetscCall(PetscHMapIGetSize(ht, &n));
82   PetscTestCheck(n == 2);
83 
84   koff    = 0;
85   keys[0] = keys[1] = 0;
86   PetscCall(PetscHMapIGetKeys(ht, &koff, keys));
87   PetscCall(PetscSortInt(koff, keys));
88   PetscTestCheck(koff == 2);
89   PetscTestCheck(keys[0] == 123);
90   PetscTestCheck(keys[1] == 321);
91 
92   voff    = 0;
93   vals[0] = vals[1] = 0;
94   PetscCall(PetscHMapIGetVals(ht, &voff, vals));
95   PetscCall(PetscSortInt(voff, vals));
96   PetscTestCheck(voff == 2);
97   PetscTestCheck(vals[0] == 24);
98   PetscTestCheck(vals[1] == 42);
99 
100   koff    = 0;
101   keys[0] = keys[1] = 0;
102   voff              = 0;
103   vals[0] = vals[1] = 0;
104   PetscCall(PetscHMapIDuplicate(ht, &hd));
105   PetscCall(PetscHMapIGetKeys(ht, &koff, keys));
106   PetscCall(PetscHMapIGetVals(ht, &voff, vals));
107   PetscCall(PetscSortInt(koff, keys));
108   PetscCall(PetscSortInt(voff, vals));
109   PetscTestCheck(koff == 2);
110   PetscTestCheck(voff == 2);
111   PetscTestCheck(keys[0] == 123);
112   PetscTestCheck(keys[1] == 321);
113   PetscTestCheck(vals[0] == 24);
114   PetscTestCheck(vals[1] == 42);
115   PetscCall(PetscHMapIDestroy(&hd));
116 
117   PetscCall(PetscHMapISet(ht, 0, 0));
118   PetscCall(PetscHMapIGetSize(ht, &n));
119   PetscTestCheck(n != 0);
120   PetscCall(PetscHMapIReset(ht));
121   PetscCall(PetscHMapIGetSize(ht, &n));
122   PetscTestCheck(n == 0);
123   PetscCall(PetscHMapIReset(ht));
124   PetscCall(PetscHMapIGetSize(ht, &n));
125   PetscTestCheck(n == 0);
126   PetscCall(PetscHMapISet(ht, 0, 0));
127   PetscCall(PetscHMapIGetSize(ht, &n));
128   PetscTestCheck(n != 0);
129 
130   PetscCall(PetscHMapIDestroy(&ht));
131   PetscTestCheck(ht == NULL);
132 
133   PetscCall(PetscHMapICreate(&ht));
134   PetscCall(PetscHMapIReset(ht));
135   PetscCall(PetscHMapIGetSize(ht, &n));
136   PetscTestCheck(n == 0);
137   PetscCall(PetscHMapIDestroy(&ht));
138 
139   PetscCall(PetscHMapIVCreate(&htv));
140   n = 10;
141   PetscCall(PetscHMapIVResize(htv, n));
142   PetscCall(PetscHMapIVGetCapacity(htv, &na));
143   PetscTestCheck(na >= n);
144   for (i = 0; i < n; i++) PetscCall(PetscHMapIVSet(htv, i + 100, 10.));
145 
146   PetscCall(PetscHMapIVGetCapacity(htv, &nb));
147   PetscTestCheck(nb >= na);
148   for (i = 0; i < (2 * n); i++) PetscCall(PetscHMapIVAddValue(htv, i + 100, 5.));
149 
150   PetscCall(PetscHMapIVGetSize(htv, &size));
151   PetscTestCheck(size == (2 * n));
152   PetscCall(PetscMalloc3(size, &karray, size, &varray, size, &vwork));
153   off = 0;
154   PetscCall(PetscHMapIVGetPairs(htv, &off, karray, varray));
155   PetscTestCheck(off == (2 * n));
156   PetscCall(PetscSortIntWithDataArray(off, karray, varray, sizeof(PetscScalar), vwork));
157   for (i = 0; i < n; i++) {
158     PetscTestCheck(karray[i] == (i + 100));
159     PetscTestCheck(karray[n + i] == (n + i + 100));
160     PetscTestCheck(varray[i] == 15.);
161     PetscTestCheck(varray[n + i] == 5.);
162   }
163   PetscCall(PetscFree3(karray, varray, vwork));
164   PetscCall(PetscHMapIVDestroy(&htv));
165 
166   PetscCall(PetscFinalize());
167   return 0;
168 }
169 
170 /*TEST
171 
172    test:
173      output_file: output/empty.out
174 
175 TEST*/
176