1 static char help[] = "Tests VecSetValuesBlocked() on MPI vectors.\n\n";
2
3 #include <petscvec.h>
4
main(int argc,char ** argv)5 int main(int argc, char **argv)
6 {
7 PetscMPIInt size, rank;
8 PetscInt i, n = 8, bs = 2, indices[2];
9 PetscScalar values[4];
10 Vec x;
11
12 PetscFunctionBeginUser;
13 PetscCall(PetscInitialize(&argc, &argv, NULL, help));
14 PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
15 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
16
17 PetscCheck(size == 2, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must be run with two processors");
18
19 /* create vector */
20 PetscCall(VecCreate(PETSC_COMM_WORLD, &x));
21 PetscCall(VecSetSizes(x, PETSC_DECIDE, n));
22 PetscCall(VecSetBlockSize(x, bs));
23 PetscCall(VecSetFromOptions(x));
24
25 if (rank == 0) {
26 for (i = 0; i < 4; i++) values[i] = i + 1;
27 indices[0] = 0;
28 indices[1] = 2;
29 PetscCall(VecSetValuesBlocked(x, 2, indices, values, INSERT_VALUES));
30 }
31 PetscCall(VecAssemblyBegin(x));
32 PetscCall(VecAssemblyEnd(x));
33
34 /*
35 Resulting vector should be 1 2 0 0 3 4 0 0
36 */
37 PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));
38
39 /* test insertion with negative indices */
40 PetscCall(VecSetOption(x, VEC_IGNORE_NEGATIVE_INDICES, PETSC_TRUE));
41 if (rank == 0) {
42 for (i = 0; i < 4; i++) values[i] = -(i + 1);
43 indices[0] = -1;
44 indices[1] = 3;
45 PetscCall(VecSetValuesBlocked(x, 2, indices, values, INSERT_VALUES));
46 }
47 PetscCall(VecAssemblyBegin(x));
48 PetscCall(VecAssemblyEnd(x));
49
50 /*
51 Resulting vector should be 1 2 0 0 3 4 -3 -4
52 */
53 PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));
54
55 PetscCall(VecDestroy(&x));
56
57 PetscCall(PetscFinalize());
58 return 0;
59 }
60
61 /*TEST
62
63 test:
64 nsize: 2
65
66 TEST*/
67