1 #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/
2 #include <petscmatlab.h> /*I "petscmatlab.h" I*/
3
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;
12
PFView_Matlab(void * value,PetscViewer viewer)13 static PetscErrorCode PFView_Matlab(void *value, PetscViewer viewer)
14 {
15 PetscBool isascii;
16 PF_Matlab *matlab = (PF_Matlab *)value;
17
18 PetscFunctionBegin;
19 PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
20 if (isascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Matlab Matlab = %s\n", matlab->string));
21 PetscFunctionReturn(PETSC_SUCCESS);
22 }
23
PFDestroy_Matlab(void * value)24 static PetscErrorCode PFDestroy_Matlab(void *value)
25 {
26 PF_Matlab *matlab = (PF_Matlab *)value;
27
28 PetscFunctionBegin;
29 PetscCall(PetscFree(matlab->string));
30 PetscCall(PetscMatlabEngineDestroy(&matlab->mengine));
31 PetscCall(PetscFree(matlab));
32 PetscFunctionReturn(PETSC_SUCCESS);
33 }
34
PFApply_Matlab(void * value,PetscInt n,const PetscScalar * in,PetscScalar * out)35 static PetscErrorCode PFApply_Matlab(void *value, PetscInt n, const PetscScalar *in, PetscScalar *out)
36 {
37 PF_Matlab *matlab = (PF_Matlab *)value;
38
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 }
46
PFSetFromOptions_Matlab(PF pf,PetscOptionItems PetscOptionsObject)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;
52
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 }
60
PFCreate_Matlab(PF pf,void * value)61 PETSC_INTERN PetscErrorCode PFCreate_Matlab(PF pf, void *value)
62 {
63 PF_Matlab *matlab;
64
65 PetscFunctionBegin;
66 PetscCall(PetscNew(&matlab));
67 matlab->dimin = pf->dimin;
68 matlab->dimout = pf->dimout;
69
70 PetscCall(PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf), NULL, &matlab->mengine));
71
72 if (value) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
73 PetscCall(PFSet(pf, PFApply_Matlab, NULL, PFView_Matlab, PFDestroy_Matlab, matlab));
74
75 pf->ops->setfromoptions = PFSetFromOptions_Matlab;
76 PetscFunctionReturn(PETSC_SUCCESS);
77 }
78