hypre/tools/readstruct.m
falgout f54a3e3141 New routine for reading a struct matrix into matlab.
Currently, this assumes that the grid is a single box, and it is reads the data
from a single file.  It should be possible to extend this to read arbitrary struct
grid data that was distributed across multiple processors (and files).
2007-03-09 17:14:34 +00:00

95 lines
2.4 KiB
Matlab

function [A,symmetric,dim,grid,stencil] = readstruct(filename);
% --------------------------------------------------------------------------
% [A,symmetric,dim,grid,stencil] = readstruct('filename')
% Reads from file 'filename' a matrix A in Struct format
% --------------------------------------------------------------------------
fid=fopen(filename,'r');
% --------------------------------------------------------------
% Read in the matrix Symmetric, Grid and Stencil information.
% --------------------------------------------------------------
s = fscanf(fid, '%s',1);
% read symmetric info
s = fscanf(fid,'%s',1);
symmetric = fscanf(fid,'%d',1);
% read constant-coefficient info
s = fscanf(fid,'%s',1);
constcoeff = fscanf(fid,'%d',1);
% read grid info
s = fscanf(fid, '%s',1);
dim = fscanf(fid, '%d', 1);
d = fscanf(fid, '%d', 1);
s = fscanf(fid,'%s',1);
s = fscanf(fid,'%1s',1);
xmin = fscanf(fid,'%d',1);
s = fscanf(fid,'%1s',1);
ymin = fscanf(fid,'%d',1);
s = fscanf(fid,'%1s',1);
zmin = fscanf(fid,'%d',1);
s = fscanf(fid,'%1s',1);
s = fscanf(fid,'%1s',1);
s = fscanf(fid,'%1s',1);
xmax = fscanf(fid,'%d',1);
s = fscanf(fid,'%1s',1);
ymax = fscanf(fid,'%d',1);
s = fscanf(fid,'%1s',1);
zmax = fscanf(fid,'%d',1);
s = fscanf(fid,'%1s',1);
grid = zeros(6,1);
grid(1,1) = xmin; grid(2,1) = ymin; grid(3,1) = zmin;
grid(4,1) = xmax; grid(5,1) = ymax; grid(6,1) = zmax;
nx = xmax - xmin + 1;
ny = ymax - ymin + 1;
nz = zmax - zmin + 1;
n = nx*ny*nz;
% read stencil info
s = fscanf(fid,'%s',1);
stencil_size = fscanf(fid,'%d',1);
stencil = zeros(stencil_size,3);
for i = 1:stencil_size,
s = fscanf(fid,'%s',1);
stencil(i,1) = fscanf(fid,'%d',1);
stencil(i,2) = fscanf(fid,'%d',1);
stencil(i,3) = fscanf(fid,'%d',1);
end
% read matrix coefficients
s = fscanf(fid,'%s',1);
[Fdata, count] = fscanf(fid,'%d: (%d, %d, %d; %d) %e', [6, inf]);
fclose(fid);
Adata = zeros(3,size(Fdata,2));
ii = 1;
for i = 1:size(Fdata,2)
s = Fdata(5,i) + 1;
ix = Fdata(2,i);
iy = Fdata(3,i);
iz = Fdata(4,i);
jx = ix + stencil(s,1);
jy = iy + stencil(s,2);
jz = iz + stencil(s,3);
if ( (jx >= xmin) & (jx <= xmax) & ...
(jy >= ymin) & (jy <= ymax) & ...
(jz >= zmin) & (jz <= zmax) )
Adata(1,ii) = ix + iy*nx + iz*ny*nx + 1;
Adata(2,ii) = jx + jy*nx + jz*ny*nx + 1;
Adata(3,ii) = Fdata(6,i);
ii = ii + 1;
end
end
Adata = Adata(:,1:(ii-1));
A = sparse(Adata(1,:)', Adata(2,:)', Adata(3,:)');
if (symmetric),
D = diag(diag(A));
A = A + A' - D;
end