xref: /petsc/src/vec/pf/impls/matlab/cmatlab.c (revision 2da392cc7c10228af19ad9843ce5155178acb644)
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 PetscErrorCode PFView_Matlab(void *value,PetscViewer viewer)
15 {
16   PetscErrorCode ierr;
17   PetscBool      iascii;
18   PF_Matlab      *matlab = (PF_Matlab*)value;
19 
20   PetscFunctionBegin;
21   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
22   if (iascii) {
23     ierr = PetscViewerASCIIPrintf(viewer,"Matlab Matlab = %s\n",matlab->string);CHKERRQ(ierr);
24   }
25   PetscFunctionReturn(0);
26 }
27 
28 PetscErrorCode PFDestroy_Matlab(void *value)
29 {
30   PetscErrorCode ierr;
31   PF_Matlab      *matlab = (PF_Matlab*)value;
32 
33   PetscFunctionBegin;
34   ierr = PetscFree(matlab->string);CHKERRQ(ierr);
35   ierr = PetscMatlabEngineDestroy(&matlab->mengine);CHKERRQ(ierr);
36   ierr = PetscFree(matlab);CHKERRQ(ierr);
37   PetscFunctionReturn(0);
38 }
39 
40 PetscErrorCode PFApply_Matlab(void *value,PetscInt n,const PetscScalar *in,PetscScalar *out)
41 {
42   PF_Matlab      *matlab = (PF_Matlab*)value;
43   PetscErrorCode ierr;
44 
45   PetscFunctionBegin;
46   if (!value) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Need to set string for MATLAB function, via -pf_matlab string");
47   ierr = PetscMatlabEnginePutArray(matlab->mengine,matlab->dimin,n,in,"x");CHKERRQ(ierr);
48   ierr = PetscMatlabEngineEvaluate(matlab->mengine,matlab->string);CHKERRQ(ierr);
49   ierr = PetscMatlabEngineGetArray(matlab->mengine,matlab->dimout,n,out,"f");CHKERRQ(ierr);
50   PetscFunctionReturn(0);
51 }
52 
53 PetscErrorCode PFSetFromOptions_Matlab(PetscOptionItems *PetscOptionsObject,PF pf)
54 {
55   PetscErrorCode ierr;
56   PetscBool      flag;
57   char           value[256];
58   PF_Matlab      *matlab = (PF_Matlab*)pf->data;
59 
60   PetscFunctionBegin;
61   ierr = PetscOptionsHead(PetscOptionsObject,"Matlab function options");CHKERRQ(ierr);
62   ierr = PetscOptionsString("-pf_matlab","Matlab function","None","",value,sizeof(value),&flag);CHKERRQ(ierr);
63   if (flag) {
64     ierr = PetscStrallocpy((char*)value,&matlab->string);CHKERRQ(ierr);
65   }
66   ierr = PetscOptionsTail();CHKERRQ(ierr);
67   PetscFunctionReturn(0);
68 }
69 
70 PETSC_EXTERN PetscErrorCode PFCreate_Matlab(PF pf,void *value)
71 {
72   PetscErrorCode ierr;
73   PF_Matlab      *matlab;
74 
75   PetscFunctionBegin;
76   ierr           = PetscNewLog(pf,&matlab);CHKERRQ(ierr);
77   matlab->dimin  = pf->dimin;
78   matlab->dimout = pf->dimout;
79 
80   ierr = PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf),NULL,&matlab->mengine);CHKERRQ(ierr);
81 
82   if (value) {
83     ierr = PetscStrallocpy((char*)value,&matlab->string);CHKERRQ(ierr);
84   }
85   ierr = PFSet(pf,PFApply_Matlab,NULL,PFView_Matlab,PFDestroy_Matlab,matlab);CHKERRQ(ierr);
86 
87   pf->ops->setfromoptions = PFSetFromOptions_Matlab;
88   PetscFunctionReturn(0);
89 }
90 
91 
92 
93 
94 
95