1292f8084SBarry Smith 2c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/ 382c86c8fSBarry Smith #include <petscmatlab.h> /*I "petscmatlab.h" I*/ 4292f8084SBarry Smith 5292f8084SBarry Smith /* 6a5b23f4aSJose E. Roman This PF generates a MATLAB function on the fly 7292f8084SBarry Smith */ 8292f8084SBarry Smith typedef struct { 91e1716dcSBarry Smith PetscInt dimin, dimout; 10292f8084SBarry Smith PetscMatlabEngine mengine; 11292f8084SBarry Smith char *string; 12292f8084SBarry Smith } PF_Matlab; 13292f8084SBarry Smith 149371c9d4SSatish Balay PetscErrorCode PFView_Matlab(void *value, PetscViewer viewer) { 15ace3abfcSBarry Smith PetscBool iascii; 16292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)value; 17292f8084SBarry Smith 18292f8084SBarry Smith PetscFunctionBegin; 199566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 209566063dSJacob Faibussowitsch if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Matlab Matlab = %s\n", matlab->string)); 21292f8084SBarry Smith PetscFunctionReturn(0); 22292f8084SBarry Smith } 23292f8084SBarry Smith 249371c9d4SSatish Balay PetscErrorCode PFDestroy_Matlab(void *value) { 25292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)value; 26292f8084SBarry Smith 27292f8084SBarry Smith PetscFunctionBegin; 289566063dSJacob Faibussowitsch PetscCall(PetscFree(matlab->string)); 299566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineDestroy(&matlab->mengine)); 309566063dSJacob Faibussowitsch PetscCall(PetscFree(matlab)); 31292f8084SBarry Smith PetscFunctionReturn(0); 32292f8084SBarry Smith } 33292f8084SBarry Smith 349371c9d4SSatish Balay PetscErrorCode PFApply_Matlab(void *value, PetscInt n, const PetscScalar *in, PetscScalar *out) { 35292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)value; 36292f8084SBarry Smith 37292f8084SBarry Smith PetscFunctionBegin; 385f80ce2aSJacob Faibussowitsch PetscCheck(value, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Need to set string for MATLAB function, via -pf_matlab string"); 399566063dSJacob Faibussowitsch PetscCall(PetscMatlabEnginePutArray(matlab->mengine, matlab->dimin, n, in, "x")); 409566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineEvaluate(matlab->mengine, matlab->string)); 419566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineGetArray(matlab->mengine, matlab->dimout, n, out, "f")); 42292f8084SBarry Smith PetscFunctionReturn(0); 43292f8084SBarry Smith } 44292f8084SBarry Smith 459371c9d4SSatish Balay PetscErrorCode PFSetFromOptions_Matlab(PF pf, PetscOptionItems *PetscOptionsObject) { 46ace3abfcSBarry Smith PetscBool flag; 47292f8084SBarry Smith char value[256]; 48292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)pf->data; 49292f8084SBarry Smith 50292f8084SBarry Smith PetscFunctionBegin; 51d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "Matlab function options"); 529566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-pf_matlab", "Matlab function", "None", "", value, sizeof(value), &flag)); 539566063dSJacob Faibussowitsch if (flag) PetscCall(PetscStrallocpy((char *)value, &matlab->string)); 54d0609cedSBarry Smith PetscOptionsHeadEnd(); 55292f8084SBarry Smith PetscFunctionReturn(0); 56292f8084SBarry Smith } 57292f8084SBarry Smith 589371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PFCreate_Matlab(PF pf, void *value) { 59292f8084SBarry Smith PF_Matlab *matlab; 60292f8084SBarry Smith 61292f8084SBarry Smith PetscFunctionBegin; 62*4dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&matlab)); 63292f8084SBarry Smith matlab->dimin = pf->dimin; 64292f8084SBarry Smith matlab->dimout = pf->dimout; 65292f8084SBarry Smith 669566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf), NULL, &matlab->mengine)); 67292f8084SBarry Smith 689566063dSJacob Faibussowitsch if (value) PetscCall(PetscStrallocpy((char *)value, &matlab->string)); 699566063dSJacob Faibussowitsch PetscCall(PFSet(pf, PFApply_Matlab, NULL, PFView_Matlab, PFDestroy_Matlab, matlab)); 70292f8084SBarry Smith 71292f8084SBarry Smith pf->ops->setfromoptions = PFSetFromOptions_Matlab; 72292f8084SBarry Smith PetscFunctionReturn(0); 73292f8084SBarry Smith } 74