212 lines
10 KiB
Matlab
212 lines
10 KiB
Matlab
function [] = convert_fluid_hdf2ucf(fhdf,fucf,fproc)
|
|
% [] = convert_particles_hdf2ucf(fhdf,fucf)
|
|
% Converts a H5Part file containing particle data to a file in UCF format.
|
|
% Input
|
|
% fhdf file path to HDF file (input file)
|
|
% fucf file path to UCF file (output file)
|
|
|
|
% Get basename for UCF chunks
|
|
[fdir,fbase] = fileparts(fucf);
|
|
fbasepath = fullfile(fdir,fbase);
|
|
|
|
% Loop through timesteps
|
|
fprintf('[HDF read] %s\n',fhdf);
|
|
|
|
% Read target proc grid from file
|
|
[ibegu,iendu,jbegu,jendu,kbegu,kendu,...
|
|
ibegv,iendv,jbegv,jendv,kbegv,kendv,...
|
|
ibegw,iendw,jbegw,jendw,kbegw,kendw,...
|
|
ibegp,iendp,jbegp,jendp,kbegp,kendp] = read_procgrid_ucf(fproc);
|
|
nxprocs = numel(ibegu);
|
|
nyprocs = numel(jbegu);
|
|
nzprocs = numel(kbegu);
|
|
nprocs = nxprocs*nyprocs*nzprocs;
|
|
|
|
% Open HDF
|
|
id_hdf = H5F.open(fhdf,'H5F_ACC_RDONLY','H5P_DEFAULT');
|
|
|
|
% Read simulation time from HDF and create UCF timestep
|
|
id_dset = H5D.open(id_hdf,'Time');
|
|
time = H5D.read(id_dset);
|
|
H5D.close(id_dset);
|
|
|
|
% Read periodicity for reconstruction of ghost cells
|
|
id_group = H5G.open(id_hdf,'/Domain');
|
|
id_dset = H5D.open(id_group,'PeriodicityX'); x_periodic = H5D.read(id_dset); H5D.close(id_dset);
|
|
id_dset = H5D.open(id_group,'PeriodicityY'); y_periodic = H5D.read(id_dset); H5D.close(id_dset);
|
|
id_dset = H5D.open(id_group,'PeriodicityZ'); z_periodic = H5D.read(id_dset); H5D.close(id_dset);
|
|
H5G.close(id_group);
|
|
|
|
% Read full fields from HDF
|
|
id_group = H5G.open(id_hdf,'/Fluid');
|
|
id_dset = H5D.open(id_group,'VelocityX'); u = H5D.read(id_dset); H5D.close(id_dset);
|
|
id_dset = H5D.open(id_group,'VelocityY'); v = H5D.read(id_dset); H5D.close(id_dset);
|
|
id_dset = H5D.open(id_group,'VelocityZ'); w = H5D.read(id_dset); H5D.close(id_dset);
|
|
id_dset = H5D.open(id_group,'Pressure'); p = H5D.read(id_dset); H5D.close(id_dset);
|
|
H5G.close(id_group);
|
|
|
|
% Close HDF
|
|
H5F.close(id_hdf);
|
|
clear id_hdf
|
|
|
|
% Determine global dimensions
|
|
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);
|
|
|
|
if nxp~=iendp(end) || nyp~=jendp(end) || nzp~=kendp(end)
|
|
error('Processor grid does not match data. %d,%d,%d <-> %d,%d,%d',nxp,nyp,nzp,iendp(end),jendp(end),kendp(end));
|
|
end
|
|
|
|
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);
|
|
fprintf('[UCF write] %s (out of %d)\n',fname,nprocs);
|
|
|
|
obj = ucf(fname,'create');
|
|
obj.setFileHeader('field','rank',[iproc,ixproc,iyproc,izproc],'endian','a');
|
|
obj.appendStep(time);
|
|
|
|
% Get processor bounadries for this file
|
|
ibu = ibegu(ixproc+1); ieu = iendu(ixproc+1);
|
|
jbu = jbegu(iyproc+1); jeu = jendu(iyproc+1);
|
|
kbu = kbegu(izproc+1); keu = kendu(izproc+1);
|
|
|
|
ibv = ibegv(ixproc+1); iev = iendv(ixproc+1);
|
|
jbv = jbegv(iyproc+1); jev = jendv(iyproc+1);
|
|
kbv = kbegv(izproc+1); kev = kendv(izproc+1);
|
|
|
|
ibw = ibegw(ixproc+1); iew = iendw(ixproc+1);
|
|
jbw = jbegw(iyproc+1); jew = jendw(iyproc+1);
|
|
kbw = kbegw(izproc+1); kew = kendw(izproc+1);
|
|
|
|
ibp = ibegp(ixproc+1); iep = iendp(ixproc+1);
|
|
jbp = jbegp(iyproc+1); jep = jendp(iyproc+1);
|
|
kbp = kbegp(izproc+1); kep = kendp(izproc+1);
|
|
|
|
% Determine local grid size
|
|
nxul = ieu-ibu+1; nxvl = iev-ibv+1; nxwl = iew-ibw+1; nxpl = iep-ibp+1;
|
|
nyul = jeu-jbu+1; nyvl = jev-jbv+1; nywl = jew-jbw+1; nypl = jep-jbp+1;
|
|
nzul = keu-kbu+1; nzvl = kev-kbv+1; nzwl = kew-kbw+1; nzpl = kep-kbp+1;
|
|
|
|
% Reconstruct ghost cells
|
|
if x_periodic
|
|
if ibu==1; ium1=nxu; else; ium1=ibu-1; end
|
|
if ibv==1; ivm1=nxv; else; ivm1=ibv-1; end
|
|
if ibw==1; iwm1=nxw; else; iwm1=ibw-1; end
|
|
if ibp==1; ipm1=nxp; else; ipm1=ibp-1; end
|
|
if ieu==nxu; iup1=1; else; iup1=ieu+1; end
|
|
if iev==nxv; ivp1=1; else; ivp1=iev+1; end
|
|
if iew==nxw; iwp1=1; else; iwp1=iew+1; end
|
|
if iep==nxp; ipp1=1; else; ipp1=iep+1; end
|
|
else
|
|
if ibu==1; ium1=1; else; ium1=ibu-1; end
|
|
if ibv==1; ivm1=1; else; ivm1=ibv-1; end
|
|
if ibw==1; iwm1=1; else; iwm1=ibw-1; end
|
|
if ibp==1; ipm1=1; else; ipm1=ibp-1; end
|
|
if ieu==nxu; iup1=nxu; else; iup1=ieu+1; end
|
|
if iev==nxv; ivp1=nxv; else; ivp1=iev+1; end
|
|
if iew==nxw; iwp1=nxw; else; iwp1=iew+1; end
|
|
if iep==nxp; ipp1=nxp; else; ipp1=iep+1; end
|
|
end
|
|
if y_periodic
|
|
if jbu==1; jum1=nyu; else; jum1=jbu-1; end
|
|
if jbv==1; jvm1=nyv; else; jvm1=jbv-1; end
|
|
if jbw==1; jwm1=nyw; else; jwm1=jbw-1; end
|
|
if jbp==1; jpm1=nyp; else; jpm1=jbp-1; end
|
|
if jeu==nyu; jup1=1; else; jup1=jeu+1; end
|
|
if jev==nyv; jvp1=1; else; jvp1=jev+1; end
|
|
if jew==nyw; jwp1=1; else; jwp1=jew+1; end
|
|
if jep==nyp; jpp1=1; else; jpp1=jep+1; end
|
|
else
|
|
if jbu==1; jum1=1; else; jum1=jbu-1; end
|
|
if jbv==1; jvm1=1; else; jvm1=jbv-1; end
|
|
if jbw==1; jwm1=1; else; jwm1=jbw-1; end
|
|
if jbp==1; jpm1=1; else; jpm1=jbp-1; end
|
|
if jeu==nyu; jup1=nyu; else; jup1=jeu+1; end
|
|
if jev==nyv; jvp1=nyv; else; jvp1=jev+1; end
|
|
if jew==nyw; jwp1=nyw; else; jwp1=jew+1; end
|
|
if jep==nyp; jpp1=nyp; else; jpp1=jep+1; end
|
|
end
|
|
if z_periodic
|
|
if kbu==1; kum1=nzu; else; kum1=kbu-1; end
|
|
if kbv==1; kvm1=nzv; else; kvm1=kbv-1; end
|
|
if kbw==1; kwm1=nzw; else; kwm1=kbw-1; end
|
|
if kbp==1; kpm1=nzp; else; kpm1=kbp-1; end
|
|
if keu==nzu; kup1=1; else; kup1=keu+1; end
|
|
if kev==nzv; kvp1=1; else; kvp1=kev+1; end
|
|
if kew==nzw; kwp1=1; else; kwp1=kew+1; end
|
|
if kep==nzp; kpp1=1; else; kpp1=kep+1; end
|
|
else
|
|
if kbu==1; kum1=1; else; kum1=kbu-1; end
|
|
if kbv==1; kvm1=1; else; kvm1=kbv-1; end
|
|
if kbw==1; kwm1=1; else; kwm1=kbw-1; end
|
|
if kbp==1; kpm1=1; else; kpm1=kbp-1; end
|
|
if keu==nzu; kup1=nzu; else; kup1=keu+1; end
|
|
if kev==nzv; kvp1=nzv; else; kvp1=kev+1; end
|
|
if kew==nzw; kwp1=nzw; else; kwp1=kew+1; end
|
|
if kep==nzp; kpp1=nzp; else; kpp1=kep+1; end
|
|
end
|
|
|
|
% Write u
|
|
%fprintf('%d,%d,%d,%d - %d,%d,%d,%d - %d,%d,%d,%d\n',ium1,ibu,ieu,iup1,jum1,jbu,jeu,jup1,kum1,kbu,keu,kup1);
|
|
%fprintf('%d,%d,%d,%d - %d,%d,%d,%d - %d,%d,%d,%d\n',ivm1,ibv,iev,ivp1,jvm1,jbv,jev,jvp1,kvm1,kbv,kev,kvp1);
|
|
%fprintf('%d,%d,%d,%d - %d,%d,%d,%d - %d,%d,%d,%d\n',iwm1,ibw,iew,iwp1,jwm1,jbw,jew,jwp1,kwm1,kbw,kew,kwp1);
|
|
%fprintf('%d,%d,%d,%d - %d,%d,%d,%d - %d,%d,%d,%d\n',ipm1,ibp,iep,ipp1,jpm1,jbp,jep,jpp1,kpm1,kbp,kep,kpp1);
|
|
tmp = zeros(nxul+2,nyul+2,nzul+2);
|
|
tmp(2:end-1,2:end-1,2:end-1) = u(ibu:ieu,jbu:jeu,kbu:keu);
|
|
tmp(1,:,:) = u(ium1,[jum1,jbu:jeu,jup1],[kum1,kbu:keu,kup1]);
|
|
tmp(end,:,:) = u(iup1,[jum1,jbu:jeu,jup1],[kum1,kbu:keu,kup1]);
|
|
tmp(:,1,:) = u([ium1,ibu:ieu,iup1],jum1,[kum1,kbu:keu,kup1]);
|
|
tmp(:,end,:) = u([ium1,ibu:ieu,iup1],jup1,[kum1,kbu:keu,kup1]);
|
|
tmp(:,:,1) = u([ium1,ibu:ieu,iup1],[jum1,jbu:jeu,jup1],kum1);
|
|
tmp(:,:,end) = u([ium1,ibu:ieu,iup1],[jum1,jbu:jeu,jup1],kup1);
|
|
obj.appendField(tmp,1,ibu,jbu,kbu,nxu,nyu,nzu);
|
|
|
|
% Write v
|
|
tmp = zeros(nxvl+2,nyvl+2,nzvl+2);
|
|
tmp(2:end-1,2:end-1,2:end-1) = v(ibv:iev,jbv:jev,kbv:kev);
|
|
tmp(1,:,:) = v(ivm1,[jvm1,jbv:jev,jvp1],[kvm1,kbv:kev,kvp1]);
|
|
tmp(end,:,:) = v(ivp1,[jvm1,jbv:jev,jvp1],[kvm1,kbv:kev,kvp1]);
|
|
tmp(:,1,:) = v([ivm1,ibv:iev,ivp1],jvm1,[kvm1,kbv:kev,kvp1]);
|
|
tmp(:,end,:) = v([ivm1,ibv:iev,ivp1],jvp1,[kvm1,kbv:kev,kvp1]);
|
|
tmp(:,:,1) = v([ivm1,ibv:iev,ivp1],[jvm1,jbv:jev,jvp1],kvm1);
|
|
tmp(:,:,end) = v([ivm1,ibv:iev,ivp1],[jvm1,jbv:jev,jvp1],kvp1);
|
|
obj.appendField(tmp,1,ibv,jbv,kbv,nxv,nyv,nzv);
|
|
|
|
% Write w
|
|
tmp = zeros(nxwl+2,nywl+2,nzwl+2);
|
|
tmp(2:end-1,2:end-1,2:end-1) = w(ibw:iew,jbw:jew,kbw:kew);
|
|
tmp(1,:,:) = w(iwm1,[jwm1,jbw:jew,jwp1],[kwm1,kbw:kew,kwp1]);
|
|
tmp(end,:,:) = w(iwp1,[jwm1,jbw:jew,jwp1],[kwm1,kbw:kew,kwp1]);
|
|
tmp(:,1,:) = w([iwm1,ibw:iew,iwp1],jwm1,[kwm1,kbw:kew,kwp1]);
|
|
tmp(:,end,:) = w([iwm1,ibw:iew,iwp1],jwp1,[kwm1,kbw:kew,kwp1]);
|
|
tmp(:,:,1) = w([iwm1,ibw:iew,iwp1],[jwm1,jbw:jew,jwp1],kwm1);
|
|
tmp(:,:,end) = w([iwm1,ibw:iew,iwp1],[jwm1,jbw:jew,jwp1],kwp1);
|
|
obj.appendField(tmp,1,ibw,jbw,kbw,nxw,nyw,nzw);
|
|
|
|
% Write p
|
|
tmp = zeros(nxpl+2,nypl+2,nzpl+2);
|
|
tmp(2:end-1,2:end-1,2:end-1) = p(ibp:iep,jbp:jep,kbp:kep);
|
|
tmp(1,:,:) = p(ipm1,[jpm1,jbp:jep,jpp1],[kpm1,kbp:kep,kpp1]);
|
|
tmp(end,:,:) = p(ipp1,[jpm1,jbp:jep,jpp1],[kpm1,kbp:kep,kpp1]);
|
|
tmp(:,1,:) = p([ipm1,ibp:iep,ipp1],jpm1,[kpm1,kbp:kep,kpp1]);
|
|
tmp(:,end,:) = p([ipm1,ibp:iep,ipp1],jpp1,[kpm1,kbp:kep,kpp1]);
|
|
tmp(:,:,1) = p([ipm1,ibp:iep,ipp1],[jpm1,jbp:jep,jpp1],kpm1);
|
|
tmp(:,:,end) = p([ipm1,ibp:iep,ipp1],[jpm1,jbp:jep,jpp1],kpp1);
|
|
obj.appendField(tmp,1,ibp,jbp,kbp,nxp,nyp,nzp);
|
|
|
|
obj.close();
|
|
clear obj
|
|
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
|