Actual source code: receivesparse.c

  1: /*
  2:     Part of the MatlabSockettool Package. Receive a sparse matrix
  3:   at a socket address, called by the receive.mex4 Matlab program.

  5:         Written by Barry Smith, bsmith@mcs.anl.gov 4/14/92

  7:    Since this is called from Matlab it cannot be compiled with C++.
  8: */
  9: #include <stdio.h>
 10:  #include petscsys.h
 11: #include "mex.h"

 13: #define PETSC_MEX_ERROR(a) {fprintf(stdout,"RECEIVE: %s \n",a); return -1;}
 16: PetscErrorCode ReceiveSparseMatrix(mxArray *plhs[],int t)
 17: {
 18:   int    *tr,*tc,compx = 0;
 19:   int    *r,*c;
 20:   int    i,j,m,n,nnz,lnnz,jstart,jend,off = 0;
 21:   double *tv,*v,*diag,*vi;

 23:   /* get size of matrix */
 24:   if (PetscBinaryRead(t,&m,1,PETSC_INT))   PETSC_MEX_ERROR("reading number columns");
 25:   if (PetscBinaryRead(t,&n,1,PETSC_INT))   PETSC_MEX_ERROR("reading number rows");
 26:   /* get number of nonzeros */
 27:   if (PetscBinaryRead(t,&nnz,1,PETSC_INT))   PETSC_MEX_ERROR("reading nnz");
 28:   if (PetscBinaryRead(t,&compx,1,PETSC_INT))   PETSC_MEX_ERROR("reading row lengths");
 29:   /* Create a matrix for Matlab */
 30:   /* since Matlab stores by columns not rows we actually will 
 31:      create transpose of desired matrix */
 32:   plhs[0] = mxCreateSparse(n,m,nnz,compx);
 33:   r = mxGetIr(plhs[0]);
 34:   c = mxGetJc(plhs[0]);
 35:   v = mxGetPr(plhs[0]);
 36:   /* Matlab sparse matrix pointers start at 0 not 1 */
 37:   if (!compx) {
 38:     if (PetscBinaryRead(t,v,nnz,PETSC_DOUBLE)) PETSC_MEX_ERROR("reading values");
 39:   } else {
 40:     for (i=0; i<nnz; i++) {
 41:       vi = mxGetPi(plhs[0]);
 42:       if (PetscBinaryRead(t,v+i,1,PETSC_DOUBLE)) PETSC_MEX_ERROR("reading values");
 43:       if (PetscBinaryRead(t,vi+i,1,PETSC_DOUBLE)) PETSC_MEX_ERROR("reading values");
 44:     }
 45:   }
 46:   if (PetscBinaryRead(t,c,m+1,PETSC_INT)) PETSC_MEX_ERROR("reading column pointers");
 47:   if (PetscBinaryRead(t,r,nnz,PETSC_INT)) PETSC_MEX_ERROR("reading row pointers");
 48:   return 0;
 49: }