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(PetscOptions *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