Actual source code: cmatlab.c

  1: /*$Id: cmatlab.c,v 1.8 2001/08/06 21:19:09 bsmith Exp $*/
 2:  #include src/pf/pfimpl.h

  4: /*
  5:         Ths PF generates a Matlab function on the fly
  6: */
  7: typedef struct {
  8:   int               dimin,dimout;
  9:   PetscMatlabEngine mengine;
 10:   char              *string;
 11: } PF_Matlab;
 12: 
 15: int PFView_Matlab(void *value,PetscViewer viewer)
 16: {
 17:   int        ierr;
 18:   PetscTruth isascii;
 19:   PF_Matlab  *matlab = (PF_Matlab*)value;

 22:   PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);
 23:   if (isascii) {
 24:     PetscViewerASCIIPrintf(viewer,"Matlab Matlab = %s\n",matlab->string);
 25:   }
 26:   return(0);
 27: }

 31: int PFDestroy_Matlab(void *value)
 32: {
 33:   int        ierr;
 34:   PF_Matlab  *matlab = (PF_Matlab*)value;

 37:   PetscStrfree(matlab->string);
 38:   PetscMatlabEngineDestroy(matlab->mengine);
 39:   PetscFree(matlab);
 40:   return(0);
 41: }

 45: int PFApply_Matlab(void *value,int n,PetscScalar *in,PetscScalar *out)
 46: {
 47:   PF_Matlab  *matlab = (PF_Matlab*)value;
 48:   int        ierr;

 51:   if (!value) SETERRQ(1,"Need to set string for Matlab function, via -pf_matlab string");
 52:   PetscMatlabEnginePutArray(matlab->mengine,matlab->dimin,n,in,"x");
 53:   PetscMatlabEngineEvaluate(matlab->mengine,matlab->string);
 54:   PetscMatlabEngineGetArray(matlab->mengine,matlab->dimout,n,out,"f");
 55:   return(0);
 56: }

 60: int PFSetFromOptions_Matlab(PF pf)
 61: {
 62:   int        ierr;
 63:   PetscTruth flag;
 64:   char       value[256];
 65:   PF_Matlab  *matlab = (PF_Matlab*)pf->data;

 68:   PetscOptionsHead("Matlab function options");
 69:     PetscOptionsString("-pf_matlab","Matlab function","None","",value,256,&flag);
 70:     if (flag) {
 71:       PetscStrallocpy((char*)value,&matlab->string);
 72:     }
 73:   PetscOptionsTail();
 74:   return(0);
 75: }


 78: EXTERN_C_BEGIN
 81: int PFCreate_Matlab(PF pf,void *value)
 82: {
 83:   int       ierr;
 84:   PF_Matlab *matlab;

 87:   PetscNew(PF_Matlab,&matlab);
 88:   matlab->dimin  = pf->dimin;
 89:   matlab->dimout = pf->dimout;

 91:   PetscMatlabEngineCreate(pf->comm,PETSC_NULL,&matlab->mengine);
 92: 
 93:   if (value) {
 94:     PetscStrallocpy((char*)value,&matlab->string);
 95:   }
 96:   PFSet(pf,PFApply_Matlab,PETSC_NULL,PFView_Matlab,PFDestroy_Matlab,matlab);

 98:   pf->ops->setfromoptions = PFSetFromOptions_Matlab;
 99:   return(0);
100: }
101: EXTERN_C_END