xref: /petsc/src/vec/pf/impls/matlab/cmatlab.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
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 
14292f8084SBarry Smith PetscErrorCode PFView_Matlab(void *value,PetscViewer viewer)
15292f8084SBarry Smith {
16ace3abfcSBarry Smith   PetscBool      iascii;
17292f8084SBarry Smith   PF_Matlab      *matlab = (PF_Matlab*)value;
18292f8084SBarry Smith 
19292f8084SBarry Smith   PetscFunctionBegin;
20*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii));
21*5f80ce2aSJacob Faibussowitsch   if (iascii) CHKERRQ(PetscViewerASCIIPrintf(viewer,"Matlab Matlab = %s\n",matlab->string));
22292f8084SBarry Smith   PetscFunctionReturn(0);
23292f8084SBarry Smith }
24292f8084SBarry Smith 
25292f8084SBarry Smith PetscErrorCode PFDestroy_Matlab(void *value)
26292f8084SBarry Smith {
27292f8084SBarry Smith   PF_Matlab      *matlab = (PF_Matlab*)value;
28292f8084SBarry Smith 
29292f8084SBarry Smith   PetscFunctionBegin;
30*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(matlab->string));
31*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMatlabEngineDestroy(&matlab->mengine));
32*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(matlab));
33292f8084SBarry Smith   PetscFunctionReturn(0);
34292f8084SBarry Smith }
35292f8084SBarry Smith 
3669b4f73cSBarry Smith PetscErrorCode PFApply_Matlab(void *value,PetscInt n,const PetscScalar *in,PetscScalar *out)
37292f8084SBarry Smith {
38292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab*)value;
39292f8084SBarry Smith 
40292f8084SBarry Smith   PetscFunctionBegin;
41*5f80ce2aSJacob Faibussowitsch   PetscCheck(value,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Need to set string for MATLAB function, via -pf_matlab string");
42*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMatlabEnginePutArray(matlab->mengine,matlab->dimin,n,in,"x"));
43*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMatlabEngineEvaluate(matlab->mengine,matlab->string));
44*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMatlabEngineGetArray(matlab->mengine,matlab->dimout,n,out,"f"));
45292f8084SBarry Smith   PetscFunctionReturn(0);
46292f8084SBarry Smith }
47292f8084SBarry Smith 
484416b707SBarry Smith PetscErrorCode PFSetFromOptions_Matlab(PetscOptionItems *PetscOptionsObject,PF pf)
49292f8084SBarry Smith {
50ace3abfcSBarry Smith   PetscBool  flag;
51292f8084SBarry Smith   char       value[256];
52292f8084SBarry Smith   PF_Matlab *matlab = (PF_Matlab*)pf->data;
53292f8084SBarry Smith 
54292f8084SBarry Smith   PetscFunctionBegin;
55*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsHead(PetscOptionsObject,"Matlab function options"));
56*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsString("-pf_matlab","Matlab function","None","",value,sizeof(value),&flag));
57*5f80ce2aSJacob Faibussowitsch   if (flag) CHKERRQ(PetscStrallocpy((char*)value,&matlab->string));
58*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsTail());
59292f8084SBarry Smith   PetscFunctionReturn(0);
60292f8084SBarry Smith }
61292f8084SBarry Smith 
628cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PFCreate_Matlab(PF pf,void *value)
63292f8084SBarry Smith {
64292f8084SBarry Smith   PF_Matlab *matlab;
65292f8084SBarry Smith 
66292f8084SBarry Smith   PetscFunctionBegin;
67*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscNewLog(pf,&matlab));
68292f8084SBarry Smith   matlab->dimin  = pf->dimin;
69292f8084SBarry Smith   matlab->dimout = pf->dimout;
70292f8084SBarry Smith 
71*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf),NULL,&matlab->mengine));
72292f8084SBarry Smith 
73*5f80ce2aSJacob Faibussowitsch   if (value) CHKERRQ(PetscStrallocpy((char*)value,&matlab->string));
74*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PFSet(pf,PFApply_Matlab,NULL,PFView_Matlab,PFDestroy_Matlab,matlab));
75292f8084SBarry Smith 
76292f8084SBarry Smith   pf->ops->setfromoptions = PFSetFromOptions_Matlab;
77292f8084SBarry Smith   PetscFunctionReturn(0);
78292f8084SBarry Smith }
79