xref: /petsc/src/vec/pf/impls/matlab/cmatlab.c (revision bbd56ea5790821d2a217d362e8e9710702952333)
1 
2 #include <../src/vec/pf/pfimpl.h>            /*I "petscpf.h" I*/
3 
4 /*
5         Ths PF generates a MATLAB function on the fly
6 */
7 typedef struct {
8   PetscInt          dimin,dimout;
9   PetscMatlabEngine mengine;
10   char              *string;
11 } PF_Matlab;
12 
13 #undef __FUNCT__
14 #define __FUNCT__ "PFView_Matlab"
15 PetscErrorCode PFView_Matlab(void *value,PetscViewer viewer)
16 {
17   PetscErrorCode ierr;
18   PetscBool      iascii;
19   PF_Matlab      *matlab = (PF_Matlab*)value;
20 
21   PetscFunctionBegin;
22   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
23   if (iascii) {
24     ierr = PetscViewerASCIIPrintf(viewer,"Matlab Matlab = %s\n",matlab->string);CHKERRQ(ierr);
25   }
26   PetscFunctionReturn(0);
27 }
28 
29 #undef __FUNCT__
30 #define __FUNCT__ "PFDestroy_Matlab"
31 PetscErrorCode PFDestroy_Matlab(void *value)
32 {
33   PetscErrorCode ierr;
34   PF_Matlab      *matlab = (PF_Matlab*)value;
35 
36   PetscFunctionBegin;
37   ierr = PetscFree(matlab->string);CHKERRQ(ierr);
38   ierr = PetscMatlabEngineDestroy(&matlab->mengine);CHKERRQ(ierr);
39   ierr = PetscFree(matlab);CHKERRQ(ierr);
40   PetscFunctionReturn(0);
41 }
42 
43 #undef __FUNCT__
44 #define __FUNCT__ "PFApply_Matlab"
45 PetscErrorCode PFApply_Matlab(void *value,PetscInt n,const PetscScalar *in,PetscScalar *out)
46 {
47   PF_Matlab      *matlab = (PF_Matlab*)value;
48   PetscErrorCode ierr;
49 
50   PetscFunctionBegin;
51   if (!value) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Need to set string for MATLAB function, via -pf_matlab string");
52   ierr = PetscMatlabEnginePutArray(matlab->mengine,matlab->dimin,n,in,"x");CHKERRQ(ierr);
53   ierr = PetscMatlabEngineEvaluate(matlab->mengine,matlab->string);CHKERRQ(ierr);
54   ierr = PetscMatlabEngineGetArray(matlab->mengine,matlab->dimout,n,out,"f");CHKERRQ(ierr);
55   PetscFunctionReturn(0);
56 }
57 
58 #undef __FUNCT__
59 #define __FUNCT__ "PFSetFromOptions_Matlab"
60 PetscErrorCode PFSetFromOptions_Matlab(PF pf)
61 {
62   PetscErrorCode ierr;
63   PetscBool      flag;
64   char           value[256];
65   PF_Matlab      *matlab = (PF_Matlab*)pf->data;
66 
67   PetscFunctionBegin;
68   ierr = PetscOptionsHead("Matlab function options");CHKERRQ(ierr);
69   ierr = PetscOptionsString("-pf_matlab","Matlab function","None","",value,256,&flag);CHKERRQ(ierr);
70   if (flag) {
71     ierr = PetscStrallocpy((char*)value,&matlab->string);CHKERRQ(ierr);
72   }
73   ierr = PetscOptionsTail();CHKERRQ(ierr);
74   PetscFunctionReturn(0);
75 }
76 
77 
78 EXTERN_C_BEGIN
79 #undef __FUNCT__
80 #define __FUNCT__ "PFCreate_Matlab"
81 PetscErrorCode  PFCreate_Matlab(PF pf,void *value)
82 {
83   PetscErrorCode ierr;
84   PF_Matlab      *matlab;
85 
86   PetscFunctionBegin;
87   ierr           = PetscNewLog(pf,PF_Matlab,&matlab);CHKERRQ(ierr);
88   matlab->dimin  = pf->dimin;
89   matlab->dimout = pf->dimout;
90 
91   ierr = PetscMatlabEngineCreate(((PetscObject)pf)->comm,PETSC_NULL,&matlab->mengine);CHKERRQ(ierr);
92 
93   if (value) {
94     ierr = PetscStrallocpy((char*)value,&matlab->string);CHKERRQ(ierr);
95   }
96   ierr = PFSet(pf,PFApply_Matlab,PETSC_NULL,PFView_Matlab,PFDestroy_Matlab,matlab);CHKERRQ(ierr);
97 
98   pf->ops->setfromoptions = PFSetFromOptions_Matlab;
99   PetscFunctionReturn(0);
100 }
101 EXTERN_C_END
102 
103 
104 
105 
106 
107