Actual source code: gcreatev.c

  1: #include <petscvec.h>
  2: #include <petsc/private/petscimpl.h>

  4: #include <engine.h> /* MATLAB include file */
  5: #include <mex.h>    /* MATLAB include file */

  7: PETSC_EXTERN PetscErrorCode VecMatlabEnginePut_Default(PetscObject obj, void *mengine)
  8: {
  9:   PetscInt           n;
 10:   Vec                vec = (Vec)obj;
 11:   const PetscScalar *array;
 12:   mxArray           *mat;

 14:   PetscFunctionBegin;
 15:   PetscCall(VecGetArrayRead(vec, &array));
 16:   PetscCall(VecGetLocalSize(vec, &n));
 17: #if defined(PETSC_USE_COMPLEX)
 18:   mat = mxCreateDoubleMatrix(n, 1, mxCOMPLEX);
 19: #else
 20:   mat = mxCreateDoubleMatrix(n, 1, mxREAL);
 21: #endif
 22:   PetscCall(PetscArraycpy(mxGetPr(mat), array, n));
 23:   PetscCall(PetscObjectName(obj));
 24:   engPutVariable((Engine *)mengine, obj->name, mat);

 26:   PetscCall(VecRestoreArrayRead(vec, &array));
 27:   PetscFunctionReturn(PETSC_SUCCESS);
 28: }

 30: PETSC_EXTERN PetscErrorCode VecMatlabEngineGet_Default(PetscObject obj, void *mengine)
 31: {
 32:   PetscInt     n;
 33:   Vec          vec = (Vec)obj;
 34:   PetscScalar *array;
 35:   mxArray     *mat;

 37:   PetscFunctionBegin;
 38:   PetscCall(VecGetArray(vec, &array));
 39:   PetscCall(VecGetLocalSize(vec, &n));
 40:   mat = engGetVariable((Engine *)mengine, obj->name);
 41:   PetscCheck(mat, PETSC_COMM_SELF, PETSC_ERR_LIB, "Unable to get object %s from matlab", obj->name);
 42:   PetscCall(PetscArraycpy(array, mxGetPr(mat), n));
 43:   PetscCall(VecRestoreArray(vec, &array));
 44:   PetscFunctionReturn(PETSC_SUCCESS);
 45: }