xref: /petsc/src/vec/pf/impls/matlab/cmatlab.c (revision 4dfa11a44d5adf2389f1d3acbc8f3c1116dc6c3a)
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 
149371c9d4SSatish Balay PetscErrorCode PFView_Matlab(void *value, PetscViewer viewer) {
15ace3abfcSBarry Smith   PetscBool  iascii;
16292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)value;
17292f8084SBarry Smith 
18292f8084SBarry Smith   PetscFunctionBegin;
199566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
209566063dSJacob Faibussowitsch   if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Matlab Matlab = %s\n", matlab->string));
21292f8084SBarry Smith   PetscFunctionReturn(0);
22292f8084SBarry Smith }
23292f8084SBarry Smith 
249371c9d4SSatish Balay PetscErrorCode PFDestroy_Matlab(void *value) {
25292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)value;
26292f8084SBarry Smith 
27292f8084SBarry Smith   PetscFunctionBegin;
289566063dSJacob Faibussowitsch   PetscCall(PetscFree(matlab->string));
299566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineDestroy(&matlab->mengine));
309566063dSJacob Faibussowitsch   PetscCall(PetscFree(matlab));
31292f8084SBarry Smith   PetscFunctionReturn(0);
32292f8084SBarry Smith }
33292f8084SBarry Smith 
349371c9d4SSatish Balay PetscErrorCode PFApply_Matlab(void *value, PetscInt n, const PetscScalar *in, PetscScalar *out) {
35292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)value;
36292f8084SBarry Smith 
37292f8084SBarry Smith   PetscFunctionBegin;
385f80ce2aSJacob Faibussowitsch   PetscCheck(value, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Need to set string for MATLAB function, via -pf_matlab string");
399566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEnginePutArray(matlab->mengine, matlab->dimin, n, in, "x"));
409566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineEvaluate(matlab->mengine, matlab->string));
419566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineGetArray(matlab->mengine, matlab->dimout, n, out, "f"));
42292f8084SBarry Smith   PetscFunctionReturn(0);
43292f8084SBarry Smith }
44292f8084SBarry Smith 
459371c9d4SSatish Balay PetscErrorCode PFSetFromOptions_Matlab(PF pf, PetscOptionItems *PetscOptionsObject) {
46ace3abfcSBarry Smith   PetscBool  flag;
47292f8084SBarry Smith   char       value[256];
48292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab *)pf->data;
49292f8084SBarry Smith 
50292f8084SBarry Smith   PetscFunctionBegin;
51d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Matlab function options");
529566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-pf_matlab", "Matlab function", "None", "", value, sizeof(value), &flag));
539566063dSJacob Faibussowitsch   if (flag) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
54d0609cedSBarry Smith   PetscOptionsHeadEnd();
55292f8084SBarry Smith   PetscFunctionReturn(0);
56292f8084SBarry Smith }
57292f8084SBarry Smith 
589371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PFCreate_Matlab(PF pf, void *value) {
59292f8084SBarry Smith   PF_Matlab *matlab;
60292f8084SBarry Smith 
61292f8084SBarry Smith   PetscFunctionBegin;
62*4dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&matlab));
63292f8084SBarry Smith   matlab->dimin  = pf->dimin;
64292f8084SBarry Smith   matlab->dimout = pf->dimout;
65292f8084SBarry Smith 
669566063dSJacob Faibussowitsch   PetscCall(PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf), NULL, &matlab->mengine));
67292f8084SBarry Smith 
689566063dSJacob Faibussowitsch   if (value) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
699566063dSJacob Faibussowitsch   PetscCall(PFSet(pf, PFApply_Matlab, NULL, PFView_Matlab, PFDestroy_Matlab, matlab));
70292f8084SBarry Smith 
71292f8084SBarry Smith   pf->ops->setfromoptions = PFSetFromOptions_Matlab;
72292f8084SBarry Smith   PetscFunctionReturn(0);
73292f8084SBarry Smith }
74