ucftools/matlab/read_statistics_channel_ucf.m

85 lines
2.7 KiB
Matlab

function [tbeg,tend,nstat,um,uu,vv,ww,uv,uub,uvb,varargout] = read_statistics_channel_ucf(file,varargin)
% [tbeg,tend,nstat,um,uu,vv,ww,uv,uub,uvb,varargout] = read_statistics_channel_ucf(file,varargin)
% Reads statistics file for channel data in UCF format.
% Input
% file file name (if tar-mode: ustar handle)
% ? verbosity verbose output? (default: no)
% ? debug debug output? (default: no)
% ? pure read an statistics_pure file? Only matters for tar archives (default: 0)
% Output
% tbeg time at beginning of sampling
% tend time at end of sampling
% nstat number of samples
% um mean streamwise velocity
% uu,vv,ww <u'u'>, <v'v'>, <w'w'>
% uv <u'v'>
% uub <uu>
% uvb <uv>
% ? fxp,fyp,fzp particle force in Eulerian frame
% Parse optional input arguments
par = inputParser;
addParamValue(par,'verbosity',0,@isnumeric);
addParamValue(par,'debug',0,@isnumeric);
addParamValue(par,'pure',0,@isnumeric);
parse(par,varargin{:});
ispure = par.Results.pure;
% Define sets to be read
sets = {'um','uu','vv','ww','uv','uub','uvb'};
nset = numel(sets);
% Open UCF file and read
obj = ucf('verbosity',par.Results.verbosity,'debug',par.Results.debug);
switch class(file)
case 'char'
obj.open(file);
case {'ustar','ucfmulti'}
if ispure
ptr = file.pointer('statistics_pure.bin');
else
ptr = file.pointer('statistics.bin');
end
obj.opentar(ptr);
otherwise
error('Input file type not supported: %s',class(file));
end
tend = obj.getSimulationTime();
% Read first dataset
[um,params] = obj.readSet(1,1);
% Parse parameters
tbeg = typecast(params(1),'double');
nstat = cast(params(2),'double');
nset1 = cast(params(4),'double'); % channel stats
nset2 = cast(params(5),'double'); % force eulerian
if nset1~=7
error('Invalid file.');
end
um = um/nstat;
uu = obj.readSet(1,2)/nstat;
vv = obj.readSet(1,3)/nstat;
ww = obj.readSet(1,4)/nstat;
uv = obj.readSet(1,5)/nstat;
uub = obj.readSet(1,6)/nstat;
uvb = obj.readSet(1,7)/nstat;
% If eulerian force data, read that too
if nset2==3
if par.Results.verbosity
fprintf('Eulerian force data found.\n');
end
fxp = obj.readSet(1,8);
fyp = obj.readSet(1,9);
fzp = obj.readSet(1,10);
varargout{1} = fxp/nstat;
varargout{2} = fyp/nstat;
varargout{3} = fzp/nstat;
end
% Close file
obj.close();
end