xref: /petsc/src/sys/tests/ex40.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
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*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscInitialize(&argc,&argv,NULL,help));
26c4762a1bSJed Brown 
275f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapICreate(&ht));
282c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht != NULL);
295f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
302c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
31c4762a1bSJed Brown 
325f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIResize(ht,0));
335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
342c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
35c4762a1bSJed Brown 
365f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIHas(ht,123,&has));
372c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
385f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGet(ht,123,&v));
392c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
40c4762a1bSJed Brown 
415f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapISet(ht,123,42));
425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
432c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 1);
445f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIHas(ht,123,&has));
452c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_TRUE);
465f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGet(ht,123,&v));
472c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == 42);
48c4762a1bSJed Brown 
495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIDel(ht,123));
505f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
512c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
525f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIHas(ht,123,&has));
532c71b3e2SJacob Faibussowitsch   PetscTestCheck(has == PETSC_FALSE);
545f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGet(ht,123,&v));
552c71b3e2SJacob Faibussowitsch   PetscTestCheck(v == -1);
56c4762a1bSJed Brown 
575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIQuerySet(ht,123,1,&flag));
582c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
595f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIQuerySet(ht,123,1,&flag));
602c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
615f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIQueryDel(ht,123,&flag));
622c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_TRUE);
635f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIQueryDel(ht,123,&flag));
642c71b3e2SJacob Faibussowitsch   PetscTestCheck(flag == PETSC_FALSE);
65c4762a1bSJed Brown 
665f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIResize(ht,13));
675f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
682c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
69c4762a1bSJed Brown 
705f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIClear(ht));
715f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
722c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
73c4762a1bSJed Brown 
745f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapISet(ht,321,24));
755f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapISet(ht,123,42));
765f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
772c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 2);
78c4762a1bSJed Brown 
792f613bf5SBarry Smith   koff = 0; keys[0] = keys[1] = 0;
805f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetKeys(ht,&koff,keys));
815f80ce2aSJacob Faibussowitsch   CHKERRQ(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;
875f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetVals(ht,&voff,vals));
885f80ce2aSJacob Faibussowitsch   CHKERRQ(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;
955f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIDuplicate(ht,&hd));
965f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetKeys(ht,&koff,keys));
975f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetVals(ht,&voff,vals));
985f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSortInt(koff,keys));
995f80ce2aSJacob Faibussowitsch   CHKERRQ(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);
1065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIDestroy(&hd));
107c4762a1bSJed Brown 
1085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapISet(ht,0,0));
1095f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
1102c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
1115f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIReset(ht));
1125f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
1132c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1145f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIReset(ht));
1155f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
1162c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1175f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapISet(ht,0,0));
1185f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
1192c71b3e2SJacob Faibussowitsch   PetscTestCheck(n != 0);
120c4762a1bSJed Brown 
1215f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIDestroy(&ht));
1222c71b3e2SJacob Faibussowitsch   PetscTestCheck(ht == NULL);
123c4762a1bSJed Brown 
1245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapICreate(&ht));
1255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIReset(ht));
1265f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIGetSize(ht,&n));
1272c71b3e2SJacob Faibussowitsch   PetscTestCheck(n == 0);
1285f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIDestroy(&ht));
129c4762a1bSJed Brown 
1305f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVCreate(&htv));
131c4762a1bSJed Brown   n = 10;
1325f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVResize(htv,n));
1335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVGetCapacity(htv,&na));
1342c71b3e2SJacob Faibussowitsch   PetscTestCheck(na>=n);
1355f80ce2aSJacob Faibussowitsch   for (i=0; i<n; i++) CHKERRQ(PetscHMapIVSet(htv,i+100,10.));
1365f80ce2aSJacob Faibussowitsch 
1375f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVGetCapacity(htv,&nb));
1382c71b3e2SJacob Faibussowitsch   PetscTestCheck(nb>=na);
1395f80ce2aSJacob Faibussowitsch   for (i=0; i<(2*n); i++) CHKERRQ(PetscHMapIVAddValue(htv,i+100,5.));
1405f80ce2aSJacob Faibussowitsch 
1415f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVGetSize(htv,&size));
1422c71b3e2SJacob Faibussowitsch   PetscTestCheck(size==(2*n));
1435f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc3(size,&karray,size,&varray,size,&vwork));
144c4762a1bSJed Brown   off = 0;
1455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVGetPairs(htv,&off,karray,varray));
1462c71b3e2SJacob Faibussowitsch   PetscTestCheck(off==(2*n));
1475f80ce2aSJacob Faibussowitsch   CHKERRQ(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   }
1545f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree3(karray,varray,vwork));
1555f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHMapIVDestroy(&htv));
156c4762a1bSJed Brown 
157*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscFinalize());
158*b122ec5aSJacob Faibussowitsch   return 0;
159c4762a1bSJed Brown }
160c4762a1bSJed Brown 
161c4762a1bSJed Brown /*TEST
162c4762a1bSJed Brown 
163c4762a1bSJed Brown    test:
164c4762a1bSJed Brown 
165c4762a1bSJed Brown TEST*/
166