1c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/ 282c86c8fSBarry Smith #include <petscmatlab.h> /*I "petscmatlab.h" I*/ 3292f8084SBarry Smith 4292f8084SBarry Smith /* 5a5b23f4aSJose E. Roman This PF generates a MATLAB function on the fly 6292f8084SBarry Smith */ 7292f8084SBarry Smith typedef struct { 81e1716dcSBarry Smith PetscInt dimin, dimout; 9292f8084SBarry Smith PetscMatlabEngine mengine; 10292f8084SBarry Smith char *string; 11292f8084SBarry Smith } PF_Matlab; 12292f8084SBarry Smith 13da8c939bSJacob Faibussowitsch static PetscErrorCode PFView_Matlab(void *value, PetscViewer viewer) 14d71ae5a4SJacob Faibussowitsch { 15*9f196a02SMartin Diehl PetscBool isascii; 16292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)value; 17292f8084SBarry Smith 18292f8084SBarry Smith PetscFunctionBegin; 19*9f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 20*9f196a02SMartin Diehl if (isascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Matlab Matlab = %s\n", matlab->string)); 213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22292f8084SBarry Smith } 23292f8084SBarry Smith 24da8c939bSJacob Faibussowitsch static PetscErrorCode PFDestroy_Matlab(void *value) 25d71ae5a4SJacob Faibussowitsch { 26292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)value; 27292f8084SBarry Smith 28292f8084SBarry Smith PetscFunctionBegin; 299566063dSJacob Faibussowitsch PetscCall(PetscFree(matlab->string)); 309566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineDestroy(&matlab->mengine)); 319566063dSJacob Faibussowitsch PetscCall(PetscFree(matlab)); 323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 33292f8084SBarry Smith } 34292f8084SBarry Smith 35da8c939bSJacob Faibussowitsch static PetscErrorCode PFApply_Matlab(void *value, PetscInt n, const PetscScalar *in, PetscScalar *out) 36d71ae5a4SJacob Faibussowitsch { 37292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)value; 38292f8084SBarry Smith 39292f8084SBarry Smith PetscFunctionBegin; 405f80ce2aSJacob Faibussowitsch PetscCheck(value, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Need to set string for MATLAB function, via -pf_matlab string"); 419566063dSJacob Faibussowitsch PetscCall(PetscMatlabEnginePutArray(matlab->mengine, matlab->dimin, n, in, "x")); 429566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineEvaluate(matlab->mengine, matlab->string)); 439566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineGetArray(matlab->mengine, matlab->dimout, n, out, "f")); 443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 45292f8084SBarry Smith } 46292f8084SBarry Smith 47ce78bad3SBarry Smith static PetscErrorCode PFSetFromOptions_Matlab(PF pf, PetscOptionItems PetscOptionsObject) 48d71ae5a4SJacob Faibussowitsch { 49ace3abfcSBarry Smith PetscBool flag; 50292f8084SBarry Smith char value[256]; 51292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)pf->data; 52292f8084SBarry Smith 53292f8084SBarry Smith PetscFunctionBegin; 54d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "Matlab function options"); 559566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-pf_matlab", "Matlab function", "None", "", value, sizeof(value), &flag)); 569566063dSJacob Faibussowitsch if (flag) PetscCall(PetscStrallocpy((char *)value, &matlab->string)); 57d0609cedSBarry Smith PetscOptionsHeadEnd(); 583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 59292f8084SBarry Smith } 60292f8084SBarry Smith 61da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Matlab(PF pf, void *value) 62d71ae5a4SJacob Faibussowitsch { 63292f8084SBarry Smith PF_Matlab *matlab; 64292f8084SBarry Smith 65292f8084SBarry Smith PetscFunctionBegin; 664dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&matlab)); 67292f8084SBarry Smith matlab->dimin = pf->dimin; 68292f8084SBarry Smith matlab->dimout = pf->dimout; 69292f8084SBarry Smith 709566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf), NULL, &matlab->mengine)); 71292f8084SBarry Smith 729566063dSJacob Faibussowitsch if (value) PetscCall(PetscStrallocpy((char *)value, &matlab->string)); 739566063dSJacob Faibussowitsch PetscCall(PFSet(pf, PFApply_Matlab, NULL, PFView_Matlab, PFDestroy_Matlab, matlab)); 74292f8084SBarry Smith 75292f8084SBarry Smith pf->ops->setfromoptions = PFSetFromOptions_Matlab; 763ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 77292f8084SBarry Smith } 78