xref: /petsc/src/sys/tests/ex40.c (revision 40badf4fbc550ac1f60bd080eaff6de6d55b946d) !
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   PetscErrorCode ierr;
25 
26   ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr;
27 
28   CHKERRQ(PetscHMapICreate(&ht));
29   PetscTestCheck(ht != NULL);
30   CHKERRQ(PetscHMapIGetSize(ht,&n));
31   PetscTestCheck(n == 0);
32 
33   CHKERRQ(PetscHMapIResize(ht,0));
34   CHKERRQ(PetscHMapIGetSize(ht,&n));
35   PetscTestCheck(n == 0);
36 
37   CHKERRQ(PetscHMapIHas(ht,123,&has));
38   PetscTestCheck(has == PETSC_FALSE);
39   CHKERRQ(PetscHMapIGet(ht,123,&v));
40   PetscTestCheck(v == -1);
41 
42   CHKERRQ(PetscHMapISet(ht,123,42));
43   CHKERRQ(PetscHMapIGetSize(ht,&n));
44   PetscTestCheck(n == 1);
45   CHKERRQ(PetscHMapIHas(ht,123,&has));
46   PetscTestCheck(has == PETSC_TRUE);
47   CHKERRQ(PetscHMapIGet(ht,123,&v));
48   PetscTestCheck(v == 42);
49 
50   CHKERRQ(PetscHMapIDel(ht,123));
51   CHKERRQ(PetscHMapIGetSize(ht,&n));
52   PetscTestCheck(n == 0);
53   CHKERRQ(PetscHMapIHas(ht,123,&has));
54   PetscTestCheck(has == PETSC_FALSE);
55   CHKERRQ(PetscHMapIGet(ht,123,&v));
56   PetscTestCheck(v == -1);
57 
58   CHKERRQ(PetscHMapIQuerySet(ht,123,1,&flag));
59   PetscTestCheck(flag == PETSC_TRUE);
60   CHKERRQ(PetscHMapIQuerySet(ht,123,1,&flag));
61   PetscTestCheck(flag == PETSC_FALSE);
62   CHKERRQ(PetscHMapIQueryDel(ht,123,&flag));
63   PetscTestCheck(flag == PETSC_TRUE);
64   CHKERRQ(PetscHMapIQueryDel(ht,123,&flag));
65   PetscTestCheck(flag == PETSC_FALSE);
66 
67   CHKERRQ(PetscHMapIResize(ht,13));
68   CHKERRQ(PetscHMapIGetSize(ht,&n));
69   PetscTestCheck(n == 0);
70 
71   CHKERRQ(PetscHMapIClear(ht));
72   CHKERRQ(PetscHMapIGetSize(ht,&n));
73   PetscTestCheck(n == 0);
74 
75   CHKERRQ(PetscHMapISet(ht,321,24));
76   CHKERRQ(PetscHMapISet(ht,123,42));
77   CHKERRQ(PetscHMapIGetSize(ht,&n));
78   PetscTestCheck(n == 2);
79 
80   koff = 0; keys[0] = keys[1] = 0;
81   CHKERRQ(PetscHMapIGetKeys(ht,&koff,keys));
82   CHKERRQ(PetscSortInt(koff,keys));
83   PetscTestCheck(koff == 2);
84   PetscTestCheck(keys[0] == 123);
85   PetscTestCheck(keys[1] == 321);
86 
87   voff = 0; vals[0] = vals[1] = 0;
88   CHKERRQ(PetscHMapIGetVals(ht,&voff,vals));
89   CHKERRQ(PetscSortInt(voff,vals));
90   PetscTestCheck(voff == 2);
91   PetscTestCheck(vals[0] == 24);
92   PetscTestCheck(vals[1] == 42);
93 
94   koff = 0; keys[0] = keys[1] = 0;
95   voff = 0; vals[0] = vals[1] = 0;
96   CHKERRQ(PetscHMapIDuplicate(ht,&hd));
97   CHKERRQ(PetscHMapIGetKeys(ht,&koff,keys));
98   CHKERRQ(PetscHMapIGetVals(ht,&voff,vals));
99   CHKERRQ(PetscSortInt(koff,keys));
100   CHKERRQ(PetscSortInt(voff,vals));
101   PetscTestCheck(koff == 2);
102   PetscTestCheck(voff == 2);
103   PetscTestCheck(keys[0] == 123);
104   PetscTestCheck(keys[1] == 321);
105   PetscTestCheck(vals[0] == 24);
106   PetscTestCheck(vals[1] == 42);
107   CHKERRQ(PetscHMapIDestroy(&hd));
108 
109   CHKERRQ(PetscHMapISet(ht,0,0));
110   CHKERRQ(PetscHMapIGetSize(ht,&n));
111   PetscTestCheck(n != 0);
112   CHKERRQ(PetscHMapIReset(ht));
113   CHKERRQ(PetscHMapIGetSize(ht,&n));
114   PetscTestCheck(n == 0);
115   CHKERRQ(PetscHMapIReset(ht));
116   CHKERRQ(PetscHMapIGetSize(ht,&n));
117   PetscTestCheck(n == 0);
118   CHKERRQ(PetscHMapISet(ht,0,0));
119   CHKERRQ(PetscHMapIGetSize(ht,&n));
120   PetscTestCheck(n != 0);
121 
122   CHKERRQ(PetscHMapIDestroy(&ht));
123   PetscTestCheck(ht == NULL);
124 
125   CHKERRQ(PetscHMapICreate(&ht));
126   CHKERRQ(PetscHMapIReset(ht));
127   CHKERRQ(PetscHMapIGetSize(ht,&n));
128   PetscTestCheck(n == 0);
129   CHKERRQ(PetscHMapIDestroy(&ht));
130 
131   CHKERRQ(PetscHMapIVCreate(&htv));
132   n = 10;
133   CHKERRQ(PetscHMapIVResize(htv,n));
134   CHKERRQ(PetscHMapIVGetCapacity(htv,&na));
135   PetscTestCheck(na>=n);
136   for (i=0; i<n; i++) CHKERRQ(PetscHMapIVSet(htv,i+100,10.));
137 
138   CHKERRQ(PetscHMapIVGetCapacity(htv,&nb));
139   PetscTestCheck(nb>=na);
140   for (i=0; i<(2*n); i++) CHKERRQ(PetscHMapIVAddValue(htv,i+100,5.));
141 
142   CHKERRQ(PetscHMapIVGetSize(htv,&size));
143   PetscTestCheck(size==(2*n));
144   CHKERRQ(PetscMalloc3(size,&karray,size,&varray,size,&vwork));
145   off = 0;
146   CHKERRQ(PetscHMapIVGetPairs(htv,&off,karray,varray));
147   PetscTestCheck(off==(2*n));
148   CHKERRQ(PetscSortIntWithDataArray(off,karray,varray,sizeof(PetscScalar),vwork));
149   for (i=0; i<n; i++) {
150     PetscTestCheck(karray[i]==(i+100));
151     PetscTestCheck(karray[n+i]==(n+i+100));
152     PetscTestCheck(varray[i]==15.);
153     PetscTestCheck(varray[n+i]==5.);
154   }
155   CHKERRQ(PetscFree3(karray,varray,vwork));
156   CHKERRQ(PetscHMapIVDestroy(&htv));
157 
158   ierr = PetscFinalize();
159   return ierr;
160 }
161 
162 /*TEST
163 
164    test:
165 
166 TEST*/
167