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