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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
"""GPUMD input file parser.
Implemented:
* Input file (xyz.in)
"""
import numpy as np
from ase import io
from ase.build import bulk
from ase.io.gpumd import load_xyz_input_gpumd
# This file is parsed correctly by GPUMD, since it include
# among the examples distributed with the package, i.e.
# GPUMD/examples/ex5/xyz.in
gpumd_input_text = """16 4 1.1 0 1 2
1 1 1 6.18408 6.18408 6.18408
0 24.6747 -9.37798 21.2733 28.085 0.0250834 -0.00953331 0.0216256 0 0
1 29.7632 16.4709 -20.349 12.011 0.0291449 0.0156324 -0.0217974 1 1
0 -11.3942 20.7898 -16.1723 28.085 -0.0138055 0.0189116 -0.0164401 2 0
1 14.1056 -16.6803 15.5969 12.011 0.0110053 -0.0202905 0.0147439 3 1
0 -6.83647 -7.06634 33.159 28.085 -0.00917232 -0.00718339 0.0314857 4 0
1 44.7294 -12.1643 19.0095 12.011 0.0421363 -0.0134771 0.0159904 5 1
0 -20.8261 1.14004 -38.0268 28.085 -0.0256162 -0.00106368 -0.0408793 6 0
1 -4.53023 -50.3483 27.9666 12.011 -0.0101618 -0.0545161 0.0250959 7 1
0 -24.0175 -12.38 -22.0283 28.085 -0.0244153 -0.0148076 -0.0246158 8 0
1 -19.4088 19.7935 -10.8377 12.011 -0.0208416 0.0167874 -0.0143511 9 1
0 7.39496 22.8278 17.9552 28.085 0.00529484 0.0187607 0.01603 10 0
1 -1.24082 -7.64731 15.2911 12.011 -0.00459528 -0.0133305 0.0122104 11 1
0 8.12018 25.4121 -10.6444 28.085 0.00603208 0.0236104 -0.0152659 12 0
1 38.2451 -24.2186 31.0212 12.011 0.0355446 -0.0279537 0.0259785 13 1
0 4.30332 19.9209 -9.21584 28.085 -7.06147e-05 0.0158056 -0.0138137 14 0
1 8.91989 -1.32745 44.8546 12.011 0.00351112 -0.00690595 0.040041 15 1 """
def test_read_gpumd_input():
"""Read GPUMD input file."""
with open('xyz.in', 'w') as f:
f.write(gpumd_input_text)
# Test when specifying the species
species = ['Si', 'C']
atoms = io.read('xyz.in', format='gpumd', species=species)
groupings = [[[i] for i in range(len(atoms))],
[[i for i, s in
enumerate(atoms.get_chemical_symbols()) if s == 'Si'],
[i for i, s in
enumerate(atoms.get_chemical_symbols()) if s == 'C']]]
groups = [[[j for j, group in enumerate(grouping) if i in group][0]
for grouping in groupings] for i in range(len(atoms))]
assert len(atoms) == 16
assert set(atoms.symbols) == set(species)
assert all(atoms.get_pbc())
assert len(atoms.info) == len(atoms)
assert all(np.array_equal(
atoms.info[i]['groups'], np.array(groups[i])) for i in
range(len(atoms)))
assert len(atoms.get_velocities()) == len(atoms)
# Test without specifying the species-type map
atoms = io.read('xyz.in', format='gpumd')
assert set(atoms.symbols) == set(species)
# Test when specifying the isotope masses
isotope_masses = {'Si': [28.085], 'C': [12.011]}
atoms = io.read('xyz.in', format='gpumd',
isotope_masses=isotope_masses)
assert set(atoms.symbols) == set(species)
def test_load_gpumd_input():
"""Load all information from a GPUMD input file."""
with open('xyz.in', 'w') as f:
f.write(gpumd_input_text)
species_ref = ['Si', 'C']
with open('xyz.in', 'r') as f:
atoms, input_parameters, species =\
load_xyz_input_gpumd(f, species=species_ref)
input_parameters_ref = {'N': 16, 'M': 4, 'cutoff': 1.1,
'triclinic': 0, 'has_velocity': 1,
'num_of_groups': 2}
assert input_parameters == input_parameters_ref
assert species == species_ref
def test_gpumd_input_write():
"""Write a structure and read it back."""
atoms = bulk('NiO', 'rocksalt', 4.813, cubic=True)
# Test write and read
atoms.write('xyz.in')
readback = io.read('xyz.in')
assert np.allclose(atoms.positions, readback.positions)
assert np.allclose(atoms.cell, readback.cell)
# Test write and read with triclinic cell
atoms.write('xyz.in', use_triclinic=True)
with open('xyz.in', 'r') as f:
readback, input_parameters, _ = load_xyz_input_gpumd(f)
assert input_parameters['triclinic'] == 1
assert np.allclose(atoms.positions, readback.positions)
assert np.allclose(atoms.cell, readback.cell)
assert np.array_equal(atoms.numbers, readback.numbers)
# Test write and load with groupings
groupings = [[[i for i, s in
enumerate(atoms.get_chemical_symbols()) if s == 'Ni'],
[i for i, s in
enumerate(atoms.get_chemical_symbols()) if s == 'O']],
[[i] for i in range(len(atoms))]]
groups = [[[j for j, group in enumerate(grouping) if i in group][0]
for grouping in groupings] for i in range(len(atoms))]
atoms.write('xyz.in', groupings=groupings)
with open('xyz.in', 'r') as f:
readback, input_parameters, _ = load_xyz_input_gpumd(f)
assert input_parameters['num_of_groups'] == 2
assert len(readback.info) == len(atoms)
assert all(np.array_equal(
readback.info[i]['groups'], np.array(groups[i])) for i in
range(len(atoms)))
# Test write and read with velocities
velocities = np.array([[-0.3, 2.3, 0.7], [0.0, 0.3, 0.8],
[-0.6, 0.9, 0.1], [-1.7, -0.1, -0.5],
[-0.5, 0.0, 0.6], [-0.2, 0.1, 0.5],
[-0.1, 1.4, -1.9], [-1.0, -0.5, -1.2]])
atoms.set_velocities(velocities)
atoms.write('xyz.in')
with open('xyz.in', 'r') as f:
readback, input_parameters, _ = load_xyz_input_gpumd(f)
assert input_parameters['has_velocity'] == 1
assert np.allclose(readback.get_velocities(), atoms.get_velocities())
|