xref: /petsc/src/vec/pf/impls/matlab/cmatlab.c (revision e611a964e9853b74d61a56642fe9d06a6e51780f)
1 
2 #include <../src/vec/pf/pfimpl.h>            /*I "petscpf.h" I*/
3 #include <petscmatlab.h>   /*I  "petscmatlab.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 = PetscObjectTypeCompare((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,const 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(PetscOptionItems *PetscOptionsObject,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(PetscOptionsObject,"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 #undef __FUNCT__
79 #define __FUNCT__ "PFCreate_Matlab"
80 PETSC_EXTERN PetscErrorCode PFCreate_Matlab(PF pf,void *value)
81 {
82   PetscErrorCode ierr;
83   PF_Matlab      *matlab;
84 
85   PetscFunctionBegin;
86   ierr           = PetscNewLog(pf,&matlab);CHKERRQ(ierr);
87   matlab->dimin  = pf->dimin;
88   matlab->dimout = pf->dimout;
89 
90   ierr = PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf),NULL,&matlab->mengine);CHKERRQ(ierr);
91 
92   if (value) {
93     ierr = PetscStrallocpy((char*)value,&matlab->string);CHKERRQ(ierr);
94   }
95   ierr = PFSet(pf,PFApply_Matlab,NULL,PFView_Matlab,PFDestroy_Matlab,matlab);CHKERRQ(ierr);
96 
97   pf->ops->setfromoptions = PFSetFromOptions_Matlab;
98   PetscFunctionReturn(0);
99 }
100 
101 
102 
103 
104 
105