xref: /petsc/src/sys/tests/ex40.c (revision 609caa7c8c030312b00807b4f015fd827bb80932)
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 */
119371c9d4SSatish Balay typedef struct {
129371c9d4SSatish Balay   double x;
139371c9d4SSatish Balay   double y;
149371c9d4SSatish Balay   double z;
159371c9d4SSatish Balay } Point;
16c4762a1bSJed Brown static Point origin = {0.0, 0.0, 0.0};
PETSC_HASH_MAP(HMapIS,PetscInt,Point,PetscHashInt,PetscHashEqual,origin)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 
21d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
22d71ae5a4SJacob Faibussowitsch {
23c4762a1bSJed Brown   PetscHMapI   ht = NULL, hd;
24c4762a1bSJed Brown   PetscHMapIV  htv;
25c4762a1bSJed Brown   PetscInt     n, v, koff, keys[4], voff, vals[4], na, nb, i, size, *karray, off;
26c4762a1bSJed Brown   PetscScalar *varray, *vwork;
27c4762a1bSJed Brown   PetscBool    has, flag;
28c4762a1bSJed Brown 
29327415f7SBarry Smith   PetscFunctionBeginUser;
309566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
31c4762a1bSJed Brown 
329566063dSJacob Faibussowitsch   PetscCall(PetscHMapICreate(&ht));
332c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht != NULL);
349566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
352c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
36c4762a1bSJed Brown 
379566063dSJacob Faibussowitsch   PetscCall(PetscHMapIResize(ht, 0));
389566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
392c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
40c4762a1bSJed Brown 
419566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht, 123, &has));
422c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
439566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht, 123, &v));
442c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
45c4762a1bSJed Brown 
469566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht, 123, 42));
479566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
482c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 1);
499566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht, 123, &has));
502c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_TRUE);
519566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht, 123, &v));
522c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == 42);
53c4762a1bSJed Brown 
549566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDel(ht, 123));
559566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
562c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
579566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht, 123, &has));
582c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
599566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht, 123, &v));
602c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
61c4762a1bSJed Brown 
629566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag));
632c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
649566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQuerySet(ht, 123, 1, &flag));
652c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
669566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQueryDel(ht, 123, &flag));
672c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
689566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQueryDel(ht, 123, &flag));
692c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
70c4762a1bSJed Brown 
719566063dSJacob Faibussowitsch   PetscCall(PetscHMapIResize(ht, 13));
729566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
732c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
74c4762a1bSJed Brown 
759566063dSJacob Faibussowitsch   PetscCall(PetscHMapIClear(ht));
769566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
772c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
78c4762a1bSJed Brown 
799566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht, 321, 24));
809566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht, 123, 42));
819566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
822c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 2);
83c4762a1bSJed Brown 
849371c9d4SSatish Balay   koff    = 0;
859371c9d4SSatish Balay   keys[0] = keys[1] = 0;
869566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetKeys(ht, &koff, keys));
879566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(koff, keys));
882c71b3e2SJacob Faibussowitsch   PetscTestCheck(koff == 2);
892c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[0] == 123);
902c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[1] == 321);
91c4762a1bSJed Brown 
929371c9d4SSatish Balay   voff    = 0;
939371c9d4SSatish Balay   vals[0] = vals[1] = 0;
949566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetVals(ht, &voff, vals));
959566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(voff, vals));
962c71b3e2SJacob Faibussowitsch   PetscTestCheck(voff == 2);
972c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[0] == 24);
982c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[1] == 42);
99c4762a1bSJed Brown 
1009371c9d4SSatish Balay   koff    = 0;
1019371c9d4SSatish Balay   keys[0] = keys[1] = 0;
1029371c9d4SSatish Balay   voff              = 0;
1039371c9d4SSatish Balay   vals[0] = vals[1] = 0;
1049566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDuplicate(ht, &hd));
1059566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetKeys(ht, &koff, keys));
1069566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetVals(ht, &voff, vals));
1079566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(koff, keys));
1089566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(voff, vals));
1092c71b3e2SJacob Faibussowitsch   PetscTestCheck(koff == 2);
1102c71b3e2SJacob Faibussowitsch   PetscTestCheck(voff == 2);
1112c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[0] == 123);
1122c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[1] == 321);
1132c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[0] == 24);
1142c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[1] == 42);
1159566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&hd));
116c4762a1bSJed Brown 
1179566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht, 0, 0));
1189566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
1192c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
1209566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
1219566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
1222c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1239566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
1249566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
1252c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1269566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht, 0, 0));
1279566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
1282c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
129c4762a1bSJed Brown 
1309566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&ht));
1312c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht == NULL);
132c4762a1bSJed Brown 
1339566063dSJacob Faibussowitsch   PetscCall(PetscHMapICreate(&ht));
1349566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
1359566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht, &n));
1362c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1379566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&ht));
138c4762a1bSJed Brown 
1399566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVCreate(&htv));
140c4762a1bSJed Brown   n = 10;
1419566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVResize(htv, n));
1429566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetCapacity(htv, &na));
1432c71b3e2SJacob Faibussowitsch   PetscTestCheck(na >= n);
1449566063dSJacob Faibussowitsch   for (i = 0; i < n; i++) PetscCall(PetscHMapIVSet(htv, i + 100, 10.));
1455f80ce2aSJacob Faibussowitsch 
1469566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetCapacity(htv, &nb));
1472c71b3e2SJacob Faibussowitsch   PetscTestCheck(nb >= na);
1489566063dSJacob Faibussowitsch   for (i = 0; i < (2 * n); i++) PetscCall(PetscHMapIVAddValue(htv, i + 100, 5.));
1495f80ce2aSJacob Faibussowitsch 
1509566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetSize(htv, &size));
1512c71b3e2SJacob Faibussowitsch   PetscTestCheck(size == (2 * n));
1529566063dSJacob Faibussowitsch   PetscCall(PetscMalloc3(size, &karray, size, &varray, size, &vwork));
153c4762a1bSJed Brown   off = 0;
1549566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetPairs(htv, &off, karray, varray));
1552c71b3e2SJacob Faibussowitsch   PetscTestCheck(off == (2 * n));
1569566063dSJacob Faibussowitsch   PetscCall(PetscSortIntWithDataArray(off, karray, varray, sizeof(PetscScalar), vwork));
157c4762a1bSJed Brown   for (i = 0; i < n; i++) {
1582c71b3e2SJacob Faibussowitsch     PetscTestCheck(karray[i] == (i + 100));
1592c71b3e2SJacob Faibussowitsch     PetscTestCheck(karray[n + i] == (n + i + 100));
1602c71b3e2SJacob Faibussowitsch     PetscTestCheck(varray[i] == 15.);
1612c71b3e2SJacob Faibussowitsch     PetscTestCheck(varray[n + i] == 5.);
162c4762a1bSJed Brown   }
1639566063dSJacob Faibussowitsch   PetscCall(PetscFree3(karray, varray, vwork));
1649566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVDestroy(&htv));
165c4762a1bSJed Brown 
1669566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
167b122ec5aSJacob Faibussowitsch   return 0;
168c4762a1bSJed Brown }
169c4762a1bSJed Brown 
170c4762a1bSJed Brown /*TEST
171c4762a1bSJed Brown 
172c4762a1bSJed Brown    test:
173*3886731fSPierre Jolivet      output_file: output/empty.out
174c4762a1bSJed Brown 
175c4762a1bSJed Brown TEST*/
176