Actual source code: ex52.c
1: static const char help[] = "Tests VecSum()\n\n";
3: #include <petscvec.h>
5: static PetscBool PetscIsCloseAtTolScalar(PetscScalar l, PetscScalar r, PetscReal atol, PetscReal rtol)
6: {
7: return (PetscBool)(PetscIsCloseAtTol(PetscRealPart(l), PetscRealPart(r), atol, rtol) && PetscIsCloseAtTol(PetscImaginaryPart(l), PetscImaginaryPart(r), atol, rtol));
8: }
10: static PetscErrorCode CheckVecSumReturn(Vec v, PetscScalar expected)
11: {
12: PetscScalar actual;
14: PetscFunctionBegin;
15: PetscCall(VecSum(v, &actual));
16: PetscCheck(PetscIsCloseAtTolScalar(actual, expected, 1e-12, 0.0), PETSC_COMM_SELF, PETSC_ERR_PLIB, "VecSum() returned %g + %gi, expected %g + %gi", (double)PetscRealPart(actual), (double)PetscImaginaryPart(actual), (double)PetscRealPart(expected), (double)PetscImaginaryPart(expected));
17: PetscFunctionReturn(PETSC_SUCCESS);
18: }
20: int main(int argc, char **argv)
21: {
22: PetscInt n, lo, N = 10;
23: PetscScalar sum = 0.0;
24: Vec x;
25: PetscScalar *array;
27: PetscFunctionBeginUser;
28: PetscCall(PetscInitialize(&argc, &argv, NULL, help));
30: PetscCall(VecCreate(PETSC_COMM_WORLD, &x));
31: PetscCall(VecSetSizes(x, PETSC_DECIDE, N));
32: PetscCall(VecSetFromOptions(x));
34: PetscCall(VecZeroEntries(x));
35: PetscCall(CheckVecSumReturn(x, 0.0));
37: PetscCall(VecSet(x, 1.0));
38: PetscCall(CheckVecSumReturn(x, 10.0));
40: PetscCall(VecGetLocalSize(x, &n));
41: PetscCall(VecGetOwnershipRange(x, &lo, NULL));
42: PetscCall(VecGetArrayWrite(x, &array));
43: for (PetscInt i = 0; i < n; ++i) array[i] = (PetscScalar)(lo + i);
44: PetscCall(VecRestoreArrayWrite(x, &array));
46: PetscCall(VecGetSize(x, &N));
47: for (PetscInt i = 0; i < N; ++i) sum += (PetscScalar)i;
48: PetscCall(CheckVecSumReturn(x, sum));
50: PetscCall(VecDestroy(&x));
51: PetscCall(PetscFinalize());
52: return 0;
53: }
55: /*TEST
57: testset:
58: output_file: ./output/empty.out
59: nsize: {{1 2}}
60: test:
61: suffix: standard
62: test:
63: requires: defined(PETSC_USE_SHARED_MEMORY)
64: args: -vec_type shared
65: suffix: shared
66: test:
67: requires: viennacl
68: args: -vec_type viennacl
69: suffix: viennacl
70: test:
71: requires: kokkos_kernels
72: args: -vec_type kokkos
73: suffix: kokkos
74: test:
75: requires: cuda
76: args: -vec_type cuda
77: suffix: cuda
78: test:
79: requires: hip
80: args: -vec_type hip
81: suffix: hip
83: TEST*/