function [] = convert_particles_hdf2ucf(fhdf,fucf) % [] = 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) % Check if file contains DEM data try h5info(fhdf,'/Parameters/DEM'); isDEM = true; catch isDEM = false; end % Create column maps colml = ucf.partColmapFromFlags(false,true,isDEM,false); colpv = convert_colmap_matlab2paraview(colml); % Determine final length of set ncol = colpv.length; % Open HDF file ro and UCF file w+ id_file = H5F.open(fhdf,'H5F_ACC_RDONLY','H5P_DEFAULT'); obj = ucf(fucf,'create'); obj.setFileHeader('particle'); % Read number of steps from HDF5 file id_dset = H5D.open(id_file,'/NumberOfSteps'); nstep = H5D.read(id_dset); H5D.close(id_dset); % Loop through timesteps fprintf('[HDF read] %s\n',fhdf); fprintf('[UCF write] %s\n',fucf) for istep=1:nstep % Open group groupname = sprintf('Step#%d',istep-1); id_group = H5G.open(id_file,groupname); % Read simulation time from HDF and create UCF timestep id_att = H5A.open(id_group,'TimeValue'); time = H5A.read(id_att); H5A.close(id_att); obj.appendStep(time); % Read number of particles from attribute id_att = H5A.open(id_group,'NumberOfParticles'); np = H5A.read(id_att); H5A.close(id_att); % Prepare array to store current timestep data id_dset = H5D.open(id_group,'Radius'); id_type = H5D.get_type(id_dset); type_size = H5T.get_size(id_type); if type_size==4 pp = zeros(ncol,np,'single'); else pp = zeros(ncol,np,'double'); end H5T.close(id_type); H5D.close(id_dset); colval = cell2mat(colpv.values); [colval,sortidx] = sort(colval); colkey = colpv.keys; colkey = colkey(sortidx); % Read data for icol=1:ncol id_dset = H5D.open(id_group,colkey{icol}); tmp = H5D.read(id_dset); H5D.close(id_dset); pp(colval(icol),:) = tmp; end % Add data to UCF file obj.appendParticle(pp,colml); % Close current timestep H5G.close(id_group); end % Close files H5F.close(id_file); obj.close(); end