git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@12769 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp
2014-11-24 17:02:36 +00:00
parent af1adefecf
commit 997f7a8845
106 changed files with 29480 additions and 0 deletions

4
tools/i-pi/.vimrc Normal file
View File

@ -0,0 +1,4 @@
set tabstop=3
set softtabstop=3
set shiftwidth=3
set expandtab

1
tools/i-pi/MANIFEST.in Normal file
View File

@ -0,0 +1 @@
include README.rst

49
tools/i-pi/README.rst Normal file
View File

@ -0,0 +1,49 @@
i-PI V1.0 -- LAMMPS
-------------------
A Python interface for ab initio path integral molecular dynamics simulations.
i-PI is composed of a Python server (i-pi itself, that does not need to be
compiled but only requires a relatively recent version of Python and Numpy)
that propagates the (path integral) dynamics of the nuclei, and of an external
code that acts as client and computes the electronic energy and forces.
This is typically a patched version of an electronic structure code, but a
simple self-contained Fortran driver that implements Lennard-Jones and
Silveira-Goldman potentials is included for test purposes.
This folder contains a stripped-down version to be used with LAMMPS, and might
not contain all the features of the latest version. Please see
[http://epfl-cosmo.github.io/gle4md/index.html?page=ipi] or
[http://github.com/i-pi/i-pi] to obtain an up-to-date version.
Quick Installation and Test
---------------------------
Follow these instruction to test i-PI. These assume to be run from a Linux
environment, with a recent version of Python, Numpy and gfortran, and that
the terminal is initially in the i-pi package directory (the directory
containing this file).
* Generate the driver code
::
$ cd driver
$ make
$ cd ..
* Run one of the examples
This will first start the wrapper in the background, redirecting the output on
a log file, then run a couple of instances of the driver code and then follow
the progress of the wrapper by monitoring the log file::
$ cd examples/tutorial/tutorial-1/
$ ../../../i-pi tutorial-1.xml > log &
$ ../../../drivers/driver.x -h localhost -p 31415 -m sg -o 15 &
$ ../../../drivers/driver.x -h localhost -p 31415 -m sg -o 15 &
$ tail -f log
The monitoring can be interrupted with ``CTRL+C`` when the run has finished (5000 steps)

215
tools/i-pi/drivers/LJ.f90 Normal file
View File

@ -0,0 +1,215 @@
! This performs the calculations necessary to run a Lennard-Jones (LJ)
! simulation.
!
! Copyright (C) 2013, Joshua More and Michele Ceriotti
!
! Permission is hereby granted, free of charge, to any person obtaining
! a copy of this software and associated documentation files (the
! "Software"), to deal in the Software without restriction, including
! without limitation the rights to use, copy, modify, merge, publish,
! distribute, sublicense, and/or sell copies of the Software, and to
! permit persons to whom the Software is furnished to do so, subject to
! the following conditions:
!
! The above copyright notice and this permission notice shall be included
! in all copies or substantial portions of the Software.
!
! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
! EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
! MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
! IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
! CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
! TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
! SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
!
!
! This contains the functions that calculate the potential, forces and
! virial tensor of a single-component LJ system.
! Includes functions which calculate the long-range correction terms for a
! simulation with a sharp nearest-neighbour cut-off.
!
! Functions:
! LJ_functions: Calculates the LJ pair potential and the magnitude of the
! forces acting on a pair of atoms.
! LJ_fij: Calculates the LJ pair potential and force vector for the
! interaction of a pair of atoms.
! LJ_longrange: Calculates the long range correction to the potential
! and virial.
! LJ_getall: Calculates the potential and virial of the system and the
! forces acting on all the atoms.
MODULE LJ
USE DISTANCE
IMPLICIT NONE
DOUBLE PRECISION, PARAMETER :: four_tau_by_3 = 8.3775804095727811d0
CONTAINS
SUBROUTINE LJ_functions(sigma, eps, r, pot, force)
! Calculates the magnitude of the LJ force and potential between
! a pair of atoms at a given distance from each other.
!
! Args:
! sigma: The LJ distance parameter.
! eps: The LJ energy parameter.
! r: The separation of the atoms.
! pot: The LJ interaction potential.
! force: The magnitude of the LJ force.
DOUBLE PRECISION, INTENT(IN) :: sigma
DOUBLE PRECISION, INTENT(IN) :: eps
DOUBLE PRECISION, INTENT(IN) :: r
DOUBLE PRECISION, INTENT(OUT) :: pot
DOUBLE PRECISION, INTENT(OUT) :: force
DOUBLE PRECISION sigma_by_r6
sigma_by_r6 = sigma/r
sigma_by_r6 = sigma_by_r6*sigma_by_r6*sigma_by_r6
sigma_by_r6 = sigma_by_r6*sigma_by_r6
pot = 4*eps*(sigma_by_r6*(sigma_by_r6 - 1))
force = 24*eps*(sigma_by_r6*(2*sigma_by_r6 - 1)/r)
END SUBROUTINE
SUBROUTINE LJ_fij(sigma, eps, rij, r, pot, fij)
! This calculates the LJ potential energy and the magnitude and
! direction of the force acting on a pair of atoms.
!
! Args:
! sigma: The LJ distance parameter.
! eps: The LJ energy parameter.
! rij: The vector joining the two atoms.
! r: The separation of the two atoms.
! pot: The LJ interaction potential.
! fij: The LJ force vector.
DOUBLE PRECISION, INTENT(IN) :: sigma
DOUBLE PRECISION, INTENT(IN) :: eps
DOUBLE PRECISION, DIMENSION(3), INTENT(IN) :: rij
DOUBLE PRECISION, INTENT(IN) :: r
DOUBLE PRECISION, INTENT(OUT) :: pot
DOUBLE PRECISION, DIMENSION(3), INTENT(OUT) :: fij
DOUBLE PRECISION f_tot
CALL LJ_functions(sigma, eps, r, pot, f_tot)
fij = f_tot*rij/r
END SUBROUTINE
SUBROUTINE LJ_longrange(rc, sigma, eps, natoms, volume, pot_lr, vir_lr)
! Calculates the long range correction to the total potential and
! virial pressure.
!
! Uses the tail correction for a sharp cut-off, with no smoothing
! function, as derived in Martyna and Hughes, Journal of Chemical
! Physics, 110, 3275, (1999).
!
! Args:
! rc: The cut-off radius.
! sigma: The LJ distance parameter.
! eps: The LJ energy parameter.
! natoms: The number of atoms in the system.
! volume: The volume of the system box.
! pot_lr: The tail correction to the LJ interaction potential.
! vir_lr: The tail correction to the LJ virial pressure.
DOUBLE PRECISION, INTENT(IN) :: rc
DOUBLE PRECISION, INTENT(IN) :: sigma
DOUBLE PRECISION, INTENT(IN) :: eps
INTEGER, INTENT(IN) :: natoms
DOUBLE PRECISION, INTENT(IN) :: volume
DOUBLE PRECISION, INTENT(OUT) :: pot_lr
DOUBLE PRECISION, INTENT(OUT) :: vir_lr
DOUBLE PRECISION sbyr, s3byr3, s6byr3, s6byr6, prefactor
sbyr = sigma/rc
s3byr3 = sbyr*sbyr*sbyr
s6byr6 = s3byr3*s3byr3
prefactor = four_tau_by_3*natoms*natoms*eps/volume
prefactor = prefactor*s3byr3*sigma*sigma*sigma
pot_lr = prefactor*(s6byr6/3-1)
vir_lr = prefactor*(s6byr6-1) + pot_lr
END SUBROUTINE
SUBROUTINE LJ_getall(rc, sigma, eps, natoms, atoms, cell_h, cell_ih, index_list, n_list, pot, forces, virial)
! Calculates the LJ potential energy and virial and the forces
! acting on all the atoms.
!
! Args:
! rc: The cut-off radius.
! sigma: The LJ distance parameter.
! eps: The LJ energy parameter.
! natoms: The number of atoms in the system.
! atoms: A vector holding all the atom positions.
! cell_h: The simulation box cell vector matrix.
! cell_ih: The inverse of the simulation box cell vector matrix.
! index_list: A array giving the last index of n_list that
! gives the neighbours of a given atom.
! n_list: An array giving the indices of the atoms that neighbour
! the atom determined by index_list.
! pot: The total potential energy of the system.
! forces: An array giving the forces acting on all the atoms.
! virial: The virial tensor, not divided by the volume.
DOUBLE PRECISION, INTENT(IN) :: rc
DOUBLE PRECISION, INTENT(IN) :: sigma
DOUBLE PRECISION, INTENT(IN) :: eps
INTEGER, INTENT(IN) :: natoms
DOUBLE PRECISION, DIMENSION(natoms,3), INTENT(IN) :: atoms
DOUBLE PRECISION, DIMENSION(3,3), INTENT(IN) :: cell_h
DOUBLE PRECISION, DIMENSION(3,3), INTENT(IN) :: cell_ih
INTEGER, DIMENSION(natoms), INTENT(IN) :: index_list
INTEGER, DIMENSION(natoms*(natoms-1)/2), INTENT(IN) :: n_list
DOUBLE PRECISION, INTENT(OUT) :: pot
DOUBLE PRECISION, DIMENSION(natoms,3), INTENT(OUT) :: forces
DOUBLE PRECISION, DIMENSION(3,3), INTENT(OUT) :: virial
INTEGER i, j, k, l, start
DOUBLE PRECISION, DIMENSION(3) :: fij, rij
DOUBLE PRECISION r2, pot_ij, pot_lr, vir_lr, volume
forces = 0.0d0
pot = 0.0d0
virial = 0.0d0
start = 1
DO i = 1, natoms - 1
! Only loops over the neigbour list, not all the atoms.
DO j = start, index_list(i)
CALL vector_separation(cell_h, cell_ih, atoms(i,:), atoms(n_list(j),:), rij, r2)
IF (r2 < rc*rc) THEN ! Only calculates contributions between neighbouring particles.
CALL LJ_fij(sigma, eps, rij, sqrt(r2), pot_ij, fij)
forces(i,:) = forces(i,:) + fij
forces(n_list(j),:) = forces(n_list(j),:) - fij
pot = pot + pot_ij
DO k = 1, 3
DO l = k, 3
! Only the upper triangular elements calculated.
virial(k,l) = virial(k,l) + fij(k)*rij(l)
ENDDO
ENDDO
ENDIF
ENDDO
start = index_list(i) + 1
ENDDO
! Assuming an upper-triangular vector matrix for the simulation box.
volume = cell_h(1,1)*cell_h(2,2)*cell_h(3,3)
CALL LJ_longrange(rc, sigma, eps, natoms, volume, pot_lr, vir_lr)
pot = pot + pot_lr
DO k = 1, 3
virial(k,k) = virial(k,k) + vir_lr
ENDDO
END SUBROUTINE
END MODULE

View File

@ -0,0 +1,42 @@
# Makefile for the driver tests
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
.PHONY: all
SOURCES=$(shell ls *.f90)
MODULES=distance.f90 LJ.f90 SG.f90
OBJECTS=$(SOURCES:.f90=.o) sockets.o
all: modules sockets.o driver.x
modules: $(MODULES)
gfortran -O3 -c $(MODULES)
sockets.o: sockets.c
gcc -c -o sockets.o sockets.c
driver.x: $(OBJECTS)
gfortran -O3 -o driver.x $(OBJECTS)
%.o: %.f90
gfortran -O3 -c $<
clean:
rm *.o *.mod *.x

14
tools/i-pi/drivers/README Normal file
View File

@ -0,0 +1,14 @@
-- Driver code directory --
* This gives simple test driver codes.
* Files:
- LJ.f90: Calculates the Lennard-Jones potential/forces/virial.
- SG.f90: Calculates the Silvera-Goldman potential/forces/virial.
- distance.f90: Deals with calculating the separation between atoms and
the neighbour list calculation.
- sockets.c: Contains the functions to create the client socket and read from
and write to it.
- driver.f90: Socket interface for the driver codes.
- Makefile: A makefile that which compiles all the fortran code as
necessary.

283
tools/i-pi/drivers/SG.f90 Normal file
View File

@ -0,0 +1,283 @@
! This performs the calculations necessary to run a simulation using a
! Silvera-Goldman (SG) potential for para-hydrogen. See I. Silvera and V.
! Goldman, J. Chem. Phys., 69, 4209 (1978).
!
! Copyright (C) 2013, Joshua More and Michele Ceriotti
!
! Permission is hereby granted, free of charge, to any person obtaining
! a copy of this software and associated documentation files (the
! "Software"), to deal in the Software without restriction, including
! without limitation the rights to use, copy, modify, merge, publish,
! distribute, sublicense, and/or sell copies of the Software, and to
! permit persons to whom the Software is furnished to do so, subject to
! the following conditions:
!
! The above copyright notice and this permission notice shall be included
! in all copies or substantial portions of the Software.
!
! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
! EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
! MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
! IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
! CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
! TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
! SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
!
!
! This contains the functions that calculate the potential, forces and
! virial tensor of liquid para-hydrogen
! Includes functions which calculate the long-range correction terms for a
! simulation with a sharp nearest-neighbour cut-off.
!
! Functions:
! f_c: Calculates the damping function for the dispersive interactions
! at short range.
! exp_func: Calculates the short range repulsive part of the SG potential.
! SG_functions: Calculates the SG pair potential and the magnitude of the
! forces acting on a pair of atoms.
! SG_fij: Calculates the SG pair potential and force vector for the
! interaction of a pair of atoms.
! SG_longrange: Calculates the long range correction to the potential
! and virial.
! SG_getall: Calculates the potential and virial of the system and the
! forces acting on all the atoms.
MODULE SG
USE DISTANCE
IMPLICIT NONE
! Parameters of the SG potential. This potential is of the form:
! V(r) = exp(alpha - beta*r - delta*r**2) -
! (C_6/r**6 + C_8/r**8 - C_9/r**9 + C_10/r**10)*f_c(r)
! where f_c(r) = exp(-(rc_exp/r - 1)**2) if r <= rc_exp
! = 1 otherwise
DOUBLE PRECISION, PARAMETER :: tau = 6.2831853071795862d0 !If you don't know why I used this name, you're not a real nerd
DOUBLE PRECISION, PARAMETER :: alpha = 1.713d0
DOUBLE PRECISION, PARAMETER :: beta = 1.5671d0
DOUBLE PRECISION, PARAMETER :: delta = 0.00993d0
DOUBLE PRECISION, PARAMETER :: delta_diff = delta*2.0d0
DOUBLE PRECISION, PARAMETER :: rc_exp = 8.32d0
DOUBLE PRECISION, PARAMETER :: C_6 = 12.14d0
DOUBLE PRECISION, PARAMETER :: C_8 = 215.2d0
DOUBLE PRECISION, PARAMETER :: C_9 = 143.1d0
DOUBLE PRECISION, PARAMETER :: C_10 = 4813.9d0
DOUBLE PRECISION, PARAMETER :: C_6_diff = C_6*6d0
DOUBLE PRECISION, PARAMETER :: C_8_diff = C_8*8d0
DOUBLE PRECISION, PARAMETER :: C_9_diff = C_9*9d0
DOUBLE PRECISION, PARAMETER :: C_10_diff = C_10*10d0
DOUBLE PRECISION, PARAMETER :: C_6_int = C_6/3d0
DOUBLE PRECISION, PARAMETER :: C_8_int = C_8/5d0
DOUBLE PRECISION, PARAMETER :: C_9_int = C_9/6d0
DOUBLE PRECISION, PARAMETER :: C_10_int = C_10/7d0
CONTAINS
SUBROUTINE f_c(r, long_range, long_range_diff)
! Calculates the damping function for the dispersive interactions
! at short range.
!
! Args:
! r: The separation of the atoms.
! long_range: The value of the damping function.
! long_range_diff: The differential of the damping function
! with respect to r.
DOUBLE PRECISION, INTENT(IN) :: r
DOUBLE PRECISION, INTENT(OUT) :: long_range
DOUBLE PRECISION, INTENT(OUT) :: long_range_diff
DOUBLE PRECISION dist_frac
IF (r > rc_exp) THEN
long_range = 1.0d0
long_range_diff = 0.0d0
ELSE
dist_frac = rc_exp/r - 1.0d0
long_range = dexp(-(dist_frac)**2)
long_range_diff = 2.0d0*dist_frac*rc_exp*long_range/(r*r)
END IF
END SUBROUTINE
SUBROUTINE exp_func(r, pot, force)
! Calculates the repulsive part of the SG force and potential
! between a pair of atoms at a given distance from each other.
!
! Args:
! r: The separation of the atoms.
! pot: The repulsive part of the potential energy.
! force: The magnitude of the repulsive part of the force.
DOUBLE PRECISION, INTENT(IN) :: r
DOUBLE PRECISION, INTENT(OUT) :: pot
DOUBLE PRECISION, INTENT(OUT) :: force
pot = dexp(alpha - r*(beta + delta*r))
force = (beta + delta_diff*r)*pot
END SUBROUTINE
SUBROUTINE SG_functions(r, pot, force)
! Calculates the magnitude of the SG force and potential between
! a pair of atoms at a given distance from each other.
!
! Args:
! r: The separation of the atoms.
! pot: The SG interaction potential.
! force: The magnitude of the SG force.
DOUBLE PRECISION, INTENT(IN) :: r
DOUBLE PRECISION, INTENT(OUT) :: pot
DOUBLE PRECISION, INTENT(OUT) :: force
DOUBLE PRECISION long_range, long_range_diff, disp, disp_diff, exp_pot, exp_force
DOUBLE PRECISION onr3, onr6, onr9, onr10
onr3 = 1/(r*r*r)
onr6 = onr3*onr3
onr9 = onr6*onr3
onr10 = onr9/r
CALL exp_func(r, exp_pot, exp_force)
CALL f_c(r, long_range, long_range_diff)
disp = -(C_6*onr6 + C_8*onr9*r - C_9*onr9 + C_10*onr10)
disp_diff = (C_6_diff*onr6/r + C_8_diff*onr9 - C_9_diff*onr10 + C_10_diff*onr10/r)
pot = exp_pot + disp*long_range
force = exp_force - disp_diff*long_range - disp*long_range_diff
END SUBROUTINE
SUBROUTINE SG_fij(rij, r, pot, fij)
! This calculates the SG potential energy and the magnitude and
! direction of the force acting on a pair of atoms.
!
! Args:
! rij: The vector joining the two atoms.
! r: The separation of the two atoms.
! pot: The SG interaction potential.
! fij: The SG force vector.
DOUBLE PRECISION, DIMENSION(3), INTENT(IN) :: rij
DOUBLE PRECISION, INTENT(IN) :: r
DOUBLE PRECISION, INTENT(OUT) :: pot
DOUBLE PRECISION, DIMENSION(3), INTENT(OUT) :: fij
DOUBLE PRECISION f_tot
CALL SG_functions(r, pot, f_tot)
fij = f_tot*rij/r
END SUBROUTINE
SUBROUTINE SG_longrange(rc, natoms, volume, pot_lr, vir_lr)
! Calculates the long range correction to the total potential and
! virial pressure.
!
! Uses the tail correction for a sharp cut-off, with no smoothing
! function, as derived in Martyna and Hughes, Journal of Chemical
! Physics, 110, 3275, (1999).
!
! Note that we will assume that rc > rc_exp, and that
! exp(alpha - beta*rc - delta*rc**2) << 0, so we can neglect the
! contribution of the repulsive potential and the dispersion
! damping function in the long range correction terms.
!
! Args:
! rc: The cut-off radius.
! natoms: The number of atoms in the system.
! volume: The volume of the system box.
! pot_lr: The tail correction to the SG interaction potential.
! vir_lr: The tail correction to the SG virial pressure.
DOUBLE PRECISION, INTENT(IN) :: rc
INTEGER, INTENT(IN) :: natoms
DOUBLE PRECISION, INTENT(IN) :: volume
DOUBLE PRECISION, INTENT(OUT) :: pot_lr
DOUBLE PRECISION, INTENT(OUT) :: vir_lr
DOUBLE PRECISION onr3, onr5, onr6, onr7, prefactor
onr3 = 1/(rc*rc*rc)
onr6 = onr3*onr3
onr5 = onr6*rc
onr7 = onr6/rc
prefactor = tau*natoms*natoms/volume
pot_lr = prefactor*(-C_6_int*onr3 - C_8_int*onr5 + C_9_int*onr6 - C_10_int*onr7)
vir_lr = prefactor*(-C_6*onr3 - C_8*onr5 + C_9*onr6 - C_10*onr7)/3 + pot_lr
END SUBROUTINE
SUBROUTINE SG_getall(rc, natoms, atoms, cell_h, cell_ih, index_list, n_list, pot, forces, virial)
! Calculates the SG potential energy and virial and the forces
! acting on all the atoms.
!
! Args:
! rc: The cut-off radius.
! natoms: The number of atoms in the system.
! atoms: A vector holding all the atom positions.
! cell_h: The simulation box cell vector matrix.
! cell_ih: The inverse of the simulation box cell vector matrix.
! index_list: A array giving the last index of n_list that
! gives the neighbours of a given atom.
! n_list: An array giving the indices of the atoms that neighbour
! the atom determined by index_list.
! pot: The total potential energy of the system.
! forces: An array giving the forces acting on all the atoms.
! virial: The virial tensor, not divided by the volume.
DOUBLE PRECISION, INTENT(IN) :: rc
INTEGER, INTENT(IN) :: natoms
DOUBLE PRECISION, DIMENSION(natoms,3), INTENT(IN) :: atoms
DOUBLE PRECISION, DIMENSION(3,3), INTENT(IN) :: cell_h
DOUBLE PRECISION, DIMENSION(3,3), INTENT(IN) :: cell_ih
INTEGER, DIMENSION(natoms), INTENT(IN) :: index_list
INTEGER, DIMENSION(natoms*(natoms-1)/2), INTENT(IN) :: n_list
DOUBLE PRECISION, INTENT(OUT) :: pot
DOUBLE PRECISION, DIMENSION(natoms,3), INTENT(OUT) :: forces
DOUBLE PRECISION, DIMENSION(3,3), INTENT(OUT) :: virial
INTEGER i, j, k, l, start
DOUBLE PRECISION, DIMENSION(3) :: fij, rij
DOUBLE PRECISION r2, pot_ij, pot_lr, vir_lr, volume
forces = 0.0d0
pot = 0.0d0
virial = 0.0d0
start = 1
DO i = 1, natoms - 1
! Only loops over the neigbour list, not all the atoms.
DO j = start, index_list(i)
CALL vector_separation(cell_h, cell_ih, atoms(i,:), atoms(n_list(j),:), rij, r2)
IF (r2 < rc*rc) THEN ! Only calculates contributions between neighbouring particles.
CALL SG_fij(rij, sqrt(r2), pot_ij, fij)
forces(i,:) = forces(i,:) + fij
forces(n_list(j),:) = forces(n_list(j),:) - fij
pot = pot + pot_ij
DO k = 1, 3
DO l = k, 3
! Only the upper triangular elements calculated.
virial(k,l) = virial(k,l) + fij(k)*rij(l)
ENDDO
ENDDO
ENDIF
ENDDO
start = index_list(i) + 1
ENDDO
! Assuming an upper-triangular vector matrix for the simulation box.
volume = cell_h(1,1)*cell_h(2,2)*cell_h(3,3)
CALL SG_longrange(rc, natoms, volume, pot_lr, vir_lr)
pot = pot + pot_lr
DO k = 1, 3
virial(k,k) = virial(k,k) + vir_lr
ENDDO
END SUBROUTINE
END MODULE

View File

@ -0,0 +1,174 @@
! This contains the algorithms needed to calculate the distance between atoms.
!
! Copyright (C) 2013, Joshua More and Michele Ceriotti
!
! Permission is hereby granted, free of charge, to any person obtaining a copy
! of this software and associated documentation files (the "Software"), to deal
! in the Software without restriction, including without limitation the rights
! to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
! copies of the Software, and to permit persons to whom the Software is
! furnished to do so, subject to the following conditions:
! The above copyright notice and this permission notice shall be included in
! all copies or substantial portions of the Software.
! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
! AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
! LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
! OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
! THE SOFTWARE.
!
! Functions:
! vector_separation: Calculates the vector separating two atoms.
! separation: Calculates the square distance between two vectors.
! nearest_neighbours: Generates arrays to calculate the pairs of atoms within
! a certain radius of each other.
MODULE DISTANCE
IMPLICIT NONE
CONTAINS
SUBROUTINE vector_separation(cell_h, cell_ih, ri, rj, rij, r2)
! Calculates the vector separating two atoms.
!
! Note that minimum image convention is used, so only the image of
! atom j that is the shortest distance from atom i is considered.
!
! Also note that while this may not work if the simulation
! box is highly skewed from orthorhombic, as
! in this case it is possible to return a distance less than the
! nearest neighbour distance. However, this will not be of
! importance unless the cut-off radius is more than half the
! width of the shortest face-face distance of the simulation box,
! which should never be the case.
!
! Args:
! cell_h: The simulation box cell vector matrix.
! cell_ih: The inverse of the simulation box cell vector matrix.
! ri: The position vector of atom i.
! rj: The position vector of atom j
! rij: The vector separating atoms i and j.
! r2: The square of the distance between atoms i and j.
DOUBLE PRECISION, DIMENSION(3,3), INTENT(IN) :: cell_h
DOUBLE PRECISION, DIMENSION(3,3), INTENT(IN) :: cell_ih
DOUBLE PRECISION, DIMENSION(3), INTENT(IN) :: ri
DOUBLE PRECISION, DIMENSION(3), INTENT(IN) :: rj
DOUBLE PRECISION, DIMENSION(3), INTENT(OUT) :: rij
DOUBLE PRECISION, INTENT(OUT) :: r2
INTEGER k
DOUBLE PRECISION, DIMENSION(3) :: sij
! The separation in a basis where the simulation box
! is a unit cube.
sij = matmul(cell_ih, ri - rj)
DO k = 1, 3
! Finds the smallest separation of all the images of atom i and j
sij(k) = sij(k) - dnint(sij(k))
ENDDO
rij = matmul(cell_h, sij)
r2 = dot_product(rij,rij)
END SUBROUTINE
SUBROUTINE separation(cell_h, cell_ih, ri, rj, r2)
! Calculates the squared distance between two position vectors.
!
! Note that minimum image convention is used, so only the image of
! atom j that is the shortest distance from atom i is considered.
!
! Also note that while this may not work if the simulation
! box is highly skewed from orthorhombic, as
! in this case it is possible to return a distance less than the
! nearest neighbour distance. However, this will not be of
! importance unless the cut-off radius is more than half the
! width of the shortest face-face distance of the simulation box,
! which should never be the case.
!
! Args:
! cell_h: The simulation box cell vector matrix.
! cell_ih: The inverse of the simulation box cell vector matrix.
! ri: The position vector of atom i.
! rj: The position vector of atom j
! r2: The square of the distance between atoms i and j.
DOUBLE PRECISION, DIMENSION(3,3), INTENT(IN) :: cell_h
DOUBLE PRECISION, DIMENSION(3,3), INTENT(IN) :: cell_ih
DOUBLE PRECISION, DIMENSION(3), INTENT(IN) :: ri
DOUBLE PRECISION, DIMENSION(3), INTENT(IN) :: rj
DOUBLE PRECISION, INTENT(OUT) :: r2
INTEGER k
! The separation in a basis where the simulation box
! is a unit cube.
DOUBLE PRECISION, DIMENSION(3) :: sij
DOUBLE PRECISION, DIMENSION(3) :: rij
sij = matmul(cell_ih, ri - rj)
DO k = 1, 3
! Finds the smallest separation of all the images of atom i and j
sij(k) = sij(k) - dnint(sij(k))
ENDDO
rij = matmul(cell_h, sij)
r2 = dot_product(rij, rij)
END SUBROUTINE
SUBROUTINE nearest_neighbours(rn, natoms, atoms, cell_h, cell_ih, index_list, n_list)
! Creates a list of all the pairs of atoms that are closer together
! than a certain distance.
!
! This takes all the positions, and calculates which ones are
! shorter than the distance rn. This creates two vectors, index_list
! and n_list. index_list(i) gives the last index of n_list that
! corresponds to a neighbour of atom i.
!
!
! Args:
! rn: The nearest neighbour list cut-off parameter. This should
! be larger than the potential cut-off radius.
! natoms: The number of atoms in the system.
! atoms: A vector holding all the atom positions.
! cell_h: The simulation box cell vector matrix.
! cell_ih: The inverse of the simulation box cell vector matrix.
! index_list: A array giving the last index of n_list that
! gives the neighbours of a given atom. Essentially keeps
! track of how many atoms neighbour a given atom.
! n_list: An array giving the indices of the atoms that neighbour
! the atom determined by index_list. Essentially keeps track
! of which atoms neighbour a given atom.
DOUBLE PRECISION, INTENT(IN) :: rn
INTEGER, INTENT(IN) :: natoms
DOUBLE PRECISION, DIMENSION(:,:), INTENT(IN) :: atoms
DOUBLE PRECISION, DIMENSION(3,3), INTENT(IN) :: cell_h
DOUBLE PRECISION, DIMENSION(3,3), INTENT(IN) :: cell_ih
INTEGER, DIMENSION(natoms), INTENT(OUT) :: index_list
INTEGER, DIMENSION(natoms*(natoms-1)/2), INTENT(OUT) :: n_list
INTEGER :: i, j
DOUBLE PRECISION r2
index_list(1) = 0
DO i = 1, natoms - 1
DO j = i + 1, natoms
CALL separation(cell_h, cell_ih, atoms(i,:), atoms(j,:), r2)
IF (r2 < rn*rn) THEN
! We have found an atom that neighbours atom i, so the
! i-th index of index_list is incremented by one, and a new
! entry is added to n_list.
index_list(i) = index_list(i) + 1
n_list(index_list(i)) = j
ENDIF
ENDDO
index_list(i+1) = index_list(i)
ENDDO
END SUBROUTINE
END MODULE

View File

@ -0,0 +1,309 @@
! The main program which runs our driver test case potentials
!
! Copyright (C) 2013, Joshua More and Michele Ceriotti
!
! Permission is hereby granted, free of charge, to any person obtaining
! a copy of this software and associated documentation files (the
! "Software"), to deal in the Software without restriction, including
! without limitation the rights to use, copy, modify, merge, publish,
! distribute, sublicense, and/or sell copies of the Software, and to
! permit persons to whom the Software is furnished to do so, subject to
! the following conditions:
!
! The above copyright notice and this permission notice shall be included
! in all copies or substantial portions of the Software.
!
! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
! EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
! MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
! IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
! CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
! TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
! SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
!
!
! Currently the potentials implemented are the Lennard-Jones
! potential, the Silvera-Goldman para-hydrogen potential and
! the ideal gas (i.e. no interaction at all)
PROGRAM DRIVER
USE LJ
USE SG
IMPLICIT NONE
! SOCKET VARIABLES
INTEGER, PARAMETER :: MSGLEN=12 ! length of the headers of the driver/wrapper communication protocol
INTEGER socket, inet, port ! socket ID & address of the server
CHARACTER*1024 :: host
! COMMAND LINE PARSING
CHARACTER*1024 :: cmdbuffer, vops
INTEGER ccmd, vstyle
LOGICAL verbose
INTEGER commas(4), par_count ! stores the index of commas in the parameter string
DOUBLE PRECISION vpars(4) ! array to store the parameters of the potential
! SOCKET COMMUNICATION BUFFERS
CHARACTER*12 :: header
LOGICAL :: isinit=.false., hasdata=.false.
INTEGER cbuf
CHARACTER*2048 :: initbuffer ! it's unlikely a string this large will ever be passed...
DOUBLE PRECISION, ALLOCATABLE :: msgbuffer(:)
! PARAMETERS OF THE SYSTEM (CELL, ATOM POSITIONS, ...)
DOUBLE PRECISION sigma, eps, rc, rn, ks ! potential parameters
INTEGER nat
DOUBLE PRECISION pot
DOUBLE PRECISION, ALLOCATABLE :: atoms(:,:), forces(:,:)
DOUBLE PRECISION cell_h(3,3), cell_ih(3,3), virial(3,3)
DOUBLE PRECISION volume
! NEIGHBOUR LIST ARRAYS
INTEGER, DIMENSION(:), ALLOCATABLE :: n_list, index_list
DOUBLE PRECISION init_volume, init_rc ! needed to correctly adjust the cut-off radius for variable cell dynamics
DOUBLE PRECISION, ALLOCATABLE :: last_atoms(:,:) ! Holds the positions when the neighbour list is created
DOUBLE PRECISION displacement ! Tracks how far each atom has moved since the last call of nearest_neighbours
INTEGER i
! parse the command line parameters
! intialize defaults
ccmd = 0
inet = 1
host = "localhost"//achar(0)
port = 31415
verbose = .false.
par_count = 0
vstyle = -1
DO i = 1, IARGC()
CALL GETARG(i, cmdbuffer)
IF (cmdbuffer == "-u") THEN ! flag for unix socket
inet = 0
ccmd = 0
ELSEIF (cmdbuffer == "-h") THEN ! read the hostname
ccmd = 1
ELSEIF (cmdbuffer == "-p") THEN ! reads the port number
ccmd = 2
ELSEIF (cmdbuffer == "-m") THEN ! reads the style of the potential function
ccmd = 3
ELSEIF (cmdbuffer == "-o") THEN ! reads the parameters
ccmd = 4
ELSEIF (cmdbuffer == "-v") THEN ! flag for verbose standard output
verbose = .true.
ELSE
IF (ccmd == 0) THEN
WRITE(*,*) " Unrecognized command line argument", ccmd
WRITE(*,*) " SYNTAX: driver.x [-u] -h hostname -p port -m [gas|lj|sg|harm] -o 'comma_separated_parameters' [-v] "
WRITE(*,*) ""
WRITE(*,*) " For LJ potential use -o sigma,epsilon,cutoff "
WRITE(*,*) " For SG potential use -o cutoff "
WRITE(*,*) " For 1D harmonic oscillator use -o k "
WRITE(*,*) " For the ideal gas, no options needed! "
CALL EXIT(-1)
ENDIF
IF (ccmd == 1) THEN
host = trim(cmdbuffer)//achar(0)
ELSEIF (ccmd == 2) THEN
READ(cmdbuffer,*) port
ELSEIF (ccmd == 3) THEN
IF (trim(cmdbuffer) == "lj") THEN
vstyle = 1
ELSEIF (trim(cmdbuffer) == "sg") THEN
vstyle = 2
ELSEIF (trim(cmdbuffer) == "harm") THEN
vstyle = 3
ELSEIF (trim(cmdbuffer) == "gas") THEN
vstyle = 0 ! ideal gas
ELSE
WRITE(*,*) " Unrecognized potential type ", trim(cmdbuffer)
WRITE(*,*) " Use -m [gas|lj|sg|harm] "
CALL EXIT(-1)
ENDIF
ELSEIF (ccmd == 4) THEN
par_count = 1
commas(1) = 0
DO WHILE (index(cmdbuffer(commas(par_count)+1:), ',') > 0)
commas(par_count + 1) = index(cmdbuffer(commas(par_count)+1:), ',') + commas(par_count)
READ(cmdbuffer(commas(par_count)+1:commas(par_count + 1)-1),*) vpars(par_count)
par_count = par_count + 1
ENDDO
READ(cmdbuffer(commas(par_count)+1:),*) vpars(par_count)
ENDIF
ccmd = 0
ENDIF
ENDDO
IF (vstyle == -1) THEN
WRITE(*,*) " Error, type of potential not specified."
WRITE(*,*) " SYNTAX: driver.x [-u] -h hostname -p port -m [gas|lj|sg|harm] -o 'comma_separated_parameters' [-v] "
WRITE(*,*) ""
WRITE(*,*) " For LJ potential use -o sigma,epsilon,cutoff "
WRITE(*,*) " For SG potential use -o cutoff "
WRITE(*,*) " For the ideal gas, no options needed! "
CALL EXIT(-1)
ELSEIF (vstyle == 0) THEN
IF (par_count /= 0) THEN
WRITE(*,*) "Error: no initialization string needed for ideal gas."
CALL EXIT(-1)
ENDIF
isinit = .true.
ELSEIF (vstyle == 1) THEN
IF (par_count /= 3) THEN
WRITE(*,*) "Error: parameters not initialized correctly."
WRITE(*,*) "For LJ potential use -o sigma,epsilon,cutoff "
CALL EXIT(-1) ! Note that if initialization from the wrapper is implemented this exit should be removed.
ENDIF
sigma = vpars(1)
eps = vpars(2)
rc = vpars(3)
rn = rc*1.2
isinit = .true.
ELSEIF (vstyle == 2) THEN
IF (par_count /= 1) THEN
WRITE(*,*) "Error: parameters not initialized correctly."
WRITE(*,*) "For SG potential use -o cutoff "
CALL EXIT(-1) ! Note that if initialization from the wrapper is implemented this exit should be removed.
ENDIF
rc = vpars(1)
rn = rc*1.2
isinit = .true.
ELSEIF (vstyle == 3) THEN
IF (par_count /= 1) THEN
WRITE(*,*) "Error: parameters not initialized correctly."
WRITE(*,*) "For 1D harmonic potential use -o k "
CALL EXIT(-1) ! Note that if initialization from the wrapper is implemented this exit should be removed.
ENDIF
ks = vpars(1)
isinit = .true.
ENDIF
IF (verbose) THEN
WRITE(*,*) " DRIVER - Connecting to host ", trim(host)
IF (inet > 0) THEN
WRITE(*,*) " on port ", port, " using an internet socket."
ELSE
WRITE(*,*) " using an UNIX socket."
ENDIF
ENDIF
! Calls the interface to the C sockets to open a communication channel
CALL open_socket(socket, inet, port, host)
nat = -1
DO WHILE (.true.) ! Loops forever (or until the wrapper ends!)
! Reads from the socket one message header
CALL readbuffer(socket, header, MSGLEN)
IF (verbose) WRITE(*,*) " Message from server: ", trim(header)
IF (trim(header) == "STATUS") THEN
! The wrapper is inquiring on what we are doing
IF (.not. isinit) THEN
CALL writebuffer(socket,"NEEDINIT ",MSGLEN) ! Signals that we need initialization data
ELSEIF (hasdata) THEN
CALL writebuffer(socket,"HAVEDATA ",MSGLEN) ! Signals that we are done computing and can return forces
ELSE
CALL writebuffer(socket,"READY ",MSGLEN) ! We are idling and eager to compute something
ENDIF
ELSEIF (trim(header) == "INIT") THEN ! The driver is kindly providing a string for initialization
CALL readbuffer(socket, cbuf, 4)
CALL readbuffer(socket, initbuffer, cbuf)
IF (verbose) WRITE(*,*) " Initializing system from wrapper, using ", trim(initbuffer)
isinit=.true. ! We actually do nothing with this string, thanks anyway. Could be used to pass some information (e.g. the input parameters, or the index of the replica, from the driver
ELSEIF (trim(header) == "POSDATA") THEN ! The driver is sending the positions of the atoms. Here is where we do the calculation!
! Parses the flow of data from the socket
CALL readbuffer(socket, cell_h, 9*8) ! Cell matrix
CALL readbuffer(socket, cell_ih, 9*8) ! Inverse of the cell matrix (so we don't have to invert it every time here)
! The wrapper uses atomic units for everything, and row major storage.
! At this stage one should take care that everything is converted in the
! units and storage mode used in the driver.
cell_h = transpose(cell_h)
cell_ih = transpose(cell_ih)
! We assume an upper triangular cell-vector matrix
volume = cell_h(1,1)*cell_h(2,2)*cell_h(3,3)
CALL readbuffer(socket, cbuf, 4) ! The number of atoms in the cell
IF (nat < 0) THEN ! Assumes that the number of atoms does not change throughout a simulation, so only does this once
nat = cbuf
IF (verbose) WRITE(*,*) " Allocating buffer and data arrays, with ", nat, " atoms"
ALLOCATE(msgbuffer(3*nat))
ALLOCATE(atoms(nat,3))
ALLOCATE(forces(nat,3))
ENDIF
CALL readbuffer(socket, msgbuffer, nat*3*8)
DO i = 1, nat
atoms(i,:) = msgbuffer(3*(i-1)+1:3*i)
ENDDO
IF (vstyle == 0) THEN ! ideal gas, so no calculation done
pot = 0
forces = 0
virial = 0
ELSEIF (vstyle == 3) THEN ! 1D harmonic potential, so only uses the first position variable
pot = 0.5*ks*atoms(1,1)**2
forces = 0
forces(1,1) = -ks*atoms(1,1)
virial = 0
virial(1,1) = forces(1,1)*atoms(1,1)
ELSE
IF ((allocated(n_list) .neqv. .true.)) THEN
IF (verbose) WRITE(*,*) " Allocating neighbour lists."
ALLOCATE(n_list(nat*(nat-1)/2))
ALLOCATE(index_list(nat))
ALLOCATE(last_atoms(nat,3))
CALL nearest_neighbours(rn, nat, atoms, cell_h, cell_ih, index_list, n_list)
last_atoms = atoms
init_volume = volume
init_rc = rc
ENDIF
! Checking to see if we need to re-calculate the neighbour list
rc = init_rc*(volume/init_volume)**(1.0/3.0)
DO i = 1, nat
CALL separation(cell_h, cell_ih, atoms(i,:), last_atoms(i,:), displacement)
! Note that displacement is the square of the distance moved by atom i since the last time the neighbour list was created.
IF (4*displacement > (rn-rc)*(rn-rc)) THEN
IF (verbose) WRITE(*,*) " Recalculating neighbour lists"
CALL nearest_neighbours(rn, nat, atoms, cell_h, cell_ih, index_list, n_list)
last_atoms = atoms
rn = 1.2*rc
EXIT
ENDIF
ENDDO
IF (vstyle == 1) THEN
CALL LJ_getall(rc, sigma, eps, nat, atoms, cell_h, cell_ih, index_list, n_list, pot, forces, virial)
ELSEIF (vstyle == 2) THEN
CALL SG_getall(rc, nat, atoms, cell_h, cell_ih, index_list, n_list, pot, forces, virial)
ENDIF
IF (verbose) WRITE(*,*) " Calculated energy is ", pot
ENDIF
hasdata = .true. ! Signal that we have data ready to be passed back to the wrapper
ELSEIF (trim(header) == "GETFORCE") THEN ! The driver calculation is finished, it's time to send the results back to the wrapper
! Data must be re-formatted (and units converted) in the units and shapes used in the wrapper
DO i = 1, nat
msgbuffer(3*(i-1)+1:3*i) = forces(i,:)
ENDDO
virial = transpose(virial)
CALL writebuffer(socket,"FORCEREADY ",MSGLEN)
CALL writebuffer(socket,pot,8) ! Writing the potential
CALL writebuffer(socket,nat,4) ! Writing the number of atoms
CALL writebuffer(socket,msgbuffer,3*nat*8) ! Writing the forces
CALL writebuffer(socket,virial,9*8) ! Writing the virial tensor, NOT divided by the volume
cbuf = 7 ! Size of the "extras" string
CALL writebuffer(socket,cbuf,4) ! This would write out the "extras" string, but in this case we only use a dummy string.
CALL writebuffer(socket,"nothing",7)
hasdata = .false.
ELSE
WRITE(*,*) " Unexpected header ", header
CALL EXIT(-1)
ENDIF
ENDDO
IF (nat > 0) DEALLOCATE(atoms, forces, msgbuffer)
END PROGRAM

View File

@ -0,0 +1,147 @@
/* A minimal wrapper for socket communication.
Copyright (C) 2013, Joshua More and Michele Ceriotti
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Contains both the functions that transmit data to the socket and read the data
back out again once finished, and the function which opens the socket initially.
Can be linked to a FORTRAN code that does not support sockets natively.
Functions:
error: Prints an error message and then exits.
open_socket_: Opens a socket with the required host server, socket type and
port number.
write_buffer_: Writes a string to the socket.
read_buffer_: Reads data from the socket.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <netdb.h>
void error(const char *msg)
// Prints an error message and then exits.
{ perror(msg); exit(-1); }
void open_socket_(int *psockfd, int* inet, int* port, char* host)
/* Opens a socket.
Note that fortran passes an extra argument for the string length, but this is
ignored here for C compatibility.
Args:
psockfd: The id of the socket that will be created.
inet: An integer that determines whether the socket will be an inet or unix
domain socket. Gives unix if 0, inet otherwise.
port: The port number for the socket to be created. Low numbers are often
reserved for important channels, so use of numbers of 4 or more digits is
recommended.
host: The name of the host server.
*/
{
int sockfd, portno, n;
struct hostent *server;
struct sockaddr * psock; int ssock;
if (*inet>0)
{ // creates an internet socket
struct sockaddr_in serv_addr; psock=(struct sockaddr *)&serv_addr; ssock=sizeof(serv_addr);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) error("Error opening socket");
server = gethostbyname(host);
if (server == NULL)
{
fprintf(stderr, "Error opening socket: no such host %s \n", host);
exit(-1);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(*port);
if (connect(sockfd, psock, ssock) < 0) error("Error opening socket: wrong host address, or broken connection");
}
else
{ // creates a unix socket
struct sockaddr_un serv_addr; psock=(struct sockaddr *)&serv_addr; ssock=sizeof(serv_addr);
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path, "/tmp/ipi_");
strcpy(serv_addr.sun_path+9, host);
if (connect(sockfd, psock, ssock) < 0) error("Error opening socket: wrong host address, or broken connection");
}
*psockfd=sockfd;
}
void writebuffer_(int *psockfd, char *data, int* plen)
/* Writes to a socket.
Args:
psockfd: The id of the socket that will be written to.
data: The data to be written to the socket.
plen: The length of the data in bytes.
*/
{
int n;
int sockfd=*psockfd;
int len=*plen;
n = write(sockfd,data,len);
if (n < 0) error("Error writing to socket: server has quit or connection broke");
}
void readbuffer_(int *psockfd, char *data, int* plen)
/* Reads from a socket.
Args:
psockfd: The id of the socket that will be read from.
data: The storage array for data read from the socket.
plen: The length of the data in bytes.
*/
{
int n, nr;
int sockfd=*psockfd;
int len=*plen;
n = nr = read(sockfd,data,len);
while (nr>0 && n<len )
{ nr=read(sockfd,&data[n],len-n); n+=nr; }
if (n == 0) error("Error reading from socket: server has quit or connection broke");
}

View File

@ -0,0 +1,70 @@
# Makefile for the q-TIP4P-F examples
#
# 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/>.
.PHONY: all clean graphene h2o-piglet_2 h2o-piglet_4 h2o-piglet_8 h2o-rpc h2o-pimd
all: graphene h2o-piglet_2 h2o-piglet_4 h2o-piglet_8 h2o-rpc h2o-pimd
LAMMPS:=../../../../../src/lmp_ubuntu
IPI:=../../../i-pi
define run_lammps
for i in `seq 1 $1`; do \
$(LAMMPS) < $2 & \
done;
endef
-include make.in
graphene:
cd graphene; $(IPI) input.xml & \
sleep 20; \
$(call run_lammps,4,in.kappa.Graphene) \
wait
h2o-piglet_2:
cd h2o-piglet.2; $(IPI) input.xml & sleep 5; \
$(call run_lammps,2,in.water) \
wait
h2o-piglet_4:
cd h2o-piglet.4; $(IPI) input.xml & sleep 5; \
$(call run_lammps,4,in.water) \
wait
h2o-piglet_8:
cd h2o-piglet.8; $(IPI) input.xml & sleep 5; \
$(call run_lammps,4,in.water) \
wait
h2o-pimd:
cd h2o-pimd; $(IPI) input.xml & sleep 5; \
$(call run_lammps,4,in.water) \
wait
h2o-rpc:
cd h2o-pimd-rpc; $(IPI) input.xml & sleep 5; \
$(call run_lammps,4,in.water_shortrange) \
$(call run_lammps,1,in.water_longrange) \
wait
clean:
rm -f */gle_lammps.* */RESTART */EXIT */log.lammps; \
cd h2o-pimd; \
rm -f RESTART EXIT log.lammps no_rpc.*; cd ..; \
cd h2o-pimd-rpc; \
rm -f RESTART EXIT log.lammps rpc.*; cd ..; \
cd graphene; \
rm -f graph.* RESTART EXIT log.lammps graphene.lammpstraj nohup.out; cd ..

View File

@ -0,0 +1,70 @@
-- Examples of i-PI working with LAMMPS --
-- Example with Tersoff graphene potential --
Uses the Tersoff parameters of Lindsay and Broido PRB 81, 205441 (2010)
to run a short simulation of graphene with the LAMMPS MD code.
-- Example with the q-TIP4P-F water potential --
* This gives an example of water with the q-TIP4P-F potential
of Scott Habershon, Thomas E. Markland and David E. Manolopoulos,
J. Chem. Phys., 131, 024501, (2009).
* State point: (N, V, T) = (216 water molecules, 43737 a_0**3, 298 K)
* This demonstrates the convergence of the kinetic and potential energy
using the ring polymer contraction (RPC) method of Thomas E. Markland and
David E. Manolopoulos, J. Chem. Phys. 129, 024105, (2008), and
the PIGLET method of Michele Ceriotti and
David Manolopoulos, Phys. Rev. Lett., 109, 100604, (2012).
** Run the examples automatically:
* First, it is necessary to patch and compile LAMMPS, and create a make.in
file containing the path to the executable and i-pi, e.g.
LAMMPS:=~/bin/lmp_serial
IPI:=~/bin/i-pi
* The runs can be done automatically using the Makefile provided. The make
targets are self-explanatory. To run the RPC example, for instance, just type:
$ make h2o-rpc
* To clean up output files:
$ make clean
** Run the examples manually:
* Go back to the example directory and run
$ python path/i-pi input.xml
the wrapper will start and sit waiting on the UDS /tmp/ipi.
* Open a separate terminal and run the LAMMPS driver code using:
$ path/lammps/src/lmp_serial < in.water
For the RPC run, instead use:
$ path/lammps/src/lmp_serial < in.water_longrange
$ path/lammps/src/lmp_serial < in.water_shortrange
You can run multiple instances of the code; it is so fast that parallel
scaling won't be appreciable.
* If your system does not support Unix domain sockets, just set in input.xml
<socket mode="unix"> <port> port_no </port>
To make the client socket connect, the in.water file should
be changed so that it has the line:
fix 1 all driver hostname port_no
where hostname is the address the socket is binding to; either graphene, piglet_2,
piglet_4, piglet_8, rpc_long, rpc_short or no_rpc depending on the run.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
units electron
atom_style full
#pair_style lj/cut/coul/long 17.01
pair_style lj/cut/tip4p/long 1 2 1 1 0.278072379 17.007
#bond_style harmonic
bond_style class2
angle_style harmonic
#kspace_style pppm 0.0001
kspace_style pppm/tip4p 0.0001
read_data data.water
pair_coeff * * 0 0
pair_coeff 1 1 0.000295147 5.96946
neighbor 2.0 bin
timestep 0.00025
#velocity all create 298.0 2345187
#thermo_style multi
#thermo 1
#fix 1 all nvt temp 298.0 298.0 30.0 tchain 1
#fix 1 all nve
fix 1 all ipi piglet_2 32344 unix
#dump 1 all xyz 25 dump.xyz
run 100000000

View File

@ -0,0 +1,37 @@
<simulation>
<initialize nbeads='2'>
<file mode='pdb'> water_298K.pdb </file>
<velocities mode="thermal" units='kelvin'> 298 </velocities>
</initialize>
<output prefix='gle_lammps'>
<properties stride='1' filename='out'> [ step, time{picosecond}, conserved{kelvin}, temperature{kelvin}, kinetic_cv{kelvin}, potential{kelvin}, pressure_cv{megapascal}] </properties>
<trajectory filename='pos' stride='20'> positions </trajectory>
</output>
<total_steps>500000</total_steps>
<prng><seed>32344</seed></prng>
<forces>
<socket mode='unix'>
<address>piglet_2</address>
</socket>
</forces>
<ensemble mode='nvt'>
<thermostat mode='nm_gle'>
<A shape='(2,9,9)'>
[
1.300513766690e-2, 9.078220950722e-6, 8.180522706851e-6, 1.196620464216e-5, 1.108609196233e-4, -8.941338246404e-4, 7.817382329484e-3, -1.206049888192e-2, -5.215913547478e-2, -9.756343549369e-6, 2.131200614277e-7, 2.972243541454e-6, -4.459298032276e-6, 2.177011229810e-7, 4.960251269751e-7, -2.083064995647e-6, -7.004617074013e-6, 2.299410255689e-5, -1.851243089560e-6, -2.972243541454e-6, 1.956991859501e-6, 1.742357040415e-6, -2.082265548357e-6, -1.760771137012e-6, -3.733162998255e-6, -3.711884630223e-5, -3.625483838477e-5, 1.492481502899e-5, 4.459298032276e-6, -1.742357040415e-6, 5.092476869103e-6, 2.033910859306e-6, 5.856365217540e-7, -3.020170664006e-6, 1.868034354962e-5, -5.049113665348e-6, 1.059383195368e-4, -2.177011229810e-7, 2.082265548357e-6, -2.033910859306e-6, 5.467813757620e-5, -6.684243951800e-6, -9.770331146786e-7, -2.159991642805e-4, 4.667176340213e-4, -7.611448585233e-4, -4.960251269751e-7, 1.760771137012e-6, -5.856365217540e-7, 6.684243951800e-6, 6.616597356640e-4, -1.637891086976e-6, -2.056652206438e-4, 2.960975881160e-4, 7.659946833472e-3, 2.083064995647e-6, 3.733162998255e-6, 3.020170664006e-6, 9.770331146786e-7, 1.637891086976e-6, 6.390977118535e-3, -6.246090363901e-5, 5.054994461623e-4, -1.078245092236e-2, 7.004617074013e-6, 3.711884630223e-5, -1.868034354962e-5, 2.159991642805e-4, 2.056652206438e-4, 6.246090363901e-5, 1.730397061203e-1, 1.004651317366e-4, -5.467410217589e-2, -2.299410255689e-5, 3.625483838477e-5, 5.049113665348e-6, -4.667176340213e-4, -2.960975881160e-4, -5.054994461623e-4, -1.004651317366e-4, 1.795223909984e+0,
3.661508781828e-6, 6.586380415542e-3, 0.000000000000e+0, 1.048798625055e-2, 0.000000000000e+0, 5.235465741104e-3, 0.000000000000e+0, 7.227324741917e-5, 0.000000000000e+0, -6.586380415542e-3, 1.472841224644e-1, 3.389091001693e-2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -3.389091001693e-2, 1.735946745861e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.048798625055e-2, 0.000000000000e+0, 0.000000000000e+0, 1.692225827878e-2, 4.099176875073e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.099176875073e-3, 1.735946745861e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -5.235465741104e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 6.199421250931e-2, 1.895288863876e-2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.895288863876e-2, 1.735946745861e-14, 0.000000000000e+0, 0.000000000000e+0, -7.227324741917e-5, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 6.363529537929e-3, 1.124668303030e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.124668303030e-3, 1.735946745861e-14
]
</A>
<C shape='(2,9,9)' units='kelvin'>
[
5.960000000000e+2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 5.960000000000e+2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 5.960000000000e+2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 5.960000000000e+2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 5.960000000000e+2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 5.960000000000e+2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 5.960000000000e+2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 5.960000000000e+2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 5.960000000000e+2,
2.328214199148e+3, -1.773638197238e+2, -1.602512467866e+3, 8.425273498280e+2, 8.422758941500e+1, -1.455757871344e+3, -5.675121506200e+3, -7.340797223540e+2, -1.291218519198e+3, -1.773638197238e+2, 1.435198117668e+4, 7.017882376280e-9, 1.492286663068e+2, 7.538985690600e+1, -6.166178913900e+1, -5.732862975560e+1, -1.734437584300e+1, 2.139711935710e+0, -1.602512467866e+3, 7.018704063600e-9, 1.404054791182e+4, -6.233033935480e+2, -2.932131143096e+2, 1.025131033748e+2, -8.882494221820e+2, -6.447837508760e+1, -2.608106016078e+2, 8.425273498280e+2, 1.492286663068e+2, -6.233033935480e+2, 6.169297761040e+2, 2.152166828426e-9, 4.558287232240e+2, -2.592081224912e+3, -3.768899601800e+2, -8.237240093440e+1, 8.422758941500e+1, 7.538985690600e+1, -2.932131143096e+2, 2.151810134644e-9, 8.324310406920e+2, 5.606216348920e+2, -1.711918649888e+3, 3.002298898960e+2, -3.067013601100e+3, -1.455757871344e+3, -6.166178913900e+1, 1.025131033748e+2, 4.558287232240e+2, 5.606216348920e+2, 3.927651344860e+4, 3.424336970680e-8, -3.200807605760e+1, 5.531363469240e+0, -5.675121506200e+3, -5.732862975560e+1, -8.882494221820e+2, -2.592081224912e+3, -1.711918649888e+3, 3.423615724260e-8, 3.770884192400e+4, -9.321443096220e+1, -3.766729941280e+2, -7.340797223540e+2, -1.734437584300e+1, -6.447837508760e+1, -3.768899601800e+2, 3.002298898960e+2, -3.200807605760e+1, -9.321443096220e+1, 1.456848407112e+5, 2.242472021306e-6, -1.291218519198e+3, 2.139711935710e+0, -2.608106016078e+2, -8.237240093440e+1, -3.067013601100e+3, 5.531363469240e+0, -3.766729941280e+2, 2.242476256184e-6, 1.456018646376e+5
]
</C>
</thermostat>
<timestep units='femtosecond'> 0.1</timestep>
<temperature units='kelvin'>298</temperature>
</ensemble>
</simulation>

View File

@ -0,0 +1,650 @@
CRYST 35.233 35.233 35.233 90.00 90.00 90.00 P 1 1
ATOM 1 O 1 1 3.846 5.672 1.323 0.00 0.00 0
ATOM 2 H 1 1 2.979 7.054 0.857 0.00 0.00 0
ATOM 3 H 1 1 5.525 5.697 0.451 0.00 0.00 0
ATOM 4 O 1 1 34.557 34.341 3.078 0.00 0.00 0
ATOM 5 H 1 1 33.722 34.689 4.840 0.00 0.00 0
ATOM 6 H 1 1 36.029 33.220 3.711 0.00 0.00 0
ATOM 7 O 1 1 5.591 1.963 13.477 0.00 0.00 0
ATOM 8 H 1 1 7.265 1.864 13.851 0.00 0.00 0
ATOM 9 H 1 1 5.009 3.555 13.916 0.00 0.00 0
ATOM 10 O 1 1 1.060 2.061 21.718 0.00 0.00 0
ATOM 11 H 1 1 0.757 0.261 21.820 0.00 0.00 0
ATOM 12 H 1 1 0.213 3.013 23.047 0.00 0.00 0
ATOM 13 O 1 1 1.200 1.337 29.006 0.00 0.00 0
ATOM 14 H 1 1 0.818 1.884 30.732 0.00 0.00 0
ATOM 15 H 1 1 2.883 1.825 29.011 0.00 0.00 0
ATOM 16 O 1 1 1.331 1.386 34.306 0.00 0.00 0
ATOM 17 H 1 1 2.392 2.898 34.846 0.00 0.00 0
ATOM 18 H 1 1 0.814 0.532 35.836 0.00 0.00 0
ATOM 19 O 1 1 31.451 10.201 0.726 0.00 0.00 0
ATOM 20 H 1 1 32.282 10.877 -0.750 0.00 0.00 0
ATOM 21 H 1 1 30.920 11.594 1.677 0.00 0.00 0
ATOM 22 O 1 1 0.836 10.808 4.298 0.00 0.00 0
ATOM 23 H 1 1 0.305 10.643 2.793 0.00 0.00 0
ATOM 24 H 1 1 -0.356 10.334 5.524 0.00 0.00 0
ATOM 25 O 1 1 34.381 5.979 9.194 0.00 0.00 0
ATOM 26 H 1 1 33.616 7.673 8.857 0.00 0.00 0
ATOM 27 H 1 1 35.115 5.260 7.618 0.00 0.00 0
ATOM 28 O 1 1 33.212 6.480 24.278 0.00 0.00 0
ATOM 29 H 1 1 31.624 6.908 23.521 0.00 0.00 0
ATOM 30 H 1 1 32.544 4.990 24.982 0.00 0.00 0
ATOM 31 O 1 1 1.992 9.002 26.863 0.00 0.00 0
ATOM 32 H 1 1 1.856 10.175 25.579 0.00 0.00 0
ATOM 33 H 1 1 0.519 8.099 26.386 0.00 0.00 0
ATOM 34 O 1 1 2.054 8.660 32.515 0.00 0.00 0
ATOM 35 H 1 1 2.167 8.727 30.494 0.00 0.00 0
ATOM 36 H 1 1 2.374 10.513 33.038 0.00 0.00 0
ATOM 37 O 1 1 3.402 16.639 3.008 0.00 0.00 0
ATOM 38 H 1 1 4.127 15.872 4.446 0.00 0.00 0
ATOM 39 H 1 1 2.905 18.339 3.160 0.00 0.00 0
ATOM 40 O 1 1 4.222 15.444 8.072 0.00 0.00 0
ATOM 41 H 1 1 5.211 16.756 8.299 0.00 0.00 0
ATOM 42 H 1 1 2.560 15.492 8.860 0.00 0.00 0
ATOM 43 O 1 1 2.831 9.246 16.488 0.00 0.00 0
ATOM 44 H 1 1 2.869 8.023 18.050 0.00 0.00 0
ATOM 45 H 1 1 3.960 8.467 15.154 0.00 0.00 0
ATOM 46 O 1 1 5.563 6.003 20.907 0.00 0.00 0
ATOM 47 H 1 1 4.653 4.638 21.480 0.00 0.00 0
ATOM 48 H 1 1 6.405 6.208 22.529 0.00 0.00 0
ATOM 49 O 1 1 2.087 13.370 22.913 0.00 0.00 0
ATOM 50 H 1 1 2.832 14.804 23.422 0.00 0.00 0
ATOM 51 H 1 1 1.434 13.509 21.196 0.00 0.00 0
ATOM 52 O 1 1 3.369 17.886 25.109 0.00 0.00 0
ATOM 53 H 1 1 3.655 17.200 26.766 0.00 0.00 0
ATOM 54 H 1 1 4.772 18.977 24.500 0.00 0.00 0
ATOM 55 O 1 1 34.764 20.803 0.948 0.00 0.00 0
ATOM 56 H 1 1 35.210 21.267 2.816 0.00 0.00 0
ATOM 57 H 1 1 35.962 21.726 0.131 0.00 0.00 0
ATOM 58 O 1 1 2.836 24.178 15.229 0.00 0.00 0
ATOM 59 H 1 1 2.795 22.346 14.876 0.00 0.00 0
ATOM 60 H 1 1 2.414 24.115 17.130 0.00 0.00 0
ATOM 61 O 1 1 33.000 24.481 15.230 0.00 0.00 0
ATOM 62 H 1 1 34.640 24.804 15.013 0.00 0.00 0
ATOM 63 H 1 1 32.401 25.764 14.295 0.00 0.00 0
ATOM 64 O 1 1 0.404 26.779 23.400 0.00 0.00 0
ATOM 65 H 1 1 1.353 27.248 24.987 0.00 0.00 0
ATOM 66 H 1 1 1.546 28.050 22.317 0.00 0.00 0
ATOM 67 O 1 1 34.222 21.380 25.418 0.00 0.00 0
ATOM 68 H 1 1 35.669 20.151 25.317 0.00 0.00 0
ATOM 69 H 1 1 32.960 21.180 23.992 0.00 0.00 0
ATOM 70 O 1 1 33.259 17.438 32.480 0.00 0.00 0
ATOM 71 H 1 1 33.314 18.782 33.883 0.00 0.00 0
ATOM 72 H 1 1 32.743 18.181 30.871 0.00 0.00 0
ATOM 73 O 1 1 4.463 21.979 3.936 0.00 0.00 0
ATOM 74 H 1 1 5.856 23.084 3.400 0.00 0.00 0
ATOM 75 H 1 1 3.986 22.180 5.602 0.00 0.00 0
ATOM 76 O 1 1 6.258 25.851 8.520 0.00 0.00 0
ATOM 77 H 1 1 5.767 27.693 8.476 0.00 0.00 0
ATOM 78 H 1 1 7.202 25.506 10.186 0.00 0.00 0
ATOM 79 O 1 1 0.601 29.737 12.747 0.00 0.00 0
ATOM 80 H 1 1 -0.685 30.842 12.350 0.00 0.00 0
ATOM 81 H 1 1 1.336 30.716 14.031 0.00 0.00 0
ATOM 82 O 1 1 7.563 28.191 24.333 0.00 0.00 0
ATOM 83 H 1 1 9.201 28.828 24.684 0.00 0.00 0
ATOM 84 H 1 1 7.381 27.621 22.799 0.00 0.00 0
ATOM 85 O 1 1 3.653 27.109 27.772 0.00 0.00 0
ATOM 86 H 1 1 5.126 27.015 26.772 0.00 0.00 0
ATOM 87 H 1 1 3.031 28.756 27.698 0.00 0.00 0
ATOM 88 O 1 1 2.596 23.991 32.476 0.00 0.00 0
ATOM 89 H 1 1 2.879 24.791 30.859 0.00 0.00 0
ATOM 90 H 1 1 4.003 22.913 32.701 0.00 0.00 0
ATOM 91 O 1 1 3.083 31.317 3.644 0.00 0.00 0
ATOM 92 H 1 1 4.133 30.589 2.539 0.00 0.00 0
ATOM 93 H 1 1 4.218 32.173 5.037 0.00 0.00 0
ATOM 94 O 1 1 4.661 30.555 9.368 0.00 0.00 0
ATOM 95 H 1 1 3.184 29.843 10.132 0.00 0.00 0
ATOM 96 H 1 1 4.358 32.448 9.126 0.00 0.00 0
ATOM 97 O 1 1 3.465 32.537 15.778 0.00 0.00 0
ATOM 98 H 1 1 5.072 31.819 15.903 0.00 0.00 0
ATOM 99 H 1 1 4.055 34.257 15.284 0.00 0.00 0
ATOM 100 O 1 1 4.215 29.153 20.317 0.00 0.00 0
ATOM 101 H 1 1 3.658 30.176 18.842 0.00 0.00 0
ATOM 102 H 1 1 4.959 30.291 21.449 0.00 0.00 0
ATOM 103 O 1 1 1.126 31.333 28.768 0.00 0.00 0
ATOM 104 H 1 1 2.395 31.124 29.925 0.00 0.00 0
ATOM 105 H 1 1 0.768 33.092 28.898 0.00 0.00 0
ATOM 106 O 1 1 4.881 32.616 32.302 0.00 0.00 0
ATOM 107 H 1 1 6.588 32.911 31.725 0.00 0.00 0
ATOM 108 H 1 1 4.486 34.037 33.249 0.00 0.00 0
ATOM 109 O 1 1 8.962 5.556 0.151 0.00 0.00 0
ATOM 110 H 1 1 9.652 6.991 0.859 0.00 0.00 0
ATOM 111 H 1 1 9.173 4.477 1.645 0.00 0.00 0
ATOM 112 O 1 1 1.833 3.518 5.679 0.00 0.00 0
ATOM 113 H 1 1 2.889 2.731 6.788 0.00 0.00 0
ATOM 114 H 1 1 2.789 4.187 4.147 0.00 0.00 0
ATOM 115 O 1 1 10.510 34.726 13.073 0.00 0.00 0
ATOM 116 H 1 1 11.920 34.118 11.919 0.00 0.00 0
ATOM 117 H 1 1 11.295 34.968 14.741 0.00 0.00 0
ATOM 118 O 1 1 7.212 0.042 22.454 0.00 0.00 0
ATOM 119 H 1 1 6.924 0.470 24.172 0.00 0.00 0
ATOM 120 H 1 1 8.319 1.228 21.653 0.00 0.00 0
ATOM 121 O 1 1 6.365 2.010 27.544 0.00 0.00 0
ATOM 122 H 1 1 5.954 3.585 26.852 0.00 0.00 0
ATOM 123 H 1 1 7.758 2.549 28.696 0.00 0.00 0
ATOM 124 O 1 1 10.833 3.140 30.787 0.00 0.00 0
ATOM 125 H 1 1 12.697 2.975 30.867 0.00 0.00 0
ATOM 126 H 1 1 10.389 3.700 32.404 0.00 0.00 0
ATOM 127 O 1 1 8.684 9.342 3.912 0.00 0.00 0
ATOM 128 H 1 1 6.985 9.256 4.773 0.00 0.00 0
ATOM 129 H 1 1 8.684 10.809 3.011 0.00 0.00 0
ATOM 130 O 1 1 4.873 9.919 7.707 0.00 0.00 0
ATOM 131 H 1 1 3.698 9.771 6.194 0.00 0.00 0
ATOM 132 H 1 1 5.047 11.961 7.624 0.00 0.00 0
ATOM 133 O 1 1 10.031 5.018 9.699 0.00 0.00 0
ATOM 134 H 1 1 9.675 3.382 10.340 0.00 0.00 0
ATOM 135 H 1 1 9.132 5.987 10.825 0.00 0.00 0
ATOM 136 O 1 1 11.246 3.918 21.929 0.00 0.00 0
ATOM 137 H 1 1 12.614 2.770 22.341 0.00 0.00 0
ATOM 138 H 1 1 12.073 5.686 21.497 0.00 0.00 0
ATOM 139 O 1 1 6.825 7.164 25.708 0.00 0.00 0
ATOM 140 H 1 1 8.036 8.374 25.980 0.00 0.00 0
ATOM 141 H 1 1 5.206 7.900 25.891 0.00 0.00 0
ATOM 142 O 1 1 10.171 12.811 0.295 0.00 0.00 0
ATOM 143 H 1 1 10.033 12.818 -1.609 0.00 0.00 0
ATOM 144 H 1 1 9.880 14.492 0.480 0.00 0.00 0
ATOM 145 O 1 1 8.190 17.402 1.253 0.00 0.00 0
ATOM 146 H 1 1 9.472 18.531 1.253 0.00 0.00 0
ATOM 147 H 1 1 6.351 17.817 1.568 0.00 0.00 0
ATOM 148 O 1 1 11.233 16.188 8.299 0.00 0.00 0
ATOM 149 H 1 1 10.291 17.689 8.166 0.00 0.00 0
ATOM 150 H 1 1 12.768 17.123 8.733 0.00 0.00 0
ATOM 151 O 1 1 6.386 8.002 12.846 0.00 0.00 0
ATOM 152 H 1 1 7.701 8.896 13.655 0.00 0.00 0
ATOM 153 H 1 1 5.591 8.877 11.519 0.00 0.00 0
ATOM 154 O 1 1 8.184 10.419 18.848 0.00 0.00 0
ATOM 155 H 1 1 9.498 9.434 19.905 0.00 0.00 0
ATOM 156 H 1 1 6.882 9.027 18.948 0.00 0.00 0
ATOM 157 O 1 1 10.806 14.431 21.328 0.00 0.00 0
ATOM 158 H 1 1 9.177 13.531 20.670 0.00 0.00 0
ATOM 159 H 1 1 11.344 15.696 20.448 0.00 0.00 0
ATOM 160 O 1 1 9.237 13.928 30.341 0.00 0.00 0
ATOM 161 H 1 1 10.779 14.839 30.522 0.00 0.00 0
ATOM 162 H 1 1 9.965 13.192 28.899 0.00 0.00 0
ATOM 163 O 1 1 10.918 21.707 1.864 0.00 0.00 0
ATOM 164 H 1 1 10.280 23.449 2.279 0.00 0.00 0
ATOM 165 H 1 1 12.708 21.456 1.749 0.00 0.00 0
ATOM 166 O 1 1 9.353 16.125 13.927 0.00 0.00 0
ATOM 167 H 1 1 9.938 17.594 14.618 0.00 0.00 0
ATOM 168 H 1 1 9.518 16.360 12.244 0.00 0.00 0
ATOM 169 O 1 1 10.371 11.107 14.268 0.00 0.00 0
ATOM 170 H 1 1 9.644 10.406 15.859 0.00 0.00 0
ATOM 171 H 1 1 9.434 12.523 14.117 0.00 0.00 0
ATOM 172 O 1 1 3.351 22.769 20.196 0.00 0.00 0
ATOM 173 H 1 1 2.055 23.686 21.503 0.00 0.00 0
ATOM 174 H 1 1 2.452 21.401 19.413 0.00 0.00 0
ATOM 175 O 1 1 6.836 21.329 23.199 0.00 0.00 0
ATOM 176 H 1 1 8.249 20.848 22.320 0.00 0.00 0
ATOM 177 H 1 1 5.668 21.841 21.886 0.00 0.00 0
ATOM 178 O 1 1 4.604 15.649 30.043 0.00 0.00 0
ATOM 179 H 1 1 6.453 15.217 30.207 0.00 0.00 0
ATOM 180 H 1 1 3.822 14.762 31.562 0.00 0.00 0
ATOM 181 O 1 1 7.125 19.976 9.421 0.00 0.00 0
ATOM 182 H 1 1 5.918 20.453 10.730 0.00 0.00 0
ATOM 183 H 1 1 8.099 21.496 9.491 0.00 0.00 0
ATOM 184 O 1 1 9.063 25.912 13.186 0.00 0.00 0
ATOM 185 H 1 1 10.350 26.572 12.367 0.00 0.00 0
ATOM 186 H 1 1 9.680 24.367 13.697 0.00 0.00 0
ATOM 187 O 1 1 8.022 22.343 17.042 0.00 0.00 0
ATOM 188 H 1 1 9.144 23.367 18.074 0.00 0.00 0
ATOM 189 H 1 1 6.562 23.462 16.852 0.00 0.00 0
ATOM 190 O 1 1 10.762 26.285 19.963 0.00 0.00 0
ATOM 191 H 1 1 11.036 27.966 20.538 0.00 0.00 0
ATOM 192 H 1 1 11.078 25.401 21.456 0.00 0.00 0
ATOM 193 O 1 1 9.158 22.902 28.391 0.00 0.00 0
ATOM 194 H 1 1 8.219 23.528 27.085 0.00 0.00 0
ATOM 195 H 1 1 8.089 21.760 29.509 0.00 0.00 0
ATOM 196 O 1 1 6.219 20.158 31.921 0.00 0.00 0
ATOM 197 H 1 1 5.635 18.511 31.161 0.00 0.00 0
ATOM 198 H 1 1 7.530 19.624 33.071 0.00 0.00 0
ATOM 199 O 1 1 11.191 31.509 2.617 0.00 0.00 0
ATOM 200 H 1 1 10.460 32.214 4.108 0.00 0.00 0
ATOM 201 H 1 1 13.176 31.751 2.577 0.00 0.00 0
ATOM 202 O 1 1 4.748 0.055 8.605 0.00 0.00 0
ATOM 203 H 1 1 5.380 0.517 10.183 0.00 0.00 0
ATOM 204 H 1 1 6.050 -0.306 7.480 0.00 0.00 0
ATOM 205 O 1 1 8.695 30.809 15.731 0.00 0.00 0
ATOM 206 H 1 1 9.189 32.103 14.495 0.00 0.00 0
ATOM 207 H 1 1 8.447 29.069 14.868 0.00 0.00 0
ATOM 208 O 1 1 10.128 31.402 20.766 0.00 0.00 0
ATOM 209 H 1 1 9.456 30.905 19.155 0.00 0.00 0
ATOM 210 H 1 1 9.020 32.731 21.415 0.00 0.00 0
ATOM 211 O 1 1 12.238 30.162 25.837 0.00 0.00 0
ATOM 212 H 1 1 11.418 30.908 27.110 0.00 0.00 0
ATOM 213 H 1 1 12.396 31.331 24.678 0.00 0.00 0
ATOM 214 O 1 1 10.395 32.537 30.624 0.00 0.00 0
ATOM 215 H 1 1 11.042 34.339 30.751 0.00 0.00 0
ATOM 216 H 1 1 11.378 31.486 31.538 0.00 0.00 0
ATOM 217 O 1 1 10.438 3.626 5.087 0.00 0.00 0
ATOM 218 H 1 1 12.435 4.082 5.136 0.00 0.00 0
ATOM 219 H 1 1 9.822 4.284 6.681 0.00 0.00 0
ATOM 220 O 1 1 14.762 3.401 13.776 0.00 0.00 0
ATOM 221 H 1 1 16.518 3.824 13.376 0.00 0.00 0
ATOM 222 H 1 1 13.752 4.757 12.964 0.00 0.00 0
ATOM 223 O 1 1 12.382 1.012 17.643 0.00 0.00 0
ATOM 224 H 1 1 13.346 1.997 16.444 0.00 0.00 0
ATOM 225 H 1 1 11.931 2.133 18.998 0.00 0.00 0
ATOM 226 O 1 1 15.278 1.293 24.559 0.00 0.00 0
ATOM 227 H 1 1 16.071 0.946 26.365 0.00 0.00 0
ATOM 228 H 1 1 15.794 0.199 23.499 0.00 0.00 0
ATOM 229 O 1 1 22.226 31.627 24.712 0.00 0.00 0
ATOM 230 H 1 1 23.338 32.595 23.876 0.00 0.00 0
ATOM 231 H 1 1 22.161 30.053 24.132 0.00 0.00 0
ATOM 232 O 1 1 15.640 1.847 32.717 0.00 0.00 0
ATOM 233 H 1 1 17.488 2.473 31.874 0.00 0.00 0
ATOM 234 H 1 1 16.403 0.869 34.267 0.00 0.00 0
ATOM 235 O 1 1 14.858 10.199 2.754 0.00 0.00 0
ATOM 236 H 1 1 13.360 10.712 2.282 0.00 0.00 0
ATOM 237 H 1 1 14.560 9.316 4.559 0.00 0.00 0
ATOM 238 O 1 1 15.717 8.469 10.739 0.00 0.00 0
ATOM 239 H 1 1 17.323 9.581 10.875 0.00 0.00 0
ATOM 240 H 1 1 14.574 9.631 10.221 0.00 0.00 0
ATOM 241 O 1 1 15.248 10.398 16.525 0.00 0.00 0
ATOM 242 H 1 1 16.324 9.181 16.149 0.00 0.00 0
ATOM 243 H 1 1 14.172 10.488 15.098 0.00 0.00 0
ATOM 244 O 1 1 13.226 8.438 20.801 0.00 0.00 0
ATOM 245 H 1 1 14.043 8.996 19.295 0.00 0.00 0
ATOM 246 H 1 1 14.661 7.802 22.093 0.00 0.00 0
ATOM 247 O 1 1 10.173 10.961 25.875 0.00 0.00 0
ATOM 248 H 1 1 11.477 10.223 26.940 0.00 0.00 0
ATOM 249 H 1 1 11.269 10.738 24.343 0.00 0.00 0
ATOM 250 O 1 1 12.792 7.737 29.173 0.00 0.00 0
ATOM 251 H 1 1 12.199 6.038 29.475 0.00 0.00 0
ATOM 252 H 1 1 14.427 7.450 29.617 0.00 0.00 0
ATOM 253 O 1 1 15.180 19.498 3.578 0.00 0.00 0
ATOM 254 H 1 1 14.883 17.596 4.080 0.00 0.00 0
ATOM 255 H 1 1 16.754 19.579 2.626 0.00 0.00 0
ATOM 256 O 1 1 12.517 11.093 7.701 0.00 0.00 0
ATOM 257 H 1 1 12.224 12.778 7.555 0.00 0.00 0
ATOM 258 H 1 1 11.150 10.393 7.057 0.00 0.00 0
ATOM 259 O 1 1 16.266 16.271 10.758 0.00 0.00 0
ATOM 260 H 1 1 16.507 15.795 12.768 0.00 0.00 0
ATOM 261 H 1 1 17.725 16.977 10.292 0.00 0.00 0
ATOM 262 O 1 1 14.069 18.399 18.897 0.00 0.00 0
ATOM 263 H 1 1 15.513 17.523 18.155 0.00 0.00 0
ATOM 264 H 1 1 14.958 18.709 20.673 0.00 0.00 0
ATOM 265 O 1 1 14.099 15.480 25.510 0.00 0.00 0
ATOM 266 H 1 1 13.698 16.872 26.938 0.00 0.00 0
ATOM 267 H 1 1 12.567 15.379 24.444 0.00 0.00 0
ATOM 268 O 1 1 13.309 17.574 30.292 0.00 0.00 0
ATOM 269 H 1 1 14.937 16.934 30.810 0.00 0.00 0
ATOM 270 H 1 1 13.969 19.494 30.012 0.00 0.00 0
ATOM 271 O 1 1 18.371 23.257 0.925 0.00 0.00 0
ATOM 272 H 1 1 19.479 23.480 2.321 0.00 0.00 0
ATOM 273 H 1 1 19.087 24.325 -0.369 0.00 0.00 0
ATOM 274 O 1 1 12.100 21.730 11.355 0.00 0.00 0
ATOM 275 H 1 1 13.141 22.287 12.743 0.00 0.00 0
ATOM 276 H 1 1 13.467 22.236 10.244 0.00 0.00 0
ATOM 277 O 1 1 12.163 23.290 23.597 0.00 0.00 0
ATOM 278 H 1 1 11.324 22.736 24.949 0.00 0.00 0
ATOM 279 H 1 1 13.882 22.872 23.840 0.00 0.00 0
ATOM 280 O 1 1 20.173 26.761 22.628 0.00 0.00 0
ATOM 281 H 1 1 20.206 26.532 20.792 0.00 0.00 0
ATOM 282 H 1 1 21.556 25.742 23.389 0.00 0.00 0
ATOM 283 O 1 1 16.701 21.165 22.605 0.00 0.00 0
ATOM 284 H 1 1 18.028 20.686 23.848 0.00 0.00 0
ATOM 285 H 1 1 17.104 22.866 21.949 0.00 0.00 0
ATOM 286 O 1 1 11.391 26.461 33.705 0.00 0.00 0
ATOM 287 H 1 1 9.841 27.192 34.048 0.00 0.00 0
ATOM 288 H 1 1 11.776 25.540 35.243 0.00 0.00 0
ATOM 289 O 1 1 9.898 25.989 4.553 0.00 0.00 0
ATOM 290 H 1 1 8.902 26.131 6.039 0.00 0.00 0
ATOM 291 H 1 1 10.287 27.806 4.376 0.00 0.00 0
ATOM 292 O 1 1 14.308 26.960 10.877 0.00 0.00 0
ATOM 293 H 1 1 15.302 27.405 12.173 0.00 0.00 0
ATOM 294 H 1 1 15.463 26.151 9.633 0.00 0.00 0
ATOM 295 O 1 1 13.433 22.960 16.904 0.00 0.00 0
ATOM 296 H 1 1 13.409 24.131 18.132 0.00 0.00 0
ATOM 297 H 1 1 13.624 21.191 17.520 0.00 0.00 0
ATOM 298 O 1 1 16.409 26.768 26.875 0.00 0.00 0
ATOM 299 H 1 1 17.590 26.987 25.431 0.00 0.00 0
ATOM 300 H 1 1 14.751 27.703 26.230 0.00 0.00 0
ATOM 301 O 1 1 14.405 22.733 29.892 0.00 0.00 0
ATOM 302 H 1 1 15.423 23.079 28.494 0.00 0.00 0
ATOM 303 H 1 1 12.826 23.259 29.416 0.00 0.00 0
ATOM 304 O 1 1 6.905 29.408 0.749 0.00 0.00 0
ATOM 305 H 1 1 8.428 30.483 1.567 0.00 0.00 0
ATOM 306 H 1 1 6.353 30.814 -0.444 0.00 0.00 0
ATOM 307 O 1 1 9.189 34.159 6.509 0.00 0.00 0
ATOM 308 H 1 1 10.198 34.193 8.002 0.00 0.00 0
ATOM 309 H 1 1 9.890 35.692 5.785 0.00 0.00 0
ATOM 310 O 1 1 14.256 32.316 9.369 0.00 0.00 0
ATOM 311 H 1 1 15.733 32.867 9.486 0.00 0.00 0
ATOM 312 H 1 1 14.754 30.670 10.090 0.00 0.00 0
ATOM 313 O 1 1 14.714 30.841 16.516 0.00 0.00 0
ATOM 314 H 1 1 13.748 29.551 17.279 0.00 0.00 0
ATOM 315 H 1 1 13.218 31.933 16.614 0.00 0.00 0
ATOM 316 O 1 1 18.409 33.641 20.611 0.00 0.00 0
ATOM 317 H 1 1 19.601 32.274 21.115 0.00 0.00 0
ATOM 318 H 1 1 17.360 32.655 19.518 0.00 0.00 0
ATOM 319 O 1 1 16.062 28.638 32.207 0.00 0.00 0
ATOM 320 H 1 1 14.648 27.958 33.253 0.00 0.00 0
ATOM 321 H 1 1 15.752 28.014 30.522 0.00 0.00 0
ATOM 322 O 1 1 16.200 30.895 1.473 0.00 0.00 0
ATOM 323 H 1 1 16.626 29.968 -0.130 0.00 0.00 0
ATOM 324 H 1 1 17.167 29.833 2.927 0.00 0.00 0
ATOM 325 O 1 1 20.278 3.529 6.048 0.00 0.00 0
ATOM 326 H 1 1 20.977 3.611 4.575 0.00 0.00 0
ATOM 327 H 1 1 21.312 4.513 7.251 0.00 0.00 0
ATOM 328 O 1 1 23.079 5.778 10.408 0.00 0.00 0
ATOM 329 H 1 1 24.650 6.259 10.838 0.00 0.00 0
ATOM 330 H 1 1 22.342 7.609 10.178 0.00 0.00 0
ATOM 331 O 1 1 19.581 2.031 12.110 0.00 0.00 0
ATOM 332 H 1 1 19.039 1.082 10.440 0.00 0.00 0
ATOM 333 H 1 1 21.141 2.991 11.851 0.00 0.00 0
ATOM 334 O 1 1 22.005 3.223 23.178 0.00 0.00 0
ATOM 335 H 1 1 21.429 4.090 24.554 0.00 0.00 0
ATOM 336 H 1 1 20.654 1.791 22.711 0.00 0.00 0
ATOM 337 O 1 1 16.630 6.422 23.792 0.00 0.00 0
ATOM 338 H 1 1 16.219 4.804 24.406 0.00 0.00 0
ATOM 339 H 1 1 17.066 7.128 25.282 0.00 0.00 0
ATOM 340 O 1 1 21.676 5.564 28.158 0.00 0.00 0
ATOM 341 H 1 1 20.658 6.717 29.185 0.00 0.00 0
ATOM 342 H 1 1 23.413 5.828 28.996 0.00 0.00 0
ATOM 343 O 1 1 15.257 5.265 5.626 0.00 0.00 0
ATOM 344 H 1 1 16.914 4.519 5.490 0.00 0.00 0
ATOM 345 H 1 1 15.144 6.150 6.972 0.00 0.00 0
ATOM 346 O 1 1 20.137 11.082 10.437 0.00 0.00 0
ATOM 347 H 1 1 20.021 10.947 8.733 0.00 0.00 0
ATOM 348 H 1 1 21.025 12.555 10.853 0.00 0.00 0
ATOM 349 O 1 1 23.089 14.627 12.437 0.00 0.00 0
ATOM 350 H 1 1 24.716 15.254 12.736 0.00 0.00 0
ATOM 351 H 1 1 23.284 13.228 13.653 0.00 0.00 0
ATOM 352 O 1 1 24.083 12.649 22.566 0.00 0.00 0
ATOM 353 H 1 1 22.397 12.663 23.042 0.00 0.00 0
ATOM 354 H 1 1 24.901 13.851 23.565 0.00 0.00 0
ATOM 355 O 1 1 17.865 7.909 30.036 0.00 0.00 0
ATOM 356 H 1 1 17.509 8.045 31.982 0.00 0.00 0
ATOM 357 H 1 1 18.078 9.582 29.318 0.00 0.00 0
ATOM 358 O 1 1 18.824 8.486 0.104 0.00 0.00 0
ATOM 359 H 1 1 19.997 10.191 -0.057 0.00 0.00 0
ATOM 360 H 1 1 17.077 8.998 0.779 0.00 0.00 0
ATOM 361 O 1 1 20.122 9.143 5.343 0.00 0.00 0
ATOM 362 H 1 1 19.373 8.819 3.821 0.00 0.00 0
ATOM 363 H 1 1 21.998 8.776 5.128 0.00 0.00 0
ATOM 364 O 1 1 16.413 14.459 5.855 0.00 0.00 0
ATOM 365 H 1 1 15.536 13.007 5.239 0.00 0.00 0
ATOM 366 H 1 1 16.006 14.725 7.737 0.00 0.00 0
ATOM 367 O 1 1 17.561 15.066 15.654 0.00 0.00 0
ATOM 368 H 1 1 17.575 13.398 16.055 0.00 0.00 0
ATOM 369 H 1 1 18.978 15.828 16.400 0.00 0.00 0
ATOM 370 O 1 1 26.374 17.047 24.817 0.00 0.00 0
ATOM 371 H 1 1 27.983 17.098 25.632 0.00 0.00 0
ATOM 372 H 1 1 25.629 18.751 24.919 0.00 0.00 0
ATOM 373 O 1 1 19.784 12.960 28.706 0.00 0.00 0
ATOM 374 H 1 1 21.662 13.055 28.871 0.00 0.00 0
ATOM 375 H 1 1 19.545 14.070 27.143 0.00 0.00 0
ATOM 376 O 1 1 17.891 16.733 32.499 0.00 0.00 0
ATOM 377 H 1 1 18.327 15.240 31.277 0.00 0.00 0
ATOM 378 H 1 1 18.633 18.335 31.693 0.00 0.00 0
ATOM 379 O 1 1 23.733 23.024 1.663 0.00 0.00 0
ATOM 380 H 1 1 24.800 24.052 2.776 0.00 0.00 0
ATOM 381 H 1 1 24.693 22.618 0.198 0.00 0.00 0
ATOM 382 O 1 1 20.789 18.440 9.443 0.00 0.00 0
ATOM 383 H 1 1 20.766 17.257 7.881 0.00 0.00 0
ATOM 384 H 1 1 21.896 17.345 10.385 0.00 0.00 0
ATOM 385 O 1 1 21.574 17.493 17.838 0.00 0.00 0
ATOM 386 H 1 1 20.597 18.955 17.218 0.00 0.00 0
ATOM 387 H 1 1 22.538 16.874 16.251 0.00 0.00 0
ATOM 388 O 1 1 19.168 14.748 24.131 0.00 0.00 0
ATOM 389 H 1 1 19.711 16.390 23.712 0.00 0.00 0
ATOM 390 H 1 1 17.429 14.695 24.403 0.00 0.00 0
ATOM 391 O 1 1 22.149 20.198 24.977 0.00 0.00 0
ATOM 392 H 1 1 21.639 20.924 26.486 0.00 0.00 0
ATOM 393 H 1 1 22.656 21.657 24.411 0.00 0.00 0
ATOM 394 O 1 1 20.565 20.792 29.600 0.00 0.00 0
ATOM 395 H 1 1 22.264 20.409 30.214 0.00 0.00 0
ATOM 396 H 1 1 20.548 22.408 30.597 0.00 0.00 0
ATOM 397 O 1 1 20.802 26.547 9.615 0.00 0.00 0
ATOM 398 H 1 1 20.099 27.984 8.338 0.00 0.00 0
ATOM 399 H 1 1 21.277 27.539 11.325 0.00 0.00 0
ATOM 400 O 1 1 16.283 23.589 7.779 0.00 0.00 0
ATOM 401 H 1 1 16.093 21.973 6.712 0.00 0.00 0
ATOM 402 H 1 1 17.901 22.971 8.154 0.00 0.00 0
ATOM 403 O 1 1 18.469 29.798 13.568 0.00 0.00 0
ATOM 404 H 1 1 19.712 31.216 13.506 0.00 0.00 0
ATOM 405 H 1 1 16.872 30.343 14.396 0.00 0.00 0
ATOM 406 O 1 1 18.790 21.712 16.060 0.00 0.00 0
ATOM 407 H 1 1 19.878 23.090 16.485 0.00 0.00 0
ATOM 408 H 1 1 17.201 22.326 15.819 0.00 0.00 0
ATOM 409 O 1 1 21.747 26.084 16.349 0.00 0.00 0
ATOM 410 H 1 1 20.783 27.021 15.300 0.00 0.00 0
ATOM 411 H 1 1 22.705 27.328 17.206 0.00 0.00 0
ATOM 412 O 1 1 20.769 26.211 32.050 0.00 0.00 0
ATOM 413 H 1 1 21.488 27.404 33.328 0.00 0.00 0
ATOM 414 H 1 1 18.989 26.710 32.145 0.00 0.00 0
ATOM 415 O 1 1 19.820 29.181 5.559 0.00 0.00 0
ATOM 416 H 1 1 20.991 29.509 4.109 0.00 0.00 0
ATOM 417 H 1 1 19.431 31.018 6.221 0.00 0.00 0
ATOM 418 O 1 1 19.240 33.867 7.993 0.00 0.00 0
ATOM 419 H 1 1 19.107 35.039 6.604 0.00 0.00 0
ATOM 420 H 1 1 20.697 33.671 9.063 0.00 0.00 0
ATOM 421 O 1 1 22.511 34.976 15.793 0.00 0.00 0
ATOM 422 H 1 1 23.716 36.163 16.603 0.00 0.00 0
ATOM 423 H 1 1 21.699 36.150 14.467 0.00 0.00 0
ATOM 424 O 1 1 22.622 30.284 19.069 0.00 0.00 0
ATOM 425 H 1 1 22.049 31.351 17.725 0.00 0.00 0
ATOM 426 H 1 1 24.411 30.773 19.576 0.00 0.00 0
ATOM 427 O 1 1 18.639 33.611 28.369 0.00 0.00 0
ATOM 428 H 1 1 18.226 32.159 29.103 0.00 0.00 0
ATOM 429 H 1 1 19.906 33.008 27.158 0.00 0.00 0
ATOM 430 O 1 1 22.520 1.325 31.926 0.00 0.00 0
ATOM 431 H 1 1 22.803 2.668 30.796 0.00 0.00 0
ATOM 432 H 1 1 21.045 0.425 31.122 0.00 0.00 0
ATOM 433 O 1 1 21.754 3.789 1.159 0.00 0.00 0
ATOM 434 H 1 1 22.085 2.785 -0.180 0.00 0.00 0
ATOM 435 H 1 1 20.850 5.175 0.610 0.00 0.00 0
ATOM 436 O 1 1 28.457 5.539 12.133 0.00 0.00 0
ATOM 437 H 1 1 29.489 4.390 11.182 0.00 0.00 0
ATOM 438 H 1 1 29.161 7.131 12.587 0.00 0.00 0
ATOM 439 O 1 1 22.495 5.966 17.324 0.00 0.00 0
ATOM 440 H 1 1 24.377 5.379 17.393 0.00 0.00 0
ATOM 441 H 1 1 21.906 5.491 18.857 0.00 0.00 0
ATOM 442 O 1 1 28.128 3.304 22.287 0.00 0.00 0
ATOM 443 H 1 1 28.123 2.999 20.491 0.00 0.00 0
ATOM 444 H 1 1 26.533 3.355 22.876 0.00 0.00 0
ATOM 445 O 1 1 28.378 10.455 27.266 0.00 0.00 0
ATOM 446 H 1 1 30.019 10.292 28.051 0.00 0.00 0
ATOM 447 H 1 1 28.635 10.039 25.463 0.00 0.00 0
ATOM 448 O 1 1 27.031 8.353 34.806 0.00 0.00 0
ATOM 449 H 1 1 26.116 9.984 34.571 0.00 0.00 0
ATOM 450 H 1 1 28.685 8.951 34.739 0.00 0.00 0
ATOM 451 O 1 1 24.951 8.160 4.454 0.00 0.00 0
ATOM 452 H 1 1 25.930 9.616 5.160 0.00 0.00 0
ATOM 453 H 1 1 25.947 7.994 2.724 0.00 0.00 0
ATOM 454 O 1 1 26.937 12.436 6.869 0.00 0.00 0
ATOM 455 H 1 1 25.492 13.284 6.708 0.00 0.00 0
ATOM 456 H 1 1 27.689 13.332 8.266 0.00 0.00 0
ATOM 457 O 1 1 23.365 11.214 16.933 0.00 0.00 0
ATOM 458 H 1 1 22.247 9.744 16.789 0.00 0.00 0
ATOM 459 H 1 1 23.264 12.035 18.539 0.00 0.00 0
ATOM 460 O 1 1 28.321 8.759 22.158 0.00 0.00 0
ATOM 461 H 1 1 27.662 6.895 22.482 0.00 0.00 0
ATOM 462 H 1 1 26.971 9.710 21.902 0.00 0.00 0
ATOM 463 O 1 1 27.071 6.109 29.555 0.00 0.00 0
ATOM 464 H 1 1 27.591 7.663 28.857 0.00 0.00 0
ATOM 465 H 1 1 27.304 6.320 31.261 0.00 0.00 0
ATOM 466 O 1 1 22.474 11.704 34.640 0.00 0.00 0
ATOM 467 H 1 1 22.752 13.304 35.584 0.00 0.00 0
ATOM 468 H 1 1 22.840 12.090 33.030 0.00 0.00 0
ATOM 469 O 1 1 21.656 14.971 5.615 0.00 0.00 0
ATOM 470 H 1 1 21.690 15.860 3.977 0.00 0.00 0
ATOM 471 H 1 1 19.964 14.225 5.774 0.00 0.00 0
ATOM 472 O 1 1 28.539 21.492 9.820 0.00 0.00 0
ATOM 473 H 1 1 27.288 22.181 8.688 0.00 0.00 0
ATOM 474 H 1 1 28.065 22.420 11.602 0.00 0.00 0
ATOM 475 O 1 1 28.364 16.020 11.109 0.00 0.00 0
ATOM 476 H 1 1 30.033 16.649 12.089 0.00 0.00 0
ATOM 477 H 1 1 28.456 17.440 10.082 0.00 0.00 0
ATOM 478 O 1 1 0.054 13.686 18.103 0.00 0.00 0
ATOM 479 H 1 1 -1.714 12.928 18.841 0.00 0.00 0
ATOM 480 H 1 1 1.008 12.429 17.383 0.00 0.00 0
ATOM 481 O 1 1 24.636 12.894 29.957 0.00 0.00 0
ATOM 482 H 1 1 25.906 13.914 31.183 0.00 0.00 0
ATOM 483 H 1 1 25.641 11.609 29.162 0.00 0.00 0
ATOM 484 O 1 1 21.548 17.250 0.749 0.00 0.00 0
ATOM 485 H 1 1 21.843 19.026 0.905 0.00 0.00 0
ATOM 486 H 1 1 20.385 16.716 -0.697 0.00 0.00 0
ATOM 487 O 1 1 26.095 27.274 4.520 0.00 0.00 0
ATOM 488 H 1 1 27.889 26.458 4.505 0.00 0.00 0
ATOM 489 H 1 1 25.648 26.970 6.165 0.00 0.00 0
ATOM 490 O 1 1 23.610 22.515 8.008 0.00 0.00 0
ATOM 491 H 1 1 22.653 21.187 8.739 0.00 0.00 0
ATOM 492 H 1 1 22.286 24.095 8.444 0.00 0.00 0
ATOM 493 O 1 1 27.355 18.929 18.180 0.00 0.00 0
ATOM 494 H 1 1 27.200 20.349 17.155 0.00 0.00 0
ATOM 495 H 1 1 25.579 18.322 18.770 0.00 0.00 0
ATOM 496 O 1 1 26.765 23.633 14.444 0.00 0.00 0
ATOM 497 H 1 1 27.441 25.298 13.651 0.00 0.00 0
ATOM 498 H 1 1 25.086 24.256 14.749 0.00 0.00 0
ATOM 499 O 1 1 31.478 20.769 20.986 0.00 0.00 0
ATOM 500 H 1 1 30.440 22.509 21.135 0.00 0.00 0
ATOM 501 H 1 1 30.567 19.656 20.043 0.00 0.00 0
ATOM 502 O 1 1 24.812 20.412 32.668 0.00 0.00 0
ATOM 503 H 1 1 26.242 21.478 31.874 0.00 0.00 0
ATOM 504 H 1 1 25.787 19.023 33.158 0.00 0.00 0
ATOM 505 O 1 1 22.105 29.076 0.928 0.00 0.00 0
ATOM 506 H 1 1 23.296 27.923 1.739 0.00 0.00 0
ATOM 507 H 1 1 22.623 30.994 0.882 0.00 0.00 0
ATOM 508 O 1 1 29.572 31.256 8.626 0.00 0.00 0
ATOM 509 H 1 1 30.795 30.203 7.736 0.00 0.00 0
ATOM 510 H 1 1 28.277 31.519 7.260 0.00 0.00 0
ATOM 511 O 1 1 31.817 34.843 18.283 0.00 0.00 0
ATOM 512 H 1 1 32.438 34.389 16.474 0.00 0.00 0
ATOM 513 H 1 1 32.743 36.422 18.341 0.00 0.00 0
ATOM 514 O 1 1 27.915 25.601 19.033 0.00 0.00 0
ATOM 515 H 1 1 29.358 26.561 19.190 0.00 0.00 0
ATOM 516 H 1 1 28.148 24.429 17.530 0.00 0.00 0
ATOM 517 O 1 1 24.548 24.654 24.025 0.00 0.00 0
ATOM 518 H 1 1 25.528 25.635 22.824 0.00 0.00 0
ATOM 519 H 1 1 25.300 25.200 25.645 0.00 0.00 0
ATOM 520 O 1 1 28.540 22.922 30.370 0.00 0.00 0
ATOM 521 H 1 1 27.414 24.096 29.781 0.00 0.00 0
ATOM 522 H 1 1 29.674 23.914 31.873 0.00 0.00 0
ATOM 523 O 1 1 24.969 33.623 1.014 0.00 0.00 0
ATOM 524 H 1 1 26.521 33.058 1.518 0.00 0.00 0
ATOM 525 H 1 1 24.990 34.322 -0.683 0.00 0.00 0
ATOM 526 O 1 1 23.075 32.171 11.324 0.00 0.00 0
ATOM 527 H 1 1 23.316 32.775 13.097 0.00 0.00 0
ATOM 528 H 1 1 24.460 33.203 10.662 0.00 0.00 0
ATOM 529 O 1 1 27.497 2.736 17.224 0.00 0.00 0
ATOM 530 H 1 1 28.397 3.415 15.715 0.00 0.00 0
ATOM 531 H 1 1 28.234 1.233 17.412 0.00 0.00 0
ATOM 532 O 1 1 26.369 33.060 22.077 0.00 0.00 0
ATOM 533 H 1 1 26.170 34.746 22.264 0.00 0.00 0
ATOM 534 H 1 1 27.592 32.404 23.321 0.00 0.00 0
ATOM 535 O 1 1 30.221 30.950 25.843 0.00 0.00 0
ATOM 536 H 1 1 30.305 29.038 26.208 0.00 0.00 0
ATOM 537 H 1 1 30.363 31.979 27.414 0.00 0.00 0
ATOM 538 O 1 1 24.973 26.732 28.607 0.00 0.00 0
ATOM 539 H 1 1 25.385 28.369 29.248 0.00 0.00 0
ATOM 540 H 1 1 23.330 26.597 29.234 0.00 0.00 0
ATOM 541 O 1 1 32.165 4.857 2.258 0.00 0.00 0
ATOM 542 H 1 1 32.417 6.195 1.157 0.00 0.00 0
ATOM 543 H 1 1 32.615 3.727 1.112 0.00 0.00 0
ATOM 544 O 1 1 28.067 3.533 5.217 0.00 0.00 0
ATOM 545 H 1 1 26.960 4.447 4.158 0.00 0.00 0
ATOM 546 H 1 1 29.875 3.863 4.448 0.00 0.00 0
ATOM 547 O 1 1 33.279 2.782 13.028 0.00 0.00 0
ATOM 548 H 1 1 33.708 3.955 11.817 0.00 0.00 0
ATOM 549 H 1 1 33.656 3.545 14.631 0.00 0.00 0
ATOM 550 O 1 1 34.278 4.944 17.492 0.00 0.00 0
ATOM 551 H 1 1 33.438 6.563 17.876 0.00 0.00 0
ATOM 552 H 1 1 34.906 4.452 18.995 0.00 0.00 0
ATOM 553 O 1 1 32.363 1.908 26.092 0.00 0.00 0
ATOM 554 H 1 1 31.941 1.683 24.268 0.00 0.00 0
ATOM 555 H 1 1 33.850 1.390 26.904 0.00 0.00 0
ATOM 556 O 1 1 27.982 0.418 28.241 0.00 0.00 0
ATOM 557 H 1 1 27.516 2.080 28.309 0.00 0.00 0
ATOM 558 H 1 1 29.593 0.176 27.299 0.00 0.00 0
ATOM 559 O 1 1 28.845 14.672 2.724 0.00 0.00 0
ATOM 560 H 1 1 27.963 13.930 4.139 0.00 0.00 0
ATOM 561 H 1 1 30.386 15.714 3.379 0.00 0.00 0
ATOM 562 O 1 1 28.083 10.618 14.298 0.00 0.00 0
ATOM 563 H 1 1 28.623 12.160 13.293 0.00 0.00 0
ATOM 564 H 1 1 26.486 11.015 15.379 0.00 0.00 0
ATOM 565 O 1 1 33.867 10.545 13.306 0.00 0.00 0
ATOM 566 H 1 1 35.165 9.612 13.810 0.00 0.00 0
ATOM 567 H 1 1 33.615 10.270 11.513 0.00 0.00 0
ATOM 568 O 1 1 31.790 9.696 18.223 0.00 0.00 0
ATOM 569 H 1 1 30.484 9.334 19.421 0.00 0.00 0
ATOM 570 H 1 1 30.834 10.096 16.929 0.00 0.00 0
ATOM 571 O 1 1 30.141 15.006 21.532 0.00 0.00 0
ATOM 572 H 1 1 28.565 15.594 22.099 0.00 0.00 0
ATOM 573 H 1 1 30.942 14.253 23.077 0.00 0.00 0
ATOM 574 O 1 1 32.798 10.732 30.680 0.00 0.00 0
ATOM 575 H 1 1 34.073 9.528 30.799 0.00 0.00 0
ATOM 576 H 1 1 32.991 11.512 28.983 0.00 0.00 0
ATOM 577 O 1 1 33.652 16.265 5.086 0.00 0.00 0
ATOM 578 H 1 1 35.399 16.239 4.730 0.00 0.00 0
ATOM 579 H 1 1 33.503 17.939 5.631 0.00 0.00 0
ATOM 580 O 1 1 31.947 10.799 7.943 0.00 0.00 0
ATOM 581 H 1 1 29.894 10.549 7.619 0.00 0.00 0
ATOM 582 H 1 1 32.271 12.414 7.075 0.00 0.00 0
ATOM 583 O 1 1 0.329 15.516 11.746 0.00 0.00 0
ATOM 584 H 1 1 -0.446 14.249 12.939 0.00 0.00 0
ATOM 585 H 1 1 -0.685 17.018 11.935 0.00 0.00 0
ATOM 586 O 1 1 4.262 19.165 14.308 0.00 0.00 0
ATOM 587 H 1 1 3.579 17.691 14.920 0.00 0.00 0
ATOM 588 H 1 1 5.723 19.183 15.204 0.00 0.00 0
ATOM 589 O 1 1 32.995 13.546 25.948 0.00 0.00 0
ATOM 590 H 1 1 32.167 15.060 26.787 0.00 0.00 0
ATOM 591 H 1 1 34.425 13.800 25.007 0.00 0.00 0
ATOM 592 O 1 1 1.773 13.524 34.037 0.00 0.00 0
ATOM 593 H 1 1 0.227 14.409 33.446 0.00 0.00 0
ATOM 594 H 1 1 2.167 14.670 35.511 0.00 0.00 0
ATOM 595 O 1 1 33.029 20.529 7.247 0.00 0.00 0
ATOM 596 H 1 1 34.388 21.414 8.003 0.00 0.00 0
ATOM 597 H 1 1 31.451 20.831 8.182 0.00 0.00 0
ATOM 598 O 1 1 2.037 24.250 10.251 0.00 0.00 0
ATOM 599 H 1 1 3.743 25.008 9.876 0.00 0.00 0
ATOM 600 H 1 1 1.894 25.043 11.903 0.00 0.00 0
ATOM 601 O 1 1 32.753 19.259 13.976 0.00 0.00 0
ATOM 602 H 1 1 32.792 20.886 13.792 0.00 0.00 0
ATOM 603 H 1 1 34.334 18.799 14.976 0.00 0.00 0
ATOM 604 O 1 1 0.396 18.673 18.699 0.00 0.00 0
ATOM 605 H 1 1 -1.211 18.950 19.127 0.00 0.00 0
ATOM 606 H 1 1 0.469 16.977 18.436 0.00 0.00 0
ATOM 607 O 1 1 30.855 18.370 27.959 0.00 0.00 0
ATOM 608 H 1 1 29.759 19.681 28.690 0.00 0.00 0
ATOM 609 H 1 1 32.103 19.477 26.763 0.00 0.00 0
ATOM 610 O 1 1 27.723 15.992 33.091 0.00 0.00 0
ATOM 611 H 1 1 29.390 16.423 32.192 0.00 0.00 0
ATOM 612 H 1 1 27.801 15.859 34.804 0.00 0.00 0
ATOM 613 O 1 1 31.068 27.895 3.348 0.00 0.00 0
ATOM 614 H 1 1 32.517 27.825 4.610 0.00 0.00 0
ATOM 615 H 1 1 31.529 29.459 2.324 0.00 0.00 0
ATOM 616 O 1 1 35.039 28.008 6.663 0.00 0.00 0
ATOM 617 H 1 1 35.966 26.934 7.683 0.00 0.00 0
ATOM 618 H 1 1 36.055 28.336 5.336 0.00 0.00 0
ATOM 619 O 1 1 29.356 28.196 13.025 0.00 0.00 0
ATOM 620 H 1 1 29.210 29.335 14.589 0.00 0.00 0
ATOM 621 H 1 1 28.874 29.629 11.867 0.00 0.00 0
ATOM 622 O 1 1 32.386 28.434 18.961 0.00 0.00 0
ATOM 623 H 1 1 33.368 28.574 20.411 0.00 0.00 0
ATOM 624 H 1 1 33.410 27.406 17.949 0.00 0.00 0
ATOM 625 O 1 1 30.898 25.390 25.799 0.00 0.00 0
ATOM 626 H 1 1 32.369 25.913 24.580 0.00 0.00 0
ATOM 627 H 1 1 31.317 24.075 27.029 0.00 0.00 0
ATOM 628 O 1 1 32.259 25.611 33.104 0.00 0.00 0
ATOM 629 H 1 1 32.238 25.736 34.806 0.00 0.00 0
ATOM 630 H 1 1 33.920 25.042 32.775 0.00 0.00 0
ATOM 631 O 1 1 30.290 32.645 1.341 0.00 0.00 0
ATOM 632 H 1 1 29.949 32.793 -0.430 0.00 0.00 0
ATOM 633 H 1 1 31.762 33.340 1.847 0.00 0.00 0
ATOM 634 O 1 1 25.536 34.235 6.469 0.00 0.00 0
ATOM 635 H 1 1 25.716 36.059 6.651 0.00 0.00 0
ATOM 636 H 1 1 25.283 33.866 4.895 0.00 0.00 0
ATOM 637 O 1 1 31.674 33.161 13.106 0.00 0.00 0
ATOM 638 H 1 1 31.793 34.863 13.281 0.00 0.00 0
ATOM 639 H 1 1 30.425 32.928 11.783 0.00 0.00 0
ATOM 640 O 1 1 33.844 32.668 22.296 0.00 0.00 0
ATOM 641 H 1 1 32.750 32.234 23.524 0.00 0.00 0
ATOM 642 H 1 1 32.917 32.875 20.736 0.00 0.00 0
ATOM 643 O 1 1 31.603 30.542 30.805 0.00 0.00 0
ATOM 644 H 1 1 33.451 30.804 30.468 0.00 0.00 0
ATOM 645 H 1 1 31.575 28.816 31.756 0.00 0.00 0
ATOM 646 O 1 1 26.295 31.235 30.599 0.00 0.00 0
ATOM 647 H 1 1 27.834 30.515 30.607 0.00 0.00 0
ATOM 648 H 1 1 26.362 32.920 29.856 0.00 0.00 0
END

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
units electron
atom_style full
#pair_style lj/cut/coul/long 17.01
pair_style lj/cut/tip4p/long 1 2 1 1 0.278072379 17.007
#bond_style harmonic
bond_style class2
angle_style harmonic
#kspace_style pppm 0.0001
kspace_style pppm/tip4p 0.0001
read_data data.water
pair_coeff * * 0 0
pair_coeff 1 1 0.000295147 5.96946
neighbor 2.0 bin
timestep 0.00025
#velocity all create 298.0 2345187
#thermo_style multi
#thermo 1
#fix 1 all nvt temp 298.0 298.0 30.0 tchain 1
#fix 1 all nve
fix 1 all ipi piglet_4 32343 unix
#dump 1 all xyz 25 dump.xyz
run 100000000

View File

@ -0,0 +1,40 @@
<simulation>
<initialize nbeads='4'>
<file mode='pdb'> water_298K.pdb </file>
<velocities mode="thermal" units='kelvin'> 298 </velocities>
</initialize>
<output prefix='gle_lammps'>
<properties stride='1' filename='out'> [ step, time{picosecond}, conserved{kelvin}, temperature{kelvin}, kinetic_cv{kelvin}, potential{kelvin}, pressure_cv{megapascal}] </properties>
<trajectory filename='pos' stride='20'> positions </trajectory>
</output>
<total_steps>500000</total_steps>
<prng><seed>32343</seed></prng>
<forces>
<socket mode='unix'>
<address>piglet_4</address>
</socket>
</forces>
<ensemble mode='nvt'>
<thermostat mode='nm_gle'>
<A shape='(4,9,9)'>
[
1.300513766690e-2, 9.078220950722e-6, 8.180522706851e-6, 1.196620464216e-5, 1.108609196233e-4, -8.941338246404e-4, 7.817382329484e-3, -1.206049888192e-2, -5.215913547478e-2, -9.756343549369e-6, 2.131200614277e-7, 2.972243541454e-6, -4.459298032276e-6, 2.177011229810e-7, 4.960251269751e-7, -2.083064995647e-6, -7.004617074013e-6, 2.299410255689e-5, -1.851243089560e-6, -2.972243541454e-6, 1.956991859501e-6, 1.742357040415e-6, -2.082265548357e-6, -1.760771137012e-6, -3.733162998255e-6, -3.711884630223e-5, -3.625483838477e-5, 1.492481502899e-5, 4.459298032276e-6, -1.742357040415e-6, 5.092476869103e-6, 2.033910859306e-6, 5.856365217540e-7, -3.020170664006e-6, 1.868034354962e-5, -5.049113665348e-6, 1.059383195368e-4, -2.177011229810e-7, 2.082265548357e-6, -2.033910859306e-6, 5.467813757620e-5, -6.684243951800e-6, -9.770331146786e-7, -2.159991642805e-4, 4.667176340213e-4, -7.611448585233e-4, -4.960251269751e-7, 1.760771137012e-6, -5.856365217540e-7, 6.684243951800e-6, 6.616597356640e-4, -1.637891086976e-6, -2.056652206438e-4, 2.960975881160e-4, 7.659946833472e-3, 2.083064995647e-6, 3.733162998255e-6, 3.020170664006e-6, 9.770331146786e-7, 1.637891086976e-6, 6.390977118535e-3, -6.246090363901e-5, 5.054994461623e-4, -1.078245092236e-2, 7.004617074013e-6, 3.711884630223e-5, -1.868034354962e-5, 2.159991642805e-4, 2.056652206438e-4, 6.246090363901e-5, 1.730397061203e-1, 1.004651317366e-4, -5.467410217589e-2, -2.299410255689e-5, 3.625483838477e-5, 5.049113665348e-6, -4.667176340213e-4, -2.960975881160e-4, -5.054994461623e-4, -1.004651317366e-4, 1.795223909984e+0,
7.566936336534e-6, 6.338019063098e-3, 0.000000000000e+0, 1.060374810427e-2, 0.000000000000e+0, 4.208955410918e-3, 0.000000000000e+0, 8.082827448553e-5, 0.000000000000e+0, -6.338019063098e-3, 7.358306814484e-2, 2.945862869452e-2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -2.945862869452e-2, 1.924557597624e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.060374810427e-2, 0.000000000000e+0, 0.000000000000e+0, 1.487651276141e-2, 5.463360757376e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -5.463360757376e-3, 1.924557597624e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.208955410918e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 4.130761028108e-2, 1.462832567462e-2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.462832567462e-2, 1.924557597624e-14, 0.000000000000e+0, 0.000000000000e+0, -8.082827448553e-5, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 3.105282519359e-3, 1.090072581774e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.090072581774e-3, 1.924557597624e-14,
7.566936336534e-6, 6.338019063098e-3, 0.000000000000e+0, 1.060374810427e-2, 0.000000000000e+0, 4.208955410918e-3, 0.000000000000e+0, 8.082827448553e-5, 0.000000000000e+0, -6.338019063098e-3, 7.358306814484e-2, 2.945862869452e-2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -2.945862869452e-2, 1.924557597624e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.060374810427e-2, 0.000000000000e+0, 0.000000000000e+0, 1.487651276141e-2, 5.463360757376e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -5.463360757376e-3, 1.924557597624e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.208955410918e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 4.130761028108e-2, 1.462832567462e-2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.462832567462e-2, 1.924557597624e-14, 0.000000000000e+0, 0.000000000000e+0, -8.082827448553e-5, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 3.105282519359e-3, 1.090072581774e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.090072581774e-3, 1.924557597624e-14,
7.566936336534e-6, 6.338019063098e-3, 0.000000000000e+0, 1.060374810427e-2, 0.000000000000e+0, 4.208955410918e-3, 0.000000000000e+0, 8.082827448553e-5, 0.000000000000e+0, -6.338019063098e-3, 7.358306814484e-2, 2.945862869452e-2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -2.945862869452e-2, 1.924557597624e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.060374810427e-2, 0.000000000000e+0, 0.000000000000e+0, 1.487651276141e-2, 5.463360757376e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -5.463360757376e-3, 1.924557597624e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.208955410918e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 4.130761028108e-2, 1.462832567462e-2, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.462832567462e-2, 1.924557597624e-14, 0.000000000000e+0, 0.000000000000e+0, -8.082827448553e-5, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 3.105282519359e-3, 1.090072581774e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.090072581774e-3, 1.924557597624e-14
]
</A>
<C shape='(4,9,9)' units='kelvin'>
[
1.192000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 1.192000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 1.192000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 1.192000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 1.192000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 1.192000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 1.192000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 1.192000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 1.192000000000e+3,
1.974745232194e+3, -2.047141324480e+2, -1.465776544626e+3, 5.611692742600e+2, 2.600211572322e+2, -1.099491161786e+3, -3.093580205740e+3, -3.861032202200e+2, -1.067404178368e+3, -2.047141324480e+2, 1.087575551624e+4, 6.721323835060e-9, 2.021884782970e+2, 1.075739781622e+2, -7.437996121940e+1, -1.600458223938e+1, -1.059816853114e+1, 2.076593606756e+0, -1.465776544626e+3, 6.719263290220e-9, 1.056039393790e+4, -5.800425818660e+2, -1.752619163876e+2, 3.223014416760e+1, -6.625413068480e+2, -5.611883191420e+1, -2.352310083702e+2, 5.611692742600e+2, 2.021884782970e+2, -5.800425818660e+2, 8.662918193440e+2, 3.799597913860e-9, 1.716248402446e+2, -1.504572868414e+3, -2.864411056124e+2, -4.191189710000e+1, 2.600211572322e+2, 1.075739781622e+2, -1.752619163876e+2, 3.799720946140e-9, 1.370962657638e+3, 5.619251682460e+2, -1.447856743746e+3, 2.100592360296e+2, -2.014734930954e+3, -1.099491161786e+3, -7.437996121940e+1, 3.223014416760e+1, 1.716248402446e+2, 5.619251682460e+2, 2.319917706904e+4, 2.896113582292e-8, -1.931536922152e+1, 4.385447956380e+0, -3.093580205740e+3, -1.600458223938e+1, -6.625413068480e+2, -1.504572868414e+3, -1.447856743746e+3, 2.896343709812e-8, 2.230907239094e+4, -5.885090774480e+1, -3.209433686600e+2, -3.861032202200e+2, -1.059816853114e+1, -5.611883191420e+1, -2.864411056124e+2, 2.100592360296e+2, -1.931536922152e+1, -5.885090774480e+1, 7.065427000840e+4, 1.240853151798e-6, -1.067404178368e+3, 2.076593606756e+0, -2.352310083702e+2, -4.191189710000e+1, -2.014734930954e+3, 4.385447956380e+0, -3.209433686600e+2, 1.240861621554e-6, 7.057512257920e+4,
1.974745232194e+3, -2.047141324480e+2, -1.465776544626e+3, 5.611692742600e+2, 2.600211572322e+2, -1.099491161786e+3, -3.093580205740e+3, -3.861032202200e+2, -1.067404178368e+3, -2.047141324480e+2, 1.087575551624e+4, 6.721323835060e-9, 2.021884782970e+2, 1.075739781622e+2, -7.437996121940e+1, -1.600458223938e+1, -1.059816853114e+1, 2.076593606756e+0, -1.465776544626e+3, 6.719263290220e-9, 1.056039393790e+4, -5.800425818660e+2, -1.752619163876e+2, 3.223014416760e+1, -6.625413068480e+2, -5.611883191420e+1, -2.352310083702e+2, 5.611692742600e+2, 2.021884782970e+2, -5.800425818660e+2, 8.662918193440e+2, 3.799597913860e-9, 1.716248402446e+2, -1.504572868414e+3, -2.864411056124e+2, -4.191189710000e+1, 2.600211572322e+2, 1.075739781622e+2, -1.752619163876e+2, 3.799720946140e-9, 1.370962657638e+3, 5.619251682460e+2, -1.447856743746e+3, 2.100592360296e+2, -2.014734930954e+3, -1.099491161786e+3, -7.437996121940e+1, 3.223014416760e+1, 1.716248402446e+2, 5.619251682460e+2, 2.319917706904e+4, 2.896113582292e-8, -1.931536922152e+1, 4.385447956380e+0, -3.093580205740e+3, -1.600458223938e+1, -6.625413068480e+2, -1.504572868414e+3, -1.447856743746e+3, 2.896343709812e-8, 2.230907239094e+4, -5.885090774480e+1, -3.209433686600e+2, -3.861032202200e+2, -1.059816853114e+1, -5.611883191420e+1, -2.864411056124e+2, 2.100592360296e+2, -1.931536922152e+1, -5.885090774480e+1, 7.065427000840e+4, 1.240853151798e-6, -1.067404178368e+3, 2.076593606756e+0, -2.352310083702e+2, -4.191189710000e+1, -2.014734930954e+3, 4.385447956380e+0, -3.209433686600e+2, 1.240861621554e-6, 7.057512257920e+4,
1.974745232194e+3, -2.047141324480e+2, -1.465776544626e+3, 5.611692742600e+2, 2.600211572322e+2, -1.099491161786e+3, -3.093580205740e+3, -3.861032202200e+2, -1.067404178368e+3, -2.047141324480e+2, 1.087575551624e+4, 6.721323835060e-9, 2.021884782970e+2, 1.075739781622e+2, -7.437996121940e+1, -1.600458223938e+1, -1.059816853114e+1, 2.076593606756e+0, -1.465776544626e+3, 6.719263290220e-9, 1.056039393790e+4, -5.800425818660e+2, -1.752619163876e+2, 3.223014416760e+1, -6.625413068480e+2, -5.611883191420e+1, -2.352310083702e+2, 5.611692742600e+2, 2.021884782970e+2, -5.800425818660e+2, 8.662918193440e+2, 3.799597913860e-9, 1.716248402446e+2, -1.504572868414e+3, -2.864411056124e+2, -4.191189710000e+1, 2.600211572322e+2, 1.075739781622e+2, -1.752619163876e+2, 3.799720946140e-9, 1.370962657638e+3, 5.619251682460e+2, -1.447856743746e+3, 2.100592360296e+2, -2.014734930954e+3, -1.099491161786e+3, -7.437996121940e+1, 3.223014416760e+1, 1.716248402446e+2, 5.619251682460e+2, 2.319917706904e+4, 2.896113582292e-8, -1.931536922152e+1, 4.385447956380e+0, -3.093580205740e+3, -1.600458223938e+1, -6.625413068480e+2, -1.504572868414e+3, -1.447856743746e+3, 2.896343709812e-8, 2.230907239094e+4, -5.885090774480e+1, -3.209433686600e+2, -3.861032202200e+2, -1.059816853114e+1, -5.611883191420e+1, -2.864411056124e+2, 2.100592360296e+2, -1.931536922152e+1, -5.885090774480e+1, 7.065427000840e+4, 1.240853151798e-6, -1.067404178368e+3, 2.076593606756e+0, -2.352310083702e+2, -4.191189710000e+1, -2.014734930954e+3, 4.385447956380e+0, -3.209433686600e+2, 1.240861621554e-6, 7.057512257920e+4
]
</C>
</thermostat>
<timestep units='femtosecond'> 0.1</timestep>
<temperature units='kelvin'>298</temperature>
</ensemble>
</simulation>

View File

@ -0,0 +1,650 @@
CRYST 35.233 35.233 35.233 90.00 90.00 90.00 P 1 1
ATOM 1 O 1 1 3.846 5.672 1.323 0.00 0.00 0
ATOM 2 H 1 1 2.979 7.054 0.857 0.00 0.00 0
ATOM 3 H 1 1 5.525 5.697 0.451 0.00 0.00 0
ATOM 4 O 1 1 34.557 34.341 3.078 0.00 0.00 0
ATOM 5 H 1 1 33.722 34.689 4.840 0.00 0.00 0
ATOM 6 H 1 1 36.029 33.220 3.711 0.00 0.00 0
ATOM 7 O 1 1 5.591 1.963 13.477 0.00 0.00 0
ATOM 8 H 1 1 7.265 1.864 13.851 0.00 0.00 0
ATOM 9 H 1 1 5.009 3.555 13.916 0.00 0.00 0
ATOM 10 O 1 1 1.060 2.061 21.718 0.00 0.00 0
ATOM 11 H 1 1 0.757 0.261 21.820 0.00 0.00 0
ATOM 12 H 1 1 0.213 3.013 23.047 0.00 0.00 0
ATOM 13 O 1 1 1.200 1.337 29.006 0.00 0.00 0
ATOM 14 H 1 1 0.818 1.884 30.732 0.00 0.00 0
ATOM 15 H 1 1 2.883 1.825 29.011 0.00 0.00 0
ATOM 16 O 1 1 1.331 1.386 34.306 0.00 0.00 0
ATOM 17 H 1 1 2.392 2.898 34.846 0.00 0.00 0
ATOM 18 H 1 1 0.814 0.532 35.836 0.00 0.00 0
ATOM 19 O 1 1 31.451 10.201 0.726 0.00 0.00 0
ATOM 20 H 1 1 32.282 10.877 -0.750 0.00 0.00 0
ATOM 21 H 1 1 30.920 11.594 1.677 0.00 0.00 0
ATOM 22 O 1 1 0.836 10.808 4.298 0.00 0.00 0
ATOM 23 H 1 1 0.305 10.643 2.793 0.00 0.00 0
ATOM 24 H 1 1 -0.356 10.334 5.524 0.00 0.00 0
ATOM 25 O 1 1 34.381 5.979 9.194 0.00 0.00 0
ATOM 26 H 1 1 33.616 7.673 8.857 0.00 0.00 0
ATOM 27 H 1 1 35.115 5.260 7.618 0.00 0.00 0
ATOM 28 O 1 1 33.212 6.480 24.278 0.00 0.00 0
ATOM 29 H 1 1 31.624 6.908 23.521 0.00 0.00 0
ATOM 30 H 1 1 32.544 4.990 24.982 0.00 0.00 0
ATOM 31 O 1 1 1.992 9.002 26.863 0.00 0.00 0
ATOM 32 H 1 1 1.856 10.175 25.579 0.00 0.00 0
ATOM 33 H 1 1 0.519 8.099 26.386 0.00 0.00 0
ATOM 34 O 1 1 2.054 8.660 32.515 0.00 0.00 0
ATOM 35 H 1 1 2.167 8.727 30.494 0.00 0.00 0
ATOM 36 H 1 1 2.374 10.513 33.038 0.00 0.00 0
ATOM 37 O 1 1 3.402 16.639 3.008 0.00 0.00 0
ATOM 38 H 1 1 4.127 15.872 4.446 0.00 0.00 0
ATOM 39 H 1 1 2.905 18.339 3.160 0.00 0.00 0
ATOM 40 O 1 1 4.222 15.444 8.072 0.00 0.00 0
ATOM 41 H 1 1 5.211 16.756 8.299 0.00 0.00 0
ATOM 42 H 1 1 2.560 15.492 8.860 0.00 0.00 0
ATOM 43 O 1 1 2.831 9.246 16.488 0.00 0.00 0
ATOM 44 H 1 1 2.869 8.023 18.050 0.00 0.00 0
ATOM 45 H 1 1 3.960 8.467 15.154 0.00 0.00 0
ATOM 46 O 1 1 5.563 6.003 20.907 0.00 0.00 0
ATOM 47 H 1 1 4.653 4.638 21.480 0.00 0.00 0
ATOM 48 H 1 1 6.405 6.208 22.529 0.00 0.00 0
ATOM 49 O 1 1 2.087 13.370 22.913 0.00 0.00 0
ATOM 50 H 1 1 2.832 14.804 23.422 0.00 0.00 0
ATOM 51 H 1 1 1.434 13.509 21.196 0.00 0.00 0
ATOM 52 O 1 1 3.369 17.886 25.109 0.00 0.00 0
ATOM 53 H 1 1 3.655 17.200 26.766 0.00 0.00 0
ATOM 54 H 1 1 4.772 18.977 24.500 0.00 0.00 0
ATOM 55 O 1 1 34.764 20.803 0.948 0.00 0.00 0
ATOM 56 H 1 1 35.210 21.267 2.816 0.00 0.00 0
ATOM 57 H 1 1 35.962 21.726 0.131 0.00 0.00 0
ATOM 58 O 1 1 2.836 24.178 15.229 0.00 0.00 0
ATOM 59 H 1 1 2.795 22.346 14.876 0.00 0.00 0
ATOM 60 H 1 1 2.414 24.115 17.130 0.00 0.00 0
ATOM 61 O 1 1 33.000 24.481 15.230 0.00 0.00 0
ATOM 62 H 1 1 34.640 24.804 15.013 0.00 0.00 0
ATOM 63 H 1 1 32.401 25.764 14.295 0.00 0.00 0
ATOM 64 O 1 1 0.404 26.779 23.400 0.00 0.00 0
ATOM 65 H 1 1 1.353 27.248 24.987 0.00 0.00 0
ATOM 66 H 1 1 1.546 28.050 22.317 0.00 0.00 0
ATOM 67 O 1 1 34.222 21.380 25.418 0.00 0.00 0
ATOM 68 H 1 1 35.669 20.151 25.317 0.00 0.00 0
ATOM 69 H 1 1 32.960 21.180 23.992 0.00 0.00 0
ATOM 70 O 1 1 33.259 17.438 32.480 0.00 0.00 0
ATOM 71 H 1 1 33.314 18.782 33.883 0.00 0.00 0
ATOM 72 H 1 1 32.743 18.181 30.871 0.00 0.00 0
ATOM 73 O 1 1 4.463 21.979 3.936 0.00 0.00 0
ATOM 74 H 1 1 5.856 23.084 3.400 0.00 0.00 0
ATOM 75 H 1 1 3.986 22.180 5.602 0.00 0.00 0
ATOM 76 O 1 1 6.258 25.851 8.520 0.00 0.00 0
ATOM 77 H 1 1 5.767 27.693 8.476 0.00 0.00 0
ATOM 78 H 1 1 7.202 25.506 10.186 0.00 0.00 0
ATOM 79 O 1 1 0.601 29.737 12.747 0.00 0.00 0
ATOM 80 H 1 1 -0.685 30.842 12.350 0.00 0.00 0
ATOM 81 H 1 1 1.336 30.716 14.031 0.00 0.00 0
ATOM 82 O 1 1 7.563 28.191 24.333 0.00 0.00 0
ATOM 83 H 1 1 9.201 28.828 24.684 0.00 0.00 0
ATOM 84 H 1 1 7.381 27.621 22.799 0.00 0.00 0
ATOM 85 O 1 1 3.653 27.109 27.772 0.00 0.00 0
ATOM 86 H 1 1 5.126 27.015 26.772 0.00 0.00 0
ATOM 87 H 1 1 3.031 28.756 27.698 0.00 0.00 0
ATOM 88 O 1 1 2.596 23.991 32.476 0.00 0.00 0
ATOM 89 H 1 1 2.879 24.791 30.859 0.00 0.00 0
ATOM 90 H 1 1 4.003 22.913 32.701 0.00 0.00 0
ATOM 91 O 1 1 3.083 31.317 3.644 0.00 0.00 0
ATOM 92 H 1 1 4.133 30.589 2.539 0.00 0.00 0
ATOM 93 H 1 1 4.218 32.173 5.037 0.00 0.00 0
ATOM 94 O 1 1 4.661 30.555 9.368 0.00 0.00 0
ATOM 95 H 1 1 3.184 29.843 10.132 0.00 0.00 0
ATOM 96 H 1 1 4.358 32.448 9.126 0.00 0.00 0
ATOM 97 O 1 1 3.465 32.537 15.778 0.00 0.00 0
ATOM 98 H 1 1 5.072 31.819 15.903 0.00 0.00 0
ATOM 99 H 1 1 4.055 34.257 15.284 0.00 0.00 0
ATOM 100 O 1 1 4.215 29.153 20.317 0.00 0.00 0
ATOM 101 H 1 1 3.658 30.176 18.842 0.00 0.00 0
ATOM 102 H 1 1 4.959 30.291 21.449 0.00 0.00 0
ATOM 103 O 1 1 1.126 31.333 28.768 0.00 0.00 0
ATOM 104 H 1 1 2.395 31.124 29.925 0.00 0.00 0
ATOM 105 H 1 1 0.768 33.092 28.898 0.00 0.00 0
ATOM 106 O 1 1 4.881 32.616 32.302 0.00 0.00 0
ATOM 107 H 1 1 6.588 32.911 31.725 0.00 0.00 0
ATOM 108 H 1 1 4.486 34.037 33.249 0.00 0.00 0
ATOM 109 O 1 1 8.962 5.556 0.151 0.00 0.00 0
ATOM 110 H 1 1 9.652 6.991 0.859 0.00 0.00 0
ATOM 111 H 1 1 9.173 4.477 1.645 0.00 0.00 0
ATOM 112 O 1 1 1.833 3.518 5.679 0.00 0.00 0
ATOM 113 H 1 1 2.889 2.731 6.788 0.00 0.00 0
ATOM 114 H 1 1 2.789 4.187 4.147 0.00 0.00 0
ATOM 115 O 1 1 10.510 34.726 13.073 0.00 0.00 0
ATOM 116 H 1 1 11.920 34.118 11.919 0.00 0.00 0
ATOM 117 H 1 1 11.295 34.968 14.741 0.00 0.00 0
ATOM 118 O 1 1 7.212 0.042 22.454 0.00 0.00 0
ATOM 119 H 1 1 6.924 0.470 24.172 0.00 0.00 0
ATOM 120 H 1 1 8.319 1.228 21.653 0.00 0.00 0
ATOM 121 O 1 1 6.365 2.010 27.544 0.00 0.00 0
ATOM 122 H 1 1 5.954 3.585 26.852 0.00 0.00 0
ATOM 123 H 1 1 7.758 2.549 28.696 0.00 0.00 0
ATOM 124 O 1 1 10.833 3.140 30.787 0.00 0.00 0
ATOM 125 H 1 1 12.697 2.975 30.867 0.00 0.00 0
ATOM 126 H 1 1 10.389 3.700 32.404 0.00 0.00 0
ATOM 127 O 1 1 8.684 9.342 3.912 0.00 0.00 0
ATOM 128 H 1 1 6.985 9.256 4.773 0.00 0.00 0
ATOM 129 H 1 1 8.684 10.809 3.011 0.00 0.00 0
ATOM 130 O 1 1 4.873 9.919 7.707 0.00 0.00 0
ATOM 131 H 1 1 3.698 9.771 6.194 0.00 0.00 0
ATOM 132 H 1 1 5.047 11.961 7.624 0.00 0.00 0
ATOM 133 O 1 1 10.031 5.018 9.699 0.00 0.00 0
ATOM 134 H 1 1 9.675 3.382 10.340 0.00 0.00 0
ATOM 135 H 1 1 9.132 5.987 10.825 0.00 0.00 0
ATOM 136 O 1 1 11.246 3.918 21.929 0.00 0.00 0
ATOM 137 H 1 1 12.614 2.770 22.341 0.00 0.00 0
ATOM 138 H 1 1 12.073 5.686 21.497 0.00 0.00 0
ATOM 139 O 1 1 6.825 7.164 25.708 0.00 0.00 0
ATOM 140 H 1 1 8.036 8.374 25.980 0.00 0.00 0
ATOM 141 H 1 1 5.206 7.900 25.891 0.00 0.00 0
ATOM 142 O 1 1 10.171 12.811 0.295 0.00 0.00 0
ATOM 143 H 1 1 10.033 12.818 -1.609 0.00 0.00 0
ATOM 144 H 1 1 9.880 14.492 0.480 0.00 0.00 0
ATOM 145 O 1 1 8.190 17.402 1.253 0.00 0.00 0
ATOM 146 H 1 1 9.472 18.531 1.253 0.00 0.00 0
ATOM 147 H 1 1 6.351 17.817 1.568 0.00 0.00 0
ATOM 148 O 1 1 11.233 16.188 8.299 0.00 0.00 0
ATOM 149 H 1 1 10.291 17.689 8.166 0.00 0.00 0
ATOM 150 H 1 1 12.768 17.123 8.733 0.00 0.00 0
ATOM 151 O 1 1 6.386 8.002 12.846 0.00 0.00 0
ATOM 152 H 1 1 7.701 8.896 13.655 0.00 0.00 0
ATOM 153 H 1 1 5.591 8.877 11.519 0.00 0.00 0
ATOM 154 O 1 1 8.184 10.419 18.848 0.00 0.00 0
ATOM 155 H 1 1 9.498 9.434 19.905 0.00 0.00 0
ATOM 156 H 1 1 6.882 9.027 18.948 0.00 0.00 0
ATOM 157 O 1 1 10.806 14.431 21.328 0.00 0.00 0
ATOM 158 H 1 1 9.177 13.531 20.670 0.00 0.00 0
ATOM 159 H 1 1 11.344 15.696 20.448 0.00 0.00 0
ATOM 160 O 1 1 9.237 13.928 30.341 0.00 0.00 0
ATOM 161 H 1 1 10.779 14.839 30.522 0.00 0.00 0
ATOM 162 H 1 1 9.965 13.192 28.899 0.00 0.00 0
ATOM 163 O 1 1 10.918 21.707 1.864 0.00 0.00 0
ATOM 164 H 1 1 10.280 23.449 2.279 0.00 0.00 0
ATOM 165 H 1 1 12.708 21.456 1.749 0.00 0.00 0
ATOM 166 O 1 1 9.353 16.125 13.927 0.00 0.00 0
ATOM 167 H 1 1 9.938 17.594 14.618 0.00 0.00 0
ATOM 168 H 1 1 9.518 16.360 12.244 0.00 0.00 0
ATOM 169 O 1 1 10.371 11.107 14.268 0.00 0.00 0
ATOM 170 H 1 1 9.644 10.406 15.859 0.00 0.00 0
ATOM 171 H 1 1 9.434 12.523 14.117 0.00 0.00 0
ATOM 172 O 1 1 3.351 22.769 20.196 0.00 0.00 0
ATOM 173 H 1 1 2.055 23.686 21.503 0.00 0.00 0
ATOM 174 H 1 1 2.452 21.401 19.413 0.00 0.00 0
ATOM 175 O 1 1 6.836 21.329 23.199 0.00 0.00 0
ATOM 176 H 1 1 8.249 20.848 22.320 0.00 0.00 0
ATOM 177 H 1 1 5.668 21.841 21.886 0.00 0.00 0
ATOM 178 O 1 1 4.604 15.649 30.043 0.00 0.00 0
ATOM 179 H 1 1 6.453 15.217 30.207 0.00 0.00 0
ATOM 180 H 1 1 3.822 14.762 31.562 0.00 0.00 0
ATOM 181 O 1 1 7.125 19.976 9.421 0.00 0.00 0
ATOM 182 H 1 1 5.918 20.453 10.730 0.00 0.00 0
ATOM 183 H 1 1 8.099 21.496 9.491 0.00 0.00 0
ATOM 184 O 1 1 9.063 25.912 13.186 0.00 0.00 0
ATOM 185 H 1 1 10.350 26.572 12.367 0.00 0.00 0
ATOM 186 H 1 1 9.680 24.367 13.697 0.00 0.00 0
ATOM 187 O 1 1 8.022 22.343 17.042 0.00 0.00 0
ATOM 188 H 1 1 9.144 23.367 18.074 0.00 0.00 0
ATOM 189 H 1 1 6.562 23.462 16.852 0.00 0.00 0
ATOM 190 O 1 1 10.762 26.285 19.963 0.00 0.00 0
ATOM 191 H 1 1 11.036 27.966 20.538 0.00 0.00 0
ATOM 192 H 1 1 11.078 25.401 21.456 0.00 0.00 0
ATOM 193 O 1 1 9.158 22.902 28.391 0.00 0.00 0
ATOM 194 H 1 1 8.219 23.528 27.085 0.00 0.00 0
ATOM 195 H 1 1 8.089 21.760 29.509 0.00 0.00 0
ATOM 196 O 1 1 6.219 20.158 31.921 0.00 0.00 0
ATOM 197 H 1 1 5.635 18.511 31.161 0.00 0.00 0
ATOM 198 H 1 1 7.530 19.624 33.071 0.00 0.00 0
ATOM 199 O 1 1 11.191 31.509 2.617 0.00 0.00 0
ATOM 200 H 1 1 10.460 32.214 4.108 0.00 0.00 0
ATOM 201 H 1 1 13.176 31.751 2.577 0.00 0.00 0
ATOM 202 O 1 1 4.748 0.055 8.605 0.00 0.00 0
ATOM 203 H 1 1 5.380 0.517 10.183 0.00 0.00 0
ATOM 204 H 1 1 6.050 -0.306 7.480 0.00 0.00 0
ATOM 205 O 1 1 8.695 30.809 15.731 0.00 0.00 0
ATOM 206 H 1 1 9.189 32.103 14.495 0.00 0.00 0
ATOM 207 H 1 1 8.447 29.069 14.868 0.00 0.00 0
ATOM 208 O 1 1 10.128 31.402 20.766 0.00 0.00 0
ATOM 209 H 1 1 9.456 30.905 19.155 0.00 0.00 0
ATOM 210 H 1 1 9.020 32.731 21.415 0.00 0.00 0
ATOM 211 O 1 1 12.238 30.162 25.837 0.00 0.00 0
ATOM 212 H 1 1 11.418 30.908 27.110 0.00 0.00 0
ATOM 213 H 1 1 12.396 31.331 24.678 0.00 0.00 0
ATOM 214 O 1 1 10.395 32.537 30.624 0.00 0.00 0
ATOM 215 H 1 1 11.042 34.339 30.751 0.00 0.00 0
ATOM 216 H 1 1 11.378 31.486 31.538 0.00 0.00 0
ATOM 217 O 1 1 10.438 3.626 5.087 0.00 0.00 0
ATOM 218 H 1 1 12.435 4.082 5.136 0.00 0.00 0
ATOM 219 H 1 1 9.822 4.284 6.681 0.00 0.00 0
ATOM 220 O 1 1 14.762 3.401 13.776 0.00 0.00 0
ATOM 221 H 1 1 16.518 3.824 13.376 0.00 0.00 0
ATOM 222 H 1 1 13.752 4.757 12.964 0.00 0.00 0
ATOM 223 O 1 1 12.382 1.012 17.643 0.00 0.00 0
ATOM 224 H 1 1 13.346 1.997 16.444 0.00 0.00 0
ATOM 225 H 1 1 11.931 2.133 18.998 0.00 0.00 0
ATOM 226 O 1 1 15.278 1.293 24.559 0.00 0.00 0
ATOM 227 H 1 1 16.071 0.946 26.365 0.00 0.00 0
ATOM 228 H 1 1 15.794 0.199 23.499 0.00 0.00 0
ATOM 229 O 1 1 22.226 31.627 24.712 0.00 0.00 0
ATOM 230 H 1 1 23.338 32.595 23.876 0.00 0.00 0
ATOM 231 H 1 1 22.161 30.053 24.132 0.00 0.00 0
ATOM 232 O 1 1 15.640 1.847 32.717 0.00 0.00 0
ATOM 233 H 1 1 17.488 2.473 31.874 0.00 0.00 0
ATOM 234 H 1 1 16.403 0.869 34.267 0.00 0.00 0
ATOM 235 O 1 1 14.858 10.199 2.754 0.00 0.00 0
ATOM 236 H 1 1 13.360 10.712 2.282 0.00 0.00 0
ATOM 237 H 1 1 14.560 9.316 4.559 0.00 0.00 0
ATOM 238 O 1 1 15.717 8.469 10.739 0.00 0.00 0
ATOM 239 H 1 1 17.323 9.581 10.875 0.00 0.00 0
ATOM 240 H 1 1 14.574 9.631 10.221 0.00 0.00 0
ATOM 241 O 1 1 15.248 10.398 16.525 0.00 0.00 0
ATOM 242 H 1 1 16.324 9.181 16.149 0.00 0.00 0
ATOM 243 H 1 1 14.172 10.488 15.098 0.00 0.00 0
ATOM 244 O 1 1 13.226 8.438 20.801 0.00 0.00 0
ATOM 245 H 1 1 14.043 8.996 19.295 0.00 0.00 0
ATOM 246 H 1 1 14.661 7.802 22.093 0.00 0.00 0
ATOM 247 O 1 1 10.173 10.961 25.875 0.00 0.00 0
ATOM 248 H 1 1 11.477 10.223 26.940 0.00 0.00 0
ATOM 249 H 1 1 11.269 10.738 24.343 0.00 0.00 0
ATOM 250 O 1 1 12.792 7.737 29.173 0.00 0.00 0
ATOM 251 H 1 1 12.199 6.038 29.475 0.00 0.00 0
ATOM 252 H 1 1 14.427 7.450 29.617 0.00 0.00 0
ATOM 253 O 1 1 15.180 19.498 3.578 0.00 0.00 0
ATOM 254 H 1 1 14.883 17.596 4.080 0.00 0.00 0
ATOM 255 H 1 1 16.754 19.579 2.626 0.00 0.00 0
ATOM 256 O 1 1 12.517 11.093 7.701 0.00 0.00 0
ATOM 257 H 1 1 12.224 12.778 7.555 0.00 0.00 0
ATOM 258 H 1 1 11.150 10.393 7.057 0.00 0.00 0
ATOM 259 O 1 1 16.266 16.271 10.758 0.00 0.00 0
ATOM 260 H 1 1 16.507 15.795 12.768 0.00 0.00 0
ATOM 261 H 1 1 17.725 16.977 10.292 0.00 0.00 0
ATOM 262 O 1 1 14.069 18.399 18.897 0.00 0.00 0
ATOM 263 H 1 1 15.513 17.523 18.155 0.00 0.00 0
ATOM 264 H 1 1 14.958 18.709 20.673 0.00 0.00 0
ATOM 265 O 1 1 14.099 15.480 25.510 0.00 0.00 0
ATOM 266 H 1 1 13.698 16.872 26.938 0.00 0.00 0
ATOM 267 H 1 1 12.567 15.379 24.444 0.00 0.00 0
ATOM 268 O 1 1 13.309 17.574 30.292 0.00 0.00 0
ATOM 269 H 1 1 14.937 16.934 30.810 0.00 0.00 0
ATOM 270 H 1 1 13.969 19.494 30.012 0.00 0.00 0
ATOM 271 O 1 1 18.371 23.257 0.925 0.00 0.00 0
ATOM 272 H 1 1 19.479 23.480 2.321 0.00 0.00 0
ATOM 273 H 1 1 19.087 24.325 -0.369 0.00 0.00 0
ATOM 274 O 1 1 12.100 21.730 11.355 0.00 0.00 0
ATOM 275 H 1 1 13.141 22.287 12.743 0.00 0.00 0
ATOM 276 H 1 1 13.467 22.236 10.244 0.00 0.00 0
ATOM 277 O 1 1 12.163 23.290 23.597 0.00 0.00 0
ATOM 278 H 1 1 11.324 22.736 24.949 0.00 0.00 0
ATOM 279 H 1 1 13.882 22.872 23.840 0.00 0.00 0
ATOM 280 O 1 1 20.173 26.761 22.628 0.00 0.00 0
ATOM 281 H 1 1 20.206 26.532 20.792 0.00 0.00 0
ATOM 282 H 1 1 21.556 25.742 23.389 0.00 0.00 0
ATOM 283 O 1 1 16.701 21.165 22.605 0.00 0.00 0
ATOM 284 H 1 1 18.028 20.686 23.848 0.00 0.00 0
ATOM 285 H 1 1 17.104 22.866 21.949 0.00 0.00 0
ATOM 286 O 1 1 11.391 26.461 33.705 0.00 0.00 0
ATOM 287 H 1 1 9.841 27.192 34.048 0.00 0.00 0
ATOM 288 H 1 1 11.776 25.540 35.243 0.00 0.00 0
ATOM 289 O 1 1 9.898 25.989 4.553 0.00 0.00 0
ATOM 290 H 1 1 8.902 26.131 6.039 0.00 0.00 0
ATOM 291 H 1 1 10.287 27.806 4.376 0.00 0.00 0
ATOM 292 O 1 1 14.308 26.960 10.877 0.00 0.00 0
ATOM 293 H 1 1 15.302 27.405 12.173 0.00 0.00 0
ATOM 294 H 1 1 15.463 26.151 9.633 0.00 0.00 0
ATOM 295 O 1 1 13.433 22.960 16.904 0.00 0.00 0
ATOM 296 H 1 1 13.409 24.131 18.132 0.00 0.00 0
ATOM 297 H 1 1 13.624 21.191 17.520 0.00 0.00 0
ATOM 298 O 1 1 16.409 26.768 26.875 0.00 0.00 0
ATOM 299 H 1 1 17.590 26.987 25.431 0.00 0.00 0
ATOM 300 H 1 1 14.751 27.703 26.230 0.00 0.00 0
ATOM 301 O 1 1 14.405 22.733 29.892 0.00 0.00 0
ATOM 302 H 1 1 15.423 23.079 28.494 0.00 0.00 0
ATOM 303 H 1 1 12.826 23.259 29.416 0.00 0.00 0
ATOM 304 O 1 1 6.905 29.408 0.749 0.00 0.00 0
ATOM 305 H 1 1 8.428 30.483 1.567 0.00 0.00 0
ATOM 306 H 1 1 6.353 30.814 -0.444 0.00 0.00 0
ATOM 307 O 1 1 9.189 34.159 6.509 0.00 0.00 0
ATOM 308 H 1 1 10.198 34.193 8.002 0.00 0.00 0
ATOM 309 H 1 1 9.890 35.692 5.785 0.00 0.00 0
ATOM 310 O 1 1 14.256 32.316 9.369 0.00 0.00 0
ATOM 311 H 1 1 15.733 32.867 9.486 0.00 0.00 0
ATOM 312 H 1 1 14.754 30.670 10.090 0.00 0.00 0
ATOM 313 O 1 1 14.714 30.841 16.516 0.00 0.00 0
ATOM 314 H 1 1 13.748 29.551 17.279 0.00 0.00 0
ATOM 315 H 1 1 13.218 31.933 16.614 0.00 0.00 0
ATOM 316 O 1 1 18.409 33.641 20.611 0.00 0.00 0
ATOM 317 H 1 1 19.601 32.274 21.115 0.00 0.00 0
ATOM 318 H 1 1 17.360 32.655 19.518 0.00 0.00 0
ATOM 319 O 1 1 16.062 28.638 32.207 0.00 0.00 0
ATOM 320 H 1 1 14.648 27.958 33.253 0.00 0.00 0
ATOM 321 H 1 1 15.752 28.014 30.522 0.00 0.00 0
ATOM 322 O 1 1 16.200 30.895 1.473 0.00 0.00 0
ATOM 323 H 1 1 16.626 29.968 -0.130 0.00 0.00 0
ATOM 324 H 1 1 17.167 29.833 2.927 0.00 0.00 0
ATOM 325 O 1 1 20.278 3.529 6.048 0.00 0.00 0
ATOM 326 H 1 1 20.977 3.611 4.575 0.00 0.00 0
ATOM 327 H 1 1 21.312 4.513 7.251 0.00 0.00 0
ATOM 328 O 1 1 23.079 5.778 10.408 0.00 0.00 0
ATOM 329 H 1 1 24.650 6.259 10.838 0.00 0.00 0
ATOM 330 H 1 1 22.342 7.609 10.178 0.00 0.00 0
ATOM 331 O 1 1 19.581 2.031 12.110 0.00 0.00 0
ATOM 332 H 1 1 19.039 1.082 10.440 0.00 0.00 0
ATOM 333 H 1 1 21.141 2.991 11.851 0.00 0.00 0
ATOM 334 O 1 1 22.005 3.223 23.178 0.00 0.00 0
ATOM 335 H 1 1 21.429 4.090 24.554 0.00 0.00 0
ATOM 336 H 1 1 20.654 1.791 22.711 0.00 0.00 0
ATOM 337 O 1 1 16.630 6.422 23.792 0.00 0.00 0
ATOM 338 H 1 1 16.219 4.804 24.406 0.00 0.00 0
ATOM 339 H 1 1 17.066 7.128 25.282 0.00 0.00 0
ATOM 340 O 1 1 21.676 5.564 28.158 0.00 0.00 0
ATOM 341 H 1 1 20.658 6.717 29.185 0.00 0.00 0
ATOM 342 H 1 1 23.413 5.828 28.996 0.00 0.00 0
ATOM 343 O 1 1 15.257 5.265 5.626 0.00 0.00 0
ATOM 344 H 1 1 16.914 4.519 5.490 0.00 0.00 0
ATOM 345 H 1 1 15.144 6.150 6.972 0.00 0.00 0
ATOM 346 O 1 1 20.137 11.082 10.437 0.00 0.00 0
ATOM 347 H 1 1 20.021 10.947 8.733 0.00 0.00 0
ATOM 348 H 1 1 21.025 12.555 10.853 0.00 0.00 0
ATOM 349 O 1 1 23.089 14.627 12.437 0.00 0.00 0
ATOM 350 H 1 1 24.716 15.254 12.736 0.00 0.00 0
ATOM 351 H 1 1 23.284 13.228 13.653 0.00 0.00 0
ATOM 352 O 1 1 24.083 12.649 22.566 0.00 0.00 0
ATOM 353 H 1 1 22.397 12.663 23.042 0.00 0.00 0
ATOM 354 H 1 1 24.901 13.851 23.565 0.00 0.00 0
ATOM 355 O 1 1 17.865 7.909 30.036 0.00 0.00 0
ATOM 356 H 1 1 17.509 8.045 31.982 0.00 0.00 0
ATOM 357 H 1 1 18.078 9.582 29.318 0.00 0.00 0
ATOM 358 O 1 1 18.824 8.486 0.104 0.00 0.00 0
ATOM 359 H 1 1 19.997 10.191 -0.057 0.00 0.00 0
ATOM 360 H 1 1 17.077 8.998 0.779 0.00 0.00 0
ATOM 361 O 1 1 20.122 9.143 5.343 0.00 0.00 0
ATOM 362 H 1 1 19.373 8.819 3.821 0.00 0.00 0
ATOM 363 H 1 1 21.998 8.776 5.128 0.00 0.00 0
ATOM 364 O 1 1 16.413 14.459 5.855 0.00 0.00 0
ATOM 365 H 1 1 15.536 13.007 5.239 0.00 0.00 0
ATOM 366 H 1 1 16.006 14.725 7.737 0.00 0.00 0
ATOM 367 O 1 1 17.561 15.066 15.654 0.00 0.00 0
ATOM 368 H 1 1 17.575 13.398 16.055 0.00 0.00 0
ATOM 369 H 1 1 18.978 15.828 16.400 0.00 0.00 0
ATOM 370 O 1 1 26.374 17.047 24.817 0.00 0.00 0
ATOM 371 H 1 1 27.983 17.098 25.632 0.00 0.00 0
ATOM 372 H 1 1 25.629 18.751 24.919 0.00 0.00 0
ATOM 373 O 1 1 19.784 12.960 28.706 0.00 0.00 0
ATOM 374 H 1 1 21.662 13.055 28.871 0.00 0.00 0
ATOM 375 H 1 1 19.545 14.070 27.143 0.00 0.00 0
ATOM 376 O 1 1 17.891 16.733 32.499 0.00 0.00 0
ATOM 377 H 1 1 18.327 15.240 31.277 0.00 0.00 0
ATOM 378 H 1 1 18.633 18.335 31.693 0.00 0.00 0
ATOM 379 O 1 1 23.733 23.024 1.663 0.00 0.00 0
ATOM 380 H 1 1 24.800 24.052 2.776 0.00 0.00 0
ATOM 381 H 1 1 24.693 22.618 0.198 0.00 0.00 0
ATOM 382 O 1 1 20.789 18.440 9.443 0.00 0.00 0
ATOM 383 H 1 1 20.766 17.257 7.881 0.00 0.00 0
ATOM 384 H 1 1 21.896 17.345 10.385 0.00 0.00 0
ATOM 385 O 1 1 21.574 17.493 17.838 0.00 0.00 0
ATOM 386 H 1 1 20.597 18.955 17.218 0.00 0.00 0
ATOM 387 H 1 1 22.538 16.874 16.251 0.00 0.00 0
ATOM 388 O 1 1 19.168 14.748 24.131 0.00 0.00 0
ATOM 389 H 1 1 19.711 16.390 23.712 0.00 0.00 0
ATOM 390 H 1 1 17.429 14.695 24.403 0.00 0.00 0
ATOM 391 O 1 1 22.149 20.198 24.977 0.00 0.00 0
ATOM 392 H 1 1 21.639 20.924 26.486 0.00 0.00 0
ATOM 393 H 1 1 22.656 21.657 24.411 0.00 0.00 0
ATOM 394 O 1 1 20.565 20.792 29.600 0.00 0.00 0
ATOM 395 H 1 1 22.264 20.409 30.214 0.00 0.00 0
ATOM 396 H 1 1 20.548 22.408 30.597 0.00 0.00 0
ATOM 397 O 1 1 20.802 26.547 9.615 0.00 0.00 0
ATOM 398 H 1 1 20.099 27.984 8.338 0.00 0.00 0
ATOM 399 H 1 1 21.277 27.539 11.325 0.00 0.00 0
ATOM 400 O 1 1 16.283 23.589 7.779 0.00 0.00 0
ATOM 401 H 1 1 16.093 21.973 6.712 0.00 0.00 0
ATOM 402 H 1 1 17.901 22.971 8.154 0.00 0.00 0
ATOM 403 O 1 1 18.469 29.798 13.568 0.00 0.00 0
ATOM 404 H 1 1 19.712 31.216 13.506 0.00 0.00 0
ATOM 405 H 1 1 16.872 30.343 14.396 0.00 0.00 0
ATOM 406 O 1 1 18.790 21.712 16.060 0.00 0.00 0
ATOM 407 H 1 1 19.878 23.090 16.485 0.00 0.00 0
ATOM 408 H 1 1 17.201 22.326 15.819 0.00 0.00 0
ATOM 409 O 1 1 21.747 26.084 16.349 0.00 0.00 0
ATOM 410 H 1 1 20.783 27.021 15.300 0.00 0.00 0
ATOM 411 H 1 1 22.705 27.328 17.206 0.00 0.00 0
ATOM 412 O 1 1 20.769 26.211 32.050 0.00 0.00 0
ATOM 413 H 1 1 21.488 27.404 33.328 0.00 0.00 0
ATOM 414 H 1 1 18.989 26.710 32.145 0.00 0.00 0
ATOM 415 O 1 1 19.820 29.181 5.559 0.00 0.00 0
ATOM 416 H 1 1 20.991 29.509 4.109 0.00 0.00 0
ATOM 417 H 1 1 19.431 31.018 6.221 0.00 0.00 0
ATOM 418 O 1 1 19.240 33.867 7.993 0.00 0.00 0
ATOM 419 H 1 1 19.107 35.039 6.604 0.00 0.00 0
ATOM 420 H 1 1 20.697 33.671 9.063 0.00 0.00 0
ATOM 421 O 1 1 22.511 34.976 15.793 0.00 0.00 0
ATOM 422 H 1 1 23.716 36.163 16.603 0.00 0.00 0
ATOM 423 H 1 1 21.699 36.150 14.467 0.00 0.00 0
ATOM 424 O 1 1 22.622 30.284 19.069 0.00 0.00 0
ATOM 425 H 1 1 22.049 31.351 17.725 0.00 0.00 0
ATOM 426 H 1 1 24.411 30.773 19.576 0.00 0.00 0
ATOM 427 O 1 1 18.639 33.611 28.369 0.00 0.00 0
ATOM 428 H 1 1 18.226 32.159 29.103 0.00 0.00 0
ATOM 429 H 1 1 19.906 33.008 27.158 0.00 0.00 0
ATOM 430 O 1 1 22.520 1.325 31.926 0.00 0.00 0
ATOM 431 H 1 1 22.803 2.668 30.796 0.00 0.00 0
ATOM 432 H 1 1 21.045 0.425 31.122 0.00 0.00 0
ATOM 433 O 1 1 21.754 3.789 1.159 0.00 0.00 0
ATOM 434 H 1 1 22.085 2.785 -0.180 0.00 0.00 0
ATOM 435 H 1 1 20.850 5.175 0.610 0.00 0.00 0
ATOM 436 O 1 1 28.457 5.539 12.133 0.00 0.00 0
ATOM 437 H 1 1 29.489 4.390 11.182 0.00 0.00 0
ATOM 438 H 1 1 29.161 7.131 12.587 0.00 0.00 0
ATOM 439 O 1 1 22.495 5.966 17.324 0.00 0.00 0
ATOM 440 H 1 1 24.377 5.379 17.393 0.00 0.00 0
ATOM 441 H 1 1 21.906 5.491 18.857 0.00 0.00 0
ATOM 442 O 1 1 28.128 3.304 22.287 0.00 0.00 0
ATOM 443 H 1 1 28.123 2.999 20.491 0.00 0.00 0
ATOM 444 H 1 1 26.533 3.355 22.876 0.00 0.00 0
ATOM 445 O 1 1 28.378 10.455 27.266 0.00 0.00 0
ATOM 446 H 1 1 30.019 10.292 28.051 0.00 0.00 0
ATOM 447 H 1 1 28.635 10.039 25.463 0.00 0.00 0
ATOM 448 O 1 1 27.031 8.353 34.806 0.00 0.00 0
ATOM 449 H 1 1 26.116 9.984 34.571 0.00 0.00 0
ATOM 450 H 1 1 28.685 8.951 34.739 0.00 0.00 0
ATOM 451 O 1 1 24.951 8.160 4.454 0.00 0.00 0
ATOM 452 H 1 1 25.930 9.616 5.160 0.00 0.00 0
ATOM 453 H 1 1 25.947 7.994 2.724 0.00 0.00 0
ATOM 454 O 1 1 26.937 12.436 6.869 0.00 0.00 0
ATOM 455 H 1 1 25.492 13.284 6.708 0.00 0.00 0
ATOM 456 H 1 1 27.689 13.332 8.266 0.00 0.00 0
ATOM 457 O 1 1 23.365 11.214 16.933 0.00 0.00 0
ATOM 458 H 1 1 22.247 9.744 16.789 0.00 0.00 0
ATOM 459 H 1 1 23.264 12.035 18.539 0.00 0.00 0
ATOM 460 O 1 1 28.321 8.759 22.158 0.00 0.00 0
ATOM 461 H 1 1 27.662 6.895 22.482 0.00 0.00 0
ATOM 462 H 1 1 26.971 9.710 21.902 0.00 0.00 0
ATOM 463 O 1 1 27.071 6.109 29.555 0.00 0.00 0
ATOM 464 H 1 1 27.591 7.663 28.857 0.00 0.00 0
ATOM 465 H 1 1 27.304 6.320 31.261 0.00 0.00 0
ATOM 466 O 1 1 22.474 11.704 34.640 0.00 0.00 0
ATOM 467 H 1 1 22.752 13.304 35.584 0.00 0.00 0
ATOM 468 H 1 1 22.840 12.090 33.030 0.00 0.00 0
ATOM 469 O 1 1 21.656 14.971 5.615 0.00 0.00 0
ATOM 470 H 1 1 21.690 15.860 3.977 0.00 0.00 0
ATOM 471 H 1 1 19.964 14.225 5.774 0.00 0.00 0
ATOM 472 O 1 1 28.539 21.492 9.820 0.00 0.00 0
ATOM 473 H 1 1 27.288 22.181 8.688 0.00 0.00 0
ATOM 474 H 1 1 28.065 22.420 11.602 0.00 0.00 0
ATOM 475 O 1 1 28.364 16.020 11.109 0.00 0.00 0
ATOM 476 H 1 1 30.033 16.649 12.089 0.00 0.00 0
ATOM 477 H 1 1 28.456 17.440 10.082 0.00 0.00 0
ATOM 478 O 1 1 0.054 13.686 18.103 0.00 0.00 0
ATOM 479 H 1 1 -1.714 12.928 18.841 0.00 0.00 0
ATOM 480 H 1 1 1.008 12.429 17.383 0.00 0.00 0
ATOM 481 O 1 1 24.636 12.894 29.957 0.00 0.00 0
ATOM 482 H 1 1 25.906 13.914 31.183 0.00 0.00 0
ATOM 483 H 1 1 25.641 11.609 29.162 0.00 0.00 0
ATOM 484 O 1 1 21.548 17.250 0.749 0.00 0.00 0
ATOM 485 H 1 1 21.843 19.026 0.905 0.00 0.00 0
ATOM 486 H 1 1 20.385 16.716 -0.697 0.00 0.00 0
ATOM 487 O 1 1 26.095 27.274 4.520 0.00 0.00 0
ATOM 488 H 1 1 27.889 26.458 4.505 0.00 0.00 0
ATOM 489 H 1 1 25.648 26.970 6.165 0.00 0.00 0
ATOM 490 O 1 1 23.610 22.515 8.008 0.00 0.00 0
ATOM 491 H 1 1 22.653 21.187 8.739 0.00 0.00 0
ATOM 492 H 1 1 22.286 24.095 8.444 0.00 0.00 0
ATOM 493 O 1 1 27.355 18.929 18.180 0.00 0.00 0
ATOM 494 H 1 1 27.200 20.349 17.155 0.00 0.00 0
ATOM 495 H 1 1 25.579 18.322 18.770 0.00 0.00 0
ATOM 496 O 1 1 26.765 23.633 14.444 0.00 0.00 0
ATOM 497 H 1 1 27.441 25.298 13.651 0.00 0.00 0
ATOM 498 H 1 1 25.086 24.256 14.749 0.00 0.00 0
ATOM 499 O 1 1 31.478 20.769 20.986 0.00 0.00 0
ATOM 500 H 1 1 30.440 22.509 21.135 0.00 0.00 0
ATOM 501 H 1 1 30.567 19.656 20.043 0.00 0.00 0
ATOM 502 O 1 1 24.812 20.412 32.668 0.00 0.00 0
ATOM 503 H 1 1 26.242 21.478 31.874 0.00 0.00 0
ATOM 504 H 1 1 25.787 19.023 33.158 0.00 0.00 0
ATOM 505 O 1 1 22.105 29.076 0.928 0.00 0.00 0
ATOM 506 H 1 1 23.296 27.923 1.739 0.00 0.00 0
ATOM 507 H 1 1 22.623 30.994 0.882 0.00 0.00 0
ATOM 508 O 1 1 29.572 31.256 8.626 0.00 0.00 0
ATOM 509 H 1 1 30.795 30.203 7.736 0.00 0.00 0
ATOM 510 H 1 1 28.277 31.519 7.260 0.00 0.00 0
ATOM 511 O 1 1 31.817 34.843 18.283 0.00 0.00 0
ATOM 512 H 1 1 32.438 34.389 16.474 0.00 0.00 0
ATOM 513 H 1 1 32.743 36.422 18.341 0.00 0.00 0
ATOM 514 O 1 1 27.915 25.601 19.033 0.00 0.00 0
ATOM 515 H 1 1 29.358 26.561 19.190 0.00 0.00 0
ATOM 516 H 1 1 28.148 24.429 17.530 0.00 0.00 0
ATOM 517 O 1 1 24.548 24.654 24.025 0.00 0.00 0
ATOM 518 H 1 1 25.528 25.635 22.824 0.00 0.00 0
ATOM 519 H 1 1 25.300 25.200 25.645 0.00 0.00 0
ATOM 520 O 1 1 28.540 22.922 30.370 0.00 0.00 0
ATOM 521 H 1 1 27.414 24.096 29.781 0.00 0.00 0
ATOM 522 H 1 1 29.674 23.914 31.873 0.00 0.00 0
ATOM 523 O 1 1 24.969 33.623 1.014 0.00 0.00 0
ATOM 524 H 1 1 26.521 33.058 1.518 0.00 0.00 0
ATOM 525 H 1 1 24.990 34.322 -0.683 0.00 0.00 0
ATOM 526 O 1 1 23.075 32.171 11.324 0.00 0.00 0
ATOM 527 H 1 1 23.316 32.775 13.097 0.00 0.00 0
ATOM 528 H 1 1 24.460 33.203 10.662 0.00 0.00 0
ATOM 529 O 1 1 27.497 2.736 17.224 0.00 0.00 0
ATOM 530 H 1 1 28.397 3.415 15.715 0.00 0.00 0
ATOM 531 H 1 1 28.234 1.233 17.412 0.00 0.00 0
ATOM 532 O 1 1 26.369 33.060 22.077 0.00 0.00 0
ATOM 533 H 1 1 26.170 34.746 22.264 0.00 0.00 0
ATOM 534 H 1 1 27.592 32.404 23.321 0.00 0.00 0
ATOM 535 O 1 1 30.221 30.950 25.843 0.00 0.00 0
ATOM 536 H 1 1 30.305 29.038 26.208 0.00 0.00 0
ATOM 537 H 1 1 30.363 31.979 27.414 0.00 0.00 0
ATOM 538 O 1 1 24.973 26.732 28.607 0.00 0.00 0
ATOM 539 H 1 1 25.385 28.369 29.248 0.00 0.00 0
ATOM 540 H 1 1 23.330 26.597 29.234 0.00 0.00 0
ATOM 541 O 1 1 32.165 4.857 2.258 0.00 0.00 0
ATOM 542 H 1 1 32.417 6.195 1.157 0.00 0.00 0
ATOM 543 H 1 1 32.615 3.727 1.112 0.00 0.00 0
ATOM 544 O 1 1 28.067 3.533 5.217 0.00 0.00 0
ATOM 545 H 1 1 26.960 4.447 4.158 0.00 0.00 0
ATOM 546 H 1 1 29.875 3.863 4.448 0.00 0.00 0
ATOM 547 O 1 1 33.279 2.782 13.028 0.00 0.00 0
ATOM 548 H 1 1 33.708 3.955 11.817 0.00 0.00 0
ATOM 549 H 1 1 33.656 3.545 14.631 0.00 0.00 0
ATOM 550 O 1 1 34.278 4.944 17.492 0.00 0.00 0
ATOM 551 H 1 1 33.438 6.563 17.876 0.00 0.00 0
ATOM 552 H 1 1 34.906 4.452 18.995 0.00 0.00 0
ATOM 553 O 1 1 32.363 1.908 26.092 0.00 0.00 0
ATOM 554 H 1 1 31.941 1.683 24.268 0.00 0.00 0
ATOM 555 H 1 1 33.850 1.390 26.904 0.00 0.00 0
ATOM 556 O 1 1 27.982 0.418 28.241 0.00 0.00 0
ATOM 557 H 1 1 27.516 2.080 28.309 0.00 0.00 0
ATOM 558 H 1 1 29.593 0.176 27.299 0.00 0.00 0
ATOM 559 O 1 1 28.845 14.672 2.724 0.00 0.00 0
ATOM 560 H 1 1 27.963 13.930 4.139 0.00 0.00 0
ATOM 561 H 1 1 30.386 15.714 3.379 0.00 0.00 0
ATOM 562 O 1 1 28.083 10.618 14.298 0.00 0.00 0
ATOM 563 H 1 1 28.623 12.160 13.293 0.00 0.00 0
ATOM 564 H 1 1 26.486 11.015 15.379 0.00 0.00 0
ATOM 565 O 1 1 33.867 10.545 13.306 0.00 0.00 0
ATOM 566 H 1 1 35.165 9.612 13.810 0.00 0.00 0
ATOM 567 H 1 1 33.615 10.270 11.513 0.00 0.00 0
ATOM 568 O 1 1 31.790 9.696 18.223 0.00 0.00 0
ATOM 569 H 1 1 30.484 9.334 19.421 0.00 0.00 0
ATOM 570 H 1 1 30.834 10.096 16.929 0.00 0.00 0
ATOM 571 O 1 1 30.141 15.006 21.532 0.00 0.00 0
ATOM 572 H 1 1 28.565 15.594 22.099 0.00 0.00 0
ATOM 573 H 1 1 30.942 14.253 23.077 0.00 0.00 0
ATOM 574 O 1 1 32.798 10.732 30.680 0.00 0.00 0
ATOM 575 H 1 1 34.073 9.528 30.799 0.00 0.00 0
ATOM 576 H 1 1 32.991 11.512 28.983 0.00 0.00 0
ATOM 577 O 1 1 33.652 16.265 5.086 0.00 0.00 0
ATOM 578 H 1 1 35.399 16.239 4.730 0.00 0.00 0
ATOM 579 H 1 1 33.503 17.939 5.631 0.00 0.00 0
ATOM 580 O 1 1 31.947 10.799 7.943 0.00 0.00 0
ATOM 581 H 1 1 29.894 10.549 7.619 0.00 0.00 0
ATOM 582 H 1 1 32.271 12.414 7.075 0.00 0.00 0
ATOM 583 O 1 1 0.329 15.516 11.746 0.00 0.00 0
ATOM 584 H 1 1 -0.446 14.249 12.939 0.00 0.00 0
ATOM 585 H 1 1 -0.685 17.018 11.935 0.00 0.00 0
ATOM 586 O 1 1 4.262 19.165 14.308 0.00 0.00 0
ATOM 587 H 1 1 3.579 17.691 14.920 0.00 0.00 0
ATOM 588 H 1 1 5.723 19.183 15.204 0.00 0.00 0
ATOM 589 O 1 1 32.995 13.546 25.948 0.00 0.00 0
ATOM 590 H 1 1 32.167 15.060 26.787 0.00 0.00 0
ATOM 591 H 1 1 34.425 13.800 25.007 0.00 0.00 0
ATOM 592 O 1 1 1.773 13.524 34.037 0.00 0.00 0
ATOM 593 H 1 1 0.227 14.409 33.446 0.00 0.00 0
ATOM 594 H 1 1 2.167 14.670 35.511 0.00 0.00 0
ATOM 595 O 1 1 33.029 20.529 7.247 0.00 0.00 0
ATOM 596 H 1 1 34.388 21.414 8.003 0.00 0.00 0
ATOM 597 H 1 1 31.451 20.831 8.182 0.00 0.00 0
ATOM 598 O 1 1 2.037 24.250 10.251 0.00 0.00 0
ATOM 599 H 1 1 3.743 25.008 9.876 0.00 0.00 0
ATOM 600 H 1 1 1.894 25.043 11.903 0.00 0.00 0
ATOM 601 O 1 1 32.753 19.259 13.976 0.00 0.00 0
ATOM 602 H 1 1 32.792 20.886 13.792 0.00 0.00 0
ATOM 603 H 1 1 34.334 18.799 14.976 0.00 0.00 0
ATOM 604 O 1 1 0.396 18.673 18.699 0.00 0.00 0
ATOM 605 H 1 1 -1.211 18.950 19.127 0.00 0.00 0
ATOM 606 H 1 1 0.469 16.977 18.436 0.00 0.00 0
ATOM 607 O 1 1 30.855 18.370 27.959 0.00 0.00 0
ATOM 608 H 1 1 29.759 19.681 28.690 0.00 0.00 0
ATOM 609 H 1 1 32.103 19.477 26.763 0.00 0.00 0
ATOM 610 O 1 1 27.723 15.992 33.091 0.00 0.00 0
ATOM 611 H 1 1 29.390 16.423 32.192 0.00 0.00 0
ATOM 612 H 1 1 27.801 15.859 34.804 0.00 0.00 0
ATOM 613 O 1 1 31.068 27.895 3.348 0.00 0.00 0
ATOM 614 H 1 1 32.517 27.825 4.610 0.00 0.00 0
ATOM 615 H 1 1 31.529 29.459 2.324 0.00 0.00 0
ATOM 616 O 1 1 35.039 28.008 6.663 0.00 0.00 0
ATOM 617 H 1 1 35.966 26.934 7.683 0.00 0.00 0
ATOM 618 H 1 1 36.055 28.336 5.336 0.00 0.00 0
ATOM 619 O 1 1 29.356 28.196 13.025 0.00 0.00 0
ATOM 620 H 1 1 29.210 29.335 14.589 0.00 0.00 0
ATOM 621 H 1 1 28.874 29.629 11.867 0.00 0.00 0
ATOM 622 O 1 1 32.386 28.434 18.961 0.00 0.00 0
ATOM 623 H 1 1 33.368 28.574 20.411 0.00 0.00 0
ATOM 624 H 1 1 33.410 27.406 17.949 0.00 0.00 0
ATOM 625 O 1 1 30.898 25.390 25.799 0.00 0.00 0
ATOM 626 H 1 1 32.369 25.913 24.580 0.00 0.00 0
ATOM 627 H 1 1 31.317 24.075 27.029 0.00 0.00 0
ATOM 628 O 1 1 32.259 25.611 33.104 0.00 0.00 0
ATOM 629 H 1 1 32.238 25.736 34.806 0.00 0.00 0
ATOM 630 H 1 1 33.920 25.042 32.775 0.00 0.00 0
ATOM 631 O 1 1 30.290 32.645 1.341 0.00 0.00 0
ATOM 632 H 1 1 29.949 32.793 -0.430 0.00 0.00 0
ATOM 633 H 1 1 31.762 33.340 1.847 0.00 0.00 0
ATOM 634 O 1 1 25.536 34.235 6.469 0.00 0.00 0
ATOM 635 H 1 1 25.716 36.059 6.651 0.00 0.00 0
ATOM 636 H 1 1 25.283 33.866 4.895 0.00 0.00 0
ATOM 637 O 1 1 31.674 33.161 13.106 0.00 0.00 0
ATOM 638 H 1 1 31.793 34.863 13.281 0.00 0.00 0
ATOM 639 H 1 1 30.425 32.928 11.783 0.00 0.00 0
ATOM 640 O 1 1 33.844 32.668 22.296 0.00 0.00 0
ATOM 641 H 1 1 32.750 32.234 23.524 0.00 0.00 0
ATOM 642 H 1 1 32.917 32.875 20.736 0.00 0.00 0
ATOM 643 O 1 1 31.603 30.542 30.805 0.00 0.00 0
ATOM 644 H 1 1 33.451 30.804 30.468 0.00 0.00 0
ATOM 645 H 1 1 31.575 28.816 31.756 0.00 0.00 0
ATOM 646 O 1 1 26.295 31.235 30.599 0.00 0.00 0
ATOM 647 H 1 1 27.834 30.515 30.607 0.00 0.00 0
ATOM 648 H 1 1 26.362 32.920 29.856 0.00 0.00 0
END

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
units electron
atom_style full
#pair_style lj/cut/coul/long 17.01
pair_style lj/cut/tip4p/long 1 2 1 1 0.278072379 17.007
#bond_style harmonic
bond_style class2
angle_style harmonic
#kspace_style pppm 0.0001
kspace_style pppm/tip4p 0.0001
read_data data.water
pair_coeff * * 0 0
pair_coeff 1 1 0.000295147 5.96946
neighbor 2.0 bin
timestep 0.00025
#velocity all create 298.0 2345187
#thermo_style multi
#thermo 1
#fix 1 all nvt temp 298.0 298.0 30.0 tchain 1
#fix 1 all nve
fix 1 all ipi piglet_8 32342 unix
#dump 1 all xyz 25 dump.xyz
run 100000000

View File

@ -0,0 +1,49 @@
<simulation>
<initialize nbeads='8'>
<file mode='pdb'> water_298K.pdb </file>
<velocities mode="thermal" units='kelvin'> 298 </velocities>
</initialize>
<output prefix='gle_lammps'>
<properties stride='1' filename='out'> [ step, time{picosecond}, conserved{kelvin}, temperature{kelvin}, kinetic_cv{kelvin}, potential{kelvin}, pressure_cv{megapascal}] </properties>
<trajectory filename='pos' stride='20'> positions </trajectory>
</output>
<total_steps>500000</total_steps>
<prng><seed>32342</seed></prng>
<forces>
<socket mode='unix'>
<address>piglet_8</address>
</socket>
</forces>
<ensemble mode='nvt'>
<thermostat mode='nm_gle'>
<A shape='(8,9,9)'>
[
1.300513766690e-2, 9.078220950722e-6, 8.180522706851e-6, 1.196620464216e-5, 1.108609196233e-4, -8.941338246404e-4, 7.817382329484e-3, -1.206049888192e-2, -5.215913547478e-2, -9.756343549369e-6, 2.131200614277e-7, 2.972243541454e-6, -4.459298032276e-6, 2.177011229810e-7, 4.960251269751e-7, -2.083064995647e-6, -7.004617074013e-6, 2.299410255689e-5, -1.851243089560e-6, -2.972243541454e-6, 1.956991859501e-6, 1.742357040415e-6, -2.082265548357e-6, -1.760771137012e-6, -3.733162998255e-6, -3.711884630223e-5, -3.625483838477e-5, 1.492481502899e-5, 4.459298032276e-6, -1.742357040415e-6, 5.092476869103e-6, 2.033910859306e-6, 5.856365217540e-7, -3.020170664006e-6, 1.868034354962e-5, -5.049113665348e-6, 1.059383195368e-4, -2.177011229810e-7, 2.082265548357e-6, -2.033910859306e-6, 5.467813757620e-5, -6.684243951800e-6, -9.770331146786e-7, -2.159991642805e-4, 4.667176340213e-4, -7.611448585233e-4, -4.960251269751e-7, 1.760771137012e-6, -5.856365217540e-7, 6.684243951800e-6, 6.616597356640e-4, -1.637891086976e-6, -2.056652206438e-4, 2.960975881160e-4, 7.659946833472e-3, 2.083064995647e-6, 3.733162998255e-6, 3.020170664006e-6, 9.770331146786e-7, 1.637891086976e-6, 6.390977118535e-3, -6.246090363901e-5, 5.054994461623e-4, -1.078245092236e-2, 7.004617074013e-6, 3.711884630223e-5, -1.868034354962e-5, 2.159991642805e-4, 2.056652206438e-4, 6.246090363901e-5, 1.730397061203e-1, 1.004651317366e-4, -5.467410217589e-2, -2.299410255689e-5, 3.625483838477e-5, 5.049113665348e-6, -4.667176340213e-4, -2.960975881160e-4, -5.054994461623e-4, -1.004651317366e-4, 1.795223909984e+0,
8.433361179684e-6, 5.985771048989e-3, 0.000000000000e+0, 1.106850007061e-2, 0.000000000000e+0, 4.737897597685e-3, 0.000000000000e+0, 2.344265458323e-4, 0.000000000000e+0, -5.985771048989e-3, 9.461326310093e-2, 9.829968606252e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -9.829968606252e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.106850007061e-2, 0.000000000000e+0, 0.000000000000e+0, 1.488504300030e-2, 4.214899343968e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.214899343968e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.737897597685e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 3.514677295700e-2, 8.541932660186e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -8.541932660186e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, -2.344265458323e-4, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.199180080880e-4, 3.798554823700e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -3.798554823700e-3, 1.889231157037e-14,
8.433361179684e-6, 5.985771048989e-3, 0.000000000000e+0, 1.106850007061e-2, 0.000000000000e+0, 4.737897597685e-3, 0.000000000000e+0, 2.344265458323e-4, 0.000000000000e+0, -5.985771048989e-3, 9.461326310093e-2, 9.829968606252e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -9.829968606252e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.106850007061e-2, 0.000000000000e+0, 0.000000000000e+0, 1.488504300030e-2, 4.214899343968e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.214899343968e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.737897597685e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 3.514677295700e-2, 8.541932660186e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -8.541932660186e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, -2.344265458323e-4, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.199180080880e-4, 3.798554823700e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -3.798554823700e-3, 1.889231157037e-14,
8.433361179684e-6, 5.985771048989e-3, 0.000000000000e+0, 1.106850007061e-2, 0.000000000000e+0, 4.737897597685e-3, 0.000000000000e+0, 2.344265458323e-4, 0.000000000000e+0, -5.985771048989e-3, 9.461326310093e-2, 9.829968606252e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -9.829968606252e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.106850007061e-2, 0.000000000000e+0, 0.000000000000e+0, 1.488504300030e-2, 4.214899343968e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.214899343968e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.737897597685e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 3.514677295700e-2, 8.541932660186e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -8.541932660186e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, -2.344265458323e-4, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.199180080880e-4, 3.798554823700e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -3.798554823700e-3, 1.889231157037e-14,
8.433361179684e-6, 5.985771048989e-3, 0.000000000000e+0, 1.106850007061e-2, 0.000000000000e+0, 4.737897597685e-3, 0.000000000000e+0, 2.344265458323e-4, 0.000000000000e+0, -5.985771048989e-3, 9.461326310093e-2, 9.829968606252e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -9.829968606252e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.106850007061e-2, 0.000000000000e+0, 0.000000000000e+0, 1.488504300030e-2, 4.214899343968e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.214899343968e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.737897597685e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 3.514677295700e-2, 8.541932660186e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -8.541932660186e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, -2.344265458323e-4, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.199180080880e-4, 3.798554823700e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -3.798554823700e-3, 1.889231157037e-14,
8.433361179684e-6, 5.985771048989e-3, 0.000000000000e+0, 1.106850007061e-2, 0.000000000000e+0, 4.737897597685e-3, 0.000000000000e+0, 2.344265458323e-4, 0.000000000000e+0, -5.985771048989e-3, 9.461326310093e-2, 9.829968606252e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -9.829968606252e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.106850007061e-2, 0.000000000000e+0, 0.000000000000e+0, 1.488504300030e-2, 4.214899343968e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.214899343968e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.737897597685e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 3.514677295700e-2, 8.541932660186e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -8.541932660186e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, -2.344265458323e-4, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.199180080880e-4, 3.798554823700e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -3.798554823700e-3, 1.889231157037e-14,
8.433361179684e-6, 5.985771048989e-3, 0.000000000000e+0, 1.106850007061e-2, 0.000000000000e+0, 4.737897597685e-3, 0.000000000000e+0, 2.344265458323e-4, 0.000000000000e+0, -5.985771048989e-3, 9.461326310093e-2, 9.829968606252e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -9.829968606252e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.106850007061e-2, 0.000000000000e+0, 0.000000000000e+0, 1.488504300030e-2, 4.214899343968e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.214899343968e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.737897597685e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 3.514677295700e-2, 8.541932660186e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -8.541932660186e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, -2.344265458323e-4, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.199180080880e-4, 3.798554823700e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -3.798554823700e-3, 1.889231157037e-14,
8.433361179684e-6, 5.985771048989e-3, 0.000000000000e+0, 1.106850007061e-2, 0.000000000000e+0, 4.737897597685e-3, 0.000000000000e+0, 2.344265458323e-4, 0.000000000000e+0, -5.985771048989e-3, 9.461326310093e-2, 9.829968606252e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -9.829968606252e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -1.106850007061e-2, 0.000000000000e+0, 0.000000000000e+0, 1.488504300030e-2, 4.214899343968e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.214899343968e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -4.737897597685e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 3.514677295700e-2, 8.541932660186e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -8.541932660186e-3, 1.889231157037e-14, 0.000000000000e+0, 0.000000000000e+0, -2.344265458323e-4, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.199180080880e-4, 3.798554823700e-3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, -3.798554823700e-3, 1.889231157037e-14
]
</A>
<C shape='(8,9,9)' units='kelvin'>
[
2.384000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.384000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.384000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.384000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.384000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.384000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.384000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.384000000000e+3, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 0.000000000000e+0, 2.384000000000e+3,
2.698549372188e+3, -1.368081060516e+3, -3.209415830440e+3, 8.738658365140e+2, 7.268039280880e+2, -2.513005676292e+2, -4.150754888640e+2, -1.260054684948e+3, -6.448165752780e+2, -1.368081060516e+3, 2.965586458180e+4, 5.268769597220e-8, -5.555628715240e+0, 4.972346413560e+2, -5.924916939780e+1, 1.075269335280e+2, -8.318280168320e+1, -1.172679285326e+0, -3.209415830440e+3, 5.268504922560e-8, 2.770155230160e+4, -1.159648313612e+3, -4.345682898960e+3, -1.237408936636e+2, -1.339182640444e+3, 3.034680577260e+0, -4.135056752260e+2, 8.738658365140e+2, -5.555628715240e+0, -1.159648313612e+3, 1.243175060816e+3, 1.278480055046e-8, 5.970691220840e+1, -2.520026819128e+2, -9.347295856760e+2, -4.292224714720e+2, 7.268039280880e+2, 4.972346413560e+2, -4.345682898960e+3, 1.278476746650e-8, 3.151792246900e+3, 1.243472620074e+2, -7.904812686860e+1, 4.762678432220e+2, -1.019900735322e+3, -2.513005676292e+2, -5.924916939780e+1, -1.237408936636e+2, 5.970691220840e+1, 1.243472620074e+2, 5.255446383760e+3, 1.045563267562e-8, -1.725915110312e+2, -4.871461433960e+0, -4.150754888640e+2, 1.075269335280e+2, -1.339182640444e+3, -2.520026819128e+2, -7.904812686860e+1, 1.045503715242e-8, 5.025219194680e+3, 1.095461232690e+1, -4.143625581340e+2, -1.260054684948e+3, -8.318280168320e+1, 3.034680577260e+0, -9.347295856760e+2, 4.762678432220e+2, -1.725915110312e+2, 1.095461232690e+1, 6.411989938480e+4, 3.172261366260e-7, -6.448165752780e+2, -1.172679285326e+0, -4.135056752260e+2, -4.292224714720e+2, -1.019900735322e+3, -4.871461433960e+0, -4.143625581340e+2, 3.172261720880e-7, 6.408010473300e+4,
2.698549372188e+3, -1.368081060516e+3, -3.209415830440e+3, 8.738658365140e+2, 7.268039280880e+2, -2.513005676292e+2, -4.150754888640e+2, -1.260054684948e+3, -6.448165752780e+2, -1.368081060516e+3, 2.965586458180e+4, 5.268769597220e-8, -5.555628715240e+0, 4.972346413560e+2, -5.924916939780e+1, 1.075269335280e+2, -8.318280168320e+1, -1.172679285326e+0, -3.209415830440e+3, 5.268504922560e-8, 2.770155230160e+4, -1.159648313612e+3, -4.345682898960e+3, -1.237408936636e+2, -1.339182640444e+3, 3.034680577260e+0, -4.135056752260e+2, 8.738658365140e+2, -5.555628715240e+0, -1.159648313612e+3, 1.243175060816e+3, 1.278480055046e-8, 5.970691220840e+1, -2.520026819128e+2, -9.347295856760e+2, -4.292224714720e+2, 7.268039280880e+2, 4.972346413560e+2, -4.345682898960e+3, 1.278476746650e-8, 3.151792246900e+3, 1.243472620074e+2, -7.904812686860e+1, 4.762678432220e+2, -1.019900735322e+3, -2.513005676292e+2, -5.924916939780e+1, -1.237408936636e+2, 5.970691220840e+1, 1.243472620074e+2, 5.255446383760e+3, 1.045563267562e-8, -1.725915110312e+2, -4.871461433960e+0, -4.150754888640e+2, 1.075269335280e+2, -1.339182640444e+3, -2.520026819128e+2, -7.904812686860e+1, 1.045503715242e-8, 5.025219194680e+3, 1.095461232690e+1, -4.143625581340e+2, -1.260054684948e+3, -8.318280168320e+1, 3.034680577260e+0, -9.347295856760e+2, 4.762678432220e+2, -1.725915110312e+2, 1.095461232690e+1, 6.411989938480e+4, 3.172261366260e-7, -6.448165752780e+2, -1.172679285326e+0, -4.135056752260e+2, -4.292224714720e+2, -1.019900735322e+3, -4.871461433960e+0, -4.143625581340e+2, 3.172261720880e-7, 6.408010473300e+4,
2.698549372188e+3, -1.368081060516e+3, -3.209415830440e+3, 8.738658365140e+2, 7.268039280880e+2, -2.513005676292e+2, -4.150754888640e+2, -1.260054684948e+3, -6.448165752780e+2, -1.368081060516e+3, 2.965586458180e+4, 5.268769597220e-8, -5.555628715240e+0, 4.972346413560e+2, -5.924916939780e+1, 1.075269335280e+2, -8.318280168320e+1, -1.172679285326e+0, -3.209415830440e+3, 5.268504922560e-8, 2.770155230160e+4, -1.159648313612e+3, -4.345682898960e+3, -1.237408936636e+2, -1.339182640444e+3, 3.034680577260e+0, -4.135056752260e+2, 8.738658365140e+2, -5.555628715240e+0, -1.159648313612e+3, 1.243175060816e+3, 1.278480055046e-8, 5.970691220840e+1, -2.520026819128e+2, -9.347295856760e+2, -4.292224714720e+2, 7.268039280880e+2, 4.972346413560e+2, -4.345682898960e+3, 1.278476746650e-8, 3.151792246900e+3, 1.243472620074e+2, -7.904812686860e+1, 4.762678432220e+2, -1.019900735322e+3, -2.513005676292e+2, -5.924916939780e+1, -1.237408936636e+2, 5.970691220840e+1, 1.243472620074e+2, 5.255446383760e+3, 1.045563267562e-8, -1.725915110312e+2, -4.871461433960e+0, -4.150754888640e+2, 1.075269335280e+2, -1.339182640444e+3, -2.520026819128e+2, -7.904812686860e+1, 1.045503715242e-8, 5.025219194680e+3, 1.095461232690e+1, -4.143625581340e+2, -1.260054684948e+3, -8.318280168320e+1, 3.034680577260e+0, -9.347295856760e+2, 4.762678432220e+2, -1.725915110312e+2, 1.095461232690e+1, 6.411989938480e+4, 3.172261366260e-7, -6.448165752780e+2, -1.172679285326e+0, -4.135056752260e+2, -4.292224714720e+2, -1.019900735322e+3, -4.871461433960e+0, -4.143625581340e+2, 3.172261720880e-7, 6.408010473300e+4,
2.698549372188e+3, -1.368081060516e+3, -3.209415830440e+3, 8.738658365140e+2, 7.268039280880e+2, -2.513005676292e+2, -4.150754888640e+2, -1.260054684948e+3, -6.448165752780e+2, -1.368081060516e+3, 2.965586458180e+4, 5.268769597220e-8, -5.555628715240e+0, 4.972346413560e+2, -5.924916939780e+1, 1.075269335280e+2, -8.318280168320e+1, -1.172679285326e+0, -3.209415830440e+3, 5.268504922560e-8, 2.770155230160e+4, -1.159648313612e+3, -4.345682898960e+3, -1.237408936636e+2, -1.339182640444e+3, 3.034680577260e+0, -4.135056752260e+2, 8.738658365140e+2, -5.555628715240e+0, -1.159648313612e+3, 1.243175060816e+3, 1.278480055046e-8, 5.970691220840e+1, -2.520026819128e+2, -9.347295856760e+2, -4.292224714720e+2, 7.268039280880e+2, 4.972346413560e+2, -4.345682898960e+3, 1.278476746650e-8, 3.151792246900e+3, 1.243472620074e+2, -7.904812686860e+1, 4.762678432220e+2, -1.019900735322e+3, -2.513005676292e+2, -5.924916939780e+1, -1.237408936636e+2, 5.970691220840e+1, 1.243472620074e+2, 5.255446383760e+3, 1.045563267562e-8, -1.725915110312e+2, -4.871461433960e+0, -4.150754888640e+2, 1.075269335280e+2, -1.339182640444e+3, -2.520026819128e+2, -7.904812686860e+1, 1.045503715242e-8, 5.025219194680e+3, 1.095461232690e+1, -4.143625581340e+2, -1.260054684948e+3, -8.318280168320e+1, 3.034680577260e+0, -9.347295856760e+2, 4.762678432220e+2, -1.725915110312e+2, 1.095461232690e+1, 6.411989938480e+4, 3.172261366260e-7, -6.448165752780e+2, -1.172679285326e+0, -4.135056752260e+2, -4.292224714720e+2, -1.019900735322e+3, -4.871461433960e+0, -4.143625581340e+2, 3.172261720880e-7, 6.408010473300e+4,
2.698549372188e+3, -1.368081060516e+3, -3.209415830440e+3, 8.738658365140e+2, 7.268039280880e+2, -2.513005676292e+2, -4.150754888640e+2, -1.260054684948e+3, -6.448165752780e+2, -1.368081060516e+3, 2.965586458180e+4, 5.268769597220e-8, -5.555628715240e+0, 4.972346413560e+2, -5.924916939780e+1, 1.075269335280e+2, -8.318280168320e+1, -1.172679285326e+0, -3.209415830440e+3, 5.268504922560e-8, 2.770155230160e+4, -1.159648313612e+3, -4.345682898960e+3, -1.237408936636e+2, -1.339182640444e+3, 3.034680577260e+0, -4.135056752260e+2, 8.738658365140e+2, -5.555628715240e+0, -1.159648313612e+3, 1.243175060816e+3, 1.278480055046e-8, 5.970691220840e+1, -2.520026819128e+2, -9.347295856760e+2, -4.292224714720e+2, 7.268039280880e+2, 4.972346413560e+2, -4.345682898960e+3, 1.278476746650e-8, 3.151792246900e+3, 1.243472620074e+2, -7.904812686860e+1, 4.762678432220e+2, -1.019900735322e+3, -2.513005676292e+2, -5.924916939780e+1, -1.237408936636e+2, 5.970691220840e+1, 1.243472620074e+2, 5.255446383760e+3, 1.045563267562e-8, -1.725915110312e+2, -4.871461433960e+0, -4.150754888640e+2, 1.075269335280e+2, -1.339182640444e+3, -2.520026819128e+2, -7.904812686860e+1, 1.045503715242e-8, 5.025219194680e+3, 1.095461232690e+1, -4.143625581340e+2, -1.260054684948e+3, -8.318280168320e+1, 3.034680577260e+0, -9.347295856760e+2, 4.762678432220e+2, -1.725915110312e+2, 1.095461232690e+1, 6.411989938480e+4, 3.172261366260e-7, -6.448165752780e+2, -1.172679285326e+0, -4.135056752260e+2, -4.292224714720e+2, -1.019900735322e+3, -4.871461433960e+0, -4.143625581340e+2, 3.172261720880e-7, 6.408010473300e+4,
2.698549372188e+3, -1.368081060516e+3, -3.209415830440e+3, 8.738658365140e+2, 7.268039280880e+2, -2.513005676292e+2, -4.150754888640e+2, -1.260054684948e+3, -6.448165752780e+2, -1.368081060516e+3, 2.965586458180e+4, 5.268769597220e-8, -5.555628715240e+0, 4.972346413560e+2, -5.924916939780e+1, 1.075269335280e+2, -8.318280168320e+1, -1.172679285326e+0, -3.209415830440e+3, 5.268504922560e-8, 2.770155230160e+4, -1.159648313612e+3, -4.345682898960e+3, -1.237408936636e+2, -1.339182640444e+3, 3.034680577260e+0, -4.135056752260e+2, 8.738658365140e+2, -5.555628715240e+0, -1.159648313612e+3, 1.243175060816e+3, 1.278480055046e-8, 5.970691220840e+1, -2.520026819128e+2, -9.347295856760e+2, -4.292224714720e+2, 7.268039280880e+2, 4.972346413560e+2, -4.345682898960e+3, 1.278476746650e-8, 3.151792246900e+3, 1.243472620074e+2, -7.904812686860e+1, 4.762678432220e+2, -1.019900735322e+3, -2.513005676292e+2, -5.924916939780e+1, -1.237408936636e+2, 5.970691220840e+1, 1.243472620074e+2, 5.255446383760e+3, 1.045563267562e-8, -1.725915110312e+2, -4.871461433960e+0, -4.150754888640e+2, 1.075269335280e+2, -1.339182640444e+3, -2.520026819128e+2, -7.904812686860e+1, 1.045503715242e-8, 5.025219194680e+3, 1.095461232690e+1, -4.143625581340e+2, -1.260054684948e+3, -8.318280168320e+1, 3.034680577260e+0, -9.347295856760e+2, 4.762678432220e+2, -1.725915110312e+2, 1.095461232690e+1, 6.411989938480e+4, 3.172261366260e-7, -6.448165752780e+2, -1.172679285326e+0, -4.135056752260e+2, -4.292224714720e+2, -1.019900735322e+3, -4.871461433960e+0, -4.143625581340e+2, 3.172261720880e-7, 6.408010473300e+4,
2.698549372188e+3, -1.368081060516e+3, -3.209415830440e+3, 8.738658365140e+2, 7.268039280880e+2, -2.513005676292e+2, -4.150754888640e+2, -1.260054684948e+3, -6.448165752780e+2, -1.368081060516e+3, 2.965586458180e+4, 5.268769597220e-8, -5.555628715240e+0, 4.972346413560e+2, -5.924916939780e+1, 1.075269335280e+2, -8.318280168320e+1, -1.172679285326e+0, -3.209415830440e+3, 5.268504922560e-8, 2.770155230160e+4, -1.159648313612e+3, -4.345682898960e+3, -1.237408936636e+2, -1.339182640444e+3, 3.034680577260e+0, -4.135056752260e+2, 8.738658365140e+2, -5.555628715240e+0, -1.159648313612e+3, 1.243175060816e+3, 1.278480055046e-8, 5.970691220840e+1, -2.520026819128e+2, -9.347295856760e+2, -4.292224714720e+2, 7.268039280880e+2, 4.972346413560e+2, -4.345682898960e+3, 1.278476746650e-8, 3.151792246900e+3, 1.243472620074e+2, -7.904812686860e+1, 4.762678432220e+2, -1.019900735322e+3, -2.513005676292e+2, -5.924916939780e+1, -1.237408936636e+2, 5.970691220840e+1, 1.243472620074e+2, 5.255446383760e+3, 1.045563267562e-8, -1.725915110312e+2, -4.871461433960e+0, -4.150754888640e+2, 1.075269335280e+2, -1.339182640444e+3, -2.520026819128e+2, -7.904812686860e+1, 1.045503715242e-8, 5.025219194680e+3, 1.095461232690e+1, -4.143625581340e+2, -1.260054684948e+3, -8.318280168320e+1, 3.034680577260e+0, -9.347295856760e+2, 4.762678432220e+2, -1.725915110312e+2, 1.095461232690e+1, 6.411989938480e+4, 3.172261366260e-7, -6.448165752780e+2, -1.172679285326e+0, -4.135056752260e+2, -4.292224714720e+2, -1.019900735322e+3, -4.871461433960e+0, -4.143625581340e+2, 3.172261720880e-7, 6.408010473300e+4
]
</C>
</thermostat>
<timestep units='femtosecond'> 0.1</timestep>
<temperature units='kelvin'>298</temperature>
</ensemble>
</simulation>

View File

@ -0,0 +1,650 @@
CRYST 35.233 35.233 35.233 90.00 90.00 90.00 P 1 1
ATOM 1 O 1 1 3.846 5.672 1.323 0.00 0.00 0
ATOM 2 H 1 1 2.979 7.054 0.857 0.00 0.00 0
ATOM 3 H 1 1 5.525 5.697 0.451 0.00 0.00 0
ATOM 4 O 1 1 34.557 34.341 3.078 0.00 0.00 0
ATOM 5 H 1 1 33.722 34.689 4.840 0.00 0.00 0
ATOM 6 H 1 1 36.029 33.220 3.711 0.00 0.00 0
ATOM 7 O 1 1 5.591 1.963 13.477 0.00 0.00 0
ATOM 8 H 1 1 7.265 1.864 13.851 0.00 0.00 0
ATOM 9 H 1 1 5.009 3.555 13.916 0.00 0.00 0
ATOM 10 O 1 1 1.060 2.061 21.718 0.00 0.00 0
ATOM 11 H 1 1 0.757 0.261 21.820 0.00 0.00 0
ATOM 12 H 1 1 0.213 3.013 23.047 0.00 0.00 0
ATOM 13 O 1 1 1.200 1.337 29.006 0.00 0.00 0
ATOM 14 H 1 1 0.818 1.884 30.732 0.00 0.00 0
ATOM 15 H 1 1 2.883 1.825 29.011 0.00 0.00 0
ATOM 16 O 1 1 1.331 1.386 34.306 0.00 0.00 0
ATOM 17 H 1 1 2.392 2.898 34.846 0.00 0.00 0
ATOM 18 H 1 1 0.814 0.532 35.836 0.00 0.00 0
ATOM 19 O 1 1 31.451 10.201 0.726 0.00 0.00 0
ATOM 20 H 1 1 32.282 10.877 -0.750 0.00 0.00 0
ATOM 21 H 1 1 30.920 11.594 1.677 0.00 0.00 0
ATOM 22 O 1 1 0.836 10.808 4.298 0.00 0.00 0
ATOM 23 H 1 1 0.305 10.643 2.793 0.00 0.00 0
ATOM 24 H 1 1 -0.356 10.334 5.524 0.00 0.00 0
ATOM 25 O 1 1 34.381 5.979 9.194 0.00 0.00 0
ATOM 26 H 1 1 33.616 7.673 8.857 0.00 0.00 0
ATOM 27 H 1 1 35.115 5.260 7.618 0.00 0.00 0
ATOM 28 O 1 1 33.212 6.480 24.278 0.00 0.00 0
ATOM 29 H 1 1 31.624 6.908 23.521 0.00 0.00 0
ATOM 30 H 1 1 32.544 4.990 24.982 0.00 0.00 0
ATOM 31 O 1 1 1.992 9.002 26.863 0.00 0.00 0
ATOM 32 H 1 1 1.856 10.175 25.579 0.00 0.00 0
ATOM 33 H 1 1 0.519 8.099 26.386 0.00 0.00 0
ATOM 34 O 1 1 2.054 8.660 32.515 0.00 0.00 0
ATOM 35 H 1 1 2.167 8.727 30.494 0.00 0.00 0
ATOM 36 H 1 1 2.374 10.513 33.038 0.00 0.00 0
ATOM 37 O 1 1 3.402 16.639 3.008 0.00 0.00 0
ATOM 38 H 1 1 4.127 15.872 4.446 0.00 0.00 0
ATOM 39 H 1 1 2.905 18.339 3.160 0.00 0.00 0
ATOM 40 O 1 1 4.222 15.444 8.072 0.00 0.00 0
ATOM 41 H 1 1 5.211 16.756 8.299 0.00 0.00 0
ATOM 42 H 1 1 2.560 15.492 8.860 0.00 0.00 0
ATOM 43 O 1 1 2.831 9.246 16.488 0.00 0.00 0
ATOM 44 H 1 1 2.869 8.023 18.050 0.00 0.00 0
ATOM 45 H 1 1 3.960 8.467 15.154 0.00 0.00 0
ATOM 46 O 1 1 5.563 6.003 20.907 0.00 0.00 0
ATOM 47 H 1 1 4.653 4.638 21.480 0.00 0.00 0
ATOM 48 H 1 1 6.405 6.208 22.529 0.00 0.00 0
ATOM 49 O 1 1 2.087 13.370 22.913 0.00 0.00 0
ATOM 50 H 1 1 2.832 14.804 23.422 0.00 0.00 0
ATOM 51 H 1 1 1.434 13.509 21.196 0.00 0.00 0
ATOM 52 O 1 1 3.369 17.886 25.109 0.00 0.00 0
ATOM 53 H 1 1 3.655 17.200 26.766 0.00 0.00 0
ATOM 54 H 1 1 4.772 18.977 24.500 0.00 0.00 0
ATOM 55 O 1 1 34.764 20.803 0.948 0.00 0.00 0
ATOM 56 H 1 1 35.210 21.267 2.816 0.00 0.00 0
ATOM 57 H 1 1 35.962 21.726 0.131 0.00 0.00 0
ATOM 58 O 1 1 2.836 24.178 15.229 0.00 0.00 0
ATOM 59 H 1 1 2.795 22.346 14.876 0.00 0.00 0
ATOM 60 H 1 1 2.414 24.115 17.130 0.00 0.00 0
ATOM 61 O 1 1 33.000 24.481 15.230 0.00 0.00 0
ATOM 62 H 1 1 34.640 24.804 15.013 0.00 0.00 0
ATOM 63 H 1 1 32.401 25.764 14.295 0.00 0.00 0
ATOM 64 O 1 1 0.404 26.779 23.400 0.00 0.00 0
ATOM 65 H 1 1 1.353 27.248 24.987 0.00 0.00 0
ATOM 66 H 1 1 1.546 28.050 22.317 0.00 0.00 0
ATOM 67 O 1 1 34.222 21.380 25.418 0.00 0.00 0
ATOM 68 H 1 1 35.669 20.151 25.317 0.00 0.00 0
ATOM 69 H 1 1 32.960 21.180 23.992 0.00 0.00 0
ATOM 70 O 1 1 33.259 17.438 32.480 0.00 0.00 0
ATOM 71 H 1 1 33.314 18.782 33.883 0.00 0.00 0
ATOM 72 H 1 1 32.743 18.181 30.871 0.00 0.00 0
ATOM 73 O 1 1 4.463 21.979 3.936 0.00 0.00 0
ATOM 74 H 1 1 5.856 23.084 3.400 0.00 0.00 0
ATOM 75 H 1 1 3.986 22.180 5.602 0.00 0.00 0
ATOM 76 O 1 1 6.258 25.851 8.520 0.00 0.00 0
ATOM 77 H 1 1 5.767 27.693 8.476 0.00 0.00 0
ATOM 78 H 1 1 7.202 25.506 10.186 0.00 0.00 0
ATOM 79 O 1 1 0.601 29.737 12.747 0.00 0.00 0
ATOM 80 H 1 1 -0.685 30.842 12.350 0.00 0.00 0
ATOM 81 H 1 1 1.336 30.716 14.031 0.00 0.00 0
ATOM 82 O 1 1 7.563 28.191 24.333 0.00 0.00 0
ATOM 83 H 1 1 9.201 28.828 24.684 0.00 0.00 0
ATOM 84 H 1 1 7.381 27.621 22.799 0.00 0.00 0
ATOM 85 O 1 1 3.653 27.109 27.772 0.00 0.00 0
ATOM 86 H 1 1 5.126 27.015 26.772 0.00 0.00 0
ATOM 87 H 1 1 3.031 28.756 27.698 0.00 0.00 0
ATOM 88 O 1 1 2.596 23.991 32.476 0.00 0.00 0
ATOM 89 H 1 1 2.879 24.791 30.859 0.00 0.00 0
ATOM 90 H 1 1 4.003 22.913 32.701 0.00 0.00 0
ATOM 91 O 1 1 3.083 31.317 3.644 0.00 0.00 0
ATOM 92 H 1 1 4.133 30.589 2.539 0.00 0.00 0
ATOM 93 H 1 1 4.218 32.173 5.037 0.00 0.00 0
ATOM 94 O 1 1 4.661 30.555 9.368 0.00 0.00 0
ATOM 95 H 1 1 3.184 29.843 10.132 0.00 0.00 0
ATOM 96 H 1 1 4.358 32.448 9.126 0.00 0.00 0
ATOM 97 O 1 1 3.465 32.537 15.778 0.00 0.00 0
ATOM 98 H 1 1 5.072 31.819 15.903 0.00 0.00 0
ATOM 99 H 1 1 4.055 34.257 15.284 0.00 0.00 0
ATOM 100 O 1 1 4.215 29.153 20.317 0.00 0.00 0
ATOM 101 H 1 1 3.658 30.176 18.842 0.00 0.00 0
ATOM 102 H 1 1 4.959 30.291 21.449 0.00 0.00 0
ATOM 103 O 1 1 1.126 31.333 28.768 0.00 0.00 0
ATOM 104 H 1 1 2.395 31.124 29.925 0.00 0.00 0
ATOM 105 H 1 1 0.768 33.092 28.898 0.00 0.00 0
ATOM 106 O 1 1 4.881 32.616 32.302 0.00 0.00 0
ATOM 107 H 1 1 6.588 32.911 31.725 0.00 0.00 0
ATOM 108 H 1 1 4.486 34.037 33.249 0.00 0.00 0
ATOM 109 O 1 1 8.962 5.556 0.151 0.00 0.00 0
ATOM 110 H 1 1 9.652 6.991 0.859 0.00 0.00 0
ATOM 111 H 1 1 9.173 4.477 1.645 0.00 0.00 0
ATOM 112 O 1 1 1.833 3.518 5.679 0.00 0.00 0
ATOM 113 H 1 1 2.889 2.731 6.788 0.00 0.00 0
ATOM 114 H 1 1 2.789 4.187 4.147 0.00 0.00 0
ATOM 115 O 1 1 10.510 34.726 13.073 0.00 0.00 0
ATOM 116 H 1 1 11.920 34.118 11.919 0.00 0.00 0
ATOM 117 H 1 1 11.295 34.968 14.741 0.00 0.00 0
ATOM 118 O 1 1 7.212 0.042 22.454 0.00 0.00 0
ATOM 119 H 1 1 6.924 0.470 24.172 0.00 0.00 0
ATOM 120 H 1 1 8.319 1.228 21.653 0.00 0.00 0
ATOM 121 O 1 1 6.365 2.010 27.544 0.00 0.00 0
ATOM 122 H 1 1 5.954 3.585 26.852 0.00 0.00 0
ATOM 123 H 1 1 7.758 2.549 28.696 0.00 0.00 0
ATOM 124 O 1 1 10.833 3.140 30.787 0.00 0.00 0
ATOM 125 H 1 1 12.697 2.975 30.867 0.00 0.00 0
ATOM 126 H 1 1 10.389 3.700 32.404 0.00 0.00 0
ATOM 127 O 1 1 8.684 9.342 3.912 0.00 0.00 0
ATOM 128 H 1 1 6.985 9.256 4.773 0.00 0.00 0
ATOM 129 H 1 1 8.684 10.809 3.011 0.00 0.00 0
ATOM 130 O 1 1 4.873 9.919 7.707 0.00 0.00 0
ATOM 131 H 1 1 3.698 9.771 6.194 0.00 0.00 0
ATOM 132 H 1 1 5.047 11.961 7.624 0.00 0.00 0
ATOM 133 O 1 1 10.031 5.018 9.699 0.00 0.00 0
ATOM 134 H 1 1 9.675 3.382 10.340 0.00 0.00 0
ATOM 135 H 1 1 9.132 5.987 10.825 0.00 0.00 0
ATOM 136 O 1 1 11.246 3.918 21.929 0.00 0.00 0
ATOM 137 H 1 1 12.614 2.770 22.341 0.00 0.00 0
ATOM 138 H 1 1 12.073 5.686 21.497 0.00 0.00 0
ATOM 139 O 1 1 6.825 7.164 25.708 0.00 0.00 0
ATOM 140 H 1 1 8.036 8.374 25.980 0.00 0.00 0
ATOM 141 H 1 1 5.206 7.900 25.891 0.00 0.00 0
ATOM 142 O 1 1 10.171 12.811 0.295 0.00 0.00 0
ATOM 143 H 1 1 10.033 12.818 -1.609 0.00 0.00 0
ATOM 144 H 1 1 9.880 14.492 0.480 0.00 0.00 0
ATOM 145 O 1 1 8.190 17.402 1.253 0.00 0.00 0
ATOM 146 H 1 1 9.472 18.531 1.253 0.00 0.00 0
ATOM 147 H 1 1 6.351 17.817 1.568 0.00 0.00 0
ATOM 148 O 1 1 11.233 16.188 8.299 0.00 0.00 0
ATOM 149 H 1 1 10.291 17.689 8.166 0.00 0.00 0
ATOM 150 H 1 1 12.768 17.123 8.733 0.00 0.00 0
ATOM 151 O 1 1 6.386 8.002 12.846 0.00 0.00 0
ATOM 152 H 1 1 7.701 8.896 13.655 0.00 0.00 0
ATOM 153 H 1 1 5.591 8.877 11.519 0.00 0.00 0
ATOM 154 O 1 1 8.184 10.419 18.848 0.00 0.00 0
ATOM 155 H 1 1 9.498 9.434 19.905 0.00 0.00 0
ATOM 156 H 1 1 6.882 9.027 18.948 0.00 0.00 0
ATOM 157 O 1 1 10.806 14.431 21.328 0.00 0.00 0
ATOM 158 H 1 1 9.177 13.531 20.670 0.00 0.00 0
ATOM 159 H 1 1 11.344 15.696 20.448 0.00 0.00 0
ATOM 160 O 1 1 9.237 13.928 30.341 0.00 0.00 0
ATOM 161 H 1 1 10.779 14.839 30.522 0.00 0.00 0
ATOM 162 H 1 1 9.965 13.192 28.899 0.00 0.00 0
ATOM 163 O 1 1 10.918 21.707 1.864 0.00 0.00 0
ATOM 164 H 1 1 10.280 23.449 2.279 0.00 0.00 0
ATOM 165 H 1 1 12.708 21.456 1.749 0.00 0.00 0
ATOM 166 O 1 1 9.353 16.125 13.927 0.00 0.00 0
ATOM 167 H 1 1 9.938 17.594 14.618 0.00 0.00 0
ATOM 168 H 1 1 9.518 16.360 12.244 0.00 0.00 0
ATOM 169 O 1 1 10.371 11.107 14.268 0.00 0.00 0
ATOM 170 H 1 1 9.644 10.406 15.859 0.00 0.00 0
ATOM 171 H 1 1 9.434 12.523 14.117 0.00 0.00 0
ATOM 172 O 1 1 3.351 22.769 20.196 0.00 0.00 0
ATOM 173 H 1 1 2.055 23.686 21.503 0.00 0.00 0
ATOM 174 H 1 1 2.452 21.401 19.413 0.00 0.00 0
ATOM 175 O 1 1 6.836 21.329 23.199 0.00 0.00 0
ATOM 176 H 1 1 8.249 20.848 22.320 0.00 0.00 0
ATOM 177 H 1 1 5.668 21.841 21.886 0.00 0.00 0
ATOM 178 O 1 1 4.604 15.649 30.043 0.00 0.00 0
ATOM 179 H 1 1 6.453 15.217 30.207 0.00 0.00 0
ATOM 180 H 1 1 3.822 14.762 31.562 0.00 0.00 0
ATOM 181 O 1 1 7.125 19.976 9.421 0.00 0.00 0
ATOM 182 H 1 1 5.918 20.453 10.730 0.00 0.00 0
ATOM 183 H 1 1 8.099 21.496 9.491 0.00 0.00 0
ATOM 184 O 1 1 9.063 25.912 13.186 0.00 0.00 0
ATOM 185 H 1 1 10.350 26.572 12.367 0.00 0.00 0
ATOM 186 H 1 1 9.680 24.367 13.697 0.00 0.00 0
ATOM 187 O 1 1 8.022 22.343 17.042 0.00 0.00 0
ATOM 188 H 1 1 9.144 23.367 18.074 0.00 0.00 0
ATOM 189 H 1 1 6.562 23.462 16.852 0.00 0.00 0
ATOM 190 O 1 1 10.762 26.285 19.963 0.00 0.00 0
ATOM 191 H 1 1 11.036 27.966 20.538 0.00 0.00 0
ATOM 192 H 1 1 11.078 25.401 21.456 0.00 0.00 0
ATOM 193 O 1 1 9.158 22.902 28.391 0.00 0.00 0
ATOM 194 H 1 1 8.219 23.528 27.085 0.00 0.00 0
ATOM 195 H 1 1 8.089 21.760 29.509 0.00 0.00 0
ATOM 196 O 1 1 6.219 20.158 31.921 0.00 0.00 0
ATOM 197 H 1 1 5.635 18.511 31.161 0.00 0.00 0
ATOM 198 H 1 1 7.530 19.624 33.071 0.00 0.00 0
ATOM 199 O 1 1 11.191 31.509 2.617 0.00 0.00 0
ATOM 200 H 1 1 10.460 32.214 4.108 0.00 0.00 0
ATOM 201 H 1 1 13.176 31.751 2.577 0.00 0.00 0
ATOM 202 O 1 1 4.748 0.055 8.605 0.00 0.00 0
ATOM 203 H 1 1 5.380 0.517 10.183 0.00 0.00 0
ATOM 204 H 1 1 6.050 -0.306 7.480 0.00 0.00 0
ATOM 205 O 1 1 8.695 30.809 15.731 0.00 0.00 0
ATOM 206 H 1 1 9.189 32.103 14.495 0.00 0.00 0
ATOM 207 H 1 1 8.447 29.069 14.868 0.00 0.00 0
ATOM 208 O 1 1 10.128 31.402 20.766 0.00 0.00 0
ATOM 209 H 1 1 9.456 30.905 19.155 0.00 0.00 0
ATOM 210 H 1 1 9.020 32.731 21.415 0.00 0.00 0
ATOM 211 O 1 1 12.238 30.162 25.837 0.00 0.00 0
ATOM 212 H 1 1 11.418 30.908 27.110 0.00 0.00 0
ATOM 213 H 1 1 12.396 31.331 24.678 0.00 0.00 0
ATOM 214 O 1 1 10.395 32.537 30.624 0.00 0.00 0
ATOM 215 H 1 1 11.042 34.339 30.751 0.00 0.00 0
ATOM 216 H 1 1 11.378 31.486 31.538 0.00 0.00 0
ATOM 217 O 1 1 10.438 3.626 5.087 0.00 0.00 0
ATOM 218 H 1 1 12.435 4.082 5.136 0.00 0.00 0
ATOM 219 H 1 1 9.822 4.284 6.681 0.00 0.00 0
ATOM 220 O 1 1 14.762 3.401 13.776 0.00 0.00 0
ATOM 221 H 1 1 16.518 3.824 13.376 0.00 0.00 0
ATOM 222 H 1 1 13.752 4.757 12.964 0.00 0.00 0
ATOM 223 O 1 1 12.382 1.012 17.643 0.00 0.00 0
ATOM 224 H 1 1 13.346 1.997 16.444 0.00 0.00 0
ATOM 225 H 1 1 11.931 2.133 18.998 0.00 0.00 0
ATOM 226 O 1 1 15.278 1.293 24.559 0.00 0.00 0
ATOM 227 H 1 1 16.071 0.946 26.365 0.00 0.00 0
ATOM 228 H 1 1 15.794 0.199 23.499 0.00 0.00 0
ATOM 229 O 1 1 22.226 31.627 24.712 0.00 0.00 0
ATOM 230 H 1 1 23.338 32.595 23.876 0.00 0.00 0
ATOM 231 H 1 1 22.161 30.053 24.132 0.00 0.00 0
ATOM 232 O 1 1 15.640 1.847 32.717 0.00 0.00 0
ATOM 233 H 1 1 17.488 2.473 31.874 0.00 0.00 0
ATOM 234 H 1 1 16.403 0.869 34.267 0.00 0.00 0
ATOM 235 O 1 1 14.858 10.199 2.754 0.00 0.00 0
ATOM 236 H 1 1 13.360 10.712 2.282 0.00 0.00 0
ATOM 237 H 1 1 14.560 9.316 4.559 0.00 0.00 0
ATOM 238 O 1 1 15.717 8.469 10.739 0.00 0.00 0
ATOM 239 H 1 1 17.323 9.581 10.875 0.00 0.00 0
ATOM 240 H 1 1 14.574 9.631 10.221 0.00 0.00 0
ATOM 241 O 1 1 15.248 10.398 16.525 0.00 0.00 0
ATOM 242 H 1 1 16.324 9.181 16.149 0.00 0.00 0
ATOM 243 H 1 1 14.172 10.488 15.098 0.00 0.00 0
ATOM 244 O 1 1 13.226 8.438 20.801 0.00 0.00 0
ATOM 245 H 1 1 14.043 8.996 19.295 0.00 0.00 0
ATOM 246 H 1 1 14.661 7.802 22.093 0.00 0.00 0
ATOM 247 O 1 1 10.173 10.961 25.875 0.00 0.00 0
ATOM 248 H 1 1 11.477 10.223 26.940 0.00 0.00 0
ATOM 249 H 1 1 11.269 10.738 24.343 0.00 0.00 0
ATOM 250 O 1 1 12.792 7.737 29.173 0.00 0.00 0
ATOM 251 H 1 1 12.199 6.038 29.475 0.00 0.00 0
ATOM 252 H 1 1 14.427 7.450 29.617 0.00 0.00 0
ATOM 253 O 1 1 15.180 19.498 3.578 0.00 0.00 0
ATOM 254 H 1 1 14.883 17.596 4.080 0.00 0.00 0
ATOM 255 H 1 1 16.754 19.579 2.626 0.00 0.00 0
ATOM 256 O 1 1 12.517 11.093 7.701 0.00 0.00 0
ATOM 257 H 1 1 12.224 12.778 7.555 0.00 0.00 0
ATOM 258 H 1 1 11.150 10.393 7.057 0.00 0.00 0
ATOM 259 O 1 1 16.266 16.271 10.758 0.00 0.00 0
ATOM 260 H 1 1 16.507 15.795 12.768 0.00 0.00 0
ATOM 261 H 1 1 17.725 16.977 10.292 0.00 0.00 0
ATOM 262 O 1 1 14.069 18.399 18.897 0.00 0.00 0
ATOM 263 H 1 1 15.513 17.523 18.155 0.00 0.00 0
ATOM 264 H 1 1 14.958 18.709 20.673 0.00 0.00 0
ATOM 265 O 1 1 14.099 15.480 25.510 0.00 0.00 0
ATOM 266 H 1 1 13.698 16.872 26.938 0.00 0.00 0
ATOM 267 H 1 1 12.567 15.379 24.444 0.00 0.00 0
ATOM 268 O 1 1 13.309 17.574 30.292 0.00 0.00 0
ATOM 269 H 1 1 14.937 16.934 30.810 0.00 0.00 0
ATOM 270 H 1 1 13.969 19.494 30.012 0.00 0.00 0
ATOM 271 O 1 1 18.371 23.257 0.925 0.00 0.00 0
ATOM 272 H 1 1 19.479 23.480 2.321 0.00 0.00 0
ATOM 273 H 1 1 19.087 24.325 -0.369 0.00 0.00 0
ATOM 274 O 1 1 12.100 21.730 11.355 0.00 0.00 0
ATOM 275 H 1 1 13.141 22.287 12.743 0.00 0.00 0
ATOM 276 H 1 1 13.467 22.236 10.244 0.00 0.00 0
ATOM 277 O 1 1 12.163 23.290 23.597 0.00 0.00 0
ATOM 278 H 1 1 11.324 22.736 24.949 0.00 0.00 0
ATOM 279 H 1 1 13.882 22.872 23.840 0.00 0.00 0
ATOM 280 O 1 1 20.173 26.761 22.628 0.00 0.00 0
ATOM 281 H 1 1 20.206 26.532 20.792 0.00 0.00 0
ATOM 282 H 1 1 21.556 25.742 23.389 0.00 0.00 0
ATOM 283 O 1 1 16.701 21.165 22.605 0.00 0.00 0
ATOM 284 H 1 1 18.028 20.686 23.848 0.00 0.00 0
ATOM 285 H 1 1 17.104 22.866 21.949 0.00 0.00 0
ATOM 286 O 1 1 11.391 26.461 33.705 0.00 0.00 0
ATOM 287 H 1 1 9.841 27.192 34.048 0.00 0.00 0
ATOM 288 H 1 1 11.776 25.540 35.243 0.00 0.00 0
ATOM 289 O 1 1 9.898 25.989 4.553 0.00 0.00 0
ATOM 290 H 1 1 8.902 26.131 6.039 0.00 0.00 0
ATOM 291 H 1 1 10.287 27.806 4.376 0.00 0.00 0
ATOM 292 O 1 1 14.308 26.960 10.877 0.00 0.00 0
ATOM 293 H 1 1 15.302 27.405 12.173 0.00 0.00 0
ATOM 294 H 1 1 15.463 26.151 9.633 0.00 0.00 0
ATOM 295 O 1 1 13.433 22.960 16.904 0.00 0.00 0
ATOM 296 H 1 1 13.409 24.131 18.132 0.00 0.00 0
ATOM 297 H 1 1 13.624 21.191 17.520 0.00 0.00 0
ATOM 298 O 1 1 16.409 26.768 26.875 0.00 0.00 0
ATOM 299 H 1 1 17.590 26.987 25.431 0.00 0.00 0
ATOM 300 H 1 1 14.751 27.703 26.230 0.00 0.00 0
ATOM 301 O 1 1 14.405 22.733 29.892 0.00 0.00 0
ATOM 302 H 1 1 15.423 23.079 28.494 0.00 0.00 0
ATOM 303 H 1 1 12.826 23.259 29.416 0.00 0.00 0
ATOM 304 O 1 1 6.905 29.408 0.749 0.00 0.00 0
ATOM 305 H 1 1 8.428 30.483 1.567 0.00 0.00 0
ATOM 306 H 1 1 6.353 30.814 -0.444 0.00 0.00 0
ATOM 307 O 1 1 9.189 34.159 6.509 0.00 0.00 0
ATOM 308 H 1 1 10.198 34.193 8.002 0.00 0.00 0
ATOM 309 H 1 1 9.890 35.692 5.785 0.00 0.00 0
ATOM 310 O 1 1 14.256 32.316 9.369 0.00 0.00 0
ATOM 311 H 1 1 15.733 32.867 9.486 0.00 0.00 0
ATOM 312 H 1 1 14.754 30.670 10.090 0.00 0.00 0
ATOM 313 O 1 1 14.714 30.841 16.516 0.00 0.00 0
ATOM 314 H 1 1 13.748 29.551 17.279 0.00 0.00 0
ATOM 315 H 1 1 13.218 31.933 16.614 0.00 0.00 0
ATOM 316 O 1 1 18.409 33.641 20.611 0.00 0.00 0
ATOM 317 H 1 1 19.601 32.274 21.115 0.00 0.00 0
ATOM 318 H 1 1 17.360 32.655 19.518 0.00 0.00 0
ATOM 319 O 1 1 16.062 28.638 32.207 0.00 0.00 0
ATOM 320 H 1 1 14.648 27.958 33.253 0.00 0.00 0
ATOM 321 H 1 1 15.752 28.014 30.522 0.00 0.00 0
ATOM 322 O 1 1 16.200 30.895 1.473 0.00 0.00 0
ATOM 323 H 1 1 16.626 29.968 -0.130 0.00 0.00 0
ATOM 324 H 1 1 17.167 29.833 2.927 0.00 0.00 0
ATOM 325 O 1 1 20.278 3.529 6.048 0.00 0.00 0
ATOM 326 H 1 1 20.977 3.611 4.575 0.00 0.00 0
ATOM 327 H 1 1 21.312 4.513 7.251 0.00 0.00 0
ATOM 328 O 1 1 23.079 5.778 10.408 0.00 0.00 0
ATOM 329 H 1 1 24.650 6.259 10.838 0.00 0.00 0
ATOM 330 H 1 1 22.342 7.609 10.178 0.00 0.00 0
ATOM 331 O 1 1 19.581 2.031 12.110 0.00 0.00 0
ATOM 332 H 1 1 19.039 1.082 10.440 0.00 0.00 0
ATOM 333 H 1 1 21.141 2.991 11.851 0.00 0.00 0
ATOM 334 O 1 1 22.005 3.223 23.178 0.00 0.00 0
ATOM 335 H 1 1 21.429 4.090 24.554 0.00 0.00 0
ATOM 336 H 1 1 20.654 1.791 22.711 0.00 0.00 0
ATOM 337 O 1 1 16.630 6.422 23.792 0.00 0.00 0
ATOM 338 H 1 1 16.219 4.804 24.406 0.00 0.00 0
ATOM 339 H 1 1 17.066 7.128 25.282 0.00 0.00 0
ATOM 340 O 1 1 21.676 5.564 28.158 0.00 0.00 0
ATOM 341 H 1 1 20.658 6.717 29.185 0.00 0.00 0
ATOM 342 H 1 1 23.413 5.828 28.996 0.00 0.00 0
ATOM 343 O 1 1 15.257 5.265 5.626 0.00 0.00 0
ATOM 344 H 1 1 16.914 4.519 5.490 0.00 0.00 0
ATOM 345 H 1 1 15.144 6.150 6.972 0.00 0.00 0
ATOM 346 O 1 1 20.137 11.082 10.437 0.00 0.00 0
ATOM 347 H 1 1 20.021 10.947 8.733 0.00 0.00 0
ATOM 348 H 1 1 21.025 12.555 10.853 0.00 0.00 0
ATOM 349 O 1 1 23.089 14.627 12.437 0.00 0.00 0
ATOM 350 H 1 1 24.716 15.254 12.736 0.00 0.00 0
ATOM 351 H 1 1 23.284 13.228 13.653 0.00 0.00 0
ATOM 352 O 1 1 24.083 12.649 22.566 0.00 0.00 0
ATOM 353 H 1 1 22.397 12.663 23.042 0.00 0.00 0
ATOM 354 H 1 1 24.901 13.851 23.565 0.00 0.00 0
ATOM 355 O 1 1 17.865 7.909 30.036 0.00 0.00 0
ATOM 356 H 1 1 17.509 8.045 31.982 0.00 0.00 0
ATOM 357 H 1 1 18.078 9.582 29.318 0.00 0.00 0
ATOM 358 O 1 1 18.824 8.486 0.104 0.00 0.00 0
ATOM 359 H 1 1 19.997 10.191 -0.057 0.00 0.00 0
ATOM 360 H 1 1 17.077 8.998 0.779 0.00 0.00 0
ATOM 361 O 1 1 20.122 9.143 5.343 0.00 0.00 0
ATOM 362 H 1 1 19.373 8.819 3.821 0.00 0.00 0
ATOM 363 H 1 1 21.998 8.776 5.128 0.00 0.00 0
ATOM 364 O 1 1 16.413 14.459 5.855 0.00 0.00 0
ATOM 365 H 1 1 15.536 13.007 5.239 0.00 0.00 0
ATOM 366 H 1 1 16.006 14.725 7.737 0.00 0.00 0
ATOM 367 O 1 1 17.561 15.066 15.654 0.00 0.00 0
ATOM 368 H 1 1 17.575 13.398 16.055 0.00 0.00 0
ATOM 369 H 1 1 18.978 15.828 16.400 0.00 0.00 0
ATOM 370 O 1 1 26.374 17.047 24.817 0.00 0.00 0
ATOM 371 H 1 1 27.983 17.098 25.632 0.00 0.00 0
ATOM 372 H 1 1 25.629 18.751 24.919 0.00 0.00 0
ATOM 373 O 1 1 19.784 12.960 28.706 0.00 0.00 0
ATOM 374 H 1 1 21.662 13.055 28.871 0.00 0.00 0
ATOM 375 H 1 1 19.545 14.070 27.143 0.00 0.00 0
ATOM 376 O 1 1 17.891 16.733 32.499 0.00 0.00 0
ATOM 377 H 1 1 18.327 15.240 31.277 0.00 0.00 0
ATOM 378 H 1 1 18.633 18.335 31.693 0.00 0.00 0
ATOM 379 O 1 1 23.733 23.024 1.663 0.00 0.00 0
ATOM 380 H 1 1 24.800 24.052 2.776 0.00 0.00 0
ATOM 381 H 1 1 24.693 22.618 0.198 0.00 0.00 0
ATOM 382 O 1 1 20.789 18.440 9.443 0.00 0.00 0
ATOM 383 H 1 1 20.766 17.257 7.881 0.00 0.00 0
ATOM 384 H 1 1 21.896 17.345 10.385 0.00 0.00 0
ATOM 385 O 1 1 21.574 17.493 17.838 0.00 0.00 0
ATOM 386 H 1 1 20.597 18.955 17.218 0.00 0.00 0
ATOM 387 H 1 1 22.538 16.874 16.251 0.00 0.00 0
ATOM 388 O 1 1 19.168 14.748 24.131 0.00 0.00 0
ATOM 389 H 1 1 19.711 16.390 23.712 0.00 0.00 0
ATOM 390 H 1 1 17.429 14.695 24.403 0.00 0.00 0
ATOM 391 O 1 1 22.149 20.198 24.977 0.00 0.00 0
ATOM 392 H 1 1 21.639 20.924 26.486 0.00 0.00 0
ATOM 393 H 1 1 22.656 21.657 24.411 0.00 0.00 0
ATOM 394 O 1 1 20.565 20.792 29.600 0.00 0.00 0
ATOM 395 H 1 1 22.264 20.409 30.214 0.00 0.00 0
ATOM 396 H 1 1 20.548 22.408 30.597 0.00 0.00 0
ATOM 397 O 1 1 20.802 26.547 9.615 0.00 0.00 0
ATOM 398 H 1 1 20.099 27.984 8.338 0.00 0.00 0
ATOM 399 H 1 1 21.277 27.539 11.325 0.00 0.00 0
ATOM 400 O 1 1 16.283 23.589 7.779 0.00 0.00 0
ATOM 401 H 1 1 16.093 21.973 6.712 0.00 0.00 0
ATOM 402 H 1 1 17.901 22.971 8.154 0.00 0.00 0
ATOM 403 O 1 1 18.469 29.798 13.568 0.00 0.00 0
ATOM 404 H 1 1 19.712 31.216 13.506 0.00 0.00 0
ATOM 405 H 1 1 16.872 30.343 14.396 0.00 0.00 0
ATOM 406 O 1 1 18.790 21.712 16.060 0.00 0.00 0
ATOM 407 H 1 1 19.878 23.090 16.485 0.00 0.00 0
ATOM 408 H 1 1 17.201 22.326 15.819 0.00 0.00 0
ATOM 409 O 1 1 21.747 26.084 16.349 0.00 0.00 0
ATOM 410 H 1 1 20.783 27.021 15.300 0.00 0.00 0
ATOM 411 H 1 1 22.705 27.328 17.206 0.00 0.00 0
ATOM 412 O 1 1 20.769 26.211 32.050 0.00 0.00 0
ATOM 413 H 1 1 21.488 27.404 33.328 0.00 0.00 0
ATOM 414 H 1 1 18.989 26.710 32.145 0.00 0.00 0
ATOM 415 O 1 1 19.820 29.181 5.559 0.00 0.00 0
ATOM 416 H 1 1 20.991 29.509 4.109 0.00 0.00 0
ATOM 417 H 1 1 19.431 31.018 6.221 0.00 0.00 0
ATOM 418 O 1 1 19.240 33.867 7.993 0.00 0.00 0
ATOM 419 H 1 1 19.107 35.039 6.604 0.00 0.00 0
ATOM 420 H 1 1 20.697 33.671 9.063 0.00 0.00 0
ATOM 421 O 1 1 22.511 34.976 15.793 0.00 0.00 0
ATOM 422 H 1 1 23.716 36.163 16.603 0.00 0.00 0
ATOM 423 H 1 1 21.699 36.150 14.467 0.00 0.00 0
ATOM 424 O 1 1 22.622 30.284 19.069 0.00 0.00 0
ATOM 425 H 1 1 22.049 31.351 17.725 0.00 0.00 0
ATOM 426 H 1 1 24.411 30.773 19.576 0.00 0.00 0
ATOM 427 O 1 1 18.639 33.611 28.369 0.00 0.00 0
ATOM 428 H 1 1 18.226 32.159 29.103 0.00 0.00 0
ATOM 429 H 1 1 19.906 33.008 27.158 0.00 0.00 0
ATOM 430 O 1 1 22.520 1.325 31.926 0.00 0.00 0
ATOM 431 H 1 1 22.803 2.668 30.796 0.00 0.00 0
ATOM 432 H 1 1 21.045 0.425 31.122 0.00 0.00 0
ATOM 433 O 1 1 21.754 3.789 1.159 0.00 0.00 0
ATOM 434 H 1 1 22.085 2.785 -0.180 0.00 0.00 0
ATOM 435 H 1 1 20.850 5.175 0.610 0.00 0.00 0
ATOM 436 O 1 1 28.457 5.539 12.133 0.00 0.00 0
ATOM 437 H 1 1 29.489 4.390 11.182 0.00 0.00 0
ATOM 438 H 1 1 29.161 7.131 12.587 0.00 0.00 0
ATOM 439 O 1 1 22.495 5.966 17.324 0.00 0.00 0
ATOM 440 H 1 1 24.377 5.379 17.393 0.00 0.00 0
ATOM 441 H 1 1 21.906 5.491 18.857 0.00 0.00 0
ATOM 442 O 1 1 28.128 3.304 22.287 0.00 0.00 0
ATOM 443 H 1 1 28.123 2.999 20.491 0.00 0.00 0
ATOM 444 H 1 1 26.533 3.355 22.876 0.00 0.00 0
ATOM 445 O 1 1 28.378 10.455 27.266 0.00 0.00 0
ATOM 446 H 1 1 30.019 10.292 28.051 0.00 0.00 0
ATOM 447 H 1 1 28.635 10.039 25.463 0.00 0.00 0
ATOM 448 O 1 1 27.031 8.353 34.806 0.00 0.00 0
ATOM 449 H 1 1 26.116 9.984 34.571 0.00 0.00 0
ATOM 450 H 1 1 28.685 8.951 34.739 0.00 0.00 0
ATOM 451 O 1 1 24.951 8.160 4.454 0.00 0.00 0
ATOM 452 H 1 1 25.930 9.616 5.160 0.00 0.00 0
ATOM 453 H 1 1 25.947 7.994 2.724 0.00 0.00 0
ATOM 454 O 1 1 26.937 12.436 6.869 0.00 0.00 0
ATOM 455 H 1 1 25.492 13.284 6.708 0.00 0.00 0
ATOM 456 H 1 1 27.689 13.332 8.266 0.00 0.00 0
ATOM 457 O 1 1 23.365 11.214 16.933 0.00 0.00 0
ATOM 458 H 1 1 22.247 9.744 16.789 0.00 0.00 0
ATOM 459 H 1 1 23.264 12.035 18.539 0.00 0.00 0
ATOM 460 O 1 1 28.321 8.759 22.158 0.00 0.00 0
ATOM 461 H 1 1 27.662 6.895 22.482 0.00 0.00 0
ATOM 462 H 1 1 26.971 9.710 21.902 0.00 0.00 0
ATOM 463 O 1 1 27.071 6.109 29.555 0.00 0.00 0
ATOM 464 H 1 1 27.591 7.663 28.857 0.00 0.00 0
ATOM 465 H 1 1 27.304 6.320 31.261 0.00 0.00 0
ATOM 466 O 1 1 22.474 11.704 34.640 0.00 0.00 0
ATOM 467 H 1 1 22.752 13.304 35.584 0.00 0.00 0
ATOM 468 H 1 1 22.840 12.090 33.030 0.00 0.00 0
ATOM 469 O 1 1 21.656 14.971 5.615 0.00 0.00 0
ATOM 470 H 1 1 21.690 15.860 3.977 0.00 0.00 0
ATOM 471 H 1 1 19.964 14.225 5.774 0.00 0.00 0
ATOM 472 O 1 1 28.539 21.492 9.820 0.00 0.00 0
ATOM 473 H 1 1 27.288 22.181 8.688 0.00 0.00 0
ATOM 474 H 1 1 28.065 22.420 11.602 0.00 0.00 0
ATOM 475 O 1 1 28.364 16.020 11.109 0.00 0.00 0
ATOM 476 H 1 1 30.033 16.649 12.089 0.00 0.00 0
ATOM 477 H 1 1 28.456 17.440 10.082 0.00 0.00 0
ATOM 478 O 1 1 0.054 13.686 18.103 0.00 0.00 0
ATOM 479 H 1 1 -1.714 12.928 18.841 0.00 0.00 0
ATOM 480 H 1 1 1.008 12.429 17.383 0.00 0.00 0
ATOM 481 O 1 1 24.636 12.894 29.957 0.00 0.00 0
ATOM 482 H 1 1 25.906 13.914 31.183 0.00 0.00 0
ATOM 483 H 1 1 25.641 11.609 29.162 0.00 0.00 0
ATOM 484 O 1 1 21.548 17.250 0.749 0.00 0.00 0
ATOM 485 H 1 1 21.843 19.026 0.905 0.00 0.00 0
ATOM 486 H 1 1 20.385 16.716 -0.697 0.00 0.00 0
ATOM 487 O 1 1 26.095 27.274 4.520 0.00 0.00 0
ATOM 488 H 1 1 27.889 26.458 4.505 0.00 0.00 0
ATOM 489 H 1 1 25.648 26.970 6.165 0.00 0.00 0
ATOM 490 O 1 1 23.610 22.515 8.008 0.00 0.00 0
ATOM 491 H 1 1 22.653 21.187 8.739 0.00 0.00 0
ATOM 492 H 1 1 22.286 24.095 8.444 0.00 0.00 0
ATOM 493 O 1 1 27.355 18.929 18.180 0.00 0.00 0
ATOM 494 H 1 1 27.200 20.349 17.155 0.00 0.00 0
ATOM 495 H 1 1 25.579 18.322 18.770 0.00 0.00 0
ATOM 496 O 1 1 26.765 23.633 14.444 0.00 0.00 0
ATOM 497 H 1 1 27.441 25.298 13.651 0.00 0.00 0
ATOM 498 H 1 1 25.086 24.256 14.749 0.00 0.00 0
ATOM 499 O 1 1 31.478 20.769 20.986 0.00 0.00 0
ATOM 500 H 1 1 30.440 22.509 21.135 0.00 0.00 0
ATOM 501 H 1 1 30.567 19.656 20.043 0.00 0.00 0
ATOM 502 O 1 1 24.812 20.412 32.668 0.00 0.00 0
ATOM 503 H 1 1 26.242 21.478 31.874 0.00 0.00 0
ATOM 504 H 1 1 25.787 19.023 33.158 0.00 0.00 0
ATOM 505 O 1 1 22.105 29.076 0.928 0.00 0.00 0
ATOM 506 H 1 1 23.296 27.923 1.739 0.00 0.00 0
ATOM 507 H 1 1 22.623 30.994 0.882 0.00 0.00 0
ATOM 508 O 1 1 29.572 31.256 8.626 0.00 0.00 0
ATOM 509 H 1 1 30.795 30.203 7.736 0.00 0.00 0
ATOM 510 H 1 1 28.277 31.519 7.260 0.00 0.00 0
ATOM 511 O 1 1 31.817 34.843 18.283 0.00 0.00 0
ATOM 512 H 1 1 32.438 34.389 16.474 0.00 0.00 0
ATOM 513 H 1 1 32.743 36.422 18.341 0.00 0.00 0
ATOM 514 O 1 1 27.915 25.601 19.033 0.00 0.00 0
ATOM 515 H 1 1 29.358 26.561 19.190 0.00 0.00 0
ATOM 516 H 1 1 28.148 24.429 17.530 0.00 0.00 0
ATOM 517 O 1 1 24.548 24.654 24.025 0.00 0.00 0
ATOM 518 H 1 1 25.528 25.635 22.824 0.00 0.00 0
ATOM 519 H 1 1 25.300 25.200 25.645 0.00 0.00 0
ATOM 520 O 1 1 28.540 22.922 30.370 0.00 0.00 0
ATOM 521 H 1 1 27.414 24.096 29.781 0.00 0.00 0
ATOM 522 H 1 1 29.674 23.914 31.873 0.00 0.00 0
ATOM 523 O 1 1 24.969 33.623 1.014 0.00 0.00 0
ATOM 524 H 1 1 26.521 33.058 1.518 0.00 0.00 0
ATOM 525 H 1 1 24.990 34.322 -0.683 0.00 0.00 0
ATOM 526 O 1 1 23.075 32.171 11.324 0.00 0.00 0
ATOM 527 H 1 1 23.316 32.775 13.097 0.00 0.00 0
ATOM 528 H 1 1 24.460 33.203 10.662 0.00 0.00 0
ATOM 529 O 1 1 27.497 2.736 17.224 0.00 0.00 0
ATOM 530 H 1 1 28.397 3.415 15.715 0.00 0.00 0
ATOM 531 H 1 1 28.234 1.233 17.412 0.00 0.00 0
ATOM 532 O 1 1 26.369 33.060 22.077 0.00 0.00 0
ATOM 533 H 1 1 26.170 34.746 22.264 0.00 0.00 0
ATOM 534 H 1 1 27.592 32.404 23.321 0.00 0.00 0
ATOM 535 O 1 1 30.221 30.950 25.843 0.00 0.00 0
ATOM 536 H 1 1 30.305 29.038 26.208 0.00 0.00 0
ATOM 537 H 1 1 30.363 31.979 27.414 0.00 0.00 0
ATOM 538 O 1 1 24.973 26.732 28.607 0.00 0.00 0
ATOM 539 H 1 1 25.385 28.369 29.248 0.00 0.00 0
ATOM 540 H 1 1 23.330 26.597 29.234 0.00 0.00 0
ATOM 541 O 1 1 32.165 4.857 2.258 0.00 0.00 0
ATOM 542 H 1 1 32.417 6.195 1.157 0.00 0.00 0
ATOM 543 H 1 1 32.615 3.727 1.112 0.00 0.00 0
ATOM 544 O 1 1 28.067 3.533 5.217 0.00 0.00 0
ATOM 545 H 1 1 26.960 4.447 4.158 0.00 0.00 0
ATOM 546 H 1 1 29.875 3.863 4.448 0.00 0.00 0
ATOM 547 O 1 1 33.279 2.782 13.028 0.00 0.00 0
ATOM 548 H 1 1 33.708 3.955 11.817 0.00 0.00 0
ATOM 549 H 1 1 33.656 3.545 14.631 0.00 0.00 0
ATOM 550 O 1 1 34.278 4.944 17.492 0.00 0.00 0
ATOM 551 H 1 1 33.438 6.563 17.876 0.00 0.00 0
ATOM 552 H 1 1 34.906 4.452 18.995 0.00 0.00 0
ATOM 553 O 1 1 32.363 1.908 26.092 0.00 0.00 0
ATOM 554 H 1 1 31.941 1.683 24.268 0.00 0.00 0
ATOM 555 H 1 1 33.850 1.390 26.904 0.00 0.00 0
ATOM 556 O 1 1 27.982 0.418 28.241 0.00 0.00 0
ATOM 557 H 1 1 27.516 2.080 28.309 0.00 0.00 0
ATOM 558 H 1 1 29.593 0.176 27.299 0.00 0.00 0
ATOM 559 O 1 1 28.845 14.672 2.724 0.00 0.00 0
ATOM 560 H 1 1 27.963 13.930 4.139 0.00 0.00 0
ATOM 561 H 1 1 30.386 15.714 3.379 0.00 0.00 0
ATOM 562 O 1 1 28.083 10.618 14.298 0.00 0.00 0
ATOM 563 H 1 1 28.623 12.160 13.293 0.00 0.00 0
ATOM 564 H 1 1 26.486 11.015 15.379 0.00 0.00 0
ATOM 565 O 1 1 33.867 10.545 13.306 0.00 0.00 0
ATOM 566 H 1 1 35.165 9.612 13.810 0.00 0.00 0
ATOM 567 H 1 1 33.615 10.270 11.513 0.00 0.00 0
ATOM 568 O 1 1 31.790 9.696 18.223 0.00 0.00 0
ATOM 569 H 1 1 30.484 9.334 19.421 0.00 0.00 0
ATOM 570 H 1 1 30.834 10.096 16.929 0.00 0.00 0
ATOM 571 O 1 1 30.141 15.006 21.532 0.00 0.00 0
ATOM 572 H 1 1 28.565 15.594 22.099 0.00 0.00 0
ATOM 573 H 1 1 30.942 14.253 23.077 0.00 0.00 0
ATOM 574 O 1 1 32.798 10.732 30.680 0.00 0.00 0
ATOM 575 H 1 1 34.073 9.528 30.799 0.00 0.00 0
ATOM 576 H 1 1 32.991 11.512 28.983 0.00 0.00 0
ATOM 577 O 1 1 33.652 16.265 5.086 0.00 0.00 0
ATOM 578 H 1 1 35.399 16.239 4.730 0.00 0.00 0
ATOM 579 H 1 1 33.503 17.939 5.631 0.00 0.00 0
ATOM 580 O 1 1 31.947 10.799 7.943 0.00 0.00 0
ATOM 581 H 1 1 29.894 10.549 7.619 0.00 0.00 0
ATOM 582 H 1 1 32.271 12.414 7.075 0.00 0.00 0
ATOM 583 O 1 1 0.329 15.516 11.746 0.00 0.00 0
ATOM 584 H 1 1 -0.446 14.249 12.939 0.00 0.00 0
ATOM 585 H 1 1 -0.685 17.018 11.935 0.00 0.00 0
ATOM 586 O 1 1 4.262 19.165 14.308 0.00 0.00 0
ATOM 587 H 1 1 3.579 17.691 14.920 0.00 0.00 0
ATOM 588 H 1 1 5.723 19.183 15.204 0.00 0.00 0
ATOM 589 O 1 1 32.995 13.546 25.948 0.00 0.00 0
ATOM 590 H 1 1 32.167 15.060 26.787 0.00 0.00 0
ATOM 591 H 1 1 34.425 13.800 25.007 0.00 0.00 0
ATOM 592 O 1 1 1.773 13.524 34.037 0.00 0.00 0
ATOM 593 H 1 1 0.227 14.409 33.446 0.00 0.00 0
ATOM 594 H 1 1 2.167 14.670 35.511 0.00 0.00 0
ATOM 595 O 1 1 33.029 20.529 7.247 0.00 0.00 0
ATOM 596 H 1 1 34.388 21.414 8.003 0.00 0.00 0
ATOM 597 H 1 1 31.451 20.831 8.182 0.00 0.00 0
ATOM 598 O 1 1 2.037 24.250 10.251 0.00 0.00 0
ATOM 599 H 1 1 3.743 25.008 9.876 0.00 0.00 0
ATOM 600 H 1 1 1.894 25.043 11.903 0.00 0.00 0
ATOM 601 O 1 1 32.753 19.259 13.976 0.00 0.00 0
ATOM 602 H 1 1 32.792 20.886 13.792 0.00 0.00 0
ATOM 603 H 1 1 34.334 18.799 14.976 0.00 0.00 0
ATOM 604 O 1 1 0.396 18.673 18.699 0.00 0.00 0
ATOM 605 H 1 1 -1.211 18.950 19.127 0.00 0.00 0
ATOM 606 H 1 1 0.469 16.977 18.436 0.00 0.00 0
ATOM 607 O 1 1 30.855 18.370 27.959 0.00 0.00 0
ATOM 608 H 1 1 29.759 19.681 28.690 0.00 0.00 0
ATOM 609 H 1 1 32.103 19.477 26.763 0.00 0.00 0
ATOM 610 O 1 1 27.723 15.992 33.091 0.00 0.00 0
ATOM 611 H 1 1 29.390 16.423 32.192 0.00 0.00 0
ATOM 612 H 1 1 27.801 15.859 34.804 0.00 0.00 0
ATOM 613 O 1 1 31.068 27.895 3.348 0.00 0.00 0
ATOM 614 H 1 1 32.517 27.825 4.610 0.00 0.00 0
ATOM 615 H 1 1 31.529 29.459 2.324 0.00 0.00 0
ATOM 616 O 1 1 35.039 28.008 6.663 0.00 0.00 0
ATOM 617 H 1 1 35.966 26.934 7.683 0.00 0.00 0
ATOM 618 H 1 1 36.055 28.336 5.336 0.00 0.00 0
ATOM 619 O 1 1 29.356 28.196 13.025 0.00 0.00 0
ATOM 620 H 1 1 29.210 29.335 14.589 0.00 0.00 0
ATOM 621 H 1 1 28.874 29.629 11.867 0.00 0.00 0
ATOM 622 O 1 1 32.386 28.434 18.961 0.00 0.00 0
ATOM 623 H 1 1 33.368 28.574 20.411 0.00 0.00 0
ATOM 624 H 1 1 33.410 27.406 17.949 0.00 0.00 0
ATOM 625 O 1 1 30.898 25.390 25.799 0.00 0.00 0
ATOM 626 H 1 1 32.369 25.913 24.580 0.00 0.00 0
ATOM 627 H 1 1 31.317 24.075 27.029 0.00 0.00 0
ATOM 628 O 1 1 32.259 25.611 33.104 0.00 0.00 0
ATOM 629 H 1 1 32.238 25.736 34.806 0.00 0.00 0
ATOM 630 H 1 1 33.920 25.042 32.775 0.00 0.00 0
ATOM 631 O 1 1 30.290 32.645 1.341 0.00 0.00 0
ATOM 632 H 1 1 29.949 32.793 -0.430 0.00 0.00 0
ATOM 633 H 1 1 31.762 33.340 1.847 0.00 0.00 0
ATOM 634 O 1 1 25.536 34.235 6.469 0.00 0.00 0
ATOM 635 H 1 1 25.716 36.059 6.651 0.00 0.00 0
ATOM 636 H 1 1 25.283 33.866 4.895 0.00 0.00 0
ATOM 637 O 1 1 31.674 33.161 13.106 0.00 0.00 0
ATOM 638 H 1 1 31.793 34.863 13.281 0.00 0.00 0
ATOM 639 H 1 1 30.425 32.928 11.783 0.00 0.00 0
ATOM 640 O 1 1 33.844 32.668 22.296 0.00 0.00 0
ATOM 641 H 1 1 32.750 32.234 23.524 0.00 0.00 0
ATOM 642 H 1 1 32.917 32.875 20.736 0.00 0.00 0
ATOM 643 O 1 1 31.603 30.542 30.805 0.00 0.00 0
ATOM 644 H 1 1 33.451 30.804 30.468 0.00 0.00 0
ATOM 645 H 1 1 31.575 28.816 31.756 0.00 0.00 0
ATOM 646 O 1 1 26.295 31.235 30.599 0.00 0.00 0
ATOM 647 H 1 1 27.834 30.515 30.607 0.00 0.00 0
ATOM 648 H 1 1 26.362 32.920 29.856 0.00 0.00 0
END

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,33 @@
units electron
atom_style full
#pair_style lj/cut/coul/long 17.01
pair_style lj/cut/tip4p/long 1 2 1 1 0.278072379 17.007
bond_style harmonic
#bond_style class2
angle_style harmonic
#kspace_style pppm 0.0001
kspace_style pppm/tip4p 0.0001
read_data data.water_longrange
pair_coeff * * 0 0
pair_coeff 1 1 0.000295147 5.96946
neighbor 2.0 bin
neigh_modify delay 0 every 1 check yes
timestep 0.00025
#velocity all create 298.0 2345187
#thermo_style multi
#thermo 1
#fix 1 all nvt temp 298.0 298.0 30.0 tchain 1
#fix 1 all nve
fix 1 all ipi rpc_long 32347 unix
#dump 1 all xyz 25 dump.xyz
run 100000000

View File

@ -0,0 +1,34 @@
units electron
atom_style full
pair_style lj/cut 0.51
#pair_style lj/cut/tip4p/long 1 2 1 1 0.278072379 17.007
#bond_style harmonic
bond_style class2
angle_style harmonic
#kspace_style pppm 0.0001
#kspace_style pppm/tip4p 0.0001
read_data data.water_shortrange
pair_coeff * * 0 0.1
#pair_coeff 1 1 0.000295147 5.96946
#atom_modify sort 1 3.00
neighbor 2.0 bin
neigh_modify delay 0 every 1 check yes
timestep 0.00025
#velocity all create 298.0 2345187
#thermo_style multi
#thermo 1
#fix 1 all nvt temp 298.0 298.0 30.0 tchain 1
#fix 1 all nve
fix 1 all ipi rpc_short 32346 unix
#dump 1 all xyz 25 dump.xyz
run 100000000

View File

@ -0,0 +1,27 @@
<simulation>
<initialize nbeads='32'>
<file mode='pdb'> water_298K.pdb </file>
<velocities mode="thermal" units='kelvin'> 298 </velocities>
</initialize>
<output prefix='rpc'>
<properties stride='1' filename='out'> [ step, time{picosecond}, conserved, temperature{kelvin}, kinetic_cv, potential, pressure_cv{megapascal}] </properties>
<trajectory filename='pos' stride='20'> positions </trajectory>
</output>
<total_steps>500000</total_steps>
<prng><seed>32346</seed></prng>
<forces>
<socket mode='unix'>
<address>rpc_short</address>
</socket>
<socket mode='unix' nbeads='5'>
<address> rpc_long </address>
</socket>
</forces>
<ensemble mode='nvt'>
<thermostat mode='svr'>
<tau units='femtosecond'>25</tau>
</thermostat>
<timestep units='femtosecond'> 0.25</timestep>
<temperature units='kelvin'>298</temperature>
</ensemble>
</simulation>

View File

@ -0,0 +1,650 @@
CRYST 35.233 35.233 35.233 90.00 90.00 90.00 P 1 1
ATOM 1 O 1 1 3.846 5.672 1.323 0.00 0.00 0
ATOM 2 H 1 1 2.979 7.054 0.857 0.00 0.00 0
ATOM 3 H 1 1 5.525 5.697 0.451 0.00 0.00 0
ATOM 4 O 1 1 34.557 34.341 3.078 0.00 0.00 0
ATOM 5 H 1 1 33.722 34.689 4.840 0.00 0.00 0
ATOM 6 H 1 1 36.029 33.220 3.711 0.00 0.00 0
ATOM 7 O 1 1 5.591 1.963 13.477 0.00 0.00 0
ATOM 8 H 1 1 7.265 1.864 13.851 0.00 0.00 0
ATOM 9 H 1 1 5.009 3.555 13.916 0.00 0.00 0
ATOM 10 O 1 1 1.060 2.061 21.718 0.00 0.00 0
ATOM 11 H 1 1 0.757 0.261 21.820 0.00 0.00 0
ATOM 12 H 1 1 0.213 3.013 23.047 0.00 0.00 0
ATOM 13 O 1 1 1.200 1.337 29.006 0.00 0.00 0
ATOM 14 H 1 1 0.818 1.884 30.732 0.00 0.00 0
ATOM 15 H 1 1 2.883 1.825 29.011 0.00 0.00 0
ATOM 16 O 1 1 1.331 1.386 34.306 0.00 0.00 0
ATOM 17 H 1 1 2.392 2.898 34.846 0.00 0.00 0
ATOM 18 H 1 1 0.814 0.532 35.836 0.00 0.00 0
ATOM 19 O 1 1 31.451 10.201 0.726 0.00 0.00 0
ATOM 20 H 1 1 32.282 10.877 -0.750 0.00 0.00 0
ATOM 21 H 1 1 30.920 11.594 1.677 0.00 0.00 0
ATOM 22 O 1 1 0.836 10.808 4.298 0.00 0.00 0
ATOM 23 H 1 1 0.305 10.643 2.793 0.00 0.00 0
ATOM 24 H 1 1 -0.356 10.334 5.524 0.00 0.00 0
ATOM 25 O 1 1 34.381 5.979 9.194 0.00 0.00 0
ATOM 26 H 1 1 33.616 7.673 8.857 0.00 0.00 0
ATOM 27 H 1 1 35.115 5.260 7.618 0.00 0.00 0
ATOM 28 O 1 1 33.212 6.480 24.278 0.00 0.00 0
ATOM 29 H 1 1 31.624 6.908 23.521 0.00 0.00 0
ATOM 30 H 1 1 32.544 4.990 24.982 0.00 0.00 0
ATOM 31 O 1 1 1.992 9.002 26.863 0.00 0.00 0
ATOM 32 H 1 1 1.856 10.175 25.579 0.00 0.00 0
ATOM 33 H 1 1 0.519 8.099 26.386 0.00 0.00 0
ATOM 34 O 1 1 2.054 8.660 32.515 0.00 0.00 0
ATOM 35 H 1 1 2.167 8.727 30.494 0.00 0.00 0
ATOM 36 H 1 1 2.374 10.513 33.038 0.00 0.00 0
ATOM 37 O 1 1 3.402 16.639 3.008 0.00 0.00 0
ATOM 38 H 1 1 4.127 15.872 4.446 0.00 0.00 0
ATOM 39 H 1 1 2.905 18.339 3.160 0.00 0.00 0
ATOM 40 O 1 1 4.222 15.444 8.072 0.00 0.00 0
ATOM 41 H 1 1 5.211 16.756 8.299 0.00 0.00 0
ATOM 42 H 1 1 2.560 15.492 8.860 0.00 0.00 0
ATOM 43 O 1 1 2.831 9.246 16.488 0.00 0.00 0
ATOM 44 H 1 1 2.869 8.023 18.050 0.00 0.00 0
ATOM 45 H 1 1 3.960 8.467 15.154 0.00 0.00 0
ATOM 46 O 1 1 5.563 6.003 20.907 0.00 0.00 0
ATOM 47 H 1 1 4.653 4.638 21.480 0.00 0.00 0
ATOM 48 H 1 1 6.405 6.208 22.529 0.00 0.00 0
ATOM 49 O 1 1 2.087 13.370 22.913 0.00 0.00 0
ATOM 50 H 1 1 2.832 14.804 23.422 0.00 0.00 0
ATOM 51 H 1 1 1.434 13.509 21.196 0.00 0.00 0
ATOM 52 O 1 1 3.369 17.886 25.109 0.00 0.00 0
ATOM 53 H 1 1 3.655 17.200 26.766 0.00 0.00 0
ATOM 54 H 1 1 4.772 18.977 24.500 0.00 0.00 0
ATOM 55 O 1 1 34.764 20.803 0.948 0.00 0.00 0
ATOM 56 H 1 1 35.210 21.267 2.816 0.00 0.00 0
ATOM 57 H 1 1 35.962 21.726 0.131 0.00 0.00 0
ATOM 58 O 1 1 2.836 24.178 15.229 0.00 0.00 0
ATOM 59 H 1 1 2.795 22.346 14.876 0.00 0.00 0
ATOM 60 H 1 1 2.414 24.115 17.130 0.00 0.00 0
ATOM 61 O 1 1 33.000 24.481 15.230 0.00 0.00 0
ATOM 62 H 1 1 34.640 24.804 15.013 0.00 0.00 0
ATOM 63 H 1 1 32.401 25.764 14.295 0.00 0.00 0
ATOM 64 O 1 1 0.404 26.779 23.400 0.00 0.00 0
ATOM 65 H 1 1 1.353 27.248 24.987 0.00 0.00 0
ATOM 66 H 1 1 1.546 28.050 22.317 0.00 0.00 0
ATOM 67 O 1 1 34.222 21.380 25.418 0.00 0.00 0
ATOM 68 H 1 1 35.669 20.151 25.317 0.00 0.00 0
ATOM 69 H 1 1 32.960 21.180 23.992 0.00 0.00 0
ATOM 70 O 1 1 33.259 17.438 32.480 0.00 0.00 0
ATOM 71 H 1 1 33.314 18.782 33.883 0.00 0.00 0
ATOM 72 H 1 1 32.743 18.181 30.871 0.00 0.00 0
ATOM 73 O 1 1 4.463 21.979 3.936 0.00 0.00 0
ATOM 74 H 1 1 5.856 23.084 3.400 0.00 0.00 0
ATOM 75 H 1 1 3.986 22.180 5.602 0.00 0.00 0
ATOM 76 O 1 1 6.258 25.851 8.520 0.00 0.00 0
ATOM 77 H 1 1 5.767 27.693 8.476 0.00 0.00 0
ATOM 78 H 1 1 7.202 25.506 10.186 0.00 0.00 0
ATOM 79 O 1 1 0.601 29.737 12.747 0.00 0.00 0
ATOM 80 H 1 1 -0.685 30.842 12.350 0.00 0.00 0
ATOM 81 H 1 1 1.336 30.716 14.031 0.00 0.00 0
ATOM 82 O 1 1 7.563 28.191 24.333 0.00 0.00 0
ATOM 83 H 1 1 9.201 28.828 24.684 0.00 0.00 0
ATOM 84 H 1 1 7.381 27.621 22.799 0.00 0.00 0
ATOM 85 O 1 1 3.653 27.109 27.772 0.00 0.00 0
ATOM 86 H 1 1 5.126 27.015 26.772 0.00 0.00 0
ATOM 87 H 1 1 3.031 28.756 27.698 0.00 0.00 0
ATOM 88 O 1 1 2.596 23.991 32.476 0.00 0.00 0
ATOM 89 H 1 1 2.879 24.791 30.859 0.00 0.00 0
ATOM 90 H 1 1 4.003 22.913 32.701 0.00 0.00 0
ATOM 91 O 1 1 3.083 31.317 3.644 0.00 0.00 0
ATOM 92 H 1 1 4.133 30.589 2.539 0.00 0.00 0
ATOM 93 H 1 1 4.218 32.173 5.037 0.00 0.00 0
ATOM 94 O 1 1 4.661 30.555 9.368 0.00 0.00 0
ATOM 95 H 1 1 3.184 29.843 10.132 0.00 0.00 0
ATOM 96 H 1 1 4.358 32.448 9.126 0.00 0.00 0
ATOM 97 O 1 1 3.465 32.537 15.778 0.00 0.00 0
ATOM 98 H 1 1 5.072 31.819 15.903 0.00 0.00 0
ATOM 99 H 1 1 4.055 34.257 15.284 0.00 0.00 0
ATOM 100 O 1 1 4.215 29.153 20.317 0.00 0.00 0
ATOM 101 H 1 1 3.658 30.176 18.842 0.00 0.00 0
ATOM 102 H 1 1 4.959 30.291 21.449 0.00 0.00 0
ATOM 103 O 1 1 1.126 31.333 28.768 0.00 0.00 0
ATOM 104 H 1 1 2.395 31.124 29.925 0.00 0.00 0
ATOM 105 H 1 1 0.768 33.092 28.898 0.00 0.00 0
ATOM 106 O 1 1 4.881 32.616 32.302 0.00 0.00 0
ATOM 107 H 1 1 6.588 32.911 31.725 0.00 0.00 0
ATOM 108 H 1 1 4.486 34.037 33.249 0.00 0.00 0
ATOM 109 O 1 1 8.962 5.556 0.151 0.00 0.00 0
ATOM 110 H 1 1 9.652 6.991 0.859 0.00 0.00 0
ATOM 111 H 1 1 9.173 4.477 1.645 0.00 0.00 0
ATOM 112 O 1 1 1.833 3.518 5.679 0.00 0.00 0
ATOM 113 H 1 1 2.889 2.731 6.788 0.00 0.00 0
ATOM 114 H 1 1 2.789 4.187 4.147 0.00 0.00 0
ATOM 115 O 1 1 10.510 34.726 13.073 0.00 0.00 0
ATOM 116 H 1 1 11.920 34.118 11.919 0.00 0.00 0
ATOM 117 H 1 1 11.295 34.968 14.741 0.00 0.00 0
ATOM 118 O 1 1 7.212 0.042 22.454 0.00 0.00 0
ATOM 119 H 1 1 6.924 0.470 24.172 0.00 0.00 0
ATOM 120 H 1 1 8.319 1.228 21.653 0.00 0.00 0
ATOM 121 O 1 1 6.365 2.010 27.544 0.00 0.00 0
ATOM 122 H 1 1 5.954 3.585 26.852 0.00 0.00 0
ATOM 123 H 1 1 7.758 2.549 28.696 0.00 0.00 0
ATOM 124 O 1 1 10.833 3.140 30.787 0.00 0.00 0
ATOM 125 H 1 1 12.697 2.975 30.867 0.00 0.00 0
ATOM 126 H 1 1 10.389 3.700 32.404 0.00 0.00 0
ATOM 127 O 1 1 8.684 9.342 3.912 0.00 0.00 0
ATOM 128 H 1 1 6.985 9.256 4.773 0.00 0.00 0
ATOM 129 H 1 1 8.684 10.809 3.011 0.00 0.00 0
ATOM 130 O 1 1 4.873 9.919 7.707 0.00 0.00 0
ATOM 131 H 1 1 3.698 9.771 6.194 0.00 0.00 0
ATOM 132 H 1 1 5.047 11.961 7.624 0.00 0.00 0
ATOM 133 O 1 1 10.031 5.018 9.699 0.00 0.00 0
ATOM 134 H 1 1 9.675 3.382 10.340 0.00 0.00 0
ATOM 135 H 1 1 9.132 5.987 10.825 0.00 0.00 0
ATOM 136 O 1 1 11.246 3.918 21.929 0.00 0.00 0
ATOM 137 H 1 1 12.614 2.770 22.341 0.00 0.00 0
ATOM 138 H 1 1 12.073 5.686 21.497 0.00 0.00 0
ATOM 139 O 1 1 6.825 7.164 25.708 0.00 0.00 0
ATOM 140 H 1 1 8.036 8.374 25.980 0.00 0.00 0
ATOM 141 H 1 1 5.206 7.900 25.891 0.00 0.00 0
ATOM 142 O 1 1 10.171 12.811 0.295 0.00 0.00 0
ATOM 143 H 1 1 10.033 12.818 -1.609 0.00 0.00 0
ATOM 144 H 1 1 9.880 14.492 0.480 0.00 0.00 0
ATOM 145 O 1 1 8.190 17.402 1.253 0.00 0.00 0
ATOM 146 H 1 1 9.472 18.531 1.253 0.00 0.00 0
ATOM 147 H 1 1 6.351 17.817 1.568 0.00 0.00 0
ATOM 148 O 1 1 11.233 16.188 8.299 0.00 0.00 0
ATOM 149 H 1 1 10.291 17.689 8.166 0.00 0.00 0
ATOM 150 H 1 1 12.768 17.123 8.733 0.00 0.00 0
ATOM 151 O 1 1 6.386 8.002 12.846 0.00 0.00 0
ATOM 152 H 1 1 7.701 8.896 13.655 0.00 0.00 0
ATOM 153 H 1 1 5.591 8.877 11.519 0.00 0.00 0
ATOM 154 O 1 1 8.184 10.419 18.848 0.00 0.00 0
ATOM 155 H 1 1 9.498 9.434 19.905 0.00 0.00 0
ATOM 156 H 1 1 6.882 9.027 18.948 0.00 0.00 0
ATOM 157 O 1 1 10.806 14.431 21.328 0.00 0.00 0
ATOM 158 H 1 1 9.177 13.531 20.670 0.00 0.00 0
ATOM 159 H 1 1 11.344 15.696 20.448 0.00 0.00 0
ATOM 160 O 1 1 9.237 13.928 30.341 0.00 0.00 0
ATOM 161 H 1 1 10.779 14.839 30.522 0.00 0.00 0
ATOM 162 H 1 1 9.965 13.192 28.899 0.00 0.00 0
ATOM 163 O 1 1 10.918 21.707 1.864 0.00 0.00 0
ATOM 164 H 1 1 10.280 23.449 2.279 0.00 0.00 0
ATOM 165 H 1 1 12.708 21.456 1.749 0.00 0.00 0
ATOM 166 O 1 1 9.353 16.125 13.927 0.00 0.00 0
ATOM 167 H 1 1 9.938 17.594 14.618 0.00 0.00 0
ATOM 168 H 1 1 9.518 16.360 12.244 0.00 0.00 0
ATOM 169 O 1 1 10.371 11.107 14.268 0.00 0.00 0
ATOM 170 H 1 1 9.644 10.406 15.859 0.00 0.00 0
ATOM 171 H 1 1 9.434 12.523 14.117 0.00 0.00 0
ATOM 172 O 1 1 3.351 22.769 20.196 0.00 0.00 0
ATOM 173 H 1 1 2.055 23.686 21.503 0.00 0.00 0
ATOM 174 H 1 1 2.452 21.401 19.413 0.00 0.00 0
ATOM 175 O 1 1 6.836 21.329 23.199 0.00 0.00 0
ATOM 176 H 1 1 8.249 20.848 22.320 0.00 0.00 0
ATOM 177 H 1 1 5.668 21.841 21.886 0.00 0.00 0
ATOM 178 O 1 1 4.604 15.649 30.043 0.00 0.00 0
ATOM 179 H 1 1 6.453 15.217 30.207 0.00 0.00 0
ATOM 180 H 1 1 3.822 14.762 31.562 0.00 0.00 0
ATOM 181 O 1 1 7.125 19.976 9.421 0.00 0.00 0
ATOM 182 H 1 1 5.918 20.453 10.730 0.00 0.00 0
ATOM 183 H 1 1 8.099 21.496 9.491 0.00 0.00 0
ATOM 184 O 1 1 9.063 25.912 13.186 0.00 0.00 0
ATOM 185 H 1 1 10.350 26.572 12.367 0.00 0.00 0
ATOM 186 H 1 1 9.680 24.367 13.697 0.00 0.00 0
ATOM 187 O 1 1 8.022 22.343 17.042 0.00 0.00 0
ATOM 188 H 1 1 9.144 23.367 18.074 0.00 0.00 0
ATOM 189 H 1 1 6.562 23.462 16.852 0.00 0.00 0
ATOM 190 O 1 1 10.762 26.285 19.963 0.00 0.00 0
ATOM 191 H 1 1 11.036 27.966 20.538 0.00 0.00 0
ATOM 192 H 1 1 11.078 25.401 21.456 0.00 0.00 0
ATOM 193 O 1 1 9.158 22.902 28.391 0.00 0.00 0
ATOM 194 H 1 1 8.219 23.528 27.085 0.00 0.00 0
ATOM 195 H 1 1 8.089 21.760 29.509 0.00 0.00 0
ATOM 196 O 1 1 6.219 20.158 31.921 0.00 0.00 0
ATOM 197 H 1 1 5.635 18.511 31.161 0.00 0.00 0
ATOM 198 H 1 1 7.530 19.624 33.071 0.00 0.00 0
ATOM 199 O 1 1 11.191 31.509 2.617 0.00 0.00 0
ATOM 200 H 1 1 10.460 32.214 4.108 0.00 0.00 0
ATOM 201 H 1 1 13.176 31.751 2.577 0.00 0.00 0
ATOM 202 O 1 1 4.748 0.055 8.605 0.00 0.00 0
ATOM 203 H 1 1 5.380 0.517 10.183 0.00 0.00 0
ATOM 204 H 1 1 6.050 -0.306 7.480 0.00 0.00 0
ATOM 205 O 1 1 8.695 30.809 15.731 0.00 0.00 0
ATOM 206 H 1 1 9.189 32.103 14.495 0.00 0.00 0
ATOM 207 H 1 1 8.447 29.069 14.868 0.00 0.00 0
ATOM 208 O 1 1 10.128 31.402 20.766 0.00 0.00 0
ATOM 209 H 1 1 9.456 30.905 19.155 0.00 0.00 0
ATOM 210 H 1 1 9.020 32.731 21.415 0.00 0.00 0
ATOM 211 O 1 1 12.238 30.162 25.837 0.00 0.00 0
ATOM 212 H 1 1 11.418 30.908 27.110 0.00 0.00 0
ATOM 213 H 1 1 12.396 31.331 24.678 0.00 0.00 0
ATOM 214 O 1 1 10.395 32.537 30.624 0.00 0.00 0
ATOM 215 H 1 1 11.042 34.339 30.751 0.00 0.00 0
ATOM 216 H 1 1 11.378 31.486 31.538 0.00 0.00 0
ATOM 217 O 1 1 10.438 3.626 5.087 0.00 0.00 0
ATOM 218 H 1 1 12.435 4.082 5.136 0.00 0.00 0
ATOM 219 H 1 1 9.822 4.284 6.681 0.00 0.00 0
ATOM 220 O 1 1 14.762 3.401 13.776 0.00 0.00 0
ATOM 221 H 1 1 16.518 3.824 13.376 0.00 0.00 0
ATOM 222 H 1 1 13.752 4.757 12.964 0.00 0.00 0
ATOM 223 O 1 1 12.382 1.012 17.643 0.00 0.00 0
ATOM 224 H 1 1 13.346 1.997 16.444 0.00 0.00 0
ATOM 225 H 1 1 11.931 2.133 18.998 0.00 0.00 0
ATOM 226 O 1 1 15.278 1.293 24.559 0.00 0.00 0
ATOM 227 H 1 1 16.071 0.946 26.365 0.00 0.00 0
ATOM 228 H 1 1 15.794 0.199 23.499 0.00 0.00 0
ATOM 229 O 1 1 22.226 31.627 24.712 0.00 0.00 0
ATOM 230 H 1 1 23.338 32.595 23.876 0.00 0.00 0
ATOM 231 H 1 1 22.161 30.053 24.132 0.00 0.00 0
ATOM 232 O 1 1 15.640 1.847 32.717 0.00 0.00 0
ATOM 233 H 1 1 17.488 2.473 31.874 0.00 0.00 0
ATOM 234 H 1 1 16.403 0.869 34.267 0.00 0.00 0
ATOM 235 O 1 1 14.858 10.199 2.754 0.00 0.00 0
ATOM 236 H 1 1 13.360 10.712 2.282 0.00 0.00 0
ATOM 237 H 1 1 14.560 9.316 4.559 0.00 0.00 0
ATOM 238 O 1 1 15.717 8.469 10.739 0.00 0.00 0
ATOM 239 H 1 1 17.323 9.581 10.875 0.00 0.00 0
ATOM 240 H 1 1 14.574 9.631 10.221 0.00 0.00 0
ATOM 241 O 1 1 15.248 10.398 16.525 0.00 0.00 0
ATOM 242 H 1 1 16.324 9.181 16.149 0.00 0.00 0
ATOM 243 H 1 1 14.172 10.488 15.098 0.00 0.00 0
ATOM 244 O 1 1 13.226 8.438 20.801 0.00 0.00 0
ATOM 245 H 1 1 14.043 8.996 19.295 0.00 0.00 0
ATOM 246 H 1 1 14.661 7.802 22.093 0.00 0.00 0
ATOM 247 O 1 1 10.173 10.961 25.875 0.00 0.00 0
ATOM 248 H 1 1 11.477 10.223 26.940 0.00 0.00 0
ATOM 249 H 1 1 11.269 10.738 24.343 0.00 0.00 0
ATOM 250 O 1 1 12.792 7.737 29.173 0.00 0.00 0
ATOM 251 H 1 1 12.199 6.038 29.475 0.00 0.00 0
ATOM 252 H 1 1 14.427 7.450 29.617 0.00 0.00 0
ATOM 253 O 1 1 15.180 19.498 3.578 0.00 0.00 0
ATOM 254 H 1 1 14.883 17.596 4.080 0.00 0.00 0
ATOM 255 H 1 1 16.754 19.579 2.626 0.00 0.00 0
ATOM 256 O 1 1 12.517 11.093 7.701 0.00 0.00 0
ATOM 257 H 1 1 12.224 12.778 7.555 0.00 0.00 0
ATOM 258 H 1 1 11.150 10.393 7.057 0.00 0.00 0
ATOM 259 O 1 1 16.266 16.271 10.758 0.00 0.00 0
ATOM 260 H 1 1 16.507 15.795 12.768 0.00 0.00 0
ATOM 261 H 1 1 17.725 16.977 10.292 0.00 0.00 0
ATOM 262 O 1 1 14.069 18.399 18.897 0.00 0.00 0
ATOM 263 H 1 1 15.513 17.523 18.155 0.00 0.00 0
ATOM 264 H 1 1 14.958 18.709 20.673 0.00 0.00 0
ATOM 265 O 1 1 14.099 15.480 25.510 0.00 0.00 0
ATOM 266 H 1 1 13.698 16.872 26.938 0.00 0.00 0
ATOM 267 H 1 1 12.567 15.379 24.444 0.00 0.00 0
ATOM 268 O 1 1 13.309 17.574 30.292 0.00 0.00 0
ATOM 269 H 1 1 14.937 16.934 30.810 0.00 0.00 0
ATOM 270 H 1 1 13.969 19.494 30.012 0.00 0.00 0
ATOM 271 O 1 1 18.371 23.257 0.925 0.00 0.00 0
ATOM 272 H 1 1 19.479 23.480 2.321 0.00 0.00 0
ATOM 273 H 1 1 19.087 24.325 -0.369 0.00 0.00 0
ATOM 274 O 1 1 12.100 21.730 11.355 0.00 0.00 0
ATOM 275 H 1 1 13.141 22.287 12.743 0.00 0.00 0
ATOM 276 H 1 1 13.467 22.236 10.244 0.00 0.00 0
ATOM 277 O 1 1 12.163 23.290 23.597 0.00 0.00 0
ATOM 278 H 1 1 11.324 22.736 24.949 0.00 0.00 0
ATOM 279 H 1 1 13.882 22.872 23.840 0.00 0.00 0
ATOM 280 O 1 1 20.173 26.761 22.628 0.00 0.00 0
ATOM 281 H 1 1 20.206 26.532 20.792 0.00 0.00 0
ATOM 282 H 1 1 21.556 25.742 23.389 0.00 0.00 0
ATOM 283 O 1 1 16.701 21.165 22.605 0.00 0.00 0
ATOM 284 H 1 1 18.028 20.686 23.848 0.00 0.00 0
ATOM 285 H 1 1 17.104 22.866 21.949 0.00 0.00 0
ATOM 286 O 1 1 11.391 26.461 33.705 0.00 0.00 0
ATOM 287 H 1 1 9.841 27.192 34.048 0.00 0.00 0
ATOM 288 H 1 1 11.776 25.540 35.243 0.00 0.00 0
ATOM 289 O 1 1 9.898 25.989 4.553 0.00 0.00 0
ATOM 290 H 1 1 8.902 26.131 6.039 0.00 0.00 0
ATOM 291 H 1 1 10.287 27.806 4.376 0.00 0.00 0
ATOM 292 O 1 1 14.308 26.960 10.877 0.00 0.00 0
ATOM 293 H 1 1 15.302 27.405 12.173 0.00 0.00 0
ATOM 294 H 1 1 15.463 26.151 9.633 0.00 0.00 0
ATOM 295 O 1 1 13.433 22.960 16.904 0.00 0.00 0
ATOM 296 H 1 1 13.409 24.131 18.132 0.00 0.00 0
ATOM 297 H 1 1 13.624 21.191 17.520 0.00 0.00 0
ATOM 298 O 1 1 16.409 26.768 26.875 0.00 0.00 0
ATOM 299 H 1 1 17.590 26.987 25.431 0.00 0.00 0
ATOM 300 H 1 1 14.751 27.703 26.230 0.00 0.00 0
ATOM 301 O 1 1 14.405 22.733 29.892 0.00 0.00 0
ATOM 302 H 1 1 15.423 23.079 28.494 0.00 0.00 0
ATOM 303 H 1 1 12.826 23.259 29.416 0.00 0.00 0
ATOM 304 O 1 1 6.905 29.408 0.749 0.00 0.00 0
ATOM 305 H 1 1 8.428 30.483 1.567 0.00 0.00 0
ATOM 306 H 1 1 6.353 30.814 -0.444 0.00 0.00 0
ATOM 307 O 1 1 9.189 34.159 6.509 0.00 0.00 0
ATOM 308 H 1 1 10.198 34.193 8.002 0.00 0.00 0
ATOM 309 H 1 1 9.890 35.692 5.785 0.00 0.00 0
ATOM 310 O 1 1 14.256 32.316 9.369 0.00 0.00 0
ATOM 311 H 1 1 15.733 32.867 9.486 0.00 0.00 0
ATOM 312 H 1 1 14.754 30.670 10.090 0.00 0.00 0
ATOM 313 O 1 1 14.714 30.841 16.516 0.00 0.00 0
ATOM 314 H 1 1 13.748 29.551 17.279 0.00 0.00 0
ATOM 315 H 1 1 13.218 31.933 16.614 0.00 0.00 0
ATOM 316 O 1 1 18.409 33.641 20.611 0.00 0.00 0
ATOM 317 H 1 1 19.601 32.274 21.115 0.00 0.00 0
ATOM 318 H 1 1 17.360 32.655 19.518 0.00 0.00 0
ATOM 319 O 1 1 16.062 28.638 32.207 0.00 0.00 0
ATOM 320 H 1 1 14.648 27.958 33.253 0.00 0.00 0
ATOM 321 H 1 1 15.752 28.014 30.522 0.00 0.00 0
ATOM 322 O 1 1 16.200 30.895 1.473 0.00 0.00 0
ATOM 323 H 1 1 16.626 29.968 -0.130 0.00 0.00 0
ATOM 324 H 1 1 17.167 29.833 2.927 0.00 0.00 0
ATOM 325 O 1 1 20.278 3.529 6.048 0.00 0.00 0
ATOM 326 H 1 1 20.977 3.611 4.575 0.00 0.00 0
ATOM 327 H 1 1 21.312 4.513 7.251 0.00 0.00 0
ATOM 328 O 1 1 23.079 5.778 10.408 0.00 0.00 0
ATOM 329 H 1 1 24.650 6.259 10.838 0.00 0.00 0
ATOM 330 H 1 1 22.342 7.609 10.178 0.00 0.00 0
ATOM 331 O 1 1 19.581 2.031 12.110 0.00 0.00 0
ATOM 332 H 1 1 19.039 1.082 10.440 0.00 0.00 0
ATOM 333 H 1 1 21.141 2.991 11.851 0.00 0.00 0
ATOM 334 O 1 1 22.005 3.223 23.178 0.00 0.00 0
ATOM 335 H 1 1 21.429 4.090 24.554 0.00 0.00 0
ATOM 336 H 1 1 20.654 1.791 22.711 0.00 0.00 0
ATOM 337 O 1 1 16.630 6.422 23.792 0.00 0.00 0
ATOM 338 H 1 1 16.219 4.804 24.406 0.00 0.00 0
ATOM 339 H 1 1 17.066 7.128 25.282 0.00 0.00 0
ATOM 340 O 1 1 21.676 5.564 28.158 0.00 0.00 0
ATOM 341 H 1 1 20.658 6.717 29.185 0.00 0.00 0
ATOM 342 H 1 1 23.413 5.828 28.996 0.00 0.00 0
ATOM 343 O 1 1 15.257 5.265 5.626 0.00 0.00 0
ATOM 344 H 1 1 16.914 4.519 5.490 0.00 0.00 0
ATOM 345 H 1 1 15.144 6.150 6.972 0.00 0.00 0
ATOM 346 O 1 1 20.137 11.082 10.437 0.00 0.00 0
ATOM 347 H 1 1 20.021 10.947 8.733 0.00 0.00 0
ATOM 348 H 1 1 21.025 12.555 10.853 0.00 0.00 0
ATOM 349 O 1 1 23.089 14.627 12.437 0.00 0.00 0
ATOM 350 H 1 1 24.716 15.254 12.736 0.00 0.00 0
ATOM 351 H 1 1 23.284 13.228 13.653 0.00 0.00 0
ATOM 352 O 1 1 24.083 12.649 22.566 0.00 0.00 0
ATOM 353 H 1 1 22.397 12.663 23.042 0.00 0.00 0
ATOM 354 H 1 1 24.901 13.851 23.565 0.00 0.00 0
ATOM 355 O 1 1 17.865 7.909 30.036 0.00 0.00 0
ATOM 356 H 1 1 17.509 8.045 31.982 0.00 0.00 0
ATOM 357 H 1 1 18.078 9.582 29.318 0.00 0.00 0
ATOM 358 O 1 1 18.824 8.486 0.104 0.00 0.00 0
ATOM 359 H 1 1 19.997 10.191 -0.057 0.00 0.00 0
ATOM 360 H 1 1 17.077 8.998 0.779 0.00 0.00 0
ATOM 361 O 1 1 20.122 9.143 5.343 0.00 0.00 0
ATOM 362 H 1 1 19.373 8.819 3.821 0.00 0.00 0
ATOM 363 H 1 1 21.998 8.776 5.128 0.00 0.00 0
ATOM 364 O 1 1 16.413 14.459 5.855 0.00 0.00 0
ATOM 365 H 1 1 15.536 13.007 5.239 0.00 0.00 0
ATOM 366 H 1 1 16.006 14.725 7.737 0.00 0.00 0
ATOM 367 O 1 1 17.561 15.066 15.654 0.00 0.00 0
ATOM 368 H 1 1 17.575 13.398 16.055 0.00 0.00 0
ATOM 369 H 1 1 18.978 15.828 16.400 0.00 0.00 0
ATOM 370 O 1 1 26.374 17.047 24.817 0.00 0.00 0
ATOM 371 H 1 1 27.983 17.098 25.632 0.00 0.00 0
ATOM 372 H 1 1 25.629 18.751 24.919 0.00 0.00 0
ATOM 373 O 1 1 19.784 12.960 28.706 0.00 0.00 0
ATOM 374 H 1 1 21.662 13.055 28.871 0.00 0.00 0
ATOM 375 H 1 1 19.545 14.070 27.143 0.00 0.00 0
ATOM 376 O 1 1 17.891 16.733 32.499 0.00 0.00 0
ATOM 377 H 1 1 18.327 15.240 31.277 0.00 0.00 0
ATOM 378 H 1 1 18.633 18.335 31.693 0.00 0.00 0
ATOM 379 O 1 1 23.733 23.024 1.663 0.00 0.00 0
ATOM 380 H 1 1 24.800 24.052 2.776 0.00 0.00 0
ATOM 381 H 1 1 24.693 22.618 0.198 0.00 0.00 0
ATOM 382 O 1 1 20.789 18.440 9.443 0.00 0.00 0
ATOM 383 H 1 1 20.766 17.257 7.881 0.00 0.00 0
ATOM 384 H 1 1 21.896 17.345 10.385 0.00 0.00 0
ATOM 385 O 1 1 21.574 17.493 17.838 0.00 0.00 0
ATOM 386 H 1 1 20.597 18.955 17.218 0.00 0.00 0
ATOM 387 H 1 1 22.538 16.874 16.251 0.00 0.00 0
ATOM 388 O 1 1 19.168 14.748 24.131 0.00 0.00 0
ATOM 389 H 1 1 19.711 16.390 23.712 0.00 0.00 0
ATOM 390 H 1 1 17.429 14.695 24.403 0.00 0.00 0
ATOM 391 O 1 1 22.149 20.198 24.977 0.00 0.00 0
ATOM 392 H 1 1 21.639 20.924 26.486 0.00 0.00 0
ATOM 393 H 1 1 22.656 21.657 24.411 0.00 0.00 0
ATOM 394 O 1 1 20.565 20.792 29.600 0.00 0.00 0
ATOM 395 H 1 1 22.264 20.409 30.214 0.00 0.00 0
ATOM 396 H 1 1 20.548 22.408 30.597 0.00 0.00 0
ATOM 397 O 1 1 20.802 26.547 9.615 0.00 0.00 0
ATOM 398 H 1 1 20.099 27.984 8.338 0.00 0.00 0
ATOM 399 H 1 1 21.277 27.539 11.325 0.00 0.00 0
ATOM 400 O 1 1 16.283 23.589 7.779 0.00 0.00 0
ATOM 401 H 1 1 16.093 21.973 6.712 0.00 0.00 0
ATOM 402 H 1 1 17.901 22.971 8.154 0.00 0.00 0
ATOM 403 O 1 1 18.469 29.798 13.568 0.00 0.00 0
ATOM 404 H 1 1 19.712 31.216 13.506 0.00 0.00 0
ATOM 405 H 1 1 16.872 30.343 14.396 0.00 0.00 0
ATOM 406 O 1 1 18.790 21.712 16.060 0.00 0.00 0
ATOM 407 H 1 1 19.878 23.090 16.485 0.00 0.00 0
ATOM 408 H 1 1 17.201 22.326 15.819 0.00 0.00 0
ATOM 409 O 1 1 21.747 26.084 16.349 0.00 0.00 0
ATOM 410 H 1 1 20.783 27.021 15.300 0.00 0.00 0
ATOM 411 H 1 1 22.705 27.328 17.206 0.00 0.00 0
ATOM 412 O 1 1 20.769 26.211 32.050 0.00 0.00 0
ATOM 413 H 1 1 21.488 27.404 33.328 0.00 0.00 0
ATOM 414 H 1 1 18.989 26.710 32.145 0.00 0.00 0
ATOM 415 O 1 1 19.820 29.181 5.559 0.00 0.00 0
ATOM 416 H 1 1 20.991 29.509 4.109 0.00 0.00 0
ATOM 417 H 1 1 19.431 31.018 6.221 0.00 0.00 0
ATOM 418 O 1 1 19.240 33.867 7.993 0.00 0.00 0
ATOM 419 H 1 1 19.107 35.039 6.604 0.00 0.00 0
ATOM 420 H 1 1 20.697 33.671 9.063 0.00 0.00 0
ATOM 421 O 1 1 22.511 34.976 15.793 0.00 0.00 0
ATOM 422 H 1 1 23.716 36.163 16.603 0.00 0.00 0
ATOM 423 H 1 1 21.699 36.150 14.467 0.00 0.00 0
ATOM 424 O 1 1 22.622 30.284 19.069 0.00 0.00 0
ATOM 425 H 1 1 22.049 31.351 17.725 0.00 0.00 0
ATOM 426 H 1 1 24.411 30.773 19.576 0.00 0.00 0
ATOM 427 O 1 1 18.639 33.611 28.369 0.00 0.00 0
ATOM 428 H 1 1 18.226 32.159 29.103 0.00 0.00 0
ATOM 429 H 1 1 19.906 33.008 27.158 0.00 0.00 0
ATOM 430 O 1 1 22.520 1.325 31.926 0.00 0.00 0
ATOM 431 H 1 1 22.803 2.668 30.796 0.00 0.00 0
ATOM 432 H 1 1 21.045 0.425 31.122 0.00 0.00 0
ATOM 433 O 1 1 21.754 3.789 1.159 0.00 0.00 0
ATOM 434 H 1 1 22.085 2.785 -0.180 0.00 0.00 0
ATOM 435 H 1 1 20.850 5.175 0.610 0.00 0.00 0
ATOM 436 O 1 1 28.457 5.539 12.133 0.00 0.00 0
ATOM 437 H 1 1 29.489 4.390 11.182 0.00 0.00 0
ATOM 438 H 1 1 29.161 7.131 12.587 0.00 0.00 0
ATOM 439 O 1 1 22.495 5.966 17.324 0.00 0.00 0
ATOM 440 H 1 1 24.377 5.379 17.393 0.00 0.00 0
ATOM 441 H 1 1 21.906 5.491 18.857 0.00 0.00 0
ATOM 442 O 1 1 28.128 3.304 22.287 0.00 0.00 0
ATOM 443 H 1 1 28.123 2.999 20.491 0.00 0.00 0
ATOM 444 H 1 1 26.533 3.355 22.876 0.00 0.00 0
ATOM 445 O 1 1 28.378 10.455 27.266 0.00 0.00 0
ATOM 446 H 1 1 30.019 10.292 28.051 0.00 0.00 0
ATOM 447 H 1 1 28.635 10.039 25.463 0.00 0.00 0
ATOM 448 O 1 1 27.031 8.353 34.806 0.00 0.00 0
ATOM 449 H 1 1 26.116 9.984 34.571 0.00 0.00 0
ATOM 450 H 1 1 28.685 8.951 34.739 0.00 0.00 0
ATOM 451 O 1 1 24.951 8.160 4.454 0.00 0.00 0
ATOM 452 H 1 1 25.930 9.616 5.160 0.00 0.00 0
ATOM 453 H 1 1 25.947 7.994 2.724 0.00 0.00 0
ATOM 454 O 1 1 26.937 12.436 6.869 0.00 0.00 0
ATOM 455 H 1 1 25.492 13.284 6.708 0.00 0.00 0
ATOM 456 H 1 1 27.689 13.332 8.266 0.00 0.00 0
ATOM 457 O 1 1 23.365 11.214 16.933 0.00 0.00 0
ATOM 458 H 1 1 22.247 9.744 16.789 0.00 0.00 0
ATOM 459 H 1 1 23.264 12.035 18.539 0.00 0.00 0
ATOM 460 O 1 1 28.321 8.759 22.158 0.00 0.00 0
ATOM 461 H 1 1 27.662 6.895 22.482 0.00 0.00 0
ATOM 462 H 1 1 26.971 9.710 21.902 0.00 0.00 0
ATOM 463 O 1 1 27.071 6.109 29.555 0.00 0.00 0
ATOM 464 H 1 1 27.591 7.663 28.857 0.00 0.00 0
ATOM 465 H 1 1 27.304 6.320 31.261 0.00 0.00 0
ATOM 466 O 1 1 22.474 11.704 34.640 0.00 0.00 0
ATOM 467 H 1 1 22.752 13.304 35.584 0.00 0.00 0
ATOM 468 H 1 1 22.840 12.090 33.030 0.00 0.00 0
ATOM 469 O 1 1 21.656 14.971 5.615 0.00 0.00 0
ATOM 470 H 1 1 21.690 15.860 3.977 0.00 0.00 0
ATOM 471 H 1 1 19.964 14.225 5.774 0.00 0.00 0
ATOM 472 O 1 1 28.539 21.492 9.820 0.00 0.00 0
ATOM 473 H 1 1 27.288 22.181 8.688 0.00 0.00 0
ATOM 474 H 1 1 28.065 22.420 11.602 0.00 0.00 0
ATOM 475 O 1 1 28.364 16.020 11.109 0.00 0.00 0
ATOM 476 H 1 1 30.033 16.649 12.089 0.00 0.00 0
ATOM 477 H 1 1 28.456 17.440 10.082 0.00 0.00 0
ATOM 478 O 1 1 0.054 13.686 18.103 0.00 0.00 0
ATOM 479 H 1 1 -1.714 12.928 18.841 0.00 0.00 0
ATOM 480 H 1 1 1.008 12.429 17.383 0.00 0.00 0
ATOM 481 O 1 1 24.636 12.894 29.957 0.00 0.00 0
ATOM 482 H 1 1 25.906 13.914 31.183 0.00 0.00 0
ATOM 483 H 1 1 25.641 11.609 29.162 0.00 0.00 0
ATOM 484 O 1 1 21.548 17.250 0.749 0.00 0.00 0
ATOM 485 H 1 1 21.843 19.026 0.905 0.00 0.00 0
ATOM 486 H 1 1 20.385 16.716 -0.697 0.00 0.00 0
ATOM 487 O 1 1 26.095 27.274 4.520 0.00 0.00 0
ATOM 488 H 1 1 27.889 26.458 4.505 0.00 0.00 0
ATOM 489 H 1 1 25.648 26.970 6.165 0.00 0.00 0
ATOM 490 O 1 1 23.610 22.515 8.008 0.00 0.00 0
ATOM 491 H 1 1 22.653 21.187 8.739 0.00 0.00 0
ATOM 492 H 1 1 22.286 24.095 8.444 0.00 0.00 0
ATOM 493 O 1 1 27.355 18.929 18.180 0.00 0.00 0
ATOM 494 H 1 1 27.200 20.349 17.155 0.00 0.00 0
ATOM 495 H 1 1 25.579 18.322 18.770 0.00 0.00 0
ATOM 496 O 1 1 26.765 23.633 14.444 0.00 0.00 0
ATOM 497 H 1 1 27.441 25.298 13.651 0.00 0.00 0
ATOM 498 H 1 1 25.086 24.256 14.749 0.00 0.00 0
ATOM 499 O 1 1 31.478 20.769 20.986 0.00 0.00 0
ATOM 500 H 1 1 30.440 22.509 21.135 0.00 0.00 0
ATOM 501 H 1 1 30.567 19.656 20.043 0.00 0.00 0
ATOM 502 O 1 1 24.812 20.412 32.668 0.00 0.00 0
ATOM 503 H 1 1 26.242 21.478 31.874 0.00 0.00 0
ATOM 504 H 1 1 25.787 19.023 33.158 0.00 0.00 0
ATOM 505 O 1 1 22.105 29.076 0.928 0.00 0.00 0
ATOM 506 H 1 1 23.296 27.923 1.739 0.00 0.00 0
ATOM 507 H 1 1 22.623 30.994 0.882 0.00 0.00 0
ATOM 508 O 1 1 29.572 31.256 8.626 0.00 0.00 0
ATOM 509 H 1 1 30.795 30.203 7.736 0.00 0.00 0
ATOM 510 H 1 1 28.277 31.519 7.260 0.00 0.00 0
ATOM 511 O 1 1 31.817 34.843 18.283 0.00 0.00 0
ATOM 512 H 1 1 32.438 34.389 16.474 0.00 0.00 0
ATOM 513 H 1 1 32.743 36.422 18.341 0.00 0.00 0
ATOM 514 O 1 1 27.915 25.601 19.033 0.00 0.00 0
ATOM 515 H 1 1 29.358 26.561 19.190 0.00 0.00 0
ATOM 516 H 1 1 28.148 24.429 17.530 0.00 0.00 0
ATOM 517 O 1 1 24.548 24.654 24.025 0.00 0.00 0
ATOM 518 H 1 1 25.528 25.635 22.824 0.00 0.00 0
ATOM 519 H 1 1 25.300 25.200 25.645 0.00 0.00 0
ATOM 520 O 1 1 28.540 22.922 30.370 0.00 0.00 0
ATOM 521 H 1 1 27.414 24.096 29.781 0.00 0.00 0
ATOM 522 H 1 1 29.674 23.914 31.873 0.00 0.00 0
ATOM 523 O 1 1 24.969 33.623 1.014 0.00 0.00 0
ATOM 524 H 1 1 26.521 33.058 1.518 0.00 0.00 0
ATOM 525 H 1 1 24.990 34.322 -0.683 0.00 0.00 0
ATOM 526 O 1 1 23.075 32.171 11.324 0.00 0.00 0
ATOM 527 H 1 1 23.316 32.775 13.097 0.00 0.00 0
ATOM 528 H 1 1 24.460 33.203 10.662 0.00 0.00 0
ATOM 529 O 1 1 27.497 2.736 17.224 0.00 0.00 0
ATOM 530 H 1 1 28.397 3.415 15.715 0.00 0.00 0
ATOM 531 H 1 1 28.234 1.233 17.412 0.00 0.00 0
ATOM 532 O 1 1 26.369 33.060 22.077 0.00 0.00 0
ATOM 533 H 1 1 26.170 34.746 22.264 0.00 0.00 0
ATOM 534 H 1 1 27.592 32.404 23.321 0.00 0.00 0
ATOM 535 O 1 1 30.221 30.950 25.843 0.00 0.00 0
ATOM 536 H 1 1 30.305 29.038 26.208 0.00 0.00 0
ATOM 537 H 1 1 30.363 31.979 27.414 0.00 0.00 0
ATOM 538 O 1 1 24.973 26.732 28.607 0.00 0.00 0
ATOM 539 H 1 1 25.385 28.369 29.248 0.00 0.00 0
ATOM 540 H 1 1 23.330 26.597 29.234 0.00 0.00 0
ATOM 541 O 1 1 32.165 4.857 2.258 0.00 0.00 0
ATOM 542 H 1 1 32.417 6.195 1.157 0.00 0.00 0
ATOM 543 H 1 1 32.615 3.727 1.112 0.00 0.00 0
ATOM 544 O 1 1 28.067 3.533 5.217 0.00 0.00 0
ATOM 545 H 1 1 26.960 4.447 4.158 0.00 0.00 0
ATOM 546 H 1 1 29.875 3.863 4.448 0.00 0.00 0
ATOM 547 O 1 1 33.279 2.782 13.028 0.00 0.00 0
ATOM 548 H 1 1 33.708 3.955 11.817 0.00 0.00 0
ATOM 549 H 1 1 33.656 3.545 14.631 0.00 0.00 0
ATOM 550 O 1 1 34.278 4.944 17.492 0.00 0.00 0
ATOM 551 H 1 1 33.438 6.563 17.876 0.00 0.00 0
ATOM 552 H 1 1 34.906 4.452 18.995 0.00 0.00 0
ATOM 553 O 1 1 32.363 1.908 26.092 0.00 0.00 0
ATOM 554 H 1 1 31.941 1.683 24.268 0.00 0.00 0
ATOM 555 H 1 1 33.850 1.390 26.904 0.00 0.00 0
ATOM 556 O 1 1 27.982 0.418 28.241 0.00 0.00 0
ATOM 557 H 1 1 27.516 2.080 28.309 0.00 0.00 0
ATOM 558 H 1 1 29.593 0.176 27.299 0.00 0.00 0
ATOM 559 O 1 1 28.845 14.672 2.724 0.00 0.00 0
ATOM 560 H 1 1 27.963 13.930 4.139 0.00 0.00 0
ATOM 561 H 1 1 30.386 15.714 3.379 0.00 0.00 0
ATOM 562 O 1 1 28.083 10.618 14.298 0.00 0.00 0
ATOM 563 H 1 1 28.623 12.160 13.293 0.00 0.00 0
ATOM 564 H 1 1 26.486 11.015 15.379 0.00 0.00 0
ATOM 565 O 1 1 33.867 10.545 13.306 0.00 0.00 0
ATOM 566 H 1 1 35.165 9.612 13.810 0.00 0.00 0
ATOM 567 H 1 1 33.615 10.270 11.513 0.00 0.00 0
ATOM 568 O 1 1 31.790 9.696 18.223 0.00 0.00 0
ATOM 569 H 1 1 30.484 9.334 19.421 0.00 0.00 0
ATOM 570 H 1 1 30.834 10.096 16.929 0.00 0.00 0
ATOM 571 O 1 1 30.141 15.006 21.532 0.00 0.00 0
ATOM 572 H 1 1 28.565 15.594 22.099 0.00 0.00 0
ATOM 573 H 1 1 30.942 14.253 23.077 0.00 0.00 0
ATOM 574 O 1 1 32.798 10.732 30.680 0.00 0.00 0
ATOM 575 H 1 1 34.073 9.528 30.799 0.00 0.00 0
ATOM 576 H 1 1 32.991 11.512 28.983 0.00 0.00 0
ATOM 577 O 1 1 33.652 16.265 5.086 0.00 0.00 0
ATOM 578 H 1 1 35.399 16.239 4.730 0.00 0.00 0
ATOM 579 H 1 1 33.503 17.939 5.631 0.00 0.00 0
ATOM 580 O 1 1 31.947 10.799 7.943 0.00 0.00 0
ATOM 581 H 1 1 29.894 10.549 7.619 0.00 0.00 0
ATOM 582 H 1 1 32.271 12.414 7.075 0.00 0.00 0
ATOM 583 O 1 1 0.329 15.516 11.746 0.00 0.00 0
ATOM 584 H 1 1 -0.446 14.249 12.939 0.00 0.00 0
ATOM 585 H 1 1 -0.685 17.018 11.935 0.00 0.00 0
ATOM 586 O 1 1 4.262 19.165 14.308 0.00 0.00 0
ATOM 587 H 1 1 3.579 17.691 14.920 0.00 0.00 0
ATOM 588 H 1 1 5.723 19.183 15.204 0.00 0.00 0
ATOM 589 O 1 1 32.995 13.546 25.948 0.00 0.00 0
ATOM 590 H 1 1 32.167 15.060 26.787 0.00 0.00 0
ATOM 591 H 1 1 34.425 13.800 25.007 0.00 0.00 0
ATOM 592 O 1 1 1.773 13.524 34.037 0.00 0.00 0
ATOM 593 H 1 1 0.227 14.409 33.446 0.00 0.00 0
ATOM 594 H 1 1 2.167 14.670 35.511 0.00 0.00 0
ATOM 595 O 1 1 33.029 20.529 7.247 0.00 0.00 0
ATOM 596 H 1 1 34.388 21.414 8.003 0.00 0.00 0
ATOM 597 H 1 1 31.451 20.831 8.182 0.00 0.00 0
ATOM 598 O 1 1 2.037 24.250 10.251 0.00 0.00 0
ATOM 599 H 1 1 3.743 25.008 9.876 0.00 0.00 0
ATOM 600 H 1 1 1.894 25.043 11.903 0.00 0.00 0
ATOM 601 O 1 1 32.753 19.259 13.976 0.00 0.00 0
ATOM 602 H 1 1 32.792 20.886 13.792 0.00 0.00 0
ATOM 603 H 1 1 34.334 18.799 14.976 0.00 0.00 0
ATOM 604 O 1 1 0.396 18.673 18.699 0.00 0.00 0
ATOM 605 H 1 1 -1.211 18.950 19.127 0.00 0.00 0
ATOM 606 H 1 1 0.469 16.977 18.436 0.00 0.00 0
ATOM 607 O 1 1 30.855 18.370 27.959 0.00 0.00 0
ATOM 608 H 1 1 29.759 19.681 28.690 0.00 0.00 0
ATOM 609 H 1 1 32.103 19.477 26.763 0.00 0.00 0
ATOM 610 O 1 1 27.723 15.992 33.091 0.00 0.00 0
ATOM 611 H 1 1 29.390 16.423 32.192 0.00 0.00 0
ATOM 612 H 1 1 27.801 15.859 34.804 0.00 0.00 0
ATOM 613 O 1 1 31.068 27.895 3.348 0.00 0.00 0
ATOM 614 H 1 1 32.517 27.825 4.610 0.00 0.00 0
ATOM 615 H 1 1 31.529 29.459 2.324 0.00 0.00 0
ATOM 616 O 1 1 35.039 28.008 6.663 0.00 0.00 0
ATOM 617 H 1 1 35.966 26.934 7.683 0.00 0.00 0
ATOM 618 H 1 1 36.055 28.336 5.336 0.00 0.00 0
ATOM 619 O 1 1 29.356 28.196 13.025 0.00 0.00 0
ATOM 620 H 1 1 29.210 29.335 14.589 0.00 0.00 0
ATOM 621 H 1 1 28.874 29.629 11.867 0.00 0.00 0
ATOM 622 O 1 1 32.386 28.434 18.961 0.00 0.00 0
ATOM 623 H 1 1 33.368 28.574 20.411 0.00 0.00 0
ATOM 624 H 1 1 33.410 27.406 17.949 0.00 0.00 0
ATOM 625 O 1 1 30.898 25.390 25.799 0.00 0.00 0
ATOM 626 H 1 1 32.369 25.913 24.580 0.00 0.00 0
ATOM 627 H 1 1 31.317 24.075 27.029 0.00 0.00 0
ATOM 628 O 1 1 32.259 25.611 33.104 0.00 0.00 0
ATOM 629 H 1 1 32.238 25.736 34.806 0.00 0.00 0
ATOM 630 H 1 1 33.920 25.042 32.775 0.00 0.00 0
ATOM 631 O 1 1 30.290 32.645 1.341 0.00 0.00 0
ATOM 632 H 1 1 29.949 32.793 -0.430 0.00 0.00 0
ATOM 633 H 1 1 31.762 33.340 1.847 0.00 0.00 0
ATOM 634 O 1 1 25.536 34.235 6.469 0.00 0.00 0
ATOM 635 H 1 1 25.716 36.059 6.651 0.00 0.00 0
ATOM 636 H 1 1 25.283 33.866 4.895 0.00 0.00 0
ATOM 637 O 1 1 31.674 33.161 13.106 0.00 0.00 0
ATOM 638 H 1 1 31.793 34.863 13.281 0.00 0.00 0
ATOM 639 H 1 1 30.425 32.928 11.783 0.00 0.00 0
ATOM 640 O 1 1 33.844 32.668 22.296 0.00 0.00 0
ATOM 641 H 1 1 32.750 32.234 23.524 0.00 0.00 0
ATOM 642 H 1 1 32.917 32.875 20.736 0.00 0.00 0
ATOM 643 O 1 1 31.603 30.542 30.805 0.00 0.00 0
ATOM 644 H 1 1 33.451 30.804 30.468 0.00 0.00 0
ATOM 645 H 1 1 31.575 28.816 31.756 0.00 0.00 0
ATOM 646 O 1 1 26.295 31.235 30.599 0.00 0.00 0
ATOM 647 H 1 1 27.834 30.515 30.607 0.00 0.00 0
ATOM 648 H 1 1 26.362 32.920 29.856 0.00 0.00 0
END

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
units electron
atom_style full
#pair_style lj/cut/coul/long 17.01
pair_style lj/cut/tip4p/long 1 2 1 1 0.278072379 17.007
#bond_style harmonic
bond_style class2
angle_style harmonic
#kspace_style pppm 0.0001
kspace_style pppm/tip4p 0.0001
read_data data.water
pair_coeff * * 0 0
pair_coeff 1 1 0.000295147 5.96946
neighbor 2.0 bin
timestep 0.00025
#velocity all create 298.0 2345187
#thermo_style multi
#thermo 1
#fix 1 all nvt temp 298.0 298.0 30.0 tchain 1
#fix 1 all nve
fix 1 all ipi no_rpc 32345 unix
#dump 1 all xyz 25 dump.xyz
run 100000000

View File

@ -0,0 +1,24 @@
<simulation>
<initialize nbeads='32'>
<file mode='pdb'> water_298K.pdb </file>
<velocities mode="thermal" units='kelvin'> 298 </velocities>
</initialize>
<output prefix='no_rpc'>
<properties stride='1' filename='out'> [ step, time{picosecond}, conserved, temperature{kelvin}, kinetic_cv, potential, pressure_cv{megapascal}] </properties>
<trajectory filename='pos' stride='20'> positions </trajectory>
</output>
<total_steps>500000</total_steps>
<prng><seed>32345</seed></prng>
<forces>
<socket mode='unix'>
<address>no_rpc</address>
</socket>
</forces>
<ensemble mode='nvt'>
<thermostat mode='svr'>
<tau units='femtosecond'>25</tau>
</thermostat>
<timestep units='femtosecond'> 0.25</timestep>
<temperature units='kelvin'>298</temperature>
</ensemble>
</simulation>

View File

@ -0,0 +1,650 @@
CRYST 35.233 35.233 35.233 90.00 90.00 90.00 P 1 1
ATOM 1 O 1 1 3.846 5.672 1.323 0.00 0.00 0
ATOM 2 H 1 1 2.979 7.054 0.857 0.00 0.00 0
ATOM 3 H 1 1 5.525 5.697 0.451 0.00 0.00 0
ATOM 4 O 1 1 34.557 34.341 3.078 0.00 0.00 0
ATOM 5 H 1 1 33.722 34.689 4.840 0.00 0.00 0
ATOM 6 H 1 1 36.029 33.220 3.711 0.00 0.00 0
ATOM 7 O 1 1 5.591 1.963 13.477 0.00 0.00 0
ATOM 8 H 1 1 7.265 1.864 13.851 0.00 0.00 0
ATOM 9 H 1 1 5.009 3.555 13.916 0.00 0.00 0
ATOM 10 O 1 1 1.060 2.061 21.718 0.00 0.00 0
ATOM 11 H 1 1 0.757 0.261 21.820 0.00 0.00 0
ATOM 12 H 1 1 0.213 3.013 23.047 0.00 0.00 0
ATOM 13 O 1 1 1.200 1.337 29.006 0.00 0.00 0
ATOM 14 H 1 1 0.818 1.884 30.732 0.00 0.00 0
ATOM 15 H 1 1 2.883 1.825 29.011 0.00 0.00 0
ATOM 16 O 1 1 1.331 1.386 34.306 0.00 0.00 0
ATOM 17 H 1 1 2.392 2.898 34.846 0.00 0.00 0
ATOM 18 H 1 1 0.814 0.532 35.836 0.00 0.00 0
ATOM 19 O 1 1 31.451 10.201 0.726 0.00 0.00 0
ATOM 20 H 1 1 32.282 10.877 -0.750 0.00 0.00 0
ATOM 21 H 1 1 30.920 11.594 1.677 0.00 0.00 0
ATOM 22 O 1 1 0.836 10.808 4.298 0.00 0.00 0
ATOM 23 H 1 1 0.305 10.643 2.793 0.00 0.00 0
ATOM 24 H 1 1 -0.356 10.334 5.524 0.00 0.00 0
ATOM 25 O 1 1 34.381 5.979 9.194 0.00 0.00 0
ATOM 26 H 1 1 33.616 7.673 8.857 0.00 0.00 0
ATOM 27 H 1 1 35.115 5.260 7.618 0.00 0.00 0
ATOM 28 O 1 1 33.212 6.480 24.278 0.00 0.00 0
ATOM 29 H 1 1 31.624 6.908 23.521 0.00 0.00 0
ATOM 30 H 1 1 32.544 4.990 24.982 0.00 0.00 0
ATOM 31 O 1 1 1.992 9.002 26.863 0.00 0.00 0
ATOM 32 H 1 1 1.856 10.175 25.579 0.00 0.00 0
ATOM 33 H 1 1 0.519 8.099 26.386 0.00 0.00 0
ATOM 34 O 1 1 2.054 8.660 32.515 0.00 0.00 0
ATOM 35 H 1 1 2.167 8.727 30.494 0.00 0.00 0
ATOM 36 H 1 1 2.374 10.513 33.038 0.00 0.00 0
ATOM 37 O 1 1 3.402 16.639 3.008 0.00 0.00 0
ATOM 38 H 1 1 4.127 15.872 4.446 0.00 0.00 0
ATOM 39 H 1 1 2.905 18.339 3.160 0.00 0.00 0
ATOM 40 O 1 1 4.222 15.444 8.072 0.00 0.00 0
ATOM 41 H 1 1 5.211 16.756 8.299 0.00 0.00 0
ATOM 42 H 1 1 2.560 15.492 8.860 0.00 0.00 0
ATOM 43 O 1 1 2.831 9.246 16.488 0.00 0.00 0
ATOM 44 H 1 1 2.869 8.023 18.050 0.00 0.00 0
ATOM 45 H 1 1 3.960 8.467 15.154 0.00 0.00 0
ATOM 46 O 1 1 5.563 6.003 20.907 0.00 0.00 0
ATOM 47 H 1 1 4.653 4.638 21.480 0.00 0.00 0
ATOM 48 H 1 1 6.405 6.208 22.529 0.00 0.00 0
ATOM 49 O 1 1 2.087 13.370 22.913 0.00 0.00 0
ATOM 50 H 1 1 2.832 14.804 23.422 0.00 0.00 0
ATOM 51 H 1 1 1.434 13.509 21.196 0.00 0.00 0
ATOM 52 O 1 1 3.369 17.886 25.109 0.00 0.00 0
ATOM 53 H 1 1 3.655 17.200 26.766 0.00 0.00 0
ATOM 54 H 1 1 4.772 18.977 24.500 0.00 0.00 0
ATOM 55 O 1 1 34.764 20.803 0.948 0.00 0.00 0
ATOM 56 H 1 1 35.210 21.267 2.816 0.00 0.00 0
ATOM 57 H 1 1 35.962 21.726 0.131 0.00 0.00 0
ATOM 58 O 1 1 2.836 24.178 15.229 0.00 0.00 0
ATOM 59 H 1 1 2.795 22.346 14.876 0.00 0.00 0
ATOM 60 H 1 1 2.414 24.115 17.130 0.00 0.00 0
ATOM 61 O 1 1 33.000 24.481 15.230 0.00 0.00 0
ATOM 62 H 1 1 34.640 24.804 15.013 0.00 0.00 0
ATOM 63 H 1 1 32.401 25.764 14.295 0.00 0.00 0
ATOM 64 O 1 1 0.404 26.779 23.400 0.00 0.00 0
ATOM 65 H 1 1 1.353 27.248 24.987 0.00 0.00 0
ATOM 66 H 1 1 1.546 28.050 22.317 0.00 0.00 0
ATOM 67 O 1 1 34.222 21.380 25.418 0.00 0.00 0
ATOM 68 H 1 1 35.669 20.151 25.317 0.00 0.00 0
ATOM 69 H 1 1 32.960 21.180 23.992 0.00 0.00 0
ATOM 70 O 1 1 33.259 17.438 32.480 0.00 0.00 0
ATOM 71 H 1 1 33.314 18.782 33.883 0.00 0.00 0
ATOM 72 H 1 1 32.743 18.181 30.871 0.00 0.00 0
ATOM 73 O 1 1 4.463 21.979 3.936 0.00 0.00 0
ATOM 74 H 1 1 5.856 23.084 3.400 0.00 0.00 0
ATOM 75 H 1 1 3.986 22.180 5.602 0.00 0.00 0
ATOM 76 O 1 1 6.258 25.851 8.520 0.00 0.00 0
ATOM 77 H 1 1 5.767 27.693 8.476 0.00 0.00 0
ATOM 78 H 1 1 7.202 25.506 10.186 0.00 0.00 0
ATOM 79 O 1 1 0.601 29.737 12.747 0.00 0.00 0
ATOM 80 H 1 1 -0.685 30.842 12.350 0.00 0.00 0
ATOM 81 H 1 1 1.336 30.716 14.031 0.00 0.00 0
ATOM 82 O 1 1 7.563 28.191 24.333 0.00 0.00 0
ATOM 83 H 1 1 9.201 28.828 24.684 0.00 0.00 0
ATOM 84 H 1 1 7.381 27.621 22.799 0.00 0.00 0
ATOM 85 O 1 1 3.653 27.109 27.772 0.00 0.00 0
ATOM 86 H 1 1 5.126 27.015 26.772 0.00 0.00 0
ATOM 87 H 1 1 3.031 28.756 27.698 0.00 0.00 0
ATOM 88 O 1 1 2.596 23.991 32.476 0.00 0.00 0
ATOM 89 H 1 1 2.879 24.791 30.859 0.00 0.00 0
ATOM 90 H 1 1 4.003 22.913 32.701 0.00 0.00 0
ATOM 91 O 1 1 3.083 31.317 3.644 0.00 0.00 0
ATOM 92 H 1 1 4.133 30.589 2.539 0.00 0.00 0
ATOM 93 H 1 1 4.218 32.173 5.037 0.00 0.00 0
ATOM 94 O 1 1 4.661 30.555 9.368 0.00 0.00 0
ATOM 95 H 1 1 3.184 29.843 10.132 0.00 0.00 0
ATOM 96 H 1 1 4.358 32.448 9.126 0.00 0.00 0
ATOM 97 O 1 1 3.465 32.537 15.778 0.00 0.00 0
ATOM 98 H 1 1 5.072 31.819 15.903 0.00 0.00 0
ATOM 99 H 1 1 4.055 34.257 15.284 0.00 0.00 0
ATOM 100 O 1 1 4.215 29.153 20.317 0.00 0.00 0
ATOM 101 H 1 1 3.658 30.176 18.842 0.00 0.00 0
ATOM 102 H 1 1 4.959 30.291 21.449 0.00 0.00 0
ATOM 103 O 1 1 1.126 31.333 28.768 0.00 0.00 0
ATOM 104 H 1 1 2.395 31.124 29.925 0.00 0.00 0
ATOM 105 H 1 1 0.768 33.092 28.898 0.00 0.00 0
ATOM 106 O 1 1 4.881 32.616 32.302 0.00 0.00 0
ATOM 107 H 1 1 6.588 32.911 31.725 0.00 0.00 0
ATOM 108 H 1 1 4.486 34.037 33.249 0.00 0.00 0
ATOM 109 O 1 1 8.962 5.556 0.151 0.00 0.00 0
ATOM 110 H 1 1 9.652 6.991 0.859 0.00 0.00 0
ATOM 111 H 1 1 9.173 4.477 1.645 0.00 0.00 0
ATOM 112 O 1 1 1.833 3.518 5.679 0.00 0.00 0
ATOM 113 H 1 1 2.889 2.731 6.788 0.00 0.00 0
ATOM 114 H 1 1 2.789 4.187 4.147 0.00 0.00 0
ATOM 115 O 1 1 10.510 34.726 13.073 0.00 0.00 0
ATOM 116 H 1 1 11.920 34.118 11.919 0.00 0.00 0
ATOM 117 H 1 1 11.295 34.968 14.741 0.00 0.00 0
ATOM 118 O 1 1 7.212 0.042 22.454 0.00 0.00 0
ATOM 119 H 1 1 6.924 0.470 24.172 0.00 0.00 0
ATOM 120 H 1 1 8.319 1.228 21.653 0.00 0.00 0
ATOM 121 O 1 1 6.365 2.010 27.544 0.00 0.00 0
ATOM 122 H 1 1 5.954 3.585 26.852 0.00 0.00 0
ATOM 123 H 1 1 7.758 2.549 28.696 0.00 0.00 0
ATOM 124 O 1 1 10.833 3.140 30.787 0.00 0.00 0
ATOM 125 H 1 1 12.697 2.975 30.867 0.00 0.00 0
ATOM 126 H 1 1 10.389 3.700 32.404 0.00 0.00 0
ATOM 127 O 1 1 8.684 9.342 3.912 0.00 0.00 0
ATOM 128 H 1 1 6.985 9.256 4.773 0.00 0.00 0
ATOM 129 H 1 1 8.684 10.809 3.011 0.00 0.00 0
ATOM 130 O 1 1 4.873 9.919 7.707 0.00 0.00 0
ATOM 131 H 1 1 3.698 9.771 6.194 0.00 0.00 0
ATOM 132 H 1 1 5.047 11.961 7.624 0.00 0.00 0
ATOM 133 O 1 1 10.031 5.018 9.699 0.00 0.00 0
ATOM 134 H 1 1 9.675 3.382 10.340 0.00 0.00 0
ATOM 135 H 1 1 9.132 5.987 10.825 0.00 0.00 0
ATOM 136 O 1 1 11.246 3.918 21.929 0.00 0.00 0
ATOM 137 H 1 1 12.614 2.770 22.341 0.00 0.00 0
ATOM 138 H 1 1 12.073 5.686 21.497 0.00 0.00 0
ATOM 139 O 1 1 6.825 7.164 25.708 0.00 0.00 0
ATOM 140 H 1 1 8.036 8.374 25.980 0.00 0.00 0
ATOM 141 H 1 1 5.206 7.900 25.891 0.00 0.00 0
ATOM 142 O 1 1 10.171 12.811 0.295 0.00 0.00 0
ATOM 143 H 1 1 10.033 12.818 -1.609 0.00 0.00 0
ATOM 144 H 1 1 9.880 14.492 0.480 0.00 0.00 0
ATOM 145 O 1 1 8.190 17.402 1.253 0.00 0.00 0
ATOM 146 H 1 1 9.472 18.531 1.253 0.00 0.00 0
ATOM 147 H 1 1 6.351 17.817 1.568 0.00 0.00 0
ATOM 148 O 1 1 11.233 16.188 8.299 0.00 0.00 0
ATOM 149 H 1 1 10.291 17.689 8.166 0.00 0.00 0
ATOM 150 H 1 1 12.768 17.123 8.733 0.00 0.00 0
ATOM 151 O 1 1 6.386 8.002 12.846 0.00 0.00 0
ATOM 152 H 1 1 7.701 8.896 13.655 0.00 0.00 0
ATOM 153 H 1 1 5.591 8.877 11.519 0.00 0.00 0
ATOM 154 O 1 1 8.184 10.419 18.848 0.00 0.00 0
ATOM 155 H 1 1 9.498 9.434 19.905 0.00 0.00 0
ATOM 156 H 1 1 6.882 9.027 18.948 0.00 0.00 0
ATOM 157 O 1 1 10.806 14.431 21.328 0.00 0.00 0
ATOM 158 H 1 1 9.177 13.531 20.670 0.00 0.00 0
ATOM 159 H 1 1 11.344 15.696 20.448 0.00 0.00 0
ATOM 160 O 1 1 9.237 13.928 30.341 0.00 0.00 0
ATOM 161 H 1 1 10.779 14.839 30.522 0.00 0.00 0
ATOM 162 H 1 1 9.965 13.192 28.899 0.00 0.00 0
ATOM 163 O 1 1 10.918 21.707 1.864 0.00 0.00 0
ATOM 164 H 1 1 10.280 23.449 2.279 0.00 0.00 0
ATOM 165 H 1 1 12.708 21.456 1.749 0.00 0.00 0
ATOM 166 O 1 1 9.353 16.125 13.927 0.00 0.00 0
ATOM 167 H 1 1 9.938 17.594 14.618 0.00 0.00 0
ATOM 168 H 1 1 9.518 16.360 12.244 0.00 0.00 0
ATOM 169 O 1 1 10.371 11.107 14.268 0.00 0.00 0
ATOM 170 H 1 1 9.644 10.406 15.859 0.00 0.00 0
ATOM 171 H 1 1 9.434 12.523 14.117 0.00 0.00 0
ATOM 172 O 1 1 3.351 22.769 20.196 0.00 0.00 0
ATOM 173 H 1 1 2.055 23.686 21.503 0.00 0.00 0
ATOM 174 H 1 1 2.452 21.401 19.413 0.00 0.00 0
ATOM 175 O 1 1 6.836 21.329 23.199 0.00 0.00 0
ATOM 176 H 1 1 8.249 20.848 22.320 0.00 0.00 0
ATOM 177 H 1 1 5.668 21.841 21.886 0.00 0.00 0
ATOM 178 O 1 1 4.604 15.649 30.043 0.00 0.00 0
ATOM 179 H 1 1 6.453 15.217 30.207 0.00 0.00 0
ATOM 180 H 1 1 3.822 14.762 31.562 0.00 0.00 0
ATOM 181 O 1 1 7.125 19.976 9.421 0.00 0.00 0
ATOM 182 H 1 1 5.918 20.453 10.730 0.00 0.00 0
ATOM 183 H 1 1 8.099 21.496 9.491 0.00 0.00 0
ATOM 184 O 1 1 9.063 25.912 13.186 0.00 0.00 0
ATOM 185 H 1 1 10.350 26.572 12.367 0.00 0.00 0
ATOM 186 H 1 1 9.680 24.367 13.697 0.00 0.00 0
ATOM 187 O 1 1 8.022 22.343 17.042 0.00 0.00 0
ATOM 188 H 1 1 9.144 23.367 18.074 0.00 0.00 0
ATOM 189 H 1 1 6.562 23.462 16.852 0.00 0.00 0
ATOM 190 O 1 1 10.762 26.285 19.963 0.00 0.00 0
ATOM 191 H 1 1 11.036 27.966 20.538 0.00 0.00 0
ATOM 192 H 1 1 11.078 25.401 21.456 0.00 0.00 0
ATOM 193 O 1 1 9.158 22.902 28.391 0.00 0.00 0
ATOM 194 H 1 1 8.219 23.528 27.085 0.00 0.00 0
ATOM 195 H 1 1 8.089 21.760 29.509 0.00 0.00 0
ATOM 196 O 1 1 6.219 20.158 31.921 0.00 0.00 0
ATOM 197 H 1 1 5.635 18.511 31.161 0.00 0.00 0
ATOM 198 H 1 1 7.530 19.624 33.071 0.00 0.00 0
ATOM 199 O 1 1 11.191 31.509 2.617 0.00 0.00 0
ATOM 200 H 1 1 10.460 32.214 4.108 0.00 0.00 0
ATOM 201 H 1 1 13.176 31.751 2.577 0.00 0.00 0
ATOM 202 O 1 1 4.748 0.055 8.605 0.00 0.00 0
ATOM 203 H 1 1 5.380 0.517 10.183 0.00 0.00 0
ATOM 204 H 1 1 6.050 -0.306 7.480 0.00 0.00 0
ATOM 205 O 1 1 8.695 30.809 15.731 0.00 0.00 0
ATOM 206 H 1 1 9.189 32.103 14.495 0.00 0.00 0
ATOM 207 H 1 1 8.447 29.069 14.868 0.00 0.00 0
ATOM 208 O 1 1 10.128 31.402 20.766 0.00 0.00 0
ATOM 209 H 1 1 9.456 30.905 19.155 0.00 0.00 0
ATOM 210 H 1 1 9.020 32.731 21.415 0.00 0.00 0
ATOM 211 O 1 1 12.238 30.162 25.837 0.00 0.00 0
ATOM 212 H 1 1 11.418 30.908 27.110 0.00 0.00 0
ATOM 213 H 1 1 12.396 31.331 24.678 0.00 0.00 0
ATOM 214 O 1 1 10.395 32.537 30.624 0.00 0.00 0
ATOM 215 H 1 1 11.042 34.339 30.751 0.00 0.00 0
ATOM 216 H 1 1 11.378 31.486 31.538 0.00 0.00 0
ATOM 217 O 1 1 10.438 3.626 5.087 0.00 0.00 0
ATOM 218 H 1 1 12.435 4.082 5.136 0.00 0.00 0
ATOM 219 H 1 1 9.822 4.284 6.681 0.00 0.00 0
ATOM 220 O 1 1 14.762 3.401 13.776 0.00 0.00 0
ATOM 221 H 1 1 16.518 3.824 13.376 0.00 0.00 0
ATOM 222 H 1 1 13.752 4.757 12.964 0.00 0.00 0
ATOM 223 O 1 1 12.382 1.012 17.643 0.00 0.00 0
ATOM 224 H 1 1 13.346 1.997 16.444 0.00 0.00 0
ATOM 225 H 1 1 11.931 2.133 18.998 0.00 0.00 0
ATOM 226 O 1 1 15.278 1.293 24.559 0.00 0.00 0
ATOM 227 H 1 1 16.071 0.946 26.365 0.00 0.00 0
ATOM 228 H 1 1 15.794 0.199 23.499 0.00 0.00 0
ATOM 229 O 1 1 22.226 31.627 24.712 0.00 0.00 0
ATOM 230 H 1 1 23.338 32.595 23.876 0.00 0.00 0
ATOM 231 H 1 1 22.161 30.053 24.132 0.00 0.00 0
ATOM 232 O 1 1 15.640 1.847 32.717 0.00 0.00 0
ATOM 233 H 1 1 17.488 2.473 31.874 0.00 0.00 0
ATOM 234 H 1 1 16.403 0.869 34.267 0.00 0.00 0
ATOM 235 O 1 1 14.858 10.199 2.754 0.00 0.00 0
ATOM 236 H 1 1 13.360 10.712 2.282 0.00 0.00 0
ATOM 237 H 1 1 14.560 9.316 4.559 0.00 0.00 0
ATOM 238 O 1 1 15.717 8.469 10.739 0.00 0.00 0
ATOM 239 H 1 1 17.323 9.581 10.875 0.00 0.00 0
ATOM 240 H 1 1 14.574 9.631 10.221 0.00 0.00 0
ATOM 241 O 1 1 15.248 10.398 16.525 0.00 0.00 0
ATOM 242 H 1 1 16.324 9.181 16.149 0.00 0.00 0
ATOM 243 H 1 1 14.172 10.488 15.098 0.00 0.00 0
ATOM 244 O 1 1 13.226 8.438 20.801 0.00 0.00 0
ATOM 245 H 1 1 14.043 8.996 19.295 0.00 0.00 0
ATOM 246 H 1 1 14.661 7.802 22.093 0.00 0.00 0
ATOM 247 O 1 1 10.173 10.961 25.875 0.00 0.00 0
ATOM 248 H 1 1 11.477 10.223 26.940 0.00 0.00 0
ATOM 249 H 1 1 11.269 10.738 24.343 0.00 0.00 0
ATOM 250 O 1 1 12.792 7.737 29.173 0.00 0.00 0
ATOM 251 H 1 1 12.199 6.038 29.475 0.00 0.00 0
ATOM 252 H 1 1 14.427 7.450 29.617 0.00 0.00 0
ATOM 253 O 1 1 15.180 19.498 3.578 0.00 0.00 0
ATOM 254 H 1 1 14.883 17.596 4.080 0.00 0.00 0
ATOM 255 H 1 1 16.754 19.579 2.626 0.00 0.00 0
ATOM 256 O 1 1 12.517 11.093 7.701 0.00 0.00 0
ATOM 257 H 1 1 12.224 12.778 7.555 0.00 0.00 0
ATOM 258 H 1 1 11.150 10.393 7.057 0.00 0.00 0
ATOM 259 O 1 1 16.266 16.271 10.758 0.00 0.00 0
ATOM 260 H 1 1 16.507 15.795 12.768 0.00 0.00 0
ATOM 261 H 1 1 17.725 16.977 10.292 0.00 0.00 0
ATOM 262 O 1 1 14.069 18.399 18.897 0.00 0.00 0
ATOM 263 H 1 1 15.513 17.523 18.155 0.00 0.00 0
ATOM 264 H 1 1 14.958 18.709 20.673 0.00 0.00 0
ATOM 265 O 1 1 14.099 15.480 25.510 0.00 0.00 0
ATOM 266 H 1 1 13.698 16.872 26.938 0.00 0.00 0
ATOM 267 H 1 1 12.567 15.379 24.444 0.00 0.00 0
ATOM 268 O 1 1 13.309 17.574 30.292 0.00 0.00 0
ATOM 269 H 1 1 14.937 16.934 30.810 0.00 0.00 0
ATOM 270 H 1 1 13.969 19.494 30.012 0.00 0.00 0
ATOM 271 O 1 1 18.371 23.257 0.925 0.00 0.00 0
ATOM 272 H 1 1 19.479 23.480 2.321 0.00 0.00 0
ATOM 273 H 1 1 19.087 24.325 -0.369 0.00 0.00 0
ATOM 274 O 1 1 12.100 21.730 11.355 0.00 0.00 0
ATOM 275 H 1 1 13.141 22.287 12.743 0.00 0.00 0
ATOM 276 H 1 1 13.467 22.236 10.244 0.00 0.00 0
ATOM 277 O 1 1 12.163 23.290 23.597 0.00 0.00 0
ATOM 278 H 1 1 11.324 22.736 24.949 0.00 0.00 0
ATOM 279 H 1 1 13.882 22.872 23.840 0.00 0.00 0
ATOM 280 O 1 1 20.173 26.761 22.628 0.00 0.00 0
ATOM 281 H 1 1 20.206 26.532 20.792 0.00 0.00 0
ATOM 282 H 1 1 21.556 25.742 23.389 0.00 0.00 0
ATOM 283 O 1 1 16.701 21.165 22.605 0.00 0.00 0
ATOM 284 H 1 1 18.028 20.686 23.848 0.00 0.00 0
ATOM 285 H 1 1 17.104 22.866 21.949 0.00 0.00 0
ATOM 286 O 1 1 11.391 26.461 33.705 0.00 0.00 0
ATOM 287 H 1 1 9.841 27.192 34.048 0.00 0.00 0
ATOM 288 H 1 1 11.776 25.540 35.243 0.00 0.00 0
ATOM 289 O 1 1 9.898 25.989 4.553 0.00 0.00 0
ATOM 290 H 1 1 8.902 26.131 6.039 0.00 0.00 0
ATOM 291 H 1 1 10.287 27.806 4.376 0.00 0.00 0
ATOM 292 O 1 1 14.308 26.960 10.877 0.00 0.00 0
ATOM 293 H 1 1 15.302 27.405 12.173 0.00 0.00 0
ATOM 294 H 1 1 15.463 26.151 9.633 0.00 0.00 0
ATOM 295 O 1 1 13.433 22.960 16.904 0.00 0.00 0
ATOM 296 H 1 1 13.409 24.131 18.132 0.00 0.00 0
ATOM 297 H 1 1 13.624 21.191 17.520 0.00 0.00 0
ATOM 298 O 1 1 16.409 26.768 26.875 0.00 0.00 0
ATOM 299 H 1 1 17.590 26.987 25.431 0.00 0.00 0
ATOM 300 H 1 1 14.751 27.703 26.230 0.00 0.00 0
ATOM 301 O 1 1 14.405 22.733 29.892 0.00 0.00 0
ATOM 302 H 1 1 15.423 23.079 28.494 0.00 0.00 0
ATOM 303 H 1 1 12.826 23.259 29.416 0.00 0.00 0
ATOM 304 O 1 1 6.905 29.408 0.749 0.00 0.00 0
ATOM 305 H 1 1 8.428 30.483 1.567 0.00 0.00 0
ATOM 306 H 1 1 6.353 30.814 -0.444 0.00 0.00 0
ATOM 307 O 1 1 9.189 34.159 6.509 0.00 0.00 0
ATOM 308 H 1 1 10.198 34.193 8.002 0.00 0.00 0
ATOM 309 H 1 1 9.890 35.692 5.785 0.00 0.00 0
ATOM 310 O 1 1 14.256 32.316 9.369 0.00 0.00 0
ATOM 311 H 1 1 15.733 32.867 9.486 0.00 0.00 0
ATOM 312 H 1 1 14.754 30.670 10.090 0.00 0.00 0
ATOM 313 O 1 1 14.714 30.841 16.516 0.00 0.00 0
ATOM 314 H 1 1 13.748 29.551 17.279 0.00 0.00 0
ATOM 315 H 1 1 13.218 31.933 16.614 0.00 0.00 0
ATOM 316 O 1 1 18.409 33.641 20.611 0.00 0.00 0
ATOM 317 H 1 1 19.601 32.274 21.115 0.00 0.00 0
ATOM 318 H 1 1 17.360 32.655 19.518 0.00 0.00 0
ATOM 319 O 1 1 16.062 28.638 32.207 0.00 0.00 0
ATOM 320 H 1 1 14.648 27.958 33.253 0.00 0.00 0
ATOM 321 H 1 1 15.752 28.014 30.522 0.00 0.00 0
ATOM 322 O 1 1 16.200 30.895 1.473 0.00 0.00 0
ATOM 323 H 1 1 16.626 29.968 -0.130 0.00 0.00 0
ATOM 324 H 1 1 17.167 29.833 2.927 0.00 0.00 0
ATOM 325 O 1 1 20.278 3.529 6.048 0.00 0.00 0
ATOM 326 H 1 1 20.977 3.611 4.575 0.00 0.00 0
ATOM 327 H 1 1 21.312 4.513 7.251 0.00 0.00 0
ATOM 328 O 1 1 23.079 5.778 10.408 0.00 0.00 0
ATOM 329 H 1 1 24.650 6.259 10.838 0.00 0.00 0
ATOM 330 H 1 1 22.342 7.609 10.178 0.00 0.00 0
ATOM 331 O 1 1 19.581 2.031 12.110 0.00 0.00 0
ATOM 332 H 1 1 19.039 1.082 10.440 0.00 0.00 0
ATOM 333 H 1 1 21.141 2.991 11.851 0.00 0.00 0
ATOM 334 O 1 1 22.005 3.223 23.178 0.00 0.00 0
ATOM 335 H 1 1 21.429 4.090 24.554 0.00 0.00 0
ATOM 336 H 1 1 20.654 1.791 22.711 0.00 0.00 0
ATOM 337 O 1 1 16.630 6.422 23.792 0.00 0.00 0
ATOM 338 H 1 1 16.219 4.804 24.406 0.00 0.00 0
ATOM 339 H 1 1 17.066 7.128 25.282 0.00 0.00 0
ATOM 340 O 1 1 21.676 5.564 28.158 0.00 0.00 0
ATOM 341 H 1 1 20.658 6.717 29.185 0.00 0.00 0
ATOM 342 H 1 1 23.413 5.828 28.996 0.00 0.00 0
ATOM 343 O 1 1 15.257 5.265 5.626 0.00 0.00 0
ATOM 344 H 1 1 16.914 4.519 5.490 0.00 0.00 0
ATOM 345 H 1 1 15.144 6.150 6.972 0.00 0.00 0
ATOM 346 O 1 1 20.137 11.082 10.437 0.00 0.00 0
ATOM 347 H 1 1 20.021 10.947 8.733 0.00 0.00 0
ATOM 348 H 1 1 21.025 12.555 10.853 0.00 0.00 0
ATOM 349 O 1 1 23.089 14.627 12.437 0.00 0.00 0
ATOM 350 H 1 1 24.716 15.254 12.736 0.00 0.00 0
ATOM 351 H 1 1 23.284 13.228 13.653 0.00 0.00 0
ATOM 352 O 1 1 24.083 12.649 22.566 0.00 0.00 0
ATOM 353 H 1 1 22.397 12.663 23.042 0.00 0.00 0
ATOM 354 H 1 1 24.901 13.851 23.565 0.00 0.00 0
ATOM 355 O 1 1 17.865 7.909 30.036 0.00 0.00 0
ATOM 356 H 1 1 17.509 8.045 31.982 0.00 0.00 0
ATOM 357 H 1 1 18.078 9.582 29.318 0.00 0.00 0
ATOM 358 O 1 1 18.824 8.486 0.104 0.00 0.00 0
ATOM 359 H 1 1 19.997 10.191 -0.057 0.00 0.00 0
ATOM 360 H 1 1 17.077 8.998 0.779 0.00 0.00 0
ATOM 361 O 1 1 20.122 9.143 5.343 0.00 0.00 0
ATOM 362 H 1 1 19.373 8.819 3.821 0.00 0.00 0
ATOM 363 H 1 1 21.998 8.776 5.128 0.00 0.00 0
ATOM 364 O 1 1 16.413 14.459 5.855 0.00 0.00 0
ATOM 365 H 1 1 15.536 13.007 5.239 0.00 0.00 0
ATOM 366 H 1 1 16.006 14.725 7.737 0.00 0.00 0
ATOM 367 O 1 1 17.561 15.066 15.654 0.00 0.00 0
ATOM 368 H 1 1 17.575 13.398 16.055 0.00 0.00 0
ATOM 369 H 1 1 18.978 15.828 16.400 0.00 0.00 0
ATOM 370 O 1 1 26.374 17.047 24.817 0.00 0.00 0
ATOM 371 H 1 1 27.983 17.098 25.632 0.00 0.00 0
ATOM 372 H 1 1 25.629 18.751 24.919 0.00 0.00 0
ATOM 373 O 1 1 19.784 12.960 28.706 0.00 0.00 0
ATOM 374 H 1 1 21.662 13.055 28.871 0.00 0.00 0
ATOM 375 H 1 1 19.545 14.070 27.143 0.00 0.00 0
ATOM 376 O 1 1 17.891 16.733 32.499 0.00 0.00 0
ATOM 377 H 1 1 18.327 15.240 31.277 0.00 0.00 0
ATOM 378 H 1 1 18.633 18.335 31.693 0.00 0.00 0
ATOM 379 O 1 1 23.733 23.024 1.663 0.00 0.00 0
ATOM 380 H 1 1 24.800 24.052 2.776 0.00 0.00 0
ATOM 381 H 1 1 24.693 22.618 0.198 0.00 0.00 0
ATOM 382 O 1 1 20.789 18.440 9.443 0.00 0.00 0
ATOM 383 H 1 1 20.766 17.257 7.881 0.00 0.00 0
ATOM 384 H 1 1 21.896 17.345 10.385 0.00 0.00 0
ATOM 385 O 1 1 21.574 17.493 17.838 0.00 0.00 0
ATOM 386 H 1 1 20.597 18.955 17.218 0.00 0.00 0
ATOM 387 H 1 1 22.538 16.874 16.251 0.00 0.00 0
ATOM 388 O 1 1 19.168 14.748 24.131 0.00 0.00 0
ATOM 389 H 1 1 19.711 16.390 23.712 0.00 0.00 0
ATOM 390 H 1 1 17.429 14.695 24.403 0.00 0.00 0
ATOM 391 O 1 1 22.149 20.198 24.977 0.00 0.00 0
ATOM 392 H 1 1 21.639 20.924 26.486 0.00 0.00 0
ATOM 393 H 1 1 22.656 21.657 24.411 0.00 0.00 0
ATOM 394 O 1 1 20.565 20.792 29.600 0.00 0.00 0
ATOM 395 H 1 1 22.264 20.409 30.214 0.00 0.00 0
ATOM 396 H 1 1 20.548 22.408 30.597 0.00 0.00 0
ATOM 397 O 1 1 20.802 26.547 9.615 0.00 0.00 0
ATOM 398 H 1 1 20.099 27.984 8.338 0.00 0.00 0
ATOM 399 H 1 1 21.277 27.539 11.325 0.00 0.00 0
ATOM 400 O 1 1 16.283 23.589 7.779 0.00 0.00 0
ATOM 401 H 1 1 16.093 21.973 6.712 0.00 0.00 0
ATOM 402 H 1 1 17.901 22.971 8.154 0.00 0.00 0
ATOM 403 O 1 1 18.469 29.798 13.568 0.00 0.00 0
ATOM 404 H 1 1 19.712 31.216 13.506 0.00 0.00 0
ATOM 405 H 1 1 16.872 30.343 14.396 0.00 0.00 0
ATOM 406 O 1 1 18.790 21.712 16.060 0.00 0.00 0
ATOM 407 H 1 1 19.878 23.090 16.485 0.00 0.00 0
ATOM 408 H 1 1 17.201 22.326 15.819 0.00 0.00 0
ATOM 409 O 1 1 21.747 26.084 16.349 0.00 0.00 0
ATOM 410 H 1 1 20.783 27.021 15.300 0.00 0.00 0
ATOM 411 H 1 1 22.705 27.328 17.206 0.00 0.00 0
ATOM 412 O 1 1 20.769 26.211 32.050 0.00 0.00 0
ATOM 413 H 1 1 21.488 27.404 33.328 0.00 0.00 0
ATOM 414 H 1 1 18.989 26.710 32.145 0.00 0.00 0
ATOM 415 O 1 1 19.820 29.181 5.559 0.00 0.00 0
ATOM 416 H 1 1 20.991 29.509 4.109 0.00 0.00 0
ATOM 417 H 1 1 19.431 31.018 6.221 0.00 0.00 0
ATOM 418 O 1 1 19.240 33.867 7.993 0.00 0.00 0
ATOM 419 H 1 1 19.107 35.039 6.604 0.00 0.00 0
ATOM 420 H 1 1 20.697 33.671 9.063 0.00 0.00 0
ATOM 421 O 1 1 22.511 34.976 15.793 0.00 0.00 0
ATOM 422 H 1 1 23.716 36.163 16.603 0.00 0.00 0
ATOM 423 H 1 1 21.699 36.150 14.467 0.00 0.00 0
ATOM 424 O 1 1 22.622 30.284 19.069 0.00 0.00 0
ATOM 425 H 1 1 22.049 31.351 17.725 0.00 0.00 0
ATOM 426 H 1 1 24.411 30.773 19.576 0.00 0.00 0
ATOM 427 O 1 1 18.639 33.611 28.369 0.00 0.00 0
ATOM 428 H 1 1 18.226 32.159 29.103 0.00 0.00 0
ATOM 429 H 1 1 19.906 33.008 27.158 0.00 0.00 0
ATOM 430 O 1 1 22.520 1.325 31.926 0.00 0.00 0
ATOM 431 H 1 1 22.803 2.668 30.796 0.00 0.00 0
ATOM 432 H 1 1 21.045 0.425 31.122 0.00 0.00 0
ATOM 433 O 1 1 21.754 3.789 1.159 0.00 0.00 0
ATOM 434 H 1 1 22.085 2.785 -0.180 0.00 0.00 0
ATOM 435 H 1 1 20.850 5.175 0.610 0.00 0.00 0
ATOM 436 O 1 1 28.457 5.539 12.133 0.00 0.00 0
ATOM 437 H 1 1 29.489 4.390 11.182 0.00 0.00 0
ATOM 438 H 1 1 29.161 7.131 12.587 0.00 0.00 0
ATOM 439 O 1 1 22.495 5.966 17.324 0.00 0.00 0
ATOM 440 H 1 1 24.377 5.379 17.393 0.00 0.00 0
ATOM 441 H 1 1 21.906 5.491 18.857 0.00 0.00 0
ATOM 442 O 1 1 28.128 3.304 22.287 0.00 0.00 0
ATOM 443 H 1 1 28.123 2.999 20.491 0.00 0.00 0
ATOM 444 H 1 1 26.533 3.355 22.876 0.00 0.00 0
ATOM 445 O 1 1 28.378 10.455 27.266 0.00 0.00 0
ATOM 446 H 1 1 30.019 10.292 28.051 0.00 0.00 0
ATOM 447 H 1 1 28.635 10.039 25.463 0.00 0.00 0
ATOM 448 O 1 1 27.031 8.353 34.806 0.00 0.00 0
ATOM 449 H 1 1 26.116 9.984 34.571 0.00 0.00 0
ATOM 450 H 1 1 28.685 8.951 34.739 0.00 0.00 0
ATOM 451 O 1 1 24.951 8.160 4.454 0.00 0.00 0
ATOM 452 H 1 1 25.930 9.616 5.160 0.00 0.00 0
ATOM 453 H 1 1 25.947 7.994 2.724 0.00 0.00 0
ATOM 454 O 1 1 26.937 12.436 6.869 0.00 0.00 0
ATOM 455 H 1 1 25.492 13.284 6.708 0.00 0.00 0
ATOM 456 H 1 1 27.689 13.332 8.266 0.00 0.00 0
ATOM 457 O 1 1 23.365 11.214 16.933 0.00 0.00 0
ATOM 458 H 1 1 22.247 9.744 16.789 0.00 0.00 0
ATOM 459 H 1 1 23.264 12.035 18.539 0.00 0.00 0
ATOM 460 O 1 1 28.321 8.759 22.158 0.00 0.00 0
ATOM 461 H 1 1 27.662 6.895 22.482 0.00 0.00 0
ATOM 462 H 1 1 26.971 9.710 21.902 0.00 0.00 0
ATOM 463 O 1 1 27.071 6.109 29.555 0.00 0.00 0
ATOM 464 H 1 1 27.591 7.663 28.857 0.00 0.00 0
ATOM 465 H 1 1 27.304 6.320 31.261 0.00 0.00 0
ATOM 466 O 1 1 22.474 11.704 34.640 0.00 0.00 0
ATOM 467 H 1 1 22.752 13.304 35.584 0.00 0.00 0
ATOM 468 H 1 1 22.840 12.090 33.030 0.00 0.00 0
ATOM 469 O 1 1 21.656 14.971 5.615 0.00 0.00 0
ATOM 470 H 1 1 21.690 15.860 3.977 0.00 0.00 0
ATOM 471 H 1 1 19.964 14.225 5.774 0.00 0.00 0
ATOM 472 O 1 1 28.539 21.492 9.820 0.00 0.00 0
ATOM 473 H 1 1 27.288 22.181 8.688 0.00 0.00 0
ATOM 474 H 1 1 28.065 22.420 11.602 0.00 0.00 0
ATOM 475 O 1 1 28.364 16.020 11.109 0.00 0.00 0
ATOM 476 H 1 1 30.033 16.649 12.089 0.00 0.00 0
ATOM 477 H 1 1 28.456 17.440 10.082 0.00 0.00 0
ATOM 478 O 1 1 0.054 13.686 18.103 0.00 0.00 0
ATOM 479 H 1 1 -1.714 12.928 18.841 0.00 0.00 0
ATOM 480 H 1 1 1.008 12.429 17.383 0.00 0.00 0
ATOM 481 O 1 1 24.636 12.894 29.957 0.00 0.00 0
ATOM 482 H 1 1 25.906 13.914 31.183 0.00 0.00 0
ATOM 483 H 1 1 25.641 11.609 29.162 0.00 0.00 0
ATOM 484 O 1 1 21.548 17.250 0.749 0.00 0.00 0
ATOM 485 H 1 1 21.843 19.026 0.905 0.00 0.00 0
ATOM 486 H 1 1 20.385 16.716 -0.697 0.00 0.00 0
ATOM 487 O 1 1 26.095 27.274 4.520 0.00 0.00 0
ATOM 488 H 1 1 27.889 26.458 4.505 0.00 0.00 0
ATOM 489 H 1 1 25.648 26.970 6.165 0.00 0.00 0
ATOM 490 O 1 1 23.610 22.515 8.008 0.00 0.00 0
ATOM 491 H 1 1 22.653 21.187 8.739 0.00 0.00 0
ATOM 492 H 1 1 22.286 24.095 8.444 0.00 0.00 0
ATOM 493 O 1 1 27.355 18.929 18.180 0.00 0.00 0
ATOM 494 H 1 1 27.200 20.349 17.155 0.00 0.00 0
ATOM 495 H 1 1 25.579 18.322 18.770 0.00 0.00 0
ATOM 496 O 1 1 26.765 23.633 14.444 0.00 0.00 0
ATOM 497 H 1 1 27.441 25.298 13.651 0.00 0.00 0
ATOM 498 H 1 1 25.086 24.256 14.749 0.00 0.00 0
ATOM 499 O 1 1 31.478 20.769 20.986 0.00 0.00 0
ATOM 500 H 1 1 30.440 22.509 21.135 0.00 0.00 0
ATOM 501 H 1 1 30.567 19.656 20.043 0.00 0.00 0
ATOM 502 O 1 1 24.812 20.412 32.668 0.00 0.00 0
ATOM 503 H 1 1 26.242 21.478 31.874 0.00 0.00 0
ATOM 504 H 1 1 25.787 19.023 33.158 0.00 0.00 0
ATOM 505 O 1 1 22.105 29.076 0.928 0.00 0.00 0
ATOM 506 H 1 1 23.296 27.923 1.739 0.00 0.00 0
ATOM 507 H 1 1 22.623 30.994 0.882 0.00 0.00 0
ATOM 508 O 1 1 29.572 31.256 8.626 0.00 0.00 0
ATOM 509 H 1 1 30.795 30.203 7.736 0.00 0.00 0
ATOM 510 H 1 1 28.277 31.519 7.260 0.00 0.00 0
ATOM 511 O 1 1 31.817 34.843 18.283 0.00 0.00 0
ATOM 512 H 1 1 32.438 34.389 16.474 0.00 0.00 0
ATOM 513 H 1 1 32.743 36.422 18.341 0.00 0.00 0
ATOM 514 O 1 1 27.915 25.601 19.033 0.00 0.00 0
ATOM 515 H 1 1 29.358 26.561 19.190 0.00 0.00 0
ATOM 516 H 1 1 28.148 24.429 17.530 0.00 0.00 0
ATOM 517 O 1 1 24.548 24.654 24.025 0.00 0.00 0
ATOM 518 H 1 1 25.528 25.635 22.824 0.00 0.00 0
ATOM 519 H 1 1 25.300 25.200 25.645 0.00 0.00 0
ATOM 520 O 1 1 28.540 22.922 30.370 0.00 0.00 0
ATOM 521 H 1 1 27.414 24.096 29.781 0.00 0.00 0
ATOM 522 H 1 1 29.674 23.914 31.873 0.00 0.00 0
ATOM 523 O 1 1 24.969 33.623 1.014 0.00 0.00 0
ATOM 524 H 1 1 26.521 33.058 1.518 0.00 0.00 0
ATOM 525 H 1 1 24.990 34.322 -0.683 0.00 0.00 0
ATOM 526 O 1 1 23.075 32.171 11.324 0.00 0.00 0
ATOM 527 H 1 1 23.316 32.775 13.097 0.00 0.00 0
ATOM 528 H 1 1 24.460 33.203 10.662 0.00 0.00 0
ATOM 529 O 1 1 27.497 2.736 17.224 0.00 0.00 0
ATOM 530 H 1 1 28.397 3.415 15.715 0.00 0.00 0
ATOM 531 H 1 1 28.234 1.233 17.412 0.00 0.00 0
ATOM 532 O 1 1 26.369 33.060 22.077 0.00 0.00 0
ATOM 533 H 1 1 26.170 34.746 22.264 0.00 0.00 0
ATOM 534 H 1 1 27.592 32.404 23.321 0.00 0.00 0
ATOM 535 O 1 1 30.221 30.950 25.843 0.00 0.00 0
ATOM 536 H 1 1 30.305 29.038 26.208 0.00 0.00 0
ATOM 537 H 1 1 30.363 31.979 27.414 0.00 0.00 0
ATOM 538 O 1 1 24.973 26.732 28.607 0.00 0.00 0
ATOM 539 H 1 1 25.385 28.369 29.248 0.00 0.00 0
ATOM 540 H 1 1 23.330 26.597 29.234 0.00 0.00 0
ATOM 541 O 1 1 32.165 4.857 2.258 0.00 0.00 0
ATOM 542 H 1 1 32.417 6.195 1.157 0.00 0.00 0
ATOM 543 H 1 1 32.615 3.727 1.112 0.00 0.00 0
ATOM 544 O 1 1 28.067 3.533 5.217 0.00 0.00 0
ATOM 545 H 1 1 26.960 4.447 4.158 0.00 0.00 0
ATOM 546 H 1 1 29.875 3.863 4.448 0.00 0.00 0
ATOM 547 O 1 1 33.279 2.782 13.028 0.00 0.00 0
ATOM 548 H 1 1 33.708 3.955 11.817 0.00 0.00 0
ATOM 549 H 1 1 33.656 3.545 14.631 0.00 0.00 0
ATOM 550 O 1 1 34.278 4.944 17.492 0.00 0.00 0
ATOM 551 H 1 1 33.438 6.563 17.876 0.00 0.00 0
ATOM 552 H 1 1 34.906 4.452 18.995 0.00 0.00 0
ATOM 553 O 1 1 32.363 1.908 26.092 0.00 0.00 0
ATOM 554 H 1 1 31.941 1.683 24.268 0.00 0.00 0
ATOM 555 H 1 1 33.850 1.390 26.904 0.00 0.00 0
ATOM 556 O 1 1 27.982 0.418 28.241 0.00 0.00 0
ATOM 557 H 1 1 27.516 2.080 28.309 0.00 0.00 0
ATOM 558 H 1 1 29.593 0.176 27.299 0.00 0.00 0
ATOM 559 O 1 1 28.845 14.672 2.724 0.00 0.00 0
ATOM 560 H 1 1 27.963 13.930 4.139 0.00 0.00 0
ATOM 561 H 1 1 30.386 15.714 3.379 0.00 0.00 0
ATOM 562 O 1 1 28.083 10.618 14.298 0.00 0.00 0
ATOM 563 H 1 1 28.623 12.160 13.293 0.00 0.00 0
ATOM 564 H 1 1 26.486 11.015 15.379 0.00 0.00 0
ATOM 565 O 1 1 33.867 10.545 13.306 0.00 0.00 0
ATOM 566 H 1 1 35.165 9.612 13.810 0.00 0.00 0
ATOM 567 H 1 1 33.615 10.270 11.513 0.00 0.00 0
ATOM 568 O 1 1 31.790 9.696 18.223 0.00 0.00 0
ATOM 569 H 1 1 30.484 9.334 19.421 0.00 0.00 0
ATOM 570 H 1 1 30.834 10.096 16.929 0.00 0.00 0
ATOM 571 O 1 1 30.141 15.006 21.532 0.00 0.00 0
ATOM 572 H 1 1 28.565 15.594 22.099 0.00 0.00 0
ATOM 573 H 1 1 30.942 14.253 23.077 0.00 0.00 0
ATOM 574 O 1 1 32.798 10.732 30.680 0.00 0.00 0
ATOM 575 H 1 1 34.073 9.528 30.799 0.00 0.00 0
ATOM 576 H 1 1 32.991 11.512 28.983 0.00 0.00 0
ATOM 577 O 1 1 33.652 16.265 5.086 0.00 0.00 0
ATOM 578 H 1 1 35.399 16.239 4.730 0.00 0.00 0
ATOM 579 H 1 1 33.503 17.939 5.631 0.00 0.00 0
ATOM 580 O 1 1 31.947 10.799 7.943 0.00 0.00 0
ATOM 581 H 1 1 29.894 10.549 7.619 0.00 0.00 0
ATOM 582 H 1 1 32.271 12.414 7.075 0.00 0.00 0
ATOM 583 O 1 1 0.329 15.516 11.746 0.00 0.00 0
ATOM 584 H 1 1 -0.446 14.249 12.939 0.00 0.00 0
ATOM 585 H 1 1 -0.685 17.018 11.935 0.00 0.00 0
ATOM 586 O 1 1 4.262 19.165 14.308 0.00 0.00 0
ATOM 587 H 1 1 3.579 17.691 14.920 0.00 0.00 0
ATOM 588 H 1 1 5.723 19.183 15.204 0.00 0.00 0
ATOM 589 O 1 1 32.995 13.546 25.948 0.00 0.00 0
ATOM 590 H 1 1 32.167 15.060 26.787 0.00 0.00 0
ATOM 591 H 1 1 34.425 13.800 25.007 0.00 0.00 0
ATOM 592 O 1 1 1.773 13.524 34.037 0.00 0.00 0
ATOM 593 H 1 1 0.227 14.409 33.446 0.00 0.00 0
ATOM 594 H 1 1 2.167 14.670 35.511 0.00 0.00 0
ATOM 595 O 1 1 33.029 20.529 7.247 0.00 0.00 0
ATOM 596 H 1 1 34.388 21.414 8.003 0.00 0.00 0
ATOM 597 H 1 1 31.451 20.831 8.182 0.00 0.00 0
ATOM 598 O 1 1 2.037 24.250 10.251 0.00 0.00 0
ATOM 599 H 1 1 3.743 25.008 9.876 0.00 0.00 0
ATOM 600 H 1 1 1.894 25.043 11.903 0.00 0.00 0
ATOM 601 O 1 1 32.753 19.259 13.976 0.00 0.00 0
ATOM 602 H 1 1 32.792 20.886 13.792 0.00 0.00 0
ATOM 603 H 1 1 34.334 18.799 14.976 0.00 0.00 0
ATOM 604 O 1 1 0.396 18.673 18.699 0.00 0.00 0
ATOM 605 H 1 1 -1.211 18.950 19.127 0.00 0.00 0
ATOM 606 H 1 1 0.469 16.977 18.436 0.00 0.00 0
ATOM 607 O 1 1 30.855 18.370 27.959 0.00 0.00 0
ATOM 608 H 1 1 29.759 19.681 28.690 0.00 0.00 0
ATOM 609 H 1 1 32.103 19.477 26.763 0.00 0.00 0
ATOM 610 O 1 1 27.723 15.992 33.091 0.00 0.00 0
ATOM 611 H 1 1 29.390 16.423 32.192 0.00 0.00 0
ATOM 612 H 1 1 27.801 15.859 34.804 0.00 0.00 0
ATOM 613 O 1 1 31.068 27.895 3.348 0.00 0.00 0
ATOM 614 H 1 1 32.517 27.825 4.610 0.00 0.00 0
ATOM 615 H 1 1 31.529 29.459 2.324 0.00 0.00 0
ATOM 616 O 1 1 35.039 28.008 6.663 0.00 0.00 0
ATOM 617 H 1 1 35.966 26.934 7.683 0.00 0.00 0
ATOM 618 H 1 1 36.055 28.336 5.336 0.00 0.00 0
ATOM 619 O 1 1 29.356 28.196 13.025 0.00 0.00 0
ATOM 620 H 1 1 29.210 29.335 14.589 0.00 0.00 0
ATOM 621 H 1 1 28.874 29.629 11.867 0.00 0.00 0
ATOM 622 O 1 1 32.386 28.434 18.961 0.00 0.00 0
ATOM 623 H 1 1 33.368 28.574 20.411 0.00 0.00 0
ATOM 624 H 1 1 33.410 27.406 17.949 0.00 0.00 0
ATOM 625 O 1 1 30.898 25.390 25.799 0.00 0.00 0
ATOM 626 H 1 1 32.369 25.913 24.580 0.00 0.00 0
ATOM 627 H 1 1 31.317 24.075 27.029 0.00 0.00 0
ATOM 628 O 1 1 32.259 25.611 33.104 0.00 0.00 0
ATOM 629 H 1 1 32.238 25.736 34.806 0.00 0.00 0
ATOM 630 H 1 1 33.920 25.042 32.775 0.00 0.00 0
ATOM 631 O 1 1 30.290 32.645 1.341 0.00 0.00 0
ATOM 632 H 1 1 29.949 32.793 -0.430 0.00 0.00 0
ATOM 633 H 1 1 31.762 33.340 1.847 0.00 0.00 0
ATOM 634 O 1 1 25.536 34.235 6.469 0.00 0.00 0
ATOM 635 H 1 1 25.716 36.059 6.651 0.00 0.00 0
ATOM 636 H 1 1 25.283 33.866 4.895 0.00 0.00 0
ATOM 637 O 1 1 31.674 33.161 13.106 0.00 0.00 0
ATOM 638 H 1 1 31.793 34.863 13.281 0.00 0.00 0
ATOM 639 H 1 1 30.425 32.928 11.783 0.00 0.00 0
ATOM 640 O 1 1 33.844 32.668 22.296 0.00 0.00 0
ATOM 641 H 1 1 32.750 32.234 23.524 0.00 0.00 0
ATOM 642 H 1 1 32.917 32.875 20.736 0.00 0.00 0
ATOM 643 O 1 1 31.603 30.542 30.805 0.00 0.00 0
ATOM 644 H 1 1 33.451 30.804 30.468 0.00 0.00 0
ATOM 645 H 1 1 31.575 28.816 31.756 0.00 0.00 0
ATOM 646 O 1 1 26.295 31.235 30.599 0.00 0.00 0
ATOM 647 H 1 1 27.834 30.515 30.607 0.00 0.00 0
ATOM 648 H 1 1 26.362 32.920 29.856 0.00 0.00 0
END

View File

@ -0,0 +1,6 @@
-- Example with the rudimentary PH2 code --
* This gives an example of para-H2 with the isotropic Silvera-Goldman
pair potential, as discussed in the tutorial section of the user manual.
Please refer to this section for more detailed instructions
on how to run this example.

View File

@ -0,0 +1,111 @@
TITLE Traj: positions{angstrom} Step: 0 Bead: 1
CRYST1 17.847 17.847 17.847 90.00 90.00 90.00 P 1 1
ATOM 1 H2 1 1 0.147 0.132 0.114 0.00 0.00 0
ATOM 2 H2 1 1 -0.125 2.943 3.188 0.00 0.00 0
ATOM 3 H2 1 1 3.042 2.937 0.107 0.00 0.00 0
ATOM 4 H2 1 1 2.976 -0.148 2.960 0.00 0.00 0
ATOM 5 H2 1 1 -0.229 -0.030 5.923 0.00 0.00 0
ATOM 6 H2 1 1 0.094 2.999 8.915 0.00 0.00 0
ATOM 7 H2 1 1 2.954 2.895 5.910 0.00 0.00 0
ATOM 8 H2 1 1 2.892 -0.155 8.870 0.00 0.00 0
ATOM 9 H2 1 1 -0.048 0.087 11.901 0.00 0.00 0
ATOM 10 H2 1 1 0.017 2.947 14.955 0.00 0.00 0
ATOM 11 H2 1 1 2.979 2.989 11.875 0.00 0.00 0
ATOM 12 H2 1 1 2.976 0.114 14.794 0.00 0.00 0
ATOM 13 H2 1 1 -0.053 5.852 -0.165 0.00 0.00 0
ATOM 14 H2 1 1 0.006 8.858 3.040 0.00 0.00 0
ATOM 15 H2 1 1 3.041 8.951 -0.096 0.00 0.00 0
ATOM 16 H2 1 1 3.007 5.879 2.876 0.00 0.00 0
ATOM 17 H2 1 1 0.057 5.910 6.036 0.00 0.00 0
ATOM 18 H2 1 1 -0.097 8.867 8.804 0.00 0.00 0
ATOM 19 H2 1 1 2.832 8.766 5.719 0.00 0.00 0
ATOM 20 H2 1 1 3.148 5.956 8.964 0.00 0.00 0
ATOM 21 H2 1 1 0.031 5.974 11.932 0.00 0.00 0
ATOM 22 H2 1 1 0.124 8.972 14.723 0.00 0.00 0
ATOM 23 H2 1 1 2.998 8.861 11.952 0.00 0.00 0
ATOM 24 H2 1 1 2.971 5.943 14.914 0.00 0.00 0
ATOM 25 H2 1 1 0.009 11.770 0.089 0.00 0.00 0
ATOM 26 H2 1 1 0.015 14.931 2.992 0.00 0.00 0
ATOM 27 H2 1 1 2.924 14.889 0.062 0.00 0.00 0
ATOM 28 H2 1 1 2.832 11.918 3.162 0.00 0.00 0
ATOM 29 H2 1 1 -0.097 11.885 6.105 0.00 0.00 0
ATOM 30 H2 1 1 0.169 14.731 8.889 0.00 0.00 0
ATOM 31 H2 1 1 2.877 14.750 5.921 0.00 0.00 0
ATOM 32 H2 1 1 3.078 12.038 8.936 0.00 0.00 0
ATOM 33 H2 1 1 0.019 12.011 11.885 0.00 0.00 0
ATOM 34 H2 1 1 0.139 14.848 14.841 0.00 0.00 0
ATOM 35 H2 1 1 2.904 14.835 12.020 0.00 0.00 0
ATOM 36 H2 1 1 3.083 12.013 14.942 0.00 0.00 0
ATOM 37 H2 1 1 6.042 0.051 -0.122 0.00 0.00 0
ATOM 38 H2 1 1 5.911 2.957 2.811 0.00 0.00 0
ATOM 39 H2 1 1 8.949 3.111 0.013 0.00 0.00 0
ATOM 40 H2 1 1 8.991 -0.010 2.794 0.00 0.00 0
ATOM 41 H2 1 1 6.061 0.042 6.018 0.00 0.00 0
ATOM 42 H2 1 1 6.156 3.002 8.708 0.00 0.00 0
ATOM 43 H2 1 1 8.922 3.069 5.909 0.00 0.00 0
ATOM 44 H2 1 1 8.988 0.132 9.006 0.00 0.00 0
ATOM 45 H2 1 1 5.916 0.157 11.936 0.00 0.00 0
ATOM 46 H2 1 1 6.011 2.841 14.909 0.00 0.00 0
ATOM 47 H2 1 1 8.974 2.990 11.906 0.00 0.00 0
ATOM 48 H2 1 1 8.946 -0.012 14.762 0.00 0.00 0
ATOM 49 H2 1 1 5.871 5.856 -0.119 0.00 0.00 0
ATOM 50 H2 1 1 6.164 8.843 3.017 0.00 0.00 0
ATOM 51 H2 1 1 9.193 8.762 0.076 0.00 0.00 0
ATOM 52 H2 1 1 8.834 5.965 2.835 0.00 0.00 0
ATOM 53 H2 1 1 5.987 6.003 5.941 0.00 0.00 0
ATOM 54 H2 1 1 5.977 8.974 8.839 0.00 0.00 0
ATOM 55 H2 1 1 9.025 8.846 6.022 0.00 0.00 0
ATOM 56 H2 1 1 8.848 5.694 9.143 0.00 0.00 0
ATOM 57 H2 1 1 5.924 6.032 11.865 0.00 0.00 0
ATOM 58 H2 1 1 6.019 8.827 14.866 0.00 0.00 0
ATOM 59 H2 1 1 8.835 9.076 11.941 0.00 0.00 0
ATOM 60 H2 1 1 8.891 6.039 14.895 0.00 0.00 0
ATOM 61 H2 1 1 5.856 11.998 0.105 0.00 0.00 0
ATOM 62 H2 1 1 5.828 14.783 2.903 0.00 0.00 0
ATOM 63 H2 1 1 8.942 14.899 -0.042 0.00 0.00 0
ATOM 64 H2 1 1 8.930 11.966 3.015 0.00 0.00 0
ATOM 65 H2 1 1 6.073 11.865 5.912 0.00 0.00 0
ATOM 66 H2 1 1 6.031 14.891 8.979 0.00 0.00 0
ATOM 67 H2 1 1 8.972 14.858 5.883 0.00 0.00 0
ATOM 68 H2 1 1 8.957 11.835 8.967 0.00 0.00 0
ATOM 69 H2 1 1 5.966 11.882 12.044 0.00 0.00 0
ATOM 70 H2 1 1 5.947 14.705 14.774 0.00 0.00 0
ATOM 71 H2 1 1 8.876 14.853 11.951 0.00 0.00 0
ATOM 72 H2 1 1 8.992 11.917 14.929 0.00 0.00 0
ATOM 73 H2 1 1 11.946 0.088 -0.028 0.00 0.00 0
ATOM 74 H2 1 1 11.829 3.081 3.117 0.00 0.00 0
ATOM 75 H2 1 1 15.004 3.033 -0.008 0.00 0.00 0
ATOM 76 H2 1 1 14.828 0.120 3.029 0.00 0.00 0
ATOM 77 H2 1 1 11.906 0.017 5.995 0.00 0.00 0
ATOM 78 H2 1 1 11.873 2.916 9.016 0.00 0.00 0
ATOM 79 H2 1 1 14.907 3.062 5.960 0.00 0.00 0
ATOM 80 H2 1 1 14.948 -0.122 8.864 0.00 0.00 0
ATOM 81 H2 1 1 11.869 -0.118 11.930 0.00 0.00 0
ATOM 82 H2 1 1 11.932 2.863 14.979 0.00 0.00 0
ATOM 83 H2 1 1 14.835 2.976 12.018 0.00 0.00 0
ATOM 84 H2 1 1 14.852 -0.218 14.783 0.00 0.00 0
ATOM 85 H2 1 1 11.892 5.990 0.058 0.00 0.00 0
ATOM 86 H2 1 1 11.816 8.684 2.936 0.00 0.00 0
ATOM 87 H2 1 1 14.958 8.876 -0.055 0.00 0.00 0
ATOM 88 H2 1 1 14.840 6.061 2.916 0.00 0.00 0
ATOM 89 H2 1 1 11.911 5.971 5.726 0.00 0.00 0
ATOM 90 H2 1 1 11.921 8.947 8.915 0.00 0.00 0
ATOM 91 H2 1 1 15.032 8.972 5.831 0.00 0.00 0
ATOM 92 H2 1 1 14.699 5.889 8.931 0.00 0.00 0
ATOM 93 H2 1 1 11.765 5.844 11.846 0.00 0.00 0
ATOM 94 H2 1 1 11.983 8.755 14.933 0.00 0.00 0
ATOM 95 H2 1 1 14.840 8.926 11.947 0.00 0.00 0
ATOM 96 H2 1 1 14.976 5.712 14.771 0.00 0.00 0
ATOM 97 H2 1 1 11.824 11.871 -0.007 0.00 0.00 0
ATOM 98 H2 1 1 11.894 14.840 2.771 0.00 0.00 0
ATOM 99 H2 1 1 15.039 14.928 0.021 0.00 0.00 0
ATOM 100 H2 1 1 14.876 11.851 2.910 0.00 0.00 0
ATOM 101 H2 1 1 11.785 11.934 6.071 0.00 0.00 0
ATOM 102 H2 1 1 11.937 14.681 8.929 0.00 0.00 0
ATOM 103 H2 1 1 14.935 14.902 5.873 0.00 0.00 0
ATOM 104 H2 1 1 14.882 11.944 9.007 0.00 0.00 0
ATOM 105 H2 1 1 11.941 11.956 11.877 0.00 0.00 0
ATOM 106 H2 1 1 11.791 14.900 14.955 0.00 0.00 0
ATOM 107 H2 1 1 14.838 14.947 11.831 0.00 0.00 0
ATOM 108 H2 1 1 14.891 12.005 15.050 0.00 0.00 0
END

View File

@ -0,0 +1,110 @@
108
# CELL(abcABC): 17.8469984966 17.8469984966 17.8469984966 90.00000 90.00000 90.00000 Traj: positions Step: 0 Bead: 0
H2 0.147000137166 0.132000079971 0.114000117173
H2 -0.125000123837 2.94299788633 3.18800164278
H2 3.04200165055 2.93700230854 0.107000161039
H2 2.97599737714 -0.147999752916 2.96000035008
H2 -0.228999850096 -0.0300000085539 5.92297467609
H2 0.0939998645211 2.99900071046 8.91499553915
H2 2.95399948052 2.89500151338 5.91000983444
H2 2.8920010786 -0.155000238227 8.8700154763
H2 -0.0480000242697 0.0869999083873 11.900983782
H2 0.0169999766244 2.94699846603 14.9550242141
H2 2.97899781192 2.98899926119 11.875001181
H2 2.97599737714 0.114000117173 14.7939955891
H2 -0.0529997434675 5.85201201223 -0.165000099964
H2 0.00600002287786 8.85800315363 3.04000136069
H2 3.04100150562 8.95097958943 -0.0960001543749
H2 3.00700186988 5.87900004994 2.87599875977
H2 0.0569997939979 5.91000983444 6.03600692814
H2 -0.0969997701246 8.8669991662 8.80397416049
H2 2.83199767476 8.76597923681 5.71897686163
H2 3.14800113748 5.95599533399 8.96399734879
H2 0.0309999947276 5.97398735913 11.9319935665
H2 0.12399997891 8.97198792467 14.7229800075
H2 2.99800056553 8.86101946373 11.9519964651
H2 2.97100194428 5.94297757463 14.9140129803
H2 0.00899998139907 11.7700124225 0.0890001982411
H2 0.0150000042769 14.9309995688 2.99199969597
H2 2.92400042449 14.8889828983 0.0619999894552
H2 2.83199767476 11.9180232882 3.16199787469
H2 -0.0969997701246 11.8850026303 6.10501163633
H2 0.169000150494 14.7310235011 8.88901293814
H2 2.8769989047 14.7500209629 5.92101672041
H2 3.07800157614 12.0379877617 8.93600387439
H2 0.0190000018896 12.010999724 11.8850026303
H2 0.139000036105 14.8480245822 14.8409865253
H2 2.90399752595 14.8350068229 12.0199957365
H2 3.08300230078 12.0130105974 14.9420064547
H2 6.04198663062 0.050999982791 -0.122000218234
H2 5.91101527114 2.9569999153 2.81099992306
H2 8.94902163375 3.11100106696 0.0129999790117
H2 8.9909853865 -0.0100000204905 2.79399745931
H2 6.06098409246 0.0420000013919 6.018014903
H2 6.15602431937 3.00200114524 8.7079814146
H2 8.92198067832 3.0690002718 5.90900439774
H2 8.98802199413 0.132000079971 9.00601401927
H2 5.91598953692 0.156999998903 11.9360153133
H2 6.01097684611 2.8409989791 14.9089857968
H2 8.97399879806 2.98999940612 11.9060109655
H2 8.94600532365 -0.011999992838 14.7619803679
H2 5.87100947407 5.8559808413 -0.118999783453
H2 6.16401489524 8.84297452087 3.01699802737
H2 9.19302524528 8.76201040774 0.075999901723
H2 8.8339785083 5.96499134656 2.83499810954
H2 5.9870051185 6.00298627024 5.94101961895
H2 5.97700366923 8.97399879806 8.83900569179
H2 9.02501148111 8.84599083096 6.02198373208
H2 8.84800170436 5.69399969732 9.14301799894
H2 5.92398011279 6.03198518135 11.8649997317
H2 6.0190203397 8.82699336913 14.8660166074
H2 8.834983945 9.07602416415 11.9409895791
H2 8.89102381154 6.03902323824 14.8950155185
H2 5.8559808413 11.9979819646 0.104999871185
H2 5.82798736689 14.7829887031 2.90299738102
H2 8.94198357686 14.8989843475 -0.0420000013919
H2 8.93002417191 11.9660196611 3.01499773752
H2 6.07299641512 11.8649997317 5.91202070784
H2 6.03097974465 14.8909937717 8.97902598156
H2 8.97198792467 14.8580260315 5.88302179673
H2 8.95701220962 11.8349953839 8.96701365889
H2 5.96599678326 11.8819863202 12.0440203819
H2 5.94699932142 14.7049879824 14.7739926905
H2 8.87599517877 14.852998848 11.9509910284
H2 8.9919908232 11.9170178515 14.9289886954
H2 11.9460167626 0.0880000533142 -0.0279999832887
H2 11.8290156815 3.08100201092 3.11700193652
H2 15.0040260237 3.0330003462 -0.00799999522534
H2 14.8280216837 0.11999992838 3.0289997665
H2 11.9060109655 0.0169999766244 5.99499569437
H2 11.8729903076 2.91599926507 9.01601546854
H2 14.9069749234 3.06199925731 5.96001708079
H2 14.9479861572 -0.122000218234 8.8639828561
H2 11.8690214785 -0.118000167703 11.9299826931
H2 11.9319935665 2.86300216749 14.9789959417
H2 14.8350068229 2.97599737714 12.0179848631
H2 14.8519934113 -0.217999843432 14.7829887031
H2 11.8919877694 5.99002142859 0.0579999389248
H2 11.8159979221 8.68400968698 2.93600216361
H2 14.9579876065 8.87599517877 -0.0550000333213
H2 14.8399810886 6.06098409246 2.91599926507
H2 11.9109852313 5.97102396676 5.72601491853
H2 11.9209866806 8.94701076035 8.91499553915
H2 15.0320194981 8.97198792467 5.83100367699
H2 14.6990082799 5.88900149921 8.93097669089
H2 11.764985239 5.84402143636 11.8460022699
H2 11.9830062496 8.75502526857 14.9330104422
H2 14.8399810886 8.92600242512 11.9470221993
H2 14.9759796316 5.71199172246 14.7709763805
H2 11.823988498 11.8709794342 -0.0070000090516
H2 11.8939986428 14.8399810886 2.77099941776
H2 15.0390046373 14.9279832587 0.0209999742371
H2 14.8760180566 11.8509765357 2.90999839551
H2 11.7849881376 11.9340044399 6.07098554172
H2 11.93702075 14.6810162548 8.92901873521
H2 14.9350213156 14.9020006576 5.87302034746
H2 14.8819977591 11.9440058892 9.00701945597
H2 11.9409895791 11.9560182119 11.8770120544
H2 11.7910207578 14.8999897842 14.9550242141
H2 14.838023133 14.9469807205 11.8309736371
H2 14.8909937717 12.0050200215 15.0500115233

View File

@ -0,0 +1,26 @@
<simulation verbosity='high'>
<initialize nbeads='4'>
<file mode='pdb' units='angstrom'> our_ref.pdb </file>
<velocities mode='thermal' units='kelvin'> 25 </velocities>
</initialize>
<output prefix='tut1'>
<properties filename='md' stride='1'> [step, time{picosecond}, conserved{kelvin}, temperature{kelvin}, potential{kelvin}, kinetic_cv{kelvin}] </properties>
<properties filename='force' stride='20'> [atom_f{piconewton}(atom=0;bead=0)] </properties>
<trajectory filename='pos' stride='100' format='pdb' cell_units='angstrom'> positions{angstrom} </trajectory>
<checkpoint filename='checkpoint' stride='1000' overwrite='True'/>
</output>
<total_steps> 5000 </total_steps>
<forces>
<socket mode="inet">
<address>localhost</address>
<port> 31415 </port>
</socket>
</forces>
<ensemble mode='nvt'>
<thermostat mode='pile_g'>
<tau units='femtosecond'> 25 </tau>
</thermostat>
<timestep units='femtosecond'> 1 </timestep>
<temperature units='kelvin'> 25 </temperature>
</ensemble>
</simulation>

View File

@ -0,0 +1,736 @@
<simulation verbosity='high'>
<step>5000</step>
<beads natoms='108' nbeads='4'>
<q shape='(4, 324)'>
[ -1.83955900e+00, -2.24073938e+00, -1.08250020e+00, -5.70795599e-01, 7.32627980e+00,
7.19210265e+00, -3.30615234e-01, 3.98119438e+00, 1.51691432e+00, 2.52717260e+00,
-1.27666806e+00, 4.73413388e+00, 1.12126184e+00, 1.26764230e+00, 1.02704916e+01,
1.29998780e+00, 3.73413588e+00, 1.61919862e+01, 5.88202729e+00, 8.04850032e+00,
1.24311326e+01, 1.02078708e+01, 1.86360455e+00, 1.64012625e+01, 1.17619062e+00,
4.24983476e-01, 2.55535965e+01, 1.65002846e-01, 5.34507262e+00, 2.73617602e+01,
6.62641741e+00, 5.73764066e+00, 2.33893339e+01, 6.10026934e+00, 2.56958142e+00,
2.92780910e+01, 2.01269291e+00, 8.69979574e+00, -6.33324249e-01, 1.14898211e+00,
1.61301653e+01, 3.70551886e+00, 5.80295868e+00, 1.66782201e+01, 2.75413040e-01,
5.71194979e+00, 1.32139518e+01, 7.47120998e+00, 2.90527832e+00, 1.26243247e+01,
1.18688316e+01, 3.86777222e-01, 1.86473408e+01, 1.66542003e+01, 6.49634508e+00,
1.76520477e+01, 1.52792529e+01, 9.56145353e+00, 1.16514109e+01, 1.76464481e+01,
7.90247690e-01, 1.28040514e+01, 1.99445660e+01, 1.91319083e+00, 1.48232256e+01,
2.81978021e+01, 7.47808952e+00, 1.73026463e+01, 2.15060634e+01, 7.95108626e+00,
9.08836417e+00, 2.88452581e+01, -8.39364894e-01, 2.33095835e+01, -1.26661254e+00,
-2.26048825e+00, 2.73659085e+01, 6.83034984e+00, 5.55328952e+00, 3.00964760e+01,
-2.13570013e+00, 3.85462300e+00, 2.11139559e+01, 6.98601751e+00, -1.69779185e+00,
2.02798593e+01, 8.98144417e+00, -1.83724239e+00, 2.74015435e+01, 1.70384301e+01,
5.49534087e+00, 2.92028322e+01, 1.28972834e+01, 4.00538016e+00, 2.38450279e+01,
1.73369977e+01, 6.37702010e-01, 2.23536671e+01, 2.24315602e+01, -9.17792114e-01,
2.76922986e+01, 2.71486460e+01, 4.59352860e+00, 2.73738615e+01, 2.47996576e+01,
3.50789080e+00, 2.24217692e+01, 2.85214338e+01, 1.27744386e+01, -3.16474409e+00,
-4.32938118e+00, 1.23369331e+01, 5.19778303e+00, 6.29834102e+00, 1.65171169e+01,
7.43433654e+00, -1.50763053e-01, 1.71757563e+01, 8.73504480e-02, 2.91427460e+00,
1.37000162e+01, 3.58863547e-01, 1.16430675e+01, 1.33468414e+01, 7.88277760e+00,
1.35602855e+01, 1.85311481e+01, 6.66308247e+00, 1.10802627e+01, 1.62994052e+01,
1.15789465e+00, 1.73181503e+01, 9.33358989e+00, 3.82104623e-01, 2.45811794e+01,
1.33131712e+01, 5.68071890e+00, 2.77946720e+01, 1.29013165e+01, 7.27837218e+00,
2.09147450e+01, 1.84799695e+01, -1.43953367e+00, 2.88271546e+01, 1.06297113e+01,
1.06874159e+01, 1.80009217e+00, 9.88791886e+00, 1.74750501e+01, 5.38215565e+00,
1.75814278e+01, 1.64927163e+01, -7.22490057e-01, 1.59410372e+01, 1.21327342e+01,
5.31684038e+00, 1.07398656e+01, 1.27687533e+01, 1.11831750e+01, 1.30396209e+01,
1.78543512e+01, 1.53781269e+01, 1.74549497e+01, 1.69593034e+01, 1.25392544e+01,
1.91056959e+01, 1.02634068e+01, 1.58723572e+01, 1.01017169e+01, 1.15340755e+01,
2.42047249e+01, 8.82103648e+00, 1.74196163e+01, 2.71575865e+01, 1.42717489e+01,
1.61565324e+01, 2.20042138e+01, 1.46526399e+01, 1.22238423e+01, 2.82739099e+01,
1.32115234e+01, 2.28595316e+01, -3.43176969e-01, 9.94990444e+00, 3.15261979e+01,
7.17743425e+00, 1.79725272e+01, 2.66047961e+01, -1.03202183e-01, 1.46786234e+01,
2.03983934e+01, 6.75355215e+00, 1.21898998e+01, 2.68300650e+01, 1.28501206e+01,
9.52256604e+00, 2.96146284e+01, 1.79253244e+01, 1.48734446e+01, 2.75889170e+01,
7.84459536e+00, 2.04254604e+01, 2.29273727e+01, 1.86587003e+01, 1.36039471e+01,
2.34500168e+01, 1.76328865e+01, 1.06667576e+01, 2.40841230e+01, 2.49370928e+01,
1.38349803e+01, 3.01788493e+01, 2.19453967e+01, 1.96844070e+01, 2.17383789e+01,
2.79207277e+01, 2.40109880e+01, 2.44652621e+00, 7.71232732e-01, 2.28150210e+01,
4.44993033e+00, 6.32217106e+00, 2.86959872e+01, 6.16770811e+00, 2.54155030e+00,
2.86295708e+01, 6.58513110e-01, 7.07847686e+00, 1.91416715e+01, 8.42657055e-01,
1.09318699e+01, 2.21629487e+01, 3.26372053e+00, 1.85487891e+01, 2.42299255e+01,
3.53057281e+00, 1.21895915e+01, 3.07759304e+01, 5.87270948e-01, 1.54581789e+01,
2.21462069e+01, -3.29544187e+00, 2.17376848e+01, 2.08019829e+01, 5.74042948e+00,
2.91126306e+01, 2.82616387e+01, 4.12726443e+00, 2.38117939e+01, 2.48604110e+01,
-9.81005677e-02, 2.75017597e+01, 2.19769526e+01, 9.55679072e+00, -3.48501195e-01,
2.15122044e+01, 1.35659683e+01, 4.45218017e+00, 2.70106862e+01, 1.84178475e+01,
2.90258066e+00, 3.09038945e+01, 1.13784966e+01, 3.97619446e+00, 2.33776271e+01,
1.09744756e+01, 9.48584489e+00, 2.30108491e+01, 1.65710971e+01, 1.59074187e+01,
2.90437432e+01, 1.63990319e+01, 1.41164353e+01, 3.03675824e+01, 9.36100919e+00,
1.59902897e+01, 2.19588417e+01, 9.65547975e+00, 2.31178969e+01, 2.07325650e+01,
1.43025889e+01, 2.85076354e+01, 2.79531009e+01, 1.40545290e+01, 1.99579811e+01,
2.86838426e+01, 1.23353706e+01, 2.65845766e+01, 2.36116501e+01, 2.56191152e+01,
5.93663687e+00, 2.14810798e+01, 3.18962824e+01, 6.43104769e+00, 2.61566331e+01,
3.11398548e+01, 2.04112055e+00, 2.78161522e+01, 2.39026490e+01, 3.29230633e+00,
2.35872061e+01, 1.92586393e+01, 9.42997765e+00, 2.18868541e+01, 2.93005866e+01,
1.56731672e+01, 2.57892309e+01, 3.08659127e+01, 1.04565213e+01, 2.89111102e+01,
2.23973168e+01, 1.41543879e+01, 2.40352391e+01, 1.89355855e+01, 2.26713139e+01,
2.60883570e+01, 2.53551683e+01, 3.10959184e+01, 2.56617570e+01, 2.53873006e+01,
2.02938950e+01, 2.87914567e+01, 1.97522769e+01, 2.78202344e+01, -1.76425983e+00,
-1.53558560e+00, -1.71338801e+00, -9.78599968e-01, 6.87902421e+00, 7.88543588e+00,
5.47881861e-01, 3.64324940e+00, 1.39468482e+00, 3.60000249e+00, -9.28967610e-01,
4.01716866e+00, 2.42995414e+00, 1.05628735e+00, 1.03627265e+01, 9.20694754e-01,
4.29683694e+00, 1.64579850e+01, 6.19121450e+00, 7.68893688e+00, 1.23304998e+01,
9.82833523e+00, 1.54814143e+00, 1.71545209e+01, 6.99417618e-01, 8.54622163e-02,
2.48873966e+01, -3.11309329e-01, 6.97214120e+00, 2.66220741e+01, 5.25625287e+00,
7.68138067e+00, 2.39284370e+01, 6.25528626e+00, 3.07873577e+00, 3.00882100e+01,
1.15270468e+00, 8.88014098e+00, 3.00512398e-01, 9.30446242e-01, 1.71408264e+01,
3.50661823e+00, 5.83759203e+00, 1.72729331e+01, 3.34582087e-01, 5.40503488e+00,
1.24459036e+01, 5.56073866e+00, 1.21588195e+00, 1.31551680e+01, 1.27378351e+01,
-4.66813441e-01, 1.87703376e+01, 1.69486235e+01, 6.75076580e+00, 1.83449120e+01,
1.48488718e+01, 9.47340998e+00, 1.17932793e+01, 1.67868142e+01, 6.10952151e-01,
1.27008444e+01, 2.15901214e+01, 1.76087373e+00, 1.40248834e+01, 2.78953850e+01,
6.51618548e+00, 1.72532108e+01, 2.04694567e+01, 7.36556309e+00, 9.99912211e+00,
2.91964532e+01, -7.06531579e-01, 2.27219694e+01, -1.31954187e+00, -1.54612461e+00,
2.75038363e+01, 6.70572831e+00, 5.21401215e+00, 2.84508378e+01, -1.38701455e+00,
5.24874266e+00, 2.15644003e+01, 8.28914156e+00, -2.21199280e+00, 2.06411930e+01,
9.08490967e+00, -3.69161804e-01, 2.79213183e+01, 1.67707124e+01, 5.77258212e+00,
2.95534123e+01, 1.29379476e+01, 5.27372097e+00, 2.29618317e+01, 1.82846335e+01,
5.50365226e-01, 2.32915342e+01, 2.26003508e+01, -3.23975407e-01, 2.71026192e+01,
2.69864390e+01, 5.25571146e+00, 2.84281121e+01, 2.43362803e+01, 4.19783582e+00,
2.23458941e+01, 2.89351055e+01, 1.30027038e+01, -2.89260409e+00, -3.32667625e+00,
1.24700611e+01, 5.45576814e+00, 6.79907186e+00, 1.69263149e+01, 5.70732090e+00,
1.52975089e-01, 1.72152577e+01, -5.86473536e-01, 2.60910235e+00, 1.39562777e+01,
1.10496755e+00, 9.89893108e+00, 1.27550907e+01, 6.50405608e+00, 1.44860215e+01,
1.84418079e+01, 6.98755864e+00, 1.14378627e+01, 1.73685838e+01, 1.03634629e+00,
1.72542968e+01, 9.36166090e+00, 1.26996989e+00, 2.48970836e+01, 1.35415180e+01,
4.84360499e+00, 2.82597230e+01, 1.28859648e+01, 7.62646315e+00, 2.08202186e+01,
1.82323636e+01, -1.58242560e+00, 2.82645654e+01, 9.67026415e+00, 9.99521608e+00,
1.48323928e+00, 1.06202054e+01, 1.74410916e+01, 5.30476845e+00, 1.68915394e+01,
1.66028258e+01, -3.98602304e-01, 1.52286166e+01, 1.15951307e+01, 4.88875152e+00,
1.16320855e+01, 1.18462368e+01, 1.17721604e+01, 1.30800856e+01, 1.72687237e+01,
1.52362824e+01, 1.86182764e+01, 1.72413013e+01, 1.32638271e+01, 1.90927913e+01,
1.01652528e+01, 1.60527418e+01, 9.59785151e+00, 1.16306603e+01, 2.32521891e+01,
1.02733588e+01, 1.86418357e+01, 2.65319699e+01, 1.48920616e+01, 1.69296308e+01,
2.24345192e+01, 1.44781142e+01, 1.16768928e+01, 2.87742833e+01, 1.26440243e+01,
2.31651077e+01, 1.09153308e+00, 9.32620240e+00, 3.18068970e+01, 5.91156305e+00,
1.82338682e+01, 2.68163992e+01, -6.10171355e-01, 1.56193643e+01, 1.99596118e+01,
8.12957661e+00, 1.34391603e+01, 2.79448176e+01, 1.21148599e+01, 9.90095353e+00,
2.95224900e+01, 1.88551608e+01, 1.63687321e+01, 2.81729033e+01, 7.75414361e+00,
2.11290647e+01, 2.30983265e+01, 1.80818117e+01, 1.22179830e+01, 2.36227246e+01,
1.85352948e+01, 1.00736995e+01, 2.52569655e+01, 2.39704097e+01, 1.44179838e+01,
2.90993728e+01, 2.15195489e+01, 1.95569595e+01, 2.20162082e+01, 2.86888343e+01,
2.38790793e+01, 1.81853851e+00, -8.62424353e-01, 2.30087081e+01, 3.67168316e+00,
5.79906646e+00, 2.86237895e+01, 5.77923269e+00, 1.82976727e+00, 2.97992364e+01,
-2.44824247e-01, 6.97483848e+00, 1.97479547e+01, 1.28907671e+00, 1.06238401e+01,
2.22988651e+01, 3.36189040e+00, 1.99142865e+01, 2.56182622e+01, 4.87467917e+00,
1.16104104e+01, 3.01052148e+01, -1.89720612e-01, 1.52853202e+01, 2.30601562e+01,
-3.37897609e+00, 2.20210883e+01, 2.21023714e+01, 7.37999253e+00, 2.99827770e+01,
2.83970918e+01, 5.06217176e+00, 2.39324034e+01, 2.36552267e+01, 3.97689851e-01,
2.70250248e+01, 2.32913517e+01, 1.10207360e+01, 7.64503581e-01, 2.00178673e+01,
1.37487336e+01, 4.25542754e+00, 2.60455321e+01, 1.69122386e+01, 2.31534587e+00,
3.04356904e+01, 1.25406626e+01, 5.17675092e+00, 2.38621411e+01, 1.14515762e+01,
9.75443924e+00, 2.25731071e+01, 1.62345346e+01, 1.68317268e+01, 2.84171490e+01,
1.69913568e+01, 1.42827468e+01, 2.97526886e+01, 9.31307649e+00, 1.67785293e+01,
2.17762297e+01, 8.96916957e+00, 2.19718340e+01, 2.22594418e+01, 1.33823144e+01,
2.81207945e+01, 2.77005814e+01, 1.50622075e+01, 2.05455699e+01, 2.92151641e+01,
1.30044976e+01, 2.67938258e+01, 2.17064822e+01, 2.45224793e+01, 5.39644288e+00,
2.09907797e+01, 3.13381910e+01, 6.65786528e+00, 2.44267241e+01, 2.96324924e+01,
1.59248807e+00, 2.81352950e+01, 2.52179231e+01, 3.21255854e+00, 2.29984530e+01,
1.94459863e+01, 9.90712637e+00, 1.95242101e+01, 2.89090489e+01, 1.59338674e+01,
2.54944440e+01, 3.14856070e+01, 1.10580434e+01, 2.91399127e+01, 2.38737698e+01,
1.47156065e+01, 2.36566327e+01, 1.94718712e+01, 2.27327251e+01, 2.67255132e+01,
2.57714727e+01, 3.15584870e+01, 2.55546714e+01, 2.55331520e+01, 2.06608588e+01,
2.85241759e+01, 1.96187079e+01, 2.95686729e+01, -1.28506833e+00, -1.19627373e+00,
-1.11505578e+00, -1.26613495e+00, 6.87769487e+00, 8.86664224e+00, 3.22672767e-01,
3.60048900e+00, 1.75198909e+00, 3.39985912e+00, -5.38113592e-01, 4.40630180e+00,
2.05527629e+00, 1.04780310e+00, 1.09245524e+01, 1.64433825e+00, 5.07925261e+00,
1.66693862e+01, 6.34528032e+00, 6.84652464e+00, 1.30553942e+01, 9.19503930e+00,
1.02559973e+00, 1.64900202e+01, 1.50883393e+00, 1.94153184e-01, 2.60419984e+01,
2.23637168e-01, 5.88126235e+00, 2.68151686e+01, 6.09330009e+00, 6.41359349e+00,
2.27265508e+01, 5.20417493e+00, 3.02351860e+00, 2.90727542e+01, 5.22759441e-01,
9.07723226e+00, 3.74357289e-01, 5.28407017e-01, 1.77876299e+01, 3.40818122e+00,
4.77500246e+00, 1.61051931e+01, -7.15798597e-01, 5.35494411e+00, 1.24396028e+01,
5.26132317e+00, 3.65101881e+00, 1.45180281e+01, 1.20044556e+01, 6.47702685e-01,
1.89647984e+01, 1.63575659e+01, 6.85886982e+00, 1.86666656e+01, 1.39918716e+01,
9.63134562e+00, 1.21489398e+01, 1.79744053e+01, -4.65149892e-02, 1.28820467e+01,
2.20848030e+01, 5.38141652e-01, 1.49773108e+01, 2.86234466e+01, 6.69460622e+00,
1.70430908e+01, 2.03293501e+01, 7.46084699e+00, 9.27068140e+00, 2.87672652e+01,
-1.77446797e+00, 2.31007533e+01, -1.61541146e+00, -1.44197270e+00, 2.59669452e+01,
7.05366958e+00, 6.78973516e+00, 2.82048010e+01, -6.81707442e-01, 4.11224811e+00,
2.33230735e+01, 7.64143788e+00, -1.30932484e+00, 2.00341346e+01, 8.43186122e+00,
-3.23227570e-01, 2.88456685e+01, 1.71869485e+01, 5.59484664e+00, 2.86861878e+01,
1.38255153e+01, 5.39986151e+00, 2.26670663e+01, 1.74856853e+01, 1.31353338e+00,
2.27240963e+01, 2.26573999e+01, -6.43284767e-01, 2.75545414e+01, 2.65487243e+01,
6.36781664e+00, 2.89591698e+01, 2.55204798e+01, 4.19690392e+00, 2.20492684e+01,
2.90086623e+01, 1.29407803e+01, -3.28971533e+00, -3.59953707e+00, 1.30308691e+01,
4.52526975e+00, 6.05334642e+00, 1.80200038e+01, 6.86934432e+00, -6.64799107e-01,
1.77004927e+01, -1.08469207e+00, 2.66573197e+00, 1.33883962e+01, 1.77878946e+00,
1.01478623e+01, 1.28332615e+01, 7.20488713e+00, 1.30030127e+01, 1.82890722e+01,
5.45538575e+00, 1.26731818e+01, 1.64372459e+01, 1.13264799e+00, 1.68270761e+01,
9.29480506e+00, 8.02789471e-01, 2.50004864e+01, 1.30397241e+01, 4.25942991e+00,
2.82105770e+01, 1.34839369e+01, 6.59877473e+00, 1.96748658e+01, 1.90248344e+01,
-7.34844927e-01, 2.61879859e+01, 1.06994814e+01, 1.04221404e+01, 1.19626201e+00,
9.75063627e+00, 1.82675328e+01, 4.79479047e+00, 1.67169178e+01, 1.67708791e+01,
-3.25796174e-01, 1.58140826e+01, 1.07514402e+01, 4.16021066e+00, 1.14190484e+01,
1.20130431e+01, 1.10359921e+01, 1.23286945e+01, 1.73093633e+01, 1.60093426e+01,
1.72472089e+01, 1.71555986e+01, 1.29595403e+01, 1.96515771e+01, 1.07779852e+01,
1.55906451e+01, 1.04066011e+01, 1.06852174e+01, 2.41637389e+01, 9.33300851e+00,
1.72769290e+01, 2.72366205e+01, 1.43344594e+01, 1.55444449e+01, 2.25613745e+01,
1.54876710e+01, 1.23994150e+01, 2.77630051e+01, 1.24465157e+01, 2.22953455e+01,
7.07224538e-01, 9.17225571e+00, 3.04541888e+01, 7.00444346e+00, 1.90451094e+01,
2.68206460e+01, 2.12443190e-01, 1.40421608e+01, 2.16604155e+01, 8.76748146e+00,
1.18599685e+01, 2.63467340e+01, 1.24514910e+01, 9.07508597e+00, 2.94452971e+01,
1.81138604e+01, 1.65350863e+01, 2.76724408e+01, 8.10094240e+00, 2.03902238e+01,
2.19891729e+01, 1.81613540e+01, 1.28241365e+01, 2.30836693e+01, 1.77077396e+01,
1.07839643e+01, 2.43167076e+01, 2.35379387e+01, 1.43368823e+01, 2.99960368e+01,
2.18020500e+01, 1.98836259e+01, 2.10543368e+01, 2.77564511e+01, 2.38873187e+01,
2.63596088e+00, -8.45710736e-01, 2.26031998e+01, 4.94875239e+00, 6.06483058e+00,
2.72420930e+01, 7.16044030e+00, 2.03664724e+00, 2.83819926e+01, 1.41474271e+00,
6.86956553e+00, 1.90297274e+01, 2.08547446e-01, 1.17356589e+01, 2.20093707e+01,
3.11015561e+00, 1.84015708e+01, 2.55258414e+01, 4.51413195e+00, 1.15060640e+01,
3.04420577e+01, 2.05350822e-01, 1.59037463e+01, 2.20766378e+01, -3.08680082e+00,
2.27928539e+01, 2.19423049e+01, 6.96063455e+00, 2.93175572e+01, 2.63580580e+01,
4.17130592e+00, 2.37215427e+01, 2.48207538e+01, -1.10022388e+00, 2.72061284e+01,
2.27735841e+01, 1.10983539e+01, 5.03790539e-01, 2.05447311e+01, 1.35069355e+01,
4.99617490e+00, 2.74249691e+01, 1.74389534e+01, 2.12313453e+00, 3.09387285e+01,
1.30390672e+01, 4.56728163e+00, 2.49467870e+01, 1.09552706e+01, 1.05134177e+01,
2.26330821e+01, 1.67053853e+01, 1.63758180e+01, 2.83218004e+01, 1.73740024e+01,
1.40724154e+01, 3.02682616e+01, 8.35484609e+00, 1.66575388e+01, 2.13501708e+01,
1.01994161e+01, 2.34754835e+01, 2.17794008e+01, 1.46632688e+01, 2.78344546e+01,
2.68554005e+01, 1.40368100e+01, 2.04864069e+01, 2.79509647e+01, 1.19193324e+01,
2.79392613e+01, 2.26582097e+01, 2.45440331e+01, 6.30616900e+00, 2.13859764e+01,
3.08849664e+01, 6.44869190e+00, 2.64928749e+01, 3.02400532e+01, 8.32685758e-01,
2.74640627e+01, 2.40967712e+01, 3.18770838e+00, 2.27412709e+01, 1.85562433e+01,
9.23151490e+00, 2.03983609e+01, 2.91681800e+01, 1.56979455e+01, 2.51695730e+01,
3.07717754e+01, 1.06821424e+01, 2.92168363e+01, 2.36456995e+01, 1.45948324e+01,
2.33527556e+01, 1.93047064e+01, 2.37746530e+01, 2.48248533e+01, 2.61599136e+01,
3.04541638e+01, 2.58041186e+01, 2.56474296e+01, 2.02610796e+01, 2.85417157e+01,
1.88972442e+01, 2.98568715e+01, -2.38586496e+00, -7.58828968e-01, -1.63156635e+00,
-1.24260140e-01, 7.66170676e+00, 8.26519210e+00, 8.18582687e-01, 3.21215177e+00,
8.71469426e-01, 3.32445560e+00, -1.32118548e+00, 3.91101312e+00, 2.32046567e+00,
1.58370834e+00, 1.07292588e+01, 1.33792245e+00, 4.76690685e+00, 1.57155304e+01,
5.60070334e+00, 7.35450929e+00, 1.13291649e+01, 9.38118665e+00, 1.32457406e+00,
1.64112640e+01, 2.06694803e+00, -1.08774960e-01, 2.51995098e+01, 5.83962037e-01,
6.14184963e+00, 2.60031487e+01, 7.65609079e+00, 5.60778423e+00, 2.29300579e+01,
5.77114858e+00, 2.13679298e+00, 2.93327862e+01, 2.19806103e+00, 9.68222590e+00,
1.57880111e+00, 3.14284164e-01, 1.73107320e+01, 3.17317841e+00, 5.31032205e+00,
1.67722718e+01, -3.21992890e-01, 4.86044703e+00, 1.46302272e+01, 6.21744347e+00,
3.23194778e+00, 1.36053502e+01, 1.20906550e+01, 1.05401318e+00, 1.89924170e+01,
1.86500989e+01, 7.28920551e+00, 1.90214147e+01, 1.48608421e+01, 8.94579137e+00,
1.17939437e+01, 1.76451822e+01, -2.16292241e-01, 1.27470176e+01, 2.10170183e+01,
1.86340865e+00, 1.43620945e+01, 2.88854080e+01, 7.51715045e+00, 1.76892134e+01,
2.12086589e+01, 7.40953137e+00, 8.90283609e+00, 2.82643224e+01, -1.81615954e+00,
2.35425566e+01, -6.35391065e-01, -1.81429720e+00, 2.64341698e+01, 6.21091555e+00,
5.43254354e+00, 2.75836921e+01, -9.47958758e-01, 4.71567619e+00, 2.21052659e+01,
7.88771418e+00, -1.66841626e+00, 2.04914383e+01, 8.26675658e+00, -4.59229759e-01,
2.71579580e+01, 1.68410204e+01, 5.00100432e+00, 2.90662447e+01, 1.29214242e+01,
4.69089603e+00, 2.34759714e+01, 1.67656282e+01, 6.53854823e-01, 2.38352952e+01,
2.17931036e+01, -1.01639060e+00, 2.72103570e+01, 2.59664262e+01, 4.89596274e+00,
2.77674695e+01, 2.47617265e+01, 3.70839276e+00, 2.19495406e+01, 2.77068507e+01,
1.33883490e+01, -2.96774368e+00, -3.88662826e+00, 1.21540528e+01, 4.88520987e+00,
6.46250715e+00, 1.58502434e+01, 7.52061809e+00, -5.94010768e-01, 1.80041063e+01,
-1.45785510e+00, 1.90361473e+00, 1.37682126e+01, 1.01096461e+00, 1.05140180e+01,
1.32426632e+01, 7.30651107e+00, 1.44595448e+01, 1.87287975e+01, 5.98649586e+00,
1.22746034e+01, 1.63100152e+01, 1.15741871e+00, 1.66981121e+01, 9.12913654e+00,
-2.92667679e-01, 2.45886138e+01, 1.33050334e+01, 3.97377478e+00, 2.69467178e+01,
1.42080442e+01, 6.64595078e+00, 2.01191284e+01, 1.86015542e+01, -1.75336417e+00,
2.83471787e+01, 1.08620615e+01, 1.11988186e+01, 1.95253365e+00, 9.45047887e+00,
1.75938537e+01, 4.23821913e+00, 1.70208034e+01, 1.60108143e+01, -1.22190668e+00,
1.50766040e+01, 1.12165304e+01, 5.43990155e+00, 1.09933699e+01, 1.22850779e+01,
1.16546326e+01, 1.23781385e+01, 1.80369686e+01, 1.53125056e+01, 1.73516609e+01,
1.75785987e+01, 1.18313796e+01, 1.94046667e+01, 1.10166421e+01, 1.62979612e+01,
9.66207941e+00, 1.08458701e+01, 2.37048314e+01, 8.44004940e+00, 1.70203943e+01,
2.65757559e+01, 1.43027170e+01, 1.63790927e+01, 2.18182624e+01, 1.38144113e+01,
1.12481654e+01, 2.87113704e+01, 1.23513270e+01, 2.18980717e+01, 5.17961694e-01,
9.82158593e+00, 3.06003668e+01, 6.40959927e+00, 1.97382355e+01, 2.64666452e+01,
-2.56886470e-01, 1.51138569e+01, 2.14756928e+01, 7.69843726e+00, 1.13280462e+01,
2.53724470e+01, 1.17891597e+01, 9.16645548e+00, 2.85470480e+01, 1.83229821e+01,
1.60641629e+01, 2.74309208e+01, 8.14336993e+00, 2.00104262e+01, 2.16691335e+01,
1.90509791e+01, 1.35353858e+01, 2.30944654e+01, 1.79157296e+01, 1.01235942e+01,
2.45385866e+01, 2.35448360e+01, 1.40749201e+01, 3.01972078e+01, 2.17768651e+01,
2.03786050e+01, 2.10805498e+01, 2.76935947e+01, 2.44615615e+01, 3.05749628e+00,
4.07414296e-01, 2.16336438e+01, 4.40657970e+00, 5.21060398e+00, 2.88299726e+01,
7.01128437e+00, 8.79026008e-01, 2.85241186e+01, 3.14915946e-01, 7.07809470e+00,
1.98625917e+01, 4.50200492e-03, 1.15863909e+01, 2.29376845e+01, 2.50348240e+00,
1.86113050e+01, 2.47645618e+01, 3.74984924e+00, 1.16835156e+01, 3.00116656e+01,
1.33610084e+00, 1.54039934e+01, 2.16664404e+01, -3.77318264e+00, 2.24073626e+01,
2.17213138e+01, 6.32154759e+00, 2.91289015e+01, 2.80778040e+01, 4.04768899e+00,
2.51637272e+01, 2.49482621e+01, -1.80258150e+00, 2.77649841e+01, 2.28639670e+01,
9.52095023e+00, 1.12320744e+00, 2.11060298e+01, 1.35966775e+01, 4.52804356e+00,
2.65933190e+01, 1.74870802e+01, 3.12917456e+00, 3.12581554e+01, 1.26369216e+01,
4.24969839e+00, 2.28577555e+01, 1.09623135e+01, 9.61329928e+00, 2.31292240e+01,
1.68635673e+01, 1.59562582e+01, 2.83134554e+01, 1.65993286e+01, 1.34061062e+01,
3.07651009e+01, 8.60937322e+00, 1.58164516e+01, 2.15713342e+01, 9.77426434e+00,
2.38239983e+01, 2.07170028e+01, 1.44272471e+01, 2.72915473e+01, 2.78094878e+01,
1.46067375e+01, 2.02374654e+01, 2.83102299e+01, 1.21902457e+01, 2.73283465e+01,
2.25040436e+01, 2.40201181e+01, 7.24105767e+00, 2.16659528e+01, 3.22281603e+01,
6.56727556e+00, 2.67438472e+01, 3.14254999e+01, 1.00941523e+00, 2.72477648e+01,
2.43062679e+01, 3.91537815e+00, 2.28206020e+01, 1.90617248e+01, 9.50661026e+00,
1.95693791e+01, 2.99400820e+01, 1.67827219e+01, 2.52432494e+01, 3.09283864e+01,
1.18433291e+01, 3.02997758e+01, 2.26469178e+01, 1.40818435e+01, 2.52061280e+01,
1.93512323e+01, 2.29021542e+01, 2.65208970e+01, 2.53952117e+01, 3.08512322e+01,
2.76076800e+01, 2.54724293e+01, 1.95719692e+01, 2.94254771e+01, 1.94406409e+01,
2.73992646e+01 ]
</q>
<p shape='(4, 324)'>
[ 1.40372994e-01, -1.70336384e+00, 6.37303020e-01, -3.60483257e-01, -1.10940109e+00,
3.74869623e-01, -3.25735029e-01, 7.75472220e-01, 1.10757231e+00, -2.40493336e+00,
-1.53716651e+00, 1.37041429e+00, 5.28228491e-01, 1.38616874e+00, -1.38581237e+00,
-3.77690596e-01, 2.35773187e-01, 1.37036828e+00, 1.74363360e+00, 1.46668252e+00,
9.19554977e-01, 1.46604384e+00, 7.17395153e-01, 1.16766357e+00, 5.74213643e-01,
1.73367931e-01, -1.66161161e+00, 2.33212598e+00, -9.77285003e-01, 2.41575083e-01,
-1.49585940e-01, -1.18522916e+00, 1.58553462e-01, -1.47168505e+00, -1.24387557e+00,
7.68483391e-01, -1.56677579e+00, 8.39149463e-01, -7.60108832e-01, -1.39563512e-01,
1.23618455e+00, -3.39699359e-01, -9.88358452e-01, -1.25161119e+00, 5.75688958e-01,
3.34908289e-02, -1.57137545e+00, 9.54873978e-01, 2.21048523e-01, 3.15471131e+00,
4.38424417e-01, -1.41296551e+00, -6.15293784e-01, 4.54568031e-01, 5.25912190e-01,
1.10462750e+00, -7.33687512e-01, 3.51836732e-01, 1.11696908e+00, -1.75519514e-01,
-9.87401261e-01, -1.00224818e+00, -2.06257599e+00, -8.69995365e-02, 1.96237139e-01,
-1.55878661e+00, 2.06187113e+00, 5.21020731e-03, 2.35617406e-01, 1.59018004e+00,
1.23310143e+00, -9.06287741e-01, 1.02772014e+00, -4.13278400e-01, -9.73895321e-01,
1.26420822e+00, -6.00372594e-02, -8.86889397e-01, -1.35877237e+00, 1.26542138e-01,
-1.96996606e+00, 1.16602982e+00, -1.87715811e+00, -1.07989580e+00, 1.52684255e-01,
2.69202324e+00, -7.86764932e-01, -1.26792145e+00, -2.15985504e-01, 2.83847115e-01,
-3.90074815e-02, -3.21827572e-01, 8.60927158e-01, 1.15174374e+00, -1.06395947e+00,
6.56206723e-01, 1.71687653e+00, 1.88094551e+00, -1.41246651e-01, 6.67235507e-01,
8.02729512e-01, -5.99750938e-01, 3.86175582e-01, 1.56674025e+00, 1.16770355e-01,
-1.25058894e-01, -6.64317179e-01, -1.90732529e+00, -3.49443824e-01, -1.75313244e+00,
-8.93802373e-01, -8.38911513e-02, -3.54765784e+00, 3.29189169e-01, -1.59470714e+00,
2.28214169e-01, -2.04640475e+00, -1.21363021e+00, 4.43956386e-01, 1.98553407e+00,
-6.41921427e-01, 8.31610867e-01, 2.37729074e-01, -1.96307860e+00, 5.83519443e-01,
-9.23373803e-01, -2.72733993e-01, -6.80313749e-01, -4.21629881e-01, 8.24112349e-02,
-2.02945940e-02, 4.70239760e-02, -8.87189426e-01, 2.62362546e-01, 2.90567277e-03,
-5.77088646e-01, 8.63734028e-01, 2.12881273e-01, -1.84398318e+00, -1.27537888e+00,
-8.96390165e-01, 8.67723220e-01, -7.13233254e-01, 9.98467053e-01, 1.20471615e+00,
3.80364988e-02, -3.86066496e-01, 2.80482433e-01, -5.55953973e-01, 6.99483364e-01,
-6.20862722e-01, -5.75941665e-01, -1.01810316e+00, 6.59129210e-01, 3.36528627e-01,
1.19657571e+00, 1.16325245e+00, 1.38231876e+00, -1.62296272e+00, 7.73325492e-01,
9.07953738e-01, -1.56020700e+00, 5.91276288e-01, -1.45072710e+00, 3.06498507e-01,
1.02001412e+00, -7.79180574e-01, -1.09202701e+00, 8.60608247e-01, -8.12517020e-01,
-3.29732754e-01, 7.95824769e-02, -3.53180396e-01, -6.92843090e-01, 8.08287670e-01,
-1.31368002e+00, 8.92275005e-01, 7.74460553e-01, -4.16315357e-01, 4.13327475e-01,
2.07077192e-01, -2.18589769e+00, -1.02281048e-01, 9.09167509e-02, -1.46835347e+00,
1.23256338e+00, -3.07250057e-01, 2.46249432e-01, 7.74791555e-01, 3.98298680e-01,
-5.39569195e-02, 4.73911005e-01, 1.79978269e+00, 6.49413046e-01, 1.44049305e+00,
-7.54136523e-01, 6.85251391e-01, -1.03401786e+00, -1.07121945e+00, 1.15101429e+00,
-6.78252322e-01, 3.66963136e-02, -1.11945652e-01, -4.17808375e-01, 9.68133746e-02,
1.99069757e+00, 1.55013114e+00, -1.92882805e-02, 1.33795454e+00, 7.39452603e-01,
3.77633950e-01, 1.81163711e+00, 2.58943819e+00, 1.29562203e+00, -1.48713547e+00,
-9.55424888e-01, 3.46515063e-01, 4.16880974e-01, -1.14430760e+00, -5.41540342e-01,
1.15617781e+00, -8.15311978e-01, -1.24131679e-01, -1.01785991e+00, -6.82587363e-01,
1.34485087e+00, 3.95295976e-01, 3.61637052e-01, -4.79290805e-01, 1.96407902e-02,
-6.96427808e-01, 9.65717585e-01, 4.63130635e-01, -4.12348950e-02, -6.14114134e-02,
3.76909298e-01, 1.31464930e-01, -1.96943568e+00, -2.07138054e+00, 1.07506895e+00,
-8.47693792e-02, 1.50838082e+00, 9.66357898e-01, 3.29832625e-02, 2.53592195e+00,
-8.44613584e-01, -1.75528218e-01, -1.51432281e+00, -1.30241164e+00, -2.07575407e-01,
-1.04844306e+00, -1.28575451e+00, 4.62727941e-01, 1.46590141e+00, -2.63004766e-01,
-1.01898113e+00, -1.37875255e+00, -9.12918530e-01, 1.71033710e+00, 1.02893180e+00,
-1.32634968e+00, 8.82495711e-02, -9.11997611e-01, -2.42094019e+00, -6.29467944e-01,
8.08788619e-01, 1.94804910e+00, -8.72566500e-01, 9.20033720e-01, -1.72884793e+00,
3.44191186e-01, 1.21733557e+00, 1.87515471e-01, 5.10808988e-02, 7.94329477e-01,
-3.52316495e-01, -1.00945167e+00, 7.35146276e-01, 1.07654301e+00, 1.04930155e+00,
-1.85826022e+00, -5.07927804e-01, -9.80771494e-01, -3.21767737e+00, -1.49676613e-01,
-2.15647041e-01, -1.82770370e+00, 1.49469246e+00, -1.68826911e+00, 1.62663223e+00,
-3.48742295e-01, -6.17863065e-01, -8.81308520e-01, 7.44925882e-01, 1.73070837e+00,
-1.28410488e-01, 8.64089144e-01, 3.26440658e-01, 1.10448379e+00, -1.69522830e-01,
-6.53776497e-01, 3.81864979e-01, -1.07760135e+00, -3.98562627e-01, 5.38128157e-01,
-2.29754635e-01, -2.33407869e+00, -1.25116856e-01, -1.21131987e+00, 1.08298393e+00,
1.51546625e-01, -3.56701517e-01, -9.98362812e-01, 1.03306121e-01, -4.42120758e-01,
-3.94015959e-02, -8.12077182e-01, -5.72762073e-01, -8.31013031e-01, -1.16147494e+00,
-7.35897383e-02, -1.09398682e-01, -1.40219599e+00, 9.63041766e-01, 6.60583424e-02,
-1.71857732e+00, 1.99405396e-01, -8.84068189e-01, -2.18819685e-01, 2.21366910e+00,
-1.84460428e+00, -1.05848347e+00, -1.53731311e+00, -2.25141079e-01, 8.55239543e-02,
-5.64991535e-01, -1.11243253e+00, -1.48334114e+00, 2.85484662e-01, -5.98357857e-01,
-5.62005083e-01, 5.18476929e-02, 7.20785662e-01, -9.21464830e-01, -4.17295452e-01,
-7.06470111e-01, -2.07423207e+00, -2.82738840e-01, -7.05765425e-01, 5.71154019e-01,
1.41402308e+00, 7.15224885e-01, -9.01571406e-01, -1.78966537e-01, -9.57855925e-01,
1.92815188e+00, 3.67644067e-01, -7.77398627e-01, 3.75573158e-01, -1.27570871e+00,
-1.56269598e-01, -1.20126128e+00, 5.64996896e-01, -1.45388556e+00, -4.64414199e-01,
1.88714704e+00, 1.47969578e+00, -1.96063537e-01, 5.18755530e-01, 2.68937808e+00,
-1.69730122e+00, -5.36576005e-01, 1.04962410e+00, 4.65512668e-01, 1.47912174e+00,
8.46469352e-01, 8.08058567e-01, 1.13879268e+00, 6.34831145e-01, 1.43535434e+00,
2.04580992e+00, 7.90686500e-04, 1.19722827e+00, -1.42644546e+00, 1.92405610e-01,
8.14926140e-02, -2.36223884e-01, 1.16089456e+00, 2.24765430e-01, -1.32752285e+00,
1.36642599e+00, -5.36742312e-01, 4.98821954e-01, 6.00651182e-01, -2.56801229e+00,
-2.36250226e-01, -8.57842968e-01, -3.00915036e-01, 2.41807890e+00, 7.24711670e-01,
1.36799087e+00, -1.78428862e-01, -3.59900038e-01, 3.42306822e-01, -3.98271527e-01,
-1.30912096e-01, -5.36751004e-01, -6.45495166e-01, 3.16360509e-02, -6.38708513e-01,
1.33860162e+00, 7.16436859e-01, 8.83639989e-01, -2.87900422e-01, -1.77363177e-01,
1.75217790e-01, -2.41654433e+00, -8.13755792e-02, -7.71741152e-01, 1.33456387e+00,
-5.10830196e-01, -1.10584683e+00, -1.31689363e+00, 1.17583053e+00, 6.77964594e-01,
2.99895744e-01, 5.12719967e-01, 2.06867244e+00, -2.89182146e+00, 1.84494668e+00,
3.10415200e-01, 1.64179666e+00, -2.18044104e+00, -9.27575571e-01, -8.07814665e-01,
-1.85157068e-01, 5.86693996e-01, 1.60605927e+00, -1.03758631e-01, -9.65958485e-01,
-9.06979038e-01, 5.61735019e-01, 3.35132784e-01, 6.02021180e-01, 1.76689554e-01,
-3.36488706e-02, 1.45021360e+00, 6.70122973e-01, -1.71792295e-01, 8.29616451e-01,
-8.05614322e-01, -2.58079407e+00, 1.01873565e+00, -3.81060235e-01, 1.00130704e+00,
1.55674172e+00, 2.02125219e+00, -7.48802492e-01, 1.06649929e+00, -9.65493892e-01,
-3.98926995e-01, 1.08567030e+00, -1.04009627e+00, 1.41394914e+00, 1.80976669e+00,
-4.38932124e-01, -9.96116646e-01, 2.93325605e+00, -2.65850173e+00, -2.86627210e-01,
-1.13380351e+00, 1.01776593e+00, 3.82798024e-01, -2.03015905e+00, -4.77705377e-01,
-1.52497126e-01, -3.08097496e-01, -1.22388367e+00, 7.72589230e-01, -1.18620576e+00,
7.03396905e-01, -6.07914021e-01, 1.36665589e+00, 3.05885200e-01, 8.68021103e-01,
7.85645067e-01, 6.86344886e-01, 6.60054397e-02, 6.72872685e-01, -1.72147672e+00,
-3.35687107e-01, 6.40280686e-01, 1.90765562e-01, -1.19759420e+00, 3.98723557e-01,
1.01300503e+00, 3.15092859e-01, -7.48716523e-01, -6.31490429e-01, 5.03478302e-01,
-7.97737020e-01, -3.64328563e-01, -6.84865111e-01, -5.96889804e-01, 8.97320299e-01,
-2.74447207e-01, 8.96041854e-01, 8.62447243e-01, 1.14171036e+00, 1.89620219e+00,
-2.03086042e-01, 1.21863991e+00, -7.08332672e-01, 8.65474351e-01, 8.84794271e-02,
-7.38048949e-01, -3.29738572e-01, 6.25639096e-01, 8.73860305e-01, 1.32892575e+00,
-1.08731164e+00, 7.42722680e-02, 1.10376262e+00, -2.70446460e-01, 4.84230480e-01,
-7.49397372e-01, -1.22773789e-01, -1.73175160e+00, 1.00419017e+00, 4.18612640e-01,
-1.19265354e+00, 1.89942453e+00, 2.16924392e-01, 1.98456504e+00, -4.47127896e-02,
-8.13751338e-01, -1.57721515e+00, -1.51087464e+00, 1.49149818e-01, 3.34518489e-01,
-1.49643992e+00, 3.14649899e-01, 2.07634343e+00, -6.04070136e-01, 1.87721508e+00,
-4.06863898e-01, -7.83918757e-01, 2.03531050e-01, -7.64354284e-02, 3.31824344e-01,
4.79012974e-01, 1.83535358e+00, 9.02286124e-01, -1.15207026e+00, 1.28672254e-01,
-8.26157812e-01, 1.90407166e+00, -3.96264466e-01, 1.94392469e-01, -8.73100373e-01,
-3.37468953e-03, 9.76466097e-01, 6.23291758e-02, -2.37497472e-01, 1.07993508e+00,
-3.14201676e-01, 1.70621222e+00, -9.90965410e-02, 1.20753777e-01, -6.38441546e-01,
1.41774776e+00, -5.80882309e-01, 1.09405908e+00, 3.93716017e-01, -1.28958167e+00,
4.24488630e-01, 9.55061213e-01, 1.29635151e+00, -1.96475095e-01, 1.27366715e-01,
1.13693192e-01, -1.99660506e+00, -7.38934810e-01, 1.27623410e+00, 1.67534486e+00,
2.98512870e-01, 1.48183369e+00, 1.03842506e+00, -1.05881112e+00, 3.59296217e+00,
2.33641006e+00, -4.44058636e-01, -7.05099765e-02, 3.21036779e-01, -1.92001349e-01,
-1.42762638e+00, -4.05688476e-01, 4.80851634e-01, 4.74839401e-01, 1.26185094e+00,
-1.05552598e-01, 5.56910980e-01, -5.32621114e-01, 9.34349181e-02, 2.56314544e-01,
-1.74582311e+00, 4.17470989e-01, 2.29528051e+00, 2.62392322e-01, 3.18772657e-01,
8.17214811e-01, -8.16325438e-01, -4.19774898e-01, -1.79953350e-02, 2.52742913e+00,
-2.79795924e-02, -8.35211211e-01, -3.49992939e-01, 1.17976432e+00, 1.06455248e+00,
4.99693771e-01, -3.25404106e-01, -1.19518002e+00, -1.12107657e+00, 7.08571829e-01,
-1.32836392e+00, -4.05940531e-01, -1.62901886e+00, 1.94474528e-01, 5.69560181e-01,
-1.16097389e+00, -9.55882892e-01, 8.43738270e-01, 9.60068854e-01, 3.04930133e-02,
1.09691130e-01, 5.31002976e-01, -7.96127056e-02, -2.90684090e-02, -2.90427758e-01,
6.26093036e-01, 6.57694112e-01, -4.85835995e-01, 1.80074318e-01, 1.12303284e+00,
5.23912334e-01, 5.85300514e-01, 6.21565032e-01, -6.88438319e-01, 1.76104297e+00,
4.69681129e-01, -1.50756131e+00, -2.35433970e+00, 2.20926618e-01, -1.59035655e+00,
-2.16680752e-01, -1.09766225e+00, -3.66108880e-01, 6.72549669e-01, -1.39966389e+00,
-2.64964223e-01, -4.47757200e-01, 5.31233808e-01, 1.84834139e+00, -6.02818313e-01,
-1.44473483e+00, 1.52776447e-02, -7.93366554e-01, -1.90159337e+00, 1.74463595e-01,
-2.11499652e+00, -2.25655780e+00, 1.18038845e+00, -3.70794733e-01, -8.67093500e-01,
1.43290672e+00, -1.38210097e-01, 1.14792213e+00, 1.06670774e+00, 1.03103438e+00,
-9.00433225e-02, -5.34357708e-01, -1.22908335e+00, -4.72611965e-01, 2.46111190e-01,
-1.70561610e+00, 3.92682358e-01, -1.55756928e+00, -2.37928227e-01, 2.03059408e+00,
-9.84120137e-01, -2.11053290e+00, 6.16981710e-01, -1.12243752e-01, -1.10029159e-02,
9.02048435e-01, 8.56294718e-01, 1.13642549e+00, -1.50782750e+00, -3.72301949e-01,
-1.66280307e+00, -1.38174795e+00, 8.97950650e-02, 5.55623559e-01, -6.05980874e-01,
-7.05479352e-01, 7.04832792e-01, -3.20169261e-02, -5.46153623e-01, -4.23996939e-01,
-1.87522120e+00, -4.41626784e-01, 2.28022755e+00, 1.41852748e+00, 7.22573260e-01,
2.28863935e+00, 1.32648450e+00, -1.20732385e+00, 6.48320570e-01, -5.97367023e-02,
1.26207462e-01, -2.04798081e+00, 1.13007921e+00, -1.71585140e-01, 3.14833129e-02,
1.71558970e-01, 2.30236146e-01, -2.69742619e+00, 1.36832193e+00, -4.09947214e-01,
-2.00570514e-01, 8.31050179e-01, 1.40744357e+00, -2.34268444e+00, -7.42098732e-03,
1.03611120e+00, 2.06373254e+00, -5.02279592e-01, -7.01081635e-01, 1.25847835e-01,
6.02231279e-02, -4.08815632e-01, -3.34433187e-01, 1.42676664e+00, -1.49454672e+00,
-1.24564490e+00, 1.71269292e+00, 6.82206821e-01, 8.72601070e-01, -9.22460387e-01,
4.55740724e-02, 1.33030508e+00, 6.53585708e-02, 3.13993497e-01, -2.11648823e+00,
-1.36475580e-02, 2.51552262e+00, 9.25969768e-01, -6.52019962e-01, 2.03940799e+00,
2.55910092e-01, -7.26525412e-01, -1.00207723e+00, 1.31950793e+00, -1.82967630e+00,
-4.92805660e-01, 4.07867808e-01, 6.11026922e-02, -2.11979237e-01, -2.87253727e-01,
1.11856203e+00, -2.21720426e-01, 1.84350017e+00, 7.84784426e-01, -1.49696700e+00,
9.09038266e-01, -1.27156936e+00, 9.56717220e-02, -4.15656486e-01, 4.19788418e-01,
-2.61691637e-01, -1.56861006e+00, -6.47659675e-01, -6.83293713e-01, 2.51621894e+00,
-4.44034798e-01, 1.78185380e+00, 4.60785269e-01, -2.68311726e-01, 1.04600391e+00,
-5.67576324e-01, 1.13507042e+00, -1.78393940e+00, -1.82719464e+00, -1.84508388e+00,
-1.29303124e+00, 1.35664029e+00, -9.17173260e-01, 9.85863915e-01, 1.07223755e+00,
8.84707496e-01, -1.37852063e+00, 6.19459586e-01, -2.93677966e-02, -3.18737198e-01,
1.03094159e+00, 4.89778531e-01, 1.73667810e+00, -2.03090079e-01, 3.64701299e-01,
3.48172075e-01, -1.54091587e+00, 1.04498049e+00, -1.28639737e+00, -4.71319136e-01,
8.61169102e-01, 1.61610909e+00, 7.69597251e-01, 7.68227380e-01, 1.11224694e+00,
8.48919769e-01, 3.12294367e-01, -4.93201021e-01, 6.42746189e-01, -2.27293413e-01,
2.16505068e-01, 5.52193787e-01, -1.76108774e+00, -4.43454137e-01, -1.10836243e+00,
7.49078941e-01, -5.26434049e-02, 4.23300776e-01, -1.66554395e+00, 3.10524219e-01,
1.19480829e+00, -6.29200409e-01, 6.41552685e-01, 7.60530128e-01, -1.44429069e+00,
-2.98038448e-01, 5.01177628e-01, 3.97341120e-01, 4.53467676e-01, -1.35725377e+00,
9.43314195e-01, 2.15143758e+00, 3.94302672e-01, 2.26509780e-01, 9.59313828e-01,
-1.66404768e-01, 1.65207595e-01, -2.39340233e+00, 3.14543001e+00, 1.05218765e+00,
-8.14714579e-01, -3.05710147e-01, -1.74531477e+00, -3.64151538e-01, -2.09140760e-01,
2.23739053e+00, 6.09477113e-01, 1.16899879e+00, 5.92967924e-01, -8.17673149e-01,
-1.10420428e+00, 4.65350290e-01, 2.11023040e-03, 8.14863971e-01, 1.08315984e+00,
-7.25860590e-02, -4.59896403e-01, 1.38164252e+00, 5.89336792e-01, 1.34519891e+00,
-3.63277304e-01, 9.08232031e-01, 2.05775821e-01, 1.01268871e+00, 2.25900629e-01,
1.11195741e+00, 1.46383492e+00, 1.15712737e+00, 1.37285918e+00, -3.27123406e-01,
2.10121867e+00, 3.63728898e-01, -9.64451543e-01, 7.50304023e-02, 2.26045537e+00,
-1.07848463e-01, -5.55058232e-01, 6.46210385e-01, -3.82173868e-01, 1.02724203e+00,
4.75226625e-01, 2.63486832e-01, -1.87720616e-01, 2.66714045e+00, -1.37046410e-01,
-9.47273326e-01, -2.21070556e+00, 5.16910020e-01, -1.00019802e+00, -6.10344773e-01,
-1.23626760e-01, -7.78025616e-01, 3.54873800e-01, 1.32409224e+00, -4.96383871e-01,
-8.45650299e-01, -7.06777204e-01, 7.74296088e-01, 5.40594697e-01, -2.35323920e+00,
1.10574355e+00, -2.71490739e-01, 3.89486537e-01, -2.25716891e+00, 1.08161436e+00,
-7.61396029e-01, -6.43902282e-01, 2.07071361e-01, -1.24311778e+00, 1.66718154e+00,
-1.12540846e+00, 4.04848060e-01, 9.82172410e-01, -2.22704668e-01, -4.41651091e-01,
8.11339257e-01, -1.71211605e+00, -6.16208091e-02, 8.56110168e-01, 5.66390166e-01,
6.39785155e-01, 1.39973994e+00, -6.88244744e-01, 2.42634138e+00, 3.24544610e-01,
4.48313772e-01, 7.45142689e-01, -7.23045807e-02, 1.83704141e-01, -1.47171323e+00,
-7.09077372e-01, -6.01038702e-01, -8.75281454e-01, 5.13919915e-01, -6.60822470e-01,
-1.43487765e+00, 7.49938057e-01, 2.83635875e-01, 3.07045512e-01, 1.48936195e+00,
-2.17046249e-01, 2.04101206e+00, 6.02181940e-01, -1.78421830e-01, -8.17580831e-01,
6.13386299e-01, 1.46247756e-01, -1.42514706e+00, -1.93940896e+00, -8.65275710e-01,
1.47462311e-01, -4.02301576e-01, -9.63675890e-01, -1.84120948e+00, 8.14102917e-01,
3.80760496e-01, 3.25900148e-01, -4.87843594e-01, -1.03508268e+00, 3.57676231e-01,
-6.47622001e-01, 2.14181936e+00, -3.34827796e-01, -8.07284435e-01, -8.49708166e-01,
-8.31736592e-01, 6.33904552e-01, 4.35249821e-01, -9.13698624e-01, -2.96290563e-01,
3.77906357e-02, -1.16936544e+00, -3.14920460e-03, -1.18537362e+00, 2.99624644e-01,
1.76247250e+00, -6.49375825e-01, -1.89211809e-01, -1.00974570e+00, 1.47455608e+00,
1.72728137e+00, 2.18072141e+00, -7.62571173e-01, -1.23504812e+00, 2.14290218e-01,
-7.46888683e-01, 5.53627395e-01, -7.82076567e-03, 1.56933507e+00, 1.07155739e+00,
-6.42903166e-01, -9.85900335e-01, -6.31873346e-01, -9.85430080e-01, 3.97933623e-01,
-2.07587828e+00, 2.76612669e-01, -1.22060249e+00, -2.25139829e-01, 1.80572908e+00,
-5.58028004e-01, -8.45859723e-01, -1.30829100e+00, -1.65904870e+00, -9.78603426e-01,
-3.70256932e-01, 6.40194479e-01, 1.29842617e+00, 5.79764541e-01, -2.18955795e+00,
-6.34491122e-01, 2.83457214e-01, 2.71316544e-01, 5.79996139e-01, -1.90426727e+00,
-2.20898199e+00, 5.67839219e-01, -1.04623710e+00, 1.01192986e+00, 1.18567472e+00,
-1.73342893e+00, -2.65618016e+00, 3.03138568e-01, -1.02196040e+00, -2.21750759e-01,
-1.72682912e+00, -1.23679339e+00, 3.32640475e-01, -4.60601000e-01, -7.81932128e-02,
4.11906483e+00, -1.89283131e+00, -3.88776684e-01, 1.80199833e+00, 1.96404455e+00,
3.43852965e-01, -6.23609543e-01, 1.81733087e-01, 5.72130123e-01, 1.20715657e+00,
-9.16486162e-01, -5.61833245e-01, 1.67641549e-01, -1.75329878e+00, 2.02727673e+00,
-2.28164354e-01, 8.44422552e-01, -1.51806276e+00, 1.11571422e+00, -6.35541493e-01,
-7.89951282e-02, 4.72008590e-01, -8.35642565e-01, 3.68813724e-01, -7.06411185e-01,
-2.06091646e-01, 1.16843231e+00, 2.22169824e+00, -2.13768098e+00, 2.32776602e-01,
2.52900016e-01, -1.14185849e+00, 1.66528537e-01, 1.98871626e+00, 6.88624657e-01,
1.86755853e-01, -2.60746884e-01, 2.14480822e-01, 5.74795125e-01, -1.38808062e-01,
6.23677175e-01, -2.74784978e+00, -8.37018300e-02, -3.22071295e-01, 3.66767660e-01,
-8.23091717e-01, -7.47733613e-02, 1.51128334e+00, -1.74266371e+00, -2.99285140e-01,
-5.11163366e-01, 6.42039600e-01, 2.76048507e-01, -7.37616832e-01, 1.22339395e+00,
-2.67566663e-01, -7.51730239e-02, 2.01868691e-01, 7.07868632e-01, -1.21711787e+00,
-1.85687375e+00, 1.05200890e+00, 1.47295756e+00, 2.54890967e-01, -1.24936980e+00,
-2.57051185e+00, 3.98733877e-01, -7.23513377e-01, 1.21540059e+00, 8.12283422e-01,
1.65554595e+00, -1.17091747e+00, 1.34992672e-01, -1.26490262e+00, 1.90743067e+00,
1.26996550e+00, 6.84984124e-01, -2.42826181e+00, 5.82274924e-01, -6.03997807e-02,
-2.34897259e-01, -2.82126477e+00, 6.99213914e-01, -6.24173822e-01, 9.13698195e-01,
2.30096444e+00, -7.69519522e-01, -2.05936269e+00, -5.04623275e-01, 9.51572220e-01,
-1.04990530e+00, 9.29427177e-01, -1.00119016e+00, 5.58533219e-01, -1.96190366e+00,
-2.19649662e+00, 2.76351981e-01, 1.00882502e+00, 1.77184378e+00, 1.52844587e+00,
-6.11090570e-01, 8.38972820e-01, -1.19408219e+00, 1.09833108e+00, 1.79335203e+00,
9.50652921e-01, 2.03016606e-01, -7.05328950e-01, 2.63976431e+00, 1.32128813e+00,
-3.26324584e-01, -6.03144462e-01, -1.15795682e+00, -2.84347500e-01, -2.70637624e+00,
8.99588322e-01, 1.16243638e+00, 6.23042073e-01, -1.05633172e+00, 7.74870856e-01,
1.11703946e+00, 7.31498949e-01, 4.88889866e-02, 5.18543386e-01, -1.15303239e-01,
-3.72740004e-01, 7.18707005e-01, -1.10160673e-02, -3.42219376e-01, -4.07108891e-01,
1.46297984e+00, 2.21343521e+00, 1.36672760e+00, -1.42677666e+00, -1.53701751e+00,
1.20834078e+00, 5.34986888e-01, -1.09136550e-01, 4.83101030e-01, 7.86715435e-01,
1.04015999e-01, 6.21976525e-01, -2.08139696e+00, 6.95530731e-01, 1.03483749e+00,
-1.35308249e+00, 4.56603819e-02, -2.25926466e-01, 2.43326854e-01, 6.16818669e-01,
6.94683652e-02, -2.33814385e-01, -2.22136024e+00, 1.86899901e+00, 1.10748320e+00,
1.16927626e+00, -2.45241826e+00, 1.27914126e+00, 1.60261128e+00, -1.94906569e+00,
1.97845616e+00, -4.46554806e-01, -8.02072809e-01, -1.96479219e+00, 3.59615459e-01,
-5.74916548e-01, -1.86520891e-01, 1.24436447e+00, -7.48666778e-01, -2.45964718e+00,
-2.48723344e-01, 1.49576775e+00, 1.18547459e-01, -1.24812482e+00, 1.65059802e+00,
-8.75251737e-01, -3.00917161e+00, -9.70460069e-01, -6.87370120e-01, -1.39008336e+00,
-4.98646683e-01, 1.53959956e+00, 1.34417230e+00, 7.25609309e-01, -7.97696169e-01,
-8.26531057e-01, -2.73695934e+00, 2.27172885e+00, 1.58063398e-01, -5.75734209e-01,
-1.20968554e+00, 8.79594164e-01, -1.97505063e-01, 6.07633769e-01, -5.23534759e-01,
5.39579521e-01, -1.43180248e+00, -1.31573180e+00, 2.06689061e-01, 8.44228287e-01,
1.01539177e-01, 8.50313924e-01, 1.13773193e+00, -6.09337003e-01, 1.22573408e+00,
1.60308325e+00, -3.58368736e+00, -1.44948284e+00, -1.41743392e+00, -5.61340107e-01,
-9.68290606e-01, -2.02739053e+00, 2.71090499e-01, 2.51806453e+00, -9.34553301e-02,
5.98489523e-01, 1.00383713e-01, 1.47096663e+00, -1.87702008e+00, -9.71287935e-01,
1.36813300e+00, -1.05133427e-01, -7.45511518e-01, 1.15482681e-02, 7.41538344e-01,
4.89211699e-01, 1.78611375e-01, -3.22591658e-01, -6.62753734e-01, -6.79941629e-01,
-1.56662518e+00, -1.30972025e+00, -9.95839674e-01, 5.78534201e-01, -3.55251735e-01,
-4.20144708e-02, 2.11099051e-01, -1.37500178e+00, 3.05860052e-01, 2.39801447e+00,
1.06806434e-01, -4.31891309e-02, -5.92778723e-01, -2.33810000e-01, 2.73379933e-01,
-8.91777478e-01, -5.54188105e-01, -7.29232486e-01, -2.61636425e-02, -2.56123061e+00,
-1.82546639e+00 ]
</p>
<m shape='(108)'>
[ 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03 ]
</m>
<names shape='(108)'>
[ H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2 ]
</names>
</beads>
<total_steps>5000</total_steps>
<cell shape='(3, 3)'>
[ 3.37259417e+01, 2.06511833e-15, 2.06511833e-15, 0.00000000e+00, 3.37259417e+01,
2.06511833e-15, 0.00000000e+00, 0.00000000e+00, 3.37259417e+01 ]
</cell>
<forces>
<socket>
<port>31415</port>
</socket>
</forces>
<output prefix=''>
<properties shape='(6)' filename='tut1.md'>
[ step, time{picosecond}, conserved{kelvin}, temperature{kelvin}, potential{kelvin},
kinetic_cv{kelvin} ]
</properties>
<properties stride='20' shape='(1)' filename='tut1.force'> [ atom_f{piconewton}(atom=0;bead=0) ] </properties>
<trajectory format='pdb' filename='tut1.pos' stride='100' cell_units='angstrom'>positions{angstrom}</trajectory>
<checkpoint stride='1000' filename='tut1.checkpoint'>6</checkpoint>
</output>
<prng>
<state shape='(624)'>
[ 2687888409, 4059721984, 529212847, 1944050140, 549951740,
753730274, 4256902940, 3644633819, 1619935418, 2926854959,
3845596702, 3377185214, 672656208, 1522275289, 2252162595,
3840064745, 4027492069, 3675681571, 2579879846, 1816332499,
4032401752, 1911816378, 303445975, 1468438718, 4013747657,
1340600813, 2333908485, 2694837801, 4170600699, 2510847348,
3039951471, 3744192067, 1926386446, 1272375545, 1414207521,
66179398, 4083890893, 4151044133, 576437212, 1676792606,
434309634, 1907904212, 552501071, 2721977900, 1774218030,
2379944892, 895572049, 964207007, 855123501, 322370220,
2071560835, 311075834, 2622627631, 3049706185, 2343013325,
68709345, 1862864050, 3480897554, 1688711674, 3849088037,
2335410691, 2553458415, 3853338058, 2210199727, 2794071459,
2398176951, 3934057850, 1698758425, 1011318686, 1806201471,
1034736815, 3855360847, 835665231, 2475925733, 233924796,
3024757758, 2198530484, 3673044703, 1249768122, 3962863565,
3357863236, 2995035040, 307264231, 726406611, 2449569067,
2105792248, 2511154863, 1776943467, 1288186977, 1069459630,
4142069906, 2662399901, 2976669074, 3587203732, 2374529826,
1425481845, 228954896, 829104572, 3792121363, 2155121068,
4012537920, 4004560763, 1828234324, 523136808, 212778594,
2400962328, 2941249333, 941934455, 1185399473, 1989697055,
3876270640, 2356595322, 2240658826, 1455744954, 1294764103,
197281598, 3596260716, 1784450322, 4229237399, 2625160461,
3437563840, 99534139, 4231199313, 4186457231, 1356327267,
11955050, 694326214, 3281619587, 1501920361, 4047724237,
254407815, 1209336385, 2469757968, 3247917043, 467877924,
714928015, 1424369871, 2112691093, 961450464, 1302826015,
1508195287, 2682046824, 1166405749, 130758490, 669915191,
3325468865, 2863429703, 99481154, 2455859519, 3512819878,
2058734245, 713709489, 92681358, 1270820689, 2875258344,
4089059727, 2319856617, 3246994482, 2375401460, 3526989769,
2037481502, 1523778672, 4277357577, 3378312673, 1761280988,
385602812, 2806072191, 263793228, 3893867788, 1122562696,
3292179677, 196613098, 1412940405, 437753556, 2089537898,
3093827021, 2543771523, 2707596589, 4247024898, 423016972,
1950202748, 619404510, 1524092033, 2603783903, 1668886628,
1610491330, 203643004, 378998824, 3077420296, 1135622483,
1741156718, 4043803158, 134627695, 3826076900, 2236198903,
1299249975, 1841801847, 1664600294, 3214378313, 4189671272,
3480243241, 2314880827, 726164864, 1258895459, 1021877225,
57278710, 2540601428, 2729779922, 1740214549, 1640865107,
1355185385, 2109593488, 2195506700, 672372257, 2178115007,
1875949822, 1689867492, 385658740, 2445406785, 271863064,
988127097, 1025468932, 2359419817, 30505704, 3740615491,
302654725, 68322970, 3937476624, 1133164597, 2115798914,
320399345, 783710429, 2653212426, 3534685928, 1799928422,
3374564924, 140092188, 2838741355, 118331603, 3274090979,
2536288199, 424964681, 2624886533, 930882804, 2205394448,
2184146172, 676812400, 3846276446, 3664199786, 1428020191,
174713762, 1742043028, 1988587715, 250315220, 3460710952,
518855886, 3301263820, 3376830340, 1924596217, 3991359611,
4018324691, 2736101407, 3348220756, 4134954748, 1014806456,
811815211, 2969949177, 1648717003, 1095340695, 3941199066,
1442177871, 2118024477, 3440070762, 2652513624, 2449760687,
3263443330, 2902806218, 3234417117, 1849567332, 947381041,
3667048364, 951549915, 3479164436, 3858250612, 331400252,
2281345388, 2762215954, 3082365401, 683228175, 3454398927,
970279118, 2070406438, 3049304524, 1693733059, 175159517,
1769171565, 2762326718, 2494712358, 1596534753, 696283870,
2018059673, 92137961, 494184422, 392011733, 1385029818,
934252405, 333359117, 3764822796, 1330799844, 1968964095,
1099463842, 3602247127, 2198538609, 99239880, 3666952197,
1538751175, 687515492, 1759850188, 1784319556, 219306934,
3607066683, 3549791334, 1244006176, 3168276190, 2506130029,
934365798, 4125460139, 2267772610, 4123099235, 3145641762,
2282867996, 947174487, 2735752579, 1153570283, 1214198797,
3843855592, 226542409, 1556151146, 2140750114, 173612017,
3793649149, 513160329, 1696259753, 2196908248, 4236321655,
3978054768, 3076169778, 1237756707, 794294503, 2478806329,
3270485108, 21511829, 3648378180, 2173244083, 390728983,
1613278496, 245589104, 1871555825, 840092166, 2005126608,
2086709055, 346538249, 755528088, 4150217063, 1800593080,
2996189003, 223378615, 26641502, 1408725657, 1055486622,
2783260926, 2418422845, 1425876347, 2681749907, 689577833,
2439224882, 1119191698, 3284738598, 3248369824, 2184806341,
3827067703, 1403375638, 2039560728, 2026930258, 1439858255,
3646642925, 357706083, 801162144, 200302113, 843383109,
3953988752, 803642989, 133507707, 1890262095, 2010928680,
153102298, 62155903, 277159866, 3184049271, 3470490419,
1263803797, 1744789719, 291191777, 2104793752, 3710673355,
690715888, 3985842110, 2609560703, 850539005, 86744360,
1737104979, 1863808169, 1774594416, 295814460, 349948339,
2998856642, 2965669633, 1901828086, 3978738887, 1547972061,
3099911135, 2005717380, 567557764, 4005749125, 2160875982,
3708061218, 71131479, 4020136758, 2494015768, 1649237263,
3904477723, 398737933, 1060721700, 1863476301, 370356512,
3071414126, 2579819024, 1413367122, 2902740002, 111597792,
3291486874, 2640531015, 3168695648, 2512654909, 3959449531,
2099836667, 1724339088, 1513859793, 1867797563, 72940112,
150365030, 2695841664, 1822792143, 1313669546, 2967322181,
520611643, 353667991, 2717535171, 3765848346, 388428102,
1356267895, 3512676772, 370279636, 3846898162, 230096495,
1637173159, 611261822, 1005164736, 269482378, 3515088803,
3384787851, 219854487, 3527128574, 1621986556, 2351564858,
1464556636, 3969432414, 4241153635, 3481875215, 2028710485,
2552303669, 398357876, 502240174, 2783848798, 3029135000,
3389310739, 2505116094, 142532114, 3164584552, 2476051612,
3402430270, 3909441351, 3427500434, 334653597, 3680534388,
994471388, 3554495285, 1194116172, 2229772907, 1080120321,
764714490, 2033099135, 14870392, 1699063853, 4063486208,
1292743360, 2032090912, 72238972, 161094465, 1452285444,
2672671278, 1692937611, 1323803845, 3240748400, 4018998180,
747254077, 236045767, 3239449578, 983232024, 3337514013,
1251769771, 3333700522, 410670915, 987407435, 2475716801,
2872258033, 4098868775, 1252507952, 3804640001, 1349395704,
3776831082, 2921973556, 4089719272, 2209056770, 4132418611,
1349045766, 1096167788, 946557058, 2742739413, 675697683,
981116951, 3762459934, 735892043, 2820765771, 3285067216,
2160644040, 3791763118, 3326789900, 4049571064, 2680776632,
3569204094, 65929649, 3389067210, 3597945585, 1844146738,
2700511765, 329482853, 1760204187, 923334769, 4064120545,
3501525441, 185277522, 1241941790, 3591317416, 417403194,
1300287444, 568015210, 1937417620, 1293297106, 1132926831,
2866724791, 3257502829, 2947848120, 3895316838, 522557077,
3227142004, 3090084150, 1099385887, 281296826, 1305525858,
4048212751, 1083053479, 1851665893, 2417839863, 1623516667,
3571192609, 3711731288, 2688150423, 1385750380, 3001410324,
3992036671, 438613795, 1675062808, 126103207, 3806023665,
3378609204, 3872710810, 3254661971, 3271656093, 2954958773,
2955771203, 943499290, 1783244758, 27256593, 2736330207,
2854314347, 1414980118, 3499653814, 2716003330, 1906739972,
2097871403, 833490830, 860249641, 1359898654, 681385897,
768010275, 1337229341, 2176361026, 1243749829, 2535464086,
3587794549, 257320265, 1799338138, 2326145708 ]
</state>
<seed>12345</seed>
<set_pos>432</set_pos>
<gauss> -8.30560467e-01</gauss>
</prng>
<ensemble mode='nvt'>
<thermostat mode='pile_g'>
<tau> 1.03353433e+03</tau>
<ethermo> 2.24648494e-02</ethermo>
</thermostat>
<timestep> 4.13413730e+01</timestep>
<temperature> 7.91703800e-05</temperature>
</ensemble>
</simulation>

View File

@ -0,0 +1,742 @@
<simulation verbosity='high'>
<beads natoms='108' nbeads='4'>
<q shape='(4, 324)'>
[ -1.83955900e+00, -2.24073938e+00, -1.08250020e+00, -5.70795599e-01, 7.32627980e+00,
7.19210265e+00, -3.30615234e-01, 3.98119438e+00, 1.51691432e+00, 2.52717260e+00,
-1.27666806e+00, 4.73413388e+00, 1.12126184e+00, 1.26764230e+00, 1.02704916e+01,
1.29998780e+00, 3.73413588e+00, 1.61919862e+01, 5.88202729e+00, 8.04850032e+00,
1.24311326e+01, 1.02078708e+01, 1.86360455e+00, 1.64012625e+01, 1.17619062e+00,
4.24983476e-01, 2.55535965e+01, 1.65002846e-01, 5.34507262e+00, 2.73617602e+01,
6.62641741e+00, 5.73764066e+00, 2.33893339e+01, 6.10026934e+00, 2.56958142e+00,
2.92780910e+01, 2.01269291e+00, 8.69979574e+00, -6.33324249e-01, 1.14898211e+00,
1.61301653e+01, 3.70551886e+00, 5.80295868e+00, 1.66782201e+01, 2.75413040e-01,
5.71194979e+00, 1.32139518e+01, 7.47120998e+00, 2.90527832e+00, 1.26243247e+01,
1.18688316e+01, 3.86777222e-01, 1.86473408e+01, 1.66542003e+01, 6.49634508e+00,
1.76520477e+01, 1.52792529e+01, 9.56145353e+00, 1.16514109e+01, 1.76464481e+01,
7.90247690e-01, 1.28040514e+01, 1.99445660e+01, 1.91319083e+00, 1.48232256e+01,
2.81978021e+01, 7.47808952e+00, 1.73026463e+01, 2.15060634e+01, 7.95108626e+00,
9.08836417e+00, 2.88452581e+01, -8.39364894e-01, 2.33095835e+01, -1.26661254e+00,
-2.26048825e+00, 2.73659085e+01, 6.83034984e+00, 5.55328952e+00, 3.00964760e+01,
-2.13570013e+00, 3.85462300e+00, 2.11139559e+01, 6.98601751e+00, -1.69779185e+00,
2.02798593e+01, 8.98144417e+00, -1.83724239e+00, 2.74015435e+01, 1.70384301e+01,
5.49534087e+00, 2.92028322e+01, 1.28972834e+01, 4.00538016e+00, 2.38450279e+01,
1.73369977e+01, 6.37702010e-01, 2.23536671e+01, 2.24315602e+01, -9.17792114e-01,
2.76922986e+01, 2.71486460e+01, 4.59352860e+00, 2.73738615e+01, 2.47996576e+01,
3.50789080e+00, 2.24217692e+01, 2.85214338e+01, 1.27744386e+01, -3.16474409e+00,
-4.32938118e+00, 1.23369331e+01, 5.19778303e+00, 6.29834102e+00, 1.65171169e+01,
7.43433654e+00, -1.50763053e-01, 1.71757563e+01, 8.73504480e-02, 2.91427460e+00,
1.37000162e+01, 3.58863547e-01, 1.16430675e+01, 1.33468414e+01, 7.88277760e+00,
1.35602855e+01, 1.85311481e+01, 6.66308247e+00, 1.10802627e+01, 1.62994052e+01,
1.15789465e+00, 1.73181503e+01, 9.33358989e+00, 3.82104623e-01, 2.45811794e+01,
1.33131712e+01, 5.68071890e+00, 2.77946720e+01, 1.29013165e+01, 7.27837218e+00,
2.09147450e+01, 1.84799695e+01, -1.43953367e+00, 2.88271546e+01, 1.06297113e+01,
1.06874159e+01, 1.80009217e+00, 9.88791886e+00, 1.74750501e+01, 5.38215565e+00,
1.75814278e+01, 1.64927163e+01, -7.22490057e-01, 1.59410372e+01, 1.21327342e+01,
5.31684038e+00, 1.07398656e+01, 1.27687533e+01, 1.11831750e+01, 1.30396209e+01,
1.78543512e+01, 1.53781269e+01, 1.74549497e+01, 1.69593034e+01, 1.25392544e+01,
1.91056959e+01, 1.02634068e+01, 1.58723572e+01, 1.01017169e+01, 1.15340755e+01,
2.42047249e+01, 8.82103648e+00, 1.74196163e+01, 2.71575865e+01, 1.42717489e+01,
1.61565324e+01, 2.20042138e+01, 1.46526399e+01, 1.22238423e+01, 2.82739099e+01,
1.32115234e+01, 2.28595316e+01, -3.43176969e-01, 9.94990444e+00, 3.15261979e+01,
7.17743425e+00, 1.79725272e+01, 2.66047961e+01, -1.03202183e-01, 1.46786234e+01,
2.03983934e+01, 6.75355215e+00, 1.21898998e+01, 2.68300650e+01, 1.28501206e+01,
9.52256604e+00, 2.96146284e+01, 1.79253244e+01, 1.48734446e+01, 2.75889170e+01,
7.84459536e+00, 2.04254604e+01, 2.29273727e+01, 1.86587003e+01, 1.36039471e+01,
2.34500168e+01, 1.76328865e+01, 1.06667576e+01, 2.40841230e+01, 2.49370928e+01,
1.38349803e+01, 3.01788493e+01, 2.19453967e+01, 1.96844070e+01, 2.17383789e+01,
2.79207277e+01, 2.40109880e+01, 2.44652621e+00, 7.71232732e-01, 2.28150210e+01,
4.44993033e+00, 6.32217106e+00, 2.86959872e+01, 6.16770811e+00, 2.54155030e+00,
2.86295708e+01, 6.58513110e-01, 7.07847686e+00, 1.91416715e+01, 8.42657055e-01,
1.09318699e+01, 2.21629487e+01, 3.26372053e+00, 1.85487891e+01, 2.42299255e+01,
3.53057281e+00, 1.21895915e+01, 3.07759304e+01, 5.87270948e-01, 1.54581789e+01,
2.21462069e+01, -3.29544187e+00, 2.17376848e+01, 2.08019829e+01, 5.74042948e+00,
2.91126306e+01, 2.82616387e+01, 4.12726443e+00, 2.38117939e+01, 2.48604110e+01,
-9.81005677e-02, 2.75017597e+01, 2.19769526e+01, 9.55679072e+00, -3.48501195e-01,
2.15122044e+01, 1.35659683e+01, 4.45218017e+00, 2.70106862e+01, 1.84178475e+01,
2.90258066e+00, 3.09038945e+01, 1.13784966e+01, 3.97619446e+00, 2.33776271e+01,
1.09744756e+01, 9.48584489e+00, 2.30108491e+01, 1.65710971e+01, 1.59074187e+01,
2.90437432e+01, 1.63990319e+01, 1.41164353e+01, 3.03675824e+01, 9.36100919e+00,
1.59902897e+01, 2.19588417e+01, 9.65547975e+00, 2.31178969e+01, 2.07325650e+01,
1.43025889e+01, 2.85076354e+01, 2.79531009e+01, 1.40545290e+01, 1.99579811e+01,
2.86838426e+01, 1.23353706e+01, 2.65845766e+01, 2.36116501e+01, 2.56191152e+01,
5.93663687e+00, 2.14810798e+01, 3.18962824e+01, 6.43104769e+00, 2.61566331e+01,
3.11398548e+01, 2.04112055e+00, 2.78161522e+01, 2.39026490e+01, 3.29230633e+00,
2.35872061e+01, 1.92586393e+01, 9.42997765e+00, 2.18868541e+01, 2.93005866e+01,
1.56731672e+01, 2.57892309e+01, 3.08659127e+01, 1.04565213e+01, 2.89111102e+01,
2.23973168e+01, 1.41543879e+01, 2.40352391e+01, 1.89355855e+01, 2.26713139e+01,
2.60883570e+01, 2.53551683e+01, 3.10959184e+01, 2.56617570e+01, 2.53873006e+01,
2.02938950e+01, 2.87914567e+01, 1.97522769e+01, 2.78202344e+01, -1.76425983e+00,
-1.53558560e+00, -1.71338801e+00, -9.78599968e-01, 6.87902421e+00, 7.88543588e+00,
5.47881861e-01, 3.64324940e+00, 1.39468482e+00, 3.60000249e+00, -9.28967610e-01,
4.01716866e+00, 2.42995414e+00, 1.05628735e+00, 1.03627265e+01, 9.20694754e-01,
4.29683694e+00, 1.64579850e+01, 6.19121450e+00, 7.68893688e+00, 1.23304998e+01,
9.82833523e+00, 1.54814143e+00, 1.71545209e+01, 6.99417618e-01, 8.54622163e-02,
2.48873966e+01, -3.11309329e-01, 6.97214120e+00, 2.66220741e+01, 5.25625287e+00,
7.68138067e+00, 2.39284370e+01, 6.25528626e+00, 3.07873577e+00, 3.00882100e+01,
1.15270468e+00, 8.88014098e+00, 3.00512398e-01, 9.30446242e-01, 1.71408264e+01,
3.50661823e+00, 5.83759203e+00, 1.72729331e+01, 3.34582087e-01, 5.40503488e+00,
1.24459036e+01, 5.56073866e+00, 1.21588195e+00, 1.31551680e+01, 1.27378351e+01,
-4.66813441e-01, 1.87703376e+01, 1.69486235e+01, 6.75076580e+00, 1.83449120e+01,
1.48488718e+01, 9.47340998e+00, 1.17932793e+01, 1.67868142e+01, 6.10952151e-01,
1.27008444e+01, 2.15901214e+01, 1.76087373e+00, 1.40248834e+01, 2.78953850e+01,
6.51618548e+00, 1.72532108e+01, 2.04694567e+01, 7.36556309e+00, 9.99912211e+00,
2.91964532e+01, -7.06531579e-01, 2.27219694e+01, -1.31954187e+00, -1.54612461e+00,
2.75038363e+01, 6.70572831e+00, 5.21401215e+00, 2.84508378e+01, -1.38701455e+00,
5.24874266e+00, 2.15644003e+01, 8.28914156e+00, -2.21199280e+00, 2.06411930e+01,
9.08490967e+00, -3.69161804e-01, 2.79213183e+01, 1.67707124e+01, 5.77258212e+00,
2.95534123e+01, 1.29379476e+01, 5.27372097e+00, 2.29618317e+01, 1.82846335e+01,
5.50365226e-01, 2.32915342e+01, 2.26003508e+01, -3.23975407e-01, 2.71026192e+01,
2.69864390e+01, 5.25571146e+00, 2.84281121e+01, 2.43362803e+01, 4.19783582e+00,
2.23458941e+01, 2.89351055e+01, 1.30027038e+01, -2.89260409e+00, -3.32667625e+00,
1.24700611e+01, 5.45576814e+00, 6.79907186e+00, 1.69263149e+01, 5.70732090e+00,
1.52975089e-01, 1.72152577e+01, -5.86473536e-01, 2.60910235e+00, 1.39562777e+01,
1.10496755e+00, 9.89893108e+00, 1.27550907e+01, 6.50405608e+00, 1.44860215e+01,
1.84418079e+01, 6.98755864e+00, 1.14378627e+01, 1.73685838e+01, 1.03634629e+00,
1.72542968e+01, 9.36166090e+00, 1.26996989e+00, 2.48970836e+01, 1.35415180e+01,
4.84360499e+00, 2.82597230e+01, 1.28859648e+01, 7.62646315e+00, 2.08202186e+01,
1.82323636e+01, -1.58242560e+00, 2.82645654e+01, 9.67026415e+00, 9.99521608e+00,
1.48323928e+00, 1.06202054e+01, 1.74410916e+01, 5.30476845e+00, 1.68915394e+01,
1.66028258e+01, -3.98602304e-01, 1.52286166e+01, 1.15951307e+01, 4.88875152e+00,
1.16320855e+01, 1.18462368e+01, 1.17721604e+01, 1.30800856e+01, 1.72687237e+01,
1.52362824e+01, 1.86182764e+01, 1.72413013e+01, 1.32638271e+01, 1.90927913e+01,
1.01652528e+01, 1.60527418e+01, 9.59785151e+00, 1.16306603e+01, 2.32521891e+01,
1.02733588e+01, 1.86418357e+01, 2.65319699e+01, 1.48920616e+01, 1.69296308e+01,
2.24345192e+01, 1.44781142e+01, 1.16768928e+01, 2.87742833e+01, 1.26440243e+01,
2.31651077e+01, 1.09153308e+00, 9.32620240e+00, 3.18068970e+01, 5.91156305e+00,
1.82338682e+01, 2.68163992e+01, -6.10171355e-01, 1.56193643e+01, 1.99596118e+01,
8.12957661e+00, 1.34391603e+01, 2.79448176e+01, 1.21148599e+01, 9.90095353e+00,
2.95224900e+01, 1.88551608e+01, 1.63687321e+01, 2.81729033e+01, 7.75414361e+00,
2.11290647e+01, 2.30983265e+01, 1.80818117e+01, 1.22179830e+01, 2.36227246e+01,
1.85352948e+01, 1.00736995e+01, 2.52569655e+01, 2.39704097e+01, 1.44179838e+01,
2.90993728e+01, 2.15195489e+01, 1.95569595e+01, 2.20162082e+01, 2.86888343e+01,
2.38790793e+01, 1.81853851e+00, -8.62424353e-01, 2.30087081e+01, 3.67168316e+00,
5.79906646e+00, 2.86237895e+01, 5.77923269e+00, 1.82976727e+00, 2.97992364e+01,
-2.44824247e-01, 6.97483848e+00, 1.97479547e+01, 1.28907671e+00, 1.06238401e+01,
2.22988651e+01, 3.36189040e+00, 1.99142865e+01, 2.56182622e+01, 4.87467917e+00,
1.16104104e+01, 3.01052148e+01, -1.89720612e-01, 1.52853202e+01, 2.30601562e+01,
-3.37897609e+00, 2.20210883e+01, 2.21023714e+01, 7.37999253e+00, 2.99827770e+01,
2.83970918e+01, 5.06217176e+00, 2.39324034e+01, 2.36552267e+01, 3.97689851e-01,
2.70250248e+01, 2.32913517e+01, 1.10207360e+01, 7.64503581e-01, 2.00178673e+01,
1.37487336e+01, 4.25542754e+00, 2.60455321e+01, 1.69122386e+01, 2.31534587e+00,
3.04356904e+01, 1.25406626e+01, 5.17675092e+00, 2.38621411e+01, 1.14515762e+01,
9.75443924e+00, 2.25731071e+01, 1.62345346e+01, 1.68317268e+01, 2.84171490e+01,
1.69913568e+01, 1.42827468e+01, 2.97526886e+01, 9.31307649e+00, 1.67785293e+01,
2.17762297e+01, 8.96916957e+00, 2.19718340e+01, 2.22594418e+01, 1.33823144e+01,
2.81207945e+01, 2.77005814e+01, 1.50622075e+01, 2.05455699e+01, 2.92151641e+01,
1.30044976e+01, 2.67938258e+01, 2.17064822e+01, 2.45224793e+01, 5.39644288e+00,
2.09907797e+01, 3.13381910e+01, 6.65786528e+00, 2.44267241e+01, 2.96324924e+01,
1.59248807e+00, 2.81352950e+01, 2.52179231e+01, 3.21255854e+00, 2.29984530e+01,
1.94459863e+01, 9.90712637e+00, 1.95242101e+01, 2.89090489e+01, 1.59338674e+01,
2.54944440e+01, 3.14856070e+01, 1.10580434e+01, 2.91399127e+01, 2.38737698e+01,
1.47156065e+01, 2.36566327e+01, 1.94718712e+01, 2.27327251e+01, 2.67255132e+01,
2.57714727e+01, 3.15584870e+01, 2.55546714e+01, 2.55331520e+01, 2.06608588e+01,
2.85241759e+01, 1.96187079e+01, 2.95686729e+01, -1.28506833e+00, -1.19627373e+00,
-1.11505578e+00, -1.26613495e+00, 6.87769487e+00, 8.86664224e+00, 3.22672767e-01,
3.60048900e+00, 1.75198909e+00, 3.39985912e+00, -5.38113592e-01, 4.40630180e+00,
2.05527629e+00, 1.04780310e+00, 1.09245524e+01, 1.64433825e+00, 5.07925261e+00,
1.66693862e+01, 6.34528032e+00, 6.84652464e+00, 1.30553942e+01, 9.19503930e+00,
1.02559973e+00, 1.64900202e+01, 1.50883393e+00, 1.94153184e-01, 2.60419984e+01,
2.23637168e-01, 5.88126235e+00, 2.68151686e+01, 6.09330009e+00, 6.41359349e+00,
2.27265508e+01, 5.20417493e+00, 3.02351860e+00, 2.90727542e+01, 5.22759441e-01,
9.07723226e+00, 3.74357289e-01, 5.28407017e-01, 1.77876299e+01, 3.40818122e+00,
4.77500246e+00, 1.61051931e+01, -7.15798597e-01, 5.35494411e+00, 1.24396028e+01,
5.26132317e+00, 3.65101881e+00, 1.45180281e+01, 1.20044556e+01, 6.47702685e-01,
1.89647984e+01, 1.63575659e+01, 6.85886982e+00, 1.86666656e+01, 1.39918716e+01,
9.63134562e+00, 1.21489398e+01, 1.79744053e+01, -4.65149892e-02, 1.28820467e+01,
2.20848030e+01, 5.38141652e-01, 1.49773108e+01, 2.86234466e+01, 6.69460622e+00,
1.70430908e+01, 2.03293501e+01, 7.46084699e+00, 9.27068140e+00, 2.87672652e+01,
-1.77446797e+00, 2.31007533e+01, -1.61541146e+00, -1.44197270e+00, 2.59669452e+01,
7.05366958e+00, 6.78973516e+00, 2.82048010e+01, -6.81707442e-01, 4.11224811e+00,
2.33230735e+01, 7.64143788e+00, -1.30932484e+00, 2.00341346e+01, 8.43186122e+00,
-3.23227570e-01, 2.88456685e+01, 1.71869485e+01, 5.59484664e+00, 2.86861878e+01,
1.38255153e+01, 5.39986151e+00, 2.26670663e+01, 1.74856853e+01, 1.31353338e+00,
2.27240963e+01, 2.26573999e+01, -6.43284767e-01, 2.75545414e+01, 2.65487243e+01,
6.36781664e+00, 2.89591698e+01, 2.55204798e+01, 4.19690392e+00, 2.20492684e+01,
2.90086623e+01, 1.29407803e+01, -3.28971533e+00, -3.59953707e+00, 1.30308691e+01,
4.52526975e+00, 6.05334642e+00, 1.80200038e+01, 6.86934432e+00, -6.64799107e-01,
1.77004927e+01, -1.08469207e+00, 2.66573197e+00, 1.33883962e+01, 1.77878946e+00,
1.01478623e+01, 1.28332615e+01, 7.20488713e+00, 1.30030127e+01, 1.82890722e+01,
5.45538575e+00, 1.26731818e+01, 1.64372459e+01, 1.13264799e+00, 1.68270761e+01,
9.29480506e+00, 8.02789471e-01, 2.50004864e+01, 1.30397241e+01, 4.25942991e+00,
2.82105770e+01, 1.34839369e+01, 6.59877473e+00, 1.96748658e+01, 1.90248344e+01,
-7.34844927e-01, 2.61879859e+01, 1.06994814e+01, 1.04221404e+01, 1.19626201e+00,
9.75063627e+00, 1.82675328e+01, 4.79479047e+00, 1.67169178e+01, 1.67708791e+01,
-3.25796174e-01, 1.58140826e+01, 1.07514402e+01, 4.16021066e+00, 1.14190484e+01,
1.20130431e+01, 1.10359921e+01, 1.23286945e+01, 1.73093633e+01, 1.60093426e+01,
1.72472089e+01, 1.71555986e+01, 1.29595403e+01, 1.96515771e+01, 1.07779852e+01,
1.55906451e+01, 1.04066011e+01, 1.06852174e+01, 2.41637389e+01, 9.33300851e+00,
1.72769290e+01, 2.72366205e+01, 1.43344594e+01, 1.55444449e+01, 2.25613745e+01,
1.54876710e+01, 1.23994150e+01, 2.77630051e+01, 1.24465157e+01, 2.22953455e+01,
7.07224538e-01, 9.17225571e+00, 3.04541888e+01, 7.00444346e+00, 1.90451094e+01,
2.68206460e+01, 2.12443190e-01, 1.40421608e+01, 2.16604155e+01, 8.76748146e+00,
1.18599685e+01, 2.63467340e+01, 1.24514910e+01, 9.07508597e+00, 2.94452971e+01,
1.81138604e+01, 1.65350863e+01, 2.76724408e+01, 8.10094240e+00, 2.03902238e+01,
2.19891729e+01, 1.81613540e+01, 1.28241365e+01, 2.30836693e+01, 1.77077396e+01,
1.07839643e+01, 2.43167076e+01, 2.35379387e+01, 1.43368823e+01, 2.99960368e+01,
2.18020500e+01, 1.98836259e+01, 2.10543368e+01, 2.77564511e+01, 2.38873187e+01,
2.63596088e+00, -8.45710736e-01, 2.26031998e+01, 4.94875239e+00, 6.06483058e+00,
2.72420930e+01, 7.16044030e+00, 2.03664724e+00, 2.83819926e+01, 1.41474271e+00,
6.86956553e+00, 1.90297274e+01, 2.08547446e-01, 1.17356589e+01, 2.20093707e+01,
3.11015561e+00, 1.84015708e+01, 2.55258414e+01, 4.51413195e+00, 1.15060640e+01,
3.04420577e+01, 2.05350822e-01, 1.59037463e+01, 2.20766378e+01, -3.08680082e+00,
2.27928539e+01, 2.19423049e+01, 6.96063455e+00, 2.93175572e+01, 2.63580580e+01,
4.17130592e+00, 2.37215427e+01, 2.48207538e+01, -1.10022388e+00, 2.72061284e+01,
2.27735841e+01, 1.10983539e+01, 5.03790539e-01, 2.05447311e+01, 1.35069355e+01,
4.99617490e+00, 2.74249691e+01, 1.74389534e+01, 2.12313453e+00, 3.09387285e+01,
1.30390672e+01, 4.56728163e+00, 2.49467870e+01, 1.09552706e+01, 1.05134177e+01,
2.26330821e+01, 1.67053853e+01, 1.63758180e+01, 2.83218004e+01, 1.73740024e+01,
1.40724154e+01, 3.02682616e+01, 8.35484609e+00, 1.66575388e+01, 2.13501708e+01,
1.01994161e+01, 2.34754835e+01, 2.17794008e+01, 1.46632688e+01, 2.78344546e+01,
2.68554005e+01, 1.40368100e+01, 2.04864069e+01, 2.79509647e+01, 1.19193324e+01,
2.79392613e+01, 2.26582097e+01, 2.45440331e+01, 6.30616900e+00, 2.13859764e+01,
3.08849664e+01, 6.44869190e+00, 2.64928749e+01, 3.02400532e+01, 8.32685758e-01,
2.74640627e+01, 2.40967712e+01, 3.18770838e+00, 2.27412709e+01, 1.85562433e+01,
9.23151490e+00, 2.03983609e+01, 2.91681800e+01, 1.56979455e+01, 2.51695730e+01,
3.07717754e+01, 1.06821424e+01, 2.92168363e+01, 2.36456995e+01, 1.45948324e+01,
2.33527556e+01, 1.93047064e+01, 2.37746530e+01, 2.48248533e+01, 2.61599136e+01,
3.04541638e+01, 2.58041186e+01, 2.56474296e+01, 2.02610796e+01, 2.85417157e+01,
1.88972442e+01, 2.98568715e+01, -2.38586496e+00, -7.58828968e-01, -1.63156635e+00,
-1.24260140e-01, 7.66170676e+00, 8.26519210e+00, 8.18582687e-01, 3.21215177e+00,
8.71469426e-01, 3.32445560e+00, -1.32118548e+00, 3.91101312e+00, 2.32046567e+00,
1.58370834e+00, 1.07292588e+01, 1.33792245e+00, 4.76690685e+00, 1.57155304e+01,
5.60070334e+00, 7.35450929e+00, 1.13291649e+01, 9.38118665e+00, 1.32457406e+00,
1.64112640e+01, 2.06694803e+00, -1.08774960e-01, 2.51995098e+01, 5.83962037e-01,
6.14184963e+00, 2.60031487e+01, 7.65609079e+00, 5.60778423e+00, 2.29300579e+01,
5.77114858e+00, 2.13679298e+00, 2.93327862e+01, 2.19806103e+00, 9.68222590e+00,
1.57880111e+00, 3.14284164e-01, 1.73107320e+01, 3.17317841e+00, 5.31032205e+00,
1.67722718e+01, -3.21992890e-01, 4.86044703e+00, 1.46302272e+01, 6.21744347e+00,
3.23194778e+00, 1.36053502e+01, 1.20906550e+01, 1.05401318e+00, 1.89924170e+01,
1.86500989e+01, 7.28920551e+00, 1.90214147e+01, 1.48608421e+01, 8.94579137e+00,
1.17939437e+01, 1.76451822e+01, -2.16292241e-01, 1.27470176e+01, 2.10170183e+01,
1.86340865e+00, 1.43620945e+01, 2.88854080e+01, 7.51715045e+00, 1.76892134e+01,
2.12086589e+01, 7.40953137e+00, 8.90283609e+00, 2.82643224e+01, -1.81615954e+00,
2.35425566e+01, -6.35391065e-01, -1.81429720e+00, 2.64341698e+01, 6.21091555e+00,
5.43254354e+00, 2.75836921e+01, -9.47958758e-01, 4.71567619e+00, 2.21052659e+01,
7.88771418e+00, -1.66841626e+00, 2.04914383e+01, 8.26675658e+00, -4.59229759e-01,
2.71579580e+01, 1.68410204e+01, 5.00100432e+00, 2.90662447e+01, 1.29214242e+01,
4.69089603e+00, 2.34759714e+01, 1.67656282e+01, 6.53854823e-01, 2.38352952e+01,
2.17931036e+01, -1.01639060e+00, 2.72103570e+01, 2.59664262e+01, 4.89596274e+00,
2.77674695e+01, 2.47617265e+01, 3.70839276e+00, 2.19495406e+01, 2.77068507e+01,
1.33883490e+01, -2.96774368e+00, -3.88662826e+00, 1.21540528e+01, 4.88520987e+00,
6.46250715e+00, 1.58502434e+01, 7.52061809e+00, -5.94010768e-01, 1.80041063e+01,
-1.45785510e+00, 1.90361473e+00, 1.37682126e+01, 1.01096461e+00, 1.05140180e+01,
1.32426632e+01, 7.30651107e+00, 1.44595448e+01, 1.87287975e+01, 5.98649586e+00,
1.22746034e+01, 1.63100152e+01, 1.15741871e+00, 1.66981121e+01, 9.12913654e+00,
-2.92667679e-01, 2.45886138e+01, 1.33050334e+01, 3.97377478e+00, 2.69467178e+01,
1.42080442e+01, 6.64595078e+00, 2.01191284e+01, 1.86015542e+01, -1.75336417e+00,
2.83471787e+01, 1.08620615e+01, 1.11988186e+01, 1.95253365e+00, 9.45047887e+00,
1.75938537e+01, 4.23821913e+00, 1.70208034e+01, 1.60108143e+01, -1.22190668e+00,
1.50766040e+01, 1.12165304e+01, 5.43990155e+00, 1.09933699e+01, 1.22850779e+01,
1.16546326e+01, 1.23781385e+01, 1.80369686e+01, 1.53125056e+01, 1.73516609e+01,
1.75785987e+01, 1.18313796e+01, 1.94046667e+01, 1.10166421e+01, 1.62979612e+01,
9.66207941e+00, 1.08458701e+01, 2.37048314e+01, 8.44004940e+00, 1.70203943e+01,
2.65757559e+01, 1.43027170e+01, 1.63790927e+01, 2.18182624e+01, 1.38144113e+01,
1.12481654e+01, 2.87113704e+01, 1.23513270e+01, 2.18980717e+01, 5.17961694e-01,
9.82158593e+00, 3.06003668e+01, 6.40959927e+00, 1.97382355e+01, 2.64666452e+01,
-2.56886470e-01, 1.51138569e+01, 2.14756928e+01, 7.69843726e+00, 1.13280462e+01,
2.53724470e+01, 1.17891597e+01, 9.16645548e+00, 2.85470480e+01, 1.83229821e+01,
1.60641629e+01, 2.74309208e+01, 8.14336993e+00, 2.00104262e+01, 2.16691335e+01,
1.90509791e+01, 1.35353858e+01, 2.30944654e+01, 1.79157296e+01, 1.01235942e+01,
2.45385866e+01, 2.35448360e+01, 1.40749201e+01, 3.01972078e+01, 2.17768651e+01,
2.03786050e+01, 2.10805498e+01, 2.76935947e+01, 2.44615615e+01, 3.05749628e+00,
4.07414296e-01, 2.16336438e+01, 4.40657970e+00, 5.21060398e+00, 2.88299726e+01,
7.01128437e+00, 8.79026008e-01, 2.85241186e+01, 3.14915946e-01, 7.07809470e+00,
1.98625917e+01, 4.50200492e-03, 1.15863909e+01, 2.29376845e+01, 2.50348240e+00,
1.86113050e+01, 2.47645618e+01, 3.74984924e+00, 1.16835156e+01, 3.00116656e+01,
1.33610084e+00, 1.54039934e+01, 2.16664404e+01, -3.77318264e+00, 2.24073626e+01,
2.17213138e+01, 6.32154759e+00, 2.91289015e+01, 2.80778040e+01, 4.04768899e+00,
2.51637272e+01, 2.49482621e+01, -1.80258150e+00, 2.77649841e+01, 2.28639670e+01,
9.52095023e+00, 1.12320744e+00, 2.11060298e+01, 1.35966775e+01, 4.52804356e+00,
2.65933190e+01, 1.74870802e+01, 3.12917456e+00, 3.12581554e+01, 1.26369216e+01,
4.24969839e+00, 2.28577555e+01, 1.09623135e+01, 9.61329928e+00, 2.31292240e+01,
1.68635673e+01, 1.59562582e+01, 2.83134554e+01, 1.65993286e+01, 1.34061062e+01,
3.07651009e+01, 8.60937322e+00, 1.58164516e+01, 2.15713342e+01, 9.77426434e+00,
2.38239983e+01, 2.07170028e+01, 1.44272471e+01, 2.72915473e+01, 2.78094878e+01,
1.46067375e+01, 2.02374654e+01, 2.83102299e+01, 1.21902457e+01, 2.73283465e+01,
2.25040436e+01, 2.40201181e+01, 7.24105767e+00, 2.16659528e+01, 3.22281603e+01,
6.56727556e+00, 2.67438472e+01, 3.14254999e+01, 1.00941523e+00, 2.72477648e+01,
2.43062679e+01, 3.91537815e+00, 2.28206020e+01, 1.90617248e+01, 9.50661026e+00,
1.95693791e+01, 2.99400820e+01, 1.67827219e+01, 2.52432494e+01, 3.09283864e+01,
1.18433291e+01, 3.02997758e+01, 2.26469178e+01, 1.40818435e+01, 2.52061280e+01,
1.93512323e+01, 2.29021542e+01, 2.65208970e+01, 2.53952117e+01, 3.08512322e+01,
2.76076800e+01, 2.54724293e+01, 1.95719692e+01, 2.94254771e+01, 1.94406409e+01,
2.73992646e+01 ]
</q>
<p shape='(4, 324)'>
[ 1.40372994e-01, -1.70336384e+00, 6.37303020e-01, -3.60483257e-01, -1.10940109e+00,
3.74869623e-01, -3.25735029e-01, 7.75472220e-01, 1.10757231e+00, -2.40493336e+00,
-1.53716651e+00, 1.37041429e+00, 5.28228491e-01, 1.38616874e+00, -1.38581237e+00,
-3.77690596e-01, 2.35773187e-01, 1.37036828e+00, 1.74363360e+00, 1.46668252e+00,
9.19554977e-01, 1.46604384e+00, 7.17395153e-01, 1.16766357e+00, 5.74213643e-01,
1.73367931e-01, -1.66161161e+00, 2.33212598e+00, -9.77285003e-01, 2.41575083e-01,
-1.49585940e-01, -1.18522916e+00, 1.58553462e-01, -1.47168505e+00, -1.24387557e+00,
7.68483391e-01, -1.56677579e+00, 8.39149463e-01, -7.60108832e-01, -1.39563512e-01,
1.23618455e+00, -3.39699359e-01, -9.88358452e-01, -1.25161119e+00, 5.75688958e-01,
3.34908289e-02, -1.57137545e+00, 9.54873978e-01, 2.21048523e-01, 3.15471131e+00,
4.38424417e-01, -1.41296551e+00, -6.15293784e-01, 4.54568031e-01, 5.25912190e-01,
1.10462750e+00, -7.33687512e-01, 3.51836732e-01, 1.11696908e+00, -1.75519514e-01,
-9.87401261e-01, -1.00224818e+00, -2.06257599e+00, -8.69995365e-02, 1.96237139e-01,
-1.55878661e+00, 2.06187113e+00, 5.21020731e-03, 2.35617406e-01, 1.59018004e+00,
1.23310143e+00, -9.06287741e-01, 1.02772014e+00, -4.13278400e-01, -9.73895321e-01,
1.26420822e+00, -6.00372594e-02, -8.86889397e-01, -1.35877237e+00, 1.26542138e-01,
-1.96996606e+00, 1.16602982e+00, -1.87715811e+00, -1.07989580e+00, 1.52684255e-01,
2.69202324e+00, -7.86764932e-01, -1.26792145e+00, -2.15985504e-01, 2.83847115e-01,
-3.90074815e-02, -3.21827572e-01, 8.60927158e-01, 1.15174374e+00, -1.06395947e+00,
6.56206723e-01, 1.71687653e+00, 1.88094551e+00, -1.41246651e-01, 6.67235507e-01,
8.02729512e-01, -5.99750938e-01, 3.86175582e-01, 1.56674025e+00, 1.16770355e-01,
-1.25058894e-01, -6.64317179e-01, -1.90732529e+00, -3.49443824e-01, -1.75313244e+00,
-8.93802373e-01, -8.38911513e-02, -3.54765784e+00, 3.29189169e-01, -1.59470714e+00,
2.28214169e-01, -2.04640475e+00, -1.21363021e+00, 4.43956386e-01, 1.98553407e+00,
-6.41921427e-01, 8.31610867e-01, 2.37729074e-01, -1.96307860e+00, 5.83519443e-01,
-9.23373803e-01, -2.72733993e-01, -6.80313749e-01, -4.21629881e-01, 8.24112349e-02,
-2.02945940e-02, 4.70239760e-02, -8.87189426e-01, 2.62362546e-01, 2.90567277e-03,
-5.77088646e-01, 8.63734028e-01, 2.12881273e-01, -1.84398318e+00, -1.27537888e+00,
-8.96390165e-01, 8.67723220e-01, -7.13233254e-01, 9.98467053e-01, 1.20471615e+00,
3.80364988e-02, -3.86066496e-01, 2.80482433e-01, -5.55953973e-01, 6.99483364e-01,
-6.20862722e-01, -5.75941665e-01, -1.01810316e+00, 6.59129210e-01, 3.36528627e-01,
1.19657571e+00, 1.16325245e+00, 1.38231876e+00, -1.62296272e+00, 7.73325492e-01,
9.07953738e-01, -1.56020700e+00, 5.91276288e-01, -1.45072710e+00, 3.06498507e-01,
1.02001412e+00, -7.79180574e-01, -1.09202701e+00, 8.60608247e-01, -8.12517020e-01,
-3.29732754e-01, 7.95824769e-02, -3.53180396e-01, -6.92843090e-01, 8.08287670e-01,
-1.31368002e+00, 8.92275005e-01, 7.74460553e-01, -4.16315357e-01, 4.13327475e-01,
2.07077192e-01, -2.18589769e+00, -1.02281048e-01, 9.09167509e-02, -1.46835347e+00,
1.23256338e+00, -3.07250057e-01, 2.46249432e-01, 7.74791555e-01, 3.98298680e-01,
-5.39569195e-02, 4.73911005e-01, 1.79978269e+00, 6.49413046e-01, 1.44049305e+00,
-7.54136523e-01, 6.85251391e-01, -1.03401786e+00, -1.07121945e+00, 1.15101429e+00,
-6.78252322e-01, 3.66963136e-02, -1.11945652e-01, -4.17808375e-01, 9.68133746e-02,
1.99069757e+00, 1.55013114e+00, -1.92882805e-02, 1.33795454e+00, 7.39452603e-01,
3.77633950e-01, 1.81163711e+00, 2.58943819e+00, 1.29562203e+00, -1.48713547e+00,
-9.55424888e-01, 3.46515063e-01, 4.16880974e-01, -1.14430760e+00, -5.41540342e-01,
1.15617781e+00, -8.15311978e-01, -1.24131679e-01, -1.01785991e+00, -6.82587363e-01,
1.34485087e+00, 3.95295976e-01, 3.61637052e-01, -4.79290805e-01, 1.96407902e-02,
-6.96427808e-01, 9.65717585e-01, 4.63130635e-01, -4.12348950e-02, -6.14114134e-02,
3.76909298e-01, 1.31464930e-01, -1.96943568e+00, -2.07138054e+00, 1.07506895e+00,
-8.47693792e-02, 1.50838082e+00, 9.66357898e-01, 3.29832625e-02, 2.53592195e+00,
-8.44613584e-01, -1.75528218e-01, -1.51432281e+00, -1.30241164e+00, -2.07575407e-01,
-1.04844306e+00, -1.28575451e+00, 4.62727941e-01, 1.46590141e+00, -2.63004766e-01,
-1.01898113e+00, -1.37875255e+00, -9.12918530e-01, 1.71033710e+00, 1.02893180e+00,
-1.32634968e+00, 8.82495711e-02, -9.11997611e-01, -2.42094019e+00, -6.29467944e-01,
8.08788619e-01, 1.94804910e+00, -8.72566500e-01, 9.20033720e-01, -1.72884793e+00,
3.44191186e-01, 1.21733557e+00, 1.87515471e-01, 5.10808988e-02, 7.94329477e-01,
-3.52316495e-01, -1.00945167e+00, 7.35146276e-01, 1.07654301e+00, 1.04930155e+00,
-1.85826022e+00, -5.07927804e-01, -9.80771494e-01, -3.21767737e+00, -1.49676613e-01,
-2.15647041e-01, -1.82770370e+00, 1.49469246e+00, -1.68826911e+00, 1.62663223e+00,
-3.48742295e-01, -6.17863065e-01, -8.81308520e-01, 7.44925882e-01, 1.73070837e+00,
-1.28410488e-01, 8.64089144e-01, 3.26440658e-01, 1.10448379e+00, -1.69522830e-01,
-6.53776497e-01, 3.81864979e-01, -1.07760135e+00, -3.98562627e-01, 5.38128157e-01,
-2.29754635e-01, -2.33407869e+00, -1.25116856e-01, -1.21131987e+00, 1.08298393e+00,
1.51546625e-01, -3.56701517e-01, -9.98362812e-01, 1.03306121e-01, -4.42120758e-01,
-3.94015959e-02, -8.12077182e-01, -5.72762073e-01, -8.31013031e-01, -1.16147494e+00,
-7.35897383e-02, -1.09398682e-01, -1.40219599e+00, 9.63041766e-01, 6.60583424e-02,
-1.71857732e+00, 1.99405396e-01, -8.84068189e-01, -2.18819685e-01, 2.21366910e+00,
-1.84460428e+00, -1.05848347e+00, -1.53731311e+00, -2.25141079e-01, 8.55239543e-02,
-5.64991535e-01, -1.11243253e+00, -1.48334114e+00, 2.85484662e-01, -5.98357857e-01,
-5.62005083e-01, 5.18476929e-02, 7.20785662e-01, -9.21464830e-01, -4.17295452e-01,
-7.06470111e-01, -2.07423207e+00, -2.82738840e-01, -7.05765425e-01, 5.71154019e-01,
1.41402308e+00, 7.15224885e-01, -9.01571406e-01, -1.78966537e-01, -9.57855925e-01,
1.92815188e+00, 3.67644067e-01, -7.77398627e-01, 3.75573158e-01, -1.27570871e+00,
-1.56269598e-01, -1.20126128e+00, 5.64996896e-01, -1.45388556e+00, -4.64414199e-01,
1.88714704e+00, 1.47969578e+00, -1.96063537e-01, 5.18755530e-01, 2.68937808e+00,
-1.69730122e+00, -5.36576005e-01, 1.04962410e+00, 4.65512668e-01, 1.47912174e+00,
8.46469352e-01, 8.08058567e-01, 1.13879268e+00, 6.34831145e-01, 1.43535434e+00,
2.04580992e+00, 7.90686500e-04, 1.19722827e+00, -1.42644546e+00, 1.92405610e-01,
8.14926140e-02, -2.36223884e-01, 1.16089456e+00, 2.24765430e-01, -1.32752285e+00,
1.36642599e+00, -5.36742312e-01, 4.98821954e-01, 6.00651182e-01, -2.56801229e+00,
-2.36250226e-01, -8.57842968e-01, -3.00915036e-01, 2.41807890e+00, 7.24711670e-01,
1.36799087e+00, -1.78428862e-01, -3.59900038e-01, 3.42306822e-01, -3.98271527e-01,
-1.30912096e-01, -5.36751004e-01, -6.45495166e-01, 3.16360509e-02, -6.38708513e-01,
1.33860162e+00, 7.16436859e-01, 8.83639989e-01, -2.87900422e-01, -1.77363177e-01,
1.75217790e-01, -2.41654433e+00, -8.13755792e-02, -7.71741152e-01, 1.33456387e+00,
-5.10830196e-01, -1.10584683e+00, -1.31689363e+00, 1.17583053e+00, 6.77964594e-01,
2.99895744e-01, 5.12719967e-01, 2.06867244e+00, -2.89182146e+00, 1.84494668e+00,
3.10415200e-01, 1.64179666e+00, -2.18044104e+00, -9.27575571e-01, -8.07814665e-01,
-1.85157068e-01, 5.86693996e-01, 1.60605927e+00, -1.03758631e-01, -9.65958485e-01,
-9.06979038e-01, 5.61735019e-01, 3.35132784e-01, 6.02021180e-01, 1.76689554e-01,
-3.36488706e-02, 1.45021360e+00, 6.70122973e-01, -1.71792295e-01, 8.29616451e-01,
-8.05614322e-01, -2.58079407e+00, 1.01873565e+00, -3.81060235e-01, 1.00130704e+00,
1.55674172e+00, 2.02125219e+00, -7.48802492e-01, 1.06649929e+00, -9.65493892e-01,
-3.98926995e-01, 1.08567030e+00, -1.04009627e+00, 1.41394914e+00, 1.80976669e+00,
-4.38932124e-01, -9.96116646e-01, 2.93325605e+00, -2.65850173e+00, -2.86627210e-01,
-1.13380351e+00, 1.01776593e+00, 3.82798024e-01, -2.03015905e+00, -4.77705377e-01,
-1.52497126e-01, -3.08097496e-01, -1.22388367e+00, 7.72589230e-01, -1.18620576e+00,
7.03396905e-01, -6.07914021e-01, 1.36665589e+00, 3.05885200e-01, 8.68021103e-01,
7.85645067e-01, 6.86344886e-01, 6.60054397e-02, 6.72872685e-01, -1.72147672e+00,
-3.35687107e-01, 6.40280686e-01, 1.90765562e-01, -1.19759420e+00, 3.98723557e-01,
1.01300503e+00, 3.15092859e-01, -7.48716523e-01, -6.31490429e-01, 5.03478302e-01,
-7.97737020e-01, -3.64328563e-01, -6.84865111e-01, -5.96889804e-01, 8.97320299e-01,
-2.74447207e-01, 8.96041854e-01, 8.62447243e-01, 1.14171036e+00, 1.89620219e+00,
-2.03086042e-01, 1.21863991e+00, -7.08332672e-01, 8.65474351e-01, 8.84794271e-02,
-7.38048949e-01, -3.29738572e-01, 6.25639096e-01, 8.73860305e-01, 1.32892575e+00,
-1.08731164e+00, 7.42722680e-02, 1.10376262e+00, -2.70446460e-01, 4.84230480e-01,
-7.49397372e-01, -1.22773789e-01, -1.73175160e+00, 1.00419017e+00, 4.18612640e-01,
-1.19265354e+00, 1.89942453e+00, 2.16924392e-01, 1.98456504e+00, -4.47127896e-02,
-8.13751338e-01, -1.57721515e+00, -1.51087464e+00, 1.49149818e-01, 3.34518489e-01,
-1.49643992e+00, 3.14649899e-01, 2.07634343e+00, -6.04070136e-01, 1.87721508e+00,
-4.06863898e-01, -7.83918757e-01, 2.03531050e-01, -7.64354284e-02, 3.31824344e-01,
4.79012974e-01, 1.83535358e+00, 9.02286124e-01, -1.15207026e+00, 1.28672254e-01,
-8.26157812e-01, 1.90407166e+00, -3.96264466e-01, 1.94392469e-01, -8.73100373e-01,
-3.37468953e-03, 9.76466097e-01, 6.23291758e-02, -2.37497472e-01, 1.07993508e+00,
-3.14201676e-01, 1.70621222e+00, -9.90965410e-02, 1.20753777e-01, -6.38441546e-01,
1.41774776e+00, -5.80882309e-01, 1.09405908e+00, 3.93716017e-01, -1.28958167e+00,
4.24488630e-01, 9.55061213e-01, 1.29635151e+00, -1.96475095e-01, 1.27366715e-01,
1.13693192e-01, -1.99660506e+00, -7.38934810e-01, 1.27623410e+00, 1.67534486e+00,
2.98512870e-01, 1.48183369e+00, 1.03842506e+00, -1.05881112e+00, 3.59296217e+00,
2.33641006e+00, -4.44058636e-01, -7.05099765e-02, 3.21036779e-01, -1.92001349e-01,
-1.42762638e+00, -4.05688476e-01, 4.80851634e-01, 4.74839401e-01, 1.26185094e+00,
-1.05552598e-01, 5.56910980e-01, -5.32621114e-01, 9.34349181e-02, 2.56314544e-01,
-1.74582311e+00, 4.17470989e-01, 2.29528051e+00, 2.62392322e-01, 3.18772657e-01,
8.17214811e-01, -8.16325438e-01, -4.19774898e-01, -1.79953350e-02, 2.52742913e+00,
-2.79795924e-02, -8.35211211e-01, -3.49992939e-01, 1.17976432e+00, 1.06455248e+00,
4.99693771e-01, -3.25404106e-01, -1.19518002e+00, -1.12107657e+00, 7.08571829e-01,
-1.32836392e+00, -4.05940531e-01, -1.62901886e+00, 1.94474528e-01, 5.69560181e-01,
-1.16097389e+00, -9.55882892e-01, 8.43738270e-01, 9.60068854e-01, 3.04930133e-02,
1.09691130e-01, 5.31002976e-01, -7.96127056e-02, -2.90684090e-02, -2.90427758e-01,
6.26093036e-01, 6.57694112e-01, -4.85835995e-01, 1.80074318e-01, 1.12303284e+00,
5.23912334e-01, 5.85300514e-01, 6.21565032e-01, -6.88438319e-01, 1.76104297e+00,
4.69681129e-01, -1.50756131e+00, -2.35433970e+00, 2.20926618e-01, -1.59035655e+00,
-2.16680752e-01, -1.09766225e+00, -3.66108880e-01, 6.72549669e-01, -1.39966389e+00,
-2.64964223e-01, -4.47757200e-01, 5.31233808e-01, 1.84834139e+00, -6.02818313e-01,
-1.44473483e+00, 1.52776447e-02, -7.93366554e-01, -1.90159337e+00, 1.74463595e-01,
-2.11499652e+00, -2.25655780e+00, 1.18038845e+00, -3.70794733e-01, -8.67093500e-01,
1.43290672e+00, -1.38210097e-01, 1.14792213e+00, 1.06670774e+00, 1.03103438e+00,
-9.00433225e-02, -5.34357708e-01, -1.22908335e+00, -4.72611965e-01, 2.46111190e-01,
-1.70561610e+00, 3.92682358e-01, -1.55756928e+00, -2.37928227e-01, 2.03059408e+00,
-9.84120137e-01, -2.11053290e+00, 6.16981710e-01, -1.12243752e-01, -1.10029159e-02,
9.02048435e-01, 8.56294718e-01, 1.13642549e+00, -1.50782750e+00, -3.72301949e-01,
-1.66280307e+00, -1.38174795e+00, 8.97950650e-02, 5.55623559e-01, -6.05980874e-01,
-7.05479352e-01, 7.04832792e-01, -3.20169261e-02, -5.46153623e-01, -4.23996939e-01,
-1.87522120e+00, -4.41626784e-01, 2.28022755e+00, 1.41852748e+00, 7.22573260e-01,
2.28863935e+00, 1.32648450e+00, -1.20732385e+00, 6.48320570e-01, -5.97367023e-02,
1.26207462e-01, -2.04798081e+00, 1.13007921e+00, -1.71585140e-01, 3.14833129e-02,
1.71558970e-01, 2.30236146e-01, -2.69742619e+00, 1.36832193e+00, -4.09947214e-01,
-2.00570514e-01, 8.31050179e-01, 1.40744357e+00, -2.34268444e+00, -7.42098732e-03,
1.03611120e+00, 2.06373254e+00, -5.02279592e-01, -7.01081635e-01, 1.25847835e-01,
6.02231279e-02, -4.08815632e-01, -3.34433187e-01, 1.42676664e+00, -1.49454672e+00,
-1.24564490e+00, 1.71269292e+00, 6.82206821e-01, 8.72601070e-01, -9.22460387e-01,
4.55740724e-02, 1.33030508e+00, 6.53585708e-02, 3.13993497e-01, -2.11648823e+00,
-1.36475580e-02, 2.51552262e+00, 9.25969768e-01, -6.52019962e-01, 2.03940799e+00,
2.55910092e-01, -7.26525412e-01, -1.00207723e+00, 1.31950793e+00, -1.82967630e+00,
-4.92805660e-01, 4.07867808e-01, 6.11026922e-02, -2.11979237e-01, -2.87253727e-01,
1.11856203e+00, -2.21720426e-01, 1.84350017e+00, 7.84784426e-01, -1.49696700e+00,
9.09038266e-01, -1.27156936e+00, 9.56717220e-02, -4.15656486e-01, 4.19788418e-01,
-2.61691637e-01, -1.56861006e+00, -6.47659675e-01, -6.83293713e-01, 2.51621894e+00,
-4.44034798e-01, 1.78185380e+00, 4.60785269e-01, -2.68311726e-01, 1.04600391e+00,
-5.67576324e-01, 1.13507042e+00, -1.78393940e+00, -1.82719464e+00, -1.84508388e+00,
-1.29303124e+00, 1.35664029e+00, -9.17173260e-01, 9.85863915e-01, 1.07223755e+00,
8.84707496e-01, -1.37852063e+00, 6.19459586e-01, -2.93677966e-02, -3.18737198e-01,
1.03094159e+00, 4.89778531e-01, 1.73667810e+00, -2.03090079e-01, 3.64701299e-01,
3.48172075e-01, -1.54091587e+00, 1.04498049e+00, -1.28639737e+00, -4.71319136e-01,
8.61169102e-01, 1.61610909e+00, 7.69597251e-01, 7.68227380e-01, 1.11224694e+00,
8.48919769e-01, 3.12294367e-01, -4.93201021e-01, 6.42746189e-01, -2.27293413e-01,
2.16505068e-01, 5.52193787e-01, -1.76108774e+00, -4.43454137e-01, -1.10836243e+00,
7.49078941e-01, -5.26434049e-02, 4.23300776e-01, -1.66554395e+00, 3.10524219e-01,
1.19480829e+00, -6.29200409e-01, 6.41552685e-01, 7.60530128e-01, -1.44429069e+00,
-2.98038448e-01, 5.01177628e-01, 3.97341120e-01, 4.53467676e-01, -1.35725377e+00,
9.43314195e-01, 2.15143758e+00, 3.94302672e-01, 2.26509780e-01, 9.59313828e-01,
-1.66404768e-01, 1.65207595e-01, -2.39340233e+00, 3.14543001e+00, 1.05218765e+00,
-8.14714579e-01, -3.05710147e-01, -1.74531477e+00, -3.64151538e-01, -2.09140760e-01,
2.23739053e+00, 6.09477113e-01, 1.16899879e+00, 5.92967924e-01, -8.17673149e-01,
-1.10420428e+00, 4.65350290e-01, 2.11023040e-03, 8.14863971e-01, 1.08315984e+00,
-7.25860590e-02, -4.59896403e-01, 1.38164252e+00, 5.89336792e-01, 1.34519891e+00,
-3.63277304e-01, 9.08232031e-01, 2.05775821e-01, 1.01268871e+00, 2.25900629e-01,
1.11195741e+00, 1.46383492e+00, 1.15712737e+00, 1.37285918e+00, -3.27123406e-01,
2.10121867e+00, 3.63728898e-01, -9.64451543e-01, 7.50304023e-02, 2.26045537e+00,
-1.07848463e-01, -5.55058232e-01, 6.46210385e-01, -3.82173868e-01, 1.02724203e+00,
4.75226625e-01, 2.63486832e-01, -1.87720616e-01, 2.66714045e+00, -1.37046410e-01,
-9.47273326e-01, -2.21070556e+00, 5.16910020e-01, -1.00019802e+00, -6.10344773e-01,
-1.23626760e-01, -7.78025616e-01, 3.54873800e-01, 1.32409224e+00, -4.96383871e-01,
-8.45650299e-01, -7.06777204e-01, 7.74296088e-01, 5.40594697e-01, -2.35323920e+00,
1.10574355e+00, -2.71490739e-01, 3.89486537e-01, -2.25716891e+00, 1.08161436e+00,
-7.61396029e-01, -6.43902282e-01, 2.07071361e-01, -1.24311778e+00, 1.66718154e+00,
-1.12540846e+00, 4.04848060e-01, 9.82172410e-01, -2.22704668e-01, -4.41651091e-01,
8.11339257e-01, -1.71211605e+00, -6.16208091e-02, 8.56110168e-01, 5.66390166e-01,
6.39785155e-01, 1.39973994e+00, -6.88244744e-01, 2.42634138e+00, 3.24544610e-01,
4.48313772e-01, 7.45142689e-01, -7.23045807e-02, 1.83704141e-01, -1.47171323e+00,
-7.09077372e-01, -6.01038702e-01, -8.75281454e-01, 5.13919915e-01, -6.60822470e-01,
-1.43487765e+00, 7.49938057e-01, 2.83635875e-01, 3.07045512e-01, 1.48936195e+00,
-2.17046249e-01, 2.04101206e+00, 6.02181940e-01, -1.78421830e-01, -8.17580831e-01,
6.13386299e-01, 1.46247756e-01, -1.42514706e+00, -1.93940896e+00, -8.65275710e-01,
1.47462311e-01, -4.02301576e-01, -9.63675890e-01, -1.84120948e+00, 8.14102917e-01,
3.80760496e-01, 3.25900148e-01, -4.87843594e-01, -1.03508268e+00, 3.57676231e-01,
-6.47622001e-01, 2.14181936e+00, -3.34827796e-01, -8.07284435e-01, -8.49708166e-01,
-8.31736592e-01, 6.33904552e-01, 4.35249821e-01, -9.13698624e-01, -2.96290563e-01,
3.77906357e-02, -1.16936544e+00, -3.14920460e-03, -1.18537362e+00, 2.99624644e-01,
1.76247250e+00, -6.49375825e-01, -1.89211809e-01, -1.00974570e+00, 1.47455608e+00,
1.72728137e+00, 2.18072141e+00, -7.62571173e-01, -1.23504812e+00, 2.14290218e-01,
-7.46888683e-01, 5.53627395e-01, -7.82076567e-03, 1.56933507e+00, 1.07155739e+00,
-6.42903166e-01, -9.85900335e-01, -6.31873346e-01, -9.85430080e-01, 3.97933623e-01,
-2.07587828e+00, 2.76612669e-01, -1.22060249e+00, -2.25139829e-01, 1.80572908e+00,
-5.58028004e-01, -8.45859723e-01, -1.30829100e+00, -1.65904870e+00, -9.78603426e-01,
-3.70256932e-01, 6.40194479e-01, 1.29842617e+00, 5.79764541e-01, -2.18955795e+00,
-6.34491122e-01, 2.83457214e-01, 2.71316544e-01, 5.79996139e-01, -1.90426727e+00,
-2.20898199e+00, 5.67839219e-01, -1.04623710e+00, 1.01192986e+00, 1.18567472e+00,
-1.73342893e+00, -2.65618016e+00, 3.03138568e-01, -1.02196040e+00, -2.21750759e-01,
-1.72682912e+00, -1.23679339e+00, 3.32640475e-01, -4.60601000e-01, -7.81932128e-02,
4.11906483e+00, -1.89283131e+00, -3.88776684e-01, 1.80199833e+00, 1.96404455e+00,
3.43852965e-01, -6.23609543e-01, 1.81733087e-01, 5.72130123e-01, 1.20715657e+00,
-9.16486162e-01, -5.61833245e-01, 1.67641549e-01, -1.75329878e+00, 2.02727673e+00,
-2.28164354e-01, 8.44422552e-01, -1.51806276e+00, 1.11571422e+00, -6.35541493e-01,
-7.89951282e-02, 4.72008590e-01, -8.35642565e-01, 3.68813724e-01, -7.06411185e-01,
-2.06091646e-01, 1.16843231e+00, 2.22169824e+00, -2.13768098e+00, 2.32776602e-01,
2.52900016e-01, -1.14185849e+00, 1.66528537e-01, 1.98871626e+00, 6.88624657e-01,
1.86755853e-01, -2.60746884e-01, 2.14480822e-01, 5.74795125e-01, -1.38808062e-01,
6.23677175e-01, -2.74784978e+00, -8.37018300e-02, -3.22071295e-01, 3.66767660e-01,
-8.23091717e-01, -7.47733613e-02, 1.51128334e+00, -1.74266371e+00, -2.99285140e-01,
-5.11163366e-01, 6.42039600e-01, 2.76048507e-01, -7.37616832e-01, 1.22339395e+00,
-2.67566663e-01, -7.51730239e-02, 2.01868691e-01, 7.07868632e-01, -1.21711787e+00,
-1.85687375e+00, 1.05200890e+00, 1.47295756e+00, 2.54890967e-01, -1.24936980e+00,
-2.57051185e+00, 3.98733877e-01, -7.23513377e-01, 1.21540059e+00, 8.12283422e-01,
1.65554595e+00, -1.17091747e+00, 1.34992672e-01, -1.26490262e+00, 1.90743067e+00,
1.26996550e+00, 6.84984124e-01, -2.42826181e+00, 5.82274924e-01, -6.03997807e-02,
-2.34897259e-01, -2.82126477e+00, 6.99213914e-01, -6.24173822e-01, 9.13698195e-01,
2.30096444e+00, -7.69519522e-01, -2.05936269e+00, -5.04623275e-01, 9.51572220e-01,
-1.04990530e+00, 9.29427177e-01, -1.00119016e+00, 5.58533219e-01, -1.96190366e+00,
-2.19649662e+00, 2.76351981e-01, 1.00882502e+00, 1.77184378e+00, 1.52844587e+00,
-6.11090570e-01, 8.38972820e-01, -1.19408219e+00, 1.09833108e+00, 1.79335203e+00,
9.50652921e-01, 2.03016606e-01, -7.05328950e-01, 2.63976431e+00, 1.32128813e+00,
-3.26324584e-01, -6.03144462e-01, -1.15795682e+00, -2.84347500e-01, -2.70637624e+00,
8.99588322e-01, 1.16243638e+00, 6.23042073e-01, -1.05633172e+00, 7.74870856e-01,
1.11703946e+00, 7.31498949e-01, 4.88889866e-02, 5.18543386e-01, -1.15303239e-01,
-3.72740004e-01, 7.18707005e-01, -1.10160673e-02, -3.42219376e-01, -4.07108891e-01,
1.46297984e+00, 2.21343521e+00, 1.36672760e+00, -1.42677666e+00, -1.53701751e+00,
1.20834078e+00, 5.34986888e-01, -1.09136550e-01, 4.83101030e-01, 7.86715435e-01,
1.04015999e-01, 6.21976525e-01, -2.08139696e+00, 6.95530731e-01, 1.03483749e+00,
-1.35308249e+00, 4.56603819e-02, -2.25926466e-01, 2.43326854e-01, 6.16818669e-01,
6.94683652e-02, -2.33814385e-01, -2.22136024e+00, 1.86899901e+00, 1.10748320e+00,
1.16927626e+00, -2.45241826e+00, 1.27914126e+00, 1.60261128e+00, -1.94906569e+00,
1.97845616e+00, -4.46554806e-01, -8.02072809e-01, -1.96479219e+00, 3.59615459e-01,
-5.74916548e-01, -1.86520891e-01, 1.24436447e+00, -7.48666778e-01, -2.45964718e+00,
-2.48723344e-01, 1.49576775e+00, 1.18547459e-01, -1.24812482e+00, 1.65059802e+00,
-8.75251737e-01, -3.00917161e+00, -9.70460069e-01, -6.87370120e-01, -1.39008336e+00,
-4.98646683e-01, 1.53959956e+00, 1.34417230e+00, 7.25609309e-01, -7.97696169e-01,
-8.26531057e-01, -2.73695934e+00, 2.27172885e+00, 1.58063398e-01, -5.75734209e-01,
-1.20968554e+00, 8.79594164e-01, -1.97505063e-01, 6.07633769e-01, -5.23534759e-01,
5.39579521e-01, -1.43180248e+00, -1.31573180e+00, 2.06689061e-01, 8.44228287e-01,
1.01539177e-01, 8.50313924e-01, 1.13773193e+00, -6.09337003e-01, 1.22573408e+00,
1.60308325e+00, -3.58368736e+00, -1.44948284e+00, -1.41743392e+00, -5.61340107e-01,
-9.68290606e-01, -2.02739053e+00, 2.71090499e-01, 2.51806453e+00, -9.34553301e-02,
5.98489523e-01, 1.00383713e-01, 1.47096663e+00, -1.87702008e+00, -9.71287935e-01,
1.36813300e+00, -1.05133427e-01, -7.45511518e-01, 1.15482681e-02, 7.41538344e-01,
4.89211699e-01, 1.78611375e-01, -3.22591658e-01, -6.62753734e-01, -6.79941629e-01,
-1.56662518e+00, -1.30972025e+00, -9.95839674e-01, 5.78534201e-01, -3.55251735e-01,
-4.20144708e-02, 2.11099051e-01, -1.37500178e+00, 3.05860052e-01, 2.39801447e+00,
1.06806434e-01, -4.31891309e-02, -5.92778723e-01, -2.33810000e-01, 2.73379933e-01,
-8.91777478e-01, -5.54188105e-01, -7.29232486e-01, -2.61636425e-02, -2.56123061e+00,
-1.82546639e+00 ]
</p>
<m shape='(108)'>
[ 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03, 3.67494322e+03,
3.67494322e+03, 3.67494322e+03, 3.67494322e+03 ]
</m>
<names shape='(108)'>
[ H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2, H2, H2,
H2, H2, H2 ]
</names>
</beads>
<total_steps>100000</total_steps>
<cell shape='(3, 3)'>
[ 3.37259417e+01, 2.06511833e-15, 2.06511833e-15, 0.00000000e+00, 3.37259417e+01,
2.06511833e-15, 0.00000000e+00, 0.00000000e+00, 3.37259417e+01 ]
</cell>
<forces>
<socket>
<port>31415</port>
</socket>
</forces>
<output prefix=''>
<properties shape='(8)' filename='tut2a.md'>
[ step, time{picosecond}, conserved{kelvin}, temperature{kelvin}, potential{kelvin},
kinetic_cv{kelvin}, pressure_cv{megapascal}, volume ]
</properties>
<properties stride='20' shape='(1)' filename='tut2a.force'> [ atom_f{piconewton}(atom=0;bead=0) ] </properties>
<trajectory format='pdb' filename='tut2a.pos' stride='100' cell_units='angstrom'>positions{angstrom}</trajectory>
<checkpoint stride='1000' filename='tut2a.checkpoint'/>
</output>
<prng>
<state shape='(624)'>
[ 2687888409, 4059721984, 529212847, 1944050140, 549951740,
753730274, 4256902940, 3644633819, 1619935418, 2926854959,
3845596702, 3377185214, 672656208, 1522275289, 2252162595,
3840064745, 4027492069, 3675681571, 2579879846, 1816332499,
4032401752, 1911816378, 303445975, 1468438718, 4013747657,
1340600813, 2333908485, 2694837801, 4170600699, 2510847348,
3039951471, 3744192067, 1926386446, 1272375545, 1414207521,
66179398, 4083890893, 4151044133, 576437212, 1676792606,
434309634, 1907904212, 552501071, 2721977900, 1774218030,
2379944892, 895572049, 964207007, 855123501, 322370220,
2071560835, 311075834, 2622627631, 3049706185, 2343013325,
68709345, 1862864050, 3480897554, 1688711674, 3849088037,
2335410691, 2553458415, 3853338058, 2210199727, 2794071459,
2398176951, 3934057850, 1698758425, 1011318686, 1806201471,
1034736815, 3855360847, 835665231, 2475925733, 233924796,
3024757758, 2198530484, 3673044703, 1249768122, 3962863565,
3357863236, 2995035040, 307264231, 726406611, 2449569067,
2105792248, 2511154863, 1776943467, 1288186977, 1069459630,
4142069906, 2662399901, 2976669074, 3587203732, 2374529826,
1425481845, 228954896, 829104572, 3792121363, 2155121068,
4012537920, 4004560763, 1828234324, 523136808, 212778594,
2400962328, 2941249333, 941934455, 1185399473, 1989697055,
3876270640, 2356595322, 2240658826, 1455744954, 1294764103,
197281598, 3596260716, 1784450322, 4229237399, 2625160461,
3437563840, 99534139, 4231199313, 4186457231, 1356327267,
11955050, 694326214, 3281619587, 1501920361, 4047724237,
254407815, 1209336385, 2469757968, 3247917043, 467877924,
714928015, 1424369871, 2112691093, 961450464, 1302826015,
1508195287, 2682046824, 1166405749, 130758490, 669915191,
3325468865, 2863429703, 99481154, 2455859519, 3512819878,
2058734245, 713709489, 92681358, 1270820689, 2875258344,
4089059727, 2319856617, 3246994482, 2375401460, 3526989769,
2037481502, 1523778672, 4277357577, 3378312673, 1761280988,
385602812, 2806072191, 263793228, 3893867788, 1122562696,
3292179677, 196613098, 1412940405, 437753556, 2089537898,
3093827021, 2543771523, 2707596589, 4247024898, 423016972,
1950202748, 619404510, 1524092033, 2603783903, 1668886628,
1610491330, 203643004, 378998824, 3077420296, 1135622483,
1741156718, 4043803158, 134627695, 3826076900, 2236198903,
1299249975, 1841801847, 1664600294, 3214378313, 4189671272,
3480243241, 2314880827, 726164864, 1258895459, 1021877225,
57278710, 2540601428, 2729779922, 1740214549, 1640865107,
1355185385, 2109593488, 2195506700, 672372257, 2178115007,
1875949822, 1689867492, 385658740, 2445406785, 271863064,
988127097, 1025468932, 2359419817, 30505704, 3740615491,
302654725, 68322970, 3937476624, 1133164597, 2115798914,
320399345, 783710429, 2653212426, 3534685928, 1799928422,
3374564924, 140092188, 2838741355, 118331603, 3274090979,
2536288199, 424964681, 2624886533, 930882804, 2205394448,
2184146172, 676812400, 3846276446, 3664199786, 1428020191,
174713762, 1742043028, 1988587715, 250315220, 3460710952,
518855886, 3301263820, 3376830340, 1924596217, 3991359611,
4018324691, 2736101407, 3348220756, 4134954748, 1014806456,
811815211, 2969949177, 1648717003, 1095340695, 3941199066,
1442177871, 2118024477, 3440070762, 2652513624, 2449760687,
3263443330, 2902806218, 3234417117, 1849567332, 947381041,
3667048364, 951549915, 3479164436, 3858250612, 331400252,
2281345388, 2762215954, 3082365401, 683228175, 3454398927,
970279118, 2070406438, 3049304524, 1693733059, 175159517,
1769171565, 2762326718, 2494712358, 1596534753, 696283870,
2018059673, 92137961, 494184422, 392011733, 1385029818,
934252405, 333359117, 3764822796, 1330799844, 1968964095,
1099463842, 3602247127, 2198538609, 99239880, 3666952197,
1538751175, 687515492, 1759850188, 1784319556, 219306934,
3607066683, 3549791334, 1244006176, 3168276190, 2506130029,
934365798, 4125460139, 2267772610, 4123099235, 3145641762,
2282867996, 947174487, 2735752579, 1153570283, 1214198797,
3843855592, 226542409, 1556151146, 2140750114, 173612017,
3793649149, 513160329, 1696259753, 2196908248, 4236321655,
3978054768, 3076169778, 1237756707, 794294503, 2478806329,
3270485108, 21511829, 3648378180, 2173244083, 390728983,
1613278496, 245589104, 1871555825, 840092166, 2005126608,
2086709055, 346538249, 755528088, 4150217063, 1800593080,
2996189003, 223378615, 26641502, 1408725657, 1055486622,
2783260926, 2418422845, 1425876347, 2681749907, 689577833,
2439224882, 1119191698, 3284738598, 3248369824, 2184806341,
3827067703, 1403375638, 2039560728, 2026930258, 1439858255,
3646642925, 357706083, 801162144, 200302113, 843383109,
3953988752, 803642989, 133507707, 1890262095, 2010928680,
153102298, 62155903, 277159866, 3184049271, 3470490419,
1263803797, 1744789719, 291191777, 2104793752, 3710673355,
690715888, 3985842110, 2609560703, 850539005, 86744360,
1737104979, 1863808169, 1774594416, 295814460, 349948339,
2998856642, 2965669633, 1901828086, 3978738887, 1547972061,
3099911135, 2005717380, 567557764, 4005749125, 2160875982,
3708061218, 71131479, 4020136758, 2494015768, 1649237263,
3904477723, 398737933, 1060721700, 1863476301, 370356512,
3071414126, 2579819024, 1413367122, 2902740002, 111597792,
3291486874, 2640531015, 3168695648, 2512654909, 3959449531,
2099836667, 1724339088, 1513859793, 1867797563, 72940112,
150365030, 2695841664, 1822792143, 1313669546, 2967322181,
520611643, 353667991, 2717535171, 3765848346, 388428102,
1356267895, 3512676772, 370279636, 3846898162, 230096495,
1637173159, 611261822, 1005164736, 269482378, 3515088803,
3384787851, 219854487, 3527128574, 1621986556, 2351564858,
1464556636, 3969432414, 4241153635, 3481875215, 2028710485,
2552303669, 398357876, 502240174, 2783848798, 3029135000,
3389310739, 2505116094, 142532114, 3164584552, 2476051612,
3402430270, 3909441351, 3427500434, 334653597, 3680534388,
994471388, 3554495285, 1194116172, 2229772907, 1080120321,
764714490, 2033099135, 14870392, 1699063853, 4063486208,
1292743360, 2032090912, 72238972, 161094465, 1452285444,
2672671278, 1692937611, 1323803845, 3240748400, 4018998180,
747254077, 236045767, 3239449578, 983232024, 3337514013,
1251769771, 3333700522, 410670915, 987407435, 2475716801,
2872258033, 4098868775, 1252507952, 3804640001, 1349395704,
3776831082, 2921973556, 4089719272, 2209056770, 4132418611,
1349045766, 1096167788, 946557058, 2742739413, 675697683,
981116951, 3762459934, 735892043, 2820765771, 3285067216,
2160644040, 3791763118, 3326789900, 4049571064, 2680776632,
3569204094, 65929649, 3389067210, 3597945585, 1844146738,
2700511765, 329482853, 1760204187, 923334769, 4064120545,
3501525441, 185277522, 1241941790, 3591317416, 417403194,
1300287444, 568015210, 1937417620, 1293297106, 1132926831,
2866724791, 3257502829, 2947848120, 3895316838, 522557077,
3227142004, 3090084150, 1099385887, 281296826, 1305525858,
4048212751, 1083053479, 1851665893, 2417839863, 1623516667,
3571192609, 3711731288, 2688150423, 1385750380, 3001410324,
3992036671, 438613795, 1675062808, 126103207, 3806023665,
3378609204, 3872710810, 3254661971, 3271656093, 2954958773,
2955771203, 943499290, 1783244758, 27256593, 2736330207,
2854314347, 1414980118, 3499653814, 2716003330, 1906739972,
2097871403, 833490830, 860249641, 1359898654, 681385897,
768010275, 1337229341, 2176361026, 1243749829, 2535464086,
3587794549, 257320265, 1799338138, 2326145708 ]
</state>
<seed>12345</seed>
<set_pos>432</set_pos>
<gauss> -8.30560467e-01</gauss>
</prng>
<ensemble mode='npt'>
<pressure> 0 </pressure>
<barostat mode='isotropic'>
<thermostat mode='langevin'>
<tau units='femtosecond'> 250 </tau>
</thermostat>
<tau units='femtosecond'> 250 </tau>
</barostat>
<thermostat mode='pile_g'>
<tau> 1.03353433e+03</tau>
<ethermo> 2.24648494e-02</ethermo>
</thermostat>
<timestep> 4.13413730e+01</timestep>
<temperature> 7.91703800e-05</temperature>
</ensemble>
</simulation>

View File

@ -0,0 +1,33 @@
<simulation verbosity='high'>
<initialize nbeads='4'>
<file mode='chk'> tutorial-1_RESTART </file>
</initialize>
<output prefix='tut2b'>
<properties filename='md' stride='1'> [ step, time{picosecond}, conserved{kelvin}, temperature{kelvin}, potential{kelvin}, kinetic_cv{kelvin}, pressure_cv{megapascal}, volume ] </properties>
<properties filename='force' stride='20'> [atom_f{piconewton}(atom=0;bead=0)] </properties>
<trajectory filename='pos' stride='100' format='pdb' cell_units='angstrom'> positions{angstrom} </trajectory>
<checkpoint filename='checkpoint' stride='1000' overwrite='True'/>
</output>
<total_steps>100000</total_steps>
<prng> <seed> 31415 </seed> </prng>
<forces>
<socket mode="inet">
<address>localhost</address>
<port> 31415 </port>
</socket>
</forces>
<ensemble mode='npt'>
<barostat mode='isotropic'>
<thermostat mode='langevin'>
<tau units='femtosecond'> 250 </tau>
</thermostat>
<tau units='femtosecond'> 250 </tau>
</barostat>
<thermostat mode='pile_g'>
<tau units='femtosecond'> 25 </tau>
</thermostat>
<timestep units='femtosecond'> 1 </timestep>
<temperature units='kelvin'> 25 </temperature>
<pressure> 0 </pressure>
</ensemble>
</simulation>

View File

@ -0,0 +1,174 @@
CRYST1 39.115 39.115 39.115 90.00 90.00 90.00 P 1 1
ATOM 1 H2 1 1 0.000 0.000 0.000 0.00 0.00 0
ATOM 2 H2 1 1 5.582 5.582 0.000 0.00 0.00 0
ATOM 3 H2 1 1 5.582 0.000 5.582 0.00 0.00 0
ATOM 4 H2 1 1 0.000 5.582 5.582 0.00 0.00 0
ATOM 5 H2 1 1 0.000 0.000 11.165 0.00 0.00 0
ATOM 6 H2 1 1 5.582 5.582 11.165 0.00 0.00 0
ATOM 7 H2 1 1 5.582 0.000 16.747 0.00 0.00 0
ATOM 8 H2 1 1 0.000 5.582 16.747 0.00 0.00 0
ATOM 9 H2 1 1 0.000 0.000 22.330 0.00 0.00 0
ATOM 10 H2 1 1 5.582 5.582 22.330 0.00 0.00 0
ATOM 11 H2 1 1 5.582 0.000 27.912 0.00 0.00 0
ATOM 12 H2 1 1 0.000 5.582 27.912 0.00 0.00 0
ATOM 13 H2 1 1 0.000 0.000 33.495 0.00 0.00 0
ATOM 14 H2 1 1 5.582 5.582 33.495 0.00 0.00 0
ATOM 15 H2 1 1 0.000 11.165 0.000 0.00 0.00 0
ATOM 16 H2 1 1 5.582 16.747 0.000 0.00 0.00 0
ATOM 17 H2 1 1 5.582 11.165 5.582 0.00 0.00 0
ATOM 18 H2 1 1 0.000 16.747 5.582 0.00 0.00 0
ATOM 19 H2 1 1 0.000 11.165 11.165 0.00 0.00 0
ATOM 20 H2 1 1 5.582 16.747 11.165 0.00 0.00 0
ATOM 21 H2 1 1 5.582 11.165 16.747 0.00 0.00 0
ATOM 22 H2 1 1 0.000 16.747 16.747 0.00 0.00 0
ATOM 23 H2 1 1 0.000 11.165 22.330 0.00 0.00 0
ATOM 24 H2 1 1 5.582 16.747 22.330 0.00 0.00 0
ATOM 25 H2 1 1 5.582 11.165 27.912 0.00 0.00 0
ATOM 26 H2 1 1 0.000 16.747 27.912 0.00 0.00 0
ATOM 27 H2 1 1 0.000 11.165 33.495 0.00 0.00 0
ATOM 28 H2 1 1 5.582 16.747 33.495 0.00 0.00 0
ATOM 29 H2 1 1 0.000 22.330 0.000 0.00 0.00 0
ATOM 30 H2 1 1 5.582 27.912 0.000 0.00 0.00 0
ATOM 31 H2 1 1 5.582 22.330 5.582 0.00 0.00 0
ATOM 32 H2 1 1 0.000 27.912 5.582 0.00 0.00 0
ATOM 33 H2 1 1 0.000 22.330 11.165 0.00 0.00 0
ATOM 34 H2 1 1 5.582 27.912 11.165 0.00 0.00 0
ATOM 35 H2 1 1 5.582 22.330 16.747 0.00 0.00 0
ATOM 36 H2 1 1 0.000 27.912 16.747 0.00 0.00 0
ATOM 37 H2 1 1 0.000 22.330 22.330 0.00 0.00 0
ATOM 38 H2 1 1 5.582 27.912 22.330 0.00 0.00 0
ATOM 39 H2 1 1 5.582 22.330 27.912 0.00 0.00 0
ATOM 40 H2 1 1 0.000 27.912 27.912 0.00 0.00 0
ATOM 41 H2 1 1 0.000 22.330 33.495 0.00 0.00 0
ATOM 42 H2 1 1 5.582 27.912 33.495 0.00 0.00 0
ATOM 43 H2 1 1 0.000 33.495 0.000 0.00 0.00 0
ATOM 44 H2 1 1 5.582 33.495 5.582 0.00 0.00 0
ATOM 45 H2 1 1 0.000 33.495 11.165 0.00 0.00 0
ATOM 46 H2 1 1 5.582 33.495 16.747 0.00 0.00 0
ATOM 47 H2 1 1 0.000 33.495 22.330 0.00 0.00 0
ATOM 48 H2 1 1 5.582 33.495 27.912 0.00 0.00 0
ATOM 49 H2 1 1 0.000 33.495 33.495 0.00 0.00 0
ATOM 50 H2 1 1 11.165 0.000 0.000 0.00 0.00 0
ATOM 51 H2 1 1 16.747 5.582 0.000 0.00 0.00 0
ATOM 52 H2 1 1 16.747 0.000 5.582 0.00 0.00 0
ATOM 53 H2 1 1 11.165 5.582 5.582 0.00 0.00 0
ATOM 54 H2 1 1 11.165 0.000 11.165 0.00 0.00 0
ATOM 55 H2 1 1 16.747 5.582 11.165 0.00 0.00 0
ATOM 56 H2 1 1 16.747 0.000 16.747 0.00 0.00 0
ATOM 57 H2 1 1 11.165 5.582 16.747 0.00 0.00 0
ATOM 58 H2 1 1 11.165 0.000 22.330 0.00 0.00 0
ATOM 59 H2 1 1 16.747 5.582 22.330 0.00 0.00 0
ATOM 60 H2 1 1 16.747 0.000 27.912 0.00 0.00 0
ATOM 61 H2 1 1 11.165 5.582 27.912 0.00 0.00 0
ATOM 62 H2 1 1 11.165 0.000 33.495 0.00 0.00 0
ATOM 63 H2 1 1 16.747 5.582 33.495 0.00 0.00 0
ATOM 64 H2 1 1 11.165 11.165 0.000 0.00 0.00 0
ATOM 65 H2 1 1 16.747 16.747 0.000 0.00 0.00 0
ATOM 66 H2 1 1 16.747 11.165 5.582 0.00 0.00 0
ATOM 67 H2 1 1 11.165 16.747 5.582 0.00 0.00 0
ATOM 68 H2 1 1 11.165 11.165 11.165 0.00 0.00 0
ATOM 69 H2 1 1 16.747 16.747 11.165 0.00 0.00 0
ATOM 70 H2 1 1 16.747 11.165 16.747 0.00 0.00 0
ATOM 71 H2 1 1 11.165 16.747 16.747 0.00 0.00 0
ATOM 72 H2 1 1 11.165 11.165 22.330 0.00 0.00 0
ATOM 73 H2 1 1 16.747 16.747 22.330 0.00 0.00 0
ATOM 74 H2 1 1 16.747 11.165 27.912 0.00 0.00 0
ATOM 75 H2 1 1 11.165 16.747 27.912 0.00 0.00 0
ATOM 76 H2 1 1 11.165 11.165 33.495 0.00 0.00 0
ATOM 77 H2 1 1 16.747 16.747 33.495 0.00 0.00 0
ATOM 78 H2 1 1 11.165 22.330 0.000 0.00 0.00 0
ATOM 79 H2 1 1 16.747 27.912 0.000 0.00 0.00 0
ATOM 80 H2 1 1 16.747 22.330 5.582 0.00 0.00 0
ATOM 81 H2 1 1 11.165 27.912 5.582 0.00 0.00 0
ATOM 82 H2 1 1 11.165 22.330 11.165 0.00 0.00 0
ATOM 83 H2 1 1 16.747 27.912 11.165 0.00 0.00 0
ATOM 84 H2 1 1 16.747 22.330 16.747 0.00 0.00 0
ATOM 85 H2 1 1 11.165 27.912 16.747 0.00 0.00 0
ATOM 86 H2 1 1 11.165 22.330 22.330 0.00 0.00 0
ATOM 87 H2 1 1 16.747 27.912 22.330 0.00 0.00 0
ATOM 88 H2 1 1 16.747 22.330 27.912 0.00 0.00 0
ATOM 89 H2 1 1 11.165 27.912 27.912 0.00 0.00 0
ATOM 90 H2 1 1 11.165 22.330 33.495 0.00 0.00 0
ATOM 91 H2 1 1 16.747 27.912 33.495 0.00 0.00 0
ATOM 92 H2 1 1 11.165 33.495 0.000 0.00 0.00 0
ATOM 93 H2 1 1 16.747 33.495 5.582 0.00 0.00 0
ATOM 94 H2 1 1 11.165 33.495 11.165 0.00 0.00 0
ATOM 95 H2 1 1 16.747 33.495 16.747 0.00 0.00 0
ATOM 96 H2 1 1 11.165 33.495 22.330 0.00 0.00 0
ATOM 97 H2 1 1 16.747 33.495 27.912 0.00 0.00 0
ATOM 98 H2 1 1 11.165 33.495 33.495 0.00 0.00 0
ATOM 99 H2 1 1 22.330 0.000 0.000 0.00 0.00 0
ATOM 100 H2 1 1 27.912 5.582 0.000 0.00 0.00 0
ATOM 101 H2 1 1 27.912 0.000 5.582 0.00 0.00 0
ATOM 102 H2 1 1 22.330 5.582 5.582 0.00 0.00 0
ATOM 103 H2 1 1 22.330 0.000 11.165 0.00 0.00 0
ATOM 104 H2 1 1 27.912 5.582 11.165 0.00 0.00 0
ATOM 105 H2 1 1 27.912 0.000 16.747 0.00 0.00 0
ATOM 106 H2 1 1 22.330 5.582 16.747 0.00 0.00 0
ATOM 107 H2 1 1 22.330 0.000 22.330 0.00 0.00 0
ATOM 108 H2 1 1 27.912 5.582 22.330 0.00 0.00 0
ATOM 109 H2 1 1 27.912 0.000 27.912 0.00 0.00 0
ATOM 110 H2 1 1 22.330 5.582 27.912 0.00 0.00 0
ATOM 111 H2 1 1 22.330 0.000 33.495 0.00 0.00 0
ATOM 112 H2 1 1 27.912 5.582 33.495 0.00 0.00 0
ATOM 113 H2 1 1 22.330 11.165 0.000 0.00 0.00 0
ATOM 114 H2 1 1 27.912 16.747 0.000 0.00 0.00 0
ATOM 115 H2 1 1 27.912 11.165 5.582 0.00 0.00 0
ATOM 116 H2 1 1 22.330 16.747 5.582 0.00 0.00 0
ATOM 117 H2 1 1 22.330 11.165 11.165 0.00 0.00 0
ATOM 118 H2 1 1 27.912 16.747 11.165 0.00 0.00 0
ATOM 119 H2 1 1 27.912 11.165 16.747 0.00 0.00 0
ATOM 120 H2 1 1 22.330 16.747 16.747 0.00 0.00 0
ATOM 121 H2 1 1 22.330 11.165 22.330 0.00 0.00 0
ATOM 122 H2 1 1 27.912 16.747 22.330 0.00 0.00 0
ATOM 123 H2 1 1 27.912 11.165 27.912 0.00 0.00 0
ATOM 124 H2 1 1 22.330 16.747 27.912 0.00 0.00 0
ATOM 125 H2 1 1 22.330 11.165 33.495 0.00 0.00 0
ATOM 126 H2 1 1 27.912 16.747 33.495 0.00 0.00 0
ATOM 127 H2 1 1 22.330 22.330 0.000 0.00 0.00 0
ATOM 128 H2 1 1 27.912 27.912 0.000 0.00 0.00 0
ATOM 129 H2 1 1 27.912 22.330 5.582 0.00 0.00 0
ATOM 130 H2 1 1 22.330 27.912 5.582 0.00 0.00 0
ATOM 131 H2 1 1 22.330 22.330 11.165 0.00 0.00 0
ATOM 132 H2 1 1 27.912 27.912 11.165 0.00 0.00 0
ATOM 133 H2 1 1 27.912 22.330 16.747 0.00 0.00 0
ATOM 134 H2 1 1 22.330 27.912 16.747 0.00 0.00 0
ATOM 135 H2 1 1 22.330 22.330 22.330 0.00 0.00 0
ATOM 136 H2 1 1 27.912 27.912 22.330 0.00 0.00 0
ATOM 137 H2 1 1 27.912 22.330 27.912 0.00 0.00 0
ATOM 138 H2 1 1 22.330 27.912 27.912 0.00 0.00 0
ATOM 139 H2 1 1 22.330 22.330 33.495 0.00 0.00 0
ATOM 140 H2 1 1 27.912 27.912 33.495 0.00 0.00 0
ATOM 141 H2 1 1 22.330 33.495 0.000 0.00 0.00 0
ATOM 142 H2 1 1 27.912 33.495 5.582 0.00 0.00 0
ATOM 143 H2 1 1 22.330 33.495 11.165 0.00 0.00 0
ATOM 144 H2 1 1 27.912 33.495 16.747 0.00 0.00 0
ATOM 145 H2 1 1 22.330 33.495 22.330 0.00 0.00 0
ATOM 146 H2 1 1 27.912 33.495 27.912 0.00 0.00 0
ATOM 147 H2 1 1 22.330 33.495 33.495 0.00 0.00 0
ATOM 148 H2 1 1 33.495 0.000 0.000 0.00 0.00 0
ATOM 149 H2 1 1 33.495 5.582 5.582 0.00 0.00 0
ATOM 150 H2 1 1 33.495 0.000 11.165 0.00 0.00 0
ATOM 151 H2 1 1 33.495 5.582 16.747 0.00 0.00 0
ATOM 152 H2 1 1 33.495 0.000 22.330 0.00 0.00 0
ATOM 153 H2 1 1 33.495 5.582 27.912 0.00 0.00 0
ATOM 154 H2 1 1 33.495 0.000 33.495 0.00 0.00 0
ATOM 155 H2 1 1 33.495 11.165 0.000 0.00 0.00 0
ATOM 156 H2 1 1 33.495 16.747 5.582 0.00 0.00 0
ATOM 157 H2 1 1 33.495 11.165 11.165 0.00 0.00 0
ATOM 158 H2 1 1 33.495 16.747 16.747 0.00 0.00 0
ATOM 159 H2 1 1 33.495 11.165 22.330 0.00 0.00 0
ATOM 160 H2 1 1 33.495 16.747 27.912 0.00 0.00 0
ATOM 161 H2 1 1 33.495 11.165 33.495 0.00 0.00 0
ATOM 162 H2 1 1 33.495 22.330 0.000 0.00 0.00 0
ATOM 163 H2 1 1 33.495 27.912 5.582 0.00 0.00 0
ATOM 164 H2 1 1 33.495 22.330 11.165 0.00 0.00 0
ATOM 165 H2 1 1 33.495 27.912 16.747 0.00 0.00 0
ATOM 166 H2 1 1 33.495 22.330 22.330 0.00 0.00 0
ATOM 167 H2 1 1 33.495 27.912 27.912 0.00 0.00 0
ATOM 168 H2 1 1 33.495 22.330 33.495 0.00 0.00 0
ATOM 169 H2 1 1 33.495 33.495 0.000 0.00 0.00 0
ATOM 170 H2 1 1 33.495 33.495 11.165 0.00 0.00 0
ATOM 171 H2 1 1 33.495 33.495 22.330 0.00 0.00 0
ATOM 172 H2 1 1 33.495 33.495 33.495 0.00 0.00 0
END

View File

@ -0,0 +1,31 @@
<simulation verbosity='medium'>
<initialize nbeads='16'>
<file mode='chk'> tutorial-3_RESTART </file>
</initialize>
<output prefix='tut3_npt'>
<properties filename='md' stride='1'> [ step, time{picosecond}, conserved{kelvin}, temperature{kelvin}, potential{kelvin}, kinetic_cv{kelvin}, pressure_cv{megapascal}, volume ] </properties>
<trajectory filename='pos' stride='100' format='pdb' cell_units='angstrom'> positions{angstrom} </trajectory>
<checkpoint filename='checkpoint' stride='1000' overwrite='True'/>
</output>
<total_steps> ??? </total_steps>
<forces>
<socket mode="???">
<address>localhost</address>
<port> 31415 </port>
</socket>
</forces>
<ensemble mode='npt'>
<barostat mode='???'>
<thermostat mode='???'>
<tau units='femtosecond'> ??? </tau>
</thermostat>
<tau units='femtosecond'> ??? </tau>
</barostat>
<thermostat mode='???'>
<tau units='femtosecond'> ??? </tau>
</thermostat>
<timestep units='femtosecond'> ??? </timestep>
<temperature units='kelvin'>25</temperature>
<pressure> 0 </pressure>
</ensemble>
</simulation>

View File

@ -0,0 +1,25 @@
<simulation verbosity='medium'>
<initialize nbeads='16'>
<file mode='pdb'> our_ref.pdb </file>
<velocities mode='thermal' units='kelvin'> ??? </velocities>
</initialize>
<output prefix='tut3_nvt'>
<properties filename='md' stride='1'> [ step, time{picosecond}, conserved{kelvin}, temperature{kelvin}, potential{kelvin}, kinetic_cv{kelvin}, pressure_cv{megapascal} ] </properties>
<trajectory filename='pos' stride='100' format='pdb' cell_units='angstrom'> positions{angstrom} </trajectory>
<checkpoint filename='checkpoint' stride='1000' overwrite='True'/>
</output>
<total_steps> ??? </total_steps>
<forces>
<socket mode="???">
<address>localhost</address>
<port> 31415 </port>
</socket>
</forces>
<ensemble mode='nvt'>
<thermostat mode='???'>
<tau units='femtosecond'> ??? </tau>
</thermostat>
<timestep units='femtosecond'> ??? </timestep>
<temperature units='kelvin'>25</temperature>
</ensemble>
</simulation>

60
tools/i-pi/i-pi Executable file
View File

@ -0,0 +1,60 @@
#!/usr/bin/python
"""Main script from which the simulation is run.
Deals with creation of the simulation object, reading the input file and
initialising the system.
Run using:
i-pi input_file.xml
Where 'input_file.xml' should be replaced by the name of the xml input file from
which the system data will be read. For a description of how the input file
should be formatted, see the reference manual.
Functions:
main: Runs the simulation.
"""
import sys
from ipi.engine import simulation
from ipi.inputs.simulation import InputSimulation
from ipi.utils.io.io_xml import *
from ipi.utils.messages import banner, help, verbosity
def main(file_name):
"""Runs the simulation.
Will run automatically when the module is used as a script.
"""
ifile = open(file_name,"r")
xmlrestart = xml_parse_file(ifile) # Parses the file.
ifile.close()
simrestart = InputSimulation()
# Checks the input and partitions it appropriately.
simrestart.parse(xmlrestart.fields[0][1])
# Here we must do this manually; from here on everything should be automated by the messages classes
if simrestart.verbosity.fetch() != "quiet" :
banner()
print " # i-pi starting from input file: ", file_name
if simrestart.verbosity.fetch() != "quiet" and simrestart.verbosity.fetch() != "low" :
print " --- begin input file content --- "
ifile = open(file_name,"r")
for line in ifile.readlines():
print line,
ifile.close()
print " --- end input file content --- "
simul = simrestart.fetch() # Creates the appropriate simulation object.
simul.run()
del simul
#This is what is run if the file is run as a script.
if __name__ == '__main__':
if (len(sys.argv) != 2):
help()
else:
main(sys.argv[1])

14
tools/i-pi/ipi/README Normal file
View File

@ -0,0 +1,14 @@
-- Source code directory --
* This is the main source directory.
* Files:
- i-pi: Runs the simulation.
* Directories:
- engine: Holds the modules containing the objects used during the
simulation.
- interfaces: Holds the modules containing the socket interface code.
- utils: Holds the modules containing utility functions.
- inputs: Holds the modules that deals with reading the input and the
restart mechanism.

View File

@ -0,0 +1 @@
__all__ = ["engine", "inputs", "interfaces", "utils"]

View File

@ -0,0 +1,18 @@
-- Engine code directory --
* This is the directory containing all the major class definitions.
* Files:
- atoms.py: Deals with classical simulations.
- barostats.py: Deals with constant pressure simulations.
- beads.py: Deals with quantum simulations.
- cell.py: Deals with the simulation box.
- ensembles.py: Deals with the different ensembles.
- forces.py: Deals with creating the jobs to send to the driver code.
- initializer.py: Deals with initialization of the simulation.
- normalmodes.py: Deals with the normal mode transformations.
- outputs.py: Deals with the output files.
- properties.py: Deals with calculating all the output properties.
- simulation.py: Deals with all the top level information, such as
input/output.
- thermostats.py: Deals with constant temperature simulations.

View File

@ -0,0 +1,3 @@
__all__ = ["atoms", "cell", "simulation", "forces", "ensembles", "properties",
"thermostats", "barostats", "beads", "outputs", "normalmodes",
"initializer" ]

View File

@ -0,0 +1,269 @@
"""Contains the classes which deal with the atoms.
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/>.
Used for holding information about the atoms, including their positions, masses
momenta and kinetic energy. Has separate classes for accessing the global
arrays of atoms and for individual atoms.
Classes:
Atom: Class with methods dealing with individual atoms.
Atoms: Class with methods dealing with all the atoms.
"""
__all__ = ['Atoms', 'Atom']
import numpy as np
from ipi.utils.depend import *
from ipi.utils import units
class Atom(dobject):
"""Represent an atom, with position, velocity, mass and related properties.
This is actually only an interface to the Atoms class, i.e. only stores
views of the large arrays which contain all the coordinates.
Attributes:
kin: The kinetic energy of the atom.
kstress: The contribution of the atom to the kinetic stress tensor.
Depend objects:
p: The three components of the momentum of the atom.
q: The three components of the position of the atom.
m: The mass of the atom.
name: The name of the atom.
m3: An array of 3 elements with each element being the mass of the atom.
Used when each degree of freedom needs to be divided by the mass.
"""
def __init__(self, system, index):
"""Initialises Atom.
Args:
system: An Atoms object containing the required atom.
index: An integer giving the index of the required atom in the atoms
list. Note that indices start from 0.
"""
dset(self,"p",system.p[3*index:3*index+3])
dset(self,"q",system.q[3*index:3*index+3])
dset(self,"m",system.m[index:index+1])
dset(self,"name",system.names[index:index+1])
dset(self,"m3",system.m3[3*index:3*index+3])
@property
def kin(self):
"""Calculates the contribution of the atom to the kinetic energy."""
return np.dot(self.p,self.p)/(2.0*self.m)
@property
def kstress(self):
"""Calculates the contribution of the atom to the kinetic stress
tensor.
"""
p = depstrip(self.p)
ks = numpy.zeros((3,3),float)
for i in range(3):
for j in range(i,3):
ks[i,j] = p[i]*p[j]
return ks/self.m
class Atoms(dobject):
"""Storage for the atoms' positions, masses and velocities.
Everything is stored as 3*n sized contiguous arrays,
and a convenience-access is provided through a list of Atom objects.
Attributes:
natoms: The number of atoms.
Depend objects:
p: An array giving the components of the atom positions.
q: An array giving the components of the atom momenta.
m: An array giving the atom masses.
names: An array giving the atom names.
m3: An array of 3*n elements where each element of m has been copied
three times. Used when each degree of freedom needs to be divided
by the mass.
M: The total mass of all the atoms.
kin: The total kinetic energy of the atoms. Depends on p and m3.
kstress: The contribution of the atoms to the kinetic stress tensor.
Depends on px, py, pz and m.
qx: An array giving the x components of the positions.
qy: An array giving the y components of the positions.
qz: An array giving the z components of the positions.
px: An array giving the x components of the momenta.
py: An array giving the y components of the momenta.
pz: An array giving the z components of the momenta.
"""
def __init__(self, natoms, _prebind=None):
"""Initialises Atoms.
Each replica and the centroid coordinate are all held as Atoms objects,
and so slices of the global position and momentum arrays must be used in
the initialisation so that they always agree with each other.
Args:
natoms: An integer giving the number of atoms.
_prebind: An optional tuple of four elements; a depend_array of length
3*natoms for the positions, another for the momenta, a depend_array
of length natoms for the masses and another for the names.
"""
self.natoms = natoms
if _prebind is None:
dset(self,"q",depend_array(name="q",value=np.zeros(3*natoms, float)))
dset(self,"p",depend_array(name="p",value=np.zeros(3*natoms, float)))
dset(self,"m",depend_array(name="m",value=np.zeros(natoms, float)))
dset(self,"names",
depend_array(name="names",value=np.zeros(natoms, np.dtype('|S6'))))
else:
dset(self,"q",_prebind[0])
dset(self,"p",_prebind[1])
dset(self,"m",_prebind[2])
dset(self,"names",_prebind[3])
self.px = self.p[0:3*natoms:3]
self.py = self.p[1:3*natoms:3]
self.pz = self.p[2:3*natoms:3]
self.qx = self.q[0:3*natoms:3]
self.qy = self.q[1:3*natoms:3]
self.qz = self.q[2:3*natoms:3]
dset(self,"m3",
depend_array(name="m3",value=np.zeros(3*natoms, float),func=self.mtom3,
dependencies=[dget(self,"m")]))
dset(self,"M",
depend_value(name="M",func=self.get_msum,
dependencies=[dget(self,"m")]) )
dset(self,"kin",
depend_value(name="kin",func=self.get_kin,
dependencies=[dget(self,"p"),dget(self,"m3")]) )
dset(self,"kstress",
depend_value(name="kstress",func=self.get_kstress,
dependencies=[dget(self,"px"),dget(self,"py"),dget(self,"pz"),dget(self,"m")]) )
def copy(self):
"""Creates a new Atoms object.
Returns:
An Atoms object with the same q, p, m and names arrays as the original.
"""
newat = Atoms(self.natoms)
newat.q[:] = self.q
newat.p[:] = self.p
newat.m[:] = self.m
newat.names[:] = self.names
return newat
def __len__(self):
"""Length function.
This is called whenever the standard function len(atoms) is used.
Returns:
The number of atoms.
"""
return self.natoms
def __getitem__(self,index):
"""Overwrites standard getting function.
This is called whenever the standard function atoms[index] is used.
Returns an Atom object with the appropriate position and momenta arrays.
Note that they are dynamically generated each time an Atom needs to be
accessed, as this reduces the number of depend objects that need to be
held at any one time.
Args:
index: The index of the atom to be accessed.
Returns:
The atom given by the index.
"""
return Atom(self,index)
def __setitem__(self,index,value):
"""Overwrites standard setting function.
This is called whenever the standard function atoms[index]=value is used.
Changes the position and momenta of the appropriate slice of the global
position and momentum arrays to those given by value.
Note that they are dynamically generated each time an Atom needs to be
accessed, as this reduces the number of depend objects that need to be
held at any one time.
Args:
index: The atom to be changed.
value: The Atom object that holds the new values.
"""
pat = Atom(self,index)
pat.p = value.p
pat.q = value.q
pat.m = value.m
pat.name = value.name
def get_msum(self):
"""Calculates the total mass."""
return self.m.sum()
def mtom3(self):
"""Returns a 3*n mass array.
Returns:
An array of 3*n elements where each element of m has been copied
three times. Used when each degree of freedom needs to be divided
by the mass.
"""
m3 = np.zeros(3*self.natoms,float)
m3[0:3*self.natoms:3] = self.m
m3[1:3*self.natoms:3] = m3[0:3*self.natoms:3]
m3[2:3*self.natoms:3] = m3[0:3*self.natoms:3]
return m3
def get_kin(self):
"""Calculates the total kinetic energy of the system."""
p = depstrip(self.p)
return 0.5*np.dot(p,p/depstrip(self.m3))
def get_kstress(self):
"""Calculates the total contribution of the atoms to the kinetic stress
tensor -- not volume-scaled
"""
ks = np.zeros((3,3),float)
ks[0,0] = np.dot(self.px,self.px/self.m)
ks[1,1] = np.dot(self.py,self.py/self.m)
ks[2,2] = np.dot(self.pz,self.pz/self.m)
ks[0,1] = np.dot(self.px,self.py/self.m)
ks[0,2] = np.dot(self.px,self.pz/self.m)
ks[1,2] = np.dot(self.py,self.pz/self.m)
return ks

View File

@ -0,0 +1,450 @@
"""Contains the classes that deal with constant pressure dynamics.
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/>.
Contains the algorithms which propagate the position and momenta steps in the
constant pressure ensemble. Holds the properties directly related to
these ensembles, such as the internal and external pressure and stress.
Classes:
Barostat: Base barostat class with the generic methods and attributes.
BaroBZP: Generates dynamics with a stochastic barostat -- see
Ceriotti, More, Manolopoulos, Comp. Phys. Comm. 2013 for
implementation details.
"""
# NB: this file also contains a 'BaroMHT' class, that follows more closely the
# Martyna, Hughes, Tuckerman implementation of a PIMD barostat. However it is so
# close to the BZP implementation that we disabled it for the sake of simplicity
# BaroMHT: Generates dynamics according to the method of G. Martyna, A.
# Hughes and M. Tuckerman, J. Chem. Phys., 110, 3275.
__all__ = ['Barostat', 'BaroBZP']
import numpy as np
from ipi.utils.depend import *
from ipi.utils.units import *
from ipi.utils.mathtools import eigensystem_ut3x3, invert_ut3x3, exp_ut3x3, det_ut3x3
from ipi.inputs.thermostats import InputThermo
from ipi.engine.thermostats import Thermostat
class Barostat(dobject):
"""Base barostat class.
Gives the standard methods and attributes needed in all the barostat classes.
Attributes:
beads: A beads object giving the atoms positions
cell: A cell object giving the system box.
forces: A forces object giving the virial and the forces acting on
each bead.
nm: An object to do the normal mode transformation.
thermostat: A thermostat coupled to the barostat degrees of freedom.
mdof: The number of atomic degrees of freedom
Depend objects:
dt: The time step used in the algorithms. Depends on the simulation dt.
temp: The (classical) simulation temperature. Higher than the physical
temperature by a factor of the number of beads.
tau: The timescale associated with the piston
pext: The external pressure
ebaro: The conserved quantity associated with the barostat.
pot: The potential energy associated with the barostat.
kstress: The system kinetic stress tensor.
stress: The system stress tensor.
press: The system pressure.
"""
def __init__(self, dt=None, temp=None, pext=None, tau=None, ebaro=None, thermostat=None):
"""Initialises base barostat class.
Note that the external stress and the external pressure are synchronized.
This makes most sense going from the stress to the pressure, but if you
must go in the other direction the stress is assumed to be isotropic.
Args:
dt: Optional float giving the time step for the algorithms. Defaults
to the simulation dt.
temp: Optional float giving the temperature for the thermostat.
Defaults to the simulation temp.
pext: Optional float giving the external pressure.
tau: Optional float giving the time scale associated with the barostat.
ebaro: Optional float giving the conserved quantity already stored
in the barostat initially. Used on restart.
thermostat: The thermostat connected to the barostat degree of freedom.
"""
dset(self,"dt",depend_value(name='dt'))
if not dt is None:
self.dt = dt
else: self.dt = 1.0
dset(self, "temp", depend_value(name="temp"))
if not temp is None:
self.temp = temp
else: self.temp = 1.0
dset(self,"tau",depend_value(name='tau'))
if not tau is None:
self.tau = tau
else: self.tau = 1.0
dset(self,"pext",depend_value(name='pext'))
if not pext is None:
self.pext = pext
else: self.pext = 0.0
dset(self,"ebaro",depend_value(name='ebaro'))
if not ebaro is None:
self.ebaro = ebaro
else: self.ebaro = 0.0
if thermostat is None:
thermostat = Thermostat()
self.thermostat = thermostat
# pipes timestep and temperature to the thermostat
deppipe(self,"dt", self.thermostat, "dt")
deppipe(self, "temp", self.thermostat,"temp")
def bind(self, beads, nm, cell, forces, prng=None, fixdof=None):
"""Binds beads, cell and forces to the barostat.
This takes a beads object, a cell object and a forcefield object and
makes them members of the barostat. It also then creates the objects that
will hold the data needed in the barostat algorithms and the dependency
network.
Args:
beads: The beads object from which the bead positions are taken.
nm: The normal modes propagator object
cell: The cell object from which the system box is taken.
forces: The forcefield object from which the force and virial are
taken.
prng: The parent PRNG to bind the thermostat to
fixdof: The number of blocked degrees of freedom.
"""
self.beads = beads
self.cell = cell
self.forces = forces
self.nm = nm
dset(self,"pot",
depend_value(name='pot', func=self.get_pot,
dependencies=[ dget(cell,"V"), dget(self,"pext") ]))
dset(self,"kstress",
depend_value(name='kstress', func=self.get_kstress,
dependencies=[ dget(beads,"q"), dget(beads,"qc"), dget(beads,"pc"), dget(forces,"f") ]))
dset(self,"stress",
depend_value(name='stress', func=self.get_stress,
dependencies=[ dget(self,"kstress"), dget(cell,"V"), dget(forces,"vir") ]))
dset(self,"press",
depend_value(name='press', func=self.get_press,
dependencies=[ dget(self,"stress") ]))
if fixdof is None:
self.mdof = float(self.beads.natoms)*3.0
else:
self.mdof = float(self.beads.natoms)*3.0 - float(fixdof)
def get_pot(self):
"""Calculates the elastic strain energy of the cell."""
# NOTE: since there are nbeads replicas of the unit cell, the enthalpy contains a nbeads factor
return self.cell.V*self.pext*self.beads.nbeads
def get_kstress(self):
"""Calculates the quantum centroid virial kinetic stress tensor
estimator.
"""
kst = np.zeros((3,3),float)
q = depstrip(self.beads.q)
qc = depstrip(self.beads.qc)
pc = depstrip(self.beads.pc)
m = depstrip(self.beads.m)
na3 = 3*self.beads.natoms
fall = depstrip(self.forces.f)
for b in range(self.beads.nbeads):
for i in range(3):
for j in range(i,3):
kst[i,j] -= np.dot(q[b,i:na3:3] - qc[i:na3:3],
fall[b,j:na3:3])
# NOTE: In order to have a well-defined conserved quantity, the Nf kT term in the
# diagonal stress estimator must be taken from the centroid kinetic energy.
for i in range(3):
kst[i,i] += np.dot(pc[i:na3:3],pc[i:na3:3]/m) *self.beads.nbeads
return kst
def get_stress(self):
"""Calculates the internal stress tensor."""
return (self.kstress + self.forces.vir)/self.cell.V
def get_press(self):
"""Calculates the internal pressure."""
return np.trace(self.stress)/3.0
def pstep(self):
"""Dummy momenta propagator step."""
pass
def qcstep(self):
"""Dummy centroid position propagator step."""
pass
class BaroBZP(Barostat):
"""Bussi-Zykova-Parrinello barostat class.
Just extends the standard class adding finite-dt propagators for the barostat
velocities, positions, piston.
Depend objects:
p: The momentum associated with the volume degree of freedom.
m: The mass associated with the volume degree of freedom.
"""
def __init__(self, dt=None, temp=None, pext=None, tau=None, ebaro=None, thermostat=None, p=None):
"""Initializes BZP barostat.
Args:
dt: Optional float giving the time step for the algorithms. Defaults
to the simulation dt.
temp: Optional float giving the temperature for the thermostat.
Defaults to the simulation temp.
pext: Optional float giving the external pressure.
tau: Optional float giving the time scale associated with the barostat.
ebaro: Optional float giving the conserved quantity already stored
in the barostat initially. Used on restart.
thermostat: The thermostat connected to the barostat degree of freedom.
p: Optional initial volume conjugate momentum. Defaults to 0.
"""
super(BaroBZP, self).__init__(dt, temp, pext, tau, ebaro, thermostat)
dset(self,"p", depend_array(name='p', value=np.atleast_1d(0.0)))
if not p is None:
self.p = np.asarray([p])
else:
self.p = 0.0
def bind(self, beads, nm, cell, forces, prng=None, fixdof=None):
"""Binds beads, cell and forces to the barostat.
This takes a beads object, a cell object and a forcefield object and
makes them members of the barostat. It also then creates the objects that
will hold the data needed in the barostat algorithms and the dependency
network.
Args:
beads: The beads object from which the bead positions are taken.
nm: The normal modes propagator object
cell: The cell object from which the system box is taken.
forces: The forcefield object from which the force and virial are
taken.
prng: The parent PRNG to bind the thermostat to
fixdof: The number of blocked degrees of freedom.
"""
super(BaroBZP, self).bind(beads, nm, cell, forces, prng, fixdof)
# obtain the thermostat mass from the given time constant
# note that the barostat temperature is nbeads times the physical T
dset(self,"m", depend_array(name='m', value=np.atleast_1d(0.0),
func=(lambda:np.asarray([self.tau**2*3*self.beads.natoms*Constants.kb*self.temp])),
dependencies=[ dget(self,"tau"), dget(self,"temp") ] ))
# binds the thermostat to the piston degrees of freedom
self.thermostat.bind(pm=[ self.p, self.m ], prng=prng)
dset(self,"kin",depend_value(name='kin',
func=(lambda:0.5*self.p[0]**2/self.m[0]),
dependencies= [dget(self,"p"), dget(self,"m")] ) )
# the barostat energy must be computed from bits & pieces (overwrite the default)
dset(self, "ebaro", depend_value(name='ebaro', func=self.get_ebaro,
dependencies=[ dget(self, "kin"), dget(self, "pot"),
dget(self.cell, "V"), dget(self, "temp"),
dget(self.thermostat,"ethermo")] ))
def get_ebaro(self):
"""Calculates the barostat conserved quantity."""
return self.thermostat.ethermo + self.kin + self.pot - np.log(self.cell.V)*Constants.kb*self.temp
def pstep(self):
"""Propagates the momenta for half a time step."""
dthalf = self.dt*0.5
dthalf2 = dthalf**2
dthalf3 = dthalf**3/3.0
# This differs from the BZP thermostat in that it uses just one kT in the propagator.
# This leads to an ensemble equaivalent to Martyna-Hughes-Tuckermann for both fixed and moving COM
# Anyway, it is a small correction so whatever.
self.p += dthalf*3.0*( self.cell.V* ( self.press - self.beads.nbeads*self.pext ) +
Constants.kb*self.temp )
fc = np.sum(depstrip(self.forces.f),0)/self.beads.nbeads
m = depstrip(self.beads.m3)[0]
pc = depstrip(self.beads.pc)
# I am not 100% sure, but these higher-order terms come from integrating the pressure virial term,
# so they should need to be multiplied by nbeads to be consistent with the equations of motion in the PI context
# again, these are tiny tiny terms so whatever.
self.p += (dthalf2*np.dot(pc,fc/m) + dthalf3*np.dot(fc,fc/m)) * self.beads.nbeads
self.beads.p += depstrip(self.forces.f)*dthalf
def qcstep(self):
"""Propagates the centroid position and momentum and the volume."""
v = self.p[0]/self.m[0]
expq, expp = (np.exp(v*self.dt), np.exp(-v*self.dt))
m = depstrip(self.beads.m3)[0]
self.nm.qnm[0,:] *= expq
self.nm.qnm[0,:] += ((expq-expp)/(2.0*v))* (depstrip(self.nm.pnm)[0,:]/m)
self.nm.pnm[0,:] *= expp
self.cell.h *= expq
class BaroMHT(Barostat):
"""Martyna-Hughes-Tuckerman barostat class.
Just extends the standard class adding finite-dt propagators for the barostat
velocities, positions, piston.
Depend objects:
p: The momentum associated with the volume degree of freedom.
m: The mass associated with the volume degree of freedom.
"""
def __init__(self, dt=None, temp=None, pext=None, tau=None, ebaro=None, thermostat=None, p=None):
"""Initializes MHT barostat.
Args:
dt: Optional float giving the time step for the algorithms. Defaults
to the simulation dt.
temp: Optional float giving the temperature for the thermostat.
Defaults to the simulation temp.
pext: Optional float giving the external pressure.
tau: Optional float giving the time scale associated with the barostat.
ebaro: Optional float giving the conserved quantity already stored
in the barostat initially. Used on restart.
thermostat: The thermostat connected to the barostat degree of freedom.
p: Optional initial volume conjugate momentum. Defaults to 0.
"""
super(BaroMHT, self).__init__(dt, temp, pext, tau, ebaro, thermostat)
dset(self,"p", depend_array(name='p', value=np.atleast_1d(0.0)))
if not p is None:
self.p = np.asarray([p])
else:
self.p = 0.0
def bind(self, beads, nm, cell, forces, prng=None, fixdof=None):
"""Binds beads, cell and forces to the barostat.
This takes a beads object, a cell object and a forcefield object and
makes them members of the barostat. It also then creates the objects that
will hold the data needed in the barostat algorithms and the dependency
network.
Args:
beads: The beads object from which the bead positions are taken.
nm: The normal modes propagator object
cell: The cell object from which the system box is taken.
forces: The forcefield object from which the force and virial are
taken.
prng: The parent PRNG to bind the thermostat to
fixdof: The number of blocked degrees of freedom.
"""
super(BaroMHT, self).bind(beads, nm, cell, forces, prng, fixdof)
# obtain the thermostat mass from the given time constant
# note that the barostat temperature is nbeads times the physical T
dset(self,"m", depend_array(name='m', value=np.atleast_1d(0.0),
func=(lambda:np.asarray([self.tau**2*3*self.beads.natoms*Constants.kb*self.temp])),
dependencies=[ dget(self,"tau"), dget(self,"temp") ] ))
# binds the thermostat to the piston degrees of freedom
self.thermostat.bind(pm=[ self.p, self.m ], prng=prng)
dset(self,"kin",depend_value(name='kin',
func=(lambda:0.5*self.p[0]**2/self.m[0]),
dependencies=[dget(self,"p"), dget(self,"m")] ) )
# the barostat energy must be computed from bits & pieces (overwrite the default)
dset(self, "ebaro", depend_value(name='ebaro', func=self.get_ebaro,
dependencies=[ dget(self, "kin"), dget(self, "pot"),
dget(self.cell, "V"), dget(self, "temp"),
dget(self.thermostat,"ethermo")]))
def get_ebaro(self):
"""Calculates the barostat conserved quantity."""
return self.thermostat.ethermo + self.kin + self.pot
def pstep(self):
"""Propagates the momenta for half a time step."""
dthalf = self.dt*0.5
dthalf2 = dthalf**2
dthalf3 = dthalf**3/3.0
fc = np.sum(depstrip(self.forces.f),0)/float(self.beads.nbeads)
m = depstrip(self.beads.m3)[0]
pc = depstrip(self.beads.pc)
self.p += dthalf*3.0*( self.cell.V* ( self.press - self.beads.nbeads*self.pext ) +
float(self.beads.nbeads)/self.mdof*np.dot(pc,pc/m) )
self.beads.p += depstrip(self.forces.f)*dthalf
def qcstep(self):
"""Propagates the centroid position and momentum and the volume."""
v = self.p[0]/self.m[0]
adof = (1 + 3.0/self.mdof)
expq, expp = (np.exp(v*self.dt), np.exp( -v*self.dt * adof ) )
m = depstrip(self.beads.m3)[0]
self.nm.qnm[0,:] *= expq
self.nm.qnm[0,:] += ((expq-expp)/(v*(1+adof)) *
(depstrip(self.nm.pnm)[0,:])/m)
self.nm.pnm[0,:] *= expp
self.cell.h *= expq

View File

@ -0,0 +1,323 @@
"""Contains the classes which deal with all the beads.
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/>.
Used for holding information about the beads, including their positions, masses
momenta and kinetic energy. Has different objects for the position and normal
mode representations, and has a special centroid atoms object for when the
centroid coordinate is required.
Classes:
Beads: Class with methods dealing with all the beads.
"""
__all__ = ['Beads']
import numpy as np
from ipi.utils.depend import *
from ipi.engine.atoms import Atoms
from ipi.utils import units
class Beads(dobject):
"""Storage for the beads positions and velocities.
Everything is stored as (nbeads,3*natoms) sized contiguous arrays,
and a convenience-access to each replica of the system is provided through a
list of Atoms objects. Contains arrays of both the normal mode representation
and the position representation, and various sized arrays for the atom
labels and masses. Also contains the potential and force between
neighbouring replicas.
Attributes:
natoms: The number of atoms.
nbeads: The number of beads.
_blist: A list of Atoms objects for each replica of the system. Each
replica is assumed to have the same mass and atom label.
centroid: An atoms object giving the centroid coordinate of the beads.
Depend objects:
names: An array giving the atom names.
m: An array giving the atom masses.
m3: An array giving the mass associated with each degree of freedom.
sm3: An array giving the square root of m3.
q: An array giving all the bead positions.
p: An array giving all the bead momenta.
qc: An array giving the centroid positions. Depends on qnm.
pc: An array giving the centroid momenta. Depends on pnm.
vpath: The spring potential between the beads, divided by omegan**2.
Depends on q.
fpath: The spring force between the beads, divided by omegan**2.
Depends on q.
kins: A list of the kinetic energy of each replica.
kin: The total kinetic energy of the system. Note that this is not the
same as the estimate of the kinetic energy of the system, which is
contained in the properties module.
kstress: The total kinetic stress tensor for the system.
rg: An array giving the radius of gyration of each atom.
"""
def __init__(self, natoms, nbeads):
"""Initialises Beads.
Args:
natoms: Number of atoms.
nbeads: Number of beads.
"""
self.resize(natoms, nbeads)
def resize(self, natoms, nbeads):
"""Creates all the data arrays needed in the simulation.
Effectively initializes the whole Beads object, according to the
specified number of atoms and beads. Is also used, as the name suggests,
to resize the data to a new number of beads when this is necessary, for
example in initialization from a simulation with a different number of
beads.
Also creates, or recreates, the dependency network, as this requires
the data arrays to be created for it to work.
Args:
natoms: The number of atoms.
nbeads: The number of beads.
"""
self.natoms = natoms
self.nbeads = nbeads
dset(self,"names",
depend_array(name="names",value=np.zeros(natoms, np.dtype('|S6'))) )
# atom masses, and mass-related arrays
dset(self,"m",depend_array(name="m",value=np.zeros(natoms, float)) ) # this is the prototype mass array (just one independent of bead n)
dset(self,"m3",
depend_array(name="m3",value=np.zeros((nbeads,3*natoms), float), # this is m conveniently replicated to be (nb,3*nat)
func=self.mtom3, dependencies=[dget(self,"m")]))
dset(self,"sm3",
depend_array(name="sm3",value=np.zeros((nbeads,3*natoms), float), # this is just the square root of m3
func=self.m3tosm3, dependencies=[dget(self,"m3")]))
# positions and momenta. bead representation, base storage used everywhere
dset(self,"q",
depend_array(name="q",value=np.zeros((nbeads,3*natoms), float)) )
dset(self,"p",
depend_array(name="p",value=np.zeros((nbeads,3*natoms), float)) )
# position and momentum of the centroid
dset(self,"qc",
depend_array(name="qc",value=np.zeros(3*natoms, float),
func=self.get_qc, dependencies=[dget(self,"q")] ) )
dset(self,"pc",
depend_array(name="pc",value=np.zeros(3*natoms, float),
func=self.get_pc, dependencies=[dget(self,"p")] ) )
# create proxies to access the centroid and the individual beads as Atoms objects
self.centroid = Atoms(natoms, _prebind=(self.qc, self.pc, self.m, self.names))
self._blist = [Atoms(natoms, _prebind=( self.q[i,:], self.p[i,:], self.m, self.names )) for i in range(nbeads) ]
# path springs potential and force
dset(self,"vpath",
depend_value(name="vpath", func=self.get_vpath,
dependencies=[dget(self,"q")]))
dset(self,"fpath",
depend_array(name="fpath", value=np.zeros((nbeads,3*natoms), float),
func=self.get_fpath, dependencies=[dget(self,"q")]))
# kinetic energies of thhe beads, and total (classical) kinetic stress tensor
dset(self,"kins",
depend_array(name="kins",value=np.zeros(nbeads, float),
func=self.kin_gather,
dependencies=[dget(b,"kin") for b in self._blist]))
dset(self,"kin",
depend_value(name="kin", func=self.get_kin,
dependencies=[dget(self,"kins")]))
dset(self,"kstress",
depend_array(name="kstress",value=np.zeros((3,3), float),
func=self.get_kstress,
dependencies=[dget(b,"kstress") for b in self._blist]))
def copy(self):
"""Creates a new beads object from the original.
Returns:
A Beads object with the same q, p, m and names arrays as the original.
"""
newbd = Beads(self.natoms, self.nbeads)
newbd.q[:] = self.q
newbd.p[:] = self.p
newbd.m[:] = self.m
newbd.names[:] = self.names
return newbd
def m3tosm3(self):
"""Takes the mass array and returns the square rooted mass array."""
return np.sqrt(depstrip(self.m3))
def mtom3(self):
"""Takes the mass array for each bead and returns one with an element
for each degree of freedom.
Returns:
An array of size (nbeads,3*natoms), with each element corresponding
to the mass associated with the appropriate degree of freedom in q.
"""
m3 = np.zeros((self.nbeads,3*self.natoms),float)
m3[:,0:3*self.natoms:3] = self.m
m3[:,1:3*self.natoms:3] = m3[:,0:3*self.natoms:3]
m3[:,2:3*self.natoms:3] = m3[:,0:3*self.natoms:3]
return m3
def get_qc(self):
"""Gets the centroid coordinates."""
return np.dot(np.ones(self.nbeads,float),depstrip(self.q))/float(self.nbeads)
def get_pc(self):
"""Gets the centroid momenta."""
return np.dot(np.ones(self.nbeads,float),depstrip(self.p))/float(self.nbeads)
def kin_gather(self):
"""Gets the kinetic energy for all the replicas.
Returns:
A list of the kinetic energy for each system.
"""
return np.array([b.kin for b in self._blist])
def get_kin(self):
"""Gets the total kinetic energy of all the replicas.
Note that this does not correspond to the total kinetic energy estimate
for the system.
Returns:
The sum of the kinetic energy of each replica.
"""
return self.kins.sum()
def get_kstress(self):
"""Calculates the total kinetic stress tensor of all the replicas.
Note that this does not correspond to the quantum kinetic stress tensor
estimate for the system.
Returns:
The sum of the kinetic stress tensor of each replica.
"""
ks = np.zeros((3,3),float)
for b in range(self.nbeads):
ks += self[b].kstress
return ks
def get_vpath(self):
"""Calculates the spring potential between the replicas.
Note that this is actually the harmonic potential without being
multiplied by the factor omegan**2, which is only available in the
ensemble as the temperature is required to calculate it.
"""
epath = 0.0
q = depstrip(self.q)
m = depstrip(self.m3)[0]
for b in range(self.nbeads):
if b > 0:
dq = q[b,:] - q[b-1,:]
else:
dq = q[b,:] - q[self.nbeads-1,:]
epath += np.dot(dq, m*dq)
return epath*0.5
def get_fpath(self):
"""Calculates the spring force between the replicas.
Note that this is actually the harmonic force without being
multiplied by the factor omegan**2, which is only available in the
ensemble as the temperature is required to calculate it.
"""
nbeads = self.nbeads
natoms = self.natoms
f = np.zeros((nbeads,3*natoms),float)
q = depstrip(self.q)
m = depstrip(self.m3)[0]
for b in range(nbeads):
if b > 0:
dq = q[b,:] - q[b-1,:]
else:
dq = q[b,:] - q[self.nbeads-1,:]
dq *= m
f[b] -= dq
if b > 0:
f[b-1] += dq
else:
f[nbeads-1] += dq
return f
# A set of functions to access individual beads as Atoms objects
def __len__(self):
"""Length function.
This is called whenever the standard function len(beads) is used.
Returns:
The number of beads.
"""
return self.nbeads
def __getitem__(self,index):
"""Overwrites standard getting function.
This is called whenever the standard function beads[index] is used.
Returns an Atoms object with the appropriate position and momenta arrays.
Args:
index: The index of the replica of the system to be accessed.
Returns:
The replica of the system given by the index.
"""
return self._blist[index]
def __setitem__(self,index,value):
"""Overwrites standard setting function.
This is called whenever the standard function beads[index]=value is used.
Changes the position and momenta of the appropriate slice of the global
position and momentum arrays to those given by value.
Args:
index: The replica of the system to be changed.
value: The Atoms object that holds the new values.
"""
self._blist[index].p[:] = value.p
self._blist[index].q[:] = value.q
self._blist[index].m[:] = value.m
self._blist[index].names[:] = value.names

View File

@ -0,0 +1,140 @@
"""Contains the classes which deal with the system box.
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/>.
Used for implementing the minimum image convention.
Classes:
Cell: Base cell class with the generic methods and attributes.
"""
__all__ = ['Cell']
import numpy as np
from ipi.utils.depend import *
from ipi.utils.mathtools import *
from ipi.utils import units
class Cell(dobject):
"""Base class to represent the simulation cell in a periodic system.
This class has the base attributes required for either flexible or
isotropic cell dynamics. Uses an upper triangular lattice vector matrix to
represent the cell.
Depend objects:
h: An array giving the lattice vector matrix.
ih: An array giving the inverse of the lattice vector matrix.
V: The volume of the cell.
"""
def __init__(self, h=None):
"""Initialises base cell class.
Args:
h: Optional array giving the initial lattice vector matrix. The
reference cell matrix is set equal to this. Must be an upper
triangular 3*3 matrix. Defaults to a 3*3 zeroes matrix.
"""
if h is None:
#h = np.identity(3,float)
h = np.zeros((3,3), float)
dset(self,"h",depend_array(name = 'h', value = h) )
dset(self,"ih",
depend_array(name = "ih", value = np.zeros((3,3),float),
func=self.get_ih, dependencies=[dget(self,"h")]) )
dset(self,"V",
depend_value(name = 'V', func=self.get_volume,
dependencies=[dget(self,"h")]) )
def get_ih(self):
"""Inverts the lattice vector matrix."""
return invert_ut3x3(self.h)
def get_volume(self):
"""Calculates the volume of the system box."""
return det_ut3x3(self.h)
def apply_pbc(self, atom):
"""Uses the minimum image convention to return a particle to the
unit cell.
Args:
atom: An Atom object.
Returns:
An array giving the position of the image that is inside the
system box.
"""
s = np.dot(self.ih,atom.q)
for i in range(3):
s[i] = s[i] - round(s[i])
return np.dot(self.h,s)
def array_pbc(self, pos):
"""Uses the minimum image convention to return a list of particles to the
unit cell.
Args:
atom: An Atom object.
Returns:
An array giving the position of the image that is inside the
system box.
"""
s = depstrip(pos).copy()
s.shape = (len(pos)/3,3)
s = np.dot(depstrip(self.ih),s.T)
s = s - np.round(s)
s = np.dot(depstrip(self.h),s).T
pos[:] = s.reshape((len(s)*3))
def minimum_distance(self, atom1, atom2):
"""Takes two atoms and tries to find the smallest vector between two
images.
This is only rigorously accurate in the case of a cubic cell,
but gives the correct results as long as the cut-off radius is defined
as smaller than the smallest width between parallel faces even for
triclinic cells.
Args:
atom1: An Atom object.
atom2: An Atom object.
Returns:
An array giving the minimum distance between the positions of atoms
atom1 and atom2 in the minimum image convention.
"""
s = np.dot(self.ih,atom1.q-atom2.q)
for i in range(3):
s[i] -= round(s[i])
return np.dot(self.h, s)

View File

@ -0,0 +1,565 @@
"""Contains the classes that deal with the different dynamics required in
different types of ensembles.
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/>.
Holds the algorithms required for normal mode propagators, and the objects to
do the constant temperature and pressure algorithms. Also calculates the
appropriate conserved energy quantity for the ensemble of choice.
Classes:
Ensemble: Base ensemble class with generic methods and attributes.
NVEEnsemble: Deals with constant energy dynamics.
NVTEnsemble: Deals with constant temperature dynamics.
NPTEnsemble: Deals with constant pressure dynamics.
ReplayEnsemble: Takes a trajectory, and simply sets the atom positions to
match it, rather than doing dynamics. In this way new properties can
be calculated on an old simulation, without having to rerun it from
scratch.
"""
__all__ = ['Ensemble', 'NVEEnsemble', 'NVTEnsemble', 'NPTEnsemble', 'ReplayEnsemble']
import numpy as np
import time
from ipi.utils.depend import *
from ipi.utils import units
from ipi.utils.softexit import softexit
from ipi.utils.io.io_xyz import read_xyz
from ipi.utils.io.io_pdb import read_pdb
from ipi.utils.io.io_xml import xml_parse_file
from ipi.utils.units import Constants, unit_to_internal
from ipi.inputs.thermostats import InputThermo
from ipi.inputs.barostats import InputBaro
from ipi.engine.thermostats import *
from ipi.engine.barostats import *
class Ensemble(dobject):
"""Base ensemble class.
Gives the standard methods and attributes needed in all the
ensemble classes.
Attributes:
beads: A beads object giving the atoms positions.
cell: A cell object giving the system box.
forces: A forces object giving the virial and the forces acting on
each bead.
prng: A random number generator object.
nm: An object which does the normal modes transformation.
fixcom: A boolean which decides whether the centre of mass
motion will be constrained or not.
Depend objects:
econs: The conserved energy quantity appropriate to the given
ensemble. Depends on the various energy terms which make it up,
which are different depending on the ensemble.
temp: The system temperature.
dt: The timestep for the algorithms.
ntemp: The simulation temperature. Will be nbeads times higher than
the system temperature as PIMD calculations are done at this
effective classical temperature.
"""
def __init__(self, dt, temp, fixcom=False):
"""Initialises Ensemble.
Args:
dt: The timestep of the simulation algorithms.
temp: The temperature.
fixcom: An optional boolean which decides whether the centre of mass
motion will be constrained or not. Defaults to False.
"""
dset(self, "econs", depend_value(name='econs', func=self.get_econs))
dset(self, "temp", depend_value(name='temp', value=temp))
dset(self, "dt", depend_value(name='dt', value=dt))
self.fixcom = fixcom
def bind(self, beads, nm, cell, bforce, prng):
"""Binds beads, cell, bforce and prng to the ensemble.
This takes a beads object, a cell object, a forcefield object and a
random number generator object and makes them members of the ensemble.
It also then creates the objects that will hold the data needed in the
ensemble algorithms and the dependency network. Note that the conserved
quantity is defined in the init, but as each ensemble has a different
conserved quantity the dependencies are defined in bind.
Args:
beads: The beads object from whcih the bead positions are taken.
nm: A normal modes object used to do the normal modes transformation.
cell: The cell object from which the system box is taken.
bforce: The forcefield object from which the force and virial are
taken.
prng: The random number generator object which controls random number
generation.
"""
# store local references to the different bits of the simulation
self.beads = beads
self.cell = cell
self.forces = bforce
self.prng = prng
self.nm = nm
# n times the temperature
dset(self,"ntemp", depend_value(name='ntemp',func=self.get_ntemp,
dependencies=[dget(self,"temp")]))
# dependencies of the conserved quantity
dget(self,"econs").add_dependency(dget(self.beads, "kin"))
dget(self,"econs").add_dependency(dget(self.forces, "pot"))
dget(self,"econs").add_dependency(dget(self.beads, "vpath"))
def get_ntemp(self):
"""Returns the PI simulation temperature (P times the physical T)."""
return self.temp*self.beads.nbeads
def pstep(self):
"""Dummy momenta propagator which does nothing."""
pass
def qcstep(self):
"""Dummy centroid position propagator which does nothing."""
pass
def step(self):
"""Dummy simulation time step which does nothing."""
pass
def get_econs(self):
"""Calculates the conserved energy quantity for constant energy
ensembles.
"""
return self.beads.vpath*self.nm.omegan2 + self.nm.kin + self.forces.pot
class NVEEnsemble(Ensemble):
"""Ensemble object for constant energy simulations.
Has the relevant conserved quantity and normal mode propagator for the
constant energy ensemble. Note that a temperature of some kind must be
defined so that the spring potential can be calculated.
Attributes:
ptime: The time taken in updating the velocities.
qtime: The time taken in updating the positions.
ttime: The time taken in applying the thermostat steps.
Depend objects:
econs: Conserved energy quantity. Depends on the bead kinetic and
potential energy, and the spring potential energy.
"""
def __init__(self, dt, temp, fixcom=False):
"""Initialises NVEEnsemble.
Args:
dt: The simulation timestep.
temp: The system temperature.
fixcom: An optional boolean which decides whether the centre of mass
motion will be constrained or not. Defaults to False.
"""
super(NVEEnsemble,self).__init__(dt=dt,temp=temp, fixcom=fixcom)
def rmcom(self):
"""This removes the centre of mass contribution to the kinetic energy.
Calculates the centre of mass momenta, then removes the mass weighted
contribution from each atom. If the ensemble defines a thermostat, then
the contribution to the conserved quantity due to this subtraction is
added to the thermostat heat energy, as it is assumed that the centre of
mass motion is due to the thermostat.
If there is a choice of thermostats, the thermostat
connected to the centroid is chosen.
"""
if (self.fixcom):
pcom = np.zeros(3,float);
na3 = self.beads.natoms*3
nb = self.beads.nbeads
p = depstrip(self.beads.p)
m = depstrip(self.beads.m3)[:,0:na3:3]
M = self.beads[0].M
for i in range(3):
pcom[i] = p[:,i:na3:3].sum()
if hasattr(self,"thermostat"):
if hasattr(self.thermostat, "_thermos"):
self.thermostat._thermos[0].ethermo += np.dot(pcom,pcom)/(2.0*M*nb)
else:
self.thermostat.ethermo += np.dot(pcom,pcom)/(2.0*M*nb)
# subtracts COM _velocity_
pcom *= 1.0/(nb*M)
for i in range(3):
self.beads.p[:,i:na3:3] -= m*pcom[i]
def pstep(self):
"""Velocity Verlet momenta propagator."""
self.beads.p += depstrip(self.forces.f)*(self.dt*0.5)
def qcstep(self):
"""Velocity Verlet centroid position propagator."""
self.nm.qnm[0,:] += depstrip(self.nm.pnm)[0,:]/depstrip(self.beads.m3)[0]*self.dt
def step(self):
"""Does one simulation time step."""
self.ptime = -time.time()
self.pstep()
self.ptime += time.time()
self.qtime = -time.time()
self.qcstep()
self.nm.free_qstep()
self.qtime += time.time()
self.ptime -= time.time()
self.pstep()
self.ptime += time.time()
self.ttime = -time.time()
self.rmcom()
self.ttime += time.time()
class NVTEnsemble(NVEEnsemble):
"""Ensemble object for constant temperature simulations.
Has the relevant conserved quantity and normal mode propagator for the
constant temperature ensemble. Contains a thermostat object containing the
algorithms to keep the temperature constant.
Attributes:
thermostat: A thermostat object to keep the temperature constant.
Depend objects:
econs: Conserved energy quantity. Depends on the bead kinetic and
potential energy, the spring potential energy and the heat
transferred to the thermostat.
"""
def __init__(self, dt, temp, thermostat=None, fixcom=False):
"""Initialises NVTEnsemble.
Args:
dt: The simulation timestep.
temp: The system temperature.
thermostat: A thermostat object to keep the temperature constant.
Defaults to Thermostat()
fixcom: An optional boolean which decides whether the centre of mass
motion will be constrained or not. Defaults to False.
"""
super(NVTEnsemble,self).__init__(dt=dt,temp=temp, fixcom=fixcom)
if thermostat is None:
self.thermostat = Thermostat()
else:
self.thermostat = thermostat
def bind(self, beads, nm, cell, bforce, prng):
"""Binds beads, cell, bforce and prng to the ensemble.
This takes a beads object, a cell object, a forcefield object and a
random number generator object and makes them members of the ensemble.
It also then creates the objects that will hold the data needed in the
ensemble algorithms and the dependency network. Also note that the
thermostat timestep and temperature are defined relative to the system
temperature, and the the thermostat temperature is held at the
higher simulation temperature, as is appropriate.
Args:
beads: The beads object from whcih the bead positions are taken.
nm: A normal modes object used to do the normal modes transformation.
cell: The cell object from which the system box is taken.
bforce: The forcefield object from which the force and virial are
taken.
prng: The random number generator object which controls random number
generation.
"""
super(NVTEnsemble,self).bind(beads, nm, cell, bforce, prng)
fixdof = None
if self.fixcom:
fixdof = 3
# first makes sure that the thermostat has the correct temperature, then proceed with binding it.
deppipe(self,"ntemp", self.thermostat,"temp")
deppipe(self,"dt", self.thermostat, "dt")
#decides whether the thermostat will work in the normal mode or
#the bead representation.
if isinstance(self.thermostat,ThermoNMGLE) or isinstance(self.thermostat,ThermoNMGLEG) or isinstance(self.thermostat,ThermoPILE_L) or isinstance(self.thermostat,ThermoPILE_G):
self.thermostat.bind(nm=self.nm,prng=prng,fixdof=fixdof )
else:
self.thermostat.bind(beads=self.beads,prng=prng, fixdof=fixdof)
dget(self,"econs").add_dependency(dget(self.thermostat, "ethermo"))
def step(self):
"""Does one simulation time step."""
self.ttime = -time.time()
self.thermostat.step()
self.rmcom()
self.ttime += time.time()
self.ptime = -time.time()
self.pstep()
self.ptime += time.time()
self.qtime = -time.time()
self.qcstep()
self.nm.free_qstep()
self.qtime += time.time()
self.ptime -= time.time()
self.pstep()
self.ptime += time.time()
self.ttime -= time.time()
self.thermostat.step()
self.rmcom()
self.ttime += time.time()
def get_econs(self):
"""Calculates the conserved energy quantity for constant temperature
ensemble.
"""
return NVEEnsemble.get_econs(self) + self.thermostat.ethermo
class NPTEnsemble(NVTEnsemble):
"""Ensemble object for constant pressure simulations.
Has the relevant conserved quantity and normal mode propagator for the
constant pressure ensemble. Contains a thermostat object containing the
algorithms to keep the temperature constant, and a barostat to keep the
pressure constant.
Attributes:
barostat: A barostat object to keep the pressure constant.
Depend objects:
econs: Conserved energy quantity. Depends on the bead and cell kinetic
and potential energy, the spring potential energy, the heat
transferred to the beads and cell thermostat, the temperature and
the cell volume.
pext: External pressure.
"""
def __init__(self, dt, temp, pext, thermostat=None, barostat=None, fixcom=False):
"""Initialises NPTEnsemble.
Args:
dt: The simulation timestep.
temp: The system temperature.
pext: The external pressure.
thermostat: A thermostat object to keep the temperature constant.
Defaults to Thermostat().
barostat: A barostat object to keep the pressure constant.
Defaults to Barostat().
fixcom: An optional boolean which decides whether the centre of mass
motion will be constrained or not. Defaults to False.
"""
super(NPTEnsemble,self).__init__(dt, temp, thermostat, fixcom=fixcom)
if barostat == None:
self.barostat = Barostat()
else:
self.barostat = barostat
dset(self,"pext",depend_value(name='pext'))
if not pext is None:
self.pext = pext
else: self.pext = 0.0
def bind(self, beads, nm, cell, bforce, prng):
"""Binds beads, cell, bforce and prng to the ensemble.
This takes a beads object, a cell object, a forcefield object and a
random number generator object and makes them members of the ensemble.
It also then creates the objects that will hold the data needed in the
ensemble algorithms and the dependency network. Also note that the cell
thermostat timesteps and temperatures are defined relative to the system
temperature, and the the thermostat temperatures are held at the
higher simulation temperature, as is appropriate.
Args:
beads: The beads object from whcih the bead positions are taken.
nm: A normal modes object used to do the normal modes transformation.
cell: The cell object from which the system box is taken.
bforce: The forcefield object from which the force and virial are
taken.
prng: The random number generator object which controls random number
generation.
"""
fixdof = None
if self.fixcom:
fixdof = 3
super(NPTEnsemble,self).bind(beads, nm, cell, bforce, prng)
self.barostat.bind(beads, nm, cell, bforce, prng=prng, fixdof=fixdof)
deppipe(self,"ntemp", self.barostat, "temp")
deppipe(self,"dt", self.barostat, "dt")
deppipe(self,"pext", self.barostat, "pext")
dget(self,"econs").add_dependency(dget(self.barostat, "ebaro"))
def get_econs(self):
"""Calculates the conserved energy quantity for the constant pressure
ensemble.
"""
return NVTEnsemble.get_econs(self) + self.barostat.ebaro
def step(self):
"""NPT time step.
Note that the barostat only propagates the centroid coordinates. If this
approximation is made a centroid virial pressure and stress estimator can
be defined, so this gives the best statistical convergence. This is
allowed as the normal mode propagation is approximately unaffected
by volume fluctuations as long as the system box is much larger than
the radius of gyration of the ring polymers.
"""
self.ttime = -time.time()
self.thermostat.step()
self.barostat.thermostat.step()
self.rmcom()
self.ttime += time.time()
self.ptime = -time.time()
self.barostat.pstep()
self.ptime += time.time()
self.qtime = -time.time()
self.barostat.qcstep()
self.nm.free_qstep()
self.qtime += time.time()
self.ptime -= time.time()
self.barostat.pstep()
self.ptime += time.time()
self.ttime -= time.time()
self.barostat.thermostat.step()
self.thermostat.step()
self.rmcom()
self.ttime += time.time()
class ReplayEnsemble(Ensemble):
"""Ensemble object that just loads snapshots from an external file in sequence.
Has the relevant conserved quantity and normal mode propagator for the
constant energy ensemble. Note that a temperature of some kind must be
defined so that the spring potential can be calculated.
Attributes:
intraj: The input trajectory file.
ptime: The time taken in updating the velocities.
qtime: The time taken in updating the positions.
ttime: The time taken in applying the thermostat steps.
Depend objects:
econs: Conserved energy quantity. Depends on the bead kinetic and
potential energy, and the spring potential energy.
"""
def __init__(self, dt, temp, fixcom=False, intraj=None):
"""Initialises ReplayEnsemble.
Args:
dt: The simulation timestep.
temp: The system temperature.
fixcom: An optional boolean which decides whether the centre of mass
motion will be constrained or not. Defaults to False.
intraj: The input trajectory file.
"""
super(ReplayEnsemble,self).__init__(dt=dt,temp=temp,fixcom=fixcom)
if intraj == None:
raise ValueError("Must provide an initialized InitFile object to read trajectory from")
self.intraj = intraj
if intraj.mode == "manual":
raise ValueError("Replay can only read from PDB or XYZ files -- or a single frame from a CHK file")
self.rfile = open(self.intraj.value,"r")
def step(self):
"""Does one simulation time step."""
self.ptime = self.ttime = 0
self.qtime = -time.time()
try:
if (self.intraj.mode == "xyz"):
for b in self.beads:
myatoms = read_xyz(self.rfile)
myatoms.q *= unit_to_internal("length",self.intraj.units,1.0)
b.q[:] = myatoms.q
elif (self.intraj.mode == "pdb"):
for b in self.beads:
myatoms, mycell = read_pdb(self.rfile)
myatoms.q *= unit_to_internal("length",self.intraj.units,1.0)
mycell.h *= unit_to_internal("length",self.intraj.units,1.0)
b.q[:] = myatoms.q
self.cell.h[:] = mycell.h
elif (self.intraj.mode == "chk" or self.intraj.mode == "checkpoint"):
# reads configuration from a checkpoint file
xmlchk = xml_parse_file(self.rfile) # Parses the file.
from ipi.inputs.simulation import InputSimulation
simchk = InputSimulation()
simchk.parse(xmlchk.fields[0][1])
mycell = simchk.cell.fetch()
mybeads = simchk.beads.fetch()
self.cell.h[:] = mycell.h
self.beads.q[:] = mybeads.q
softexit.trigger(" # Read single checkpoint")
except EOFError:
softexit.trigger(" # Finished reading re-run trajectory")
self.qtime += time.time()

View File

@ -0,0 +1,781 @@
"""Contains the classes that connect the driver to the python code.
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/>.
Communicates with the driver code, obtaining the force, virial and potential.
Deals with creating the jobs that will be sent to the driver, and
returning the results to the python code.
Classes:
ForceField: Base forcefield class with the generic methods and attributes.
FFSocket: Deals with a single replica of the system
ForceBeads: Deals with the parallelization of the force calculation over
different beads.
Forces: Deals with the parallelizatoin of the force calculation over
different forcefields.
"""
__all__ = ['ForceField', 'ForceBeads', 'Forces', 'FFSocket']
import numpy as np
import time
from ipi.utils.softexit import softexit
from ipi.utils.messages import verbosity, warning
from ipi.utils.depend import *
from ipi.utils.nmtransform import nm_rescale
from ipi.interfaces.sockets import InterfaceSocket
from ipi.engine.beads import Beads
class ForceField(dobject):
"""Base forcefield class.
Gives the standard methods and quantities needed in all the forcefield
classes.
Attributes:
atoms: An Atoms object containing all the atom positions.
cell: A Cell object containing the system box.
Depend objects:
ufvx: A list of the form [pot, f, vir]. These quantities are calculated
all at one time by the driver, so are collected together. Each separate
object is then taken from the list. Depends on the atom positions and
the system box.
extra: A string containing some formatted output returned by the client. Depends on ufvx.
pot: A float giving the potential energy of the system. Depends on ufvx.
f: An array containing all the components of the force. Depends on ufvx.
fx: A slice of f containing only the x components of the forces.
fy: A slice of f containing only the y components of the forces.
fz: A slice of f containing only the z components of the forces.
vir: An array containing the components of the virial tensor in upper
triangular form, not divided by the volume. Depends on ufvx.
"""
def __init__(self):
"""Initialises ForceField."""
# ufvx is a list [ u, f, vir, extra ] which stores the results of the force
#calculation
dset(self,"ufvx", depend_value(name="ufvx", func=self.get_all))
def copy(self):
"""Creates a deep copy without the bound objects.
Used in ForceBeads to create a ForceField for each replica of the system.
Returns:
A ForceField object without atoms or cell attributes.
"""
return type(self)(self.nbeads, self.weight)
def bind(self, atoms, cell):
"""Binds atoms and cell to the forcefield.
This takes an atoms object and a cell object and makes them members of
the forcefield. It also then creates the objects that will hold the data
that the driver returns and the dependency network.
Args:
atoms: The Atoms object from which the atom positions are taken.
cell: The Cell object from which the system box is taken.
"""
# stores a reference to the atoms and cell we are computing forces for
self.atoms = atoms
self.cell = cell
# ufv depends on the atomic positions and on the cell
dget(self,"ufvx").add_dependency(dget(self.atoms,"q"))
dget(self,"ufvx").add_dependency(dget(self.cell,"h"))
# potential and virial are to be extracted very simply from ufv
dset(self,"pot",
depend_value(name="pot", func=self.get_pot,
dependencies=[dget(self,"ufvx")]))
dset(self,"vir",
depend_array(name="vir", value=np.zeros((3,3),float),func=self.get_vir,
dependencies=[dget(self,"ufvx")]))
# NB: the force requires a bit more work, to define shortcuts to xyz
# slices without calculating the force at this point.
fbase = np.zeros(atoms.natoms*3, float)
dset(self,"f",
depend_array(name="f", value=fbase, func=self.get_f,
dependencies=[dget(self,"ufvx")]))
dset(self,"extra",
depend_value(name="extra", func=self.get_extra,
dependencies=[dget(self,"ufvx")]))
dset(self,"fx", depend_array(name="fx", value=fbase[0:3*atoms.natoms:3]))
dset(self,"fy", depend_array(name="fy", value=fbase[1:3*atoms.natoms:3]))
dset(self,"fz", depend_array(name="fz", value=fbase[2:3*atoms.natoms:3]))
depcopy(self,"f", self,"fx")
depcopy(self,"f", self,"fy")
depcopy(self,"f", self,"fz")
def queue(self):
"""Dummy queueing method."""
pass
def stop(self):
"""Dummy queueing method."""
pass
def run(self):
"""Dummy queueing method."""
pass
def get_all(self):
"""Dummy driver routine.
Returns:
A list of the form [potential, force, virial] where the potential
and all components of the force and virial have been set to zero.
"""
return [0.0, np.zeros(3*self.atoms.natoms), np.zeros((3,3),float), ""]
def get_pot(self):
"""Calls get_all routine of forcefield to update potential.
Returns:
Potential energy.
"""
return self.ufvx[0]
def get_f(self):
"""Calls get_all routine of forcefield to update force.
Returns:
An array containing all the components of the force.
"""
return depstrip(self.ufvx[1])
def get_vir(self):
"""Calls get_all routine of forcefield to update virial.
Returns:
An array containing the virial in upper triangular form, not divided
by the volume.
"""
vir = depstrip(self.ufvx[2])
vir[1,0] = 0.0
vir[2,0:2] = 0.0
return vir
def get_extra(self):
"""Calls get_all routine of forcefield to update potential.
Returns:
A string containing all formatted additional output that the
client might have produced.
"""
return self.ufvx[3]
class FFSocket(ForceField):
"""Interface between the PIMD code and the socket for a single replica.
Deals with an individual replica of the system, obtaining the potential
force and virial appropriate to this system. Deals with the distribution of
jobs to the interface.
Attributes:
parameters: A dictionary of the parameters used by the driver. Of the
form {'name': value}.
socket: The interface object which contains the socket through which
communication between the forcefield and the driver is done.
request: During the force calculation step this holds a dictionary
containing the relevant data for determining the progress of the step.
Of the form {'atoms': atoms, 'cell': cell, 'pars': parameters,
'status': status, 'result': result, 'id': bead id,
'start': starting time}.
"""
def __init__(self, pars=None, interface=None):
"""Initialises FFSocket.
Args:
pars: Optional dictionary, giving the parameters needed by the driver.
interface: Optional Interface object, which contains the socket.
"""
# a socket to the communication library is created or linked
super(FFSocket,self).__init__()
if interface is None:
self.socket = InterfaceSocket()
else:
self.socket = interface
if pars is None:
self.pars = {}
else:
self.pars = pars
self.request = None
def bind(self, atoms, cell):
"""Pass on the binding request from ForceBeads.
Also makes sure to set the socket's softexit.
Args:
atoms: Atoms object from which the bead positions are taken.
cell: Cell object from which the system box is taken.
"""
super(FFSocket,self).bind(atoms, cell)
def copy(self):
"""Creates a deep copy without the bound objects.
Used in ForceBeads to create a FFSocket for each replica of the system.
Returns:
A FFSocket object without atoms or cell attributes.
"""
# does not copy the bound objects
# (i.e., the returned forcefield must be bound before use)
return type(self)(self.pars, self.socket)
def get_all(self):
"""Driver routine.
When one of the force, potential or virial are called, this sends the
atoms and cell to the driver through the interface, requesting that the
driver does the calculation. This then waits until the driver is finished,
and then returns the ufvx list.
Returns:
A list of the form [potential, force, virial, extra].
"""
# this is converting the distribution library requests into [ u, f, v ] lists
if self.request is None:
self.request = self.socket.queue(self.atoms, self.cell, pars=self.pars, reqid=-1)
while self.request["status"] != "Done":
if self.request["status"] == "Exit":
break
time.sleep(self.socket.latency)
if self.request["status"] == "Exit":
softexit.trigger(" @Force: Requested returned a Exit status")
# data has been collected, so the request can be released and a slot
#freed up for new calculations
self.socket.release(self.request)
result = self.request["result"]
self.request = None
return result
def queue(self, reqid=-1):
"""Sends the job to the interface queue directly.
Allows the ForceBeads object to ask for the ufvx list of each replica
directly without going through the get_all function. This allows
all the jobs to be sent at once, allowing them to be parallelized.
Args:
reqid: An optional integer that indentifies requests of the same type,
e.g. the bead index.
"""
if self.request is None and dget(self,"ufvx").tainted():
self.request = self.socket.queue(self.atoms, self.cell, pars=self.pars, reqid=reqid)
def run(self):
"""Makes the socket start looking for driver codes.
Tells the interface code to start the thread that looks for
connection from the driver codes in a loop. Until this point no
jobs can be queued.
"""
if not self.socket.started():
self.socket.start_thread()
def stop(self):
"""Makes the socket stop looking for driver codes.
Tells the interface code to stop the thread that looks for
connection from the driver codes in a loop. After this point no
jobs can be queued.
"""
if self.socket.started():
self.socket.end_thread()
class ForceBeads(dobject):
"""Class that gathers the forces for each replica together.
Deals with splitting the bead representation into
separate replicas, and collecting the data from each replica.
Attributes:
natoms: An integer giving the number of atoms.
nbeads: An integer giving the number of beads.
f_model: A model used to create the forcefield objects for each replica
of the system.
_forces: A list of the forcefield objects for all the replicas.
weight: A float that will be used to weight the contribution of this
forcefield to the total force.
Depend objects:
f: An array containing the components of the force. Depends on each
replica's ufvx list.
pots: A list containing the potential energy for each system replica.
Depends on each replica's ufvx list.
virs: A list containing the virial tensor for each system replica.
Depends on each replica's ufvx list.
pot: The sum of the potential energy of the replicas.
vir: The sum of the virial tensor of the replicas.
extras: Strings containing some formatted output returned by the client.
Depends on each replica's ufvx list.
"""
def __init__(self, model, nbeads=0, weight=1.0):
"""Initializes ForceBeads
Args:
model: A model to be used to create the forcefield objects for all
the replicas of the system.
nbeads: The number of replicas.
weight: A relative weight to be given to the values obtained with this
forcefield. When the contribution of all the forcefields is
combined to give a total force, the contribution of this forcefield
will be weighted by this factor.
"""
self.f_model = model
self.nbeads = nbeads
self.weight = weight
def copy(self):
"""Creates a deep copy without the bound objects.
Used so that we can create multiple Forces objects from the same
Forcebeads model, without binding a particular ForceBeads object twice.
Returns:
A ForceBeads object without beads or cell attributes.
"""
# does not copy the bound objects (i.e., the returned forcefield must be bound before use)
return type(self)(self.f_model, self.nbeads, self.weight)
def bind(self, beads, cell):
"""Binds beads, cell and force to the forcefield.
Takes the beads, cell objects and makes them members of the forcefield.
Also takes the force object and copies it once for each replica of the
system, then binds each replica to one of the copies so that the force
calculation can be parallelized. Creates the objects that will
hold the data that the driver returns and the dependency network.
Args:
beads: Beads object from which the bead positions are taken.
cell: Cell object from which the system box is taken.
"""
# stores a copy of the number of atoms and of beads
#!TODO! make them read-only properties
self.natoms = beads.natoms
if (self.nbeads != beads.nbeads):
raise ValueError("Binding together a Beads and a ForceBeads objects with different numbers of beads")
# creates an array of force objects, which are bound to the beads
#and the cell
self._forces = [];
for b in range(self.nbeads):
new_force = self.f_model.copy()
new_force.bind(beads[b], cell)
self._forces.append(new_force)
# f is a big array which assembles the forces on individual beads
dset(self,"f",
depend_array(name="f",value=np.zeros((self.nbeads,3*self.natoms)),
func=self.f_gather,
dependencies=[dget(self._forces[b],"f") for b in range(self.nbeads)]))
# collection of pots and virs from individual beads
dset(self,"pots",
depend_array(name="pots", value=np.zeros(self.nbeads,float),
func=self.pot_gather,
dependencies=[dget(self._forces[b],"pot") for b in range(self.nbeads)]))
dset(self,"virs",
depend_array(name="virs", value=np.zeros((self.nbeads,3,3),float),
func=self.vir_gather,
dependencies=[dget(self._forces[b],"vir") for b in range(self.nbeads)]))
dset(self,"extras",
depend_value(name="extras", value=np.zeros(self.nbeads,float),
func=self.extra_gather,
dependencies=[dget(self._forces[b],"extra") for b in range(self.nbeads)]))
# total potential and total virial
dset(self,"pot",
depend_value(name="pot", func=(lambda: self.pots.sum()),
dependencies=[dget(self,"pots")]))
dset(self,"vir",
depend_array(name="vir", func=self.get_vir, value=np.zeros((3,3)),
dependencies=[dget(self,"virs")]))
def run(self):
"""Makes the socket start looking for driver codes.
Tells the interface code to start the thread that looks for
connection from the driver codes in a loop. Until this point no
jobs can be queued.
"""
for b in range(self.nbeads):
self._forces[b].run()
def stop(self):
"""Makes the socket stop looking for driver codes.
Tells the interface code to stop the thread that looks for
connection from the driver codes in a loop. After this point no
jobs can be queued.
"""
for b in range(self.nbeads):
self._forces[b].stop()
def queue(self):
"""Submits all the required force calculations to the interface."""
# this should be called in functions which access u,v,f for ALL the beads,
# before accessing them. it is basically pre-queueing so that the
# distributed-computing magic can work
for b in range(self.nbeads):
self._forces[b].queue(reqid=b)
def pot_gather(self):
"""Obtains the potential energy for each replica.
Returns:
A list of the potential energy of each replica of the system.
"""
self.queue()
return np.array([b.pot for b in self._forces], float)
def extra_gather(self):
"""Obtains the potential energy for each replica.
Returns:
A list of the potential energy of each replica of the system.
"""
self.queue()
return [b.extra for b in self._forces]
def vir_gather(self):
"""Obtains the virial for each replica.
Returns:
A list of the virial of each replica of the system.
"""
self.queue()
return np.array([b.vir for b in self._forces], float)
def f_gather(self):
"""Obtains the force vector for each replica.
Returns:
An array with all the components of the force. Row i gives the force
array for replica i of the system.
"""
newf = np.zeros((self.nbeads,3*self.natoms),float)
self.queue()
for b in range(self.nbeads):
newf[b] = depstrip(self._forces[b].f)
return newf
#serial
# for b in range(self.nbeads): newf[b]=self._forces[b].f
# threaded
# bthreads=[]
# print "starting threads"
# for b in range(self.nbeads):
# thread=threading.Thread(target=self._getbead, args=(b,newf,))
# thread.start()
# bthreads.append(thread)
# print "waiting threads"
# for b in range(self.nbeads): bthreads[b].join()
# print "threads joined in"
def get_vir(self):
"""Sums the virial of each replica.
Not the actual system virial, as it has not been divided by either the
number of beads or the cell volume.
Returns:
Virial sum.
"""
vir = np.zeros((3,3))
for v in depstrip(self.virs):
vir += v
return vir
def __len__(self):
"""Length function.
This is called whenever the standard function len(forcebeads) is used.
Returns:
The number of beads.
"""
return self.nbeads
def __getitem__(self,index):
"""Overwrites standard getting function.
This is called whenever the standard function forcebeads[index] is used.
Returns the force on bead index.
Args:
index: The index of the replica of the system to be accessed.
Returns:
The forces acting on the replica of the system given by the index.
"""
return self._forces[index]
class Forces(dobject):
"""Class that gathers all the forces together.
Collects many forcefield instances and parallelizes getting the forces
in a PIMD environment.
Attributes:
natoms: An integer giving the number of atoms.
nbeads: An integer giving the number of beads.
nforces: An integer giving the number of ForceBeads objects.
mforces: A list of all the forcefield objects.
mbeads: A list of all the beads objects. Some of these may be contracted
ring polymers, with a smaller number of beads than of the simulation.
mweights: A list of the weights of all the forcefields.
mrpc: A list of the objects containing the functions required to
contract the ring polymers of the different forcefields.
Depend objects:
f: An array containing the components of the force. Depends on each
replica's ufvx list.
pots: A list containing the potential energy for each system replica.
Depends on each replica's ufvx list.
virs: A list containing the virial tensor for each system replica.
Depends on each replica's ufvx list.
extras: A list containing the "extra" strings for each replica.
pot: The sum of the potential energy of the replicas.
vir: The sum of the virial tensor of the replicas.
"""
def bind(self, beads, cell, flist):
self.natoms = beads.natoms
self.nbeads = beads.nbeads
self.nforces = len(flist)
# flist should be a list of tuples containing ( "name", forcebeads)
self.mforces = []
self.mbeads = []
self.mweights = []
self.mrpc = []
# a "function factory" to generate functions to automatically update
#contracted paths
def make_rpc(rpc, beads):
return lambda: rpc.b1tob2(depstrip(beads.q))
# creates new force objects, possibly acting on contracted path
#representations
for (ftype, fbeads) in flist:
# creates an automatically-updated contracted beads object
newb = fbeads.nbeads
newforce = fbeads.copy()
newweight = fbeads.weight
# if the number of beads for this force component is unspecified,
#assume full force evaluation
if newb == 0:
newb = beads.nbeads
newforce.nbeads = newb
newbeads = Beads(beads.natoms, newb)
newrpc = nm_rescale(beads.nbeads, newb)
dget(newbeads,"q")._func = make_rpc(newrpc, beads)
for b in newbeads:
# must update also indirect access to the beads coordinates
dget(b,"q")._func = dget(newbeads,"q")._func
# makes newbeads.q depend from beads.q
dget(beads,"q").add_dependant(dget(newbeads,"q"))
#now we create a new forcebeads which is bound to newbeads!
newforce.bind(newbeads, cell)
#adds information we will later need to the appropriate lists.
self.mweights.append(newweight)
self.mbeads.append(newbeads)
self.mforces.append(newforce)
self.mrpc.append(newrpc)
#now must expose an interface that gives overall forces
dset(self,"f",
depend_array(name="f",value=np.zeros((self.nbeads,3*self.natoms)),
func=self.f_combine,
dependencies=[dget(ff, "f") for ff in self.mforces] ) )
# collection of pots and virs from individual ff objects
dset(self,"pots",
depend_array(name="pots", value=np.zeros(self.nbeads,float),
func=self.pot_combine,
dependencies=[dget(ff, "pots") for ff in self.mforces]) )
# must take care of the virials!
dset(self,"virs",
depend_array(name="virs", value=np.zeros((self.nbeads,3,3),float),
func=self.vir_combine,
dependencies=[dget(ff, "virs") for ff in self.mforces]) )
dset(self,"extras",
depend_value(name="extras", value=np.zeros(self.nbeads,float),
func=self.extra_combine,
dependencies=[dget(ff, "extras") for ff in self.mforces]))
# total potential and total virial
dset(self,"pot",
depend_value(name="pot", func=(lambda: self.pots.sum()),
dependencies=[dget(self,"pots")]))
dset(self,"vir",
depend_array(name="vir", func=self.get_vir, value=np.zeros((3,3)),
dependencies=[dget(self,"virs")]))
def run(self):
"""Makes the socket start looking for driver codes.
Tells the interface code to start the thread that looks for
connection from the driver codes in a loop. Until this point no
jobs can be queued.
"""
for ff in self.mforces:
ff.run()
def stop(self):
"""Makes the socket stop looking for driver codes.
Tells the interface code to stop the thread that looks for
connection from the driver codes in a loop. After this point no
jobs can be queued.
"""
for ff in self.mforces:
ff.stop()
def queue(self):
"""Submits all the required force calculations to the forcefields."""
for ff in self.mforces:
ff.queue()
def get_vir(self):
"""Sums the virial of each forcefield.
Not the actual system virial.
Returns:
Virial sum.
"""
vir = np.zeros((3,3))
for v in depstrip(self.virs):
vir += v
return vir
def f_combine(self):
"""Obtains the total force vector."""
self.queue()
rf = np.zeros((self.nbeads,3*self.natoms),float)
for k in range(self.nforces):
# "expand" to the total number of beads the forces from the
#contracted one
rf += self.mweights[k]*self.mrpc[k].b2tob1(depstrip(self.mforces[k].f))
return rf
def pot_combine(self):
"""Obtains the potential energy for each forcefield."""
self.queue()
rp = np.zeros(self.nbeads,float)
for k in range(self.nforces):
# "expand" to the total number of beads the potentials from the
#contracted one
rp += self.mweights[k]*self.mrpc[k].b2tob1(self.mforces[k].pots)
return rp
def extra_combine(self):
"""Obtains the potential energy for each forcefield."""
self.queue()
rp = [ "" for b in range(self.nbeads) ]
for k in range(self.nforces):
# "expand" to the total number of beads the potentials from the
#contracted one
for b in range(self.nbeads):
rp[b] += self.mforces[k].extras[b]
return rp
def vir_combine(self):
"""Obtains the virial tensor for each forcefield."""
self.queue()
rp = np.zeros((self.nbeads,3,3),float)
for k in range(self.nforces):
virs = depstrip(self.mforces[k].virs)
# "expand" to the total number of beads the virials from the
#contracted one, element by element
for i in range(3):
for j in range(3):
rp[:,i,j] += self.mweights[k]*self.mrpc[k].b2tob1(virs[:,i,j])
return rp

View File

@ -0,0 +1,549 @@
"""Contains the classes that are used to initialize data in the simulation.
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/>.
These classes can either be used to restart a simulation with some different
data or used to start a calculation. Any data given in these classes will
overwrite data given elsewhere.
Classes:
Initializer: Holds the functions that are required to initialize objects in
the code. Data can be initialized from a file, or according to a
particular parameter. An example of the former would be initializing
the configurations from a xyz file, an example of the latter would be
initializing the velocities according to the physical temperature.
InitBase: Simple class that reads data from a string or file.
InitIndexed: The same as init base, but can also optionally hold
information about which atom or bead to initialize from.
Functions:
init_xyz: Reads beads data from a xyz file.
init_pdb: Reads beads and cell data from a pdb file.
init_chk: Reads beads, cell and thermostat data from a checkpoint file.
init_beads: Initializes a beads object from an Initializer object.
init_vector: Initializes a vector from an Initializer object.
set_vector: Initializes a vector from another vector.
"""
import numpy as np
from ipi.engine.beads import Beads
from ipi.engine.cell import Cell
from ipi.engine.normalmodes import NormalModes
from ipi.engine.ensembles import Ensemble
from ipi.utils.io.io_xyz import read_xyz
from ipi.utils.io.io_pdb import read_pdb
from ipi.utils.io.io_xml import xml_parse_file
from ipi.utils.depend import dobject
from ipi.utils.units import Constants, unit_to_internal
from ipi.utils.nmtransform import nm_rescale
from ipi.utils.messages import verbosity, warning, info
__all__ = ['Initializer', 'InitBase', 'InitIndexed']
class InitBase(dobject):
"""Base class for initializer objects.
Attributes:
value: A duck-typed stored value.
mode: A string that determines how the value is to be interpreted.
units: A string giving which unit the value is in.
"""
def __init__(self, value="", mode="", units="", **others):
"""Initializes InitFile.
Args:
value: A string which specifies what value to initialize the
simulation property to.
mode: A string specifiying what style of initialization should be
used to read the data.
units: A string giving which unit the value is in.
"""
self.value = value
self.mode = mode
self.units = units
for (o, v) in others.items():
self.__dict__[o] = v
class InitIndexed(InitBase):
"""Class to initialize objects which can be set for a particular bead.
Attributes:
index: Which atom to initialize the value of.
bead: Which bead to initialize the value of.
"""
def __init__(self, value="", mode="", units="", index=-1, bead=-1):
"""Initializes InitFile.
Args:
value: A string which specifies what value to initialize the
simulation property to.
mode: A string specifiying what style of initialization should be
used to read the data.
units: A string giving which unit the value is in.
index: Which atom to initialize the value of.
bead: Which bead to initialize the value of.
"""
super(InitIndexed,self).__init__(value=value, mode=mode, units=units, index=index, bead=bead)
def init_xyz(filename):
"""Reads an xyz file and returns the data contained in it.
Args:
filename: A string giving the name of the xyz file to be read from.
Returns:
A list of Atoms objects as read from each frame of the xyz file.
"""
rfile = open(filename,"r")
ratoms = []
while True:
#while loop, so that more than one configuration can be given
#so multiple beads can be initialized at once.
try:
myatoms = read_xyz(rfile)
except EOFError:
break
ratoms.append(myatoms)
return ratoms
def init_pdb(filename):
"""Reads an pdb file and returns the data contained in it.
Args:
filename: A string giving the name of the pdb file to be read from.
Returns:
A list of Atoms objects as read from each frame of the pdb file, and
a Cell object as read from the final pdb frame.
"""
rfile = open(filename,"r")
ratoms = []
while True:
#while loop, so that more than one configuration can be given
#so multiple beads can be initialized at once.
try:
myatoms, rcell = read_pdb(rfile)
except EOFError:
break
ratoms.append(myatoms)
return ( ratoms, rcell ) # if multiple frames, the last cell is returned
def init_chk(filename):
"""Reads an checkpoint file and returns the data contained in it.
Args:
filename: A string giving the name of the checkpoint file to be read from.
Returns:
A Beads object, Cell object and Thermostat object as read from the
checkpoint file.
"""
# reads configuration from a checkpoint file
rfile = open(filename,"r")
xmlchk = xml_parse_file(rfile) # Parses the file.
from ipi.inputs.simulation import InputSimulation
simchk = InputSimulation()
simchk.parse(xmlchk.fields[0][1])
rcell = simchk.cell.fetch()
rbeads = simchk.beads.fetch()
rthermo = simchk.ensemble.thermostat.fetch()
return (rbeads, rcell, rthermo)
def init_beads(iif, nbeads):
"""A file to initialize a beads object from an appropriate initializer
object.
Args:
iif: An Initializer object which has information on the bead positions.
nbeads: The number of beads.
Raises:
ValueError: If called using an Initializer object with a 'manual' mode.
"""
mode = iif.mode; value = iif.value
if mode == "xyz" or mode == "pdb":
if mode == "xyz": ratoms = init_xyz(value)
if mode == "pdb": ratoms = init_pdb(value)[0]
rbeads = Beads(ratoms[0].natoms,len(ratoms))
for i in range(len(ratoms)): rbeads[i] = ratoms[i]
elif mode == "chk":
rbeads = init_chk(value)[0]
elif mode == "manual":
raise ValueError("Cannot initialize manually a whole beads object.")
return rbeads
def init_vector(iif, nbeads, momenta=False):
"""A file to initialize a vector from an appropriate initializer
object.
Args:
iif: An Initializer object specifying the value of a vector.
nbeads: The number of beads.
momenta: If bead momenta rather than positions are being initialized
from a checkpoint file, this is set to True.
"""
mode = iif.mode; value = iif.value
if mode == "xyz" or mode == "pdb":
rq = init_beads(iif, nbeads).q
elif mode == "chk":
if momenta: rq = init_beads(iif, nbeads).p
else: rq = init_beads(iif, nbeads).q
elif mode == "manual":
rq = value
# determines the size of the input data
if mode == "manual":
if iif.bead >= 0: # if there is a bead specifier then we return a single bead slice
nbeads = 1
natoms = len(rq)/nbeads/3
rq.shape = (nbeads,3*natoms)
return rq
def set_vector(iif, dq, rq):
"""A file to initialize a vector from an another vector.
If the first dimension is different, i.e. the two vectors correspond
to a different number of beads, then the ring polymer contraction/expansion
is used to rescale the original vector to the one used in the simulation,
as described in the paper T. E. Markland and D. E. Manolopoulos, J. Chem.
Phys. 129, 024105, (2008).
Args:
iif: An Initializer object specifying the value of a vector.
dq: The vector to be initialized.
rq: The vector to initialize from.
"""
(nbeads, natoms) = rq.shape; natoms /= 3
(dbeads, datoms) = dq.shape; datoms /= 3
# Check that indices make sense
if iif.index < 0 and natoms != datoms:
raise ValueError("Initialization tries to mix up structures with different atom numbers.")
if iif.index >= datoms:
raise ValueError("Cannot initialize single atom as atom index %d is larger than the number of atoms" % iif.index)
if iif.bead >= dbeads:
raise ValueError("Cannot initialize single bead as bead index %d is larger than the number of beads" % iif.bead)
if iif.bead < 0: # we are initializing the path
res = nm_rescale(nbeads,dbeads) # path rescaler
if nbeads != dbeads:
info(" # Initialize is rescaling from %5d beads to %5d beads" % (nbeads, dbeads), verbosity.low)
if iif.index < 0:
dq[:] = res.b1tob2(rq)
else: # we are initializing a specific atom
dq[:,3*iif.index:3*(iif.index+1)] = res.b1tob2(rq)
else: # we are initializing a specific bead
if iif.index < 0:
dq[iif.bead] = rq
else:
dq[iif.bead,3*iif.index:3*(iif.index+1)] = rq
class Initializer(dobject):
"""Class that deals with the initialization of data.
This can either be used to initialize the atom positions and the cell data
from a file, or to initialize them from a beads, atoms or cell object.
Currently, we use a ring polymer contraction scheme to create a new beads
object from one given in initialize if they have different numbers of beads,
as described in the paper T. E. Markland and D. E. Manolopoulos, J. Chem.
Phys. 129, 024105, (2008). If the new beads object has more beads than
the beads object it was initialized from, we set the higher ring polymer
normal modes to zero.
Attributes:
queue: A list of things to initialize. Each member of the list is a tuple
of the form ('type', 'object'), where 'type' specifies what kind of
initialization is being done, and 'object' gives the data to
initialize it from.
"""
def __init__(self, nbeads=0, queue=None):
"""Initializes Initializer.
Arguments:
nbeads: The number of beads that we need in the simulation. Not
necessarily the same as the number of beads of the objects we are
initializing the data from.
queue: A list of things to initialize. Each member of the list is a
tuple of the form ('type', 'object'), where 'type' specifies what
kind of initialization is being done, and 'object' gives the data to
initialize it from.
"""
self.nbeads = nbeads
if queue is None:
self.queue = []
else:
self.queue = queue
def init_stage1(self, simul):
"""Initializes the simulation -- first stage.
Takes a simulation object, and uses all the data in the initialization
queue to fill up the beads and cell data needed to run the simulation.
Args:
simul: A simulation object to be initialized.
Raises:
ValueError: Raised if there is a problem with the initialization,
if something that should have been has not been, or if the objects
that have been specified are not compatible with each other.
"""
if simul.beads.nbeads == 0:
fpos = fmom = fmass = flab = fcell = False # we don't have an explicitly defined beads object yet
else:
fpos = fmom = fmass = flab = fcell = True
for (k,v) in self.queue:
info(" # Initializer (stage 1) parsing " + str(k) + " object.", verbosity.high)
if k == "cell":
if fcell :
warning("Overwriting previous cell parameters", verbosity.medium)
if v.mode == "pdb":
rh = init_pdb(v.value)[1].h
elif v.mode == "chk":
rh = init_chk(v.value)[1].h
else:
rh = v.value.reshape((3,3))
rh *= unit_to_internal("length",v.units,1.0)
simul.cell.h = rh
if simul.cell.V == 0.0:
ValueError("Cell provided has zero volume")
fcell = True
elif k == "masses":
if simul.beads.nbeads == 0:
raise ValueError("Cannot initialize the masses before the size of the system is known")
if fmass:
warning("Overwriting previous atomic masses", verbosity.medium)
if v.mode == "manual":
rm = v.value
else:
rm = init_beads(v, self.nbeads).m
rm *= unit_to_internal("mass",v.units,1.0)
if v.bead < 0: # we are initializing the path
if (fmom and fmass):
warning("Rescaling momenta to make up for changed mass", verbosity.medium)
simul.beads.p /= simul.beads.sm3 # go to mass-scaled momenta, that are mass-invariant
if v.index < 0:
simul.beads.m = rm
else: # we are initializing a specific atom
simul.beads.m[v.index:v.index+1] = rm
if (fmom and fmass): # finishes correcting the momenta
simul.beads.p *= simul.beads.sm3 # back to normal momenta
else:
raise ValueError("Cannot change the mass of a single bead")
fmass = True
elif k == "labels":
if simul.beads.nbeads == 0:
raise ValueError("Cannot initialize the labels before the size of the system is known")
if flab:
warning("Overwriting previous atomic labels", verbosity.medium)
if v.mode == "manual":
rn = v.value
else:
rn = init_beads(v, self.nbeads).names
if v.bead < 0: # we are initializing the path
if v.index < 0:
simul.beads.names = rn
else: # we are initializing a specific atom
simul.beads.names[v.index:v.index+1] = rn
else:
raise ValueError("Cannot change the label of a single bead")
flab = True
elif k == "positions":
if fpos:
warning("Overwriting previous atomic positions", verbosity.medium)
# read the atomic positions as a vector
rq = init_vector(v, self.nbeads)
rq *= unit_to_internal("length",v.units,1.0)
(nbeads, natoms) = rq.shape; natoms /= 3
# check if we must initialize the simulation beads
if simul.beads.nbeads == 0:
if v.index >= 0:
raise ValueError("Cannot initialize single atoms before the size of the system is known")
simul.beads.resize(natoms,self.nbeads)
set_vector(v, simul.beads.q, rq)
fpos = True
elif (k == "velocities" or k == "momenta") and v.mode == "thermal" : # intercept here thermal initialization, so we don't need to check further down
if fmom:
warning("Overwriting previous atomic momenta", verbosity.medium)
if simul.beads.natoms == 0:
raise ValueError("Cannot initialize momenta before the size of the system is known.")
if not fmass:
raise ValueError("Trying to resample velocities before having masses.")
rtemp = v.value * unit_to_internal("temperature",v.units,1.0)
if rtemp <= 0:
warning("Using the simulation temperature to resample velocities", verbosity.low)
rtemp = simul.ensemble.temp
else:
info(" # Resampling velocities at temperature %s %s" % (v.value, v.units), verbosity.low)
# pull together a mock initialization to get NM masses right
#without too much code duplication
if v.bead >= 0:
raise ValueError("Cannot thermalize a single bead")
if v.index >= 0:
rnatoms = 1
else:
rnatoms = simul.beads.natoms
rbeads = Beads(rnatoms, simul.beads.nbeads)
if v.index < 0:
rbeads.m[:] = simul.beads.m
else:
rbeads.m[:] = simul.beads.m[v.index]
rnm = NormalModes(mode=simul.nm.mode, transform_method=simul.nm.transform_method, freqs=simul.nm.nm_freqs)
rens = Ensemble(dt=simul.ensemble.dt, temp=simul.ensemble.temp)
rnm.bind(rbeads,rens)
# then we exploit the sync magic to do a complicated initialization
# in the NM representation
# with (possibly) shifted-frequencies NM
rnm.pnm = simul.prng.gvec((rbeads.nbeads,3*rbeads.natoms))*np.sqrt(rnm.dynm3)*np.sqrt(rbeads.nbeads*rtemp*Constants.kb)
if v.index < 0:
simul.beads.p = rbeads.p
else:
simul.beads.p[:,3*v.index:3*(v.index+1)] = rbeads.p
fmom = True
elif k == "momenta":
if fmom:
warning("Overwriting previous atomic momenta", verbosity.medium)
# read the atomic momenta as a vector
rp = init_vector(v, self.nbeads, momenta = True)
rp *= unit_to_internal("momentum",v.units,1.0)
(nbeads, natoms) = rp.shape; natoms /= 3
# checks if we must initialize the simulation beads
if simul.beads.nbeads == 0:
if v.index >= 0 :
raise ValueError("Cannot initialize single atoms before the size of the system is known")
simul.beads.resize(natoms,self.nbeads)
rp *= np.sqrt(self.nbeads/nbeads)
set_vector(v, simul.beads.p, rp)
fmom = True
elif k == "velocities":
if fmom:
warning("Overwriting previous atomic momenta", verbosity.medium)
# read the atomic velocities as a vector
rv = init_vector(v, self.nbeads)
rv *= unit_to_internal("velocity",v.units,1.0)
(nbeads, natoms) = rv.shape; natoms /= 3
# checks if we must initialize the simulation beads
if simul.beads.nbeads == 0 or not fmass:
ValueError("Cannot initialize velocities before the masses of the atoms are known")
simul.beads.resize(natoms,self.nbeads)
warning("Initializing from velocities uses the previously defined masses -- not the masses inferred from the file -- to build momenta", verbosity.low)
if v.index >= 0:
rv *= simul.beads.m[v.index]
elif v.bead >= 0:
rv *= simul.beads.m3[0]
else:
rv *= simul.beads.m3
rv *= np.sqrt(self.nbeads/nbeads)
set_vector(v, simul.beads.p, rv)
fmom = True
elif k == "thermostat": pass # thermostats must be initialised in a second stage
if simul.beads.natoms == 0:
raise ValueError("Initializer could not initialize the atomic positions")
if simul.cell.V == 0:
raise ValueError("Initializer could not initialize the cell")
for i in range(simul.beads.natoms):
if simul.beads.m[i] <= 0:
raise ValueError("Initializer could not initialize the masses")
if simul.beads.names[i] == "":
raise ValueError("Initializer could not initialize the atom labels")
if not fmom:
warning("Momenta not specified in initialize. Will start with zero velocity if they are not specified in beads.", verbosity.low)
def init_stage2(self, simul):
"""Initializes the simulation -- second stage.
Takes a simulation object which has been fully generated,
and restarts additional information such as the thermostat internal state.
Args:
simul: A simulation object to be initialized.
Raises:
ValueError: Raised if there is a problem with the initialization,
if something that should have been has not been, or if the objects
that have been specified are not compatible with each other.
"""
for (k,v) in self.queue:
info(" # Initializer (stage 2) parsing " + str(k) + " object.", verbosity.high)
if k == "gle":
# read thermostat parameters from file
if not ( hasattr(simul.ensemble, "thermostat") ):
raise ValueError("Ensemble does not have a thermostat to initialize")
if not ( hasattr(simul.ensemble.thermostat, "s") ):
raise ValueError("There is nothing to initialize in non-GLE thermostats")
ssimul = simul.ensemble.thermostat.s
if v.mode == "manual":
sinput = v.value.copy()
if (sinput.size() != ssimul.size() ):
raise ValueError("Size mismatch in thermostat initialization data")
sinput.shape = ssimul.shape
elif v.mode == "chk":
rthermo = init_chk(v.value)[2]
if not hasattr(rthermo,"s"):
raise ValueError("Checkpoint file does not contain usable thermostat data")
sinput = rthermo.s.copy()
if sinput.shape != ssimul.shape :
raise ValueError("Shape mismatch in thermostat initialization data")
# if all the preliminary checks are good, we can initialize the s's
ssimul[:] = sinput

View File

@ -0,0 +1,400 @@
"""Contains the classes that deal with the normal mode representation.
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/>.
Deals with the normal mode transformation, including the complications
introduced by PA-CMD when the bead masses are rescaled. Also deals with
the change in the dynamics introduced by this mass-scaling, and has its
own functions to calculate the kinetic energy, and the exact propagator
in the normal mode representation under the ring polymer Hamiltonian.
Classes:
NormalModes: Deals with the normal mode transformation in RPMD and PA-CMD.
"""
import numpy as np
from ipi.utils.depend import *
from ipi.utils import units
from ipi.utils import nmtransform
from ipi.utils.messages import verbosity, warning, info
__all__ = [ "NormalModes" ]
class NormalModes(dobject):
""" A helper class to manipulate the path NM.
Normal-modes transformation, determination of path frequencies,
dynamical mass matrix change, etc.
Attributes:
natoms: The number of atoms.
nbeads: The number of beads.
beads: The beads object for which the normal mode transformation should
be done.
ensemble: The ensemble object, specifying the temperature to hold the
system to.
transform: A nm_trans object that contains the functions that are
required for the normal mode transformation.
Depend objects:
mode: A string specifying how the bead masses are chosen.
transform_method: A string specifying how to do the normal mode
transformation.
nm_freqs: An array that specifies how the normal mode frequencies
of the ring polymers are to be calculated, and thus how the
bead masses should be chosen.
qnm: The bead positions in the normal mode representation. Depends on
beads.q.
pnm: The bead momenta in the normal mode representation. Depends on
beads.p.
omegan: The effective vibrational frequency for the interaction
between the replicas. Depends on the simulation temperature.
omegan2: omegan**2.
omegak: The normal mode frequencies for the free ring polymer.
Depends on omegan.
prop_pq: An array holding the exact normal mode propagator for the
free ring polymer, using mass scaled coordinates.
See J. Chem. Phys. 133, 124101 (2010). Depends on the bead masses
and the timestep.
nm_factor: An array of dynamical mass factors associated with each of
the normal modes. Depends on nm_freqs and mode.
dynm3: An array that gives the dynamical masses of individual atoms in the
normal modes representation. Depends on nm_factor and beads.m3.
dynomegak: The scaled vibrational frequencies. Depends on nm_factor and
omegak.
kins: A list of the kinetic energy for each normal mode, as
calculated in the normal mode representation, using the
dynamical mass factors. Depends on beads.sm3, beads.p and nm_factor.
kin: The total kinetic energy, as calculated in the normal mode
representation, using the dynamical mass factors.
kstress: The kinetic stress tensor, as calculated in the normal mode
representation, using the dynamical mass factors. Depends on
beads.sm3, beads.p and nm_factor.
"""
def __init__(self, mode="rpmd", transform_method="fft", freqs=None):
"""Initializes NormalModes.
Sets the options for the normal mode transform.
Args:
mode: A string specifying how to calculate the bead masses.
transform_method: A string specifying how to do the normal mode
transformation.
freqs: A list of data used to calculate the dynamical mass factors.
"""
if freqs is None:
freqs = []
dset(self,"mode", depend_value(name='mode', value=mode))
dset(self,"transform_method",
depend_value(name='transform_method', value=transform_method))
dset(self,"nm_freqs",
depend_array(name="nm_freqs",value=np.asarray(freqs, float) ) )
def bind(self, beads, ensemble):
""" Initializes the normal modes object and binds to beads and ensemble.
Do all the work down here as we need a full-formed necklace and ensemble
to know how this should be done.
Args:
beads: A beads object to be bound.
ensemble: An ensemble object to be bound.
"""
self.nbeads = beads.nbeads
self.natoms = beads.natoms
# stores a reference to the bound beads and ensemble objects
self.beads = beads
self.ensemble = ensemble
# sets up what's necessary to perform nm transformation.
if self.transform_method == "fft":
self.transform = nmtransform.nm_fft(nbeads=self.nbeads, natoms=self.natoms)
elif self.transform_method == "matrix":
self.transform = nmtransform.nm_trans(nbeads=self.nbeads)
# creates arrays to store normal modes representation of the path.
# must do a lot of piping to create "ex post" a synchronization between the beads and the nm
sync_q = synchronizer()
sync_p = synchronizer()
dset(self,"qnm",
depend_array(name="qnm",
value=np.zeros((self.nbeads,3*self.natoms), float),
func={"q": (lambda : self.transform.b2nm(depstrip(self.beads.q)) ) },
synchro=sync_q ) )
dset(self,"pnm",
depend_array(name="pnm",
value=np.zeros((self.nbeads,3*self.natoms), float),
func={"p": (lambda : self.transform.b2nm(depstrip(self.beads.p)) ) },
synchro=sync_p ) )
# must overwrite the functions
dget(self.beads, "q")._func = { "qnm": (lambda : self.transform.nm2b(depstrip(self.qnm)) ) }
dget(self.beads, "p")._func = { "pnm": (lambda : self.transform.nm2b(depstrip(self.pnm)) ) }
dget(self.beads, "q").add_synchro(sync_q)
dget(self.beads, "p").add_synchro(sync_p)
# also within the "atomic" interface to beads
for b in range(self.nbeads):
dget(self.beads._blist[b],"q")._func = { "qnm": (lambda : self.transform.nm2b(depstrip(self.qnm)) ) }
dget(self.beads._blist[b],"p")._func = { "pnm": (lambda : self.transform.nm2b(depstrip(self.pnm)) ) }
dget(self.beads._blist[b],"q").add_synchro(sync_q)
dget(self.beads._blist[b],"p").add_synchro(sync_p)
# finally, we mark the beads as those containing the set positions
dget(self.beads, "q").update_man()
dget(self.beads, "p").update_man()
# create path-frequencies related properties
dset(self,"omegan",
depend_value(name='omegan', func=self.get_omegan,
dependencies=[dget(self.ensemble,"temp")]) )
dset(self,"omegan2", depend_value(name='omegan2',func=self.get_omegan2,
dependencies=[dget(self,"omegan")]) )
dset(self,"omegak", depend_array(name='omegak',
value=np.zeros(self.beads.nbeads,float),
func=self.get_omegak, dependencies=[dget(self,"omegan")]) )
# sets up "dynamical" masses -- mass-scalings to give the correct RPMD/CMD dynamics
dset(self,"nm_factor", depend_array(name="nmm",
value=np.zeros(self.nbeads, float), func=self.get_nmm,
dependencies=[dget(self,"nm_freqs"), dget(self,"mode") ]) )
dset(self,"dynm3", depend_array(name="dm3",
value=np.zeros((self.nbeads,3*self.natoms), float),func=self.get_dynm3,
dependencies=[dget(self,"nm_factor"), dget(self.beads, "m3")] ) )
dset(self,"dynomegak", depend_array(name="dynomegak",
value=np.zeros(self.nbeads, float), func=self.get_dynwk,
dependencies=[dget(self,"nm_factor"), dget(self,"omegak") ]) )
dset(self,"prop_pq",
depend_array(name='prop_pq',value=np.zeros((self.beads.nbeads,2,2)),
func=self.get_prop_pq,
dependencies=[dget(self,"omegak"), dget(self,"nm_factor"), dget(self.ensemble,"dt")]) )
# if the mass matrix is not the RPMD one, the MD kinetic energy can't be
# obtained in the bead representation because the masses are all mixed up
dset(self,"kins",
depend_array(name="kins",value=np.zeros(self.nbeads, float),
func=self.get_kins,
dependencies=[dget(self,"pnm"), dget(self.beads,"sm3"), dget(self, "nm_factor") ] ))
dset(self,"kin",
depend_value(name="kin", func=self.get_kin,
dependencies=[dget(self,"kins")] ))
dset(self,"kstress",
depend_array(name="kstress",value=np.zeros((3,3), float),
func=self.get_kstress,
dependencies=[dget(self,"pnm"), dget(self.beads,"sm3"), dget(self, "nm_factor") ] ))
def get_omegan(self):
"""Returns the effective vibrational frequency for the interaction
between replicas.
"""
return self.ensemble.temp*self.nbeads*units.Constants.kb/units.Constants.hbar
def get_omegan2(self):
"""Returns omegan**2."""
return self.omegan**2
def get_omegak(self):
"""Gets the normal mode frequencies.
Returns:
A list of the normal mode frequencies for the free ring polymer.
The first element is the centroid frequency (0.0).
"""
return 2*self.omegan*np.array([np.sin(k*np.pi/self.nbeads) for k in range(self.nbeads)])
def get_dynwk(self):
"""Gets the dynamical normal mode frequencies.
Returns:
A list of the scaled normal mode frequencies for the free ring polymer.
The first element is the centroid frequency (0.0).
"""
return self.omegak/np.sqrt(self.nm_factor)
def get_prop_pq(self):
"""Gets the normal mode propagator matrix.
Note the special treatment for the centroid normal mode, which is
propagated using the standard velocity Verlet algorithm as required.
Note that both the normal mode positions and momenta are propagated
using this matrix.
Returns:
An array of the form (nbeads, 2, 2). Each 2*2 array prop_pq[i,:,:]
gives the exact propagator for the i-th normal mode of the
ring polymer.
"""
dt = self.ensemble.dt
pqk = np.zeros((self.nbeads,2,2), float)
pqk[0] = np.array([[1,0], [dt,1]])
for b in range(1, self.nbeads):
sk = np.sqrt(self.nm_factor[b]) # NOTE THAT THE PROPAGATOR USES MASS-SCALED MOMENTA!
dtomegak = self.omegak[b]*dt/sk
c = np.cos(dtomegak)
s = np.sin(dtomegak)
pqk[b,0,0] = c
pqk[b,1,1] = c
pqk[b,0,1] = -s*self.omegak[b]*sk
pqk[b,1,0] = s/(self.omegak[b]*sk)
return pqk
def get_nmm(self):
"""Returns dynamical mass factors, i.e. the scaling of normal mode
masses that determine the path dynamics (but not statics)."""
# also checks that the frequencies and the mode given in init are
# consistent with the beads and ensemble
dmf = np.zeros(self.nbeads,float)
dmf[:] = 1.0
if self.mode == "rpmd":
if len(self.nm_freqs) > 0:
warning("nm.frequencies will be ignored for RPMD mode.", verbosity.low)
elif self.mode == "manual":
if len(self.nm_freqs) != self.nbeads-1:
raise ValueError("Manual path mode requires (nbeads-1) frequencies, one for each internal mode of the path.")
for b in range(1, self.nbeads):
sk = self.omegak[b]/self.nm_freqs[b-1]
dmf[b] = sk**2
elif self.mode == "pa-cmd":
if len(self.nm_freqs) > 1:
warning("Only the first element in nm.frequencies will be considered for PA-CMD mode.", verbosity.low)
if len(self.nm_freqs) == 0:
raise ValueError("PA-CMD mode requires the target frequency of all the internal modes.")
for b in range(1, self.nbeads):
sk = self.omegak[b]/self.nm_freqs[0]
info(" ".join(["NM FACTOR", str(b), str(sk), str(self.omegak[b]), str(self.nm_freqs[0])]), verbosity.medium)
dmf[b] = sk**2
elif self.mode == "wmax-cmd":
if len(self.nm_freqs) > 2:
warning("Only the first two element in nm.frequencies will be considered for WMAX-CMD mode.", verbosity.low)
if len(self.nm_freqs) < 2:
raise ValueError("WMAX-CMD mode requires [wmax, wtarget]. The normal modes will be scaled such that the first internal mode is at frequency wtarget and all the normal modes coincide at frequency wmax.")
wmax = self.nm_freqs[0]
wt = self.nm_freqs[1]
for b in range(1, self.nbeads):
sk = 1.0/np.sqrt((wt)**2*(1+(wmax/self.omegak[1])**2)/(wmax**2+(self.omegak[b])**2))
dmf[b] = sk**2
return dmf
def get_dynm3(self):
"""Returns an array with the dynamical masses of individual atoms in the normal modes representation."""
dm3 = np.zeros(self.beads.m3.shape,float)
for b in range(self.nbeads):
dm3[b] = self.beads.m3[b]*self.nm_factor[b]
return dm3
def free_qstep(self):
"""Exact normal mode propagator for the free ring polymer.
Note that the propagator works in mass scaled coordinates, so that the
propagator matrix can be determined independently from the particular
atom masses, and so the same propagator will work for all the atoms in
the system. All the ring polymers are propagated at the same time by a
matrix multiplication.
Also note that the centroid coordinate is propagated in qcstep, so is
not altered here.
"""
if self.nbeads == 1:
pass
else:
pq = np.zeros((2,self.natoms*3),float)
sm = depstrip(self.beads.sm3)[0]
prop_pq = depstrip(self.prop_pq)
for k in range(1,self.nbeads):
pq[0,:] = depstrip(self.pnm)[k]/sm
pq[1,:] = depstrip(self.qnm)[k]*sm
pq = np.dot(prop_pq[k],pq)
self.qnm[k] = pq[1,:]/sm
self.pnm[k] = pq[0,:]*sm
def get_kins(self):
"""Gets the MD kinetic energy for all the normal modes.
Returns:
A list of the kinetic energy for each NM.
"""
kmd = np.zeros(self.nbeads,float)
sm = depstrip(self.beads.sm3[0])
pnm = depstrip(self.pnm)
nmf = depstrip(self.nm_factor)
# computes the MD ke in the normal modes representation, to properly account for CMD mass scaling
for b in range(self.nbeads):
sp = pnm[b]/sm # mass-scaled momentum of b-th NM
kmd[b] = np.dot(sp,sp)*0.5/nmf[b] # include the partially adiabatic CMD mass scaling
return kmd
def get_kin(self):
"""Gets the total MD kinetic energy.
Note that this does not correspond to the quantum kinetic energy estimate
for the system.
Returns:
The sum of the kinetic energy of each NM in the path.
"""
return self.kins.sum()
def get_kstress(self):
"""Calculates the total MD kinetic stress tensor.
Note that this does not correspond to the quantum kinetic stress tensor
estimate for the system.
Returns:
The sum of the MD kinetic stress tensor contributions from each NM.
"""
kmd = np.zeros((3,3),float)
sm = depstrip(self.beads.sm3[0])
pnm = depstrip(self.pnm)
nmf = depstrip(self.nm_factor)
for b in range(self.nbeads):
sp = pnm[b]/sm # mass-scaled momentum of b-th NM
for i in range(3):
for j in range(3):
# computes the outer product of the p of various normal modes
# singling out Cartesian components to build the tensor
# also takes care of the possibility of having non-RPMD masses
kmd[i,j] += np.dot(sp[i:3*self.natoms:3],sp[j:3*self.natoms:3])/nmf[b]
return kmd

View File

@ -0,0 +1,378 @@
"""Classes to deal with output of simulation data.
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/>.
Holds classes to deal with the output of different properties, trajectories
and the restart files.
Classes:
PropertyOutput: Deals with outputting properties.
TrajectoryOutput: Deals with outputting trajectories.
CheckpointOutput: Deals with outputting restart files.
"""
import os
import numpy as np
import ipi.inputs.simulation
from ipi.utils.depend import *
from ipi.utils.io.io_xml import *
from ipi.engine.properties import getkey
__all__ = [ 'PropertyOutput', 'TrajectoryOutput', 'CheckpointOutput' ]
class PropertyOutput(dobject):
"""Class dealing with outputting a set of properties to file.
Does not do any calculation, just manages opening a file, getting data
from a Properties object and outputting with the desired stride.
Attributes:
filename: The name of the file to output to.
outlist: A list of the properties to be output.
stride: The number of steps that should be taken between outputting the
data to file.
flush: How often we should flush to disk.
nout: Number of steps since data was last flushed.
out: The output stream on which to output the properties.
simul: The simulation object to get the data to be output from.
"""
def __init__(self, filename="out", stride=1, flush=1, outlist=None):
"""Initializes a property output stream opening the corresponding
file name.
Also writes out headers.
Args:
filename: A string giving the name of the file to be output to.
stride: An integer giving how many steps should be taken between
outputting the data to file.
flush: Number of writes to file between flushing data.
outlist: A list of all the properties that should be output.
"""
if outlist is None:
outlist = np.zeros(0,np.dtype('|S1024'))
self.filename = filename
self.outlist = np.asarray(outlist,np.dtype('|S1024'))
self.stride = stride
self.flush = flush
self.nout = 0
self.out = None
def bind(self, simul):
"""Binds output proxy to simulation object.
Args:
simul: A simulation object to be bound.
"""
self.simul = simul
# Checks as soon as possible if some asked-for properties are
# missing or mispelled
for what in self.outlist:
key = getkey(what)
if not key in self.simul.properties.property_dict.keys():
print "Computable properties list: ", self.simul.properties.property_dict.keys()
raise KeyError(key + " is not a recognized property")
self.open_stream()
def open_stream(self):
"""Opens the output stream."""
try:
self.out = open(self.filename, "a")
except:
raise ValueError("Could not open file " + self.filename + " for output")
# print nice header if information is available on the properties
if (self.simul.step == 0) :
icol = 1
for what in self.outlist:
ohead = "# "
key = getkey(what)
prop = self.simul.properties.property_dict[key]
if "size" in prop and prop["size"] > 1:
ohead += "cols. %3d-%-3d" % ( icol, icol+prop["size"] - 1 )
icol += prop["size"]
else:
ohead += "column %3d " % ( icol )
icol += 1
ohead += " --> %s " % (what)
if "help" in prop:
ohead += ": " + prop["help"]
self.out.write(ohead + "\n")
def close_stream():
"""Closes the output stream."""
self.out.close()
def write(self):
"""Outputs the required properties of the system.
Note that properties are outputted using the same format as for the
output to the xml checkpoint files, as specified in io_xml.
Raises:
KeyError: Raised if one of the properties specified in the output list
are not contained in the property_dict member of properties.
"""
if not (self.simul.step + 1) % self.stride == 0:
return
self.out.write(" ")
for what in self.outlist:
try:
quantity = self.simul.properties[what]
except KeyError:
raise KeyError(what + " is not a recognized property")
if not hasattr(quantity,"__len__") :
self.out.write(write_type(float, quantity) + " ")
else:
for el in quantity:
self.out.write(write_type(float, el) + " ")
self.out.write("\n")
self.nout += 1
if self.flush > 0 and self.nout >= self.flush :
self.out.flush()
os.fsync(self.out) # we REALLY want to print out! pretty please OS let us do it.
self.nout = 0
class TrajectoryOutput(dobject):
"""Class dealing with outputting atom-based properties as a
trajectory file.
Does not do any calculation, just manages opening a file, getting data
from a Trajectories object and outputting with the desired stride.
Attributes:
filename: The (base) name of the file to output to.
format: The format of the trajectory file to be created.
what: The trajectory that needs to be output.
stride: The number of steps that should be taken between outputting the
data to file.
out: The output stream on which to output the trajectories.
flush: How often we should flush to disk.
nout: Number of steps since data was last flushed.
ibead: Index of the replica to print the trajectory of.
cell_units: The units that the cell parameters are given in.
simul: The simulation object to get the data to be output from.
"""
def __init__(self, filename="out", stride=1, flush=1, what="", format="xyz", cell_units="atomic_unit", ibead=-1):
""" Initializes a property output stream opening the corresponding
file name.
Also writes out headers.
Args:
filename: A string giving the name of the file to be output to.
stride: An integer giving how many steps should be taken between
outputting the data to file.
flush: How often we should flush to disk
what: A string specifying what trajectory should be output.
format: A string specifying the type of trajectory file to be created.
cell_units: A string specifying the units that the cell parameters are
given in.
ibead: If positive, prints out only the selected bead. If negative, prints out one file per bead.
"""
self.filename = filename
self.what = what
self.stride = stride
self.flush = flush
self.ibead = ibead
self.format = format
self.cell_units = cell_units
self.out = None
self.nout = 0
def bind(self, simul):
"""Binds output proxy to simulation object.
Args:
simul: A simulation object to be bound.
"""
self.simul = simul
# Checks as soon as possible if some asked-for trajs are missing or mispelled
key = getkey(self.what)
if not key in self.simul.trajs.traj_dict.keys():
print "Computable trajectories list: ", self.simul.trajs.traj_dict.keys()
raise KeyError(key + " is not a recognized output trajectory")
self.open_stream()
def open_stream(self):
"""Opens the output stream(s)."""
if getkey(self.what) in [ "positions", "velocities", "forces", "extras" ]:
# must write out trajectories for each bead, so must create b streams
self.out = []
for b in range(self.simul.beads.nbeads):
# zero-padded bead number
padb = ( ("%0" + str(int(1 + np.floor(np.log(self.simul.beads.nbeads)/np.log(10)))) + "d") % (b) )
try:
if (self.ibead < 0 or self.ibead == b):
if getkey(self.what) == "extras":
self.out.append(open(self.filename + "_" + padb, "a"))
else:
self.out.append(open(self.filename + "_" + padb + "." + self.format, "a"))
else:
self.out.append(None) # creates null outputs if a
# single bead output is chosen
except:
raise ValueError("Could not open file " + self.filename + "_" + padb + "." + self.format + " for output")
else:
try:
self.out = ( open(self.filename + "." + self.format, "a") )
except:
raise ValueError("Could not open file " + self.filename + "." + self.format + " for output")
def close_stream():
"""Closes the output stream."""
if hasattr(self.out, "__getitem__"):
for o in self.out:
o.close()
else:
self.out.close()
def write(self):
"""Writes out the required trajectories."""
if not (self.simul.step + 1) % self.stride == 0:
return
doflush = False
self.nout += 1
if self.flush > 0 and self.nout >= self.flush :
doflush = True
self.nout = 0
# quick-and-dirty way to check if a trajectory is "global" or per-bead
# Checks to see if there is a list of files or just a single file.
if hasattr(self.out, "__getitem__"):
if self.ibead < 0:
for b in range(len(self.out)):
self.simul.trajs.print_traj(self.what, self.out[b], b, format=self.format, cell_units=self.cell_units, flush=doflush)
elif self.ibead < len(self.out):
self.simul.trajs.print_traj(self.what, self.out[self.ibead], self.ibead, format=self.format, cell_units=self.cell_units, flush=doflush)
else:
raise ValueError("Selected bead index " + str(self.ibead) + " does not exist for trajectory " + self.what)
else:
self.simul.trajs.print_traj(self.what, self.out, b=0, format=self.format, cell_units=self.cell_units, flush=doflush)
class CheckpointOutput(dobject):
"""Class dealing with outputting checkpoints.
Saves the complete status of the simulation at regular intervals.
Attributes:
filename: The (base) name of the file to output to.
step: the number of times a checkpoint has been written out.
stride: The number of steps that should be taken between outputting the
data to file.
overwrite: If True, the checkpoint file is overwritten at each output.
If False, will output to 'filename_step'. Note that no check is done
on whether 'filename_step' exists already.
simul: The simulation object to get the data to be output from.
status: An input simulation object used to write out the checkpoint file.
"""
def __init__(self, filename="restart", stride=1000, overwrite=True, step=0):
"""Initializes a checkpoint output proxy.
Args:
filename: A string giving the name of the file to be output to.
stride: An integer giving how many steps should be taken between
outputting the data to file.
overwrite: If True, the checkpoint file is overwritten at each output.
If False, will output to 'filename_step'. Note that no check is done
on whether 'filename_step' exists already.
step: The number of checkpoint files that have been created so far.
"""
self.filename = filename
self.step = step
self.stride = stride
self.overwrite = overwrite
def bind(self, simul):
"""Binds output proxy to simulation object.
Args:
simul: A simulation object to be bound.
"""
self.simul = simul
self.status = ipi.inputs.simulation.InputSimulation()
self.status.store(simul)
def store(self):
"""Stores the current simulation status.
Used so that, if halfway through a step a kill signal is received,
we can output a checkpoint file corresponding to the beginning of the
current step, which is the last time that both the velocities and
positions would have been consistent.
"""
self.status.store(self.simul)
def write(self, store=True):
"""Writes out the required trajectories.
Used for both the checkpoint files and the soft-exit restart file.
We have slightly different behaviour for these two different types of
checkpoint file, as the soft-exit files have their store() function
called automatically, and we do not want this to be updated as the
status of the simulation after a soft-exit call is unlikely to be in
a consistent state. On the other hand, the standard checkpoint files
are not automatically updated in this way, and we must manually store the
current state of the system before writing them.
Args:
store: A boolean saying whether the state of the system should be
stored before writing the checkpoint file.
"""
if not (self.simul.step + 1) % self.stride == 0:
return
if self.overwrite:
filename = self.filename
else:
filename = self.filename + "_" + str(self.step)
if store:
self.step += 1 # advances the step counter before saving, so next time the correct index will be loaded.
self.store()
check_file = open(filename, "w")
check_file.write(self.status.write(name="simulation"))
check_file.close()

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,232 @@
"""Contains the class that deals with the running of the simulation and
outputting the results.
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/>.
The root class for the whole simulation. Contains references to all the top
level objects used in the simulation, and controls all the steps that are
not inherently system dependent, like the running of each time step,
choosing which properties to initialise, and which properties to output.
Classes:
Simulation: Deals with running the simulation and outputting the results.
"""
__all__ = ['Simulation']
import numpy as np
import os.path, sys, time
from ipi.utils.depend import *
from ipi.utils.units import *
from ipi.utils.prng import *
from ipi.utils.io import *
from ipi.utils.io.io_xml import *
from ipi.utils.messages import verbosity, info
from ipi.utils.softexit import softexit
from ipi.engine.atoms import *
from ipi.engine.cell import *
from ipi.engine.forces import Forces
from ipi.engine.beads import Beads
from ipi.engine.normalmodes import NormalModes
from ipi.engine.properties import Properties, Trajectories
from ipi.engine.outputs import CheckpointOutput
class Simulation(dobject):
"""Main simulation object.
Contains all the references and the main dynamics loop. Also handles the
initialisation and output.
Attributes:
beads: A beads object giving the atom positions.
cell: A cell object giving the system box.
prng: A random number generator object.
flist: A list of forcefield objects giving different ways to partially
calculate the forces.
forces: A Forces object for calculating the total force for all the
replicas.
ensemble: An ensemble object giving the objects necessary for producing
the correct ensemble.
tsteps: The total number of steps.
ttime: The wall clock time (in seconds).
format: A string specifying both the format and the extension of traj
output.
outputs: A list of output objects that should be printed during the run
nm: A helper object dealing with normal modes transformation
properties: A property object for dealing with property output.
trajs: A trajectory object for dealing with trajectory output.
chk: A checkpoint object for dealing with checkpoint output.
rollback: If set to true, the state of the simulation at the start
of the step will be output to a restart file rather than
the current state of the simulation. This is because we cannot
restart from half way through a step, only from the beginning of a
step, so this is necessary for the trajectory to be continuous.
Depend objects:
step: The current simulation step.
"""
def __init__(self, beads, cell, forces, ensemble, prng, outputs, nm, init, step=0, tsteps=1000, ttime=0):
"""Initialises Simulation class.
Args:
beads: A beads object giving the atom positions.
cell: A cell object giving the system box.
forces: A forcefield object giving the force calculator for each
replica of the system.
ensemble: An ensemble object giving the objects necessary for
producing the correct ensemble.
prng: A random number object.
outputs: A list of output objects.
nm: A class dealing with path NM operations.
init: A class to deal with initializing the simulation object.
step: An optional integer giving the current simulation time step.
Defaults to 0.
tsteps: An optional integer giving the total number of steps. Defaults
to 1000.
ttime: The simulation running time. Used on restart, to keep a
cumulative total.
"""
info(" # Initializing simulation object ", verbosity.low )
self.prng = prng
self.ensemble = ensemble
self.beads = beads
self.cell = cell
self.nm = nm
# initialize the configuration of the system
self.init = init
init.init_stage1(self)
self.flist = forces
self.forces = Forces()
self.outputs = outputs
dset(self, "step", depend_value(name="step", value=step))
self.tsteps = tsteps
self.ttime = ttime
self.properties = Properties()
self.trajs = Trajectories()
self.chk = None
self.rollback = True
def bind(self):
"""Calls the bind routines for all the objects in the simulation."""
# binds important computation engines
self.nm.bind(self.beads, self.ensemble)
self.forces.bind(self.beads, self.cell, self.flist)
self.ensemble.bind(self.beads, self.nm, self.cell, self.forces, self.prng)
self.init.init_stage2(self)
# binds output management objects
self.properties.bind(self)
self.trajs.bind(self)
for o in self.outputs:
o.bind(self)
self.chk = CheckpointOutput("RESTART", 1, True, 0)
self.chk.bind(self)
# registers the softexit routine
softexit.register(self.softexit)
def softexit(self):
"""Deals with a soft exit request.
Tries to ensure that a consistent restart checkpoint is
written out.
"""
if self.step < self.tsteps:
self.step += 1
if not self.rollback:
self.chk.store()
self.chk.write(store=False)
self.forces.stop()
def run(self):
"""Runs the simulation.
Does all the simulation steps, and outputs data to the appropriate files
when necessary. Also deals with starting and cleaning up the threads used
in the communication between the driver and the PIMD code.
"""
self.forces.run()
# prints inital configuration -- only if we are not restarting
if (self.step == 0):
self.step = -1
for o in self.outputs:
o.write()
self.step = 0
steptime = 0.0
simtime = time.time()
cstep = 0
tptime = 0.0
tqtime = 0.0
tttime = 0.0
ttot = 0.0
# main MD loop
for self.step in range(self.step,self.tsteps):
# stores the state before doing a step.
# this is a bit time-consuming but makes sure that we can honor soft
# exit requests without screwing the trajectory
steptime = -time.time()
self.chk.store()
self.ensemble.step()
for o in self.outputs:
o.write()
if os.path.exists("EXIT"): # soft-exit
self.rollback = False
softexit.trigger()
steptime += time.time()
ttot += steptime
tptime += self.ensemble.ptime
tqtime += self.ensemble.qtime
tttime += self.ensemble.ttime
cstep += 1
if verbosity.high or (verbosity.medium and self.step%100 == 0) or (verbosity.low and self.step%1000 == 0):
info(" # Average timings at MD step % 7d. t/step: %10.5e [p: %10.5e q: %10.5e t: %10.5e]" %
( self.step, ttot/cstep, tptime/cstep, tqtime/cstep, tttime/cstep ) )
cstep = 0
tptime = 0.0
tqtime = 0.0
tttime = 0.0
ttot = 0.0
info(" # MD diagnostics: V: %10.5e Kcv: %10.5e Ecns: %10.5e" %
(self.properties["potential"], self.properties["kinetic_cv"], self.properties["conserved"] ) )
if (self.ttime > 0 and time.time() - simtime > self.ttime):
info(" # Wall clock time expired! Bye bye!", verbosity.low )
break
info(" # Simulation ran successfully for the prescribed total_step! Bye bye!", verbosity.low )
self.rollback = False
softexit.trigger()

View File

@ -0,0 +1,884 @@
"""Contains the classes that deal with constant temperature dynamics.
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/>.
Contains the algorithms which propagate the thermostatting steps in the constant
temperature ensembles. Includes the new GLE thermostat, which can be used to
run PI+GLE dynamics, reducing the number of path integral beads required.
Classes:
Thermostat: Base thermostat class with the generic methods and attributes.
ThermoLangevin: Holds the algorithms for a langevin thermostat.
ThermoPILE_L: Holds the algorithms for a path-integral langevin equation
thermostat, with a thermostat coupled directly to the
centroid coordinate of each bead.
ThermoPILE_G: Holds the algorithms for a path-integral langevin equation
thermostat, with a thermostat coupled to the kinetic energy for
the entire system.
ThermoSVR: Holds the algorithms for a stochastic velocity rescaling
thermostat.
ThermoGLE: Holds the algorithms for a generalised langevin equation
thermostat.
ThermoNMGLE: Holds the algorithms for a generalised langevin equation
thermostat in the normal mode representation.
ThermoNMGLEG: Holds the algorithms for a generalised langevin equation
thermostat in the normal mode representation, with kinetic energy as
well as potential energy sampling optimization.
"""
__all__ = ['Thermostat', 'ThermoLangevin', 'ThermoPILE_L', 'ThermoPILE_G',
'ThermoSVR', 'ThermoGLE', 'ThermoNMGLE', 'ThermoNMGLEG']
import numpy as np
from ipi.utils.depend import *
from ipi.utils.units import *
from ipi.utils.mathtools import matrix_exp, stab_cholesky, root_herm
from ipi.utils.prng import Random
from ipi.utils.messages import verbosity, warning, info
from ipi.engine.beads import Beads
from ipi.engine.normalmodes import NormalModes
class Thermostat(dobject):
"""Base thermostat class.
Gives the standard methods and attributes needed in all the thermostat
classes.
Attributes:
prng: A pseudo random number generator object.
ndof: The number of degrees of freedom that the thermostat will be
attached to.
Depend objects:
dt: The time step used in the algorithms. Depends on the simulation dt.
temp: The simulation temperature. Higher than the system temperature by
a factor of the number of beads. Depends on the simulation temp.
ethermo: The total energy exchanged with the bath due to the thermostat.
p: The momentum vector that the thermostat is coupled to. Depends on the
beads p object.
m: The mass vector associated with p. Depends on the beads m object.
sm: The square root of the mass vector.
"""
def __init__(self, temp = 1.0, dt = 1.0, ethermo=0.0):
"""Initialises Thermostat.
Args:
temp: The simulation temperature. Defaults to 1.0.
dt: The simulation time step. Defaults to 1.0.
ethermo: The initial heat energy transferred to the bath.
Defaults to 0.0. Will be non-zero if the thermostat is
initialised from a checkpoint file.
"""
dset(self,"temp", depend_value(name='temp', value=temp))
dset(self,"dt", depend_value(name='dt', value=dt))
dset(self,"ethermo",depend_value(name='ethermo',value=ethermo))
def bind(self, beads=None, atoms=None, pm=None, prng=None, fixdof=None):
"""Binds the appropriate degrees of freedom to the thermostat.
This takes an object with degrees of freedom, and makes their momentum
and mass vectors members of the thermostat. It also then creates the
objects that will hold the data needed in the thermostat algorithms
and the dependency network.
Args:
beads: An optional beads object to take the mass and momentum vectors
from.
atoms: An optional atoms object to take the mass and momentum vectors
from.
pm: An optional tuple containing a single momentum value and its
conjugate mass.
prng: An optional pseudo random number generator object. Defaults to
Random().
fixdof: An optional integer which can specify the number of constraints
applied to the system. Defaults to zero.
Raises:
TypeError: Raised if no appropriate degree of freedom or object
containing a momentum vector is specified for
the thermostat to couple to.
"""
if prng is None:
warning("Initializing thermostat from standard random PRNG", verbosity.medium)
self.prng = Random()
else:
self.prng = prng
if not beads is None:
dset(self,"p",beads.p.flatten())
dset(self,"m",beads.m3.flatten())
elif not atoms is None:
dset(self,"p",dget(atoms, "p"))
dset(self,"m",dget(atoms, "m3"))
elif not pm is None:
dset(self,"p",pm[0])
dset(self,"m",pm[1])
else:
raise TypeError("Thermostat.bind expects either Beads, Atoms, NormalModes, or a (p,m) tuple to bind to")
if fixdof is None:
self.ndof = len(self.p)
else:
self.ndof = float(len(self.p) - fixdof)
dset(self, "sm",
depend_array(name="sm", value=np.zeros(len(dget(self,"m"))),
func=self.get_sm, dependencies=[dget(self,"m")]))
def get_sm(self):
"""Retrieves the square root of the mass matrix.
Returns:
A vector of the square root of the mass matrix with one value for
each degree of freedom.
"""
return np.sqrt(self.m)
def step(self):
"""Dummy thermostat step."""
pass
class ThermoLangevin(Thermostat):
"""Represents a langevin thermostat.
Depend objects:
tau: Thermostat damping time scale. Larger values give a less strongly
coupled thermostat.
T: Coefficient of the diffusive contribution of the thermostat, i.e. the
drift back towards equilibrium. Depends on tau and the time step.
S: Coefficient of the stochastic contribution of the thermostat, i.e.
the uncorrelated Gaussian noise. Depends on T and the temperature.
"""
def get_T(self):
"""Calculates the coefficient of the overall drift of the velocities."""
return np.exp(-0.5*self.dt/self.tau)
def get_S(self):
"""Calculates the coefficient of the white noise."""
return np.sqrt(Constants.kb*self.temp*(1 - self.T**2))
def __init__(self, temp = 1.0, dt = 1.0, tau = 1.0, ethermo=0.0):
"""Initialises ThermoLangevin.
Args:
temp: The simulation temperature. Defaults to 1.0.
dt: The simulation time step. Defaults to 1.0.
tau: The thermostat damping timescale. Defaults to 1.0.
ethermo: The initial heat energy transferred to the bath.
Defaults to 0.0. Will be non-zero if the thermostat is
initialised from a checkpoint file.
"""
super(ThermoLangevin,self).__init__(temp, dt, ethermo)
dset(self,"tau",depend_value(value=tau,name='tau'))
dset(self,"T",
depend_value(name="T",func=self.get_T,
dependencies=[dget(self,"tau"), dget(self,"dt")]))
dset(self,"S",
depend_value(name="S",func=self.get_S,
dependencies=[dget(self,"temp"), dget(self,"T")]))
def step(self):
"""Updates the bound momentum vector with a langevin thermostat."""
p = depstrip(self.p).copy()
sm = depstrip(self.sm)
p /= sm
self.ethermo += np.dot(p,p)*0.5
p *= self.T
p += self.S*self.prng.gvec(len(p))
self.ethermo -= np.dot(p,p)*0.5
p *= sm
self.p = p
class ThermoPILE_L(Thermostat):
"""Represents a PILE thermostat with a local centroid thermostat.
Attributes:
_thermos: The list of the different thermostats for all the ring polymer
normal modes.
nm: A normal modes object to attach the thermostat to.
prng: Random number generator used in the stochastic integration
algorithms.
Depend objects:
tau: Centroid thermostat damping time scale. Larger values give a
less strongly coupled centroid thermostat.
tauk: Thermostat damping time scale for the non-centroid normal modes.
Depends on the ring polymer spring constant, and thus the simulation
temperature.
pilescale: A float used to reduce the intensity of the PILE thermostat if
required.
"""
def __init__(self, temp = 1.0, dt = 1.0, tau = 1.0, ethermo=0.0, scale=1.0):
"""Initialises ThermoPILE_L.
Args:
temp: The simulation temperature. Defaults to 1.0.
dt: The simulation time step. Defaults to 1.0.
tau: The centroid thermostat damping timescale. Defaults to 1.0.
ethermo: The initial conserved energy quantity. Defaults to 0.0. Will
be non-zero if the thermostat is initialised from a checkpoint file.
scale: A float used to reduce the intensity of the PILE thermostat if
required.
Raises:
TypeError: Raised if the thermostat is used with any object other than
a beads object, so that we make sure that the objects needed for the
normal mode transformation exist.
"""
super(ThermoPILE_L,self).__init__(temp,dt,ethermo)
dset(self,"tau",depend_value(value=tau,name='tau'))
dset(self,"pilescale",depend_value(value=scale,name='pilescale'))
def bind(self, nm=None, prng=None, bindcentroid=True, fixdof=None):
"""Binds the appropriate degrees of freedom to the thermostat.
This takes a beads object with degrees of freedom, and makes its momentum
and mass vectors members of the thermostat. It also then creates the
objects that will hold the data needed in the thermostat algorithms
and the dependency network.
Gives the interface for both the PILE_L and PILE_G thermostats, which
only differ in their treatment of the centroid coordinate momenta.
Args:
nm: An optional normal mode object to take the mass and momentum
vectors from.
prng: An optional pseudo random number generator object. Defaults to
Random().
bindcentroid: An optional boolean which decides whether a Langevin
thermostat is attached to the centroid mode of each atom
separately, or the total kinetic energy. Defaults to True, which
gives a thermostat bound to each centroid momentum.
fixdof: An optional integer which can specify the number of constraints
applied to the system. Defaults to zero.
Raises:
TypeError: Raised if no appropriate degree of freedom or object
containing a momentum vector is specified for
the thermostat to couple to.
"""
if nm is None or not type(nm) is NormalModes:
raise TypeError("ThermoPILE_L.bind expects a NormalModes argument to bind to")
if prng is None:
self.prng = Random()
else:
self.prng = prng
prev_ethermo = self.ethermo
# creates a set of thermostats to be applied to individual normal modes
self._thermos = [ ThermoLangevin(temp=1, dt=1, tau=1) for b in range(nm.nbeads) ]
# optionally does not bind the centroid, so we can re-use all of this
# in the PILE_G case
if not bindcentroid:
self._thermos[0] = None
self.nm = nm
dset(self,"tauk",
depend_array(name="tauk", value=np.zeros(nm.nbeads-1,float),
func=self.get_tauk, dependencies=[dget(self,"pilescale"), dget(nm,"dynomegak")] ) )
# must pipe all the dependencies in such a way that values for the nm thermostats
# are automatically updated based on the "master" thermostat
def make_taugetter(k):
return lambda: self.tauk[k-1]
it = 0
for t in self._thermos:
if t is None:
it += 1
continue
if it > 0:
fixdof = None # only the centroid thermostat may have constraints
# bind thermostat t to the it-th bead
t.bind(pm=(nm.pnm[it,:],nm.dynm3[it,:]),prng=self.prng, fixdof=fixdof)
# pipes temp and dt
deppipe(self,"temp", t, "temp")
deppipe(self,"dt", t, "dt")
# for tau it is slightly more complex
if it == 0:
deppipe(self,"tau", t, "tau")
else:
# Here we manually connect _thermos[i].tau to tauk[i].
# Simple and clear.
dget(t,"tau").add_dependency(dget(self,"tauk"))
dget(t,"tau")._func = make_taugetter(it)
dget(self,"ethermo").add_dependency(dget(t,"ethermo"))
it += 1
# since the ethermo will be "delegated" to the normal modes thermostats,
# one has to split
# any previously-stored value between the sub-thermostats
if bindcentroid:
for t in self._thermos:
t.ethermo = prev_ethermo/nm.nbeads
dget(self,"ethermo")._func = self.get_ethermo;
# if we are not binding the centroid just yet, this bit of the piping
# is delegated to the function which is actually calling this
def get_tauk(self):
"""Computes the thermostat damping time scale for the non-centroid
normal modes.
Returns:
An array with the damping time scales for the non-centroid modes.
"""
# Also include an optional scaling factor to reduce the intensity of NM thermostats
return np.array([ self.pilescale/(2*self.nm.dynomegak[k]) for k in range(1,len(self._thermos)) ])
def get_ethermo(self):
"""Computes the total energy transferred to the heat bath for all the
thermostats.
"""
et = 0.0;
for t in self._thermos:
et += t.ethermo
return et
def step(self):
"""Updates the bound momentum vector with a PILE thermostat."""
# super-cool! just loop over the thermostats! it's as easy as that!
for t in self._thermos:
t.step()
class ThermoSVR(Thermostat):
"""Represents a stochastic velocity rescaling thermostat.
Depend objects:
tau: Centroid thermostat damping time scale. Larger values give a
less strongly coupled centroid thermostat.
K: Scaling factor for the total kinetic energy. Depends on the
temperature.
et: Parameter determining the strength of the thermostat coupling.
Depends on tau and the time step.
"""
def get_et(self):
"""Calculates the damping term in the propagator."""
return np.exp(-0.5*self.dt/self.tau)
def get_K(self):
"""Calculates the average kinetic energy per degree of freedom."""
return Constants.kb*self.temp*0.5
def __init__(self, temp = 1.0, dt = 1.0, tau = 1.0, ethermo=0.0):
"""Initialises ThermoSVR.
Args:
temp: The simulation temperature. Defaults to 1.0.
dt: The simulation time step. Defaults to 1.0.
tau: The thermostat damping timescale. Defaults to 1.0.
ethermo: The initial conserved energy quantity. Defaults to 0.0. Will
be non-zero if the thermostat is initialised from a checkpoint file.
"""
super(ThermoSVR,self).__init__(temp,dt,ethermo)
dset(self,"tau",depend_value(value=tau,name='tau'))
dset(self,"et",
depend_value(name="et",func=self.get_et,
dependencies=[dget(self,"tau"), dget(self,"dt")]))
dset(self,"K",
depend_value(name="K",func=self.get_K, dependencies=[dget(self,"temp")]))
def step(self):
"""Updates the bound momentum vector with a stochastic velocity rescaling
thermostat. See G Bussi, D Donadio, M Parrinello,
Journal of Chemical Physics 126, 014101 (2007)
"""
K = np.dot(depstrip(self.p),depstrip(self.p)/depstrip(self.m))*0.5
# rescaling is un-defined if the KE is zero
if K == 0.0:
return
# gets the stochastic term (basically a Gamma distribution for the kinetic energy)
r1 = self.prng.g
if (self.ndof-1)%2 == 0:
rg = 2.0*self.prng.gamma((self.ndof-1)/2)
else:
rg = 2.0*self.prng.gamma((self.ndof-2)/2) + self.prng.g**2
alpha2 = self.et + self.K/K*(1 - self.et)*(r1**2 + rg) + 2.0*r1*np.sqrt(self.K/K*self.et*(1 - self.et))
alpha = np.sqrt(alpha2)
if (r1 + np.sqrt(2*K/self.K*self.et/(1 - self.et))) < 0:
alpha *= -1
self.ethermo += K*(1 - alpha2)
self.p *= alpha
class ThermoPILE_G(ThermoPILE_L):
"""Represents a PILE thermostat with a global centroid thermostat.
Simply replaces the Langevin thermostat for the centroid normal mode with
a global velocity rescaling thermostat.
"""
def __init__(self, temp = 1.0, dt = 1.0, tau = 1.0, ethermo=0.0, scale = 1.0):
"""Initialises ThermoPILE_G.
Args:
temp: The simulation temperature. Defaults to 1.0.
dt: The simulation time step. Defaults to 1.0.
tau: The centroid thermostat damping timescale. Defaults to 1.0.
ethermo: The initial conserved energy quantity. Defaults to 0.0. Will
be non-zero if the thermostat is initialised from a checkpoint file.
scale: A float used to reduce the intensity of the PILE thermostat if
required.
"""
super(ThermoPILE_G,self).__init__(temp,dt,tau,ethermo)
dset(self,"pilescale",depend_value(value=scale,name='pilescale'))
def bind(self, nm=None, prng=None, fixdof=None):
"""Binds the appropriate degrees of freedom to the thermostat.
This takes a beads object with degrees of freedom, and makes its momentum
and mass vectors members of the thermostat. It also then creates the
objects that will hold the data needed in the thermostat algorithms
and the dependency network.
Uses the PILE_L bind interface, with bindcentroid set to false so we can
specify that thermostat separately, by binding a global
thermostat to the centroid mode.
Args:
beads: An optional beads object to take the mass and momentum vectors
from.
prng: An optional pseudo random number generator object. Defaults to
Random().
fixdof: An optional integer which can specify the number of constraints
applied to the system. Defaults to zero.
"""
# first binds as a local PILE, then substitutes the thermostat on the centroid
prev_ethermo = self.ethermo
super(ThermoPILE_G,self).bind(nm=nm,prng=prng,bindcentroid=False, fixdof=fixdof)
#centroid thermostat
self._thermos[0] = ThermoSVR(temp=1, dt=1, tau=1)
t = self._thermos[0]
t.bind(pm=(nm.pnm[0,:],nm.dynm3[0,:]),prng=self.prng, fixdof=fixdof)
deppipe(self,"temp", t, "temp")
deppipe(self,"dt", t, "dt")
deppipe(self,"tau", t, "tau")
dget(self,"ethermo").add_dependency(dget(t,"ethermo"))
# splits any previous ethermo between the thermostats, and finishes to bind ethermo to the sum function
for t in self._thermos:
t.ethermo = prev_ethermo/nm.nbeads
dget(self,"ethermo")._func = self.get_ethermo;
class ThermoGLE(Thermostat):
"""Represents a GLE thermostat.
This is similar to a langevin thermostat, in that it uses Gaussian random
numbers to simulate a heat bath acting on the system, but simulates a
non-Markovian system by using a Markovian formulation in an extended phase
space. This allows for a much greater degree of flexibility, and this
thermostat, properly fitted, can give the an approximation to the correct
quantum ensemble even for a classical, 1-bead simulation. More reasonably,
using this thermostat allows for a far smaller number of replicas of the
system to be used, as the convergence of the properties
of the system is accelerated with respect to number of beads when PI+GLE
are used in combination. (See M. Ceriotti, D. E. Manolopoulos, M. Parinello,
J. Chem. Phys. 134, 084104 (2011)).
Attributes:
ns: The number of auxilliary degrees of freedom.
s: An array holding all the momenta, including the ones for the
auxilliary degrees of freedom.
Depend objects:
A: Drift matrix giving the damping time scales for all the different
degrees of freedom.
C: Static covariance matrix.
Satisfies A.C + C.transpose(A) = B.transpose(B), where B is the
diffusion matrix, giving the strength of the coupling of the system
with the heat bath, and thus the size of the stochastic
contribution of the thermostat.
T: Matrix for the diffusive contribution of the thermostat, i.e. the
drift back towards equilibrium. Depends on A and the time step.
S: Matrix for the stochastic contribution of the thermostat, i.e.
the uncorrelated Gaussian noise. Depends on C and T.
"""
def get_T(self):
"""Calculates the matrix for the overall drift of the velocities."""
return matrix_exp(-0.5*self.dt*self.A)
def get_S(self):
"""Calculates the matrix for the coloured noise."""
SST = Constants.kb*(self.C - np.dot(self.T,np.dot(self.C,self.T.T)))
# Uses a symetric decomposition rather than Cholesky, since it is more stable
return root_herm(SST)
def get_C(self):
"""Calculates C from temp (if C is not set explicitly)"""
rC = np.identity(self.ns + 1,float)*self.temp
return rC[:]
def __init__(self, temp = 1.0, dt = 1.0, A = None, C = None, ethermo=0.0):
"""Initialises ThermoGLE.
Args:
temp: The simulation temperature. Defaults to 1.0.
dt: The simulation time step. Defaults to 1.0.
A: An optional matrix giving the drift matrix. Defaults to a single
value of 1.0.
C: An optional matrix giving the covariance matrix. Defaults to an
identity matrix times temperature with the same dimensions as the
total number of degrees of freedom in the system.
ethermo: The initial heat energy transferred to the bath.
Defaults to 0.0. Will be non-zero if the thermostat is
initialised from a checkpoint file.
"""
super(ThermoGLE,self).__init__(temp,dt,ethermo)
if A is None:
A = np.identity(1,float)
dset(self,"A",depend_value(value=A.copy(),name='A'))
self.ns = len(self.A) - 1;
# now, this is tricky. if C is taken from temp, then we want it to be updated
# as a depend of temp. Otherwise, we want it to be an independent beast.
if C is None:
C = np.identity(self.ns+1,float)*self.temp
dset(self,"C",
depend_value(name='C', func=self.get_C,
dependencies=[dget(self,"temp")]))
else:
dset(self,"C",depend_value(value=C.copy(),name='C'))
dset(self,"T",
depend_value(name="T",func=self.get_T,
dependencies=[dget(self,"A"), dget(self,"dt")]))
dset(self,"S",
depend_value(name="S",func=self.get_S,
dependencies=[dget(self,"C"), dget(self,"T")]))
self.s = np.zeros(0)
def bind(self, beads=None, atoms=None, pm=None, prng=None, fixdof=None):
"""Binds the appropriate degrees of freedom to the thermostat.
This takes an object with degrees of freedom, and makes their momentum
and mass vectors members of the thermostat. It also then creates the
objects that will hold the data needed in the thermostat algorithms
and the dependency network.
Args:
beads: An optional beads object to take the mass and momentum vectors
from.
atoms: An optional atoms object to take the mass and momentum vectors
from.
pm: An optional tuple containing a single momentum value and its
conjugate mass.
prng: An optional pseudo random number generator object. Defaults to
Random().
fixdof: An optional integer which can specify the number of constraints
applied to the system. Defaults to zero.
Raises:
TypeError: Raised if no appropriate degree of freedom or object
containing a momentum vector is specified for
the thermostat to couple to.
"""
super(ThermoGLE,self).bind(beads,atoms,pm,prng,fixdof)
# allocates, initializes or restarts an array of s's
if self.s.shape != (self.ns + 1, len(dget(self,"m"))):
if len(self.s) > 0:
warning("Mismatch in GLE s array size on restart, will reinitialise to free particle.", verbosity.low)
self.s = np.zeros((self.ns + 1, len(dget(self,"m"))))
# Initializes the s vector in the free-particle limit
info(" GLE additional DOFs initialised to the free-particle limit.", verbosity.low)
SC = stab_cholesky(self.C*Constants.kb)
self.s[:] = np.dot(SC, self.prng.gvec(self.s.shape))
else:
info("GLE additional DOFs initialised from input.", verbosity.medium)
def step(self):
"""Updates the bound momentum vector with a GLE thermostat"""
p = depstrip(self.p).copy()
self.s[0,:] = self.p/self.sm
self.ethermo += np.dot(self.s[0],self.s[0])*0.5
self.s[:] = np.dot(self.T,self.s) + np.dot(self.S,self.prng.gvec(self.s.shape))
self.ethermo -= np.dot(self.s[0],self.s[0])*0.5
self.p = self.s[0]*self.sm
class ThermoNMGLE(Thermostat):
"""Represents a 'normal-modes' GLE thermostat.
An extension to the GLE thermostat which is applied in the
normal modes representation, and which allows to use a different
GLE for each normal mode
Attributes:
ns: The number of auxilliary degrees of freedom.
nb: The number of beads.
s: An array holding all the momenta, including the ones for the
auxilliary degrees of freedom.
Depend objects:
A: Drift matrix giving the damping time scales for all the different
degrees of freedom (must contain nb terms).
C: Static covariance matrix.
Satisfies A.C + C.transpose(A) = B.transpose(B), where B is the
diffusion matrix, giving the strength of the coupling of the system
with the heat bath, and thus the size of the stochastic
contribution of the thermostat.
"""
def get_C(self):
"""Calculates C from temp (if C is not set explicitely)."""
rv = np.ndarray((self.nb, self.ns+1, self.ns+1), float)
for b in range(0,self.nb):
rv[b] = np.identity(self.ns + 1,float)*self.temp
return rv[:]
def __init__(self, temp = 1.0, dt = 1.0, A = None, C = None, ethermo=0.0):
"""Initialises ThermoGLE.
Args:
temp: The simulation temperature. Defaults to 1.0.
dt: The simulation time step. Defaults to 1.0.
A: An optional matrix giving the drift matrix. Defaults to a single
value of 1.0.
C: An optional matrix giving the covariance matrix. Defaults to an
identity matrix times temperature with the same dimensions as the
total number of degrees of freedom in the system.
ethermo: The initial heat energy transferred to the bath.
Defaults to 0.0. Will be non-zero if the thermostat is
initialised from a checkpoint file.
"""
super(ThermoNMGLE,self).__init__(temp,dt,ethermo)
if A is None:
A = np.identity(1,float)
dset(self,"A",depend_value(value=A.copy(),name='A'))
self.nb = len(self.A)
self.ns = len(self.A[0]) - 1;
# now, this is tricky. if C is taken from temp, then we want it to be
# updated as a depend of temp.
# Otherwise, we want it to be an independent beast.
if C is None:
dset(self,"C",depend_value(name='C', func=self.get_C, dependencies=[dget(self,"temp")]))
else:
dset(self,"C",depend_value(value=C.copy(),name='C'))
def bind(self, nm=None, prng=None, fixdof=None):
"""Binds the appropriate degrees of freedom to the thermostat.
This takes an object with degrees of freedom, and makes their momentum
and mass vectors members of the thermostat. It also then creates the
objects that will hold the data needed in the thermostat algorithms
and the dependency network. Actually, this specific thermostat requires
being called on a beads object.
Args:
nm: An optional normal modes object to take the mass and momentum
vectors from.
prng: An optional pseudo random number generator object. Defaults to
Random().
fixdof: An optional integer which can specify the number of constraints
applied to the system. Defaults to zero.
Raises:
TypeError: Raised if no beads object is specified for
the thermostat to couple to.
"""
if nm is None or not type(nm) is NormalModes:
raise TypeError("ThermoNMGLE.bind expects a NormalModes argument to bind to")
if prng is None:
self.prng = Random()
else:
self.prng = prng
if (nm.nbeads != self.nb):
raise IndexError("The parameters in nm_gle options correspond to a bead number "+str(self.nb)+ " which does not match the number of beads in the path" + str(nm.nbeads) )
# allocates, initializes or restarts an array of s's
if self.s.shape != (self.nb, self.ns + 1, nm.natoms *3) :
if len(self.s) > 0:
warning("Mismatch in GLE s array size on restart, will reinitialise to free particle.", verbosity.low)
self.s = np.zeros((self.nb, self.ns + 1, nm.natoms*3))
# Initializes the s vector in the free-particle limit
info(" GLE additional DOFs initialised to the free-particle limit.", verbosity.low)
for b in range(self.nb):
SC = stab_cholesky(self.C[b]*Constants.kb)
self.s[b] = np.dot(SC, self.prng.gvec(self.s[b].shape))
else:
info("GLE additional DOFs initialised from input.", verbosity.medium)
prev_ethermo = self.ethermo
# creates a set of thermostats to be applied to individual normal modes
self._thermos = [ThermoGLE(temp=1, dt=1, A=self.A[b], C=self.C[b]) for b in range(self.nb)]
# must pipe all the dependencies in such a way that values for the nm
# thermostats are automatically updated based on the "master" thermostat
def make_Agetter(k):
return lambda: self.A[k]
def make_Cgetter(k):
return lambda: self.C[k]
it = 0
for t in self._thermos:
t.s = self.s[it] # gets the s's as a slice of self.s
t.bind(pm=(nm.pnm[it,:],nm.dynm3[it,:]), prng=self.prng) # bind thermostat t to the it-th normal mode
# pipes temp and dt
deppipe(self,"temp", t, "temp")
deppipe(self,"dt", t, "dt")
# here we pipe the A and C of individual NM to the "master" arrays
dget(t,"A").add_dependency(dget(self,"A"))
dget(t,"A")._func = make_Agetter(it)
dget(t,"C").add_dependency(dget(self,"C"))
dget(t,"C")._func = make_Cgetter(it)
dget(self,"ethermo").add_dependency(dget(t,"ethermo"))
it += 1
# since the ethermo will be "delegated" to the normal modes thermostats,
# one has to split
# any previously-stored value between the sub-thermostats
for t in self._thermos:
t.ethermo = prev_ethermo/self.nb
dget(self,"ethermo")._func = self.get_ethermo;
def step(self):
"""Updates the thermostat in NM representation by looping over the
individual DOFs.
"""
for t in self._thermos:
t.step()
def get_ethermo(self):
"""Computes the total energy transferred to the heat bath for all the nm
thermostats.
"""
et = 0.0;
for t in self._thermos:
et += t.ethermo
return et
class ThermoNMGLEG(ThermoNMGLE):
"""Represents a 'normal-modes' GLE thermostat + SVR.
An extension to the above NMGLE thermostat which also adds a stochastic velocity
rescaling to the centroid.
Depend objects:
tau: Thermostat damping time scale. Larger values give a less strongly
coupled thermostat.
"""
def __init__(self, temp = 1.0, dt = 1.0, A = None, C = None, tau=1.0, ethermo=0.0):
super(ThermoNMGLEG,self).__init__(temp, dt, A, C, ethermo)
dset(self,"tau",depend_value(value=tau,name='tau'))
def bind(self, nm=None, prng=None, fixdof=None):
"""Binds the appropriate degrees of freedom to the thermostat.
This takes an object with degrees of freedom, and makes their momentum
and mass vectors members of the thermostat. It also then creates the
objects that will hold the data needed in the thermostat algorithms
and the dependency network. Actually, this specific thermostat requires
being called on a beads object.
Args:
nm: An optional normal modes object to take the mass and momentum
vectors from.
prng: An optional pseudo random number generator object. Defaults to
Random().
fixdof: An optional integer which can specify the number of constraints
applied to the system. Defaults to zero.
"""
super(ThermoNMGLEG,self).bind(nm, prng, fixdof)
t = ThermoSVR(self.temp, self.dt, self.tau)
t.bind(pm=(nm.pnm[0,:],nm.dynm3[0,:]), prng=self.prng) # bind global thermostat to centroid
# pipes temp and dt
deppipe(self,"temp", t, "temp")
deppipe(self,"dt", t, "dt")
deppipe(self,"tau", t, "tau")
dget(self,"ethermo").add_dependency(dget(t,"ethermo"))
self._thermos.append(t)

View File

@ -0,0 +1,24 @@
-- Input files directory --
* This is the directory containing the input classes.
* Files:
- atoms.py: Creates objects that deal with classical simulations.
- barostats.py: Creates objects that deal with constant pressure and
stress simulations.
- beads.py: Creates objects that deal with quantum simulations.
- cell.py: Creates objects that deal with the simulation box.
- ensembles.py: Creates objects that deal with the different ensembles.
- forces.py: Creates objects that deal with the jobs to send to
the driver code.
- initializer.py: Creates the objects that deal with initializing the
simulation.
- interface.py: Creates objects that deal with socket creation.
- normalmodes.py: Creates the objects that deal with the normal mode
transformation.
- outputs.py: Creates objects that deal with output files.
- prng.py: Creates the objects that deal with random number generation.
- simulation.py: Creates objects that deal with all the top level
information, such as input/output.
- thermostats.py: Creates objects that deal with constant temperature
simulations.

View File

@ -0,0 +1,3 @@
__all__ = [ 'barostats', 'cell', 'simulation', 'ensembles', 'thermostats',
'interface', 'forces', 'atoms', 'beads', 'prng', 'outputs',
'normalmodes', 'initializer']

View File

@ -0,0 +1,121 @@
"""Deals with creating the atoms class.
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/>.
Generates an atoms class either from a set of positions and momenta.
This class is only used if no beads tag is present in the xml file.
Classes:
InputAtoms: Deals with creating the Atoms object from a file, and
writing the checkpoints.
"""
import numpy as np
from ipi.engine.atoms import *
from ipi.utils.inputvalue import *
from ipi.utils.depend import *
from ipi.utils.units import unit_to_internal
__all__ = ['InputAtoms']
class InputAtoms(Input):
"""Atoms input class.
Handles generating the appropriate atoms class from the xml input file,
and generating the xml checkpoint tags and data from an instance of the
object.
Attributes:
natoms: An optional integer giving the number of atoms. Defaults to 0.
q: An optional array giving the atom positions. Defaults to an empty
array with no elements.
p: An optional array giving the atom momenta. Defaults to an empty
array with no elements.
m: An optional array giving the atom masses. Defaults to an empty
array with no elements.
names: An optional array giving the atom names. Defaults to an empty
array with no elements
"""
fields={ "natoms" : (InputValue, {"dtype" : int,
"default" : 0,
"help" : "The number of atoms." }),
"q" : (InputArray, {"dtype" : float,
"default" : input_default(factory=np.zeros, args=(0,)),
"help" : "The positions of the atoms, in the format [x1, y1, z1, x2, ... ].",
"dimension" : "length" }),
"p" : (InputArray, {"dtype" : float,
"default" : input_default(factory=np.zeros, args=(0,)),
"help" : "The momenta of the atoms, in the format [px1, py1, pz1, px2, ... ].",
"dimension" : "momentum" }),
"m" : (InputArray, {"dtype" : float,
"default" : input_default(factory=np.zeros, args=(0,)),
"help" : "The masses of the atoms, in the format [m1, m2, ... ].",
"dimension" : "mass" }),
"names" : (InputArray, {"dtype" : str,
"default" : input_default(factory=np.zeros, args=(0,), kwargs = {'dtype': np.dtype('|S6')}),
"help" : "The names of the atoms, in the format [name1, name2, ... ]." })
}
default_help = "Deals with a single replica of the system or classical simulations."
default_label = "ATOMS"
def store(self, atoms):
"""Takes an Atoms instance and stores a minimal representation of it.
Args:
atoms: An Atoms object from which to initialise from.
filename: An optional string giving a filename to take the atom
positions from. Defaults to ''.
"""
super(InputAtoms,self).store()
self.natoms.store(atoms.natoms)
self.q.store(depstrip(atoms.q))
self.p.store(depstrip(atoms.p))
self.m.store(depstrip(atoms.m))
self.names.store(depstrip(atoms.names))
def fetch(self):
"""Creates an atoms object.
Returns:
An atoms object of the appropriate type and with the appropriate
properties given the attributes of the InputAtoms object.
"""
super(InputAtoms,self).fetch()
atoms = Atoms(self.natoms.fetch())
atoms.q = self.q.fetch()
atoms.p = self.p.fetch()
atoms.m = self.m.fetch()
atoms.names = self.names.fetch()
return atoms
def write(self, name="", indent=""):
"""Overloads Input write() function so that nothing is written if
no atoms are present. This occurs if the beads object has been specified,
so that the classical atoms object is not initialized.
Returns:
A string giving the appropriate xml tags for the checkpoint file.
"""
if self.natoms.fetch() > 0:
return super(InputAtoms,self).write(name=name,indent=indent)
else:
return ""

View File

@ -0,0 +1,107 @@
"""Deals with creating the barostat class.
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/>.
Classes:
InputBaro: Deals with creating the Barostat object from a file, and
writing the checkpoints.
"""
import numpy as np
import ipi.engine.thermostats
from ipi.engine.barostats import *
from ipi.utils.inputvalue import *
from ipi.inputs.thermostats import *
__all__ = ['InputBaro']
class InputBaro(Input):
"""Barostat input class.
Handles generating the appropriate barostat class from the xml input file,
and generating the xml checkpoint tags and data from an
instance of the object.
Attributes:
mode: An optional string giving the type of barostat used. Defaults to
'rigid'.
Fields:
thermostat: A thermostat object giving the cell thermostat.
tau: The time constant associated with the dynamics of the piston.
p: The conjugate momentum to the volume degree of freedom.
"""
attribs={ "mode": (InputAttribute, {"dtype" : str,
"default" : "dummy",
"help" : """The type of barostat. Currently, only a 'isotropic' barostat is implemented, that combines
ideas from the Bussi-Zykova-Parrinello barostat for classical MD with ideas from the
Martyna-Hughes-Tuckerman centroid barostat for PIMD; see Ceriotti, More, Manolopoulos, Comp. Phys. Comm. 2013 for
implementation details.""",
"options" : ["dummy", "isotropic"]}) }
fields={ "thermostat": (InputThermo, {"default" : input_default(factory=ipi.engine.thermostats.Thermostat),
"help" : "The thermostat for the cell. Keeps the cell velocity distribution at the correct temperature. Note that the 'pile_l', 'pile_g', 'nm_gle' and 'nm_gle_g' options will not work for this thermostat."}),
"tau": (InputValue, {"default" : 1.0,
"dtype" : float,
"dimension" : "time",
"help" : "The time constant associated with the dynamics of the piston."}),
"p": (InputArray, { "dtype" : float,
"default" : input_default(factory=np.zeros, args = (0,)),
"help" : "Momentum (or momenta) of the piston.",
"dimension" : "momentum" })
}
default_help = "Simulates an external pressure bath."
default_label = "BAROSTAT"
def store(self, baro):
"""Takes a barostat instance and stores a minimal representation of it.
Args:
baro: A barostat object.
"""
super(InputBaro,self).store(baro)
self.thermostat.store(baro.thermostat)
self.tau.store(baro.tau)
if type(baro) is BaroBZP:
self.mode.store("isotropic")
self.p.store(baro.p)
elif type(baro) is Barostat:
self.mode.store("dummy")
else:
raise TypeError("The type " + type(baro).__name__ + " is not a valid barostat type")
def fetch(self):
"""Creates a barostat object.
Returns:
A barostat object of the appropriate type and with the appropriate
thermostat given the attributes of the InputBaro object.
"""
super(InputBaro,self).fetch()
if self.mode.fetch() == "isotropic":
baro = BaroBZP(thermostat=self.thermostat.fetch(), tau=self.tau.fetch())
if self.p._explicit: baro.p = self.p.fetch()
elif self.mode.fetch() == "dummy":
baro = Barostat(thermostat=self.thermostat.fetch(), tau=self.tau.fetch())
else:
raise ValueError(self.mode.fetch() + " is not a valid mode of barostat")
return baro

View File

@ -0,0 +1,137 @@
"""Deals with creating the beads class.
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/>.
Classes:
InputBeads: Deals with creating the Beads object from a file, and
writing the checkpoints.
"""
import numpy as np
from ipi.engine.beads import *
from ipi.engine.atoms import Atoms
from ipi.utils.inputvalue import *
from ipi.utils.depend import *
from ipi.utils.units import *
from ipi.inputs.atoms import *
__all__ = ['InputBeads']
class InputBeads(Input):
"""Beads input class.
Handles generating the appropriate beads class from the xml input file,
and generating the xml checkpoint tags and data from an instance of the
object.
Attributes:
nbeads: An optional integer giving the number of beads. Defaults to 0.
natoms: An optional integer giving the number of atoms. Defaults to 0.
Fields:
q: An optional array giving the bead positions. Defaults to an empty
array with no elements.
p: An optional array giving the bead momenta. Defaults to an empty
array with no elements.
m: An optional array giving the bead masses. Defaults to an empty array
with no elements.
names: An optional array giving the bead names. Defaults to an empty
array with no elements.
"""
attribs = { "natoms" : (InputAttribute, {"dtype" : int, "default" : 0,
"help" : "The number of atoms."}),
"nbeads" : (InputAttribute, {"dtype" : int, "default" : 0,
"help" : "The number of beads."})
}
fields={ "q" : (InputArray, {"dtype" : float,
"default" : input_default(factory=np.zeros, args = (0,)),
"help" : "The positions of the beads. In an array of size [nbeads, 3*natoms].",
"dimension" : "length"}),
"p" : (InputArray, {"dtype" : float,
"default" : input_default(factory=np.zeros, args = (0,)),
"help" : "The momenta of the beads. In an array of size [nbeads, 3*natoms].",
"dimension" : "momentum"}),
"m" : (InputArray, {"dtype" : float,
"default" : input_default(factory=np.zeros, args = (0,)),
"help" : "The masses of the atoms, in the format [m1, m2, ... ].",
"dimension" : "mass"}),
"names" : (InputArray, {"dtype" : str,
"default" : input_default(factory=np.zeros, args=(0,), kwargs={'dtype': np.dtype('|S6')}),
"help" : "The names of the atoms, in the format [name1, name2, ... ]."}) }
default_help = "Describes the bead configurations in a path integral simulation."
default_label = "BEADS"
def store(self, beads):
"""Takes a Beads instance and stores a minimal representation of it.
Args:
beads: A Beads object from which to initialise from.
"""
super(InputBeads,self).store()
self.natoms.store(beads.natoms)
self.nbeads.store(beads.nbeads)
self.q.store(depstrip(beads.q))
self.p.store(depstrip(beads.p))
self.m.store(depstrip(beads.m))
self.names.store(depstrip(beads.names))
def fetch(self):
"""Creates a beads object.
Returns:
A beads object of the appropriate type and with the appropriate
properties given the attributes of the InputBeads object.
"""
super(InputBeads,self).fetch()
beads = Beads(self.natoms.fetch(),self.nbeads.fetch())
# tries to fill up with as much data as available and valid
q = self.q.fetch()
if (q.shape == (beads.nbeads,3*beads.natoms)):
beads.q = q
elif (beads.nbeads == 1 and q.shape == (3*beads.natoms,)):
beads.q = q
elif len(q) != 0:
raise ValueError("Array shape mismatches for q in <beads> input.")
p = self.p.fetch()
if (p.shape == (beads.nbeads,3*beads.natoms)):
beads.p = p
elif (beads.nbeads == 1 and p.shape == (3*beads.natoms,)):
beads.p = p
elif len(p) != 0:
raise ValueError("Array shape mismatches for p in <beads> input.")
m = self.m.fetch()
if (m.shape == (beads.natoms,)):
beads.m = m
elif len(m) != 0:
raise ValueError("Array shape mismatches for m in <beads> input.")
n = self.names.fetch()
if (n.shape == (beads.natoms,)):
beads.names = n
elif len(n) != 0:
raise ValueError("Array shape mismatches for names in <beads> input.")
return beads

View File

@ -0,0 +1,77 @@
"""Deals with creating the cell class.
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/>.
Generates an cell class from a cell vector.
Classes:
InputCell: Deals with creating the Cell object from a file, and
writing the checkpoints.
"""
import numpy as np
from copy import copy
from ipi.engine.cell import *
from ipi.utils.inputvalue import *
from ipi.utils.units import UnitMap
from ipi.utils.messages import verbosity, warning
__all__ = [ 'InputCell' ]
class InputCell(InputArray):
"""Cell input class.
Handles generating the appropriate cell class from the xml input file,
and generating the xml checkpoint tags and data from an instance of the
object.
"""
attribs = copy(InputArray.attribs)
default_help = "Deals with the cell parameters. Takes as array which can be used to initialize the cell vector matrix."
default_label = "CELL"
def __init__(self, help=None, dimension=None, units=None, default=None, dtype=None):
"""Initializes InputCell.
Just calls the parent initialization function with appropriate arguments.
"""
super(InputCell,self).__init__(dtype=float, dimension="length", default=default, help=help)
def store(self, cell):
"""Takes a Cell instance and stores of minimal representation of it.
Args:
cell: A cell object.
"""
super(InputCell,self).store(cell.h)
self.shape.store((3,3))
def fetch(self):
"""Creates a cell object.
Returns:
A cell object of the appropriate type and with the appropriate
properties given the attributes of the InputCell object.
"""
h = super(InputCell,self).fetch()
h.shape = (3,3)
return Cell(h=h)

View File

@ -0,0 +1,185 @@
"""Deals with creating the ensembles class.
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/>.
Classes:
InputEnsemble: Deals with creating the Ensemble object from a file, and
writing the checkpoints.
"""
import numpy as np
import ipi.engine.thermostats
import ipi.engine.initializer
import ipi.engine.barostats
from ipi.engine.ensembles import *
from ipi.utils.inputvalue import *
from ipi.inputs.barostats import *
from ipi.inputs.thermostats import *
from ipi.inputs.initializer import *
from ipi.utils.units import *
__all__ = ['InputEnsemble']
class InputEnsemble(Input):
"""Ensemble input class.
Handles generating the appropriate ensemble class from the xml input file,
and generating the xml checkpoint tags and data from an instance of the
object.
Attributes:
mode: An optional string giving the mode of ensemble to be simulated.
Defaults to 'unknown'.
Fields:
thermostat: The thermostat to be used for constant temperature dynamics.
barostat: The barostat to be used for constant pressure or stress
dynamics.
timestep: An optional float giving the size of the timestep in atomic
units. Defaults to 1.0.
temperature: An optional float giving the temperature in Kelvin. Defaults
to 1.0.
pressure: An optional float giving the external pressure in atomic units.
Defaults to 1.0.
fixcom: An optional boolean which decides whether the centre of mass
motion will be constrained or not. Defaults to False.
replay_file: An optional string that gives an input file name to get
a trajectory to be re-run.
"""
attribs={"mode" : (InputAttribute, {"dtype" : str,
"help" : "The ensemble that will be sampled during the simulation. 'replay' means that a simulation is restarted from a previous simulation.",
"options" : ['nve', 'nvt', 'npt', 'replay']}) }
fields={"thermostat" : (InputThermo, {"default" : input_default(factory=ipi.engine.thermostats.Thermostat),
"help" : "The thermostat for the atoms, keeps the atom velocity distribution at the correct temperature."} ),
"barostat" : (InputBaro, {"default" : input_default(factory=ipi.engine.barostats.Barostat),
"help" : InputBaro.default_help}),
"timestep": (InputValue, {"dtype" : float,
"default" : 1.0,
"help" : "The time step.",
"dimension" : "time"}),
"temperature" : (InputValue, {"dtype" : float,
"default" : 1.0,
"help" : "The temperature of the system.",
"dimension" : "temperature"}),
"pressure" : (InputValue, {"dtype" : float,
"default" : 1.0,
"help" : "The external pressure.",
"dimension" : "pressure"}),
"fixcom": (InputValue, {"dtype" : bool,
"default" : True,
"help" : "This describes whether the centre of mass of the particles is fixed."}),
"replay_file": (InputInitFile, {"default" : input_default(factory=ipi.engine.initializer.InitBase),
"help" : "This describes the location to read a trajectory file from."})
}
default_help = "Holds all the information that is ensemble specific, such as the temperature and the external pressure, and the thermostats and barostats that control it."
default_label = "ENSEMBLE"
def store(self, ens):
"""Takes an ensemble instance and stores a minimal representation of it.
Args:
ens: An ensemble object.
"""
super(InputEnsemble,self).store(ens)
if type(ens) is ReplayEnsemble:
self.mode.store("rerun")
tens = 0
elif type(ens) is NVEEnsemble:
self.mode.store("nve")
tens = 1
elif type(ens) is NVTEnsemble:
self.mode.store("nvt")
tens = 2
elif type(ens) is NPTEnsemble:
self.mode.store("npt")
tens = 3
self.timestep.store(ens.dt)
self.temperature.store(ens.temp)
if tens == 0:
self.replay_file.store(ens.intraj)
if tens > 1:
self.thermostat.store(ens.thermostat)
self.fixcom.store(ens.fixcom)
if tens > 2:
self.barostat.store(ens.barostat)
if tens == 3:
self.pressure.store(ens.pext)
def fetch(self):
"""Creates an ensemble object.
Returns:
An ensemble object of the appropriate mode and with the appropriate
objects given the attributes of the InputEnsemble object.
"""
super(InputEnsemble,self).fetch()
if self.mode.fetch() == "nve" :
ens = NVEEnsemble(dt=self.timestep.fetch(),
temp=self.temperature.fetch(), fixcom=self.fixcom.fetch())
elif self.mode.fetch() == "nvt" :
ens = NVTEnsemble(dt=self.timestep.fetch(),
temp=self.temperature.fetch(), thermostat=self.thermostat.fetch(), fixcom=self.fixcom.fetch())
elif self.mode.fetch() == "npt" :
ens = NPTEnsemble(dt=self.timestep.fetch(),
temp=self.temperature.fetch(), thermostat=self.thermostat.fetch(), fixcom=self.fixcom.fetch(),
pext=self.pressure.fetch(), barostat=self.barostat.fetch() )
elif self.mode.fetch() == "replay":
ens = ReplayEnsemble(dt=self.timestep.fetch(),
temp=self.temperature.fetch(),fixcom=False,intraj=self.replay_file.fetch() )
else:
raise ValueError("'" + self.mode.fetch() + "' is not a supported ensemble mode.")
return ens
def check(self):
"""Function that deals with optional arguments.
Makes sure that if the ensemble requires a thermostat or barostat that
they have been defined by the user and not given the default values.
"""
super(InputEnsemble,self).check()
if self.mode.fetch() == "nvt":
if self.thermostat._explicit == False:
raise ValueError("No thermostat tag supplied for NVT simulation")
if self.mode.fetch() == "npt":
if self.thermostat._explicit == False:
raise ValueError("No thermostat tag supplied for NPT simulation")
if self.barostat._explicit == False:
raise ValueError("No barostat tag supplied for NPT simulation")
if self.barostat.thermostat._explicit == False:
raise ValueError("No thermostat tag supplied in barostat for NPT simulation")
if self.timestep.fetch() <= 0:
raise ValueError("Non-positive timestep specified.")
if self.temperature.fetch() <= 0:
raise ValueError("Non-positive temperature specified.")
if self.mode.fetch() == "npt":
if not self.pressure._explicit:
raise ValueError("Pressure should be supplied for constant pressure simulation")
if self.mode.fetch() == "npt" or self.mode.fetch() == "nvt":
if not self.temperature._explicit:
raise ValueError("Temperature should be supplied for constant temperature simulation")

View File

@ -0,0 +1,176 @@
"""Deals with creating the forcefield class.
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/>.
Classes:
InputForces: Deals with creating all the forcefield objects.
InputForceBeads: Base class to deal with one particular forcefield object.
InputFBSocket: Deals with creating a forcefield using sockets.
"""
__all__ = ['InputForces', 'InputForceBeads', "InputFBSocket"]
from copy import copy
from ipi.engine.forces import *
from ipi.inputs.interface import InputInterfaceSocket
from ipi.utils.inputvalue import *
class InputForceBeads(Input):
"""ForceBeads input class.
Handles generating one instance of a particular forcefield class from the xml
input file, and generating the xml checkpoint tags and data from an
instance of the object.
Attributes:
nbeads: The number of beads that the forcefield will be evaluated on.
weight: A scaling factor for the contribution from this forcefield.
"""
attribs = { "nbeads" : ( InputAttribute, { "dtype" : int,
"default" : 0,
"help" : "If the forcefield is to be evaluated on a contracted ring polymer, this gives the number of beads that are used. If not specified, the forcefield will be evaluated on the full ring polymer." } ),
"weight" : ( InputAttribute, { "dtype" : float,
"default" : 1.0,
"help" : "A scaling factor for this forcefield, to be applied before adding the force calculated by this forcefield to the total force." } )
}
default_help = "Base class that deals with the assigning of force calculation jobs and collecting the data."
default_label = "FORCEBEADS"
def store(self, forceb):
"""Takes a ForceBeads instance and stores a minimal representation of it.
Args:
forceb: A ForceBeads object.
"""
Input.store(self,forceb)
self.nbeads.store(forceb.nbeads)
self.weight.store(forceb.weight)
def fetch(self):
"""Creates a ForceBeads object.
Returns:
A ForceBeads object.
"""
super(InputForceBeads,self).fetch()
return ForceBeads(model=ForceField(), nbeads=self.nbeads.fetch(), weight=self.weight.fetch())
def check(self):
"""Checks for optional parameters."""
super(InputForceBeads,self).check()
if self.nbeads.fetch() < 0:
raise ValueError("The forces must be evaluated over a positive number of beads.")
class InputFBSocket(InputForceBeads, InputInterfaceSocket):
"""Creates a ForceBeads object with a socket interface.
Handles generating one instance of a socket interface forcefield class.
Shares its attributes between InputForceBeads, which deals with creating the
forcefield, and InputInterfaceSocket, which deals with creating the socket
interface.
"""
attribs = copy(InputInterfaceSocket.attribs)
attribs.update(InputForceBeads.attribs)
default_help = "Deals with the assigning of force calculation jobs to different driver codes, and collecting the data, using a socket for the data communication."
default_label = "SOCKET"
def store(self, forceb):
"""Takes a ForceField instance and stores a minimal representation of it.
Args:
forceb: A ForceBeads object with a FFSocket forcemodel object.
"""
if (not type(forceb.f_model) is FFSocket):
raise TypeError("The type " + type(forceb.f_model).__name__ + " is not a valid socket forcefield")
InputForceBeads.store(self,forceb)
InputInterfaceSocket.store(self,forceb.f_model.socket)
def fetch(self):
"""Creates a ForceBeads object.
Returns:
A ForceBeads object with the correct socket parameters.
"""
return ForceBeads(model=FFSocket( interface=InputInterfaceSocket.fetch(self) ),nbeads=self.nbeads.fetch(),weight=self.weight.fetch() )
def check(self):
"""Deals with optional parameters."""
InputInterfaceSocket.check(self)
InputForceBeads.check(self)
class InputForces(Input):
"""Deals with creating all the forcefield objects required in the
simulation.
Dynamic fields:
socket: Socket object to create the server socket.
"""
#At the moment only socket driver codes implemented, other types
#could be used in principle
dynamic = { "socket" : (InputFBSocket, { "help" : InputFBSocket.default_help } )
}
default_help = "Deals with creating all the necessary forcefield objects."
default_label = "FORCES"
def fetch(self):
"""Returns a list of the output objects included in this dynamic
container.
Returns:
A list of tuples, with each tuple being of the form ('type', 'object'),
where 'type' is the type of forcefield, and 'object' is a
"""
super(InputForces, self).fetch()
flist = [ (n, f.fetch()) for (n, f) in self.extra ]
return flist
def store(self, flist):
"""Stores a list of the output objects, creating a sequence of
dynamic containers.
Args:
flist: A list of tuples, with each tuple being of the form
('type', 'object') where 'type' is the type of forcefield
and 'object' is a forcefield object of that type.
"""
super(InputForces, self).store()
self.extra = []
for el in flist:
if el[0]=="socket":
iff = InputFBSocket()
iff.store(el[1])
self.extra.append(("socket", iff))

View File

@ -0,0 +1,406 @@
"""Deals with creating the initiliazer class.
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/>.
Classes:
InputInitializer: Initializes the classes that initialize the simulation
data.
InputInitFile: Initializes the classes that initialize the simulation data
from a file. Rather than initializing one piece of data, everything that
can be initialized from that file will be.
InputInitPositions: Initializes the positions.
InputInitMomenta: Initializes the momenta.
InputInitVelocities: Initializes the velocities.
InputInitMasses: Initializes the masses.
InputInitLabels: Initializes the atom labels.
InputInitCell: Initializes the cell.
InputInitThermo: Initializes the thermostat.
InputInitBase: The base class for all Initializer objects.
InputInitIndexed: The class for all Initializer objects which can be called
to initialize data for a particular atom or bead.
"""
import numpy as np
from copy import copy, deepcopy
import ipi.utils.mathtools as mt
import ipi.engine.initializer as ei
from ipi.utils.inputvalue import *
from ipi.inputs.beads import InputBeads
from ipi.inputs.cell import InputCell
from ipi.utils.io import io_xml
from ipi.utils.messages import verbosity, warning
__all__ = ['InputInitializer', 'InputInitFile', 'InputInitPositions', 'InputInitMomenta', 'InputInitVelocities', 'InputInitMasses', 'InputInitLabels', 'InputInitCell', 'InputInitThermo']
class InputInitBase(InputValue):
"""Base class to handle initialization.
Attributes:
mode: The type of data to be initialized from.
_initclass: Which InputInit class to use to read the data.
_storageclass: Which data type to use to hold the data.
"""
attribs = deepcopy(InputValue.attribs)
attribs["mode"] = (InputAttribute,{ "dtype" : str, "default": "other", "help": "The input data format. 'xyz' and 'pdb' stand for xyz and pdb input files respectively. 'chk' stands for initialization from a checkpoint file. 'manual' means that the value to initialize from is giving explicitly as a vector. 'thermal' means that the data is to be generated from a Maxwell-Boltzmann distribution at the given temperature.", "options": None } )
default_label = "INITBASE"
default_help = "This is the base class for initialization. Initializers for different aspects of the simulation can be inherit for it for the base methods."
_initclass = ei.InitBase
_storageclass = float
def __init__(self, help=None, default=None, dtype=None, options=None, dimension=None):
"""Initializes InputInitFile.
Just calls the parent initialize function with appropriate arguments.
"""
super(InputInitBase,self).__init__(dtype=str, dimension=dimension, default=default, options=options, help=help)
def store(self, ibase):
"""Takes a InitBase instance and stores a minimal representation of it.
Args:
ibase: An input base object.
"""
if ibase.mode == "manual":
if hasattr(value, __len__):
value = io_xml.write_list(ibase.value)
else: # if it's a single value then just write the value
value = io_xml.write_type(self._storageclass, ibase.value)
else: # just store the value as a string
value = ibase.value
super(InputInitBase,self).store(value, units=ibase.units)
for k in self.attribs: # store additional attributes from the input class
self.__dict__[k].store(ibase.__dict__[k])
def getval(self):
"""Calculates the value from the data supplied in the xml file.
Either reads the string from the input file as an array of numbers,
or as a string specifying either a file name or a single value.
"""
value = super(InputInitBase,self).fetch()
if self.mode.fetch() == "manual":
if '[' in value and ']' in value: # value appears to be a list
if self._storageclass is float:
value = io_xml.read_array(np.float, value)
else:
value = io_xml.read_list(value)
else:
value = io_xml.read_type(self._storageclass, value)
else:
value = str(value) # typically this will be a no-op
return value
def fetch(self, initclass=None):
"""Creates an input base object.
Returns:
An input base object.
"""
rdict = {}
for k in self.attribs:
rdict[k] = self.__dict__[k].fetch()
if initclass is None: # allows for some flexibility in return class
initclass = self._initclass
return initclass(value=self.getval(), **rdict)
class InputInitFile(InputInitBase):
"""Class to handle initialization from a file."""
attribs = deepcopy(InputInitBase.attribs)
attribs["mode"][1]["default"] = "chk"
attribs["mode"][1]["options"] = ["xyz", "pdb", "chk"]
attribs["mode"][1]["help"] = "The input data format. 'xyz' and 'pdb' stand for xyz and pdb input files respectively. 'chk' stands for initialization from a checkpoint file."
default_label = "INITFILE"
default_help = "This is the class to initialize from file."
class InputInitThermo(InputInitBase):
"""Class to handle initialization of the thermostat."""
attribs = deepcopy(InputInitBase.attribs)
attribs["mode"][1]["default"] = "manual"
attribs["mode"][1]["options"] = ["chk", "manual"]
attribs["mode"][1]["help"] = "'chk' stands for initialization from a checkpoint file. 'manual' means that the value to initialize from is giving explicitly as a vector."
default_label = "INITTHERMO"
default_help = "This is the class to initialize the thermostat (ethermo and fictitious momenta)."
class InputInitIndexed(InputInitBase):
"""Class to handle initialization of properties which the value of each
bead and atom can be specified.
Attributes:
index: Which atom to initialize the value of.
bead: Which bead to initialize the value of.
"""
attribs = deepcopy(InputInitBase.attribs)
attribs["index"] = (InputAttribute,{ "dtype" : int, "default": -1, "help": "The index of the atom for which the value will be set. If a negative value is specified, then all atoms are assumed." } )
attribs["bead"] = (InputAttribute,{ "dtype" : int, "default": -1, "help": "The index of the bead for which the value will be set. If a negative value is specified, then all beads are assumed." } )
default_label = "INITINDEXED"
default_help = "This is a helper class to initialize with an index."
class InputInitPositions(InputInitIndexed):
"""Class to handle initialization of the positions."""
attribs = deepcopy(InputInitIndexed.attribs)
attribs["mode"][1]["default"] = "chk"
attribs["mode"][1]["options"] = ["manual", "xyz", "pdb", "chk"]
attribs["mode"][1]["help"] = "The input data format. 'xyz' and 'pdb' stand for xyz and pdb input files respectively. 'chk' stands for initialization from a checkpoint file. 'manual' means that the value to initialize from is giving explicitly as a vector."
default_label = "INITPOSITIONS"
default_help = "This is the class to initialize positions."
_initclass = ei.InitIndexed
class InputInitMomenta(InputInitPositions):
"""Class to handle initialization of the momenta."""
attribs = deepcopy(InputInitPositions.attribs)
attribs["mode"][1]["options"].append( "thermal" )
attribs["mode"][1]["help"] = "The input data format. 'xyz' and 'pdb' stand for xyz and pdb input files respectively. 'chk' stands for initialization from a checkpoint file. 'manual' means that the value to initialize from is giving explicitly as a vector. 'thermal' means that the data is to be generated from a Maxwell-Boltzmann distribution at the given temperature."
default_label = "INITMOMENTA"
default_help = "This is the class to initialize momenta."
def fetch(self):
"""Creates an momentum initializer object.
Note that the momenta can be initialized by a single value, specifying
the temperature at which to thermalize the momenta.
"""
if self.mode.fetch() == "thermal":
return self._initclass(value=float(InputValue.fetch(self)), mode=self.mode.fetch(), units=self.units.fetch(), index=self.index.fetch(), bead=self.bead.fetch())
else:
return super(InputInitMomenta,self).fetch()
class InputInitVelocities(InputInitMomenta):
"""Class to handle initialization of the velocities."""
attribs = deepcopy(InputInitMomenta.attribs)
default_label = "INITVELOCITIES"
default_help = "This is the class to initialize velocities."
class InputInitMasses(InputInitPositions):
"""Class to handle initialization of the masses."""
attribs = deepcopy(InputInitPositions.attribs)
default_label = "INITMASSES"
default_help = "This is the class to initialize atomic masses."
class InputInitLabels(InputInitPositions):
"""Class to handle initialization of the atom labels."""
attribs = deepcopy(InputInitPositions.attribs)
default_label = "INITLABELS"
default_help = "This is the class to initialize atomic labels."
_storageclass = str
class InputInitCell(InputInitBase):
"""Class to handle initialization of the cell."""
attribs = deepcopy(InputInitBase.attribs)
attribs["mode"] = (InputAttribute, { "dtype" : str,
"default": "manual",
"options": ["manual", "pdb", "chk", "abc", "abcABC"],
"help" : "This decides whether the system box is created from a cell parameter matrix, or from the side lengths and angles between them. If 'mode' is 'manual', then 'cell' takes a 9-elements vector containing the cell matrix (row-major). If 'mode' is 'abcABC', then 'cell' takes an array of 6 floats, the first three being the length of the sides of the system parallelopiped, and the last three being the angles (in degrees) between those sides. Angle A corresponds to the angle between sides b and c, and so on for B and C. If mode is 'abc', then this is the same as for 'abcABC', but the cell is assumed to be orthorhombic. 'pdb' and 'chk' read the cell from a PDB or a checkpoint file, respectively."} )
default_label = "INITCELL"
default_help = "This is the class to initialize cell."
def fetch(self):
"""Creates a cell initializer object.
Note that the cell can be initialized from the lengths of the sides and
the angles between them instead of by a vector, as specified by the
'abc' or 'abcABC' modes.
"""
mode = self.mode.fetch()
ibase = super(InputInitCell,self).fetch()
if mode == "abc" or mode == "abcABC":
h = io_xml.read_array(np.float, ibase.value)
if mode == "abc":
if h.size != 3:
raise ValueError("If you are initializing cell from cell side lengths you must pass the 'cell' tag an array of 3 floats.")
else:
h = mt.abc2h(h[0], h[1], h[2], np.pi/2, np.pi/2, np.pi/2)
elif mode == "abcABC":
if h.size != 6:
raise ValueError("If you are initializing cell from cell side lengths and angles you must pass the 'cell' tag an array of 6 floats.")
else:
h = mt.abc2h(h[0], h[1], h[2], h[3]*np.pi/180.0, h[4]*np.pi/180.0, h[5]*np.pi/180.0)
h.shape = (9,)
ibase.value = h
mode = "manual"
if mode == "manual":
h = ibase.value
if h.size != 9:
raise ValueError("Cell objects must contain a 3x3 matrix describing the cell vectors.")
if not (h[3] == 0.0 and h[6] == 0.0 and h[7] == 0.0):
warning("Cell vector matrix must be upper triangular, all elements below the diagonal being set to zero.", verbosity.low)
h[3] = h[6] = h[7] = 0
ibase.value = h
return self._initclass(value=ibase.value, mode=mode, units=self.units.fetch())
class InputInitializer(Input):
"""Input class to handle initialization.
Attributes:
nbeads: The number of beads to be used in the simulation.
Dynamic fields:
positions: An object to initialize the positions from.
velocities: An object to initialize the velocities from.
momenta: An object to initialize the momenta from.
cell: An object to initialize the cell from.
masses: An object to initialize the masses from.
labels: An object to initialize the labels from.
gle: An object to initialize the GLE matrices from.
file: A file from which to initialize multiple properties from. Anything
that can be initialized either directly or indirectly from this file
will be.
"""
attribs = { "nbeads" : (InputAttribute, {"dtype" : int,
"help" : "The number of beads. Will override any provision from inside the initializer. A ring polymer contraction scheme is used to scale down the number of beads if required. If instead the number of beads is scaled up, higher normal modes will be initialized to zero."})
}
dynamic = {
"positions" : (InputInitPositions, { "help" : "Initializes atomic positions. Will take a 'units' attribute of dimension 'length'"}),
"velocities" : (InputInitVelocities, { "help" : "Initializes atomic velocities. Will take a 'units' attribute of dimension 'velocity'" }),
"momenta" : (InputInitMomenta, { "help" : "Initializes atomic momenta. Will take a 'units' attribute of dimension 'momentum'" }),
"masses" : (InputInitMasses, { "help" : "Initializes atomic masses. Will take a 'units' attribute of dimension 'mass'" }),
"labels" : (InputInitLabels, { "help" : "Initializes atomic labels" }),
"cell" : (InputInitCell, { "help" : "Initializes the configuration of the cell. Will take a 'units' attribute of dimension 'length'" }),
"file" : (InputInitFile, { "help" : "Initializes everything possible for the given mode. Will take a 'units' attribute of dimension 'length'. The unit conversion will only be applied to the positions and cell parameters." }),
"gle" : (InputInitThermo, { "help" : "Initializes the additional momenta in a GLE thermostat." })
}
default_help = "Specifies the number of beads, and how the system should be initialized."
default_label = "INITIALIZER"
def write(self, name="", indent=""):
"""Overloads Input write() function so that we never write out
InputInitializer to restart files.
Returns:
An empty string.
"""
return ""
def store(self, ii):
"""Takes a Initializer instance and stores a minimal representation of it.
Args:
ii: An initializer object.
"""
self.extra = []
for (k, el) in ii.queue:
if k == "positions" :
ip = InputInitPositions()
ip.store(el)
elif k == "velocities" :
ip = InputInitVelocities()
ip.store(el)
elif k == "momenta" :
ip = InputInitMomenta()
ip.store(el)
elif k == "masses" :
ip = InputInitMasses()
ip.store(el)
elif k == "labels" :
ip = InputInitLabels()
ip.store(el)
elif k == "cell" :
ip = InputInitCell()
ip.store(el)
elif k == "gle" :
ip = InputInitThermo()
ip.store(el)
self.extra.append((k, ip))
self.nbeads.store(ii.nbeads)
def fetch(self):
"""Creates an initializer object.
Returns:
An initializer object.
"""
super(InputInitializer,self).fetch()
initlist = []
for (k,v) in self.extra:
if v.mode.fetch() == "chk" and v.fetch(initclass=ei.InitIndexed).units != "":
raise ValueError("Cannot specify units for initialization from a checkpoint file - units should be defined _inside_ the file.")
if k == "file":
mode = v.mode.fetch()
if mode == "xyz" or mode == "manual" or mode == "pdb" or mode == "chk":
initlist.append( ( "positions", v.fetch(initclass=ei.InitIndexed) ) )
if mode == "xyz" or mode == "pdb" or mode == "chk":
rm = v.fetch(initclass=ei.InitIndexed)
rm.units = ""
initlist.append( ( "masses", rm ) )
initlist.append( ( "labels", v.fetch(initclass=ei.InitIndexed) ) )
if mode == "pdb" or mode == "chk":
initlist.append( ( "cell", v.fetch(initclass=ei.InitIndexed) ) )
if mode == "chk":
rm = v.fetch(initclass=ei.InitIndexed)
rm.units = ""
initlist.append( ( "momenta", rm ) )
else:
initlist.append( (k, v.fetch()) )
return ei.Initializer(self.nbeads.fetch(), initlist )

View File

@ -0,0 +1,125 @@
"""Deals with creating the interface between the wrapper and the socket.
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/>.
Classes:
InputInterface: Deals with creating the Interface object from a file, and
writing the checkpoints.
"""
__all__ = [ 'InputInterfaceSocket' ]
import socket, select, threading, signal, string, os, time
import numpy as np
from ipi.utils.messages import verbosity, warning
from ipi.utils.inputvalue import *
from ipi.interfaces.sockets import *
class InputInterfaceSocket(Input):
"""Interface input class.
Handles generating the apporopriate interface class from the xml
input file, and generating the xml checkpoin tags and data from an
instance of the object.
Attributes:
mode: A string giving the type of socket used.
pbc: A boolean giving whether the atom positions will be folded back
into the unit cell before being sent through the socket or not.
Fields:
address: A string giving the host name.
port: An integer giving the port used by the socket.
slots: An integer giving the maximum allowed backlog of queued clients.
latency: A float giving the number of seconds that the interface waits
before updating the client list.
timeout: A float giving a number of seconds after which a calculation core
is considered dead. Defaults to zero, i.e. no timeout.
"""
fields = {"address": (InputValue, {"dtype" : str,
"default" : "localhost",
"help" : "This gives the server address that the socket will run on." } ),
"port": (InputValue, {"dtype" : int,
"default" : 65535,
"help" : "This gives the port number that defines the socket."} ),
"slots": (InputValue, {"dtype" : int,
"default" : 4,
"help" : "This gives the number of client codes that can queue at any one time."} ),
"latency": (InputValue, {"dtype" : float,
"default" : 1e-3,
"help" : "This gives the number of seconds between each check for new clients."} ),
"timeout": (InputValue, {"dtype" : float,
"default" : 0.0,
"help" : "This gives the number of seconds before assuming a calculation has died. If 0 there is no timeout." } )}
attribs = { "mode": (InputAttribute, {"dtype" : str,
"options" : [ "unix", "inet" ],
"default" : "inet",
"help" : "Specifies whether the driver interface will listen onto a internet socket [inet] or onto a unix socket [unix]." } ),
"pbc": ( InputAttribute, { "dtype" : bool,
"default" : True,
"help" : "Applies periodic boundary conditions to the atoms coordinates before passing them on to the driver code." })
}
default_help = "Specifies the parameters for the socket interface."
default_label = "INTERFACE"
def store(self, iface):
"""Takes an Interface instance and stores a minimal representation of it.
Args:
iface: An interface object.
"""
super(InputInterfaceSocket,self).store(iface)
self.latency.store(iface.latency)
self.mode.store(iface.mode)
self.address.store(iface.address)
self.port.store(iface.port)
self.slots.store(iface.slots)
self.timeout.store(iface.timeout)
self.pbc.store(iface.dopbc)
def fetch(self):
"""Creates an InterfaceSocket object.
Returns:
An interface object with the appropriate socket given the attributes
of the InputInterfaceSocket object.
"""
super(InputInterfaceSocket,self).fetch()
return InterfaceSocket(address=self.address.fetch(), port=self.port.fetch(),
slots=self.slots.fetch(), mode=self.mode.fetch(),
latency=self.latency.fetch(), timeout=self.timeout.fetch(), dopbc=self.pbc.fetch())
def check(self):
"""Function that deals with optional arguments."""
super(InputInterfaceSocket,self).check()
if self.port.fetch() < 1 or self.port.fetch() > 65535:
raise ValueError("Port number " + str(self.port.fetch()) + " out of acceptable range.")
elif self.port.fetch() < 1025:
warning("Low port number being used, this may interrupt important system processes.", verbosity.low)
if self.slots.fetch() < 1 or self.slots.fetch() > 5:
raise ValueError("Slot number " + str(self.slots.fetch()) + " out of acceptable range.")
if self.latency.fetch() < 0:
raise ValueError("Negative latency parameter specified.")
if self.timeout.fetch() < 0.0:
raise ValueError("Negative timeout parameter specified.")

View File

@ -0,0 +1,84 @@
"""Deals with creating the normal mode representation arrays.
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/>.
Classes:
InputNormalModes: Deals with creating the normal mode objects.
"""
import numpy as np
from copy import copy
from ipi.engine.normalmodes import *
from ipi.utils.inputvalue import *
from ipi.utils.units import *
__all__ = ['InputNormalModes']
class InputNormalModes(InputArray):
""" Storage class for NormalModes engine.
Describes how normal-modes transformation and integration should be
performed.
Attributes:
mode: Specifies the method by which the dynamical masses are created.
transform: Specifies whether the normal mode calculation will be
done using a FFT transform or a matrix multiplication.
"""
attribs = copy(InputArray.attribs)
attribs["mode"] = (InputAttribute, {"dtype" : str,
"default" : "rpmd",
"help" : "Specifies the technique to be used to calculate the dynamical masses. 'rpmd' simply assigns the bead masses the physical mass. 'manual' sets all the normal mode frequencies except the centroid normal mode manually. 'pa-cmd' takes an argument giving the frequency to set all the non-centroid normal modes to. 'wmax-cmd' is similar to 'pa-cmd', except instead of taking one argument it takes two ([wmax,wtarget]). The lowest-lying normal mode will be set to wtarget for a free particle, and all the normal modes will coincide at frequency wmax. ",
"options" : ['pa-cmd', 'wmax-cmd', 'manual', 'rpmd']})
attribs["transform"] = (InputValue,{"dtype" : str,
"default" : "fft",
"help" : "Specifies whether to calculate the normal mode transform using a fast Fourier transform or a matrix multiplication. For small numbers of beads the matrix multiplication may be faster.",
"options" : ['fft', 'matrix']})
default_help = "Deals with the normal mode transformations, including the adjustment of bead masses to give the desired ring polymer normal mode frequencies if appropriate. Takes as arguments frequencies, of which different numbers must be specified and which are used to scale the normal mode frequencies in different ways depending on which 'mode' is specified."
default_label = "NORMALMODES"
def __init__(self, help=None, dimension=None, default=None, dtype=None):
""" Initializes InputNormalModes.
Just calls the parent initialization function with appropriate arguments.
"""
super(InputNormalModes,self).__init__(help=help, default=default, dtype=float, dimension="frequency")
def store(self, nm):
"""Takes a normal modes instance and stores a minimal representation
of it.
Args:
nm: A normal modes object.
"""
super(InputNormalModes,self).store(nm.nm_freqs)
self.mode.store(nm.mode)
self.transform.store(nm.transform_method)
def fetch(self):
"""Creates a normal modes object.
Returns:
A normal modes object.
"""
super(InputNormalModes,self).check()
return NormalModes(self.mode.fetch(), self.transform.fetch(), super(InputNormalModes,self).fetch() )

View File

@ -0,0 +1,323 @@
"""Deals with creating the output objects.
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/>.
Classes:
InputOutputs: Creates a list of all the output objects.
InputProperties: Deals with property output.
InputTrajectory: Deals with trajectory output.
InputCheckpoint: Deals with restart file output.
"""
import numpy as np
from copy import copy
import ipi.engine.outputs
from ipi.utils.depend import *
from ipi.utils.inputvalue import *
from ipi.engine.properties import getkey
__all__=['InputOutputs', 'InputProperties', 'InputTrajectory',
'InputCheckpoint']
class InputProperties(InputArray):
"""Simple input class to describe output for properties.
Storage class for PropertyOutput.
Attributes:
filename: The name of the file to output to.
stride: The number of steps that should be taken between outputting the
data to file.
flush: An integer describing how often the output streams are flushed,
so that it doesn't wait for the buffer to fill before outputting to
file.
"""
default_help = """This class deals with the output of properties to one file. Between each property tag there should be an array of strings, each of which specifies one property to be output."""
default_label = "PROPERTIES"
attribs = copy(InputArray.attribs)
attribs["filename"] = (InputAttribute,{ "dtype" : str, "default": "out",
"help": "A string to specify the name of the file that is output. The file name is given by 'prefix'.'filename' + format_specifier. The format specifier may also include a number if multiple similar files are output."} )
attribs["stride"] = (InputAttribute,{ "dtype" : int, "default": 1,
"help": "The number of steps between successive writes." } )
attribs["flush"] = (InputAttribute, {"dtype" : int, "default" : 1,
"help" : "How often should streams be flushed. 1 means each time, zero means never." })
def __init__(self, help=None, default=None, dtype=None, dimension=None):
"""Initializes InputProperties.
Just calls the parent initialization function with appropriate arguments.
"""
super(InputProperties,self).__init__(help=help, default=default, dtype=str, dimension=dimension)
def fetch(self):
"""Returns a PropertyOutput object."""
return ipi.engine.outputs.PropertyOutput(filename=self.filename.fetch(),
stride=self.stride.fetch(), flush=self.flush.fetch(), outlist=super(InputProperties,self).fetch())
def store(self, prop):
"""Stores a PropertyOutput object."""
super(InputProperties,self).store(prop.outlist)
self.stride.store(prop.stride)
self.flush.store(prop.flush)
self.filename.store(prop.filename)
def check(self):
"""Checks for optional parameters."""
super(InputProperties,self).check()
if self.stride.fetch() < 0:
raise ValueError("The stride length for the properties file output must be positive.")
class InputTrajectory(InputValue):
"""Simple input class to describe output for trajectories.
Storage class for TrajectoryOutput.
Attributes:
filename: The (base) name of the file to output to.
stride: The number of steps that should be taken between outputting the
data to file.
format: The format of the trajectory output file.
cell_units: The units that the cell parameters are given in.
bead: If the trajectory is a per-bead property, this can be used to
specify a single bead to output. If negative, it defaults to
the centroid.
flush: An integer describing how often the output streams are flushed,
so that it doesn't wait for the buffer to fill before outputting to
file.
"""
default_help = """This class defines how one trajectory file should be output. Between each trajectory tag one string should be given, which specifies what data is to be output."""
default_label = "TRAJECTORY"
attribs = copy(InputValue.attribs)
attribs["filename"] = (InputAttribute,{ "dtype" : str, "default": "traj",
"help": "A string to specify the name of the file that is output. The file name is given by 'prefix'.'filename' + format_specifier. The format specifier may also include a number if multiple similar files are output."} )
attribs["stride"] = (InputAttribute,{ "dtype" : int, "default": 1,
"help": "The number of steps between successive writes." } )
attribs["format"] = (InputAttribute,{ "dtype" : str, "default": "xyz",
"help": "The output file format.",
"options": ['xyz', 'pdb'] } )
attribs["cell_units"] = (InputAttribute,{ "dtype" : str, "default": "",
"help": "The units for the cell dimensions." } )
attribs["bead"] = (InputAttribute,{ "dtype" : int, "default": -1,
"help": "Print out only the specified bead. A negative value means print all." } )
attribs["flush"] = (InputAttribute, {"dtype" : int, "default" : 1,
"help" : "How often should streams be flushed. 1 means each time, zero means never." })
def __init__(self, help=None, default=None, dtype=None, dimension=None):
"""Initializes InputTrajectory.
Just calls the parent initialization function with appropriate arguments.
"""
super(InputTrajectory,self).__init__(help=help, default=default, dtype=str, dimension=dimension)
def fetch(self):
"""Returns a TrajectoryOutput object."""
return ipi.engine.outputs.TrajectoryOutput(filename=self.filename.fetch(), stride=self.stride.fetch(),
flush=self.flush.fetch(), what=super(InputTrajectory,self).fetch(),
format=self.format.fetch(), cell_units=self.cell_units.fetch(), ibead=self.bead.fetch())
def store(self, traj):
"""Stores a PropertyOutput object."""
super(InputTrajectory,self).store(traj.what)
self.stride.store(traj.stride)
self.flush.store(traj.flush)
self.filename.store(traj.filename)
self.format.store(traj.format)
self.cell_units.store(traj.cell_units)
self.bead.store(traj.ibead)
def check(self):
"""Checks for optional parameters."""
super(InputTrajectory,self).check()
if self.stride.fetch() < 0:
raise ValueError("The stride length for the trajectory file output must be positive.")
class InputCheckpoint(InputValue):
"""Simple input class to describe output for properties.
Storage class for CheckpointOutput.
Attributes:
filename: The (base) name of the file to output to.
stride: The number of steps that should be taken between outputting the
data to file.
overwrite: whether checkpoints should be overwritten, or multiple
files output.
"""
default_help = """This class defines how a checkpoint file should be output. Optionally, between the checkpoint tags, you can specify one integer giving the current step of the simulation. By default this integer will be zero."""
default_label = "CHECKPOINT"
attribs=copy(InputValue.attribs)
attribs["filename"] = (InputAttribute,{ "dtype" : str, "default": "restart",
"help": "A string to specify the name of the file that is output. The file name is given by 'prefix'.'filename' + format_specifier. The format specifier may also include a number if multiple similar files are output."} )
attribs["stride"] = (InputAttribute,{ "dtype" : int, "default": 1,
"help": "The number of steps between successive writes." } )
attribs["overwrite"] = (InputAttribute,{ "dtype" : bool, "default": True,
"help": "This specifies whether or not each consecutive checkpoint file will overwrite the old one."} )
def __init__(self, help=None, default=None, dtype=None, dimension=None):
"""Initializes InputCheckpoint.
Just calls the parent initialization function with appropriate arguments.
"""
super(InputCheckpoint,self).__init__(help=help, default=default, dtype=int, dimension=dimension)
def fetch(self):
"""Returns a CheckpointOutput object."""
step = super(InputCheckpoint,self).fetch()
return ipi.engine.outputs.CheckpointOutput(self.filename.fetch(), self.stride.fetch(), self.overwrite.fetch(), step=step )
def parse(self, xml=None, text=""):
"""Overwrites the standard parse function so that we can specify this tag
in the input without any data.
We can use the syntax <checkpoint /> to do this
Args:
xml: An xml node containing all the data for the parent tag.
text: The data to read the data from. Will be None if we have not
specified any data.
"""
# just a quick hack to allow an empty element
try:
super(InputCheckpoint,self).parse(xml,text)
except: #TODO make this except a specific exception, not every one
self.value = 0 #This could hide actual errors, at least in theory.
def store(self, chk):
"""Stores a CheckpointOutput object."""
super(InputCheckpoint,self).store(chk.step)
self.stride.store(chk.stride)
self.filename.store(chk.filename)
self.overwrite.store(chk.overwrite)
def check(self):
"""Checks for optional parameters."""
super(InputCheckpoint,self).check()
if self.stride.fetch() < 0:
raise ValueError("The stride length for the checkpoint file output must be positive.")
class InputOutputs(Input):
""" List of outputs input class.
An example of a dynamic input class: a variable number of tags might be
present, corresponding to different output requests. This allows for
instance to print multiple property outputs, with different content
and/or output frequency.
Attributes:
prefix: A string that will be appended to all output files from this
simulation.
Dynamic fields:
trajectory: Specifies a trajectory to be output
properties: Specifies some properties to be output.
checkpoint: Specifies a checkpoint file to be output.
"""
attribs = { "prefix" : ( InputAttribute, { "dtype" : str,
"default" : "i-pi",
"help" : "A string that will be prepended to each output file name. The file name is given by 'prefix'.'filename' + format_specifier. The format specifier may also include a number if multiple similar files are output." })
}
dynamic = { "properties" : (InputProperties, { "help" : "Each of the properties tags specify how to create a file in which one or more properties are written, one line per frame. " } ),
"trajectory" : (InputTrajectory, { "help" : "Each of the trajectory tags specify how to create a trajectory file, containing a list of per-atom coordinate properties. " } ),
"checkpoint" : (InputCheckpoint, { "help" : "Each of the checkpoint tags specify how to create a checkpoint file, which can be used to restart a simulation. " } ),
}
default_help = """This class defines how properties, trajectories and checkpoints should be output during the simulation. May contain zero, one or many instances of properties, trajectory or checkpoint tags, each giving instructions on how one output file should be created and managed."""
default_label = "OUTPUTS"
@classmethod
def make_default(cls):
"""Used to make the default value of the outputs class for use when no
output is specified.
Needed since this is a fairly complicated default, with many mutable
objects, and the default has to be generated by a function that does not
use any mutable objects as arguments.
"""
return [ ipi.engine.outputs.PropertyOutput(filename="i-pi.md", stride=10, outlist=[ "time", "step", "conserved", "temperature", "potential", "kinetic_cv" ] ),
ipi.engine.outputs.TrajectoryOutput(filename="i-pi.pos", stride=100, what="positions", format="xyz"),
ipi.engine.outputs.CheckpointOutput(filename="i-pi.checkpoint", stride=1000, overwrite=True)]
def fetch(self):
"""Returns a list of the output objects included in this dynamic
container.
Returns:
A list of tuples, with each tuple being of the form ('type', 'object')
where 'type' is the type of output object and 'object' is a particular
object of that type.
"""
super(InputOutputs, self).fetch()
outlist = [ p.fetch() for (n, p) in self.extra ]
prefix = self.prefix.fetch()
if not prefix == "":
for p in outlist:
p.filename = prefix + "." + p.filename
return outlist
def store(self, plist):
""" Stores a list of the output objects, creating a sequence of
dynamic containers.
Args:
plist: A list of tuples, with each tuple being of the form
('type', 'object') where 'type' is the type of forcefield and
'object' is a particular object of that type.
"""
super(InputOutputs, self).store()
self.extra = []
self.prefix.store("")
for el in plist:
if (isinstance(el, ipi.engine.outputs.PropertyOutput)):
ip = InputProperties()
ip.store(el)
self.extra.append(("properties", ip))
elif (isinstance(el, ipi.engine.outputs.TrajectoryOutput)):
ip = InputTrajectory()
ip.store(el)
self.extra.append(("trajectory", ip))
elif (isinstance(el, ipi.engine.outputs.CheckpointOutput)):
ip = InputCheckpoint()
ip.store(el)
self.extra.append(("checkpoint", ip))

View File

@ -0,0 +1,101 @@
"""Deals with creating the random number generator.
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/>.
Generates a random number generator either from a seed number, or from a
state vector.
Classes:
InputRandom: Deals with creating the Random object from a file, and
writing the checkpoints.
"""
__all__ = ['InputRandom']
import numpy as np
from ipi.utils.prng import *
from ipi.utils.inputvalue import *
class InputRandom(Input):
"""Random input class.
Handles generating the appropriate random number class from the xml
input file, and generating the xml checkpoint tags and data from an
instance of the object.
Attributes:
seed: An optional integer giving a seed to initialise the random number
generator from. Defaults to 123456.
state: An optional array giving the state of the random number generator.
Defaults to an empty array.
has_gauss: An optional integer giving whether there is a stored
Gaussian number or not. Defaults to 0.
gauss: An optional float giving the stored Gaussian number. Defaults to
0.0.
set_pos: An optional integer giving the position in the state array
that is being read from. Defaults to 0.
"""
fields = {"seed" : (InputValue, {"dtype" : int,
"default" : 123456,
"help" : "This is the seed number used to generate the initial state of the random number generator."}),
"state" : (InputArray, {"dtype" : np.uint,
"default" : input_default(factory=np.zeros, kwargs={'shape': (0,), 'dtype': np.uint}),
"help" : "Gives the state vector for the random number generator. Avoid directly modifying this unless you are very familiar with the inner workings of the algorithm used."}),
"has_gauss" : (InputValue, {"dtype" : int,
"default" : 0,
"help" : "Determines whether there is a stored gaussian number or not. A value of 0 means there is none stored."}),
"gauss" : (InputValue, {"dtype" : float,
"default" : 0.00,
"help" : "The stored Gaussian number." }),
"set_pos" : (InputValue, {"dtype" : int,
"default" : 0,
"help" : "Gives the position in the state array that the random number generator is reading from."})}
default_help = "Deals with the pseudo-random number generator."
default_label = "PRNG"
def store(self, prng):
"""Takes a random number instance and stores a minimal
representation of it.
Args:
prng: A random number object from which to initialise from.
"""
super(InputRandom,self).store(prng)
self.seed.store(prng.seed)
gstate = prng.state
self.state.store(gstate[1])
self.set_pos.store(gstate[2])
self.has_gauss.store(gstate[3])
self.gauss.store(gstate[4])
def fetch(self):
"""Creates a random number object.
Returns:
An random number object of the appropriate type and with the
appropriate properties given the attributes of the InputRandom
object.
"""
super(InputRandom,self).fetch()
if not self.state._explicit:
return Random(seed=self.seed.fetch())
else:
return Random(state=('MT19937',self.state.fetch(), self.set_pos.fetch(), self.has_gauss.fetch(), self.gauss.fetch() ))

View File

@ -0,0 +1,193 @@
"""Deals with creating the simulation class.
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/>.
Classes:
InputSimulation: Deals with creating the Simulation object from a file, and
writing the checkpoints.
"""
__all__ = ['InputSimulation']
import numpy as np
import os.path, sys
import ipi.engine.simulation
from ipi.utils.depend import *
from ipi.utils.inputvalue import *
from ipi.utils.units import *
from ipi.utils.prng import *
from ipi.utils.io import *
from ipi.utils.io.io_xml import *
from ipi.utils.messages import verbosity
from ipi.inputs.forces import InputForces
from ipi.inputs.prng import InputRandom
from ipi.inputs.initializer import InputInitializer
from ipi.inputs.beads import InputBeads
from ipi.inputs.cell import InputCell
from ipi.inputs.ensembles import InputEnsemble
from ipi.inputs.outputs import InputOutputs
from ipi.inputs.normalmodes import InputNormalModes
from ipi.engine.normalmodes import NormalModes
from ipi.engine.atoms import Atoms
from ipi.engine.beads import Beads
from ipi.engine.cell import Cell
from ipi.engine.initializer import Initializer
class InputSimulation(Input):
"""Simulation input class.
Handles generating the appropriate forcefield class from the xml input file,
and generating the xml checkpoint tags and data from an instance of the
object.
Attributes:
verbosity: A string saying how much should be output to standard output.
Fields:
force: A restart force instance. Used as a model for all the replicas.
ensemble: A restart ensemble instance.
beads: A restart beads instance.
normal_modes: Setup of normal mode integrator.
cell: A restart cell instance.
output: A list of the required outputs.
prng: A random number generator object.
step: An integer giving the current simulation step. Defaults to 0.
total_steps: The total number of steps. Defaults to 1000
total_time: The wall clock time limit. Defaults to 0 (no limit).
initialize: An array of strings giving all the quantities that should
be output.
"""
fields = { "forces" : (InputForces, { "help" : InputForces.default_help }),
"ensemble": (InputEnsemble, { "help" : InputEnsemble.default_help } ),
"prng" : (InputRandom, { "help" : InputRandom.default_help,
"default" : input_default(factory=Random)} ),
"initialize" : (InputInitializer, { "help" : InputInitializer.default_help,
"default" : input_default(factory=Initializer) } ),
"beads" : (InputBeads, { "help" : InputBeads.default_help,
"default" : input_default(factory=Beads, kwargs={'natoms': 0, 'nbeads': 0}) } ),
"normal_modes" : (InputNormalModes, { "help" : InputNormalModes.default_help,
"default" : input_default(factory=NormalModes, kwargs={'mode': "rpmd"}) } ),
"cell" : (InputCell, { "help" : InputCell.default_help,
"default" : input_default(factory=Cell) }),
"output" : (InputOutputs, { "help" : InputOutputs.default_help,
"default": input_default(factory=InputOutputs.make_default) }),
"step" : ( InputValue, { "dtype" : int,
"default" : 0,
"help" : "The current simulation time step." }),
"total_steps": ( InputValue, { "dtype" : int,
"default" : 1000,
"help" : "The total number of steps that will be done. If 'step' is equal to or greater than 'total_steps', then the simulation will finish." }),
"total_time" : ( InputValue, { "dtype" : float,
"default" : 0,
"help" : "The maximum wall clock time (in seconds)." }),
}
attribs = { "verbosity" : (InputAttribute, { "dtype" : str,
"default" : "low",
"options" : [ "quiet", "low", "medium", "high", "debug" ],
"help" : "The level of output on stdout."
})
}
default_help = "This is the top level class that deals with the running of the simulation, including holding the simulation specific properties such as the time step and outputting the data."
default_label = "SIMULATION"
def store(self, simul):
"""Takes a simulation instance and stores a minimal representation of it.
Args:
simul: A simulation object.
"""
super(InputSimulation,self).store()
self.forces.store(simul.flist)
self.ensemble.store(simul.ensemble)
self.beads.store(simul.beads)
self.normal_modes.store(simul.nm)
self.cell.store(simul.cell)
self.prng.store(simul.prng)
self.step.store(simul.step)
self.total_steps.store(simul.tsteps)
self.total_time.store(simul.ttime)
self.output.store(simul.outputs)
# this we pick from the messages class. kind of a "global" but it seems to
# be the best way to pass around the (global) information on the level of output.
if verbosity.debug:
self.verbosity.store("debug")
elif verbosity.high:
self.verbosity.store("high")
elif verbosity.medium:
self.verbosity.store("medium")
elif verbosity.low:
self.verbosity.store("low")
elif verbosity.quiet:
self.verbosity.store("quiet")
else:
raise ValueError("Invalid verbosity level")
def fetch(self):
"""Creates a simulation object.
Returns:
A simulation object of the appropriate type and with the appropriate
properties and other objects given the attributes of the
InputSimulation object.
Raises:
TypeError: Raised if one of the file types in the stride keyword
is incorrect.
"""
super(InputSimulation,self).fetch()
# small hack: initialize here the verbosity level -- we really assume to have
# just one simulation object
verbosity.level=self.verbosity.fetch()
# this creates a simulation object which gathers all the little bits
#TODO use named arguments since this list is a bit too long...
rsim = ipi.engine.simulation.Simulation(self.beads.fetch(), self.cell.fetch(),
self.forces.fetch(), self.ensemble.fetch(), self.prng.fetch(),
self.output.fetch(), self.normal_modes.fetch(),
self.initialize.fetch(), self.step.fetch(),
tsteps=self.total_steps.fetch(),
ttime=self.total_time.fetch())
# this does all of the piping between the components of the simulation
rsim.bind()
return rsim
def check(self):
"""Function that deals with optional arguments.
Deals with the difference between classical and PI dynamics. If there is
no beads argument, the bead positions are generated from the atoms, with
the necklace being fixed at the atom position. Similarly, if no nbeads
argument is specified a classical simulation is done.
Raises:
TypeError: Raised if no beads or atoms attribute is defined.
"""
super(InputSimulation,self).check()
if self.total_steps.fetch() <= self.step.fetch():
raise ValueError("Current step greater than total steps, no dynamics will be done.")

View File

@ -0,0 +1,195 @@
"""Deals with creating the thermostats class.
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/>.
Chooses between the different possible thermostat options and creates the
appropriate thermostat object, with suitable parameters.
Classes:
InputThermo: Deals with creating the thermostat object from a file, and
writing the checkpoints.
"""
__all__ = ['InputThermo']
import numpy as np
from ipi.utils.depend import *
from ipi.utils.inputvalue import *
from ipi.engine.thermostats import *
class InputThermo(Input):
"""Thermostat input class.
Handles generating the appropriate thermostat class from the xml input file,
and generating the xml checkpoiunt tags and data from an instance of the
object.
Attributes:
mode: An optional string giving the type of the thermostat used. Defaults
to 'langevin'.
Fields:
ethermo: An optional float giving the amount of heat energy transferred
to the bath. Defaults to 0.0.
tau: An optional float giving the damping time scale. Defaults to 1.0.
pile_scale: Scaling for the PILE damping relative to the critical damping.
A: An optional array of floats giving the drift matrix. Defaults to 0.0.
C: An optional array of floats giving the static covariance matrix.
Defaults to 0.0.
s: An optional array of floats giving the additional momentum-scaled
momenta in GLE. Defaults to 0.0.
"""
attribs = { "mode": (InputAttribute, { "dtype" : str,
"options" : [ "", "langevin", "svr", "pile_l", "pile_g", "gle", "nm_gle", "nm_gle_g" ],
"help" : "The style of thermostatting. 'langevin' specifies a white noise langevin equation to be attached to the cartesian representation of the momenta. 'svr' attaches a velocity rescaling thermostat to the cartesian representation of the momenta. Both 'pile_l' and 'pile_g' attaches a white noise langevin thermostat to the normal mode representation, with 'pile_l' attaching a local langevin thermostat to the centroid mode and 'pile_g' instead attaching a global velocity rescaling thermostat. 'gle' attaches a coloured noise langevin thermostat to the cartesian representation of the momenta, 'nm_gle' attaches a coloured noise langevin thermostat to the normal mode representation of the momenta and a langevin thermostat to the centroid and 'nm_gle_g' attaches a gle thermostat to the normal modes and a svr thermostat to the centroid."
}) }
fields = { "ethermo" : (InputValue, { "dtype" : float,
"default" : 0.0,
"help" : "The initial value of the thermostat energy. Used when the simulation is restarted to guarantee continuity of the conserved quantity.",
"dimension" : "energy" }),
"tau" : (InputValue, { "dtype" : float,
"default" : 0.0,
"help" : "The friction coefficient for white noise thermostats.",
"dimension" : "time" }),
"pile_scale" : (InputValue, { "dtype" : float,
"default" : 1.0,
"help" : "Scaling for the PILE damping relative to the critical damping."} ),
"A" : (InputArray, { "dtype" : float,
"default" : input_default(factory=np.zeros, args = (0,)),
"help" : "The friction matrix for GLE thermostats.",
"dimension" : "frequency" }),
"C" : (InputArray, { "dtype" : float,
"default" : input_default(factory=np.zeros, args = (0,)),
"help" : "The covariance matrix for GLE thermostats.",
"dimension" : "temperature" }),
"s" : (InputArray, { "dtype" : float,
"default" : input_default(factory=np.zeros, args = (0,)),
"help" : "Input values for the additional momenta in GLE.",
"dimension" : "ms-momentum" })
}
default_help = "Simulates an external heat bath to keep the velocity distribution at the correct temperature."
default_label = "THERMOSTATS"
def store(self, thermo):
"""Takes a thermostat instance and stores a minimal representation of it.
Args:
thermo: A thermostat object.
Raises:
TypeError: Raised if the thermostat is not a recognized type.
"""
super(InputThermo,self).store(thermo)
if type(thermo) is ThermoLangevin:
self.mode.store("langevin")
self.tau.store(thermo.tau)
elif type(thermo) is ThermoSVR:
self.mode.store("svr")
self.tau.store(thermo.tau)
elif type(thermo) is ThermoPILE_L:
self.mode.store("pile_l")
self.tau.store(thermo.tau)
self.pile_scale.store(thermo.pilescale)
elif type(thermo) is ThermoPILE_G:
self.mode.store("pile_g")
self.tau.store(thermo.tau)
self.pile_scale.store(thermo.pilescale)
elif type(thermo) is ThermoGLE:
self.mode.store("gle")
self.A.store(thermo.A)
if dget(thermo,"C")._func is None:
self.C.store(thermo.C)
self.s.store(thermo.s)
elif type(thermo) is ThermoNMGLE:
self.mode.store("nm_gle")
self.A.store(thermo.A)
if dget(thermo,"C")._func is None:
self.C.store(thermo.C)
self.s.store(thermo.s)
elif type(thermo) is ThermoNMGLEG:
self.mode.store("nm_gle_g")
self.A.store(thermo.A)
self.tau.store(thermo.tau)
if dget(thermo,"C")._func is None:
self.C.store(thermo.C)
self.s.store(thermo.s)
elif type(thermo) is Thermostat:
self.mode.store("")
else:
raise TypeError("Unknown thermostat mode " + type(thermo).__name__)
self.ethermo.store(thermo.ethermo)
def fetch(self):
"""Creates a thermostat object.
Returns:
A thermostat object of the appropriate type and with the appropriate
parameters given the attributes of the InputThermo object.
Raises:
TypeError: Raised if the thermostat type is not a recognized option.
"""
super(InputThermo,self).fetch()
if self.mode.fetch() == "langevin":
thermo = ThermoLangevin(tau=self.tau.fetch())
elif self.mode.fetch() == "svr":
thermo = ThermoSVR(tau=self.tau.fetch())
elif self.mode.fetch() == "pile_l":
thermo = ThermoPILE_L(tau=self.tau.fetch(), scale=self.pile_scale.fetch())
elif self.mode.fetch() == "pile_g":
thermo = ThermoPILE_G(tau=self.tau.fetch(), scale=self.pile_scale.fetch())
elif self.mode.fetch() == "gle":
rC = self.C.fetch()
if len(rC) == 0:
rC = None
thermo = ThermoGLE(A=self.A.fetch(),C=rC)
thermo.s = self.s.fetch()
elif self.mode.fetch() == "nm_gle":
rC = self.C.fetch()
if len(rC) == 0:
rC = None
thermo = ThermoNMGLE(A=self.A.fetch(),C=rC)
thermo.s = self.s.fetch()
elif self.mode.fetch() == "nm_gle_g":
rC = self.C.fetch()
if len(rC) == 0:
rC = None
thermo = ThermoNMGLEG(A=self.A.fetch(),C=rC, tau=self.tau.fetch())
thermo.s = self.s.fetch()
elif self.mode.fetch() == "" :
thermo=Thermostat()
else:
raise TypeError("Invalid thermostat mode " + self.mode.fetch())
thermo.ethermo = self.ethermo.fetch()
return thermo
def check(self):
"""Checks that the parameter arrays represents a valid thermostat."""
super(InputThermo,self).check()
if self.mode.fetch() in ["langevin", "svr", "pile_l", "pile_g", "nm_gle_g"]:
if self.tau.fetch() <= 0:
raise ValueError("The thermostat friction coefficient must be set to a positive value")
if self.mode.fetch() in ["gle", "nm_gle", "nm_gle_g"]:
pass # PERHAPS DO CHECKS THAT MATRICES SATISFY REASONABLE CONDITIONS (POSITIVE-DEFINITENESS, ETC)

View File

@ -0,0 +1,8 @@
-- Interfaces between i-PI and the drivers --
* This is the directory containing the code that deals with the socket
interface.
* Files:
- sockets.py: Deals with the driver communication and the wrapper socket
and threading interface.

View File

@ -0,0 +1 @@
__all__ = ["sockets"]

View File

@ -0,0 +1,773 @@
"""Deals with the socket communication between the PIMD and driver code.
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/>.
Deals with creating the socket, transmitting and receiving data, accepting and
removing different driver routines and the parallelization of the force
calculation.
Classes:
Status: Simple class to keep track of the status, uses bitwise or to give
combinations of different status options.
DriverSocket: Class to deal with communication between a client and
the driver code.
InterfaceSocket: Host server class. Deals with distribution of all the jobs
between the different client servers.
Functions:
Message: Sends a header string through the socket.
Exceptions:
Disconnected: Raised if client has been disconnected.
InvalidStatus: Raised if client has the wrong status. Shouldn't have to be
used if the structure of the program is correct.
"""
__all__ = ['InterfaceSocket']
import numpy as np
import sys, os
import socket, select, threading, signal, string, time
from ipi.utils.depend import depstrip
from ipi.utils.messages import verbosity, warning, info
from ipi.utils.softexit import softexit
HDRLEN = 12
UPDATEFREQ = 10
TIMEOUT = 5.0
SERVERTIMEOUT = 2.0*TIMEOUT
NTIMEOUT = 10
def Message(mystr):
"""Returns a header of standard length HDRLEN."""
return string.ljust(string.upper(mystr), HDRLEN)
class Disconnected(Exception):
"""Disconnected: Raised if client has been disconnected."""
pass
class InvalidSize(Exception):
"""Disconnected: Raised if client returns forces with inconsistent number of atoms."""
pass
class InvalidStatus(Exception):
"""InvalidStatus: Raised if client has the wrong status.
Shouldn't have to be used if the structure of the program is correct.
"""
pass
class Status:
"""Simple class used to keep track of the status of the client.
Uses bitwise or to give combinations of different status options.
i.e. Status.Up | Status.Ready would be understood to mean that the client
was connected and ready to receive the position and cell data.
Attributes:
Disconnected: Flag for if the client has disconnected.
Up: Flag for if the client is running.
Ready: Flag for if the client has ready to receive position and cell data.
NeedsInit: Flag for if the client is ready to receive forcefield
parameters.
HasData: Flag for if the client is ready to send force data.
Busy: Flag for if the client is busy.
Timeout: Flag for if the connection has timed out.
"""
Disconnected = 0
Up = 1
Ready = 2
NeedsInit = 4
HasData = 8
Busy = 16
Timeout = 32
class DriverSocket(socket.socket):
"""Deals with communication between the client and driver code.
Deals with sending and receiving the data from the driver code. Keeps track
of the status of the driver. Initialises the driver forcefield, sends the
position and cell data, and receives the force data.
Attributes:
_buf: A string buffer to hold the reply from the driver.
status: Keeps track of the status of the driver.
lastreq: The ID of the last request processed by the client.
locked: Flag to mark if the client has been working consistently on one image.
"""
def __init__(self, socket):
"""Initialises DriverSocket.
Args:
socket: A socket through which the communication should be done.
"""
super(DriverSocket,self).__init__(_sock=socket)
self._buf = np.zeros(0,np.byte)
self.peername = self.getpeername()
self.status = Status.Up
self.waitstatus = False
self.lastreq = None
self.locked = False
def shutdown(self, how=socket.SHUT_RDWR):
self.sendall(Message("exit"))
self.status = Status.Disconnected
super(DriverSocket,self).shutdown(how)
def poll(self):
"""Waits for driver status."""
self.status = Status.Disconnected # sets disconnected as failsafe status, in case _getstatus fails and exceptions are ignored upstream
self.status = self._getstatus()
def _getstatus(self):
"""Gets driver status.
Returns:
An integer labelling the status via bitwise or of the relevant members
of Status.
"""
if not self.waitstatus:
try:
readable, writable, errored = select.select([], [self], [])
if self in writable:
self.sendall(Message("status"))
self.waitstatus = True
except:
return Status.Disconnected
try:
reply = self.recv(HDRLEN)
self.waitstatus = False # got status reply
except socket.timeout:
warning(" @SOCKET: Timeout in status recv!", verbosity.debug )
return Status.Up | Status.Busy | Status.Timeout
except:
return Status.Disconnected
if not len(reply) == HDRLEN:
return Status.Disconnected
elif reply == Message("ready"):
return Status.Up | Status.Ready
elif reply == Message("needinit"):
return Status.Up | Status.NeedsInit
elif reply == Message("havedata"):
return Status.Up | Status.HasData
else:
warning(" @SOCKET: Unrecognized reply: " + str(reply), verbosity.low )
return Status.Up
def recvall(self, dest):
"""Gets the potential energy, force and virial from the driver.
Args:
dest: Object to be read into.
Raises:
Disconnected: Raised if client is disconnected.
Returns:
The data read from the socket to be read into dest.
"""
blen = dest.itemsize*dest.size
if (blen > len(self._buf)):
self._buf.resize(blen)
bpos = 0
ntimeout = 0
while bpos < blen:
timeout = False
# pre-2.5 version.
try:
bpart = ""
bpart = self.recv(blen - bpos)
if len(bpart) == 0: raise socket.timeout # There is a problem if this returns no data
self._buf[bpos:bpos + len(bpart)] = np.fromstring(bpart, np.byte)
except socket.timeout:
warning(" @SOCKET: Timeout in status recvall, trying again!", verbosity.low)
timeout = True
ntimeout += 1
if ntimeout > NTIMEOUT:
warning(" @SOCKET: Couldn't receive within %5d attempts. Time to give up!" % (NTIMEOUT), verbosity.low)
raise Disconnected()
pass
if (not timeout and bpart == 0):
raise Disconnected()
bpos += len(bpart)
# post-2.5 version: slightly more compact for modern python versions
# try:
# bpart = 1
# bpart = self.recv_into(self._buf[bpos:], blen-bpos)
# except socket.timeout:
# print " @SOCKET: Timeout in status recvall, trying again!"
# timeout = True
# pass
# if (not timeout and bpart == 0):
# raise Disconnected()
# bpos += bpart
#TODO this Disconnected() exception currently just causes the program to hang.
#This should do something more graceful
if np.isscalar(dest):
return np.fromstring(self._buf[0:blen], dest.dtype)[0]
else:
return np.fromstring(self._buf[0:blen], dest.dtype).reshape(dest.shape)
def initialize(self, rid, pars):
"""Sends the initialisation string to the driver.
Args:
rid: The index of the request, i.e. the replica that
the force calculation is for.
pars: The parameter string to be sent to the driver.
Raises:
InvalidStatus: Raised if the status is not NeedsInit.
"""
if self.status & Status.NeedsInit:
try:
self.sendall(Message("init"))
self.sendall(np.int32(rid))
self.sendall(np.int32(len(pars)))
self.sendall(pars)
except:
self.poll()
return
else:
raise InvalidStatus("Status in init was " + self.status)
def sendpos(self, pos, cell):
"""Sends the position and cell data to the driver.
Args:
pos: An array containing the atom positions.
cell: A cell object giving the system box.
Raises:
InvalidStatus: Raised if the status is not Ready.
"""
if (self.status & Status.Ready):
try:
self.sendall(Message("posdata"))
self.sendall(cell.h, 9*8)
self.sendall(cell.ih, 9*8)
self.sendall(np.int32(len(pos)/3))
self.sendall(pos, len(pos)*8)
except:
self.poll()
return
else:
raise InvalidStatus("Status in sendpos was " + self.status)
def getforce(self):
"""Gets the potential energy, force and virial from the driver.
Raises:
InvalidStatus: Raised if the status is not HasData.
Disconnected: Raised if the driver has disconnected.
Returns:
A list of the form [potential, force, virial, extra].
"""
if (self.status & Status.HasData):
self.sendall(Message("getforce"));
reply = ""
while True:
try:
reply = self.recv(HDRLEN)
except socket.timeout:
warning(" @SOCKET: Timeout in getforce, trying again!", verbosity.low)
continue
if reply == Message("forceready"):
break
else:
warning(" @SOCKET: Unexpected getforce reply: %s" % (reply), verbosity.low)
if reply == "":
raise Disconnected()
else:
raise InvalidStatus("Status in getforce was " + self.status)
mu = np.float64()
mu = self.recvall(mu)
mlen = np.int32()
mlen = self.recvall(mlen)
mf = np.zeros(3*mlen,np.float64)
mf = self.recvall(mf)
mvir = np.zeros((3,3),np.float64)
mvir = self.recvall(mvir)
#! Machinery to return a string as an "extra" field. Comment if you are using a old patched driver that does not return anything!
mlen = np.int32()
mlen = self.recvall(mlen)
if mlen > 0 :
mxtra = np.zeros(mlen,np.character)
mxtra = self.recvall(mxtra)
mxtra = "".join(mxtra)
else:
mxtra = ""
#!TODO must set up a machinery to intercept the "extra" return field
return [mu, mf, mvir, mxtra]
class InterfaceSocket(object):
"""Host server class.
Deals with distribution of all the jobs between the different client servers
and both initially and as clients either finish or are disconnected.
Deals with cleaning up after all calculations are done. Also deals with the
threading mechanism, and cleaning up if the interface is killed.
Attributes:
address: A string giving the name of the host network.
port: An integer giving the port the socket will be using.
slots: An integer giving the maximum allowed backlog of queued clients.
mode: A string giving the type of socket used.
latency: A float giving the number of seconds the interface will wait
before updating the client list.
timeout: A float giving a timeout limit for considering a calculation dead
and dropping the connection.
dopbc: A boolean which decides whether or not to fold the bead positions
back into the unit cell before passing them to the client code.
server: The socket used for data transmition.
clients: A list of the driver clients connected to the server.
requests: A list of all the jobs required in the current PIMD step.
jobs: A list of all the jobs currently running.
_poll_thread: The thread the poll loop is running on.
_prev_kill: Holds the signals to be sent to clean up the main thread
when a kill signal is sent.
_poll_true: A boolean giving whether the thread is alive.
_poll_iter: An integer used to decide whether or not to check for
client connections. It is used as a counter, once it becomes higher
than the pre-defined number of steps between checks the socket will
update the list of clients and then be reset to zero.
"""
def __init__(self, address="localhost", port=31415, slots=4, mode="unix", latency=1e-3, timeout=1.0, dopbc=True):
"""Initialises interface.
Args:
address: An optional string giving the name of the host server.
Defaults to 'localhost'.
port: An optional integer giving the port number. Defaults to 31415.
slots: An optional integer giving the maximum allowed backlog of
queueing clients. Defaults to 4.
mode: An optional string giving the type of socket. Defaults to 'unix'.
latency: An optional float giving the time in seconds the socket will
wait before updating the client list. Defaults to 1e-3.
timeout: Length of time waiting for data from a client before we assume
the connection is dead and disconnect the client.
dopbc: A boolean which decides whether or not to fold the bead positions
back into the unit cell before passing them to the client code.
Raises:
NameError: Raised if mode is not 'unix' or 'inet'.
"""
self.address = address
self.port = port
self.slots = slots
self.mode = mode
self.latency = latency
self.timeout = timeout
self.dopbc = dopbc
self._poll_thread = None
self._prev_kill = {}
self._poll_true = False
self._poll_iter = 0
def open(self):
"""Creates a new socket.
Used so that we can create a interface object without having to also
create the associated socket object.
"""
if self.mode == "unix":
self.server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
self.server.bind("/tmp/ipi_" + self.address)
info("Created unix socket with address " + self.address, verbosity.medium)
except:
raise ValueError("Error opening unix socket. Check if a file " + ("/tmp/ipi_" + self.address) + " exists, and remove it if unused.")
elif self.mode == "inet":
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind((self.address,self.port))
info("Created inet socket with address " + self.address + " and port number " + str(self.port), verbosity.medium)
else:
raise NameError("InterfaceSocket mode " + self.mode + " is not implemented (should be unix/inet)")
self.server.listen(self.slots)
self.server.settimeout(SERVERTIMEOUT)
self.clients = []
self.requests = []
self.jobs = []
def close(self):
"""Closes down the socket."""
info(" @SOCKET: Shutting down the driver interface.", verbosity.low )
for c in self.clients[:]:
if (c.status & Status.Up):
c.shutdown(socket.SHUT_RDWR)
self.server.shutdown(socket.SHUT_RDWR)
self.server.close()
if self.mode == "unix":
os.unlink("/tmp/ipi_" + self.address)
def queue(self, atoms, cell, pars=None, reqid=0):
"""Adds a request.
Note that the pars dictionary need to be sent as a string of a
standard format so that the initialisation of the driver can be done.
Args:
atoms: An Atoms object giving the atom positions.
cell: A Cell object giving the system box.
pars: An optional dictionary giving the parameters to be sent to the
driver for initialisation. Defaults to {}.
reqid: An optional integer that identifies requests of the same type,
e.g. the bead index
Returns:
A list giving the status of the request of the form {'atoms': Atoms
object giving the atom positions, 'cell': Cell object giving the
system box, 'pars': parameter string, 'result': holds the result as a
list once the computation is done, 'status': a string labelling the
status, 'id': the id of the request, usually the bead number, 'start':
the starting time for the calculation, used to check for timeouts.}.
"""
par_str = " "
if not pars is None:
for k,v in pars.items():
par_str += k + " : " + str(v) + " , "
else:
par_str = " "
# APPLY PBC -- this is useful for codes such as LAMMPS that don't do full PBC when computing distances
pbcpos = depstrip(atoms.q).copy()
if self.dopbc:
cell.array_pbc(pbcpos)
newreq = {"pos": pbcpos, "cell": cell, "pars": par_str,
"result": None, "status": "Queued", "id": reqid,
"start": -1 }
self.requests.append(newreq)
return newreq
def release(self, request):
"""Empties the list of requests once finished.
Args:
request: A list of requests that are done.
"""
if request in self.requests:
self.requests.remove(request)
def pool_update(self):
"""Deals with keeping the pool of client drivers up-to-date during a
force calculation step.
Deals with maintaining the client list. Clients that have
disconnected are removed and their jobs removed from the list of
running jobs and new clients are connected to the server.
"""
for c in self.clients[:]:
if not (c.status & Status.Up):
try:
warning(" @SOCKET: Client " + str(c.peername) +" died or got unresponsive(C). Removing from the list.", verbosity.low)
c.shutdown(socket.SHUT_RDWR)
c.close()
except:
pass
c.status = Status.Disconnected
self.clients.remove(c)
for [k,j] in self.jobs[:]:
if j is c:
self.jobs = [ w for w in self.jobs if not ( w[0] is k and w[1] is j ) ] # removes pair in a robust way
#self.jobs.remove([k,j])
k["status"] = "Queued"
k["start"] = -1
keepsearch = True
while keepsearch:
readable, writable, errored = select.select([self.server], [], [], 0.0)
if self.server in readable:
client, address = self.server.accept()
client.settimeout(TIMEOUT)
driver = DriverSocket(client)
info(" @SOCKET: Client asked for connection from "+ str( address ) +". Now hand-shaking.", verbosity.low)
driver.poll()
if (driver.status | Status.Up):
self.clients.append(driver)
info(" @SOCKET: Handshaking was successful. Added to the client list.", verbosity.low)
else:
warning(" @SOCKET: Handshaking failed. Dropping connection.", verbosity.low)
client.shutdown(socket.SHUT_RDWR)
client.close()
else:
keepsearch = False
def pool_distribute(self):
"""Deals with keeping the list of jobs up-to-date during a force
calculation step.
Deals with maintaining the jobs list. Gets data from drivers that have
finished their calculation and removes that job from the list of running
jobs, adds jobs to free clients and initialises the forcefields of new
clients.
"""
for c in self.clients:
if c.status == Status.Disconnected : # client disconnected. force a pool_update
self._poll_iter = UPDATEFREQ
return
if not c.status & ( Status.Ready | Status.NeedsInit ):
c.poll()
for [r,c] in self.jobs[:]:
if c.status & Status.HasData:
try:
r["result"] = c.getforce()
if len(r["result"][1]) != len(r["pos"]):
raise InvalidSize
except Disconnected:
c.status = Status.Disconnected
continue
except InvalidSize:
warning(" @SOCKET: Client returned an inconsistent number of forces. Will mark as disconnected and try to carry on.", verbosity.low)
c.status = Status.Disconnected
continue
except:
warning(" @SOCKET: Client got in a awkward state during getforce. Will mark as disconnected and try to carry on.", verbosity.low)
c.status = Status.Disconnected
continue
c.poll()
while c.status & Status.Busy: # waits, but check if we got stuck.
if self.timeout > 0 and r["start"] > 0 and time.time() - r["start"] > self.timeout:
warning(" @SOCKET: Timeout! HASDATA for bead " + str(r["id"]) + " has been running for " + str(time.time() - r["start"]) + " sec.", verbosity.low)
warning(" @SOCKET: Client " + str(c.peername) + " died or got unresponsive(A). Disconnecting.", verbosity.low)
try:
c.shutdown(socket.SHUT_RDWR)
except:
pass
c.close()
c.status = Status.Disconnected
continue
c.poll()
if not (c.status & Status.Up):
warning(" @SOCKET: Client died a horrible death while getting forces. Will try to cleanup.", verbosity.low)
continue
r["status"] = "Done"
c.lastreq = r["id"] # saves the ID of the request that the client has just processed
self.jobs = [ w for w in self.jobs if not ( w[0] is r and w[1] is c ) ] # removes pair in a robust way
if self.timeout > 0 and c.status != Status.Disconnected and r["start"] > 0 and time.time() - r["start"] > self.timeout:
warning(" @SOCKET: Timeout! Request for bead " + str( r["id"]) + " has been running for " + str(time.time() - r["start"]) + " sec.", verbosity.low)
warning(" @SOCKET: Client " + str(c.peername) + " died or got unresponsive(B). Disconnecting.",verbosity.low)
try:
c.shutdown(socket.SHUT_RDWR)
except socket.error:
e = sys.exc_info()
warning(" @SOCKET: could not shut down cleanly the socket. %s: %s in file '%s' on line %d" % (e[0].__name__, e[1], os.path.basename(e[2].tb_frame.f_code.co_filename), e[2].tb_lineno), verbosity.low )
c.close()
c.poll()
c.status = Status.Disconnected
freec = self.clients[:]
for [r2, c] in self.jobs:
freec.remove(c)
pendr = self.requests[:]
pendr = [ r for r in self.requests if r["status"] == "Queued" ]
for fc in freec[:]:
matched = False
# first, makes sure that the client is REALLY free
if not (fc.status & Status.Up):
self.clients.remove(fc) # if fc is in freec it can't be associated with a job (we just checked for that above)
continue
if fc.status & Status.HasData:
continue
if not (fc.status & (Status.Ready | Status.NeedsInit | Status.Busy) ):
warning(" @SOCKET: Client " + str(fc.peername) + " is in an unexpected status " + str(fc.status) + " at (1). Will try to keep calm and carry on.", verbosity.low)
continue
for match_ids in ( "match", "none", "free", "any" ):
for r in pendr[:]:
if match_ids == "match" and not fc.lastreq is r["id"]:
continue
elif match_ids == "none" and not fc.lastreq is None:
continue
elif match_ids == "free" and fc.locked:
continue
info(" @SOCKET: Assigning [%5s] request id %4s to client with last-id %4s (% 3d/% 3d : %s)" % (match_ids, str(r["id"]), str(fc.lastreq), self.clients.index(fc), len(self.clients), str(fc.peername) ), verbosity.high )
while fc.status & Status.Busy:
fc.poll()
if fc.status & Status.NeedsInit:
fc.initialize(r["id"], r["pars"])
fc.poll()
while fc.status & Status.Busy: # waits for initialization to finish. hopefully this is fast
fc.poll()
if fc.status & Status.Ready:
fc.sendpos(r["pos"], r["cell"])
r["status"] = "Running"
r["start"] = time.time() # sets start time for the request
fc.poll()
self.jobs.append([r,fc])
fc.locked = (fc.lastreq is r["id"])
matched = True
# removes r from the list of pending jobs
pendr = [nr for nr in pendr if (not nr is r)]
break
else:
warning(" @SOCKET: Client " + str(fc.peername) + " is in an unexpected status " + str(fc.status) + " at (2). Will try to keep calm and carry on.", verbosity.low)
if matched:
break # doesn't do a second (or third) round if it managed
# to assign the job
def _kill_handler(self, signal, frame):
"""Deals with handling a kill call gracefully.
Prevents any of the threads becoming zombies, by intercepting a
kill signal using the standard python function signal.signal() and
then closing the socket and the spawned threads before closing the main
thread. Called when signals SIG_INT and SIG_TERM are received.
Args:
signal: An integer giving the signal number of the signal received
from the socket.
frame: Current stack frame.
"""
warning(" @SOCKET: Kill signal. Trying to make a clean exit.", verbosity.low)
self.end_thread()
softexit.trigger(" @SOCKET: Kill signal received")
try:
self.__del__()
except:
pass
if signal in self._prev_kill:
self._prev_kill[signal](signal, frame)
def _poll_loop(self):
"""The main thread loop.
Runs until either the program finishes or a kill call is sent. Updates
the pool of clients every UPDATEFREQ loops and loops every latency
seconds until _poll_true becomes false.
"""
info(" @SOCKET: Starting the polling thread main loop.", verbosity.low)
self._poll_iter = UPDATEFREQ
while self._poll_true:
time.sleep(self.latency)
# makes sure to remove the last dead client as soon as possible -- and to get clients if we are dry
if self._poll_iter >= UPDATEFREQ or len(self.clients)==0 or (len(self.clients) > 0 and not(self.clients[0].status & Status.Up)):
self.pool_update()
self._poll_iter = 0
self._poll_iter += 1
self.pool_distribute()
if os.path.exists("EXIT"): # softexit
info(" @SOCKET: Soft exit request from file EXIT. Flushing job queue.", verbosity.low)
# releases all pending requests
for r in self.requests:
r["status"] = "Exit"
for c in self.clients:
try:
c.shutdown(socket.SHUT_RDWR)
c.close()
except:
pass
# flush it all down the drain
self.clients = []
self.jobs = []
self._poll_thread = None
def started(self):
"""Returns a boolean specifying whether the thread has started yet."""
return (not self._poll_thread is None)
def start_thread(self):
"""Spawns a new thread.
Splits the main program into two threads, one that runs the polling loop
which updates the client list, and one which gets the data. Also sets up
the machinery to deal with a kill call, in the case of a Ctrl-C or
similar signal the signal is intercepted by the _kill_handler function,
which cleans up the spawned thread before closing the main thread.
Raises:
NameError: Raised if the polling thread already exists.
"""
self.open()
if not self._poll_thread is None:
raise NameError("Polling thread already started")
self._poll_thread = threading.Thread(target=self._poll_loop, name="poll_" + self.address)
self._poll_thread.daemon = True
self._prev_kill[signal.SIGINT] = signal.signal(signal.SIGINT, self._kill_handler)
self._prev_kill[signal.SIGTERM] = signal.signal(signal.SIGTERM, self._kill_handler)
self._poll_true = True
self._poll_thread.start()
def end_thread(self):
"""Closes the spawned thread.
Deals with cleaning up the spawned thread cleanly. First sets
_poll_true to false to indicate that the poll_loop should be exited, then
closes the spawned thread and removes it.
"""
self._poll_true = False
if not self._poll_thread is None:
self._poll_thread.join()
self._poll_thread = None
self.close()

View File

@ -0,0 +1,9 @@
-- Nosetests directory --
* This is the directory containing the tests that can be run with nosetests.
* Files:
- common.py: Common helper funtions for use in the tests.
- datest.py: Tests the dependency utility and some of the numpy
facilities.
- test_*.py: The actual tests for at least some of the code basis.

View File

@ -0,0 +1,96 @@
"""Common helper functions for running the tests.
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:
local: Returns local folder of the tests directory.
Classes:
TestSimulation: Can be used to test that a particular simulation
will run properly, given an input file and a driver code.
"""
import glob
import os
import subprocess
import shutil
import tempfile
def local(file=None):
"""Returns local folder of the tests directory.
Args:
- file: Append file to the local folder
"""
if file:
return os.sep.join(__file__.split(os.sep)[:-1]+[file])
else:
return os.sep.join(__file__.split(os.sep)[:-1])
class TestSimulation(object):
"""Simple class used to test various aspects of the simulation.
Can be used to run an example given the location of an xml
input file and the location of a suitable driver code.
Attributes:
finput: The name of the xml input file
folder_input: A string giving the directory the input file is held in.
fdriver: The location of a driver code.
cwd: Current working directory.
tmpdir: A temporary directory to run the simulation in.
"""
def __init__(self, input, driver):
"""Initializes TestSimulation.
Args:
input: The name of the xml input file.
driver: The location of the driver code.
"""
self.finput = input
self.folder_input = os.sep.join(input.split(os.sep)[:-1])
self.fdriver = driver
self.cwd = os.getcwd()
self.tmpdir = tempfile.mkdtemp()
# Copy needed files to tmpdir
for src in glob.glob("%s/*"%self.folder_input):
shutil.copy(src, self.tmpdir)
os.chdir(self.tmpdir)
def __del__(self):
"""Cleans the temporary directory once the simulation is over."""
os.chdir(self.cwd)
shutil.rmtree(self.tmpdir)
def run(self):
"""Runs the simulation."""
# Run driver
p = subprocess.Popen("echo running %s"%self.fdriver, shell=True)
# Start simulation
# TODO
print subprocess.check_output("ls", shell=True)
print subprocess.check_output("pwd", shell=True)
# wait for driver to finish
p.wait()

View File

@ -0,0 +1,56 @@
"""Short test scripts.
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/>.
Used to test the depend array view mechanism.
"""
import sys
sys.path.append("../")
sys.path.append("../../")
import utils.depend as dp
import numpy as np
print "## Creation test"
a = dp.depend_array(name="a",value=np.zeros((2,2),float))
b = dp.depend_array(name="b",value=np.zeros((2,2),float))
print "## Slicing test"
c = a[0]
print type(c)
print "## Addition test"
c = a + b
print type(c)
print "## Increment test"
c = np.zeros((2,2))
c += a
print type(c)
print "## Dot test"
c = np.dot(a,b)
print type(c)
rdot = np.dot
def fdot(a,b):
return rdot(a,b).view(np.ndarray)
#np.dot=fdot
print "## Dot-f test"
c = np.dot(a,b)

View File

@ -0,0 +1,10 @@
CRYST1 1.000 1.000 1.000 90.00 90.00 90.00 P 1 1
ATOM 1 O 1 1 0.000 1.000 2.000 0.00 0.00 0
ATOM 2 H 1 1 3.000 4.000 5.000 0.00 0.00 0
ATOM 3 H 1 1 6.000 7.000 8.000 0.00 0.00 0
END
CRYST1 1.000 1.000 1.000 90.00 90.00 90.00 P 1 1
ATOM 1 O 1 1 0.000 2.000 4.000 0.00 0.00 0
ATOM 2 H 1 1 6.000 8.000 10.000 0.00 0.00 0
ATOM 3 H 1 1 12.000 14.000 16.000 0.00 0.00 0
END

View File

@ -0,0 +1,10 @@
3
# CELL(abcABC): 1.00000 1.00000 1.00000 90.00000 90.00000 90.00000
O 0.00000e+00 1.00000e+00 2.00000e+00
H 3.00000e+00 4.00000e+00 5.00000e+00
H 6.00000e+00 7.00000e+00 8.00000e+00
3
# CELL(abcABC): 1.00000 1.00000 1.00000 90.00000 90.00000 90.00000
O 0.00000e+00 2.00000e+00 4.00000e+00
H 6.00000e+00 8.00000e+00 1.00000e+01
H 1.20000e+01 1.40000e+01 1.60000e+01

View File

@ -0,0 +1,127 @@
"""Tests ring polymer contraction.
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/>.
"""
import sys
sys.path.append("../")
sys.path.append("../../")
from ipi.utils import nmtransform
import numpy as np
from numpy.testing import assert_almost_equal as assert_equals
def check_up_and_down_scaling(n, q):
"""Check if q expanding and then contracting a ring polymer is a no-op.
Args:
n: The number of beads in the scaled ring polymer.
q: The original position array.
"""
rescale = nmtransform.nm_rescale(q.shape[0], n)
print "Initial position of the beads:"
print q, q.shape, (q.shape[0], n)
# rescale up to the n beads
beads_n = rescale.b1tob2(q)
print "Upscaled to %d beads:"%n
print beads_n, beads_n.shape
beads_final = rescale.b2tob1(beads_n)
print "Final position of the beads:"
print beads_final
assert_equals(q, beads_final)
return beads_n
def check_rpc_consistency(n, q):
"""Check if q expanding and then contracting a ring polymer is a no-op.
Args:
n: The number of beads in the scaled ring polymer.
q: The original position array.
"""
rescale1 = nmtransform.nm_rescale(q.shape[0], n)
rescale2 = nmtransform.nm_rescale(n,q.shape[0])
beads_n=rescale1.b1tob2(q)
beads_1=rescale1.b2tob1(beads_n)
beads_2=rescale2.b1tob2(beads_n)
assert_equals(beads_1, beads_2)
def check_centroid_pos(n, q):
"""Check if expanding and then contracting a ring polymer
maintains the centroid.
Args:
n: The number of beads in the scaled ring polymer.
q: The original position array.
"""
beads_big = check_up_and_down_scaling(n, q)
rescale_big = nmtransform.mk_rs_matrix(n, 1)
rescale_q = nmtransform.mk_rs_matrix(q.shape[0], 1)
centroid_big = np.dot(rescale_big, beads_big)
centroid_q = np.dot(rescale_q, q)
assert_equals(centroid_q, centroid_big)
numbers_to_check = range(10, 56, 9)
def test_1_to_n():
"""One bead tests."""
for n in numbers_to_check:
q = np.array([[0.0,0.0,0.0, 1.0,0.0,0.0]])
yield check_up_and_down_scaling, n, q
yield check_rpc_consistency, n, q
yield check_centroid_pos, n, q
def test_2_to_n():
"""Two bead tests."""
for n in numbers_to_check:
q = np.array([[0.0,0.0,0.0, 1.0,0.0,0.0],
[0.0,0.1,0.0, 1.0,0.1,0.0]])
yield check_up_and_down_scaling, n, q
yield check_rpc_consistency, n, q
yield check_centroid_pos, n, q
def test_3_to_n():
"""Three bead tests."""
for n in numbers_to_check:
q = np.array([[0.0, 0.0,0.0, 1.0, 0.0,0.0],
[0.0, 0.1,0.0, 1.0, 0.1,0.0],
[0.0,-0.1,0.0, 1.0,-0.1,0.0]])
yield check_up_and_down_scaling, n, q
yield check_rpc_consistency, n, q
yield check_centroid_pos, n, q
def test_4_to_n():
"""Four bead tests."""
for n in numbers_to_check:
q = np.array([[0.0, 0.0,0.0, 1.0, 0.0,0.0],
[0.0, 0.1,0.0, 1.0, 0.1,0.0],
[0.0, 0.2,0.0, 1.0, 0.2,0.0],
[0.0,-0.1,0.0, 1.0,-0.1,0.0]])
yield check_up_and_down_scaling, n, q
yield check_rpc_consistency, n, q
yield check_centroid_pos, n, q

View File

@ -0,0 +1,96 @@
"""Deals with testing the io system.
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/>.
Note that this will only run if you have Python version 2.5 or later.
Otherwise, replace all the with statements with f = filestream.
"""
import sys
sys.path.append("../")
sys.path.append("../../")
import filecmp
import os, sys
import numpy as np
from numpy.testing import assert_equal
from common import local
from ipi.engine.cell import Cell
from ipi.utils.io import io_xyz
from ipi.utils.io import io_pdb
pos = np.array([i for i in range(3*3)])
def test_read_xyz():
"""Tests that xyz files are read correctly."""
with open(local("test.pos_0.xyz"), "r") as f:
atoms = io_xyz.read_xyz(f)
assert(len(atoms) == 3)
assert_equal(pos, atoms.q)
def test_iter_xyz():
"""Tests that xyz files with multiple frames are read correctly."""
with open(local("test.pos_0.xyz"), "r") as f:
for num, atoms in enumerate(io_xyz.iter_xyz(f)):
assert(len(atoms) == 3)
assert_equal(pos*(num+1), atoms.q)
def test_read_pdb():
"""Tests that pdb files are read correctly."""
with open(local("test.pos_0.pdb"), "r") as f:
atoms, cell = io_pdb.read_pdb(f)
assert(len(atoms) == 3)
assert_equal(pos, atoms.q)
# TODO: test cell
def test_iter_pdb():
"""Tests that pdb files with multiple frames are read correctly."""
with open(local("test.pos_0.pdb"), "r") as f:
for num, (atoms, cell) in enumerate(io_pdb.iter_pdb(f)):
assert(len(atoms) == 3)
assert_equal(pos*(num+1), atoms.q)
def test_print_pdb():
"""Tests that pdb files are printed correctly."""
with open(local("test.pos_0.pdb"), "r") as f:
with open(local("test.pos_1.xyz"), "w") as out:
for num, (atoms, cell) in enumerate(io_pdb.iter_pdb(f)):
assert(len(atoms) == 3)
assert_equal(pos*(num+1), atoms.q)
io_xyz.print_xyz(atoms, Cell(h=np.identity(3, float)), filedesc=out)
assert(filecmp.cmp(local("test.pos_0.xyz"), local("test.pos_1.xyz")))
os.unlink(local("test.pos_1.xyz"))
def test_print_xyz():
"""Tests that xyz files are printed correctly."""
with open(local("test.pos_0.pdb"), "r") as f:
with open(local("test.pos_1.pdb"), "w") as out:
for num, (atoms, cell) in enumerate(io_pdb.iter_pdb(f)):
assert(len(atoms) == 3)
assert_equal(pos*(num+1), atoms.q)
io_pdb.print_pdb(atoms, Cell(h=np.identity(3, float)), filedesc=out)
assert(filecmp.cmp(local("test.pos_0.pdb"), local("test.pos_1.pdb")))
os.unlink(local("test.pos_1.pdb"))

View File

@ -0,0 +1,24 @@
"""Tests that the Lennard-Jones test case works properly.
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/>.
"""
from common import TestSimulation
def test_lj_gas():
ts = TestSimulation(input="../../test/lj/gas/input.xml", driver="../../drivers/driver.x")
ts.run()
# Test properties (e.g. latest positions/temperature etc)

View File

@ -0,0 +1,21 @@
-- Utility functions directory --
* This is the directory containing functions that are used in the other
modules in the code.
* Files:
- depend.py: Deals with the dependency detection, value caching and
automatic updating of variables.
- inputvalue.py: Contains the base classes used in reading the xml
input file, and creating the restart file.
- mathtools.py: Contains the algorithms used in various parts of the code.
- messages.py: Contains the classes to generate info and warning messages
to standard output during the simulation.
- nmtransform.py: Contains the algorithms that deal with the normal mode
and ring polymer contraction transformations.
- prng.py: Deals with random number generation.
- softexit: Contains the classes to deal with calls for a soft exit.
- units.py: Holds atomic masses, fundamental constants, and unit conversions.
* Directories:
- io: Holds the modules that deal with reading and outputting files.

View File

@ -0,0 +1 @@
__all__ = ["depend", "units", "mathtools", "prng" , "inputvalue", 'nmtransform', 'messages', 'softexit']

View File

@ -0,0 +1,768 @@
"""Contains the classes that are used to define the dependency network.
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/>.
The classes defined in this module overload the standard __get__ and __set__
routines of the numpy ndarray class and standard library object class so that
they automatically keep track of whether anything they depend on has been
altered, and so only recalculate their value when necessary.
Basic quantities that depend on nothing else can be manually altered in the
usual way, all other quantities are updated automatically and cannot be changed
directly.
The exceptions to this are synchronized properties, which are in effect
multiple basic quantities all related to each other, for example the bead and
normal mode representations of the positions and momenta. In this case any of
the representations can be set manually, and all the other representations
must keep in step.
For a more detailed discussion, see the reference manual.
Classes:
depend_base: Base depend class with the generic methods and attributes.
depend_value: Depend class for scalar objects.
depend_array: Depend class for arrays.
synchronizer: Class that holds the different objects that are related to each
other and keeps track of which property has been set manually.
dobject: An extension of the standard library object that overloads
__getattribute__ and __setattribute__, so that we can use the
standard syntax for setting and getting the depend object,
i.e. foo = value, not foo.set(value).
Functions:
dget: Gets the dependencies of a depend object.
dset: Sets the dependencies of a depend object.
depstrip: Used on a depend_array object, to access its value without
needing the depend machinery, and so much more quickly. Must not be used
if the value of the array is to be changed.
depcopy: Copies the dependencies from one object to another
deppipe: Used to make two objects be synchronized to the same value.
"""
__all__ = ['depend_base', 'depend_value', 'depend_array', 'synchronizer',
'dobject', 'dget', 'dset', 'depstrip', 'depcopy', 'deppipe']
import numpy as np
from ipi.utils.messages import verbosity, warning
class synchronizer(object):
"""Class to implement synched objects.
Holds the objects used to keep two or more objects in step with each other.
This is shared between all the synched objects.
Attributes:
synched: A dictionary containing all the synched objects, of the form
{"name": depend object}.
manual: A string containing the name of the object being manually changed.
"""
def __init__(self, deps=None):
"""Initialises synchronizer.
Args:
deps: Optional dictionary giving the synched objects of the form
{"name": depend object}.
"""
if deps is None:
self.synced = dict()
else:
self.synced = deps
self.manual = None
#TODO put some error checks in the init to make sure that the object is initialized from consistent synchro and func states
class depend_base(object):
"""Base class for dependency handling.
Builds the majority of the machinery required for the different depend
objects. Contains functions to add and remove dependencies, the tainting
mechanism by which information about which objects have been updated is
passed around the dependency network, and the manual and automatic update
functions to check that depend objects with functions are not manually
updated and that synchronized objects are kept in step with the one manually
changed.
Attributes:
_tainted: An array containing one boolean, which is True if one of the
dependencies has been changed since the last time the value was
cached.
_func: A function name giving the method of calculating the value,
if required. None otherwise.
_name: The name of the depend base object.
_synchro: A synchronizer object to deal with synched objects, if
required. None otherwise.
_dependants: A list containing all objects dependent on the self.
"""
def __init__(self, name, synchro=None, func=None, dependants=None, dependencies=None, tainted=None):
"""Initialises depend_base.
An unusual initialisation routine, as it has to be able to deal with the
depend array mechanism for returning slices as new depend arrays.
This is the reason for the penultimate if statement; it automatically
taints objects created from scratch but does nothing to slices which are
not tainted.
Also, the last if statement makes sure that if a synchronized property is
sliced, this initialization routine does not automatically set it to the
manually updated property.
Args:
name: A string giving the name of self.
tainted: An optional array containing one boolean which is True if one
of the dependencies has been changed.
func: An optional argument that can be specified either by a function
name, or for synchronized values a dictionary of the form
{"name": function name}; where "name" is one of the other
synched objects and function name is the name of a function to
get the object "name" from self.
synchro: An optional synchronizer object.
dependants: An optional list containing objects that depend on self.
dependencies: An optional list containing objects that self
depends upon.
"""
self._dependants = []
if tainted is None:
tainted = np.array([True],bool)
if dependants is None:
dependants = []
if dependencies is None:
dependencies = []
self._tainted = tainted
self._func = func
self._name = name
self.add_synchro(synchro)
for item in dependencies:
item.add_dependant(self, tainted)
self._dependants = dependants
# Don't taint self if the object is a primitive one. However, do propagate tainting to dependants if required.
if (tainted):
if self._func is None:
self.taint(taintme=False)
else:
self.taint(taintme=tainted)
def add_synchro(self, synchro=None):
""" Links depend object to a synchronizer. """
self._synchro = synchro
if not self._synchro is None and not self._name in self._synchro.synced:
self._synchro.synced[self._name] = self
self._synchro.manual = self._name
def add_dependant(self, newdep, tainted=True):
"""Adds a dependant property.
Args:
newdep: The depend object to be added to the dependency list.
tainted: A boolean that decides whether newdep should be tainted.
True by default.
"""
self._dependants.append(newdep)
if tainted:
newdep.taint(taintme=True)
def add_dependency(self, newdep, tainted=True):
"""Adds a dependency.
Args:
newdep: The depend object self now depends upon.
tainted: A boolean that decides whether self should
be tainted. True by default.
"""
newdep._dependants.append(self)
if tainted:
self.taint(taintme=True)
def taint(self,taintme=True):
"""Recursively sets tainted flag on dependent objects.
The main function dealing with the dependencies. Taints all objects
further down the dependency tree until either all objects have been
tainted, or it reaches only objects that have already been tainted. Note
that in the case of a dependency loop the initial setting of _tainted to
True prevents an infinite loop occuring.
Also, in the case of a synchro object, the manually set quantity is not
tainted, as it is assumed that synchro objects only depend on each other.
Args:
taintme: A boolean giving whether self should be tainted at the end.
True by default.
"""
self._tainted[:] = True
for item in self._dependants:
if (not item._tainted[0]):
item.taint()
if not self._synchro is None:
for v in self._synchro.synced.values():
if (not v._tainted[0]) and (not v is self):
v.taint(taintme=True)
self._tainted[:] = (taintme and (not self._name == self._synchro.manual))
else:
self._tainted[:] = taintme
def tainted(self):
"""Returns tainted flag."""
return self._tainted[0]
def update_auto(self):
"""Automatic update routine.
Updates the value when get has been called and self has been tainted.
"""
if not self._synchro is None:
if (not self._name == self._synchro.manual):
self.set(self._func[self._synchro.manual](), manual=False)
else:
warning(self._name + " probably shouldn't be tainted (synchro)", verbosity.low)
elif not self._func is None:
self.set(self._func(), manual=False)
else:
warning(self._name + " probably shouldn't be tainted (value)", verbosity.low)
def update_man(self):
"""Manual update routine.
Updates the value when the value has been manually set. Also raises an
exception if a calculated quantity has been manually set. Also starts the
tainting routine.
Raises:
NameError: If a calculated quantity has been manually set.
"""
if not self._synchro is None:
self._synchro.manual = self._name
for v in self._synchro.synced.values():
v.taint(taintme=True)
self._tainted[:] = False
elif not self._func is None:
raise NameError("Cannot set manually the value of the automatically-computed property <" + self._name + ">")
else:
self.taint(taintme=False)
def set(self, value, manual=False):
"""Dummy setting routine."""
pass
def get(self):
"""Dummy getting routine."""
pass
class depend_value(depend_base):
"""Scalar class for dependency handling.
Attributes:
_value: The value associated with self.
"""
def __init__(self, name, value=None, synchro=None, func=None, dependants=None, dependencies=None, tainted=None):
"""Initialises depend_value.
Args:
name: A string giving the name of self.
value: The value of the object. Optional.
tainted: An optional array giving the tainted flag. Default is [True].
func: An optional argument that can be specified either by a function
name, or for synchronized values a dictionary of the form
{"name": function name}; where "name" is one of the other
synched objects and function name is the name of a function to
get the object "name" from self.
synchro: An optional synchronizer object.
dependants: An optional list containing objects that depend on self.
dependencies: An optional list containing objects that self
depends upon.
"""
self._value = value
super(depend_value,self).__init__(name, synchro, func, dependants, dependencies, tainted)
def get(self):
"""Returns value, after recalculating if necessary.
Overwrites the standard method of getting value, so that value
is recalculated if tainted.
"""
if self._tainted[0]:
self.update_auto()
self.taint(taintme=False)
return self._value
def __get__(self, instance, owner):
"""Overwrites standard get function."""
return self.get()
def set(self, value, manual=True):
"""Alters value and taints dependencies.
Overwrites the standard method of setting value, so that dependent
quantities are tainted, and so we check that computed quantities are not
manually updated.
"""
self._value = value
self.taint(taintme=False)
if (manual):
self.update_man()
def __set__(self, instance, value):
"""Overwrites standard set function."""
self.set(value)
class depend_array(np.ndarray, depend_base):
"""Array class for dependency handling.
Differs from depend_value as arrays handle getting items in a different
way to scalar quantities, and as there needs to be support for slicing an
array. Initialisation is also done in a different way for ndarrays.
Attributes:
_bval: The base deparray storage space. Equal to depstrip(self) unless
self is a slice.
"""
def __new__(cls, value, name, synchro=None, func=None, dependants=None, dependencies=None, tainted=None, base=None):
"""Creates a new array from a template.
Called whenever a new instance of depend_array is created. Casts the
array base into an appropriate form before passing it to
__array_finalize__().
Args:
See __init__().
"""
obj = np.asarray(value).view(cls)
return obj
def __init__(self, value, name, synchro=None, func=None, dependants=None, dependencies=None, tainted=None, base=None):
"""Initialises depend_array.
Note that this is only called when a new array is created by an
explicit constructor.
Args:
name: A string giving the name of self.
value: The (numpy) array to serve as the memory base.
tainted: An optional array giving the tainted flag. Default is [True].
func: An optional argument that can be specified either by a function
name, or for synchronized values a dictionary of the form
{"name": function name}; where "name" is one of the other
synched objects and function name is the name of a function to
get the object "name" from self.
synchro: An optional synchronizer object.
dependants: An optional list containing objects that depend on self.
dependencies: An optional list containing objects that self
depends upon.
"""
super(depend_array,self).__init__(name, synchro, func, dependants, dependencies, tainted)
if base is None:
self._bval = value
else:
self._bval = base
def copy(self, order='C', maskna=None):
"""Wrapper for numpy copy mechanism."""
# Sets a flag and hands control to the numpy copy
self._fcopy = True
return super(depend_array,self).copy(order)
def __array_finalize__(self, obj):
"""Deals with properly creating some arrays.
In the case where a function acting on a depend array returns a ndarray,
this casts it into the correct form and gives it the
depend machinery for other methods to be able to act upon it. New
depend_arrays will next be passed to __init__ ()to be properly
initialized, but some ways of creating arrays do not call __new__() or
__init__(), so need to be initialized.
"""
depend_base.__init__(self, name="")
if type(obj) is depend_array:
# We are in a view cast or in new from template. Unfortunately
# there is no sure way to tell (or so it seems). Hence we need to
# handle special cases, and hope we are in a view cast otherwise.
if hasattr(obj,"_fcopy"):
del(obj._fcopy) # removes the "copy flag"
self._bval = depstrip(self)
else:
# Assumes we are in view cast, so copy over the attributes from the
# parent object. Typical case: when transpose is performed as a
# view.
super(depend_array,self).__init__(obj._name, obj._synchro, obj._func, obj._dependants, None, obj._tainted)
self._bval = obj._bval
else:
# Most likely we came here on the way to init.
# Just sets a defaults for safety
self._bval = depstrip(self)
def __array_prepare__(self, arr, context=None):
"""Prepare output array for ufunc.
Depending on the context we try to understand if we are doing an
in-place operation (in which case we want to keep the return value a
deparray) or we are generating a new array as a result of the ufunc.
In this case there is no way to know if dependencies should be copied,
so we strip and return a ndarray.
"""
if context is None or len(context) < 2 or not type(context[0]) is np.ufunc:
# It is not clear what we should do. If in doubt, strip dependencies.
return np.ndarray.__array_prepare__(self.view(np.ndarray),arr.view(np.ndarray),context)
elif len(context[1]) > context[0].nin and context[0].nout > 0:
# We are being called by a ufunc with a output argument, which is being
# actually used. Most likely, something like an increment,
# so we pass on a deparray
return super(depend_array,self).__array_prepare__(arr,context)
else:
# Apparently we are generating a new array.
# We have no way of knowing its
# dependencies, so we'd better return a ndarray view!
return np.ndarray.__array_prepare__(self.view(np.ndarray),arr.view(np.ndarray),context)
def __array_wrap__(self, arr, context=None):
""" Wraps up output array from ufunc.
See docstring of __array_prepare__().
"""
if context is None or len(context) < 2 or not type(context[0]) is np.ufunc:
return np.ndarray.__array_wrap__(self.view(np.ndarray),arr.view(np.ndarray),context)
elif len(context[1]) > context[0].nin and context[0].nout > 0:
return super(depend_array,self).__array_wrap__(arr,context)
else:
return np.ndarray.__array_wrap__(self.view(np.ndarray),arr.view(np.ndarray),context)
# whenever possible in compound operations just return a regular ndarray
__array_priority__ = -1.0
def reshape(self, newshape):
"""Changes the shape of the base array.
Args:
newshape: A tuple giving the desired shape of the new array.
Returns:
A depend_array with the dimensions given by newshape.
"""
return depend_array(depstrip(self).reshape(newshape), name=self._name, synchro=self._synchro, func=self._func, dependants=self._dependants, tainted=self._tainted, base=self._bval)
def flatten(self):
"""Makes the base array one dimensional.
Returns:
A flattened array.
"""
return self.reshape(self.size)
@staticmethod
def __scalarindex(index, depth=1):
"""Checks if an index points at a scalar value.
Used so that looking up one item in an array returns a scalar, whereas
looking up a slice of the array returns a new array with the same
dependencies as the original, so that changing the slice also taints
the global array.
Arguments:
index: the index to be checked.
depth: the rank of the array which is being accessed. Default value
is 1.
Returns:
A logical stating whether a __get__ instruction based
on index would return a scalar.
"""
if (np.isscalar(index) and depth <= 1):
return True
elif (isinstance(index, tuple) and len(index)==depth):
#if the index is a tuple check it does not contain slices
for i in index:
if not np.isscalar(i): return False
return True
return False
def __getitem__(self,index):
"""Returns value[index], after recalculating if necessary.
Overwrites the standard method of getting value, so that value
is recalculated if tainted. Scalar slices are returned as an ndarray,
so without depend machinery. If you need a "scalar depend" which
behaves as a slice, just create a 1x1 matrix, e.g b=a(7,1:2)
Args:
index: A slice variable giving the appropriate slice to be read.
"""
if self._tainted[0]:
self.update_auto()
self.taint(taintme=False)
if (self.__scalarindex(index, self.ndim)):
return depstrip(self)[index]
else:
return depend_array(depstrip(self)[index], name=self._name, synchro=self._synchro, func=self._func, dependants=self._dependants, tainted=self._tainted, base=self._bval)
def __getslice__(self,i,j):
"""Overwrites standard get function."""
return self.__getitem__(slice(i,j,None))
def get(self):
"""Alternative to standard get function."""
return self.__get__(slice(None,None,None))
def __get__(self, instance, owner):
"""Overwrites standard get function."""
# It is worth duplicating this code that is also used in __getitem__ as this
# is called most of the time, and we avoid creating a load of copies pointing to the same depend_array
if self._tainted[0]:
self.update_auto()
self.taint(taintme=False)
return self
def __setitem__(self,index,value,manual=True):
"""Alters value[index] and taints dependencies.
Overwrites the standard method of setting value, so that dependent
quantities are tainted, and so we check that computed quantities are not
manually updated.
Args:
index: A slice variable giving the appropriate slice to be read.
value: The new value of the slice.
manual: Optional boolean giving whether the value has been changed
manually. True by default.
"""
self.taint(taintme=False)
if manual:
depstrip(self)[index] = value
self.update_man()
elif index == slice(None,None,None):
self._bval[index] = value
else:
raise IndexError("Automatically computed arrays should span the whole parent")
def __setslice__(self,i,j,value):
"""Overwrites standard set function."""
return self.__setitem__(slice(i,j),value)
def set(self, value, manual=True):
"""Alterative to standard set function.
Args:
See __setitem__().
"""
self.__setitem__(slice(None,None),value=value,manual=manual)
def __set__(self, instance, value):
"""Overwrites standard set function."""
self.__setitem__(slice(None,None),value=value)
# np.dot and other numpy.linalg functions have the nasty habit to
# view cast to generate the output. Since we don't want to pass on
# dependencies to the result of these functions, and we can't use
# the ufunc mechanism to demote the class type to ndarray, we must
# overwrite np.dot and other similar functions.
# BEGINS NUMPY FUNCTIONS OVERRIDE
# ** np.dot
__dp_dot = np.dot
def dep_dot(da, db):
a=depstrip(da)
b=depstrip(db)
return __dp_dot(da,db)
np.dot = dep_dot
# ENDS NUMPY FUNCTIONS OVERRIDE
def dget(obj,member):
"""Takes an object and retrieves one of its attributes.
Note that this is necessary as calling it in the standard way calls the
__get__() function of member.
Args:
obj: A user defined class.
member: A string giving the name of an attribute of obj.
Exceptions:
KeyError: If member is not an attribute of obj.
Returns:
obj.member.
"""
return obj.__dict__[member]
def dset(obj,member,value,name=None):
"""Takes an object and sets one of its attributes.
Necessary for editing any depend object, and should be used for
initialising them as well, as often initialization occurs more than once,
with the second time effectively being an edit.
Args:
obj: A user defined class.
member: A string giving the name of an attribute of obj.
value: The new value of member.
name: New name of member.
Exceptions:
KeyError: If member is not an attribute of obj.
"""
obj.__dict__[member] = value
if not name is None:
obj.__dict__[member]._name = name
def depstrip(da):
"""Removes dependencies from a depend_array.
Takes a depend_array and returns its value as a ndarray, effectively
stripping the dependencies from the ndarray. This speeds up a lot of
calculations involving these arrays. Must only be used if the value of the
array is not going to be changed.
Args:
deparray: A depend_array.
Returns:
A ndarray with the same value as deparray.
"""
if isinstance(da, depend_array): # only bother to strip dependencies if the array actually IS a depend_array
#if da._tainted[0]:
# print "!!! WARNING depstrip called on tainted array WARNING !!!!!" # I think we can safely assume that when we call depstrip the array has been cleared already but I am not 100% sure so better check - and in case raise the update
return da.view(np.ndarray)
else:
return da
def deppipe(objfrom,memberfrom,objto,memberto):
"""Synchronizes two depend objects.
Takes two depend objects, and makes one of them depend on the other in such
a way that both keep the same value. Used for attributes such as temperature
that are used in many different modules, and so need different depend objects
in each, but which should all have the same value.
Args:
objfrom: An object containing memberfrom.
memberfrom: The base depend object.
objto: An object containing memberto.
memberto: The depend object that should be equal to memberfrom.
"""
dfrom = dget(objfrom,memberfrom)
dto = dget(objto,memberto)
dto._func = lambda : dfrom.get()
dto.add_dependency(dfrom)
def depcopy(objfrom,memberfrom,objto,memberto):
"""Copies the dependencies of one depend object to another.
Args:
See deppipe.
"""
dfrom = dget(objfrom,memberfrom)
dto = dget(objto,memberto)
dto._dependants = dfrom._dependants
dto._synchro = dfrom._synchro
dto.add_synchro(dfrom._synchro)
dto._tainted = dfrom._tainted
dto._func = dfrom._func
if hasattr(dfrom,"_bval"):
dto._bval = dfrom._bval
class dobject(object):
"""Class that allows standard notation to be used for depend objects."""
def __getattribute__(self, name):
"""Overwrites standard __getattribute__().
This changes the standard __getattribute__() function of any class that
subclasses dobject such that depend objects are called with their own
__get__() function rather than the standard one.
"""
value = object.__getattribute__(self, name)
if hasattr(value, '__get__'):
value = value.__get__(self, self.__class__)
return value
def __setattr__(self, name, value):
"""Overwrites standard __setattribute__().
This changes the standard __setattribute__() function of any class that
subclasses dobject such that depend objects are called with their own
__set__() function rather than the standard one.
"""
try:
obj = object.__getattribute__(self, name)
except AttributeError:
pass
else:
if hasattr(obj, '__set__'):
return obj.__set__(self, value)
return object.__setattr__(self, name, value)

View File

@ -0,0 +1,968 @@
"""Contains the classes that are used to write to and read from restart files.
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/>.
The classes defined in this module define the base functions which parse the
data in the restart files. Each restart object defined has a fields and an
attributes dictionary, which are filled with the tags and attributes that
are allowed to be present, along with their default values and data type.
These are then filled with the data from the xml file when the program
is initialised, and are filled by the values calculated in the program which
are then output to the checkpoint file when a restart file is required.
Also deals with checking for user input errors, of the form of misspelt tags,
bad data types, and failure to input required fields.
Classes:
Input: Base input class.
InputAttribute: Input class for attribute data.
InputValue: Input class for scalar objects.
InputArray: Input class for arrays.
input_default: Class used to create mutable objects dynamically.
"""
__all__ = ['Input', 'InputValue', 'InputAttribute', 'InputArray', 'input_default']
import numpy as np
from copy import copy
from ipi.utils.io.io_xml import *
from ipi.utils.units import unit_to_internal, unit_to_user
class input_default(object):
"""Contains information required to dynamically create objects
Used so that we can define mutable default input values to various tags
without the usual trouble with having a class object that is also mutable,
namely that all members of that class share the same mutable object, so that
changing it for one instance of that class changes it for all others. It
does this by not holding the mutable default value, but instead the
information to create it, so that each instance of an input class can
have a separate instance of the default value.
Attributes:
type: Either a class type or function call from which to create the
default object.
args: A tuple giving positional arguments to be passed to the function.
kwargs: A dictionary giving key word arguments to be passed to the
function.
"""
def __init__(self, factory, args = None, kwargs = None):
"""Initialises input_default.
Args:
type: The class or function to be used to create the default object.
args: A tuple giving the arguments to be used to initialise
the default value.
kwargs: A dictionary giving the key word arguments to be used
to initialise the default value.
"""
if args is None:
args = ()
if kwargs is None:
kwargs = {}
# a default will be generated by factory(*args, **kwargs)
# *args unpacks the tuple, and is used for positional arguments
# **kwargs unpacks the dictionary, and is used for keyword arguments
self.factory = factory
self.args = args
self.kwargs = kwargs
class Input(object):
"""Base class for input handling.
Has the generic methods for dealing with the xml input file. Parses the input
data, outputs the output data, and deals with storing and returning the
data obtained during the simulation for the restart files.
Attributes:
fields: A dictionary holding the possible tags contained within the
tags for this restart object, which are then turned into the objects
held by the object given by this restart object. The dictionary is
of the form:
{"tag name": ( Input_object,
{"default": default value,
"dtype": data type,
"options": list of available options,
"help": help string,
"dimension": dimensionality of data}), ... }.
dynamic: A dictionary holding the possible tags contained within the
tags for this restart object, which are then turned into the objects
held by the object given by this restart object. These are used for
tags that can be specified more than once.
The dictionary is of the form:
{"tag name": ( Input_object,
{"default": default value,
"dtype": data type,
"options": list of available options,
"help": help string,
"dimension": dimensionality of data}), ... }.
attribs: A dictionary holding the attribute data for the tag for this
restart object. The dictionary is of the form:
{"attribute name": ( Input_object,
{"default": default value,
"dtype": data type,
"options": list of available options,
"help": help string,
"dimension": dimensionality of data}), ... }.
extra: A list of tuples ( "name", Input_object ) that may be used to
extend the capabilities of the class, i.e. to hold several instances of
a field with the same name, or to hold variable numbers of elements.
default_help: The default help string.
_help: The help string of the object. Defaults to default_help.
_default: Optional default value.
_optional: A bool giving whether the field is a required field.
_explicit: A bool giving whether the field has been specified by the user.
_text: All text written between the tags of the object.
_label: A label to be used to identify the class in the latex user manual.
_defwrite: The string which would be output if the class has its default
value.
"""
fields = {}
attribs = {}
dynamic = {}
default_help = "Generic input value"
default_label = "" #used as a way to reference a particular class using
#hyperlinks
def __init__(self, help=None, default=None):
"""Initialises Input.
Automatically adds all the fields and attribs names to the input object's
dictionary, then initialises all the appropriate input objects
as the corresponding values.
Args:
help: A help string.
default: A default value.
"""
# list of extended (dynamic) fields
self.extra = []
if help is None:
self._help = self.default_help
else:
self._help = help
if isinstance(default,input_default):
#creates default dynamically if a suitable template is defined.
self._default = default.factory(*default.args, **default.kwargs)
else:
self._default = default
self._optional = not (self._default is None)
self._label = self.default_label
#For each tag name in the fields and attribs dictionaries,
#creates and object of the type given, expanding the dictionary to give
#the arguments of the __init__() function, then adds it to the input
#object's dictionary.
for f, v in self.fields.iteritems():
self.__dict__[f] = v[0](**v[1])
for a, v in self.attribs.iteritems():
self.__dict__[a] = v[0](**v[1])
self.set_default()
self._text = ""
# stores what we would write out if the default was set
self._defwrite = ""
if not self._default is None:
self._defwrite = self.write(name="%%NAME%%")
def set_default(self):
"""Sets the default value of the object."""
if not self._default is None:
self.store(self._default)
elif not hasattr(self, 'value'):
self.value = None #Makes sure we don't get exceptions when we
#look for self.value
self._explicit = False #Since the value was not set by the user
def store(self, value=None):
"""Dummy function for storing data."""
self._explicit = True
pass
def fetch(self):
"""Dummy function to retrieve data."""
self.check()
pass
def check(self):
"""Base function to check for input errors.
Raises:
ValueError: Raised if the user does not specify a required field.
"""
if not (self._explicit or self._optional):
raise ValueError("Uninitialized Input value of type " + type(self).__name__)
def extend(self, name, xml):
""" Dynamically add elements to the 'extra' list.
Picks from one of the templates in the self.dynamic dictionary, then
parses.
Args:
name: The tag name of the dynamically stored tag.
xml: The xml_node object used to parse the data stored in the tags.
"""
newfield = self.dynamic[name][0](**self.dynamic[name][1])
newfield.parse(xml)
self.extra.append((name,newfield))
def write(self, name="", indent="", text="\n"):
"""Writes data in xml file format.
Writes the tag, attributes, data and closing tag appropriate to the
particular fields and attribs data. Writes in a recursive manner, so
that objects contained in the fields dictionary have their write function
called, so that their tags are written between the start and end tags
of this object, as is required for the xml format.
This also adds an indent to the lower levels of the xml heirarchy,
so that it is easy to see which tags contain other tags.
Args:
name: An optional string giving the tag name. Defaults to "".
indent: An optional string giving the string to be added to the start
of the line, so usually a number of tabs. Defaults to "".
text: Additional text to be output between the tags.
Returns:
A string giving all the data contained in the fields and attribs
dictionaries, in the appropriate xml format.
"""
rstr = indent + "<" + name;
for a in self.attribs:
# only write out attributes that are not defaults
# have a very simple way to check whether they actually add something:
# we compare with the string that would be output if the argument was set
# to its default
defstr = self.__dict__[a]._defwrite.replace("%%NAME%%",a)
outstr = self.__dict__[a].write(name=a)
if outstr != defstr:
rstr += " " + outstr
rstr += ">"
rstr += text
for f in self.fields:
#only write out fields that are not defaults
defstr = self.__dict__[f]._defwrite.replace("%%NAME%%",f)
if defstr != self.__dict__[f].write(f): # here we must compute the write string twice not to be confused by indents.
rstr += self.__dict__[f].write(f, " " + indent)
for (f,v) in self.extra:
# also write out extended (dynamic) fields if present
rstr += v.write(f, " " + indent)
if text.find('\n') >= 0:
rstr += indent + "</" + name + ">\n"
else:
rstr += "</" + name + ">\n"
return rstr
def parse(self, xml=None, text=""):
"""Parses an xml file.
Uses the xml_node class defined in io_xml to read all the information
contained within the root tags, and uses it to give values for the attribs
and fields data recursively. It does this by giving all the data between
the appropriate field tag to the appropriate field restart object as a
string, and the appropriate attribute data to the appropriate attribs
restart object as a string. These data are then parsed by these objects
until all the information is read, or an input error is found.
Args:
xml: An xml_node object containing all the data for the parent
tag.
text: The data held between the start and end tags.
Raises:
NameError: Raised if one of the tags in the xml input file is
incorrect.
ValueError: Raised if the user does not specify a required field.
"""
# before starting, sets everything to its default -- if a default is set!
for a in self.attribs:
self.__dict__[a].set_default()
for f in self.fields:
self.__dict__[f].set_default()
self.extra = []
self._explicit = True
if xml is None:
self._text = text
else:
for a, v in xml.attribs.iteritems():
if a in self.attribs:
self.__dict__[a].parse(text=v)
elif a == "_text":
pass
else:
raise NameError("Attribute name '" + a + "' is not a recognized property of '" + xml.name + "' objects")
for (f, v) in xml.fields: #reads all field and dynamic data.
if f in self.fields:
self.__dict__[f].parse(xml=v)
elif f == "_text":
self._text = v
elif f in self.dynamic:
self.extend(f, v)
else:
raise NameError("Tag name '" + f + "' is not a recognized property of '" + xml.name + "' objects")
#checks for missing arguments.
for a in self.attribs:
va = self.__dict__[a]
if not (va._explicit or va._optional):
raise ValueError("Attribute name '" + a + "' is mandatory and was not found in the input for the property " + xml.name)
for f in self.fields:
vf = self.__dict__[f]
if not (vf._explicit or vf._optional):
raise ValueError("Field name '" + f + "' is mandatory and was not found in the input for the property " + xml.name)
def detail_str(self):
"""Prints out the supplementary information about a particular input class.
Used to print out the dimensions, default value, possible options and data
type of an input value to the LaTeX helf file.
"""
xstr = ""
if hasattr(self, '_dimension') and self._dimension != "undefined": #gives dimension
xstr += "dimension: " + self._dimension + "; "
if self._default != None and issubclass(self.__class__, InputAttribute):
#We only print out the default if it has a well defined value.
#For classes such as InputCell, self._default is not the value,
#instead it is an object that is stored to give the default value in
#self.value. For this reason we print out self.value at this stage,
#and not self._default
xstr += "default: " + self.pprint(self.value) + "; "
if issubclass(self.__class__, InputAttribute):
#if possible, prints out the type of data that is being used
xstr += "data type: " + self.type_print(self.type) + "; "
if hasattr(self, "_valid"):
if self._valid is not None:
xstr += "options: " #prints out valid options, if
for option in self._valid: #required.
xstr += "`" + str(option) + "', "
xstr = xstr.rstrip(", ")
xstr += "; "
return xstr
def help_latex(self, name="", level=0, stop_level=None, standalone=True):
"""Function to generate a LaTeX formatted help file.
Args:
name: Name of the tag that has to be written out.
level: Current level of the hierarchy being considered.
stop_level: The depth to which information will be given. If not given,
will give all information.
standalone: A boolean giving whether the latex file produced will be a
stand-alone document, or will be intended as a section of a larger
document with cross-references between the different sections.
Returns:
A LaTeX formatted string.
"""
#stops when we've printed out the prerequisite number of levels
if (not stop_level is None and level > stop_level):
return ""
rstr = ""
if level == 0:
if standalone:
#assumes that it is a stand-alone document, so must have
#document options.
rstr += r"\documentclass[12pt,fleqn]{report}"
rstr += r"""
\usepackage{etoolbox}
\usepackage{suffix}
\newcommand{\ipiitem}[3]{%
\setul{1pt}{.4pt}\ifblank{#1}{}{\ifstrequal{#1}{\underline{\smash{}}}{}{
{\noindent\textbf{#1}:\rule{0.0pt}{1.05\baselineskip}\quad}}}% uses a strut to add a bit of vertical space
{#2}\parskip=0pt\par
\ifblank{#3}{}%
{ {\hfill\raggedleft\textit{\small #3}\par} }
}
\makeatletter
\newenvironment{ipifield}[4]{%
\ifblank{#1}{}{\vspace{0.5em}}
\noindent\parskip=0pt\begin{tabular}[t]{|p{1.0\linewidth}}
%cell without border
\multicolumn{1}{@{}p{1.0\linewidth}}{
\ipiitem{\underline{\smash{#1}}}{#2}{}
\ifblank{#4}{ %
\ifblank{#3}{}{{\hfill\raggedleft\textit{\small #3}}\par}}{} } \vspace{-1em}\\ %
% cell with border
\ifblank{#4}{} %
{ \ifblank{#3}{}{\vspace{-1em}{\hfill\raggedleft\textit{\small #3}}\par} %
{#4}\vspace{-1em}\\\hline } % negative vspace to undo the line break
\end{tabular}
\parskip=0pt\list{}{\listparindent 1.5em%
\leftmargin \listparindent
\rightmargin 0pt
\parsep 0pt
\itemsep 0pt
\topsep 0pt
}%
\item\relax
}
{\endlist}
\makeatother
"""
rstr += "\n\\begin{document}\n"
if self._label != "" and not standalone:
#assumes that it is part of a cross-referenced document, so only
#starts a new section.
rstr += "\\section{" + self._label + "}\n"
rstr += "\\label{" + self._label + "}\n"
rstr += "\\begin{ipifield}{}%\n"
else:
if self._label != "" and not standalone:
rstr += "\\begin{ipifield}{\hyperref["+self._label+"]{"+name+"}}%\n"
else:
rstr += "\\begin{ipifield}{"+name+"}%\n"
rstr += "{"+self._help+"}%\n"
rstr += "{"+self.detail_str()+"}%\n"
rstr += "{"
# Prints out the attributes
if len(self.attribs) != 0:
#don't print out units if not necessary
if len(self.attribs) == 1 and (("units" in self.attribs) and self._dimension == "undefined"):
pass
else:
for a in self.attribs:
#don't print out units if not necessary
if not (a == "units" and self._dimension == "undefined"):
rstr += "\\ipiitem{" + a + "}%\n{" + self.__dict__[a]._help + "}%\n{"+self.__dict__[a].detail_str()+"}%\n" #!!MUST ADD OTHER STUFF
rstr+="}\n"
#As above, for the fields. Only prints out if we have not reached the
#user-specified limit.
if len(self.fields) != 0 and level != stop_level:
for f in self.fields:
rstr += self.__dict__[f].help_latex(name=f, level=level+1, stop_level=stop_level, standalone=standalone)
if len(self.dynamic) != 0 and level != stop_level:
for f, v in self.dynamic.iteritems():
dummy_obj = v[0](**v[1])
rstr += dummy_obj.help_latex(name=f, level=level+1, stop_level=stop_level, standalone=standalone)
rstr += "\\end{ipifield}\n"
if level == 0 and standalone:
#ends the created document if it is not part of a larger document
rstr += "\\end{document}"
#Some escape characters are necessary for the proper latex formatting
rstr = rstr.replace('_', '\\_')
rstr = rstr.replace('\\\\_', '\\_')
rstr = rstr.replace('...', '\\ldots ')
rstr = rstr.replace('<', '$<$')
rstr = rstr.replace('>', '$>$')
return rstr
def pprint(self, default, indent="", latex = True):
"""Function to convert arrays and other objects to human-readable strings.
Args:
default: The object that needs to be converted to a string.
indent: The indent at the beginning of a line.
latex: A boolean giving whether the string will be latex-format.
Returns:
A formatted string.
"""
if type(default) is np.ndarray:
if default.shape == (0,):
return " [ ] " #proper treatment of empty arrays.
else:
#indents new lines for multi-D arrays properly
rstr = "\n" + indent + " "
rstr += str(default).replace("\n", "\n" + indent + " ")
if not latex:
rstr += "\n" + indent + " "
return rstr
elif type(default) == str:
if latex:
return "`" + default + "'" #indicates that it is a string
else:
return " " + default + " "
elif default == []:
return " [ ] "
elif default == {}:
if latex:
return " \\{ \\} " #again, escape characters needed for latex
else: #formatting
return " { } "
else:
#in most cases standard formatting will do
return " " + str(default) + " "
def type_print(self, dtype):
"""Function to convert a data types to human-readable strings.
Args:
dtype: A data type.
"""
if dtype == bool:
return "boolean"
elif dtype == float or dtype == np.float64:
return "float"
elif dtype == int or dtype == np.uint64 or dtype == np.int64:
return "integer"
elif dtype == dict:
return "dictionary"
elif dtype == str:
return "string"
elif dtype == tuple:
return "tuple"
else:
raise TypeError("Unrecognized data type " + str(dtype))
def help_xml(self, name="", indent="", level=0, stop_level=None):
"""Function to generate an xml formatted help file.
Args:
name: A string giving the name of the root node.
indent: The indent at the beginning of a line.
level: Current level of the hierarchy being considered.
stop_level: The depth to which information will be given. If not given,
all information will be given
Returns:
An xml formatted string.
"""
#stops when we've printed out the prerequisite number of levels
if (not stop_level is None and level > stop_level):
return ""
#these are booleans which tell us whether there are any attributes
#and fields to print out
show_attribs = (len(self.attribs) != 0)
show_fields = (not (len(self.fields) == 0 and len(self.dynamic) == 0)) and level != stop_level
rstr = ""
rstr = indent + "<" + name; #prints tag name
for a in self.attribs:
if not (a == "units" and self._dimension == "undefined"):
#don't print out units if not necessary
rstr += " " + a + "=''" #prints attribute names
rstr += ">\n"
#prints help string
rstr += indent + " <help> " + self._help + " </help>\n"
if show_attribs:
for a in self.attribs:
if not (a == "units" and self._dimension == "undefined"):
#information about tags is found in tags beginning with the name
#of the attribute
rstr += indent + " <" + a + "_help> " + self.__dict__[a]._help + " </" + a + "_help>\n"
#prints dimensionality of the object
if hasattr(self, '_dimension') and self._dimension != "undefined":
rstr += indent + " <dimension> " + self._dimension + " </dimension>\n"
if self._default != None and issubclass(self.__class__, InputAttribute):
#We only print out the default if it has a well defined value.
#For classes such as InputCell, self._default is not the value,
#instead it is an object that is stored, putting the default value in
#self.value. For this reason we print out self.value at this stage,
#and not self._default
rstr += indent + " <default>" + self.pprint(self.value, indent=indent, latex=False) + "</default>\n"
if show_attribs:
for a in self.attribs:
if not (a == "units" and self._dimension == "undefined"):
if self.__dict__[a]._default is not None:
rstr += indent + " <" + a + "_default>" + self.pprint(self.__dict__[a]._default, indent=indent, latex=False) + "</" + a + "_default>\n"
#prints out valid options, if required.
if hasattr(self, "_valid"):
if self._valid is not None:
rstr += indent + " <options> " + str(self._valid) + " </options>\n"
if show_attribs:
for a in self.attribs:
if not (a == "units" and self._dimension == "undefined"):
if hasattr(self.__dict__[a], "_valid"):
if self.__dict__[a]._valid is not None:
rstr += indent + " <" + a + "_options> " + str(self.__dict__[a]._valid) + " </" + a + "_options>\n"
#if possible, prints out the type of data that is being used
if issubclass(self.__class__, InputAttribute):
rstr += indent + " <dtype> " + self.type_print(self.type) + " </dtype>\n"
if show_attribs:
for a in self.attribs:
if not (a == "units" and self._dimension == "undefined"):
rstr += indent + " <" + a + "_dtype> " + self.type_print(self.__dict__[a].type) + " </" + a + "_dtype>\n"
#repeats the above instructions for any fields or dynamic tags.
#these will only be printed if their level in the hierarchy is not above
#the user specified limit.
if show_fields:
for f in self.fields:
rstr += self.__dict__[f].help_xml(f, " " + indent, level+1, stop_level)
for f, v in self.dynamic.iteritems():
#we must create the object manually, as dynamic objects are
#not automatically added to the input object's dictionary
dummy_obj = v[0](**v[1])
rstr += dummy_obj.help_xml(f, " " + indent, level+1, stop_level)
rstr += indent + "</" + name + ">\n"
return rstr
class InputAttribute(Input):
"""Class for handling attribute data.
Has the methods for dealing with attribute data of the form:
<tag_name attrib='data'> ..., where data is just a value. Takes the data and
converts it to the required data_type, so that it can be used in the
simulation.
Attributes:
type: Data type of the data.
value: Value of data. Also specifies data type if type is None.
_valid: An optional list of valid options.
"""
def __init__(self, help=None, default=None, dtype=None, options=None):
"""Initialises InputAttribute.
Args:
help: A help string.
default: A default value.
dtype: An optional data type. Defaults to None.
options: An optional list of valid options.
"""
if not dtype is None:
self.type = dtype
else:
raise TypeError("You must provide dtype")
super(InputAttribute,self).__init__(help, default)
if options is not None:
self._valid = options
if not default is None and not self._default in self._valid:
#This makes sure that the programmer has set the default value
#so that it is a valid value.
raise ValueError("Default value '" + str(self._default) + "' not in option list " + str(self._valid)+ "\n" + self._help)
else:
self._valid = None
def parse(self, text=""):
"""Reads the data for a single attribute value from an xml file.
Args:
text: The data held between the start and end tags.
"""
super(InputAttribute, self).parse(text=text)
self.value = read_type(self.type, self._text)
def store(self, value):
"""Stores the input data.
Args:
value: The raw data to be stored.
"""
super(InputAttribute,self).store(value)
self.value = value
def fetch(self):
"""Returns the stored data."""
super(InputAttribute,self).fetch()
return self.value
def check(self):
"""Function to check for input errors.
Raises:
ValueError: Raised if the value chosen is not one of the valid options.
"""
super(InputAttribute,self).check()
if not (self._valid is None or self.value in self._valid):
#This checks that the user has set the value to a valid value.
raise ValueError(str(self.value) + " is not a valid option (" + str(self._valid) + ")")
def write(self, name=""):
"""Writes data in xml file format.
Writes the attribute data in the appropriate format.
Args:
name: An optional string giving the attribute name. Defaults to "".
Returns:
A string giving the stored value in the appropriate format.
"""
return name + "='" + write_type(self.type, self.value) + "'"
class InputValue(InputAttribute):
"""Scalar class for input handling.
Has the methods for dealing with simple data tags of the form:
<tag_name> data </tag_name>, where data is just a value. Takes the data and
converts it to the required data_type, so that it can be used in the
simulation.
Attributes:
units: The units that the input data is given in.
_dimension: The dimensionality of the data.
"""
default_dimension = "undefined"
default_units = ""
attribs= { "units" : ( InputAttribute, { "dtype" : str, "help" : "The units the input data is given in.", "default" : default_units } ) }
def __init__(self, help=None, default=None, dtype=None, options=None, dimension=None):
"""Initialises InputValue.
Args:
help: A help string.
dimension: The dimensionality of the value.
default: A default value.
dtype: An optional data type. Defaults to None.
options: An optional list of valid options.
"""
# a note on units handling:
# 1) units are only processed at parse/fetch time:
# internally EVERYTHING is in internal units
# 2) if one adds an explicit "units" attribute to a derived class,
# the internal units handling will be just ignored
if dimension is None:
self._dimension = self.default_dimension
else:
self._dimension = dimension
super(InputValue,self).__init__(help, default, dtype, options)
def store(self, value, units=""):
"""Converts the data to the appropriate data type and units and stores it.
Args:
value: The raw data to be stored.
units: Optional string giving the units that the data should be stored
in.
"""
super(InputValue,self).store(value)
if units != "":
self.units.store(units) #User can define in the code the units to be
#printed
self.value = value
if self._dimension != "undefined":
self.value *= unit_to_user(self._dimension, units, 1.0)
def fetch(self):
"""Returns the stored data in the user defined units."""
super(InputValue,self).fetch()
rval = self.value
if self._dimension != "undefined":
rval *= unit_to_internal(self._dimension, self.units.fetch(), 1.0)
return rval
def write(self, name="", indent=""):
"""Writes data in xml file format.
Writes the data in the appropriate format between appropriate tags.
Args:
name: An optional string giving the tag name. Defaults to "".
indent: An optional string giving the string to be added to the start
of the line, so usually a number of tabs. Defaults to "".
Returns:
A string giving the stored value in the appropriate xml format.
"""
return Input.write(self, name=name, indent=indent, text=write_type(self.type, self.value))
def parse(self, xml=None, text=""):
"""Reads the data for a single value from an xml file.
Args:
xml: An xml_node object containing the all the data for the parent
tag.
text: The data held between the start and end tags.
"""
Input.parse(self, xml=xml, text=text)
self.value = read_type(self.type, self._text)
ELPERLINE = 5
class InputArray(InputValue):
"""Array class for input handling.
Has the methods for dealing with simple data tags of the form:
<tag_name shape="(shape)"> data </tag_name>, where data is an array
of the form [data[0], data[1], ... , data[length]].
Takes the data and converts it to the required data type,
so that it can be used in the simulation. Also holds the shape of the array,
so that we can use a simple 1D list of data to specify a multi-dimensional
array.
Attributes:
shape: The shape of the array.
"""
attribs = copy(InputValue.attribs)
attribs["shape"] = (InputAttribute, {"dtype": tuple, "help": "The shape of the array.", "default": (0,)})
def __init__(self, help=None, default=None, dtype=None, dimension=None):
"""Initialises InputArray.
Args:
help: A help string.
dimension: The dimensionality of the value.
default: A default value.
dtype: An optional data type. Defaults to None.
"""
super(InputArray,self).__init__(help, default, dtype, dimension=dimension)
def store(self, value, units=""):
"""Converts the data to the appropriate data type, shape and units and
stores it.
Args:
value: The raw data to be stored.
units: Optional string giving the units that the data should be stored
in.
"""
super(InputArray,self).store(value=np.array(value, dtype=self.type).flatten().copy(), units=units)
self.shape.store(value.shape)
#if the shape is not specified, assume the array is linear.
if self.shape.fetch() == (0,):
self.shape.store((len(self.value),))
def fetch(self):
"""Returns the stored data in the user defined units."""
value = super(InputArray,self).fetch()
#if the shape is not specified, assume the array is linear.
if self.shape.fetch() == (0,):
value = np.resize(self.value,0).copy()
else:
value = self.value.reshape(self.shape.fetch()).copy()
return value
def write(self, name="", indent=""):
"""Writes data in xml file format.
Writes the data in the appropriate format between appropriate tags. Note
that only ELPERLINE values are printed on each line if there are more
than this in the array. If the values are floats, or another data type
with a fixed width of data output, then they are aligned in columns.
Args:
name: An optional string giving the tag name. Defaults to "".
indent: An optional string giving the string to be added to the start
of the line, so usually a number of tabs. Defaults to "".
Returns:
A string giving the stored value in the appropriate xml format.
"""
rstr = ""
if (len(self.value) > ELPERLINE):
rstr += "\n" + indent + " [ "
else:
rstr += " [ " #inlines the array if it is small enough
for i, v in enumerate(self.value):
if (len(self.value) > ELPERLINE and i > 0 and i%ELPERLINE == 0):
rstr += "\n" + indent + " "
rstr += write_type(self.type, v) + ", "
rstr = rstr.rstrip(", ") #get rid of trailing commas
if (len(self.value) > ELPERLINE):
rstr += " ]\n"
else:
rstr += " ] "
return Input.write(self, name=name, indent=indent, text=rstr)
def parse(self, xml=None, text=""):
"""Reads the data for an array from an xml file.
Args:
xml: An xml_node object containing the all the data for the parent
tag.
text: The data held between the start and end tags.
"""
Input.parse(self, xml=xml, text=text)
self.value = read_array(self.type, self._text)
#if the shape is not specified, assume the array is linear.
if self.shape.fetch() == (0,):
self.shape.store((len(self.value),))

View File

@ -0,0 +1,12 @@
-- IO functions directory --
* This is the directory containing input/output functions.
* Files:
- io_binary.py: Contains the functions to write output in binary format.
- io_pdb.py: Contains the functions to read pdb structure files and to
create pdb trajectory output files.
- io_xml.py: Contains the functions used to read the xml input file and
to format the restart output file.
- io_xyz.py: Contains the functions to read xyz structure files and to
create xyz trajectory output files.

View File

@ -0,0 +1 @@
__all__ = [ "io_xml", "io_pdb" , "io_xyz", "io_binary" ]

View File

@ -0,0 +1,47 @@
"""Contains the functions used to print the trajectories and read input
configurations (or even full status dump) as unformatted binary.
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_bin: Prints an atomic configuration.
"""
__all__ = ['print_bin']
import os
import numpy as np
import math, sys
from ipi.utils.depend import depstrip
def print_bin(atoms, cell, filedesc = sys.stdout, title=""):
"""Prints the centroid configurations, into a binary file.
Args:
beads: 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.
"""
buff = filedesc # .buffer
cell.h.tofile(buff)
nat = np.asarray([atoms.natoms])
nat.tofile(buff)
atoms.names.tofile(buff)
atoms.q.tofile(buff)

View File

@ -0,0 +1,173 @@
"""Contains the functions used to print the trajectories and read input
configurations with pdb 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_pdb_path: Prints all the bead configurations, and shows the ring
polymer connectivity.
print_pdb: Prints the centroid configurations.
read_pdb: Reads the cell parameters and atom configurations from a pdb file.
"""
__all__ = ['print_pdb_path', 'print_pdb', 'read_pdb']
import numpy as np
import sys
import ipi.utils.mathtools as mt
from ipi.utils.depend import depstrip
from ipi.engine.cell import Cell
from ipi.engine.atoms import Atoms
from ipi.utils.units import *
def print_pdb_path(beads, cell, filedesc = sys.stdout):
"""Prints all the bead configurations, into a pdb formatted file.
Prints the ring polymer springs as well as the bead positions using the
CONECT command. Also prints the cell parameters in standard pdb form. Note
that the angles are in degrees.
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)
z = 1 #What even is this parameter?
filedesc.write("CRYST1%9.3f%9.3f%9.3f%7.2f%7.2f%7.2f%s%4i\n" % (a, b, c, alpha, beta, gamma, " P 1 ", z))
natoms = beads.natoms
nbeads = beads.nbeads
for j in range(nbeads):
for i in range(natoms):
qs = depstrip(beads.q)
lab = depstrip(beads.names)
filedesc.write("ATOM %5i %4s%1s%3s %1s%4i%1s %8.3f%8.3f%8.3f%6.2f%6.2f %2s%2i\n" % (j*natoms+i+1, lab[i],' ',' 1',' ',1,' ', qs[j][3*i], qs[j][3*i+1], qs[j][3*i+2],0.0,0.0,' ',0))
if nbeads > 1:
for i in range(natoms):
filedesc.write("CONECT%5i%5i\n" % (i+1, (nbeads-1)*natoms+i+1))
for j in range(nbeads-1):
for i in range(natoms):
filedesc.write("CONECT%5i%5i\n" % (j*natoms+i+1, (j+1)*natoms+i+1))
filedesc.write("END\n")
def print_pdb(atoms, cell, filedesc = sys.stdout, title=""):
"""Prints the atom configurations, into a pdb formatted file.
Also prints the cell parameters in standard pdb form. Note
that the angles are in degrees.
Args:
atoms: An atoms object giving the atom positions.
cell: A cell object giving the system box.
filedesc: An open writable file object. Defaults to standard output.
title: An optional string of max. 70 characters.
"""
if title != "" :
filedesc.write("TITLE %70s\n" % (title))
a, b, c, alpha, beta, gamma = mt.h2abc_deg(cell.h)
z = 1
filedesc.write("CRYST1%9.3f%9.3f%9.3f%7.2f%7.2f%7.2f%s%4i\n" % (a, b, c, alpha, beta, gamma, " P 1 ", z))
natoms = atoms.natoms
qs = depstrip(atoms.q)
lab = depstrip(atoms.names)
for i in range(natoms):
filedesc.write("ATOM %5i %4s%1s%3s %1s%4i%1s %8.3f%8.3f%8.3f%6.2f%6.2f %2s%2i\n" % (i+1, lab[i], ' ', ' 1', ' ', 1, ' ', qs[3*i], qs[3*i+1], qs[3*i+2], 0.0, 0.0, ' ', 0))
filedesc.write("END\n")
def read_pdb(filedesc):
"""Takes a pdb-style file and creates an Atoms and Cell object.
Args:
filedesc: An open readable file object from a pdb formatted file.
Returns:
An Atoms object with the appropriate atom labels, masses and positions,
and a Cell object with the appropriate cell dimensions and an estimate
of a reasonable cell mass.
"""
header = filedesc.readline()
if "TITLE" in header: header = filedesc.readline() # skip the comment field
if header == "":
raise EOFError("End of file or empty header in PDB file")
a = float(header[6:15])
b = float(header[15:24])
c = float(header[24:33])
alpha = float(header[33:40])
beta = float(header[40:47])
gamma = float(header[47:54])
alpha *= np.pi/180.0
beta *= np.pi/180.0
gamma *= np.pi/180.0
h = mt.abc2h(a, b, c, alpha, beta, gamma)
cell = Cell(h)
natoms = 0
body = filedesc.readline()
qatoms = []
names = []
masses = []
while (body.strip() != "" and body.strip() != "END"):
natoms += 1
name = body[12:16].strip()
names.append(name)
masses.append(Elements.mass(name))
x = float(body[31:39])
y = float(body[39:47])
z = float(body[47:55])
qatoms.append(x)
qatoms.append(y)
qatoms.append(z)
body = filedesc.readline()
atoms = Atoms(natoms)
atoms.q = np.asarray(qatoms)
atoms.names = np.asarray(names,dtype='|S4')
atoms.m = np.asarray(masses)
return atoms, cell
def iter_pdb(filedesc):
"""Takes a pdb-style file and yields one Atoms, Cell tuple after another.
Args:
filedesc: An open readable file object from a pdb formatted file.
Returns:
Generator over the pdb trajectory, that yields
(Atoms, Cell) tuple with the appropriate atom labels, masses and positions.
"""
try:
while 1:
atoms, cell = read_pdb(filedesc)
yield atoms, cell
except EOFError:
pass

View File

@ -0,0 +1,520 @@
"""Contains the functions used to read the input file and print the checkpoint
files with xml 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:
xml_node: Class to handle a particular xml tag.
xml_handler: Class giving general xml data reading methods.
xml_parse_string: Parses a string made from a section of a xml input file.
xml_parse_file: Parses an entire xml input file.
read_type: Reads a string and outputs data of a specified type.
read_float: Reads a string and outputs a float.
read_int: Reads a string and outputs an integer.
read_bool: Reads a string and outputs a boolean.
read_list: Reads a string and outputs a list.
read_array: Reads a string and outputs an array.
read_tuple: Reads a string and outputs a tuple.
read_dict: Reads a string and outputs a dictionary.
write_type: Writes a string from data of a specified type.
write_list: Writes a string from a list.
write_tuple: Writes a string from a tuple.
write_float: Writes a string from a float.
write_bool: Writes a string from a boolean.
write_dict: Writes a string from a dictionary.
"""
__all__ = ['xml_node', 'xml_handler', 'xml_parse_string', 'xml_parse_file',
'read_type', 'read_float', 'read_int', 'read_bool', 'read_list',
'read_array', 'read_tuple', 'read_dict', 'write_type', 'write_list',
'write_tuple', 'write_float', 'write_bool', 'write_dict']
from xml.sax import parseString, parse
from xml.sax.handler import ContentHandler
import numpy as np
import string
class xml_node(object):
"""Class to handle a particular xml tag.
Tags are generally written in the form
<tag_name attribs="attrib_data"> main_data </tag_name>. This class holds
tag_name, attrib_data and main_data separately so they can be used to
create the objects with the appropriate names and data.
Attributes:
attribs: The attribute data for the tag.
fields: The rest of the data.
name: The tag name.
"""
def __init__(self, attribs=None, name="", fields=None):
"""Initialises xml_node.
Args:
attribs: An optional dictionary giving attribute data. Defaults to {}.
fields: An optional dictionary holding all the data between the start
and end tags, including information about other nodes.
Defaults to {}.
name: An optional string giving the tag name. Defaults to ''.
"""
if attribs is None:
attribs = {}
if fields is None:
fields = []
self.attribs = attribs
self.name = name
self.fields = fields
class xml_handler(ContentHandler):
"""Class giving general xml_reading methods.
Uses the standard python xml_reader to read the different kinds of data.
Keeps track of the heirarchial nature of an xml file by recording the level
of nesting, so that the correct data and attributes can be associated with
the correct tag name.
Attributes:
root: An xml_node object for the root node.
open: The list of the tags that the parser is currently between the start
and end tags of.
level: The level of nesting that the parser is currently at.
buffer: A list of the data found between the tags at the different levels
of nesting.
"""
def __init__(self):
"""Initialises xml_handler."""
#root xml node with all the data
self.root = xml_node(name="root", fields=[])
self.open = [self.root]
#current level of the hierarchy
self.level = 0
#Holds all the data between each of the tags.
#If level = 1, then buffer[0] holds all the data collected between the
#root tags, and buffer[1] holds all the data collected between the
#first child tag.
self.buffer = [[""]]
def startElement(self, name, attrs):
"""Reads an opening tag.
Adds the opening tag to the list of open tags, adds a new space in the
buffer, reads the appropriate attributes and adds a new level to the
heirarchy.
Args:
name: The tag_name.
attrs: The attribute data.
"""
#creates a new node
newnode = xml_node(attribs=dict((k,attrs[k]) for k in attrs.keys()), name=name, fields=[])
#adds it to the list of open nodes
self.open.append(newnode)
#adds it to the list of fields of the parent tag
self.open[self.level].fields.append((name,newnode))
#gets ready to read new data
self.buffer.append([""])
self.level += 1
def characters(self, data):
"""Reads data.
Adds the data to the buffer of the current level of the heirarchy.
Data is read as a string, and needs to be converted to the required
type later.
Args:
data: The data to be read.
"""
self.buffer[self.level].append(data)
def endElement(self, name):
"""Reads a closing tag.
Once all the data has been read, and the closing tag found, the buffer
is read into the appropriate field.
Args:
name: The tag_name.
"""
#all the text found between the tags stored in the appropriate xml_node
#object
self.buffer[self.level] = ''.join(self.buffer[self.level])
self.open[self.level].fields.append(("_text" , self.buffer[self.level]))
#'closes' the xml_node object, as we are no longer within its tags, so
#there is no more data to be added to it.
#Note that the xml_node is still held within the parent tag, so we
#no longer require this xml node object.
self.buffer.pop(self.level)
self.open.pop(self.level)
self.level -= 1
def xml_parse_string(buf):
"""Parses a string made from a section of a xml input file.
Args:
buf: A string in correct xml format.
Returns:
A xml_node for the root node of the file.
"""
myhandle = xml_handler()
parseString(buf, myhandle)
return myhandle.root
def xml_parse_file(stream):
"""Parses an entire xml input file.
Args:
stream: A string describing a xml formatted file.
Returns:
A xml_node for the root node of the file.
"""
myhandle = xml_handler()
parse(stream, myhandle)
return myhandle.root
def read_type(type, data):
"""Reads a string and outputs data of a specified type.
Args:
type: The data type of the target container.
data: The string to be read in.
Raises:
TypeError: Raised if it tries to read into a data type that has not been
implemented.
Returns:
An object of type type.
"""
if not type in readtype_funcs:
raise TypeError("Conversion not available for given type")
return type(readtype_funcs[type](data))
def read_float(data):
"""Reads a string and outputs a float.
Args:
data: The string to be read in.
Raises:
ValueError: Raised if the input data is not of the correct format.
Returns:
A float.
"""
return float(data)
def read_int(data):
"""Reads a string and outputs a integer.
Args:
data: The string to be read in.
Raises:
ValueError: Raised if the input data is not of the correct format.
Returns:
An integer.
"""
return int(data)
def read_bool(data):
"""Reads a string and outputs a boolean.
Takes a string of the form 'true' or 'false', and returns the appropriate
boolean.
Args:
data: The string to be read in.
Raises:
ValueError: Raised if the string is not 'true' or 'false'.
Returns:
A boolean.
"""
if data.strip().upper() == "TRUE":
return True
elif data.strip().upper() == "FALSE":
return False
else:
raise ValueError(data + " does not represent a bool value")
def read_list(data, delims="[]", split=",", strip=" \n\t'"):
"""Reads a formatted string and outputs a list.
The string must be formatted in the correct way.
The start character must be delimiters[0], the end character
must be delimiters[1] and each element must be split along
the character split. Characters at the beginning or
end of each element in strip are ignored. The standard list format is of the
form '[array[0], array[1],..., array[n]]', which is used for actual lists.
Other formats are used for tuples and dictionaries.
Args:
data: The string to be read in. '[]' by default.
delims: A string of two characters giving the first and last character of
the list format. ',' by default.
split: The character between different elements of the list format.
strip: Characters to be removed from the beginning and end of each
element. ' \n\t' by default.
Raises:
ValueError: Raised if the input data is not of the correct format.
Returns:
A list of strings.
"""
try:
begin = data.index(delims[0])
end = data.index(delims[1])
except ValueError:
raise ValueError("Error in list syntax: could not locate delimiters")
rlist = data[begin+1:end].split(split)
for i in range(len(rlist)):
rlist[i] = rlist[i].strip(strip)
# handles empty lists correctly
if len(rlist) == 1 and rlist[0] == "":
rlist = []
return rlist
def read_array(dtype, data):
"""Reads a formatted string and outputs an array.
The format is as for standard python arrays, which is
[array[0], array[1], ... , array[n]]. Note the use of comma separators, and
the use of square brackets.
Args:
data: The string to be read in.
dtype: The data type of the elements of the target array.
Raises:
ValueError: Raised if the input data is not of the correct format.
Returns:
An array of data type dtype.
"""
rlist = read_list(data)
for i in range(len(rlist)):
rlist[i] = read_type(dtype,rlist[i])
return np.array(rlist, dtype)
def read_tuple(data, delims="()", split=",", strip=" \n\t'", arg_type=int):
"""Reads a formatted string and outputs a tuple.
The format is as for standard python tuples, which is
(tuple[0], tuple[1], ... , tuple[n]). Note the comma
separators, and the use of brackets.
Args:
data: The string to be read in.
delims: A string of two characters giving the first and last character of
the list format. ',' by default.
split: The character between different elements of the list format.
strip: Characters to be removed from the beginning and end of each
element. ' \n\t' by default.
arg_type: The strings in the input will be converted, and a tuple
of ar_type will be returned.
Raises:
ValueError: Raised if the input data is not of the correct format.
Returns:
A tuple of elements of the specified data type.
"""
rlist = read_list(data, delims=delims, split=split, strip=strip)
return tuple([arg_type(i) for i in rlist])
def read_dict(data, delims="{}", split=",", key_split=":", strip=" \n\t"):
"""Reads a formatted string and outputs a dictionary.
The format is as for standard python dictionaries, which is
{keyword[0]: arg[0], keyword[1]: arg[1], ... , keyword[n]: arg[n]}. Note the
comma separators, and the use of curly brackets.
Args:
data: The string to be read in.
delims: A string of two characters giving the first and last character of
the list format. ',' by default.
split: The character between different elements of the list format.
key_split: The character between the key word and the value.
strip: Characters to be removed from the beginning and end of each
element. ' \n\t' by default.
Raises:
ValueError: Raised if the input data is not of the correct format.
Returns:
A dictionary of strings.
"""
rlist = read_list(data, delims=delims, split=split, strip=strip)
def mystrip(data):
return data.strip(strip)
rdict = {}
for s in rlist:
rtuple = map(mystrip,s.split(key_split))
if not len(rtuple) == 2:
raise ValueError("Format for a key:value format is wrong for item " + s)
rdict[rtuple[0]] = rtuple[1]
return rdict
readtype_funcs = {np.ndarray: read_array, dict: read_dict, float: read_float, int: read_int, bool: read_bool, str: string.strip, tuple: read_tuple, np.uint : read_int}
def write_type(type, data):
"""Writes a formatted string from a value of a specified type.
Args:
type: The data type of the value.
data: The value to be read in.
Raises:
TypeError: Raised if it tries to write from a data type that has not been
implemented.
Returns:
A formatted string.
"""
if not type in writetype_funcs:
raise TypeError("Conversion not available for given type")
return writetype_funcs[type](data)
def write_list(data, delims="[]"):
"""Writes a formatted string from a list.
The format of the output is as for a standard python list,
[list[0], list[1],..., list[n]]. Note the space after the commas, and the
use of square brackets.
Args:
data: The value to be read in.
delims: An optional string of two characters giving the first and last
character to be printed. Defaults to "[]".
Returns:
A formatted string.
"""
rstr = delims[0]
for v in data:
rstr += str(v) + ", "
rstr = rstr.rstrip(", ")
rstr += delims[1]
return rstr
def write_tuple(data):
"""Writes a formatted string from a tuple.
The format of the output is as for a standard python tuple,
(tuple[0], tuple[1],..., tuple[n]). Note the space after the commas, and the
use of brackets.
Args:
data: The value to be read in.
Returns:
A formatted string.
"""
return write_list(data, delims="()")
def write_float(data):
"""Writes a formatted string from a float.
Floats are printed out in exponential format, to 8 decimal places and
filling up any spaces under 16 not used with spaces.
For example 1.0 --> ' 1.00000000e+00'
Args:
data: The value to be read in.
Returns:
A formatted string.
"""
return "%16.8e" % (data)
def write_bool(data):
"""Writes a formatted string from a float.
Booleans are printed as a string of either ' true' or 'false'. Note that
both are printed out as exactly 5 characters.
Args:
data: The value to be read in.
Returns:
A formatted string.
"""
return "%5.5s" % (str(data))
def write_dict(data, delims="{}"):
"""Writes a formatted string from a dictionary.
The format of the output is as for a standard python dictionary,
{keyword[0]: arg[0], keyword[1]: arg[1],..., keyword[n]: arg[n]}. Note the
space after the commas, and the use of curly brackets.
Args:
data: The value to be read in.
delims: An optional string of two characters giving the first and last
character to be printed. Defaults to "{}".
Returns:
A formatted string.
"""
rstr = delims[0]
for v in data:
rstr += str(v) + ": " + str(data[v]) + ", "
rstr = rstr.strip(", ")
rstr += delims[1]
return rstr
writetype_funcs = {float: write_float, dict: write_dict, int: str, bool: write_bool, str: string.strip, tuple: write_tuple, np.uint : str}

View 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

View File

@ -0,0 +1,343 @@
"""Contains simple algorithms.
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:
matrix_exp: Computes the exponential of a square matrix via a Taylor series.
stab_cholesky: A numerically stable version of the Cholesky decomposition.
h2abc: Takes the representation of the system box in terms of an upper
triangular matrix of column vectors, and returns the representation in
terms of the lattice vector lengths and the angles between them
in radians.
h2abc_deg: Takes the representation of the system box in terms of an upper
triangular matrix of column vectors, and returns the representation in
terms of the lattice vector lengths and the angles between them in
degrees.
abc2h: Takes the representation of the system box in terms of the lattice
vector lengths and the angles between them, and returns the
representation in terms of an upper triangular lattice vector matrix.
invert_ut3x3: Inverts a 3*3 upper triangular matrix.
det_ut3x3(h): Finds the determinant of a 3*3 upper triangular matrix.
eigensystem_ut3x3: Finds the eigenvector matrix and eigenvalues of a 3*3
upper triangular matrix
exp_ut3x3: Computes the exponential of a 3*3 upper triangular matrix.
root_herm: Computes the square root of a positive-definite hermitian
matrix.
logsumlog: Routine to accumulate the logarithm of a sum
"""
__all__ = ['matrix_exp', 'stab_cholesky', 'h2abc', 'h2abc_deg', 'abc2h',
'invert_ut3x3', 'det_ut3x3', 'eigensystem_ut3x3', 'exp_ut3x3',
'root_herm', 'logsumlog' ]
import numpy as np
import math
from ipi.utils.messages import verbosity, warning
def logsumlog(lasa, lbsb):
"""Computes log(|A+B|) and sign(A+B) given log(|A|), log(|B|),
sign(A), sign(B).
Args:
lasa: (log(|A|), sign(A)) as a tuple
lbsb: (log(|B|), sign(B)) as a tuple
Returns:
(log(|A+B|), sign(A+B)) as a tuple
"""
(la,sa) = lasa
(lb,sb) = lbsb
if (la > lb):
sr = sa
lr = la + np.log(1.0 + sb*np.exp(lb-la))
else:
sr = sb
lr = lb + np.log(1.0 + sa*np.exp(la-lb))
return (lr,sr)
def matrix_exp(M, ntaylor=15, nsquare=15):
"""Computes the exponential of a square matrix via a Taylor series.
Calculates the matrix exponential by first calculating exp(M/(2**nsquare)),
then squaring the result the appropriate number of times.
Args:
M: Matrix to be exponentiated.
ntaylor: Optional integer giving the number of terms in the Taylor series.
Defaults to 15.
nsquare: Optional integer giving how many times the original matrix will
be halved. Defaults to 15.
Returns:
The matrix exponential of M.
"""
n = M.shape[1]
tc = np.zeros(ntaylor+1)
tc[0] = 1.0
for i in range(ntaylor):
tc[i+1] = tc[i]/(i+1)
SM = np.copy(M)/2.0**nsquare
EM = np.identity(n,float)*tc[ntaylor]
for i in range(ntaylor-1,-1,-1):
EM = np.dot(SM,EM)
EM += np.identity(n)*tc[i]
for i in range(nsquare):
EM = np.dot(EM,EM)
return EM
def stab_cholesky(M):
""" A numerically stable version of the Cholesky decomposition.
Used in the GLE implementation. Since many of the matrices used in this
algorithm have very large and very small numbers in at once, to handle a
wide range of frequencies, a naive algorithm can end up having to calculate
the square root of a negative number, which breaks the algorithm. This is
due to numerical precision errors turning a very tiny positive eigenvalue
into a tiny negative value.
Instead of this, an LDU decomposition is used, and any small negative numbers
in the diagonal D matrix are assumed to be due to numerical precision errors,
and so are replaced with zero.
Args:
M: The matrix to be decomposed.
"""
n = M.shape[1]
D = np.zeros(n,float)
L = np.zeros(M.shape,float)
for i in range(n):
L[i,i] = 1.
for j in range(i):
L[i,j] = M[i,j]
for k in range(j):
L[i,j] -= L[i,k]*L[j,k]*D[k]
if (not D[j] == 0.0):
L[i,j] = L[i,j]/D[j]
D[i] = M[i,i]
for k in range(i):
D[i] -= L[i,k]*L[i,k]*D[k]
S = np.zeros(M.shape,float)
for i in range(n):
if (D[i]>0):
D[i] = math.sqrt(D[i])
else:
warning("Zeroing negative element in stab-cholesky decomposition: " + str(D[i]), verbosity.low)
D[i] = 0
for j in range(i+1):
S[i,j] += L[i,j]*D[j]
return S
def h2abc(h):
"""Returns a description of the cell in terms of the length of the
lattice vectors and the angles between them in radians.
Args:
h: Cell matrix in upper triangular column vector form.
Returns:
A list containing the lattice vector lengths and the angles between them.
"""
a = float(h[0,0])
b = math.sqrt(h[0,1]**2 + h[1,1]**2)
c = math.sqrt(h[0,2]**2 + h[1,2]**2 + h[2,2]**2)
gamma = math.acos(h[0,1]/b)
beta = math.acos(h[0,2]/c)
alpha = math.acos(np.dot(h[:,1], h[:,2])/(b*c))
return a, b, c, alpha, beta, gamma
def h2abc_deg(h):
"""Returns a description of the cell in terms of the length of the
lattice vectors and the angles between them in degrees.
Args:
h: Cell matrix in upper triangular column vector form.
Returns:
A list containing the lattice vector lengths and the angles between them
in degrees.
"""
(a, b, c, alpha, beta, gamma) = h2abc(h)
return a, b, c, alpha*180/math.pi, beta*180/math.pi, gamma*180/math.pi
def abc2h(a, b, c, alpha, beta, gamma):
"""Returns a lattice vector matrix given a description in terms of the
lattice vector lengths and the angles in between.
Args:
a: First cell vector length.
b: Second cell vector length.
c: Third cell vector length.
alpha: Angle between sides b and c in radians.
beta: Angle between sides a and c in radians.
gamma: Angle between sides b and a in radians.
Returns:
An array giving the lattice vector matrix in upper triangular form.
"""
h = np.zeros((3,3) ,float)
h[0,0] = a
h[0,1] = b*math.cos(gamma)
h[0,2] = c*math.cos(beta)
h[1,1] = b*math.sin(gamma)
h[1,2] = (b*c*math.cos(alpha) - h[0,1]*h[0,2])/h[1,1]
h[2,2] = math.sqrt(c**2 - h[0,2]**2 - h[1,2]**2)
return h
def invert_ut3x3(h):
"""Inverts a 3*3 upper triangular matrix.
Args:
h: An upper triangular 3*3 matrix.
Returns:
The inverse matrix of h.
"""
ih = np.zeros((3,3), float)
for i in range(3):
ih[i,i] = 1.0/h[i,i]
ih[0,1] = -ih[0,0]*h[0,1]*ih[1,1]
ih[1,2] = -ih[1,1]*h[1,2]*ih[2,2]
ih[0,2] = -ih[1,2]*h[0,1]*ih[0,0] - ih[0,0]*h[0,2]*ih[2,2]
return ih
def eigensystem_ut3x3(p):
"""Finds the eigenvector matrix of a 3*3 upper-triangular matrix.
Args:
p: An upper triangular 3*3 matrix.
Returns:
An array giving the 3 eigenvalues of p, and the eigenvector matrix of p.
"""
eigp = np.zeros((3,3), float)
eigvals = np.zeros(3, float)
for i in range(3):
eigp[i,i] = 1
eigp[0,1] = -p[0,1]/(p[0,0] - p[1,1])
eigp[1,2] = -p[1,2]/(p[1,1] - p[2,2])
eigp[0,2] = -(p[0,1]*p[1,2] - p[0,2]*p[1,1] + p[0,2]*p[2,2])/((p[0,0] - p[2,2])*(p[2,2] - p[1,1]))
for i in range(3):
eigvals[i] = p[i,i]
return eigp, eigvals
def det_ut3x3(h):
"""Calculates the determinant of a 3*3 upper triangular matrix.
Note that the volume of the system box when the lattice vector matrix is
expressed as a 3*3 upper triangular matrix is given by the determinant of
this matrix.
Args:
h: An upper triangular 3*3 matrix.
Returns:
The determinant of h.
"""
return h[0,0]*h[1,1]*h[2,2]
MINSERIES=1e-8
def exp_ut3x3(h):
"""Computes the matrix exponential for a 3x3 upper-triangular matrix.
Note that for 3*3 upper triangular matrices this is the best method, as
it is stable. This is terms which become unstable as the
denominator tends to zero are calculated via a Taylor series in this limit.
Args:
h: An upper triangular 3*3 matrix.
Returns:
The matrix exponential of h.
"""
eh = np.zeros((3,3), float)
e00 = math.exp(h[0,0])
e11 = math.exp(h[1,1])
e22 = math.exp(h[2,2])
eh[0,0] = e00
eh[1,1] = e11
eh[2,2] = e22
if (abs((h[0,0] - h[1,1])/h[0,0])>MINSERIES):
r01 = (e00 - e11)/(h[0,0] - h[1,1])
else:
r01 = e00*(1 + (h[0,0] - h[1,1])*(0.5 + (h[0,0] - h[1,1])/6.0))
if (abs((h[1,1] - h[2,2])/h[1,1])>MINSERIES):
r12 = (e11 - e22)/(h[1,1] - h[2,2])
else:
r12 = e11*(1 + (h[1,1] - h[2,2])*(0.5 + (h[1,1] - h[2,2])/6.0))
if (abs((h[2,2] - h[0,0])/h[2,2])>MINSERIES):
r02 = (e22 - e00)/(h[2,2] - h[0,0])
else:
r02 = e22*(1 + (h[2,2] - h[0,0])*(0.5 + (h[2,2] - h[0,0])/6.0))
eh[0,1] = h[0,1]*r01
eh[1,2] = h[1,2]*r12
eh[0,2] = h[0,2]*r02
if (abs((h[2,2] - h[0,0])/h[2,2])>MINSERIES):
eh[0,2] += h[0,1]*h[0,2]*(r01 - r12)/(h[0,0] - h[2,2])
elif (abs((h[1,1] - h[0,0])/h[1,1])>MINSERIES):
eh[0,2] += h[0,1]*h[0,2]*(r12 - r02)/(h[1,1] - h[0,0])
elif (abs((h[1,1]-h[2,2])/h[1,1])>MINSERIES):
eh[0,2] += h[0,1]*h[0,2]*(r02 - r01)/(h[2,2] - h[1,1])
else:
eh[0,2] += h[0,1]*h[0,2]*e00/24.0*(12.0 + 4*(h[1,1] + h[2,2] - 2*h[0,0]) + (h[1,1] - h[0,0])*(h[2,2] - h[0,0]))
return eh
def root_herm(A):
"""Gives the square root of a hermitian matrix with real eigenvalues.
Args:
A: A Hermitian matrix.
Returns:
A matrix such that itself matrix multiplied by its transpose gives the
original matrix.
"""
if not (abs(A.T - A) < 1e-10).all():
raise ValueError("Non-Hermitian matrix passed to root_herm function")
eigvals, eigvecs = np.linalg.eigh(A)
ndgrs = len(eigvals)
diag = np.zeros((ndgrs,ndgrs))
for i in range(ndgrs):
if eigvals[i] >= 0:
diag[i,i] = math.sqrt(eigvals[i])
else:
warning("Zeroing negative element in matrix square root: " + str(eigvals[i]), verbosity.low)
diag[i,i] = 0
return np.dot(eigvecs, np.dot(diag, eigvecs.T))

View File

@ -0,0 +1,155 @@
"""Utility functions for outputting messages, diagnostics and errors'
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/>.
Classes:
Verbosity: Concise class to check the selected level of output
Functions:
banner: Prints the program welcome "screen"
help: Prints the input syntax help
info: Prints some information to standard output, depending on the level of verbosity
warning: Same as info, but with a "!W!" prefix and optionally printing a stack trace
"""
import traceback, sys
__all__ = ['Verbosity', 'verbosity',' help', 'banner', 'info', 'warning']
VERB_QUIET = 0
VERB_LOW = 1
VERB_MEDIUM = 2
VERB_HIGH = 3
VERB_DEBUG = 4
class Verbosity(object):
"""Class used to determine what to print to standard output.
Attributes:
level: Determines what level of output to print.
"""
level = "low"
def __getattr__(self, name):
"""Determines whether a certain verbosity level is
less than or greater than the stored value.
Used to decide whether or not a certain info or warning string
should be output.
Args:
name: The verbosity level at which the info/warning string
will be output.
"""
if name is "quiet":
return self.level >= VERB_QUIET
elif name is "low":
return self.level >= VERB_LOW
elif name is "medium":
return self.level >= VERB_MEDIUM
elif name is "high":
return self.level >= VERB_HIGH
elif name is "debug":
return self.level >= VERB_DEBUG
def __setattr__(self, name, value):
"""Sets the verbosity level
Args:
name: The name of what to set. Should always be 'level'.
value: The value to set the verbosity to.
Raises:
ValueError: Raised if either the name or the level is not
a valid option.
"""
if name == "level":
if value == "quiet":
level = VERB_QUIET
elif value == "low":
level = VERB_LOW
elif value == "medium":
level = VERB_MEDIUM
elif value == "high":
level = VERB_HIGH
elif value == "debug":
level = VERB_DEBUG
else:
raise ValueError("Invalid verbosity level " + str(value) + " specified.")
super(Verbosity,self).__setattr__("level", level)
verbosity = Verbosity()
def help():
"""Prints out a help string."""
print """usage: %s input """%sys.argv[0]
def banner():
"""Prints out a banner."""
print """
____ ____ ____ ____
/ \ / \ / \ / \
| ################################# |
\__#_/ \____/ \____/ \_#__/
# _ _______ _____ #
# (_) |_ __ \|_ _| # v. 1.0
# __ ______ | |__) | | | #
Y [ ||______|| ___/ | | # A Python interface for (ab initio)
0 0 | | _| |_ _| |_ # (path integral) molecular dynamics.
# [___] |_____| |_____| #
__#_ ____ ____ _#__
/ # \ / \ / \ / # \
| ################################# |
\____/ \____/ \____/ \____/
"""
def info(text="", show=True ):
"""Prints a warning message.
Args:
text: The text of the information message.
show: A boolean describing whether or not the message should be
printed.
"""
if not show:
return
print text
def warning(text="", show=True):
"""Prints a warning message.
Args:
text: The text of the information message.
show: A boolean describing whether or not the message should be
printed.
"""
if not show:
return
if verbosity.debug:
traceback.print_stack(file=sys.stdout)
print " !W! " + text

View File

@ -0,0 +1,283 @@
"""Contains functions for doing the inverse and forward normal mode transforms.
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/>.
Classes:
nm_trans: Uses matrix multiplication to do normal mode transformations.
nm_rescale: Uses matrix multiplication to do ring polymer contraction
or expansion.
nm_fft: Uses fast-Fourier transforms to do normal modes transformations.
Functions:
mk_nm_matrix: Makes a matrix to transform between the normal mode and bead
representations.
mk_rs_matrix: Makes a matrix to transform between one number of beads and
another. Higher normal modes in the case of an expansion are set to zero.
"""
__all__ = ['nm_trans', 'nm_rescale', 'nm_fft']
import numpy as np
from ipi.utils.messages import verbosity, info
def mk_nm_matrix(nbeads):
"""Gets the matrix that transforms from the bead representation
to the normal mode representation.
If we return from this function a matrix C, then we transform between the
bead and normal mode representation using q_nm = C . q_b, q_b = C.T . q_nm
Args:
nbeads: The number of beads.
"""
b2nm = np.zeros((nbeads,nbeads))
b2nm[0,:] = np.sqrt(1.0)
for j in range(nbeads):
for i in range(1, nbeads/2+1):
b2nm[i,j] = np.sqrt(2.0)*np.cos(2*np.pi*j*i/float(nbeads))
for i in range(nbeads/2+1, nbeads):
b2nm[i,j] = np.sqrt(2.0)*np.sin(2*np.pi*j*i/float(nbeads))
if (nbeads%2) == 0:
b2nm[nbeads/2,0:nbeads:2] = 1.0
b2nm[nbeads/2,1:nbeads:2] = -1.0
return b2nm/np.sqrt(nbeads)
def mk_rs_matrix(nb1, nb2):
"""Gets the matrix that transforms a path with nb1 beads into one with
nb2 beads.
If we return from this function a matrix T, then we transform between the
system with nb1 bead and the system of nb2 beads using q_2 = T . q_1
Args:
nb1: The initial number of beads.
nb2: The final number of beads.
"""
if (nb1 == nb2):
return np.identity(nb1,float)
elif (nb1 > nb2):
b1_nm = mk_nm_matrix(nb1)
nm_b2 = mk_nm_matrix(nb2).T
#builds the "reduction" matrix that picks the normal modes we want to keep
b1_b2 = np.zeros((nb2, nb1), float)
b1_b2[0,0] = 1.0
for i in range(1, nb2/2+1):
b1_b2[i,i] = 1.0
b1_b2[nb2-i, nb1-i] = 1.0
if (nb2 % 2 == 0):
#if we are contracting down to an even number of beads, then we have to
#pick just one of the last degenerate modes to match onto the single
#stiffest mode in the new path
b1_b2[nb2/2, nb1-nb2/2] = 0.0
rs_b1_b2 = np.dot(nm_b2, np.dot(b1_b2, b1_nm))
return rs_b1_b2*np.sqrt(float(nb2)/float(nb1))
else:
return mk_rs_matrix(nb2, nb1).T*(float(nb2)/float(nb1))
class nm_trans:
"""Helper class to perform beads <--> normal modes transformation.
Attributes:
_b2nm: The matrix to transform between the bead and normal mode
representations.
_nm2b: The matrix to transform between the normal mode and bead
representations.
"""
def __init__(self, nbeads):
"""Initializes nm_trans.
Args:
nbeads: The number of beads.
"""
self._b2nm = mk_nm_matrix(nbeads)
self._nm2b = self._b2nm.T
def b2nm(self, q):
"""Transforms a matrix to the normal mode representation.
Args:
q: A matrix with nbeads rows, in the bead representation.
"""
return np.dot(self._b2nm,q)
def nm2b(self, q):
"""Transforms a matrix to the bead representation.
Args:
q: A matrix with nbeads rows, in the normal mode representation.
"""
return np.dot(self._nm2b,q)
class nm_rescale:
"""Helper class to rescale a ring polymer between different number of beads.
Attributes:
_b1tob2: The matrix to transform between a ring polymer with 'nbeads1'
beads and another with 'nbeads2' beads.
_b2tob1: The matrix to transform between a ring polymer with 'nbeads2'
beads and another with 'nbeads1' beads.
"""
def __init__(self, nbeads1, nbeads2):
"""Initializes nm_rescale.
Args:
nbeads1: The initial number of beads.
nbeads2: The rescaled number of beads.
"""
self._b1tob2 = mk_rs_matrix(nbeads1,nbeads2)
self._b2tob1 = self._b1tob2.T*(float(nbeads1)/float(nbeads2))
def b1tob2(self, q):
"""Transforms a matrix from one value of beads to another.
Args:
q: A matrix with nbeads1 rows, in the bead representation.
"""
return np.dot(self._b1tob2,q)
def b2tob1(self, q):
"""Transforms a matrix from one value of beads to another.
Args:
q: A matrix with nbeads2 rows, in the bead representation.
"""
return np.dot(self._b2tob1,q)
class nm_fft:
"""Helper class to perform beads <--> normal modes transformation
using Fast Fourier transforms.
Attributes:
fft: The fast-Fourier transform function to transform between the
bead and normal mode representations.
ifft: The inverse fast-Fourier transform function to transform
between the normal mode and bead representations.
qdummy: A matrix to hold a copy of the bead positions to transform
them to the normal mode representation.
qnmdummy: A matrix to hold a copy of the normal modes to transform
them to the bead representation.
nbeads: The number of beads.
natoms: The number of atoms.
"""
def __init__(self, nbeads, natoms):
"""Initializes nm_trans.
Args:
nbeads: The number of beads.
natoms: The number of atoms.
"""
self.nbeads = nbeads
self.natoms = natoms
try:
import pyfftw
info("Import of PyFFTW successful", verbosity.medium)
self.qdummy = pyfftw.n_byte_align_empty((nbeads, 3*natoms), 16, 'float32')
self.qnmdummy = pyfftw.n_byte_align_empty((nbeads//2+1, 3*natoms), 16, 'complex64')
self.fft = pyfftw.FFTW(self.qdummy, self.qnmdummy, axes=(0,), direction='FFTW_FORWARD')
self.ifft = pyfftw.FFTW(self.qnmdummy, self.qdummy, axes=(0,), direction='FFTW_BACKWARD')
except ImportError: #Uses standard numpy fft library if nothing better
#is available
info("Import of PyFFTW unsuccessful, using NumPy library instead", verbosity.medium)
self.qdummy = np.zeros((nbeads,3*natoms), dtype='float32')
self.qnmdummy = np.zeros((nbeads//2+1,3*natoms), dtype='complex64')
def dummy_fft(self):
self.qnmdummy = np.fft.rfft(self.qdummy, axis=0)
def dummy_ifft(self):
self.qdummy = np.fft.irfft(self.qnmdummy, n=self.nbeads, axis=0)
self.fft = lambda: dummy_fft(self)
self.ifft = lambda: dummy_ifft(self)
def b2nm(self, q):
"""Transforms a matrix to the normal mode representation.
Args:
q: A matrix with nbeads rows and 3*natoms columns,
in the bead representation.
"""
if self.nbeads == 1:
return q
self.qdummy[:] = q
self.fft()
if self.nbeads == 2:
return self.qnmdummy.real/np.sqrt(self.nbeads)
nmodes = self.nbeads/2
self.qnmdummy /= np.sqrt(self.nbeads)
qnm = np.zeros(q.shape)
qnm[0,:] = self.qnmdummy[0,:].real
if self.nbeads % 2 == 0:
self.qnmdummy[1:-1,:] *= np.sqrt(2)
(qnm[1:nmodes,:], qnm[self.nbeads:nmodes:-1,:]) = (self.qnmdummy[1:-1,:].real, self.qnmdummy[1:-1,:].imag)
qnm[nmodes,:] = self.qnmdummy[nmodes,:].real
else:
self.qnmdummy[1:,:] *= np.sqrt(2)
(qnm[1:nmodes+1,:], qnm[self.nbeads:nmodes:-1,:]) = (self.qnmdummy[1:,:].real, self.qnmdummy[1:,:].imag)
return qnm
def nm2b(self, qnm):
"""Transforms a matrix to the bead representation.
Args:
qnm: A matrix with nbeads rows and 3*natoms columns,
in the normal mode representation.
"""
if self.nbeads == 1:
return qnm
if self.nbeads == 2:
self.qnmdummy[:] = qnm
self.ifft()
return self.qdummy*np.sqrt(self.nbeads)
nmodes = self.nbeads/2
odd = self.nbeads - 2*nmodes # 0 if even, 1 if odd
qnm_complex = np.zeros((nmodes+1, len(qnm[0,:])), complex)
qnm_complex[0,:] = qnm[0,:]
if not odd:
(qnm_complex[1:-1,:].real, qnm_complex[1:-1,:].imag) = (qnm[1:nmodes,:], qnm[self.nbeads:nmodes:-1,:])
qnm_complex[1:-1,:] /= np.sqrt(2)
qnm_complex[nmodes,:] = qnm[nmodes,:]
else:
(qnm_complex[1:,:].real, qnm_complex[1:,:].imag) = (qnm[1:nmodes+1,:], qnm[self.nbeads:nmodes:-1,:])
qnm_complex[1:,:] /= np.sqrt(2)
self.qnmdummy[:] = qnm_complex
self.ifft()
return self.qdummy*np.sqrt(self.nbeads)

Some files were not shown because too many files have changed in this diff Show More