| """Read data specifically produced by i-PI""" |
|
|
| __all__ = ['read_frames_i_pi'] |
|
|
| import itertools |
|
|
| from .utilities import Frame, merge_frames, read_frames |
|
|
|
|
| def read_frames_i_pi(fn_positions, cell=None, fn_forces=None, fn_energies=None, column_energy=4): |
| """Read data specifically produced by i-PI. |
| |
| We assume typically used units - angstrom for positions, atomic units for forces and energies. |
| i-PI can save data in any units, but we do not attempt to be fully general here. The strides |
| if all files are assumed to be the same. For other units or strides, compose the frames by hand |
| or write a custom reader function. |
| |
| Arguments: |
| fn_positions: position trajectory file name, XYZ format |
| cell: a constant cell to use in all frames, optional |
| fn_forces: forces file name, XYZ format, optional |
| fn_energies: energies file name, n2p2 energy format, optional |
| |
| Returns: |
| a `Frame` object |
| """ |
|
|
| |
| frames_pos = read_frames(fn_positions, fformat='xyz') |
| frames = [frames_pos] |
|
|
| |
| if cell is not None: |
| frames.append(itertools.repeat(Frame(cell=cell))) |
|
|
| |
| |
| if fn_forces is not None: |
| frames.append(read_frames(fn_forces, fformat='xyz', name_data='forces', unit=1.0)) |
|
|
| |
| |
| if fn_energies is not None: |
| frames.append(read_frames(fn_energies, fformat='N2P2_E', column=column_energy)) |
|
|
| |
| yield from merge_frames(*frames) |
|
|