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