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, nullptr, nullptr));
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*/