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*/