xref: /petsc/src/sys/tests/ex40.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
1c4762a1bSJed Brown static char help[] = "Test PETSc integer hash map.\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petsc/private/hashmapi.h>
4c4762a1bSJed Brown #include <petsc/private/hashmapiv.h>
5c4762a1bSJed Brown #include <petscsys.h>
6c4762a1bSJed Brown 
7c4762a1bSJed Brown /* Unused, keep it for testing purposes */
8c4762a1bSJed Brown PETSC_HASH_MAP(HMapIP, PetscInt, void *, PetscHashInt, PetscHashEqual, NULL)
9c4762a1bSJed Brown 
10c4762a1bSJed Brown /* Unused, keep it for testing purposes */
11*9371c9d4SSatish Balay typedef struct {
12*9371c9d4SSatish Balay   double x;
13*9371c9d4SSatish Balay   double y;
14*9371c9d4SSatish Balay   double z;
15*9371c9d4SSatish Balay } Point;
16c4762a1bSJed Brown static Point origin = {0.0, 0.0, 0.0};
17c4762a1bSJed Brown PETSC_HASH_MAP(HMapIS, PetscInt, Point, PetscHashInt, PetscHashEqual, origin)
18c4762a1bSJed Brown 
195f80ce2aSJacob Faibussowitsch #define PetscTestCheck(expr) PetscCheck(expr, PETSC_COMM_SELF, PETSC_ERR_LIB, "Assertion: `%s' failed.", PetscStringize(expr))
20c4762a1bSJed Brown 
21*9371c9d4SSatish Balay int main(int argc, char **argv) {
22c4762a1bSJed Brown   PetscHMapI   ht = NULL, hd;
23c4762a1bSJed Brown   PetscHMapIV  htv;
24c4762a1bSJed Brown   PetscInt     n, v, koff, keys[4], voff, vals[4], na, nb, i, size, *karray, off;
25c4762a1bSJed Brown   PetscScalar *varray, *vwork;
26c4762a1bSJed Brown   PetscBool    has, flag;
27c4762a1bSJed Brown 
28327415f7SBarry Smith   PetscFunctionBeginUser;
299566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
30c4762a1bSJed Brown 
319566063dSJacob Faibussowitsch   PetscCall(PetscHMapICreate(&ht));
322c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht != NULL);
339566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
342c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
35c4762a1bSJed Brown 
369566063dSJacob Faibussowitsch   PetscCall(PetscHMapIResize(ht, 0));
379566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
382c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
39c4762a1bSJed Brown 
409566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht, 123, &has));
412c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
429566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht, 123, &v));
432c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
44c4762a1bSJed Brown 
459566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht, 123, 42));
469566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
472c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 1);
489566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht, 123, &has));
492c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_TRUE);
509566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht, 123, &v));
512c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == 42);
52c4762a1bSJed Brown 
539566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDel(ht, 123));
549566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
552c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
569566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht, 123, &has));
572c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
589566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht, 123, &v));
592c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
60c4762a1bSJed Brown 
619566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag));
622c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
639566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag));
642c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
659566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQueryDel(ht, 123, &flag));
662c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
679566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQueryDel(ht, 123, &flag));
682c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
69c4762a1bSJed Brown 
709566063dSJacob Faibussowitsch   PetscCall(PetscHMapIResize(ht, 13));
719566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
722c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
73c4762a1bSJed Brown 
749566063dSJacob Faibussowitsch   PetscCall(PetscHMapIClear(ht));
759566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
762c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
77c4762a1bSJed Brown 
789566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht, 321, 24));
799566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht, 123, 42));
809566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
812c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 2);
82c4762a1bSJed Brown 
83*9371c9d4SSatish Balay   koff    = 0;
84*9371c9d4SSatish Balay   keys[0] = keys[1] = 0;
859566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetKeys(ht, &koff, keys));
869566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(koff, keys));
872c71b3e2SJacob Faibussowitsch   PetscTestCheck(koff == 2);
882c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[0] == 123);
892c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[1] == 321);
90c4762a1bSJed Brown 
91*9371c9d4SSatish Balay   voff    = 0;
92*9371c9d4SSatish Balay   vals[0] = vals[1] = 0;
939566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetVals(ht, &voff, vals));
949566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(voff, vals));
952c71b3e2SJacob Faibussowitsch   PetscTestCheck(voff == 2);
962c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[0] == 24);
972c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[1] == 42);
98c4762a1bSJed Brown 
99*9371c9d4SSatish Balay   koff    = 0;
100*9371c9d4SSatish Balay   keys[0] = keys[1] = 0;
101*9371c9d4SSatish Balay   voff              = 0;
102*9371c9d4SSatish Balay   vals[0] = vals[1] = 0;
1039566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDuplicate(ht, &hd));
1049566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetKeys(ht, &koff, keys));
1059566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetVals(ht, &voff, vals));
1069566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(koff, keys));
1079566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(voff, vals));
1082c71b3e2SJacob Faibussowitsch   PetscTestCheck(koff == 2);
1092c71b3e2SJacob Faibussowitsch   PetscTestCheck(voff == 2);
1102c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[0] == 123);
1112c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[1] == 321);
1122c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[0] == 24);
1132c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[1] == 42);
1149566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&hd));
115c4762a1bSJed Brown 
1169566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht, 0, 0));
1179566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
1182c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
1199566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
1209566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
1212c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1229566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
1239566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
1242c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1259566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht, 0, 0));
1269566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
1272c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
128c4762a1bSJed Brown 
1299566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&ht));
1302c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht == NULL);
131c4762a1bSJed Brown 
1329566063dSJacob Faibussowitsch   PetscCall(PetscHMapICreate(&ht));
1339566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
1349566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
1352c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1369566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&ht));
137c4762a1bSJed Brown 
1389566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVCreate(&htv));
139c4762a1bSJed Brown   n = 10;
1409566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVResize(htv, n));
1419566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetCapacity(htv, &na));
1422c71b3e2SJacob Faibussowitsch   PetscTestCheck(na >= n);
1439566063dSJacob Faibussowitsch   for (i = 0; i < n; i++) PetscCall(PetscHMapIVSet(htv, i + 100, 10.));
1445f80ce2aSJacob Faibussowitsch 
1459566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetCapacity(htv, &nb));
1462c71b3e2SJacob Faibussowitsch   PetscTestCheck(nb >= na);
1479566063dSJacob Faibussowitsch   for (i = 0; i < (2 * n); i++) PetscCall(PetscHMapIVAddValue(htv, i + 100, 5.));
1485f80ce2aSJacob Faibussowitsch 
1499566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetSize(htv, &size));
1502c71b3e2SJacob Faibussowitsch   PetscTestCheck(size == (2 * n));
1519566063dSJacob Faibussowitsch   PetscCall(PetscMalloc3(size, &karray, size, &varray, size, &vwork));
152c4762a1bSJed Brown   off = 0;
1539566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetPairs(htv, &off, karray, varray));
1542c71b3e2SJacob Faibussowitsch   PetscTestCheck(off == (2 * n));
1559566063dSJacob Faibussowitsch   PetscCall(PetscSortIntWithDataArray(off, karray, varray, sizeof(PetscScalar), vwork));
156c4762a1bSJed Brown   for (i = 0; i < n; i++) {
1572c71b3e2SJacob Faibussowitsch     PetscTestCheck(karray[i] == (i + 100));
1582c71b3e2SJacob Faibussowitsch     PetscTestCheck(karray[n + i] == (n + i + 100));
1592c71b3e2SJacob Faibussowitsch     PetscTestCheck(varray[i] == 15.);
1602c71b3e2SJacob Faibussowitsch     PetscTestCheck(varray[n + i] == 5.);
161c4762a1bSJed Brown   }
1629566063dSJacob Faibussowitsch   PetscCall(PetscFree3(karray, varray, vwork));
1639566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVDestroy(&htv));
164c4762a1bSJed Brown 
1659566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
166b122ec5aSJacob Faibussowitsch   return 0;
167c4762a1bSJed Brown }
168c4762a1bSJed Brown 
169c4762a1bSJed Brown /*TEST
170c4762a1bSJed Brown 
171c4762a1bSJed Brown    test:
172c4762a1bSJed Brown 
173c4762a1bSJed Brown TEST*/
174