Actual source code: ex57.cxx

  1: #include "petsc.h"
  2: #include "petscviennacl.h"
  3: #include <viennacl/vector.hpp>
  4: typedef viennacl::vector<PetscScalar> ViennaclVector;

  6: int main(int argc, char *argv[])
  7: {
  8:   Vec             x, y;
  9:   PetscInt        n = 5;
 10:   ViennaclVector *x_vcl;

 13:   PetscInitialize(&argc, &argv, (char *)0, NULL);
 14:   VecCreate(PETSC_COMM_WORLD, &x);
 15:   VecSetSizes(x, n, PETSC_DECIDE);
 16:   VecSetType(x, VECVIENNACL);
 17:   VecSet(x, 42.0);

 19:   VecViennaCLGetArray(x, &x_vcl);

 21:   VecCreateSeqViennaCLWithArray(PETSC_COMM_WORLD, 1, n, (const ViennaclVector *)x_vcl, &y);

 23:   // Operated on 'y', but 'x' would also be changed since both
 24:   // 'x' and 'y' share the same viennacl vector.
 25:   VecScale(y, 2.0);

 27:   VecViennaCLRestoreArray(x, &x_vcl);

 29:   // Expected output: 'x' is a 5-vector with all entries as '84'.
 30:   VecView(x, PETSC_VIEWER_STDOUT_WORLD);
 31:   VecDestroy(&y);
 32:   VecDestroy(&x);

 34:   PetscFinalize();
 35:   return 0;
 36: }

 38: /*TEST

 40:    build:
 41:       requires: viennacl defined(PETSC_HAVE_VIENNACL_NO_CUDA)

 43:    test:
 44:       nsize: 1
 45:       suffix: 1
 46:       args: -viennacl_backend opencl -viennacl_opencl_device_type gpu

 48: TEST*/