Beispiel #1
0
class Reader:
    def __init__(self, name, comm):
        self.comm = comm # used for broadcasting replicated data 
        if self.comm.size > 1:
            comm = self.comm.get_c_object()
        else:
            comm = None
        self.file = File(name, 'r', comm)
        self.dims_grp = self.file['Dimensions']
        self.params_grp = self.file['Parameters']
        self.hdf5 = True

    def dimension(self, name):
        value = self.dims_grp.attrs[name]
        return value

    def __getitem__(self, name):
        value = self.params_grp.attrs[name]
        try:
            value = eval(value, {})
        except (SyntaxError, NameError, TypeError):
            pass
        return value

    def has_array(self, name):
        return name in self.file.keys()
    
    def get(self, name, *indices, **kwargs):

        parallel = kwargs.pop('parallel', False)
        read = kwargs.pop('read', True)
        out = kwargs.pop('out', None)
        broadcast = kwargs.pop('broadcast', False)
        assert not kwargs

        if parallel:
            collective = True
        else: 
            collective = False

        dset = self.file[name]
        if indices:
            selection = HyperslabSelection(indices, dset.shape)
            mshape = selection.mshape
        else:
            selection = 'all'
            mshape = dset.shape

        if not read:
            selection = None

        real2complex = False
        if out is None:
            array = np.ndarray(mshape, dset.dtype, order='C')
        elif out.dtype == complex and dset.dtype == float:
            # For real to complex reading i.e TDDFT temporary buffer 
            # is also needed
            array = np.ndarray(mshape, dset.dtype, order='C')
            real2complex = True
        else:
            assert type(out) is np.ndarray
            # XXX Check the shapes are compatible
            assert out.shape == mshape
            assert (out.dtype == dset.dtype or 
                   (out.dtype == complex and dset.dtype == float))
            array = out

        dset.read(array, selection, collective)

        if real2complex:
            out[:] = array[:]
            array = out

        if broadcast:
            self.comm.broadcast(array, 0)

        if array.shape == ():
            return array.item()
        else:
            return array

    def get_reference(self, name, indices, length=None):
        return HDF5FileReference(self.file, name, indices, length)

    def get_parameters(self):
        return self.params_grp.attrs
   
    def close(self):
        self.file.close()