function
   petsc-3.7.7 2017-09-25
    [varargout] = PetscBinaryRead(inarg,varargin)
if nargin == 0
  fd = PetscOpenSocket();
else if ischar(inarg)
  fd = PetscOpenFile(inarg);
else if isnumeric(inarg)
  fd = PetscOpenSocket(inarg);
else 
  fd = inarg;
end
end
end
indices = 'int32';
precision = 'float64';
arecell = 0;
arecomplex = false;
tnargin = nargin;
for l=1:nargin-2
  if ischar(varargin{l}) && strcmpi(varargin{l},'indices')
    tnargin = min(l,tnargin-1);
    indices = varargin{l+1};
  end
  if ischar(varargin{l}) && strcmpi(varargin{l},'precision')
    tnargin = min(l,tnargin-1);
    precision = varargin{l+1};
  end
  if ischar(varargin{l}) && strcmpi(varargin{l},'cell')
    tnargin = min(l,tnargin-1);
    arecell = varargin{l+1};
  end
  if ischar(varargin{l}) && strcmpi(varargin{l},'complex')
    tnargin = min(l,tnargin-1);
    arecomplex = varargin{l+1};
  end
end
if strcmp(precision,'float128')
  precision = 'float64';
  system(['./convert -f ' inarg]);
  fd = PetscOpenFile([inarg '_double']);
end
if arecell
  narg = arecell;
  rsult = cell(1);
else
  narg = nargout;
end
for l=1:narg
  header = double(read(fd,1,indices));
  if isempty(header)
    if arecell
      varargout(1) = {result};
      return
    else
      disp('File/Socket does not have that many items')
    end
    return
  end
  if header == 1211216 
    header = double(read(fd,3,indices));
    m      = header(1);
    n      = header(2);
    nz     = header(3);
    if (nz == -1)
      if arecomplex
        s     = read(fd,2*m*n,precision);
        iReal = 1:2:n*m*2-1;
        iImag = iReal +1 ;
        A     = complex(reshape(s(iReal),n,m)',reshape(s(iImag),n,m)') ;
      else
        s   = read(fd,m*n,precision);
        A   = reshape(s,n,m)';
      end
    else
      nnz = double(read(fd,m,indices));  
      sum_nz = sum(nnz);
      if(sum_nz ~=nz)
        str = sprintf('No-Nonzeros sum-rowlengths do not match %d %d',nz,sum_nz);
        error(str);
      end
      j   = double(read(fd,nz,indices)) + 1;
      if arecomplex
        s   = read(fd,2*nz,precision);
      else
        s   = read(fd,nz,precision);
      end
      i   = ones(nz,1);
      cnt = 1;
      for k=1:m
        next = cnt+nnz(k)-1;
        i(cnt:next,1) = (double(k))*ones(nnz(k),1);
        cnt = next+1;
      end
      if arecomplex
        A = sparse(i,j,complex(s(1:2:2*nz),s(2:2:2*nz)),m,n,nz);
      else
        A = sparse(i,j,s,m,n,nz);
      end
    end
    if arecell
      result{l} = A;
    else
      varargout(l) = {A};
    end
  elseif  header == 1211214 
    m = double(read(fd,1,indices));
    if arecomplex
      v = read(fd,2*m,precision);
      v = complex(v(1:2:2*m),v(2:2:2*m));
    else
      v = read(fd,m,precision);
    end
    if arecell
      result{l} = v;
    else
      varargout(l) = {v};
    end
  elseif  header == 1211218 
    m = double(read(fd,1,indices));
    v = read(fd,m,'int') + 1; 
    if arecell
      result{l} = v;
    else
      varargout(l) = {v};
    end
  elseif header == 1211219 
    b = PetscBagRead(fd);
    if arecell
      result{l} = b;
    else
      varargout(l) = {b};
    end
  elseif header == 1211221 
    m  = double(read(fd,7,indices));
    me = double(read(fd,5,indices));
    b = [' dm ' int2str(m(3)) ' by ' int2str(m(4)) ' by ' int2str(m(5))];
    if arecell
      result{l} = b;
    else
      varargout(l) = {b};
    end
  else
    disp(['Found unrecogonized header ' int2str(header) ' in file. If your file contains complex numbers'])
    disp(' then call PetscBinaryRead() with "complex",true as two additional arguments')
    return
  end
end
if arecell
  varargout(1) = {result};
end
if nargin > 0
  if (ischar(inarg) || isinteger(inarg)) close(fd); end;
end