Actual source code: ex38.c
1: static const char help[] = "Test VecGetSubVector()\n\n";
3: #include <petscvec.h>
5: int main(int argc, char *argv[])
6: {
7: MPI_Comm comm;
8: Vec X, Y, Z, W;
9: PetscMPIInt rank, size;
10: PetscInt i, rstart, rend, idxs[3];
11: PetscScalar *x, *y, *w, *z;
12: PetscViewer viewer;
13: IS is0, is1, is2;
14: PetscBool iscuda;
17: PetscInitialize(&argc, &argv, 0, help);
18: comm = PETSC_COMM_WORLD;
19: viewer = PETSC_VIEWER_STDOUT_WORLD;
20: MPI_Comm_size(comm, &size);
21: MPI_Comm_rank(comm, &rank);
23: VecCreate(comm, &X);
24: VecSetSizes(X, 10, PETSC_DETERMINE);
25: VecSetFromOptions(X);
26: VecGetOwnershipRange(X, &rstart, &rend);
28: VecGetArray(X, &x);
29: for (i = 0; i < rend - rstart; i++) x[i] = rstart + i;
30: VecRestoreArray(X, &x);
31: PetscObjectTypeCompareAny((PetscObject)X, &iscuda, VECSEQCUDA, VECMPICUDA, "");
32: if (iscuda) { /* trigger a copy of the data on the GPU */
33: const PetscScalar *xx;
35: VecCUDAGetArrayRead(X, &xx);
36: VecCUDARestoreArrayRead(X, &xx);
37: }
39: VecView(X, viewer);
41: idxs[0] = (size - rank - 1) * 10 + 5;
42: idxs[1] = (size - rank - 1) * 10 + 2;
43: idxs[2] = (size - rank - 1) * 10 + 3;
45: ISCreateStride(comm, (rend - rstart) / 3 + 3 * (rank > size / 2), rstart, 1, &is0);
46: ISComplement(is0, rstart, rend, &is1);
47: ISCreateGeneral(comm, 3, idxs, PETSC_USE_POINTER, &is2);
49: ISView(is0, viewer);
50: ISView(is1, viewer);
51: ISView(is2, viewer);
53: VecGetSubVector(X, is0, &Y);
54: VecGetSubVector(X, is1, &Z);
55: VecGetSubVector(X, is2, &W);
56: VecView(Y, viewer);
57: VecView(Z, viewer);
58: VecView(W, viewer);
59: VecGetArray(Y, &y);
60: y[0] = 1000 * (rank + 1);
61: VecRestoreArray(Y, &y);
62: VecGetArray(Z, &z);
63: z[0] = -1000 * (rank + 1);
64: VecRestoreArray(Z, &z);
65: VecGetArray(W, &w);
66: w[0] = -10 * (rank + 1);
67: VecRestoreArray(W, &w);
68: VecRestoreSubVector(X, is0, &Y);
69: VecRestoreSubVector(X, is1, &Z);
70: VecRestoreSubVector(X, is2, &W);
71: VecView(X, viewer);
73: ISDestroy(&is0);
74: ISDestroy(&is1);
75: ISDestroy(&is2);
76: VecDestroy(&X);
77: PetscFinalize();
78: return 0;
79: }
81: /*TEST
83: testset:
84: nsize: 3
85: output_file: output/ex38_1.out
86: filter: grep -v " type:"
87: diff_args: -j
88: test:
89: suffix: standard
90: args: -vec_type standard
91: test:
92: requires: cuda
93: suffix: cuda
94: args: -vec_type cuda
95: test:
96: requires: viennacl
97: suffix: viennacl
98: args: -vec_type viennacl
99: test:
100: requires: kokkos_kernels
101: suffix: kokkos
102: args: -vec_type kokkos
103: test:
104: requires: hip
105: suffix: hip
106: args: -vec_type hip
108: TEST*/