Actual source code: ex1.c

  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;

 20:   PetscFunctionBeginUser;
 21:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 22:   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
 23:   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));

 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));

 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++) PetscCheck(ii[i] == indices[i], PETSC_COMM_SELF, PETSC_ERR_PLIB, "ISGetIndices");
 42:   PetscCall(ISRestoreIndices(is, &ii));

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

 67:   PetscCall(ISClearInfoCache(is, PETSC_TRUE));

 69:   /*
 70:      Check equality of index sets
 71:   */
 72:   PetscCall(ISEqual(is, is, &flg));
 73:   PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "ISEqual");

 75:   /*
 76:      Sorting
 77:   */
 78:   PetscCall(ISSort(is));
 79:   PetscCall(ISSorted(is, &flg));
 80:   PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "ISSort");
 81:   PetscCall(ISGetInfo(is, IS_SORTED, IS_LOCAL, compute, &flg));
 82:   PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "ISGetInfo(IS_SORTED,IS_LOCAL)");
 83:   PetscCall(ISSorted(is, &flg));
 84:   PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "ISSort");
 85:   PetscCall(ISGetInfo(is, IS_SORTED, IS_LOCAL, compute, &flg));
 86:   PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "ISGetInfo(IS_SORTED,IS_LOCAL)");

 88:   /*
 89:      Thinks it is a different type?
 90:   */
 91:   PetscCall(PetscObjectTypeCompare((PetscObject)is, ISSTRIDE, &flg));
 92:   PetscCheck(!flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "ISStride");
 93:   PetscCall(PetscObjectTypeCompare((PetscObject)is, ISBLOCK, &flg));
 94:   PetscCheck(!flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "ISBlock");

 96:   PetscCall(ISDestroy(&is));

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

115: /*TEST

117:    test:
118:       nsize: {{1 2 3 4 5}}

120: TEST*/