Actual source code: ex43.c

  1: static char help[] = "Tests VecMDot(),VecDot(),VecMTDot(), and VecTDot()\n";

  3: #include <petscvec.h>

  5: int main(int argc, char **argv)
  6: {
  7:   Vec         *V, t;
  8:   PetscInt     i, j, reps, n = 15, k = 6;
  9:   PetscRandom  rctx;
 10:   PetscScalar *val_dot, *val_mdot, *tval_dot, *tval_mdot;

 13:   PetscInitialize(&argc, &argv, (char *)0, help);
 14:   PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL);
 15:   PetscOptionsGetInt(NULL, NULL, "-k", &k, NULL);
 16:   PetscPrintf(PETSC_COMM_WORLD, "Test with %" PetscInt_FMT " random vectors of length %" PetscInt_FMT "\n", k, n);
 17:   PetscRandomCreate(PETSC_COMM_WORLD, &rctx);
 18:   PetscRandomSetFromOptions(rctx);
 19: #if defined(PETSC_USE_COMPLEX)
 20:   PetscRandomSetInterval(rctx, -1. + 4. * PETSC_i, 1. + 5. * PETSC_i);
 21: #else
 22:   PetscRandomSetInterval(rctx, -1., 1.);
 23: #endif
 24:   VecCreate(PETSC_COMM_WORLD, &t);
 25:   VecSetSizes(t, n, PETSC_DECIDE);
 26:   VecSetFromOptions(t);
 27:   VecDuplicateVecs(t, k, &V);
 28:   VecSetRandom(t, rctx);
 29:   VecViewFromOptions(t, NULL, "-t_view");
 30:   PetscMalloc1(k, &val_dot);
 31:   PetscMalloc1(k, &val_mdot);
 32:   PetscMalloc1(k, &tval_dot);
 33:   PetscMalloc1(k, &tval_mdot);
 34:   for (i = 0; i < k; i++) VecSetRandom(V[i], rctx);
 35:   for (reps = 0; reps < 20; reps++) {
 36:     for (i = 1; i < k; i++) {
 37:       VecMDot(t, i, V, val_mdot);
 38:       VecMTDot(t, i, V, tval_mdot);
 39:       for (j = 0; j < i; j++) {
 40:         VecDot(t, V[j], &val_dot[j]);
 41:         VecTDot(t, V[j], &tval_dot[j]);
 42:       }
 43:       /* Check result */
 44:       for (j = 0; j < i; j++) {
 45:         if (PetscAbsScalar(val_mdot[j] - val_dot[j]) / PetscAbsScalar(val_dot[j]) > 1e-5) {
 46:           PetscPrintf(PETSC_COMM_WORLD, "[TEST FAILED] i=%" PetscInt_FMT ", j=%" PetscInt_FMT ", val_mdot[j]=%g, val_dot[j]=%g\n", i, j, (double)PetscAbsScalar(val_mdot[j]), (double)PetscAbsScalar(val_dot[j]));
 47:           break;
 48:         }
 49:         if (PetscAbsScalar(tval_mdot[j] - tval_dot[j]) / PetscAbsScalar(tval_dot[j]) > 1e-5) {
 50:           PetscPrintf(PETSC_COMM_WORLD, "[TEST FAILED] i=%" PetscInt_FMT ", j=%" PetscInt_FMT ", tval_mdot[j]=%g, tval_dot[j]=%g\n", i, j, (double)PetscAbsScalar(tval_mdot[j]), (double)PetscAbsScalar(tval_dot[j]));
 51:           break;
 52:         }
 53:       }
 54:     }
 55:   }
 56:   PetscPrintf(PETSC_COMM_WORLD, "Test completed successfully!\n");
 57:   PetscFree(val_dot);
 58:   PetscFree(val_mdot);
 59:   PetscFree(tval_dot);
 60:   PetscFree(tval_mdot);
 61:   VecDestroyVecs(k, &V);
 62:   VecDestroy(&t);
 63:   PetscRandomDestroy(&rctx);
 64:   PetscFinalize();
 65:   return 0;
 66: }

 68: /*TEST

 70:    test:

 72:    testset:
 73:       output_file: output/ex43_1.out

 75:       test:
 76:          suffix: cuda
 77:          args: -vec_type cuda -random_type curand
 78:          requires: cuda

 80:       test:
 81:          suffix: kokkos
 82:          args: -vec_type kokkos
 83:          requires: kokkos_kernels

 85:       test:
 86:          suffix: hip
 87:          args: -vec_type hip
 88:          requires: hip
 89: TEST*/