ucftools/matlab/read_procgrid_ucf.m

125 lines
4.2 KiB
Matlab

function [ibegu,iendu,jbegu,jendu,kbegu,kendu,...
ibegv,iendv,jbegv,jendv,kbegv,kendv,...
ibegw,iendw,jbegw,jendw,kbegw,kendw,...
ibegp,iendp,jbegp,jendp,kbegp,kendp,...
ibegs,iends,jbegs,jends,kbegs,kends] = read_procgrid_ucf(file,varargin)
% [ibegu,iendu,jbegu,jendu,kbegu,kendu,...
% ibegv,iendv,jbegv,jendv,kbegv,kendv,...
% ibegw,iendw,jbegw,jendw,kbegw,kendw,...
% ibegp,iendp,jbegp,jendp,kbegp,kendp,...
% ibegs,iends,jbegs,jends,kbegs,kends] = read_procgrid_ucf(file,varargin)
% Reads processor grids.
% Input
% file file name (if tar-mode: ustar handle)
% ? verbosity verbose output? (default: 0)
% ? tarmode read from tar-file? (default: 0)
% Output
% ibegu,iendu,jbegu,jendu,kbegu,kendu processor grid u
% ibegv,iendv,jbegv,jendv,kbegv,kendv processor grid v
% ibegw,iendw,jbegw,jendw,kbegw,kendw processor grid w
% ibegp,iendp,jbegp,jendp,kbegp,kendp processor grid p
% ibegs,iends,jbegs,jends,kbegs,kends processor grid s
% Parse optional input arguments
par = inputParser;
addParamValue(par,'verbosity',0,@isnumeric);
addParamValue(par,'debug',0,@isnumeric);
addParamValue(par,'tarmode',0,@isnumeric);
parse(par,varargin{:});
% Open file
obj = ucf('verbosity',par.Results.verbosity,'debug',par.Results.debug);
switch class(file)
case 'char'
obj.open(file);
case {'ustar','ucfmulti'}
ptr = file.pointer('proc.bin');
obj.opentar(ptr);
otherwise
error('Input file type not supported: %s',class(file));
end
% Define sets to be read
isDualMesh=(obj.UCFVersion>=2);
if isDualMesh
sets = {'u','v','w','p','s'};
else
sets = {'u','v','w','p'};
end
nset = numel(sets);
% Read raw data
ibeg = cell(1,nset);
iend = cell(1,nset);
jbeg = cell(1,nset);
jend = cell(1,nset);
kbeg = cell(1,nset);
kend = cell(1,nset);
for iset=1:nset
[data,params] = obj.readSet(1,iset);
params = cast(params,'double');
nxprocs = params(1);
nyprocs = params(2);
nzprocs = params(3);
ibeg{iset} = data(1:nxprocs);
iend{iset} = data(nxprocs+1:2*nxprocs);
jbeg{iset} = data(2*nxprocs+1:2*nxprocs+nyprocs);
jend{iset} = data(2*nxprocs+nyprocs+1:2*nxprocs+2*nyprocs);
kbeg{iset} = data(2*nxprocs+2*nyprocs+1:2*nxprocs+2*nyprocs+nzprocs);
kend{iset} = data(2*nxprocs+2*nyprocs+nzprocs+1:2*nxprocs+2*nyprocs+2*nzprocs);
end
% Close UCF file
obj.close();
% Reassign content from loop
iset = find(strcmp(sets,'u'));
ibegu = cast(ibeg{iset},'double');
iendu = cast(iend{iset},'double');
jbegu = cast(jbeg{iset},'double');
jendu = cast(jend{iset},'double');
kbegu = cast(kbeg{iset},'double');
kendu = cast(kend{iset},'double');
iset = find(strcmp(sets,'v'));
ibegv = cast(ibeg{iset},'double');
iendv = cast(iend{iset},'double');
jbegv = cast(jbeg{iset},'double');
jendv = cast(jend{iset},'double');
kbegv = cast(kbeg{iset},'double');
kendv = cast(kend{iset},'double');
iset = find(strcmp(sets,'w'));
ibegw = cast(ibeg{iset},'double');
iendw = cast(iend{iset},'double');
jbegw = cast(jbeg{iset},'double');
jendw = cast(jend{iset},'double');
kbegw = cast(kbeg{iset},'double');
kendw = cast(kend{iset},'double');
iset = find(strcmp(sets,'p'));
ibegp = cast(ibeg{iset},'double');
iendp = cast(iend{iset},'double');
jbegp = cast(jbeg{iset},'double');
jendp = cast(jend{iset},'double');
kbegp = cast(kbeg{iset},'double');
kendp = cast(kend{iset},'double');
if isDualMesh
iset = find(strcmp(sets,'s'));
ibegs = cast(ibeg{iset},'double');
iends = cast(iend{iset},'double');
jbegs = cast(jbeg{iset},'double');
jends = cast(jend{iset},'double');
kbegs = cast(kbeg{iset},'double');
kends = cast(kend{iset},'double');
else
ibegs = ibegp;
iends = iendp;
jbegs = jbegp;
jends = jendp;
kbegs = kbegp;
kends = kendp;
end
end