xref: /petsc/src/sys/tests/ex40.c (revision 9566063d113dddea24716c546802770db7481bc0)
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*9566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc,&argv,NULL,help));
26c4762a1bSJed Brown 
27*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapICreate(&ht));
282c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht != NULL);
29*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
302c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
31c4762a1bSJed Brown 
32*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIResize(ht,0));
33*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
342c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
35c4762a1bSJed Brown 
36*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht,123,&has));
372c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
38*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht,123,&v));
392c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
40c4762a1bSJed Brown 
41*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht,123,42));
42*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
432c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 1);
44*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht,123,&has));
452c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_TRUE);
46*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht,123,&v));
472c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == 42);
48c4762a1bSJed Brown 
49*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDel(ht,123));
50*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
512c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
52*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIHas(ht,123,&has));
532c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
54*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGet(ht,123,&v));
552c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
56c4762a1bSJed Brown 
57*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQuerySet(ht,123,1,&flag));
582c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
59*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQuerySet(ht,123,1,&flag));
602c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
61*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQueryDel(ht,123,&flag));
622c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
63*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIQueryDel(ht,123,&flag));
642c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
65c4762a1bSJed Brown 
66*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIResize(ht,13));
67*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
682c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
69c4762a1bSJed Brown 
70*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIClear(ht));
71*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
722c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
73c4762a1bSJed Brown 
74*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht,321,24));
75*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht,123,42));
76*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
772c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 2);
78c4762a1bSJed Brown 
792f613bf5SBarry Smith   koff = 0; keys[0] = keys[1] = 0;
80*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetKeys(ht,&koff,keys));
81*9566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(koff,keys));
822c71b3e2SJacob Faibussowitsch   PetscTestCheck(koff == 2);
832c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[0] == 123);
842c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[1] == 321);
85c4762a1bSJed Brown 
86c4762a1bSJed Brown   voff = 0; vals[0] = vals[1] = 0;
87*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetVals(ht,&voff,vals));
88*9566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(voff,vals));
892c71b3e2SJacob Faibussowitsch   PetscTestCheck(voff == 2);
902c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[0] == 24);
912c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[1] == 42);
92c4762a1bSJed Brown 
93c4762a1bSJed Brown   koff = 0; keys[0] = keys[1] = 0;
94c4762a1bSJed Brown   voff = 0; vals[0] = vals[1] = 0;
95*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDuplicate(ht,&hd));
96*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetKeys(ht,&koff,keys));
97*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetVals(ht,&voff,vals));
98*9566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(koff,keys));
99*9566063dSJacob Faibussowitsch   PetscCall(PetscSortInt(voff,vals));
1002c71b3e2SJacob Faibussowitsch   PetscTestCheck(koff == 2);
1012c71b3e2SJacob Faibussowitsch   PetscTestCheck(voff == 2);
1022c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[0] == 123);
1032c71b3e2SJacob Faibussowitsch   PetscTestCheck(keys[1] == 321);
1042c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[0] == 24);
1052c71b3e2SJacob Faibussowitsch   PetscTestCheck(vals[1] == 42);
106*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&hd));
107c4762a1bSJed Brown 
108*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht,0,0));
109*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
1102c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
111*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
112*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
1132c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
114*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
115*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
1162c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
117*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapISet(ht,0,0));
118*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
1192c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
120c4762a1bSJed Brown 
121*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&ht));
1222c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht == NULL);
123c4762a1bSJed Brown 
124*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapICreate(&ht));
125*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIReset(ht));
126*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIGetSize(ht,&n));
1272c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
128*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIDestroy(&ht));
129c4762a1bSJed Brown 
130*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVCreate(&htv));
131c4762a1bSJed Brown   n = 10;
132*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVResize(htv,n));
133*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetCapacity(htv,&na));
1342c71b3e2SJacob Faibussowitsch   PetscTestCheck(na>=n);
135*9566063dSJacob Faibussowitsch   for (i=0; i<n; i++) PetscCall(PetscHMapIVSet(htv,i+100,10.));
1365f80ce2aSJacob Faibussowitsch 
137*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetCapacity(htv,&nb));
1382c71b3e2SJacob Faibussowitsch   PetscTestCheck(nb>=na);
139*9566063dSJacob Faibussowitsch   for (i=0; i<(2*n); i++) PetscCall(PetscHMapIVAddValue(htv,i+100,5.));
1405f80ce2aSJacob Faibussowitsch 
141*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetSize(htv,&size));
1422c71b3e2SJacob Faibussowitsch   PetscTestCheck(size==(2*n));
143*9566063dSJacob Faibussowitsch   PetscCall(PetscMalloc3(size,&karray,size,&varray,size,&vwork));
144c4762a1bSJed Brown   off = 0;
145*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVGetPairs(htv,&off,karray,varray));
1462c71b3e2SJacob Faibussowitsch   PetscTestCheck(off==(2*n));
147*9566063dSJacob Faibussowitsch   PetscCall(PetscSortIntWithDataArray(off,karray,varray,sizeof(PetscScalar),vwork));
148c4762a1bSJed Brown   for (i=0; i<n; i++) {
1492c71b3e2SJacob Faibussowitsch     PetscTestCheck(karray[i]==(i+100));
1502c71b3e2SJacob Faibussowitsch     PetscTestCheck(karray[n+i]==(n+i+100));
1512c71b3e2SJacob Faibussowitsch     PetscTestCheck(varray[i]==15.);
1522c71b3e2SJacob Faibussowitsch     PetscTestCheck(varray[n+i]==5.);
153c4762a1bSJed Brown   }
154*9566063dSJacob Faibussowitsch   PetscCall(PetscFree3(karray,varray,vwork));
155*9566063dSJacob Faibussowitsch   PetscCall(PetscHMapIVDestroy(&htv));
156c4762a1bSJed Brown 
157*9566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
158b122ec5aSJacob Faibussowitsch   return 0;
159c4762a1bSJed Brown }
160c4762a1bSJed Brown 
161c4762a1bSJed Brown /*TEST
162c4762a1bSJed Brown 
163c4762a1bSJed Brown    test:
164c4762a1bSJed Brown 
165c4762a1bSJed Brown TEST*/
166