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