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;

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

 19:   PetscCall(VecViennaCLGetArray(x, &x_vcl));

 21:   PetscCall(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:   PetscCall(VecScale(y, 2.0));

 27:   PetscCall(VecViennaCLRestoreArray(x, &x_vcl));

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

 34:   PetscCall(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*/