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