xref: /petsc/src/sys/tests/ex40.c (revision 58d68138c660dfb4e9f5b03334792cd4f2ffd7cc)
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   PetscHMapI   ht = NULL, hd;
23   PetscHMapIV  htv;
24   PetscInt     n, v, koff, keys[4], voff, vals[4], na, nb, i, size, *karray, off;
25   PetscScalar *varray, *vwork;
26   PetscBool    has, flag;
27 
28   PetscFunctionBeginUser;
29   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
30 
31   PetscCall(PetscHMapICreate(&ht));
32   PetscTestCheck(ht != NULL);
33   PetscCall(PetscHMapIGetSize(ht, &n));
34   PetscTestCheck(n == 0);
35 
36   PetscCall(PetscHMapIResize(ht, 0));
37   PetscCall(PetscHMapIGetSize(ht, &n));
38   PetscTestCheck(n == 0);
39 
40   PetscCall(PetscHMapIHas(ht, 123, &has));
41   PetscTestCheck(has == PETSC_FALSE);
42   PetscCall(PetscHMapIGet(ht, 123, &v));
43   PetscTestCheck(v == -1);
44 
45   PetscCall(PetscHMapISet(ht, 123, 42));
46   PetscCall(PetscHMapIGetSize(ht, &n));
47   PetscTestCheck(n == 1);
48   PetscCall(PetscHMapIHas(ht, 123, &has));
49   PetscTestCheck(has == PETSC_TRUE);
50   PetscCall(PetscHMapIGet(ht, 123, &v));
51   PetscTestCheck(v == 42);
52 
53   PetscCall(PetscHMapIDel(ht, 123));
54   PetscCall(PetscHMapIGetSize(ht, &n));
55   PetscTestCheck(n == 0);
56   PetscCall(PetscHMapIHas(ht, 123, &has));
57   PetscTestCheck(has == PETSC_FALSE);
58   PetscCall(PetscHMapIGet(ht, 123, &v));
59   PetscTestCheck(v == -1);
60 
61   PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag));
62   PetscTestCheck(flag == PETSC_TRUE);
63   PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag));
64   PetscTestCheck(flag == PETSC_FALSE);
65   PetscCall(PetscHMapIQueryDel(ht, 123, &flag));
66   PetscTestCheck(flag == PETSC_TRUE);
67   PetscCall(PetscHMapIQueryDel(ht, 123, &flag));
68   PetscTestCheck(flag == PETSC_FALSE);
69 
70   PetscCall(PetscHMapIResize(ht, 13));
71   PetscCall(PetscHMapIGetSize(ht, &n));
72   PetscTestCheck(n == 0);
73 
74   PetscCall(PetscHMapIClear(ht));
75   PetscCall(PetscHMapIGetSize(ht, &n));
76   PetscTestCheck(n == 0);
77 
78   PetscCall(PetscHMapISet(ht, 321, 24));
79   PetscCall(PetscHMapISet(ht, 123, 42));
80   PetscCall(PetscHMapIGetSize(ht, &n));
81   PetscTestCheck(n == 2);
82 
83   koff    = 0;
84   keys[0] = keys[1] = 0;
85   PetscCall(PetscHMapIGetKeys(ht, &koff, keys));
86   PetscCall(PetscSortInt(koff, keys));
87   PetscTestCheck(koff == 2);
88   PetscTestCheck(keys[0] == 123);
89   PetscTestCheck(keys[1] == 321);
90 
91   voff    = 0;
92   vals[0] = vals[1] = 0;
93   PetscCall(PetscHMapIGetVals(ht, &voff, vals));
94   PetscCall(PetscSortInt(voff, vals));
95   PetscTestCheck(voff == 2);
96   PetscTestCheck(vals[0] == 24);
97   PetscTestCheck(vals[1] == 42);
98 
99   koff    = 0;
100   keys[0] = keys[1] = 0;
101   voff              = 0;
102   vals[0] = vals[1] = 0;
103   PetscCall(PetscHMapIDuplicate(ht, &hd));
104   PetscCall(PetscHMapIGetKeys(ht, &koff, keys));
105   PetscCall(PetscHMapIGetVals(ht, &voff, vals));
106   PetscCall(PetscSortInt(koff, keys));
107   PetscCall(PetscSortInt(voff, vals));
108   PetscTestCheck(koff == 2);
109   PetscTestCheck(voff == 2);
110   PetscTestCheck(keys[0] == 123);
111   PetscTestCheck(keys[1] == 321);
112   PetscTestCheck(vals[0] == 24);
113   PetscTestCheck(vals[1] == 42);
114   PetscCall(PetscHMapIDestroy(&hd));
115 
116   PetscCall(PetscHMapISet(ht, 0, 0));
117   PetscCall(PetscHMapIGetSize(ht, &n));
118   PetscTestCheck(n != 0);
119   PetscCall(PetscHMapIReset(ht));
120   PetscCall(PetscHMapIGetSize(ht, &n));
121   PetscTestCheck(n == 0);
122   PetscCall(PetscHMapIReset(ht));
123   PetscCall(PetscHMapIGetSize(ht, &n));
124   PetscTestCheck(n == 0);
125   PetscCall(PetscHMapISet(ht, 0, 0));
126   PetscCall(PetscHMapIGetSize(ht, &n));
127   PetscTestCheck(n != 0);
128 
129   PetscCall(PetscHMapIDestroy(&ht));
130   PetscTestCheck(ht == NULL);
131 
132   PetscCall(PetscHMapICreate(&ht));
133   PetscCall(PetscHMapIReset(ht));
134   PetscCall(PetscHMapIGetSize(ht, &n));
135   PetscTestCheck(n == 0);
136   PetscCall(PetscHMapIDestroy(&ht));
137 
138   PetscCall(PetscHMapIVCreate(&htv));
139   n = 10;
140   PetscCall(PetscHMapIVResize(htv, n));
141   PetscCall(PetscHMapIVGetCapacity(htv, &na));
142   PetscTestCheck(na >= n);
143   for (i = 0; i < n; i++) PetscCall(PetscHMapIVSet(htv, i + 100, 10.));
144 
145   PetscCall(PetscHMapIVGetCapacity(htv, &nb));
146   PetscTestCheck(nb >= na);
147   for (i = 0; i < (2 * n); i++) PetscCall(PetscHMapIVAddValue(htv, i + 100, 5.));
148 
149   PetscCall(PetscHMapIVGetSize(htv, &size));
150   PetscTestCheck(size == (2 * n));
151   PetscCall(PetscMalloc3(size, &karray, size, &varray, size, &vwork));
152   off = 0;
153   PetscCall(PetscHMapIVGetPairs(htv, &off, karray, varray));
154   PetscTestCheck(off == (2 * n));
155   PetscCall(PetscSortIntWithDataArray(off, karray, varray, sizeof(PetscScalar), vwork));
156   for (i = 0; i < n; i++) {
157     PetscTestCheck(karray[i] == (i + 100));
158     PetscTestCheck(karray[n + i] == (n + i + 100));
159     PetscTestCheck(varray[i] == 15.);
160     PetscTestCheck(varray[n + i] == 5.);
161   }
162   PetscCall(PetscFree3(karray, varray, vwork));
163   PetscCall(PetscHMapIVDestroy(&htv));
164 
165   PetscCall(PetscFinalize());
166   return 0;
167 }
168 
169 /*TEST
170 
171    test:
172 
173 TEST*/
174