ucftools/matlab/read_field_complete_ucf.m

135 lines
4.1 KiB
Matlab

function [q] = read_field_complete_ucf(file,field,varargin)
% [data] = read_field_complete_ucf(file,field,varargin)
% Reads a specific field from all processor chunks.
% Input
% file file to be read
% field field to be read
% {'u','v','w','p','s1','s2',...}
% or integer with dataset index (not in tar-mode)
% ? step index of step to be read (default: 1)
% ? verbosity verbose output? (default: 0)
% ? debug debug output? (default: 0)
% ? tarmode read from tar-file? (default: 0)
% Output
% data partial field with dim(nxl+2*ighost,nyl+2*ighost,nzl+2*ighost)
% Parse optional input arguments
par = inputParser;
addParamValue(par,'timestep',1,@isnumeric);
addParamValue(par,'verbosity',0,@isnumeric);
addParamValue(par,'debug',0,@isnumeric);
addParamValue(par,'tarmode',0,@isnumeric);
parse(par,varargin{:});
istep = par.Results.timestep;
% Parse field
if ischar(field)
switch field(1)
case 'u'; ifield=1; fbase='uvwp';
case 'v'; ifield=2; fbase='uvwp';
case 'w'; ifield=3; fbase='uvwp';
case 'p'; ifield=4; fbase='uvwp';
case 's'; ifield=str2double(field(2:end)); fbase='scal';
end
elseif isnumeric(field)
if par.Results.tarmode
error('field cannot be numeric, if tar-mode is used.');
end
ifield=field; fbase='';
else
error('field must either be numeric or string.');
end
% Open first file
obj = ucf('verbosity',par.Results.verbosity,'debug',par.Results.debug);
if par.Results.tarmode
fname = sprintf('%s.%05d',fbase,0);
obj.opentar(file.pointer(fname));
else
[fdir,fbase,fext] = fileparts(file);
fname = sprintf('%s/%s.%05d',fdir,fbase,0);
obj.open(fname);
end
if ~obj.validateType('field')
error('read error: no field data.');
end
% Read raw data
[data,params] = obj.readSet(istep,ifield);
params = cast(params,'double');
ighost = params(1);
ib = params(2);
jb = params(3);
kb = params(4);
nxl = params(5);
nyl = params(6);
nzl = params(7);
nx = params(8);
ny = params(9);
nz = params(10);
data = reshape(data,nxl+2*ighost,nyl+2*ighost,nzl+2*ighost);
if ighost
data = data(2:end-1,2:end-1,2:end-1);
end
% Create global array and assign chunk
q = zeros(nx,ny,nz,class(data));
q(ib:ib+nxl-1,jb:jb+nyl-1,kb:kb+nzl-1) = data;
% Close the first file
obj.close();
% Now loop consecutively through files
ifile = 1;
if par.Results.tarmode
loopCondition = @(x) file.isSubfile(x);
fname = sprintf('%s.%05d',fbase,ifile);
else
loopCondition = @(x) exist(x,'file');
fname = sprintf('%s/%s.%05d',fdir,fbase,ifile);
end
while loopCondition(fname)
% Open file
obj = ucf('verbosity',par.Results.verbosity,'debug',par.Results.debug);
if par.Results.tarmode
obj.opentar(file.pointer(fname));
else
obj.open(fname);
end
if ~obj.validateType('field')
error('read error: no field data.');
end
% Read raw data
[data,params] = obj.readSet(istep,ifield);
params = cast(params,'double');
ighost = params(1);
ib = params(2);
jb = params(3);
kb = params(4);
nxl = params(5);
nyl = params(6);
nzl = params(7);
data = reshape(data,nxl+2*ighost,nyl+2*ighost,nzl+2*ighost);
if ighost
data = data(2:end-1,2:end-1,2:end-1);
end
% Assign chunk
q(ib:ib+nxl-1,jb:jb+nyl-1,kb:kb+nzl-1) = data;
% Close the first file
obj.close();
% Move on to next file
ifile = ifile+1;
if par.Results.tarmode
fname = sprintf('%s.%05d',fbase,ifile);
else
fname = sprintf('%s/%s.%05d',fdir,fbase,ifile);
end
end
end