Actual source code: cmatlab.c
2: #include <../src/vec/pf/pfimpl.h>
3: #include <petscmatlab.h>
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;
14: PetscErrorCode PFView_Matlab(void *value, PetscViewer viewer)
15: {
16: PetscBool iascii;
17: PF_Matlab *matlab = (PF_Matlab *)value;
19: PetscFunctionBegin;
20: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
21: if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Matlab Matlab = %s\n", matlab->string));
22: PetscFunctionReturn(PETSC_SUCCESS);
23: }
25: PetscErrorCode PFDestroy_Matlab(void *value)
26: {
27: PF_Matlab *matlab = (PF_Matlab *)value;
29: PetscFunctionBegin;
30: PetscCall(PetscFree(matlab->string));
31: PetscCall(PetscMatlabEngineDestroy(&matlab->mengine));
32: PetscCall(PetscFree(matlab));
33: PetscFunctionReturn(PETSC_SUCCESS);
34: }
36: PetscErrorCode PFApply_Matlab(void *value, PetscInt n, const PetscScalar *in, PetscScalar *out)
37: {
38: PF_Matlab *matlab = (PF_Matlab *)value;
40: PetscFunctionBegin;
41: PetscCheck(value, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Need to set string for MATLAB function, via -pf_matlab string");
42: PetscCall(PetscMatlabEnginePutArray(matlab->mengine, matlab->dimin, n, in, "x"));
43: PetscCall(PetscMatlabEngineEvaluate(matlab->mengine, matlab->string));
44: PetscCall(PetscMatlabEngineGetArray(matlab->mengine, matlab->dimout, n, out, "f"));
45: PetscFunctionReturn(PETSC_SUCCESS);
46: }
48: PetscErrorCode PFSetFromOptions_Matlab(PF pf, PetscOptionItems *PetscOptionsObject)
49: {
50: PetscBool flag;
51: char value[256];
52: PF_Matlab *matlab = (PF_Matlab *)pf->data;
54: PetscFunctionBegin;
55: PetscOptionsHeadBegin(PetscOptionsObject, "Matlab function options");
56: PetscCall(PetscOptionsString("-pf_matlab", "Matlab function", "None", "", value, sizeof(value), &flag));
57: if (flag) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
58: PetscOptionsHeadEnd();
59: PetscFunctionReturn(PETSC_SUCCESS);
60: }
62: PETSC_EXTERN PetscErrorCode PFCreate_Matlab(PF pf, void *value)
63: {
64: PF_Matlab *matlab;
66: PetscFunctionBegin;
67: PetscCall(PetscNew(&matlab));
68: matlab->dimin = pf->dimin;
69: matlab->dimout = pf->dimout;
71: PetscCall(PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf), NULL, &matlab->mengine));
73: if (value) PetscCall(PetscStrallocpy((char *)value, &matlab->string));
74: PetscCall(PFSet(pf, PFApply_Matlab, NULL, PFView_Matlab, PFDestroy_Matlab, matlab));
76: pf->ops->setfromoptions = PFSetFromOptions_Matlab;
77: PetscFunctionReturn(PETSC_SUCCESS);
78: }