ucftools/matlab/write_uvwp_complete_ucf.m

107 lines
4.3 KiB
Matlab

function [] = write_uvwp_complete_ucf(file,...
u,ibegu,jbegu,kbegu,iendu,jendu,kendu,...
v,ibegv,jbegv,kbegv,iendv,jendv,kendv,...
w,ibegw,jbegw,kbegw,iendw,jendw,kendw,...
p,ibegp,jbegp,kbegp,iendp,jendp,kendp,...
time,varargin)
% [] = write_uvwp_complete_ucf(file,...
% u,ibegu,jbegu,kbegu,iendu,jendu,kendu,...
% v,ibegv,jbegv,kbegv,iendv,jendv,kendv,...
% w,ibegw,jbegw,kbegw,iendw,jendw,kendw,...
% p,ibegp,jbegp,kbegp,iendp,jendp,kendp,...
% time,varargin)
% Writes a complete uvwp field to UCF chunks.
% Input
% file file to be written (the extension will be replaced by the proc rank)
% u,v,w,p full u,v,w,p fields with dim(nx,ny,nz)
% ibeg,jbeg,kbeg arrays with length(n.proc) with processor grid
% iend,jend,kend """
% time simulation time
% Optional input (key/value pair)
% endian endianess of the file as used by fopen (default: 'n')
% verbosity verbose output? (default: no)
% debug debug output? (default: no)
% Parse variable input
par = inputParser;
addParamValue(par,'endian','n',@ischar);
addParamValue(par,'verbosity',0,@isnumeric);
addParamValue(par,'debug',0,@isnumeric);
parse(par,varargin{:});
% Parse filename
[fdir,fbase,fext] = fileparts(file);
fbasepath = fullfile(fdir,fbase);
nxprocs = numel(ibegu);
nyprocs = numel(jbegu);
nzprocs = numel(kbegu);
nxu = size(u,1); nxv = size(v,1); nxw = size(w,1); nxp = size(p,1);
nyu = size(u,2); nyv = size(v,2); nyw = size(w,2); nyp = size(p,2);
nzu = size(u,3); nzv = size(v,3); nzw = size(w,3); nzp = size(p,3);
for ixproc=0:nxprocs-1
for iyproc=0:nyprocs-1
for izproc=0:nzprocs-1
[iproc] = locfun_proc_id(ixproc,iyproc,izproc,nxprocs,nyprocs,nzprocs);
fname = sprintf('%s.%05d',fbasepath,iproc);
% Extract local indices
ibu = ibegu(ixproc+1); ibv = ibegv(ixproc+1); ibw = ibegw(ixproc+1); ibp = ibegp(ixproc+1);
ieu = iendu(ixproc+1); iev = iendv(ixproc+1); iew = iendw(ixproc+1); iep = iendp(ixproc+1);
jbu = jbegu(iyproc+1); jbv = jbegv(iyproc+1); jbw = jbegw(iyproc+1); jbp = jbegp(iyproc+1);
jeu = jendu(iyproc+1); jev = jendv(iyproc+1); jew = jendw(iyproc+1); jep = jendp(iyproc+1);
kbu = kbegu(izproc+1); kbv = kbegv(izproc+1); kbw = kbegw(izproc+1); kbp = kbegp(izproc+1);
keu = kendu(izproc+1); kev = kendv(izproc+1); kew = kendw(izproc+1); kep = kendp(izproc+1);
% Create a new chunk file
obj = ucf('verbosity',par.Results.verbosity,'debug',par.Results.debug);
obj.create(fname,'type','field','rank',[iproc,ixproc,iyproc,izproc],'endian',par.Results.endian);
obj.appendStep(time);
ighost = 0;
% Write u
data = u(ibu:ieu,jbu:jeu,kbu:keu);
nxul = size(data,1)-2*ighost;
nyul = size(data,2)-2*ighost;
nzul = size(data,3)-2*ighost;
params = int64([ighost,ibu,jbu,kbu,nxul,nyul,nzul,nxu,nyu,nzu]);
obj.appendSet(data,params);
% Write v
data = v(ibv:iev,jbv:jev,kbv:kev);
nxvl = size(data,1)-2*ighost;
nyvl = size(data,2)-2*ighost;
nzvl = size(data,3)-2*ighost;
params = int64([ighost,ibv,jbv,kbv,nxvl,nyvl,nzvl,nxv,nyv,nzv]);
obj.appendSet(data,params);
% Write w
data = w(ibw:iew,jbw:jew,kbw:kew);
nxwl = size(data,1)-2*ighost;
nywl = size(data,2)-2*ighost;
nzwl = size(data,3)-2*ighost;
params = int64([ighost,ibw,jbw,kbw,nxwl,nywl,nzwl,nxw,nyw,nzw]);
obj.appendSet(data,params);
% Write p
data = p(ibp:iep,jbp:jep,kbp:kep);
nxpl = size(data,1)-2*ighost;
nypl = size(data,2)-2*ighost;
nzpl = size(data,3)-2*ighost;
params = int64([ighost,ibp,jbp,kbp,nxpl,nypl,nzpl,nxp,nyp,nzp]);
obj.appendSet(data,params);
% Close chunk file
obj.close();
end
end
end
end
function [ind] = locfun_proc_id(ii,jj,kk,nx,ny,nz)
% local version of 'sub2ind_zero_row'
ind=ii*ny*nz+jj*nz+kk;
end