xref: /petsc/src/vec/pf/impls/matlab/cmatlab.c (revision bcda9346efad4e5ba2d553af84eb238771ba1e25)
1c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/
282c86c8fSBarry Smith #include <petscmatlab.h>          /*I  "petscmatlab.h"  I*/
3292f8084SBarry Smith 
4292f8084SBarry Smith /*
5a5b23f4aSJose E. Roman         This PF generates a MATLAB function on the fly
6292f8084SBarry Smith */
7292f8084SBarry Smith typedef struct {
81e1716dcSBarry Smith   PetscInt          dimin, dimout;
9292f8084SBarry Smith   PetscMatlabEngine mengine;
10292f8084SBarry Smith   char             *string;
11292f8084SBarry Smith } PF_Matlab;
12292f8084SBarry Smith 
PFView_Matlab(void * value,PetscViewer viewer)13da8c939bSJacob Faibussowitsch static PetscErrorCode PFView_Matlab(void *value, PetscViewer viewer)
14d71ae5a4SJacob Faibussowitsch {
15*9f196a02SMartin Diehl   PetscBool  isascii;
16292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)value;
17292f8084SBarry Smith 
18292f8084SBarry Smith   PetscFunctionBegin;
19*9f196a02SMartin Diehl   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
20*9f196a02SMartin Diehl   if (isascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Matlab Matlab = %s\n", matlab->string));
213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22292f8084SBarry Smith }
23292f8084SBarry Smith 
PFDestroy_Matlab(void * value)24da8c939bSJacob Faibussowitsch static PetscErrorCode PFDestroy_Matlab(void *value)
25d71ae5a4SJacob Faibussowitsch {
26292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)value;
27292f8084SBarry Smith 
28292f8084SBarry Smith   PetscFunctionBegin;
299566063dSJacob Faibussowitsch   PetscCall(PetscFree(matlab->string));
309566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineDestroy(&matlab->mengine));
319566063dSJacob Faibussowitsch   PetscCall(PetscFree(matlab));
323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
33292f8084SBarry Smith }
34292f8084SBarry Smith 
PFApply_Matlab(void * value,PetscInt n,const PetscScalar * in,PetscScalar * out)35da8c939bSJacob Faibussowitsch static PetscErrorCode PFApply_Matlab(void *value, PetscInt n, const PetscScalar *in, PetscScalar *out)
36d71ae5a4SJacob Faibussowitsch {
37292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)value;
38292f8084SBarry Smith 
39292f8084SBarry Smith   PetscFunctionBegin;
405f80ce2aSJacob Faibussowitsch   PetscCheck(value, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Need to set string for MATLAB function, via -pf_matlab string");
419566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEnginePutArray(matlab->mengine, matlab->dimin, n, in, "x"));
429566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineEvaluate(matlab->mengine, matlab->string));
439566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineGetArray(matlab->mengine, matlab->dimout, n, out, "f"));
443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
45292f8084SBarry Smith }
46292f8084SBarry Smith 
PFSetFromOptions_Matlab(PF pf,PetscOptionItems PetscOptionsObject)47ce78bad3SBarry Smith static PetscErrorCode PFSetFromOptions_Matlab(PF pf, PetscOptionItems PetscOptionsObject)
48d71ae5a4SJacob Faibussowitsch {
49ace3abfcSBarry Smith   PetscBool  flag;
50292f8084SBarry Smith   char       value[256];
51292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)pf->data;
52292f8084SBarry Smith 
53292f8084SBarry Smith   PetscFunctionBegin;
54d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Matlab function options");
559566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-pf_matlab", "Matlab function", "None", "", value, sizeof(value), &flag));
569566063dSJacob Faibussowitsch   if (flag) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
57d0609cedSBarry Smith   PetscOptionsHeadEnd();
583ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
59292f8084SBarry Smith }
60292f8084SBarry Smith 
PFCreate_Matlab(PF pf,void * value)61da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Matlab(PF pf, void *value)
62d71ae5a4SJacob Faibussowitsch {
63292f8084SBarry Smith   PF_Matlab *matlab;
64292f8084SBarry Smith 
65292f8084SBarry Smith   PetscFunctionBegin;
664dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&matlab));
67292f8084SBarry Smith   matlab->dimin  = pf->dimin;
68292f8084SBarry Smith   matlab->dimout = pf->dimout;
69292f8084SBarry Smith 
709566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf), NULL, &matlab->mengine));
71292f8084SBarry Smith 
729566063dSJacob Faibussowitsch   if (value) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
739566063dSJacob Faibussowitsch   PetscCall(PFSet(pf, PFApply_Matlab, NULL, PFView_Matlab, PFDestroy_Matlab, matlab));
74292f8084SBarry Smith 
75292f8084SBarry Smith   pf->ops->setfromoptions = PFSetFromOptions_Matlab;
763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
77292f8084SBarry Smith }
78