Robotics
code
File size: 1,758 Bytes
aac5fad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
"""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
    """

    # positions from XYZ, we expect units of angstrom for positions from ipi
    frames_pos = read_frames(fn_positions, fformat='xyz')
    frames = [frames_pos]

    # add a constant cell if provided
    if cell is not None:
        frames.append(itertools.repeat(Frame(cell=cell)))

    # add forces from XYZ if filename was provided
    # we expect atomic units for forces from i-PI
    if fn_forces is not None:
        frames.append(read_frames(fn_forces, fformat='xyz', name_data='forces', unit=1.0))

    # add energies from file if filename was provided
    # we expect atomic units for energies from i-PI
    if fn_energies is not None:
        frames.append(read_frames(fn_energies, fformat='N2P2_E', column=column_energy))

    # iterate over merged frames
    yield from merge_frames(*frames)