Actual source code: ex13.c
1: static char help[] = "Demonstrates VecStrideSum().\n\n";
3: /*
4: Include "petscvec.h" so that we can use vectors. Note that this file
5: automatically includes:
6: petscsys.h - base PETSc routines petscis.h - index sets
7: petscviewer.h - viewers
8: */
10: #include <petscvec.h>
12: int main(int argc, char **argv)
13: {
14: Vec x; /* vectors */
15: PetscScalar sum;
16: PetscInt n = 20;
17: PetscScalar one = 1.0;
19: PetscFunctionBeginUser;
20: PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
21: PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
23: /*
24: Create a vector, specifying only its global dimension.
25: When using VecCreate(), VecSetSizes() and VecSetFromOptions(),
26: the vector format (currently parallel,
27: shared, or sequential) is determined at runtime. Also, the parallel
28: partitioning of the vector is determined by PETSc at runtime.
29: */
30: PetscCall(VecCreate(PETSC_COMM_WORLD, &x));
31: PetscCall(VecSetSizes(x, PETSC_DECIDE, n));
32: PetscCall(VecSetBlockSize(x, 2));
33: PetscCall(VecSetFromOptions(x));
35: /*
36: Set the subvector entries to a constant value.
37: */
38: PetscCall(VecSet(x, one));
39: PetscCall(VecStrideScale(x, 1, -2));
41: PetscCall(VecSum(x, &sum));
42: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Sum of entire vector: %g\n", (double)PetscRealPart(sum)));
44: PetscCall(VecStrideSum(x, 0, &sum));
45: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Sum of sub-vector 0: %g\n", (double)PetscRealPart(sum)));
47: PetscCall(VecStrideSum(x, 1, &sum));
48: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Sum of sub-vector 1: %g\n", (double)PetscRealPart(sum)));
50: /*
51: Free work space. All PETSc objects should be destroyed when they
52: are no longer needed.
53: */
54: PetscCall(VecDestroy(&x));
55: PetscCall(PetscFinalize());
56: return 0;
57: }
59: /*TEST
61: test:
62: nsize: 2
64: TEST*/