xref: /petsc/src/vec/pf/impls/matlab/cmatlab.c (revision da8c939b118068a1ceac5e4b3ba271c87cfc5bc7)
1292f8084SBarry Smith 
2c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/
382c86c8fSBarry Smith #include <petscmatlab.h>          /*I  "petscmatlab.h"  I*/
4292f8084SBarry Smith 
5292f8084SBarry Smith /*
6a5b23f4aSJose E. Roman         This PF generates a MATLAB function on the fly
7292f8084SBarry Smith */
8292f8084SBarry Smith typedef struct {
91e1716dcSBarry Smith   PetscInt          dimin, dimout;
10292f8084SBarry Smith   PetscMatlabEngine mengine;
11292f8084SBarry Smith   char             *string;
12292f8084SBarry Smith } PF_Matlab;
13292f8084SBarry Smith 
14*da8c939bSJacob Faibussowitsch static PetscErrorCode PFView_Matlab(void *value, PetscViewer viewer)
15d71ae5a4SJacob Faibussowitsch {
16ace3abfcSBarry Smith   PetscBool  iascii;
17292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)value;
18292f8084SBarry Smith 
19292f8084SBarry Smith   PetscFunctionBegin;
209566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
219566063dSJacob Faibussowitsch   if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Matlab Matlab = %s\n", matlab->string));
223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23292f8084SBarry Smith }
24292f8084SBarry Smith 
25*da8c939bSJacob Faibussowitsch static PetscErrorCode PFDestroy_Matlab(void *value)
26d71ae5a4SJacob Faibussowitsch {
27292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)value;
28292f8084SBarry Smith 
29292f8084SBarry Smith   PetscFunctionBegin;
309566063dSJacob Faibussowitsch   PetscCall(PetscFree(matlab->string));
319566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineDestroy(&matlab->mengine));
329566063dSJacob Faibussowitsch   PetscCall(PetscFree(matlab));
333ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
34292f8084SBarry Smith }
35292f8084SBarry Smith 
36*da8c939bSJacob Faibussowitsch static PetscErrorCode PFApply_Matlab(void *value, PetscInt n, const PetscScalar *in, PetscScalar *out)
37d71ae5a4SJacob Faibussowitsch {
38292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)value;
39292f8084SBarry Smith 
40292f8084SBarry Smith   PetscFunctionBegin;
415f80ce2aSJacob Faibussowitsch   PetscCheck(value, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Need to set string for MATLAB function, via -pf_matlab string");
429566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEnginePutArray(matlab->mengine, matlab->dimin, n, in, "x"));
439566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineEvaluate(matlab->mengine, matlab->string));
449566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineGetArray(matlab->mengine, matlab->dimout, n, out, "f"));
453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
46292f8084SBarry Smith }
47292f8084SBarry Smith 
48*da8c939bSJacob Faibussowitsch static PetscErrorCode PFSetFromOptions_Matlab(PF pf, PetscOptionItems *PetscOptionsObject)
49d71ae5a4SJacob Faibussowitsch {
50ace3abfcSBarry Smith   PetscBool  flag;
51292f8084SBarry Smith   char       value[256];
52292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)pf->data;
53292f8084SBarry Smith 
54292f8084SBarry Smith   PetscFunctionBegin;
55d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Matlab function options");
569566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-pf_matlab", "Matlab function", "None", "", value, sizeof(value), &flag));
579566063dSJacob Faibussowitsch   if (flag) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
58d0609cedSBarry Smith   PetscOptionsHeadEnd();
593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
60292f8084SBarry Smith }
61292f8084SBarry Smith 
62*da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Matlab(PF pf, void *value)
63d71ae5a4SJacob Faibussowitsch {
64292f8084SBarry Smith   PF_Matlab *matlab;
65292f8084SBarry Smith 
66292f8084SBarry Smith   PetscFunctionBegin;
674dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&matlab));
68292f8084SBarry Smith   matlab->dimin  = pf->dimin;
69292f8084SBarry Smith   matlab->dimout = pf->dimout;
70292f8084SBarry Smith 
719566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf), NULL, &matlab->mengine));
72292f8084SBarry Smith 
739566063dSJacob Faibussowitsch   if (value) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
749566063dSJacob Faibussowitsch   PetscCall(PFSet(pf, PFApply_Matlab, NULL, PFView_Matlab, PFDestroy_Matlab, matlab));
75292f8084SBarry Smith 
76292f8084SBarry Smith   pf->ops->setfromoptions = PFSetFromOptions_Matlab;
773ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
78292f8084SBarry Smith }
79