xref: /petsc/src/vec/pf/impls/matlab/cmatlab.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
1 
2 #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/
3 #include <petscmatlab.h>          /*I  "petscmatlab.h"  I*/
4 
5 /*
6         This PF generates a MATLAB function on the fly
7 */
8 typedef struct {
9   PetscInt          dimin, dimout;
10   PetscMatlabEngine mengine;
11   char             *string;
12 } PF_Matlab;
13 
14 PetscErrorCode PFView_Matlab(void *value, PetscViewer viewer) {
15   PetscBool  iascii;
16   PF_Matlab *matlab = (PF_Matlab *)value;
17 
18   PetscFunctionBegin;
19   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
20   if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Matlab Matlab = %s\n", matlab->string));
21   PetscFunctionReturn(0);
22 }
23 
24 PetscErrorCode PFDestroy_Matlab(void *value) {
25   PF_Matlab *matlab = (PF_Matlab *)value;
26 
27   PetscFunctionBegin;
28   PetscCall(PetscFree(matlab->string));
29   PetscCall(PetscMatlabEngineDestroy(&matlab->mengine));
30   PetscCall(PetscFree(matlab));
31   PetscFunctionReturn(0);
32 }
33 
34 PetscErrorCode PFApply_Matlab(void *value, PetscInt n, const PetscScalar *in, PetscScalar *out) {
35   PF_Matlab *matlab = (PF_Matlab *)value;
36 
37   PetscFunctionBegin;
38   PetscCheck(value, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Need to set string for MATLAB function, via -pf_matlab string");
39   PetscCall(PetscMatlabEnginePutArray(matlab->mengine, matlab->dimin, n, in, "x"));
40   PetscCall(PetscMatlabEngineEvaluate(matlab->mengine, matlab->string));
41   PetscCall(PetscMatlabEngineGetArray(matlab->mengine, matlab->dimout, n, out, "f"));
42   PetscFunctionReturn(0);
43 }
44 
45 PetscErrorCode PFSetFromOptions_Matlab(PF pf, PetscOptionItems *PetscOptionsObject) {
46   PetscBool  flag;
47   char       value[256];
48   PF_Matlab *matlab = (PF_Matlab *)pf->data;
49 
50   PetscFunctionBegin;
51   PetscOptionsHeadBegin(PetscOptionsObject, "Matlab function options");
52   PetscCall(PetscOptionsString("-pf_matlab", "Matlab function", "None", "", value, sizeof(value), &flag));
53   if (flag) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
54   PetscOptionsHeadEnd();
55   PetscFunctionReturn(0);
56 }
57 
58 PETSC_EXTERN PetscErrorCode PFCreate_Matlab(PF pf, void *value) {
59   PF_Matlab *matlab;
60 
61   PetscFunctionBegin;
62   PetscCall(PetscNewLog(pf, &matlab));
63   matlab->dimin  = pf->dimin;
64   matlab->dimout = pf->dimout;
65 
66   PetscCall(PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf), NULL, &matlab->mengine));
67 
68   if (value) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
69   PetscCall(PFSet(pf, PFApply_Matlab, NULL, PFView_Matlab, PFDestroy_Matlab, matlab));
70 
71   pf->ops->setfromoptions = PFSetFromOptions_Matlab;
72   PetscFunctionReturn(0);
73 }
74