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