xref: /petsc/src/vec/is/is/tests/ex13.c (revision bd412c90fba8895e9763ccee76c7dd2e09a982d7)
1 
2 static char help[] = "Tests ISDuplicate(), ISCopy(), ISShift(), ISEqualUnsorted(), ISEqual().\n\n";
3 
4 #include <petscis.h>
5 #include <petscviewer.h>
6 
7 /*
8 type = 0 general
9 type = 1 stride
10 type = 2 block
11 */
12 static PetscErrorCode CreateIS(MPI_Comm comm, PetscInt type, PetscInt n, PetscInt first, PetscInt step, IS *is)
13 {
14   PetscInt   *idx, i, j;
15   PetscMPIInt rank;
16 
17   PetscFunctionBegin;
18   PetscCallMPI(MPI_Comm_rank(comm, &rank));
19   first += rank * n * step;
20   switch (type) {
21   case 0:
22     PetscCall(PetscMalloc1(n, &idx));
23     for (i = 0, j = first; i < n; i++, j += step) idx[i] = j;
24     PetscCall(ISCreateGeneral(comm, n, idx, PETSC_OWN_POINTER, is));
25     break;
26   case 1:
27     PetscCall(ISCreateStride(comm, n, first, step, is));
28     break;
29   case 2:
30     PetscCall(PetscMalloc1(n, &idx));
31     for (i = 0, j = first; i < n; i++, j += step) idx[i] = j;
32     PetscCall(ISCreateBlock(comm, 1, n, idx, PETSC_OWN_POINTER, is));
33     break;
34   }
35   PetscFunctionReturn(0);
36 }
37 
38 int main(int argc, char **argv)
39 {
40   IS        is[128];
41   IS        tmp;
42   PetscInt  n = 10, first = 0, step = 1, offset = 0;
43   PetscInt  i, j = 0, type;
44   PetscBool verbose = PETSC_FALSE, flg;
45   MPI_Comm  comm;
46 
47   PetscFunctionBeginUser;
48   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
49   comm = PETSC_COMM_WORLD;
50   PetscCall(PetscArrayzero(is, sizeof(is) / sizeof(is[0])));
51   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
52   PetscCall(PetscOptionsGetInt(NULL, NULL, "-first", &first, NULL));
53   PetscCall(PetscOptionsGetInt(NULL, NULL, "-step", &step, NULL));
54   PetscCall(PetscOptionsGetInt(NULL, NULL, "-offset", &offset, NULL));
55   PetscCall(PetscOptionsGetBool(NULL, NULL, "-verbose", &verbose, NULL));
56 
57   for (type = 0; type < 3; type++) {
58     PetscCall(CreateIS(comm, type, n, first + offset, step, &is[j]));
59     j++;
60 
61     PetscCall(CreateIS(comm, type, n, first + offset, step, &is[j]));
62     PetscCall(ISCopy(is[j], is[j]));
63     j++;
64 
65     PetscCall(CreateIS(comm, type, n, first + offset, step, &tmp));
66     PetscCall(ISDuplicate(tmp, &is[j]));
67     PetscCall(ISCopy(tmp, is[j]));
68     PetscCall(ISDestroy(&tmp));
69     j++;
70 
71     PetscCall(CreateIS(comm, type, n, first + offset, step, &is[j]));
72     PetscCall(ISShift(is[j], 0, is[j]));
73     j++;
74 
75     PetscCall(CreateIS(comm, type, n, first, step, &is[j]));
76     PetscCall(ISShift(is[j], offset, is[j]));
77     j++;
78 
79     PetscCall(CreateIS(comm, type, n, first + offset, step, &tmp));
80     PetscCall(ISDuplicate(tmp, &is[j]));
81     PetscCall(ISShift(tmp, 0, is[j]));
82     PetscCall(ISDestroy(&tmp));
83     j++;
84 
85     PetscCall(CreateIS(comm, type, n, first, step, &tmp));
86     PetscCall(ISDuplicate(tmp, &is[j]));
87     PetscCall(ISShift(tmp, offset, is[j]));
88     PetscCall(ISDestroy(&tmp));
89     j++;
90 
91     PetscCall(CreateIS(comm, type, n, first + 2 * offset, step, &is[j]));
92     PetscCall(ISShift(is[j], -offset, is[j]));
93     j++;
94   }
95   PetscAssert(j < (PetscInt)(sizeof(is) / sizeof(is[0])), comm, PETSC_ERR_ARG_OUTOFRANGE, "assertion failed: j < sizeof(is)/sizeof(is[0])");
96   PetscCall(ISViewFromOptions(is[0], NULL, "-is0_view"));
97   PetscCall(ISViewFromOptions(is[j / 2], NULL, "-is1_view"));
98   for (i = 0; i < j; i++) {
99     if (!is[i]) continue;
100     PetscCall(ISEqualUnsorted(is[i], is[0], &flg));
101     PetscCheck(flg, comm, PETSC_ERR_PLIB, "is[%02" PetscInt_FMT "] differs from is[0]", i);
102     if (verbose) PetscCall(PetscPrintf(comm, "is[%02" PetscInt_FMT "] identical to is[0]\n", i));
103   }
104   for (i = 0; i < j; i++) PetscCall(ISDestroy(&is[i]));
105   PetscCall(PetscFinalize());
106   return 0;
107 }
108 
109 /*TEST
110 
111     test:
112       suffix: 1
113       nsize: 3
114       args: -n 6 -first {{-2 0 1 3}} -step {{-2 0 1 3}}
115 
116     test:
117       suffix: 2
118       nsize: 2
119       args: -n 3 -first 2 -step -1 -is0_view -is1_view -verbose
120 
121 TEST*/
122