xref: /petsc/src/sys/tests/ex40.c (revision f97672e55eacc8688507b9471cd7ec2664d7f203)
1 static char help[] = "Test PETSc integer hash map.\n\n";
2 
3 #include <petsc/private/hashmapi.h>
4 #include <petsc/private/hashmapiv.h>
5 #include <petscsys.h>
6 
7 /* Unused, keep it for testing purposes */
8 PETSC_HASH_MAP(HMapIP, PetscInt, void*, PetscHashInt, PetscHashEqual, NULL)
9 
10 /* Unused, keep it for testing purposes */
11 typedef struct { double x; double y; double z; } Point;
12 static Point origin = {0.0, 0.0, 0.0};
13 PETSC_HASH_MAP(HMapIS, PetscInt, Point, PetscHashInt, PetscHashEqual, origin)
14 
15 #define PetscTestCheck(expr) PetscCheck(expr,PETSC_COMM_SELF,PETSC_ERR_LIB, "Assertion: `%s' failed.", PetscStringize(expr))
16 
17 int main(int argc,char **argv)
18 {
19   PetscHMapI     ht = NULL, hd;
20   PetscHMapIV    htv;
21   PetscInt       n, v, koff, keys[4], voff, vals[4],na,nb,i,size,*karray,off;
22   PetscScalar    *varray,*vwork;
23   PetscBool      has, flag;
24 
25   PetscCall(PetscInitialize(&argc,&argv,NULL,help));
26 
27   PetscCall(PetscHMapICreate(&ht));
28   PetscTestCheck(ht != NULL);
29   PetscCall(PetscHMapIGetSize(ht,&n));
30   PetscTestCheck(n == 0);
31 
32   PetscCall(PetscHMapIResize(ht,0));
33   PetscCall(PetscHMapIGetSize(ht,&n));
34   PetscTestCheck(n == 0);
35 
36   PetscCall(PetscHMapIHas(ht,123,&has));
37   PetscTestCheck(has == PETSC_FALSE);
38   PetscCall(PetscHMapIGet(ht,123,&v));
39   PetscTestCheck(v == -1);
40 
41   PetscCall(PetscHMapISet(ht,123,42));
42   PetscCall(PetscHMapIGetSize(ht,&n));
43   PetscTestCheck(n == 1);
44   PetscCall(PetscHMapIHas(ht,123,&has));
45   PetscTestCheck(has == PETSC_TRUE);
46   PetscCall(PetscHMapIGet(ht,123,&v));
47   PetscTestCheck(v == 42);
48 
49   PetscCall(PetscHMapIDel(ht,123));
50   PetscCall(PetscHMapIGetSize(ht,&n));
51   PetscTestCheck(n == 0);
52   PetscCall(PetscHMapIHas(ht,123,&has));
53   PetscTestCheck(has == PETSC_FALSE);
54   PetscCall(PetscHMapIGet(ht,123,&v));
55   PetscTestCheck(v == -1);
56 
57   PetscCall(PetscHMapIQuerySet(ht,123,1,&flag));
58   PetscTestCheck(flag == PETSC_TRUE);
59   PetscCall(PetscHMapIQuerySet(ht,123,1,&flag));
60   PetscTestCheck(flag == PETSC_FALSE);
61   PetscCall(PetscHMapIQueryDel(ht,123,&flag));
62   PetscTestCheck(flag == PETSC_TRUE);
63   PetscCall(PetscHMapIQueryDel(ht,123,&flag));
64   PetscTestCheck(flag == PETSC_FALSE);
65 
66   PetscCall(PetscHMapIResize(ht,13));
67   PetscCall(PetscHMapIGetSize(ht,&n));
68   PetscTestCheck(n == 0);
69 
70   PetscCall(PetscHMapIClear(ht));
71   PetscCall(PetscHMapIGetSize(ht,&n));
72   PetscTestCheck(n == 0);
73 
74   PetscCall(PetscHMapISet(ht,321,24));
75   PetscCall(PetscHMapISet(ht,123,42));
76   PetscCall(PetscHMapIGetSize(ht,&n));
77   PetscTestCheck(n == 2);
78 
79   koff = 0; keys[0] = keys[1] = 0;
80   PetscCall(PetscHMapIGetKeys(ht,&koff,keys));
81   PetscCall(PetscSortInt(koff,keys));
82   PetscTestCheck(koff == 2);
83   PetscTestCheck(keys[0] == 123);
84   PetscTestCheck(keys[1] == 321);
85 
86   voff = 0; vals[0] = vals[1] = 0;
87   PetscCall(PetscHMapIGetVals(ht,&voff,vals));
88   PetscCall(PetscSortInt(voff,vals));
89   PetscTestCheck(voff == 2);
90   PetscTestCheck(vals[0] == 24);
91   PetscTestCheck(vals[1] == 42);
92 
93   koff = 0; keys[0] = keys[1] = 0;
94   voff = 0; vals[0] = vals[1] = 0;
95   PetscCall(PetscHMapIDuplicate(ht,&hd));
96   PetscCall(PetscHMapIGetKeys(ht,&koff,keys));
97   PetscCall(PetscHMapIGetVals(ht,&voff,vals));
98   PetscCall(PetscSortInt(koff,keys));
99   PetscCall(PetscSortInt(voff,vals));
100   PetscTestCheck(koff == 2);
101   PetscTestCheck(voff == 2);
102   PetscTestCheck(keys[0] == 123);
103   PetscTestCheck(keys[1] == 321);
104   PetscTestCheck(vals[0] == 24);
105   PetscTestCheck(vals[1] == 42);
106   PetscCall(PetscHMapIDestroy(&hd));
107 
108   PetscCall(PetscHMapISet(ht,0,0));
109   PetscCall(PetscHMapIGetSize(ht,&n));
110   PetscTestCheck(n != 0);
111   PetscCall(PetscHMapIReset(ht));
112   PetscCall(PetscHMapIGetSize(ht,&n));
113   PetscTestCheck(n == 0);
114   PetscCall(PetscHMapIReset(ht));
115   PetscCall(PetscHMapIGetSize(ht,&n));
116   PetscTestCheck(n == 0);
117   PetscCall(PetscHMapISet(ht,0,0));
118   PetscCall(PetscHMapIGetSize(ht,&n));
119   PetscTestCheck(n != 0);
120 
121   PetscCall(PetscHMapIDestroy(&ht));
122   PetscTestCheck(ht == NULL);
123 
124   PetscCall(PetscHMapICreate(&ht));
125   PetscCall(PetscHMapIReset(ht));
126   PetscCall(PetscHMapIGetSize(ht,&n));
127   PetscTestCheck(n == 0);
128   PetscCall(PetscHMapIDestroy(&ht));
129 
130   PetscCall(PetscHMapIVCreate(&htv));
131   n = 10;
132   PetscCall(PetscHMapIVResize(htv,n));
133   PetscCall(PetscHMapIVGetCapacity(htv,&na));
134   PetscTestCheck(na>=n);
135   for (i=0; i<n; i++) PetscCall(PetscHMapIVSet(htv,i+100,10.));
136 
137   PetscCall(PetscHMapIVGetCapacity(htv,&nb));
138   PetscTestCheck(nb>=na);
139   for (i=0; i<(2*n); i++) PetscCall(PetscHMapIVAddValue(htv,i+100,5.));
140 
141   PetscCall(PetscHMapIVGetSize(htv,&size));
142   PetscTestCheck(size==(2*n));
143   PetscCall(PetscMalloc3(size,&karray,size,&varray,size,&vwork));
144   off = 0;
145   PetscCall(PetscHMapIVGetPairs(htv,&off,karray,varray));
146   PetscTestCheck(off==(2*n));
147   PetscCall(PetscSortIntWithDataArray(off,karray,varray,sizeof(PetscScalar),vwork));
148   for (i=0; i<n; i++) {
149     PetscTestCheck(karray[i]==(i+100));
150     PetscTestCheck(karray[n+i]==(n+i+100));
151     PetscTestCheck(varray[i]==15.);
152     PetscTestCheck(varray[n+i]==5.);
153   }
154   PetscCall(PetscFree3(karray,varray,vwork));
155   PetscCall(PetscHMapIVDestroy(&htv));
156 
157   PetscCall(PetscFinalize());
158   return 0;
159 }
160 
161 /*TEST
162 
163    test:
164 
165 TEST*/
166