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 14*da8c939bSJacob Faibussowitsch static PetscErrorCode PFView_Matlab(void *value, PetscViewer viewer) 15d71ae5a4SJacob Faibussowitsch { 16ace3abfcSBarry Smith PetscBool iascii; 17292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)value; 18292f8084SBarry Smith 19292f8084SBarry Smith PetscFunctionBegin; 209566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 219566063dSJacob Faibussowitsch if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Matlab Matlab = %s\n", matlab->string)); 223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23292f8084SBarry Smith } 24292f8084SBarry Smith 25*da8c939bSJacob Faibussowitsch static PetscErrorCode PFDestroy_Matlab(void *value) 26d71ae5a4SJacob Faibussowitsch { 27292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)value; 28292f8084SBarry Smith 29292f8084SBarry Smith PetscFunctionBegin; 309566063dSJacob Faibussowitsch PetscCall(PetscFree(matlab->string)); 319566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineDestroy(&matlab->mengine)); 329566063dSJacob Faibussowitsch PetscCall(PetscFree(matlab)); 333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 34292f8084SBarry Smith } 35292f8084SBarry Smith 36*da8c939bSJacob Faibussowitsch static PetscErrorCode PFApply_Matlab(void *value, PetscInt n, const PetscScalar *in, PetscScalar *out) 37d71ae5a4SJacob Faibussowitsch { 38292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)value; 39292f8084SBarry Smith 40292f8084SBarry Smith PetscFunctionBegin; 415f80ce2aSJacob Faibussowitsch PetscCheck(value, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Need to set string for MATLAB function, via -pf_matlab string"); 429566063dSJacob Faibussowitsch PetscCall(PetscMatlabEnginePutArray(matlab->mengine, matlab->dimin, n, in, "x")); 439566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineEvaluate(matlab->mengine, matlab->string)); 449566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineGetArray(matlab->mengine, matlab->dimout, n, out, "f")); 453ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 46292f8084SBarry Smith } 47292f8084SBarry Smith 48*da8c939bSJacob Faibussowitsch static PetscErrorCode PFSetFromOptions_Matlab(PF pf, PetscOptionItems *PetscOptionsObject) 49d71ae5a4SJacob Faibussowitsch { 50ace3abfcSBarry Smith PetscBool flag; 51292f8084SBarry Smith char value[256]; 52292f8084SBarry Smith PF_Matlab *matlab = (PF_Matlab *)pf->data; 53292f8084SBarry Smith 54292f8084SBarry Smith PetscFunctionBegin; 55d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "Matlab function options"); 569566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-pf_matlab", "Matlab function", "None", "", value, sizeof(value), &flag)); 579566063dSJacob Faibussowitsch if (flag) PetscCall(PetscStrallocpy((char *)value, &matlab->string)); 58d0609cedSBarry Smith PetscOptionsHeadEnd(); 593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 60292f8084SBarry Smith } 61292f8084SBarry Smith 62*da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Matlab(PF pf, void *value) 63d71ae5a4SJacob Faibussowitsch { 64292f8084SBarry Smith PF_Matlab *matlab; 65292f8084SBarry Smith 66292f8084SBarry Smith PetscFunctionBegin; 674dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&matlab)); 68292f8084SBarry Smith matlab->dimin = pf->dimin; 69292f8084SBarry Smith matlab->dimout = pf->dimout; 70292f8084SBarry Smith 719566063dSJacob Faibussowitsch PetscCall(PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf), NULL, &matlab->mengine)); 72292f8084SBarry Smith 739566063dSJacob Faibussowitsch if (value) PetscCall(PetscStrallocpy((char *)value, &matlab->string)); 749566063dSJacob Faibussowitsch PetscCall(PFSet(pf, PFApply_Matlab, NULL, PFView_Matlab, PFDestroy_Matlab, matlab)); 75292f8084SBarry Smith 76292f8084SBarry Smith pf->ops->setfromoptions = PFSetFromOptions_Matlab; 773ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 78292f8084SBarry Smith } 79