xref: /petsc/src/sys/tests/ex40.c (revision 327415f76d85372a4417cf1aaa14db707d4d6c04)
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 */
11c4762a1bSJed Brown typedef struct { double x; double y; double z; } Point;
12c4762a1bSJed Brown static Point origin = {0.0, 0.0, 0.0};
13c4762a1bSJed Brown PETSC_HASH_MAP(HMapIS, PetscInt, Point, PetscHashInt, PetscHashEqual, origin)
14c4762a1bSJed Brown 
155f80ce2aSJacob Faibussowitsch #define PetscTestCheck(expr) PetscCheck(expr,PETSC_COMM_SELF,PETSC_ERR_LIB, "Assertion: `%s' failed.", PetscStringize(expr))
16c4762a1bSJed Brown 
17c4762a1bSJed Brown int main(int argc,char **argv)
18c4762a1bSJed Brown {
19c4762a1bSJed Brown   PetscHMapI     ht = NULL, hd;
20c4762a1bSJed Brown   PetscHMapIV    htv;
21c4762a1bSJed Brown   PetscInt       n, v, koff, keys[4], voff, vals[4],na,nb,i,size,*karray,off;
22c4762a1bSJed Brown   PetscScalar    *varray,*vwork;
23c4762a1bSJed Brown   PetscBool      has, flag;
24c4762a1bSJed Brown 
25*327415f7SBarry Smith   PetscFunctionBeginUser;
269566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc,&argv,NULL,help));
27c4762a1bSJed Brown 
289566063dSJacob Faibussowitsch   PetscCall(PetscHMapICreate(&ht));
292c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht != NULL);
309566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
312c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
32c4762a1bSJed Brown 
339566063dSJacob Faibussowitsch   PetscCall(PetscHMapIResize(ht,0));
349566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
352c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
36c4762a1bSJed Brown 
379566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht,123,&has));
382c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
399566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht,123,&v));
402c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
41c4762a1bSJed Brown 
429566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht,123,42));
439566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
442c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 1);
459566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht,123,&has));
462c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_TRUE);
479566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht,123,&v));
482c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == 42);
49c4762a1bSJed Brown 
509566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDel(ht,123));
519566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
522c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
539566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht,123,&has));
542c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
559566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht,123,&v));
562c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
57c4762a1bSJed Brown 
589566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQuerySet(ht,123,1,&flag));
592c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
609566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQuerySet(ht,123,1,&flag));
612c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
629566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQueryDel(ht,123,&flag));
632c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
649566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQueryDel(ht,123,&flag));
652c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
66c4762a1bSJed Brown 
679566063dSJacob Faibussowitsch   PetscCall(PetscHMapIResize(ht,13));
689566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
692c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
70c4762a1bSJed Brown 
719566063dSJacob Faibussowitsch   PetscCall(PetscHMapIClear(ht));
729566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
732c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
74c4762a1bSJed Brown 
759566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht,321,24));
769566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht,123,42));
779566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
782c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 2);
79c4762a1bSJed Brown 
802f613bf5SBarry Smith   koff = 0; keys[0] = keys[1] = 0;
819566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetKeys(ht,&koff,keys));
829566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(koff,keys));
832c71b3e2SJacob Faibussowitsch   PetscTestCheck(koff == 2);
842c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[0] == 123);
852c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[1] == 321);
86c4762a1bSJed Brown 
87c4762a1bSJed Brown   voff = 0; vals[0] = vals[1] = 0;
889566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetVals(ht,&voff,vals));
899566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(voff,vals));
902c71b3e2SJacob Faibussowitsch   PetscTestCheck(voff == 2);
912c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[0] == 24);
922c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[1] == 42);
93c4762a1bSJed Brown 
94c4762a1bSJed Brown   koff = 0; keys[0] = keys[1] = 0;
95c4762a1bSJed Brown   voff = 0; vals[0] = vals[1] = 0;
969566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDuplicate(ht,&hd));
979566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetKeys(ht,&koff,keys));
989566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetVals(ht,&voff,vals));
999566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(koff,keys));
1009566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(voff,vals));
1012c71b3e2SJacob Faibussowitsch   PetscTestCheck(koff == 2);
1022c71b3e2SJacob Faibussowitsch   PetscTestCheck(voff == 2);
1032c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[0] == 123);
1042c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[1] == 321);
1052c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[0] == 24);
1062c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[1] == 42);
1079566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&hd));
108c4762a1bSJed Brown 
1099566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht,0,0));
1109566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
1112c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
1129566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
1139566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
1142c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1159566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
1169566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
1172c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1189566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht,0,0));
1199566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
1202c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
121c4762a1bSJed Brown 
1229566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&ht));
1232c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht == NULL);
124c4762a1bSJed Brown 
1259566063dSJacob Faibussowitsch   PetscCall(PetscHMapICreate(&ht));
1269566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
1279566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
1282c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1299566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&ht));
130c4762a1bSJed Brown 
1319566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVCreate(&htv));
132c4762a1bSJed Brown   n = 10;
1339566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVResize(htv,n));
1349566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetCapacity(htv,&na));
1352c71b3e2SJacob Faibussowitsch   PetscTestCheck(na>=n);
1369566063dSJacob Faibussowitsch   for (i=0; i<n; i++) PetscCall(PetscHMapIVSet(htv,i+100,10.));
1375f80ce2aSJacob Faibussowitsch 
1389566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetCapacity(htv,&nb));
1392c71b3e2SJacob Faibussowitsch   PetscTestCheck(nb>=na);
1409566063dSJacob Faibussowitsch   for (i=0; i<(2*n); i++) PetscCall(PetscHMapIVAddValue(htv,i+100,5.));
1415f80ce2aSJacob Faibussowitsch 
1429566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetSize(htv,&size));
1432c71b3e2SJacob Faibussowitsch   PetscTestCheck(size==(2*n));
1449566063dSJacob Faibussowitsch   PetscCall(PetscMalloc3(size,&karray,size,&varray,size,&vwork));
145c4762a1bSJed Brown   off = 0;
1469566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetPairs(htv,&off,karray,varray));
1472c71b3e2SJacob Faibussowitsch   PetscTestCheck(off==(2*n));
1489566063dSJacob Faibussowitsch   PetscCall(PetscSortIntWithDataArray(off,karray,varray,sizeof(PetscScalar),vwork));
149c4762a1bSJed Brown   for (i=0; i<n; i++) {
1502c71b3e2SJacob Faibussowitsch     PetscTestCheck(karray[i]==(i+100));
1512c71b3e2SJacob Faibussowitsch     PetscTestCheck(karray[n+i]==(n+i+100));
1522c71b3e2SJacob Faibussowitsch     PetscTestCheck(varray[i]==15.);
1532c71b3e2SJacob Faibussowitsch     PetscTestCheck(varray[n+i]==5.);
154c4762a1bSJed Brown   }
1559566063dSJacob Faibussowitsch   PetscCall(PetscFree3(karray,varray,vwork));
1569566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVDestroy(&htv));
157c4762a1bSJed Brown 
1589566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
159b122ec5aSJacob Faibussowitsch   return 0;
160c4762a1bSJed Brown }
161c4762a1bSJed Brown 
162c4762a1bSJed Brown /*TEST
163c4762a1bSJed Brown 
164c4762a1bSJed Brown    test:
165c4762a1bSJed Brown 
166c4762a1bSJed Brown TEST*/
167