function make_hierarchy_from_movie_format_file, file_name, REDSHIFT=red ; takes part one .hdf5 file of the ; movie format looks for the files ; from other processors and creates a ; combined hierarchy and returnes it ; as a string array identical to the ; .hierarchy files of the other ; formats ; Tom Abel August 2007 data_dim = 3 gi = {grid, $ num: 0L, $ time: 0.D, $ timestep: 0L, $ parent: -1L, $ parent_s_index: INTARR(data_dim), $ parent_e_index: INTARR(data_dim), $ hier_file: '', $ level: 0, $ dim: INTARR(data_dim), $ Start_index: INTARR(data_dim), $ End_index: INTARR(data_dim), $ Left_edge: DBLARR(data_dim), $ Right_edge: DBLARR(data_dim), $ num_baryon_fields: 0 , $ num_particle: LONG(0) , $ baryon_file: '', $ particle_file:'', $ ngnl: 0L, $ ngtl: 0L $ } header = { pi: 0.0, root_delta: 0.0, nFields: 0B, staggering: 0B} header_length = 4+4+1+1 index_entry = {grid_id: 0L, $ time: 0d0, $ timestep: 0L, $ redshift: 0d0, $ level: 0B, $ iorigin: LON64ARR(3), $ dims: INTARR(3), $ nParticles: 0L $ } entry_length = 4+8+4+8+1+3*8+3*2+4 fstring = [''] ; file_name = '/Users/tabel/data/movie-data-small/movie_data/AmiraData110_P001.hdf5' filestem = strmid(file_name, 0, strpos(file_name, '_P', /reverse_search)+2) filewildcard = filestem+'*.hdf5.idx' fnames= FILE_SEARCH(filewildcard) nfiles = N_elements(fnames) print, 'make_hierarchy_f_fname: selected ', nfiles, ' files ' ngrids = 0L for f=0L,nfiles-1 do begin index_name = fnames[f] ;; Number of grids is written at the end of the file if index_name eq '' then break openr, 1, index_name filesize = (FSTAT(1)).size ;; Read header POINT_LUN, 1, 0 readu, 1, header if (abs(header.pi - 3.14159) gt 1e-5) then begin print, header.pi, format='("PI = ", F0)' print, "Endian wrong in the movie index? Reopening but byte swaping. Wish me luck." close, 1 openr, 1, index_name, /swap_endian filesize = (FSTAT(1)).size readu, 1, header endif ;; Throw away field names for now field_names = strarr(header.nFields) if (header.nFields gt 0) then begin for i=0,header.nfields-1 do begin trash = '1234567890123456789012345678901234567890123456789012345678901234' readu, 1, trash field_names[i] = trash ; print, trash endfor endif ngrids = FIX(FLOAT(filesize - 4 - 64*header.nFields-header_length)/entry_length) print, 'number of grids in',index_name,': ',ngrids ngi = REPLICATE(gi[0], ngrids) entries = REPLICATE(index_entry, ngrids) fngrids = 0L ;; Read all entries readu, 1, entries close, 1 ngi.Num_Baryon_Fields = header.nFields ngi.num = entries.grid_id ngi.time = entries.time ngi.timestep = entries.timestep if f eq 0 then red = entries.redshift else red=[red, entries.redshift] ngi.level = FIX(entries.level) ;; staggering = 0 :: vertex-centered, =1 :: cell-centered if (header.staggering eq 0) then correction = 1 else correction = 0 ngi.dim = (entries.dims-correction) ngi.num_particle = entries.nParticles dxyz = header.root_delta / 2.0^ngi.level if (ngrids gt 1) then $ ngi.Left_Edge = REBIN(TRANSPOSE(dxyz),3,ngrids) * entries.iorigin $ else $ ngi.Left_Edge = dxyz * entries.iorigin ngi.end_index = ngi.dim-1 ngi[*].baryon_file = strmid(fnames[f],0,strpos(fnames[f],'.idx')) ngi[*].particle_file = strmid(fnames[f],0,strpos(fnames[f],'.idx')) ; vertex centered should read:? for i=0,2 do ngi.right_edge[i] = dxyz*(ngi.dim[i])+ngi.left_edge[i] if f eq 0 then grid_info = ngi else grid_info=[grid_info[*], ngi[*]] endfor if N_elements(grid_info) eq 0 then return, '' grid_info = grid_info[sort(grid_info.time)] ; give unique numbers to the grids and record the numbers in the hdf5 ; files in the baryon file name grid_suffix = ':::/grid-'+strtrim(grid_info.num, 1)+'/' grid_info.baryon_file += grid_suffix grid_info.particle_file += grid_suffix grid_info.num = LINDGEN(N_elements(grid_info))+1L ; red = red[UNIQ(red)] ;breaki return, grid_info end