Actual source code: ex54.c

  1: static const char help[] = "Tests VecPointwiseMaxAbs()\n\n";

  3: #include <petscvec.h>

  5: static PetscErrorCode TestPointwiseMaxAbs(Vec result, Vec x, Vec y, Vec ref)
  6: {
  7:   PetscInt           n;
  8:   const PetscScalar *array, *ref_array;

 10:   PetscFunctionBegin;
 11:   PetscCall(VecPointwiseMaxAbs(result, x, y));
 12:   PetscCall(VecGetLocalSize(result, &n));
 13:   PetscCall(VecGetArrayRead(result, &array));
 14:   PetscCall(VecGetArrayRead(ref, &ref_array));
 15:   for (PetscInt i = 0; i < n; ++i) {
 16:     const PetscReal expected    = PetscAbsScalar(ref_array[i]);
 17:     const PetscReal actual_real = PetscRealPart(array[i]), actual_imag = PetscImaginaryPart(array[i]);

 19:     PetscCheck(actual_imag == (PetscReal)0.0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "VecPointwiseMaxAbs() did not properly take absolute value, imaginary part %g != 0.0", (double)actual_imag);
 20:     PetscCheck(actual_real >= (PetscReal)0.0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "VecPointwiseMaxAbs() did not properly take absolute value, real part %g < 0.0", (double)actual_real);
 21:     PetscCheck(actual_real == expected, PETSC_COMM_SELF, PETSC_ERR_PLIB, "VecShift() returned array[%" PetscInt_FMT "] %g + %gi != expected_array[%" PetscInt_FMT "] %g + 0.0i", i, (double)actual_real, (double)actual_imag, i, (double)expected);
 22:   }
 23:   PetscCall(VecRestoreArrayRead(ref, &ref_array));
 24:   PetscCall(VecRestoreArrayRead(result, &array));
 25:   PetscFunctionReturn(PETSC_SUCCESS);
 26: }

 28: int main(int argc, char **argv)
 29: {
 30:   Vec x, y, z;

 32:   PetscFunctionBeginUser;
 33:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));

 35:   PetscCall(VecCreate(PETSC_COMM_WORLD, &x));
 36:   PetscCall(VecSetSizes(x, PETSC_DECIDE, 10));
 37:   PetscCall(VecSetFromOptions(x));
 38:   PetscCall(VecDuplicate(x, &y));
 39:   PetscCall(VecDuplicate(x, &z));

 41:   PetscCall(VecSet(x, 0.0));
 42:   PetscCall(VecSet(y, 10.0));

 44:   // Basic correctness tests, z should always match abs(y) exactly
 45:   PetscCall(TestPointwiseMaxAbs(z, x, y, y));
 46:   PetscCall(VecSet(x, 1.0));
 47:   PetscCall(TestPointwiseMaxAbs(z, x, y, y));
 48:   PetscCall(VecSet(x, -1.0));
 49:   PetscCall(TestPointwiseMaxAbs(z, x, y, y));
 50:   PetscCall(VecSet(y, -10.0));
 51:   PetscCall(TestPointwiseMaxAbs(z, x, y, y));

 53:   // Test that it works if x and y are the same vector
 54:   PetscCall(VecSet(x, 0.0));
 55:   PetscCall(TestPointwiseMaxAbs(z, x, x, x));
 56:   PetscCall(VecSet(x, 1.0));
 57:   PetscCall(TestPointwiseMaxAbs(z, x, x, x));
 58:   PetscCall(VecSet(x, -1.0));
 59:   PetscCall(TestPointwiseMaxAbs(z, x, x, x));

 61:   // Test that it works if z is one of x or y
 62:   PetscCall(VecSet(z, 0.0));
 63:   PetscCall(VecSet(x, 0.0));
 64:   PetscCall(TestPointwiseMaxAbs(z, x, z, x));
 65:   PetscCall(VecSet(x, 1.0));
 66:   PetscCall(TestPointwiseMaxAbs(z, z, x, x));
 67:   PetscCall(VecSet(x, -10.0));
 68:   PetscCall(TestPointwiseMaxAbs(z, x, z, x));

 70:   // Test that it works if all vectors are the same
 71:   PetscCall(VecSet(z, 0.0));
 72:   PetscCall(TestPointwiseMaxAbs(z, z, z, z));
 73:   PetscCall(VecSet(z, 1.0));
 74:   PetscCall(TestPointwiseMaxAbs(z, z, z, z));
 75:   PetscCall(VecSet(z, -1.0));
 76:   PetscCall(TestPointwiseMaxAbs(z, z, z, z));

 78:   PetscCall(VecDestroy(&x));
 79:   PetscCall(VecDestroy(&y));
 80:   PetscCall(VecDestroy(&z));
 81:   PetscCall(PetscFinalize());
 82:   return 0;
 83: }

 85: /*TEST

 87:   testset:
 88:     output_file: ./output/empty.out
 89:     nsize: {{1 2}}
 90:     test:
 91:       suffix: standard
 92:     test:
 93:       requires: defined(PETSC_USE_SHARED_MEMORY)
 94:       args: -vec_type shared
 95:       suffix: shared
 96:     test:
 97:       requires: viennacl
 98:       args: -vec_type viennacl
 99:       suffix: viennacl
100:     test:
101:       requires: kokkos_kernels
102:       args: -vec_type kokkos
103:       suffix: kokkos
104:     test:
105:       requires: cuda
106:       args: -vec_type cuda
107:       suffix: cuda
108:     test:
109:       requires: hip
110:       args: -vec_type hip
111:       suffix: hip

113: TEST*/