Actual source code: cmatlab.c

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

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

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

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

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

     28:   PetscFunctionBegin;
     29:   PetscCall(PetscFree(matlab->string));
     30:   PetscCall(PetscMatlabEngineDestroy(&matlab->mengine));
     31:   PetscCall(PetscFree(matlab));
     32:   PetscFunctionReturn(PETSC_SUCCESS);
     33: }

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

     39:   PetscFunctionBegin;
     40:   PetscCheck(value, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Need to set string for MATLAB function, via -pf_matlab string");
     41:   PetscCall(PetscMatlabEnginePutArray(matlab->mengine, matlab->dimin, n, in, "x"));
     42:   PetscCall(PetscMatlabEngineEvaluate(matlab->mengine, matlab->string));
     43:   PetscCall(PetscMatlabEngineGetArray(matlab->mengine, matlab->dimout, n, out, "f"));
     44:   PetscFunctionReturn(PETSC_SUCCESS);
     45: }

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

     53:   PetscFunctionBegin;
     54:   PetscOptionsHeadBegin(PetscOptionsObject, "Matlab function options");
     55:   PetscCall(PetscOptionsString("-pf_matlab", "Matlab function", "None", "", value, sizeof(value), &flag));
     56:   if (flag) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
     57:   PetscOptionsHeadEnd();
     58:   PetscFunctionReturn(PETSC_SUCCESS);
     59: }

     61: PETSC_INTERN PetscErrorCode PFCreate_Matlab(PF pf, void *value)
     62: {
     63:   PF_Matlab *matlab;

     65:   PetscFunctionBegin;
     66:   PetscCall(PetscNew(&matlab));
     67:   matlab->dimin  = pf->dimin;
     68:   matlab->dimout = pf->dimout;

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

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

     75:   pf->ops->setfromoptions = PFSetFromOptions_Matlab;
     76:   PetscFunctionReturn(PETSC_SUCCESS);
     77: }