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: }