xref: /petsc/src/sys/tests/ex40.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
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 
15*5f80ce2aSJacob 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   PetscErrorCode ierr;
25c4762a1bSJed Brown 
26c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr;
27c4762a1bSJed Brown 
28*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapICreate(&ht));
292c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht != NULL);
30*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
312c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
32c4762a1bSJed Brown 
33*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIResize(ht,0));
34*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
352c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
36c4762a1bSJed Brown 
37*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIHas(ht,123,&has));
382c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
39*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGet(ht,123,&v));
402c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
41c4762a1bSJed Brown 
42*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapISet(ht,123,42));
43*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
442c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 1);
45*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIHas(ht,123,&has));
462c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_TRUE);
47*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGet(ht,123,&v));
482c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == 42);
49c4762a1bSJed Brown 
50*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIDel(ht,123));
51*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
522c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
53*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIHas(ht,123,&has));
542c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
55*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGet(ht,123,&v));
562c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
57c4762a1bSJed Brown 
58*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIQuerySet(ht,123,1,&flag));
592c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
60*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIQuerySet(ht,123,1,&flag));
612c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
62*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIQueryDel(ht,123,&flag));
632c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
64*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIQueryDel(ht,123,&flag));
652c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
66c4762a1bSJed Brown 
67*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIResize(ht,13));
68*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
692c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
70c4762a1bSJed Brown 
71*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIClear(ht));
72*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
732c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
74c4762a1bSJed Brown 
75*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapISet(ht,321,24));
76*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapISet(ht,123,42));
77*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
782c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 2);
79c4762a1bSJed Brown 
802f613bf5SBarry Smith   koff = 0; keys[0] = keys[1] = 0;
81*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetKeys(ht,&koff,keys));
82*5f80ce2aSJacob Faibussowitsch   CHKERRQ(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;
88*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetVals(ht,&voff,vals));
89*5f80ce2aSJacob Faibussowitsch   CHKERRQ(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;
96*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIDuplicate(ht,&hd));
97*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetKeys(ht,&koff,keys));
98*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetVals(ht,&voff,vals));
99*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSortInt(koff,keys));
100*5f80ce2aSJacob Faibussowitsch   CHKERRQ(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);
107*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIDestroy(&hd));
108c4762a1bSJed Brown 
109*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapISet(ht,0,0));
110*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
1112c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
112*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIReset(ht));
113*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
1142c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
115*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIReset(ht));
116*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
1172c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
118*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapISet(ht,0,0));
119*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
1202c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
121c4762a1bSJed Brown 
122*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIDestroy(&ht));
1232c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht == NULL);
124c4762a1bSJed Brown 
125*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapICreate(&ht));
126*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIReset(ht));
127*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
1282c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
129*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIDestroy(&ht));
130c4762a1bSJed Brown 
131*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVCreate(&htv));
132c4762a1bSJed Brown   n = 10;
133*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVResize(htv,n));
134*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVGetCapacity(htv,&na));
1352c71b3e2SJacob Faibussowitsch   PetscTestCheck(na>=n);
136*5f80ce2aSJacob Faibussowitsch   for (i=0; i<n; i++) CHKERRQ(PetscHMapIVSet(htv,i+100,10.));
137*5f80ce2aSJacob Faibussowitsch 
138*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVGetCapacity(htv,&nb));
1392c71b3e2SJacob Faibussowitsch   PetscTestCheck(nb>=na);
140*5f80ce2aSJacob Faibussowitsch   for (i=0; i<(2*n); i++) CHKERRQ(PetscHMapIVAddValue(htv,i+100,5.));
141*5f80ce2aSJacob Faibussowitsch 
142*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVGetSize(htv,&size));
1432c71b3e2SJacob Faibussowitsch   PetscTestCheck(size==(2*n));
144*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc3(size,&karray,size,&varray,size,&vwork));
145c4762a1bSJed Brown   off = 0;
146*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVGetPairs(htv,&off,karray,varray));
1472c71b3e2SJacob Faibussowitsch   PetscTestCheck(off==(2*n));
148*5f80ce2aSJacob Faibussowitsch   CHKERRQ(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   }
155*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree3(karray,varray,vwork));
156*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVDestroy(&htv));
157c4762a1bSJed Brown 
158c4762a1bSJed Brown   ierr = PetscFinalize();
159c4762a1bSJed Brown   return ierr;
160c4762a1bSJed Brown }
161c4762a1bSJed Brown 
162c4762a1bSJed Brown /*TEST
163c4762a1bSJed Brown 
164c4762a1bSJed Brown    test:
165c4762a1bSJed Brown 
166c4762a1bSJed Brown TEST*/
167