Actual source code: cmatlab.c


  2: #include <../src/vec/pf/pfimpl.h>
  3: #include <petscmatlab.h>

  5: /*
  6:         This PF generates a MATLAB function on the fly
  7: */
  8: typedef struct {
  9:   PetscInt          dimin, dimout;
 10:   PetscMatlabEngine mengine;
 11:   char             *string;
 12: } PF_Matlab;

 14: PetscErrorCode PFView_Matlab(void *value, PetscViewer viewer)
 15: {
 16:   PetscBool  iascii;
 17:   PF_Matlab *matlab = (PF_Matlab *)value;

 19:   PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii);
 20:   if (iascii) PetscViewerASCIIPrintf(viewer, "Matlab Matlab = %s\n", matlab->string);
 21:   return 0;
 22: }

 24: PetscErrorCode PFDestroy_Matlab(void *value)
 25: {
 26:   PF_Matlab *matlab = (PF_Matlab *)value;

 28:   PetscFree(matlab->string);
 29:   PetscMatlabEngineDestroy(&matlab->mengine);
 30:   PetscFree(matlab);
 31:   return 0;
 32: }

 34: PetscErrorCode PFApply_Matlab(void *value, PetscInt n, const PetscScalar *in, PetscScalar *out)
 35: {
 36:   PF_Matlab *matlab = (PF_Matlab *)value;

 39:   PetscMatlabEnginePutArray(matlab->mengine, matlab->dimin, n, in, "x");
 40:   PetscMatlabEngineEvaluate(matlab->mengine, matlab->string);
 41:   PetscMatlabEngineGetArray(matlab->mengine, matlab->dimout, n, out, "f");
 42:   return 0;
 43: }

 45: PetscErrorCode PFSetFromOptions_Matlab(PF pf, PetscOptionItems *PetscOptionsObject)
 46: {
 47:   PetscBool  flag;
 48:   char       value[256];
 49:   PF_Matlab *matlab = (PF_Matlab *)pf->data;

 51:   PetscOptionsHeadBegin(PetscOptionsObject, "Matlab function options");
 52:   PetscOptionsString("-pf_matlab", "Matlab function", "None", "", value, sizeof(value), &flag);
 53:   if (flag) PetscStrallocpy((char *)value, &matlab->string);
 54:   PetscOptionsHeadEnd();
 55:   return 0;
 56: }

 58: PETSC_EXTERN PetscErrorCode PFCreate_Matlab(PF pf, void *value)
 59: {
 60:   PF_Matlab *matlab;

 62:   PetscNew(&matlab);
 63:   matlab->dimin  = pf->dimin;
 64:   matlab->dimout = pf->dimout;

 66:   PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf), NULL, &matlab->mengine);

 68:   if (value) PetscStrallocpy((char *)value, &matlab->string);
 69:   PFSet(pf, PFApply_Matlab, NULL, PFView_Matlab, PFDestroy_Matlab, matlab);

 71:   pf->ops->setfromoptions = PFSetFromOptions_Matlab;
 72:   return 0;
 73: }