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