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
main(int argc,char ** argv)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, NULL, 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++) PetscCheck(ii[i] == indices[i], PETSC_COMM_SELF, PETSC_ERR_PLIB, "ISGetIndices");
42 PetscCall(ISRestoreIndices(is, &ii));
43
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)");
66
67 PetscCall(ISClearInfoCache(is, PETSC_TRUE));
68
69 /*
70 Check equality of index sets
71 */
72 PetscCall(ISEqual(is, is, &flg));
73 PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "ISEqual");
74
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)");
87
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");
95
96 PetscCall(ISDestroy(&is));
97
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 }
114
115 /*TEST
116
117 test:
118 nsize: {{1 2 3 4 5}}
119 output_file: output/empty.out
120
121 TEST*/
122