1 /* 2 Formatted test for ISGeneral routines. 3 */ 4 5 static char help[] = "Tests IS general routines.\n\n"; 6 7 #include <petscis.h> 8 #include <petscviewer.h> 9 10 int main(int argc,char **argv) 11 { 12 PetscMPIInt rank,size; 13 PetscInt i,n,*indices; 14 const PetscInt *ii; 15 IS is,newis; 16 PetscBool flg; 17 PetscBool permanent = PETSC_FALSE; 18 PetscBool compute = PETSC_TRUE; 19 20 PetscFunctionBeginUser; 21 PetscCall(PetscInitialize(&argc,&argv,(char*)0,help)); 22 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 23 PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 24 25 /* 26 Test IS of size 0 27 */ 28 PetscCall(ISCreateGeneral(PETSC_COMM_SELF,0,&n,PETSC_COPY_VALUES,&is)); 29 PetscCall(ISGetSize(is,&n)); 30 PetscCheck(n == 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetSize"); 31 PetscCall(ISDestroy(&is)); 32 33 /* 34 Create large IS and test ISGetIndices() 35 */ 36 n = 10000 + rank; 37 PetscCall(PetscMalloc1(n,&indices)); 38 for (i=0; i<n; i++) indices[i] = rank + i; 39 PetscCall(ISCreateGeneral(PETSC_COMM_SELF,n,indices,PETSC_COPY_VALUES,&is)); 40 PetscCall(ISGetIndices(is,&ii)); 41 for (i=0; i<n; i++) { 42 PetscCheck(ii[i] == indices[i],PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetIndices"); 43 } 44 PetscCall(ISRestoreIndices(is,&ii)); 45 46 /* 47 Check identity and permutation 48 */ 49 /* ISPermutation doesn't check if not set */ 50 PetscCall(ISPermutation(is,&flg)); 51 PetscCheck(!flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISPermutation"); 52 PetscCall(ISGetInfo(is,IS_PERMUTATION,IS_LOCAL,compute,&flg)); 53 PetscCheck(rank != 0 || flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_PERMUTATION,IS_LOCAL)"); 54 PetscCheck(rank == 0 || !flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_PERMUTATION,IS_LOCAL)"); 55 PetscCall(ISIdentity(is,&flg)); 56 PetscCheck(rank != 0 || flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISIdentity"); 57 PetscCheck(rank == 0 || !flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISIdentity"); 58 PetscCall(ISGetInfo(is,IS_IDENTITY,IS_LOCAL,compute,&flg)); 59 PetscCheck(rank != 0 || flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_IDENTITY,IS_LOCAL)"); 60 PetscCheck(rank == 0 || !flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_IDENTITY,IS_LOCAL)"); 61 /* we can override the computed values with ISSetInfo() */ 62 PetscCall(ISSetInfo(is,IS_PERMUTATION,IS_LOCAL,permanent,PETSC_TRUE)); 63 PetscCall(ISSetInfo(is,IS_IDENTITY,IS_LOCAL,permanent,PETSC_TRUE)); 64 PetscCall(ISGetInfo(is,IS_PERMUTATION,IS_LOCAL,compute,&flg)); 65 PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_PERMUTATION,IS_LOCAL)"); 66 PetscCall(ISGetInfo(is,IS_IDENTITY,IS_LOCAL,compute,&flg)); 67 PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_IDENTITY,IS_LOCAL)"); 68 69 PetscCall(ISClearInfoCache(is,PETSC_TRUE)); 70 71 /* 72 Check equality of index sets 73 */ 74 PetscCall(ISEqual(is,is,&flg)); 75 PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISEqual"); 76 77 /* 78 Sorting 79 */ 80 PetscCall(ISSort(is)); 81 PetscCall(ISSorted(is,&flg)); 82 PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISSort"); 83 PetscCall(ISGetInfo(is,IS_SORTED,IS_LOCAL,compute,&flg)); 84 PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_SORTED,IS_LOCAL)"); 85 PetscCall(ISSorted(is,&flg)); 86 PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISSort"); 87 PetscCall(ISGetInfo(is,IS_SORTED,IS_LOCAL,compute,&flg)); 88 PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_SORTED,IS_LOCAL)"); 89 90 /* 91 Thinks it is a different type? 92 */ 93 PetscCall(PetscObjectTypeCompare((PetscObject)is,ISSTRIDE,&flg)); 94 PetscCheck(!flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISStride"); 95 PetscCall(PetscObjectTypeCompare((PetscObject)is,ISBLOCK,&flg)); 96 PetscCheck(!flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISBlock"); 97 98 PetscCall(ISDestroy(&is)); 99 100 /* 101 Inverting permutation 102 */ 103 for (i=0; i<n; i++) indices[i] = n - i - 1; 104 PetscCall(ISCreateGeneral(PETSC_COMM_SELF,n,indices,PETSC_COPY_VALUES,&is)); 105 PetscCall(PetscFree(indices)); 106 PetscCall(ISSetPermutation(is)); 107 PetscCall(ISInvertPermutation(is,PETSC_DECIDE,&newis)); 108 PetscCall(ISGetIndices(newis,&ii)); 109 for (i=0; i<n; i++) { 110 PetscCheck(ii[i] == n - i - 1,PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISInvertPermutation"); 111 } 112 PetscCall(ISRestoreIndices(newis,&ii)); 113 PetscCall(ISDestroy(&newis)); 114 PetscCall(ISDestroy(&is)); 115 PetscCall(PetscFinalize()); 116 return 0; 117 } 118 119 /*TEST 120 121 test: 122 nsize: {{1 2 3 4 5}} 123 124 TEST*/ 125