xref: /petsc/src/vec/is/is/tests/ex1.c (revision e853fb4c8b5febe3904ee8ab6dd9d8f36768265c)
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