diff --git a/openmc/lattice.py b/openmc/lattice.py index 361c2a6be9..23838881e1 100644 --- a/openmc/lattice.py +++ b/openmc/lattice.py @@ -129,7 +129,7 @@ class Lattice(object): """ lattice_id = int(group.name.split('/')[-1].lstrip('lattice ')) - name = group['name'].value.decode() + name = group['name'].value.decode() if 'name' in group else '' lattice_type = group['type'].value.decode() if 'offsets' in group: diff --git a/openmc/material.py b/openmc/material.py index ab97915e7a..e6f974b5d5 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -292,7 +292,7 @@ class Material(object): """ mat_id = int(group.name.split('/')[-1].lstrip('material ')) - name = group['name'].value.decode() + name = group['name'].value.decode() if 'name' in group else '' density = group['atom_density'].value nuc_densities = group['nuclide_densities'][...] nuclides = group['nuclides'].value diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 4101b066a1..002313ada4 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -342,7 +342,7 @@ class StatePoint(object): # Create Tally object and assign basic properties tally = openmc.Tally(tally_id) tally._sp_filename = self._f.filename - tally.name = group['name'].value.decode() + tally.name = group['name'].value.decode() if 'name' in group else '' tally.estimator = group['estimator'].value.decode() tally.num_realizations = n_realizations diff --git a/openmc/summary.py b/openmc/summary.py index 8347105b1e..3dda399461 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -105,7 +105,7 @@ class Summary(object): for key, group in self._f['geometry/cells'].items(): cell_id = int(key.lstrip('cell ')) - name = group['name'].value.decode() + name = group['name'].value.decode() if 'name' in group else '' fill_type = group['fill_type'].value.decode() if fill_type == 'material': @@ -115,10 +115,7 @@ class Summary(object): else: fill = group['lattice'].value - if 'region' in group.keys(): - region = group['region'].value.decode() - else: - region = [] + region = group['region'].value.decode() if 'region' in group else '' # Create this Cell cell = openmc.Cell(cell_id=cell_id, name=name) diff --git a/openmc/surface.py b/openmc/surface.py index 5eb242003b..0d78c0e1b2 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -210,7 +210,7 @@ class Surface(object): """ surface_id = int(group.name.split('/')[-1].lstrip('surface ')) - name = group['name'].value.decode() + name = group['name'].value.decode() if 'name' in group else '' surf_type = group['type'].value.decode() bc = group['boundary_type'].value.decode() coeffs = group['coefficients'][...] diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 3a25825112..e8c39b923c 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -1758,8 +1758,8 @@ contains integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle integer(HID_T) :: filetype - integer(HID_T) :: memtype - integer(SIZE_T) :: n + integer(SIZE_T) :: i, n + character(kind=C_CHAR), allocatable, target :: temp_buffer(:) type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1770,35 +1770,38 @@ contains ! Create datatype for HDF5 file based on C char n = len_trim(buffer) - call h5tcopy_f(H5T_C_S1, filetype, hdf5_err) - call h5tset_size_f(filetype, n + 1, hdf5_err) + if (n > 0) then + call h5tcopy_f(H5T_C_S1, filetype, hdf5_err) + call h5tset_size_f(filetype, n, hdf5_err) - ! Create datatype in memory based on Fortran character - call h5tcopy_f(H5T_FORTRAN_S1, memtype, hdf5_err) - if (n > 0) call h5tset_size_f(memtype, n, hdf5_err) + ! Create dataspace/dataset + call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), filetype, dspace, dset, hdf5_err) - ! Create dataspace/dataset - call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) - call h5dcreate_f(group_id, trim(name), filetype, dspace, dset, hdf5_err) + ! Copy string to temporary buffer + allocate(temp_buffer(n)) + do i = 1, n + temp_buffer(i) = buffer(i:i) + end do - ! Get pointer to start of string - f_ptr = c_loc(buffer(1:1)) + ! Get pointer to start of string + f_ptr = c_loc(temp_buffer(1)) - if (using_mpio_device(group_id)) then + if (using_mpio_device(group_id)) then #ifdef PHDF5 - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) - if (n > 0) call h5dwrite_f(dset, memtype, f_ptr, hdf5_err, xfer_prp=plist) - call h5pclose_f(plist, hdf5_err) + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, filetype, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) #endif - else - if (n > 0) call h5dwrite_f(dset, memtype, f_ptr, hdf5_err) - end if + else + call h5dwrite_f(dset, filetype, f_ptr, hdf5_err) + end if - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5tclose_f(memtype, hdf5_err) - call h5tclose_f(filetype, hdf5_err) + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + call h5tclose_f(filetype, hdf5_err) + end if end subroutine write_string !=============================================================================== @@ -1817,11 +1820,10 @@ contains integer(HID_T) :: plist ! property list #endif integer(HID_T) :: dset_id - integer(HID_T) :: space_id integer(HID_T) :: filetype integer(HID_T) :: memtype - integer(SIZE_T) :: size - integer(SIZE_T) :: n + integer(SIZE_T) :: i, n + character(kind=C_CHAR), allocatable, target :: temp_buffer(:) type(c_ptr) :: f_ptr if (present(name)) then @@ -1836,40 +1838,41 @@ contains if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F end if - ! Get dataspace - call h5dget_space_f(dset_id, space_id, hdf5_err) - ! Make sure buffer is large enough call h5dget_type_f(dset_id, filetype, hdf5_err) - call h5tget_size_f(filetype, size, hdf5_err) - if (size > len(buffer) + 1) then + call h5tget_size_f(filetype, n, hdf5_err) + if (n > len(buffer)) then call fatal_error("Character buffer is not long enough to & &read HDF5 string.") end if ! Get datatype in memory based on Fortran character - n = len(buffer) - call h5tcopy_f(H5T_FORTRAN_S1, memtype, hdf5_err) - call h5tset_size_f(memtype, n, hdf5_err) + call h5tcopy_f(H5T_C_S1, memtype, hdf5_err) + call h5tset_size_f(memtype, n + 1, hdf5_err) ! Get pointer to start of string - f_ptr = c_loc(buffer(1:1)) + allocate(temp_buffer(n)) + f_ptr = c_loc(temp_buffer(1)) if (using_mpio_device(dset_id)) then #ifdef PHDF5 call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) - call h5dread_f(dset_id, memtype, f_ptr, hdf5_err, & - mem_space_id=space_id, xfer_prp=plist) + call h5dread_f(dset_id, memtype, f_ptr, hdf5_err, xfer_prp=plist) call h5pclose_f(plist, hdf5_err) #endif else - call h5dread_f(dset_id, memtype, f_ptr, hdf5_err, mem_space_id=space_id) + call h5dread_f(dset_id, memtype, f_ptr, hdf5_err) end if + buffer = '' + do i = 1, n + if (temp_buffer(i) == C_NULL_CHAR) cycle + buffer(i:i) = temp_buffer(i) + end do + if (present(name)) call h5dclose_f(dset_id, hdf5_err) - call h5sclose_f(space_id, hdf5_err) call h5tclose_f(filetype, hdf5_err) call h5tclose_f(memtype, hdf5_err) end subroutine read_string @@ -2372,9 +2375,9 @@ contains end subroutine read_attribute_integer_2D_explicit subroutine read_attribute_string(buffer, obj_id, name) - character(*), intent(inout), target :: buffer ! read data to here - integer(HID_T), intent(in) :: obj_id - character(*), intent(in) :: name ! name for data + character(*), intent(inout) :: buffer ! read data to here + integer(HID_T), intent(in) :: obj_id + character(*), intent(in) :: name ! name for data integer :: hdf5_err integer(HID_T) :: attr_id ! data set handle @@ -2407,9 +2410,9 @@ contains call h5aread_f(attr_id, memtype, f_ptr, hdf5_err) buffer = '' do i = 1, size + if (temp_buffer(i) == C_NULL_CHAR) cycle buffer(i:i) = temp_buffer(i) end do - deallocate(temp_buffer) call h5aclose_f(attr_id, hdf5_err) call h5tclose_f(filetype, hdf5_err)