git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@12769 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
145
tools/i-pi/ipi/utils/io/io_xyz.py
Normal file
145
tools/i-pi/ipi/utils/io/io_xyz.py
Normal file
@ -0,0 +1,145 @@
|
||||
"""Contains the functions used to print the trajectories and read input
|
||||
configurations with xyz formatting.
|
||||
|
||||
Copyright (C) 2013, Joshua More and Michele Ceriotti
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http.//www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
Functions:
|
||||
print_xyz_path: Prints all the bead configurations.
|
||||
print_xyz: Prints the centroid configurations.
|
||||
read_xyz: Reads the cell parameters and atom configurations from a xyz file.
|
||||
"""
|
||||
|
||||
__all__ = ['print_xyz_path', 'print_xyz', 'read_xyz', 'iter_xyz']
|
||||
|
||||
import numpy as np
|
||||
import math, sys
|
||||
import ipi.utils.mathtools as mt
|
||||
from ipi.utils.depend import depstrip
|
||||
from ipi.engine.atoms import Atoms
|
||||
from ipi.utils.units import *
|
||||
|
||||
def print_xyz_path(beads, cell, filedesc = sys.stdout):
|
||||
"""Prints all the bead configurations, into a xyz formatted file.
|
||||
|
||||
Prints all the replicas for each time step separately, rather than all at
|
||||
once.
|
||||
|
||||
Args:
|
||||
beads: A beads object giving the bead positions.
|
||||
cell: A cell object giving the system box.
|
||||
filedesc: An open writable file object. Defaults to standard output.
|
||||
"""
|
||||
|
||||
a, b, c, alpha, beta, gamma = mt.h2abc_deg(cell.h)
|
||||
|
||||
natoms = beads.natoms
|
||||
nbeads = beads.nbeads
|
||||
for j in range(nbeads):
|
||||
filedesc.write("%d\n# bead: %d CELL(abcABC): %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f \n" % (natoms, j, a, b, c, alpha, beta, gamma))
|
||||
for i in range(natoms):
|
||||
qs = depstrip(beads.q)
|
||||
lab = depstrip(beads.names)
|
||||
filedesc.write("%8s %12.5e %12.5e %12.5e\n" % (lab[i], qs[j][3*i], qs[j][3*i+1], qs[j][3*i+2]))
|
||||
|
||||
def print_xyz(atoms, cell, filedesc = sys.stdout, title=""):
|
||||
"""Prints the centroid configurations, into a xyz formatted file.
|
||||
|
||||
Args:
|
||||
atoms: An atoms object giving the centroid positions.
|
||||
cell: A cell object giving the system box.
|
||||
filedesc: An open writable file object. Defaults to standard output.
|
||||
title: This gives a string to be appended to the comment line.
|
||||
"""
|
||||
|
||||
a, b, c, alpha, beta, gamma = mt.h2abc_deg(cell.h)
|
||||
|
||||
natoms = atoms.natoms
|
||||
filedesc.write("%d\n# CELL(abcABC): %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f %s\n" % ( natoms, a, b, c, alpha, beta, gamma, title))
|
||||
# direct access to avoid unnecessary slow-down
|
||||
qs = depstrip(atoms.q)
|
||||
lab = depstrip(atoms.names)
|
||||
for i in range(natoms):
|
||||
filedesc.write("%8s %12.5e %12.5e %12.5e\n" % (lab[i], qs[3*i], qs[3*i+1], qs[3*i+2]))
|
||||
|
||||
def read_xyz(filedesc):
|
||||
"""Takes a xyz-style file and creates an Atoms object.
|
||||
|
||||
Args:
|
||||
filedesc: An open readable file object from a xyz formatted file.
|
||||
|
||||
Returns:
|
||||
An Atoms object with the appropriate atom labels, masses and positions.
|
||||
"""
|
||||
|
||||
natoms = filedesc.readline()
|
||||
if natoms == "":
|
||||
raise EOFError("The file descriptor hit EOF.")
|
||||
natoms = int(natoms)
|
||||
comment = filedesc.readline()
|
||||
|
||||
qatoms = []
|
||||
names = []
|
||||
masses = []
|
||||
iat = 0
|
||||
while (iat < natoms):
|
||||
body = filedesc.readline()
|
||||
if body.strip() == "":
|
||||
break
|
||||
body = body.split()
|
||||
name = body[0]
|
||||
names.append(name)
|
||||
masses.append(Elements.mass(name))
|
||||
x = float(body[1])
|
||||
y = float(body[2])
|
||||
z = float(body[3])
|
||||
qatoms.append(x)
|
||||
qatoms.append(y)
|
||||
qatoms.append(z)
|
||||
iat += 1
|
||||
|
||||
if natoms != len(names):
|
||||
raise ValueError("The number of atom records does not match the header of the xyz file.")
|
||||
|
||||
atoms = Atoms(natoms)
|
||||
# for i in range(natoms):
|
||||
# nat = atoms[i]
|
||||
# nat.q = qatoms[i]
|
||||
# nat.name = names[i]
|
||||
# nat.m = Elements.mass(names[i])
|
||||
atoms.q = np.asarray(qatoms)
|
||||
atoms.names = np.asarray(names, dtype='|S4')
|
||||
atoms.m = np.asarray(masses)
|
||||
|
||||
return atoms
|
||||
|
||||
def iter_xyz(filedesc):
|
||||
"""Takes a xyz-style file and yields one Atoms object after another.
|
||||
|
||||
Args:
|
||||
filedesc: An open readable file object from a xyz formatted file.
|
||||
|
||||
Returns:
|
||||
Generator over the xyz trajectory, that yields
|
||||
Atoms objects with the appropriate atom labels, masses and positions.
|
||||
"""
|
||||
|
||||
try:
|
||||
while 1:
|
||||
atoms = read_xyz(filedesc)
|
||||
yield atoms
|
||||
except EOFError:
|
||||
pass
|
||||
Reference in New Issue
Block a user