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 > > > > >