Actual source code: ex1.c

petsc-3.13.4 2020-08-01
Report Typos and Errors
  1: /*
  2:        Formatted test for ISGeneral routines.
  3: */

  5: static char help[] = "Tests IS general routines.\n\n";

  7:  #include <petscis.h>
  8:  #include <petscviewer.h>

 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;

 21:   PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
 22:   MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
 23:   MPI_Comm_size(PETSC_COMM_WORLD,&size);

 25:   /*
 26:      Test IS of size 0
 27:   */
 28:   ISCreateGeneral(PETSC_COMM_SELF,0,&n,PETSC_COPY_VALUES,&is);
 29:   ISGetSize(is,&n);
 30:   if (n != 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetSize");
 31:   ISDestroy(&is);

 33:   /*
 34:      Create large IS and test ISGetIndices()
 35:   */
 36:   n    = 10000 + rank;
 37:   PetscMalloc1(n,&indices);
 38:   for (i=0; i<n; i++) indices[i] = rank + i;
 39:   ISCreateGeneral(PETSC_COMM_SELF,n,indices,PETSC_COPY_VALUES,&is);
 40:   ISGetIndices(is,&ii);
 41:   for (i=0; i<n; i++) {
 42:     if (ii[i] != indices[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetIndices");
 43:   }
 44:   ISRestoreIndices(is,&ii);

 46:   /*
 47:      Check identity and permutation
 48:   */
 49:   /* ISPermutation doesn't check if not set */
 50:   ISPermutation(is,&flg);
 51:   if (flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISPermutation");
 52:   ISGetInfo(is,IS_PERMUTATION,IS_LOCAL,compute,&flg);
 53:   if (!rank && !flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_PERMUTATION,IS_LOCAL)");
 54:   if (rank && flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_PERMUTATION,IS_LOCAL)");
 55:   ISIdentity(is,&flg);
 56:   if (!rank && !flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISIdentity");
 57:   if (rank && flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISIdentity");
 58:   ISGetInfo(is,IS_IDENTITY,IS_LOCAL,compute,&flg);
 59:   if (!rank && !flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_IDENTITY,IS_LOCAL)");
 60:   if (rank && flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_IDENTITY,IS_LOCAL)");
 61:   /* we can override the computed values with ISSetInfo() */
 62:   ISSetInfo(is,IS_PERMUTATION,IS_LOCAL,permanent,PETSC_TRUE);
 63:   ISSetInfo(is,IS_IDENTITY,IS_LOCAL,permanent,PETSC_TRUE);
 64:   ISGetInfo(is,IS_PERMUTATION,IS_LOCAL,compute,&flg);
 65:   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_PERMUTATION,IS_LOCAL)");
 66:   ISGetInfo(is,IS_IDENTITY,IS_LOCAL,compute,&flg);
 67:   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_IDENTITY,IS_LOCAL)");

 69:   ISClearInfoCache(is,PETSC_TRUE);

 71:   /*
 72:      Check equality of index sets
 73:   */
 74:   ISEqual(is,is,&flg);
 75:   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISEqual");

 77:   /*
 78:      Sorting
 79:   */
 80:   ISSort(is);
 81:   ISSorted(is,&flg);
 82:   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISSort");
 83:   ISGetInfo(is,IS_SORTED,IS_LOCAL,compute,&flg);
 84:   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_SORTED,IS_LOCAL)");
 85:   ISSorted(is,&flg);
 86:   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISSort");
 87:   ISGetInfo(is,IS_SORTED,IS_LOCAL,compute,&flg);
 88:   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISGetInfo(IS_SORTED,IS_LOCAL)");

 90:   /*
 91:      Thinks it is a different type?
 92:   */
 93:   PetscObjectTypeCompare((PetscObject)is,ISSTRIDE,&flg);
 94:   if (flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISStride");
 95:   PetscObjectTypeCompare((PetscObject)is,ISBLOCK,&flg);
 96:   if (flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISBlock");

 98:   ISDestroy(&is);

100:   /*
101:      Inverting permutation
102:   */
103:   for (i=0; i<n; i++) indices[i] = n - i - 1;
104:   ISCreateGeneral(PETSC_COMM_SELF,n,indices,PETSC_COPY_VALUES,&is);
105:   PetscFree(indices);
106:   ISSetPermutation(is);
107:   ISInvertPermutation(is,PETSC_DECIDE,&newis);
108:   ISGetIndices(newis,&ii);
109:   for (i=0; i<n; i++) {
110:     if (ii[i] != n - i - 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ISInvertPermutation");
111:   }
112:   ISRestoreIndices(newis,&ii);
113:   ISDestroy(&newis);
114:   ISDestroy(&is);
115:   PetscFinalize();
116:   return ierr;
117: }

119: /*TEST

121:    test:
122:       nsize: {{1 2 3 4 5}}


125: TEST*/