function
petsc-3.8.3 2017-12-09
[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 == 1211213
v = read(fd,1,precision);
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