Actual source code: gcreatev.c
2: #include <petscvec.h>
3: #include <petsc/private/petscimpl.h>
5: #include <engine.h> /* MATLAB include file */
6: #include <mex.h> /* MATLAB include file */
8: PETSC_EXTERN PetscErrorCode VecMatlabEnginePut_Default(PetscObject obj, void *mengine)
9: {
10: PetscInt n;
11: Vec vec = (Vec)obj;
12: const PetscScalar *array;
13: mxArray *mat;
15: PetscFunctionBegin;
16: PetscCall(VecGetArrayRead(vec, &array));
17: PetscCall(VecGetLocalSize(vec, &n));
18: #if defined(PETSC_USE_COMPLEX)
19: mat = mxCreateDoubleMatrix(n, 1, mxCOMPLEX);
20: #else
21: mat = mxCreateDoubleMatrix(n, 1, mxREAL);
22: #endif
23: PetscCall(PetscArraycpy(mxGetPr(mat), array, n));
24: PetscCall(PetscObjectName(obj));
25: engPutVariable((Engine *)mengine, obj->name, mat);
27: PetscCall(VecRestoreArrayRead(vec, &array));
28: PetscFunctionReturn(PETSC_SUCCESS);
29: }
31: PETSC_EXTERN PetscErrorCode VecMatlabEngineGet_Default(PetscObject obj, void *mengine)
32: {
33: PetscInt n;
34: Vec vec = (Vec)obj;
35: PetscScalar *array;
36: mxArray *mat;
38: PetscFunctionBegin;
39: PetscCall(VecGetArray(vec, &array));
40: PetscCall(VecGetLocalSize(vec, &n));
41: mat = engGetVariable((Engine *)mengine, obj->name);
42: PetscCheck(mat, PETSC_COMM_SELF, PETSC_ERR_LIB, "Unable to get object %s from matlab", obj->name);
43: PetscCall(PetscArraycpy(array, mxGetPr(mat), n));
44: PetscCall(VecRestoreArray(vec, &array));
45: PetscFunctionReturn(PETSC_SUCCESS);
46: }