Matlab and PETSc communication

Barry Smith bsmith at mcs.anl.gov
Fri Aug 8 13:03:48 CDT 2008


    This is the sread code:

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray  
*prhs[])
{
   int            fd,cnt,dt;
   PetscErrorCode ierr;

   /* check output parameters */
   if (nlhs != 1) PETSC_MEX_ERROR("Receive requires one output  
argument.");
   if (nrhs != 3) PETSC_MEX_ERROR("Receive requires three input  
arguments.");
   fd  = (int) mxGetScalar(prhs[0]);
   cnt = (int) mxGetScalar(prhs[1]);
   dt  = (PetscDataType) mxGetScalar(prhs[2]);


   if (dt == PETSC_DOUBLE) {
     plhs[0]  = mxCreateDoubleMatrix(1,cnt,mxREAL);
     ierr = PetscBinaryRead(fd,mxGetPr(plhs[0]),cnt,dt);if (ierr)  
PETSC_MEX_ERROR("Unable to receive double items.");
   } else if (dt == PETSC_INT) {
     plhs[0]  = mxCreateNumericMatrix(1,cnt,mxINT32_CLASS,mxREAL);
     ierr = PetscBinaryRead(fd,mxGetPr(plhs[0]),cnt,dt);if (ierr)  
PETSC_MEX_ERROR("Unable to receive int items.");
   } else if (dt == PETSC_CHAR) {
     char *tmp = (char*) mxMalloc(cnt*sizeof(char));
     ierr = PetscBinaryRead(fd,tmp,cnt,dt);if (ierr)  
PETSC_MEX_ERROR("Unable to receive char items.");
     plhs[0] = mxCreateStringFromNChars(tmp,cnt);
     mxFree(tmp);
   } else {
     PETSC_MEX_ERROR("Unknown datatype.");
   }
   return;
}

It seems impossible that the one output variable plhs[0] is not  
assigned?

I've used this only with 2007 Matlab.

    Barry

On Aug 8, 2008, at 11:18 AM, Michel Cancelliere wrote:

> Hi,
>
> I am trying to use the function sread() but when I run the matlab  
> program it give me this error:
>
> -One or more output arguments not assigned during call to "sread".
>
> and nothing happen... I also tried to use sreader but matlab didn't  
> respond, am I doing something wrong? I am using Matlab R2008a, which  
> matlab version is the most compatible with Petsc?
>
> Thank you,
>
> Michel
>
> On Mon, Jul 28, 2008 at 8:45 PM, Barry Smith <bsmith at mcs.anl.gov>  
> wrote:
>
> On Jul 28, 2008, at 12:33 PM, Michel Cancelliere wrote:
>
> Hi,
>
> Thank you for your response, I think the socket communication  
> between Matlab and PETSc  is what I need, I took a look to the  
> example ex12.c and ex12.m (Simple example to show how to PETSc  
> programs can be run from Matlab) but in this case PETSc send the  
> Vector solution that matlab "receive", is it possible to make the  
> inverse? Send  the variable from matlab to PETSc using socket  
> communication? can PetscMatlabEngineGet do that ? How it works?
>
>  You don't really want to use the Matlab Engine code, because with  
> this approach the PETSc program is "in charge" and just sends work  
> requests
> to Matlab. Instead you want Matlab in charge and to send work  
> requests to PETSc.
>
>   The basic idea is that both Matlab and PETSc open a socket  
> connection to each other. On the PETSc side use  
> PetscViewerSocketOpen() on the Matlab side
> use the bin/matlab/@sreader/sreader.m class to create a (Matlab)  
> socket object. Now on the PETSc side you can make calls to VecView()  
> to send vectors to
> Matlab and VecLoad() and MatLoad() to read vectors and matrices from  
> Matlab. On the Matlab side use PetscBinaryRead() and  
> PetscBinaryWrite() to
> read vectors from PETSc and to write vectors and matrices to PETSc.  
> Your PETSc program may end up looking something like
>
>    PetscViewerSocketOpen(..... &socket);
>
>   do forever:
>      VecLoad(socket, &b)
>      MatLoad(socket,....,&A)
>
>      KSPSetOperators(ksp,A,A,....)
>      KSPSolve(ksp,b,x)
>      VecView(socket,x)
>
>   You Matlab program could look something like
>
>      socket = sread()
>
>      do forever:
>
>         Create your vector and matrix
>         PetscBinaryWrite(socket,b)
>         PetscBinaryWrite(socket,A)
>         x = PetscBinaryRead(socket)
>
>  The details and correct syntax are obviously not given.
>
>   Good luck,
>
>   Barry
>
>
>
>
> Aron, I was studying your recommendation but it means that I have to  
> write all the function from my Matlab Code to C?, because it should  
> take me a lot of time and this work is part of my MSc Thesis and  
> maybe I need a less time consuming solution.
>
> Thank you in advance,
>
> Michel
>
> On Tue, Jul 22, 2008 at 8:56 PM, Aron Ahmadia <aja2111 at columbia.edu>  
> wrote:
> Michel,
>
> I would recommend investing the time to write your C/C++ wrapper  
> code a little higher up around the Newton iteration, since PETSc  
> provides a great abstraction interface for it.  Then you could write  
> code to build the matrix (or assemble a matrix-free routine!) in C/C+ 
> +, and pass the parameters in from there.
>
> ~Aron
>
>
> On Tue, Jul 22, 2008 at 12:12 AM, Matthew Knepley  
> <knepley at gmail.com> wrote:
> On Mon, Jul 21, 2008 at 10:14 PM, Barry Smith <bsmith at mcs.anl.gov>  
> wrote:
> >
> > On Jul 21, 2008, at 7:57 PM, Michel Cancelliere wrote:
> >
> >> Hi, I am a new user of PETSc. I am working in Reservoir  
> Simulation and I
> >> have been developing the simulator inside Matlab. I have some  
> question in
> >> order to understand better my possibilities of success in what I  
> want to do:
> >>
> >>        • I want to solve the linear system obtained from the inner
> >> iterations in the newton method using PETSc, is it possible to  
> communicate
> >> in an efficient way PETSc  with Matlab to do that? I now that I  
> can write
> >> binary files and then read with PETSc but due the size of the  
> matrix it is a
> >> very time-expensive way. Where i can find some examples? I look  
> at the
> >> examples within the package but I could not find it. \
> >>        • It is possible to call PETSc library inside Matlab?  
> Using the Mex
> >> files and Matlab compiler?
> >
> >   There is no code to do this. It is possible but pretty  
> complicated to
> > write the appropriate Mex code. (Because
> > each Mex function is a separate shared library you cannot just  
> write a Mex
> > function for each PETSc function since they
> > would not share the PETSc global variables. You would have to  
> write one Mex
> > function that is a "gatekeeper" and calls
> > the requested PETSc function underneath. I've monkeyed with this a  
> few times
> > but did not have the time/energy/intellect
> > to write code to automate this process. Give me 300,000 dollars  
> and we could
> > hire someone to write this :-)
> >
> >  You might look at the "newly improved" socket interface in petsc- 
> dev
> > (http://www-unix.mcs.anl.gov/petsc/petsc-as/developers/index.html).
> > With this you write a stand alone C PETSc program that waits at a  
> socket,
> > receive the matrix and right hand side and then
> > sends back the solution. The code for marshalling the matrices and  
> vector is
> > common between the sockets and binary files.
> > On the Matlab side you create a "file" that is actually a socket  
> connection.
> > See src/sys/viewer/impls/socket/matlab This may
> > take a little poking around and you asking us a couple of  
> questions to get
> > it.
> > Note there is no inherent support for parallelism on the PETSc  
> side with
> > this setup but I think it is possible.
>
> I personally think this would be much easier in Sage than in Matlab
> proper. In fact,
> with Sage you could use petsc4py directly, and directly access the
> data structures
> as numpy arrays if necessary.
>
>  Matt
>
> >   Barry
> >
> >
> >> Thank you very much for your time,
> >>
> >> Michel Cancelliere
> >
> >
>
>
>
> --
> What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which
> their experiments lead.
> -- Norbert Wiener
>
>
>
>
>




More information about the petsc-users mailing list