Source code for molsysmt.form.molsysmt_Structures.to_file_h5msm

from molsysmt._private.digestion import digest
from molsysmt import pyunitwizard as puw
import numpy as np

[docs] @digest(form='molsysmt.Structures') def to_file_h5msm(item, atom_indices='all', structure_indices='all', output_filename=None, compression='gzip', compression_opts=4, int_precision='single', float_precision='single', skip_digestion=False): from molsysmt.native import H5MSMFileHandler handler = H5MSMFileHandler(output_filename, io_mode='w', compression=compression, compression_opts=compression_opts, int_precision=int_precision, float_precision=float_precision, closed=False) dump_structures_to_h5msm(item, handler, atom_indices=atom_indices, structure_indices=structure_indices) handler.close() return output_filename
[docs] def dump_structures_to_h5msm(item, file, atom_indices='all', structure_indices='all'): from h5py._hl.files import File as h5py_File from molsysmt.native import H5MSMFileHandler file_is_h5msm = False needs_to_be_closed = False if isinstance(file, h5py_File): if 'type' in file.attrs: file_is_h5msm = (file.attrs['type']=='h5msm') elif isinstance(file, H5MSMFileHandler): file = file.file file_is_h5msm = True else: from molsysmt.form.file_h5msm.is_form import is_form as is_file_h5msm_form file_is_h5msm = is_file_h5msm_form(file) if file_is_h5msm: file = h5py.File(file, "w") needs_to_be_closed = True if not file_is_h5msm: raise ValueError int_precision = file.attrs['int_precision'] float_precision = file.attrs['float_precision'] if int_precision=='single': int_type=np.int32 elif int_precision=='double': int_type=np.int64 if float_precision=='single': float_type=np.float32 elif float_precision=='double': float_type=np.float64 structures_ds = file['structures'] n_atoms = item.n_atoms n_structures = item.n_structures length_unit = puw.get_standard_units(dimensionality={'[L]':1}) time_unit = puw.get_standard_units(dimensionality={'[T]':1}) energy_unit = puw.get_standard_units(dimensionality={'[L]':2, '[M]':1, '[T]':-2, '[mol]': -1}) temperature_unit = puw.get_standard_units(dimensionality={'[K]':1}) structures_ds.attrs['length_unit']=str(length_unit) structures_ds.attrs['time_unit']=str(time_unit) structures_ds.attrs['energy_unit']=str(energy_unit) if item.coordinates is not None: structures_ds['coordinates'].resize((n_structures,n_atoms,3)) if puw.check(item.coordinates, unit=length_unit): aux = puw.get_value(item.coordinates).astype(float_precision) else: aux = puw.get_value(item.coordinates, to_unit=length_unit).astype(float_precision) structures_ds['coordinates'][:,:,:] = aux if item.velocities is not None: structures_ds['velocities'].resize((n_structures,n_atoms,3)) if puw.check(item.velocities, unit=length_unit/length_time): aux = puw.get_value(item.velocities).astype(float_precision) else: aux = puw.get_value(item.velocities, to_unit=length_unit/length_time).astype(float_precision) structures_ds['velocities'][:,:,:] = aux if item.box is not None: structures_ds['box'].resize((n_structures,3,3)) if puw.check(item.box, unit=length_unit): aux = puw.get_value(item.box).astype(float_precision) else: aux = puw.get_value(item.box, to_unit=length_unit).astype(float_precision) structures_ds['box'][:,:,:] = aux if item.kinetic_energy is not None: structures_ds['kinetic_energy'].resize((n_structures)) if puw.check(item.kinetic_energy, unit=energy_unit): aux = puw.get_value(item.kinetic_energy).astype(float_precision) else: aux = puw.get_value(item.kinetic_energy, to_unit=length_unit).astype(float_precision) structures_ds['kinetic_energy'][:] = aux if item.potential_energy is not None: structures_ds['potential_energy'].resize((n_structures)) if puw.check(item.potential_energy, unit=energy_unit): aux = puw.get_value(item.potential_energy).astype(float_precision) else: aux = puw.get_value(item.potential_energy, to_unit=length_unit).astype(float_precision) structures_ds['potential_energy'][:] = aux if item.temperature is not None: structures_ds['temperature'].resize((n_structures)) if puw.check(item.temperature, unit=temperature_unit): aux = puw.get_value(item.temperature).astype(float_precision) else: aux = puw.get_value(item.temperature, to_unit=length_unit).astype(float_precision) structures_ds['temperature'][:] = aux structures_ds.attrs['n_atoms'] = n_atoms structures_ds.attrs['n_structures'] = n_structures structures_ds.attrs['n_structures_written'] = n_structures if needs_to_be_closed: file.close() pass