Neighbors Definition
This module reads the neighbor list from the saved file. The format of the saved neighbor list file (named as neighborlist.dat in default) must be identification of the centered particle (id), coordination number of the centered particle (cn), and identification of neighboring particles (neighborlist). That is, “id cn neighborlist”. The neighbors in the output file is sorted by their distances to the centered particle in ascending order.
This module is also heavily used to calculate the neighboring particles of a particle, or the properties about the neighboring list, which are the base for many different analyzing methods. There are many ways to recognize the neighbors, for example, by a certain number, by a certain cutoff, by particle-type specific cutoffs, by Voronoi tessellation (freud or Voro++ directly) etc. This module covers the above calculation methods and can be easily extended by individual purpose. Neighbor list of different snapshots is continuous without any gap and all start with the header id cn neighborlist. This formatting is made to be consistent with reading neighbor lists for different analyzing methods.
I. Reading Neighbors
neighbors.read_neighbors.read_neighbors() is used to read the property of neighboring particles from a saved file, as long as the format of file is compatible, as like neighborlist.dat (see below). Note that this module reads one snapshot a time to save computer memory. If you have multiple snapshots, you can import this module in a loop (see example).
Input Arguments
f(TextIO): opened file object which save the property of neighboring particles,f = open(filename, 'r', encoding='utf-8'). Opening the file outside of the function ensures that when reading a file containing multiple snapshots, the file pointer can move to the next snapshot.Nmax(int): the maximum number of neighboring particles to consider. SettingNmaxto a sufficiently large value is ideal, with the default being 200.Nmaxis defined to address the varying number of neighboring particles among different particles. In this way, we can create a regular two-dimensional NumPy array to save the property of neighboring particles.
Return
two-dimensional numpy array, with shape (nparticle, 1+Nmax_fact). Nmax_fact means the maximum coordination number for one particle in the system. The first column is the coordination number (cn). For particles with coordination number less than Nmax_fact (which is generally the case), the unoccupied positions in neighborprop (see source code) are padded with 0.
Important Notes
In the saved neighborlist.dat, the particle ID is counted from 1. While in this read module, the returned neighborlist is counted from 0. This is to facilitate subsequent indexing operations in python.
Example
Read neighbor list:
from PyMatterSim.neighbors.read_neighbors import read_neighbors filename = 'neighborlist.dat' f = open(filename, 'r') neighborprop = read_neighbors(f, nparticle=8100, Nmax=200) f.close()
Read facearea list:
from PyMatterSim.neighbors.read_neighbors import read_neighbors filename = 'dump.facearea.dat' ### generated by carrying out Voronoi analysis module f = open(filename, 'r') neighborprop = read_neighbors(f, nparticle=8100, Nmax=200) f.close()
Read in multiple snapshots:
from PyMatterSim.neighbors.read_neighbors import read_neighbors neighbors_snapshots = [] filename = 'neighborlist.dat' f = open(filename, 'r') for i in range(nsnapshots): ### number of snapshots neighbors_snapshots.append(read_neighbors(f, nparticle=8100, Nmax=200)) f.close()
II. Calculating Neighbors
1. Nnearests()
neighbors.calculate_neighbors.Nnearests() gets the N nearest neighbors around a particle. In this case, the coordination number is N for each particle.
Input Arguments
snapshots(reader.reader_utils.Snapshots):Snapshotsdata class returned byreader.dump_reader.DumpReaderfrom input configuration fileN(int): the specified number of nearest neighbors, default 12ppp(npt.NDArray): the periodic boundary conditions, setting 1 for yes and 0 for nodefault
np.array([1,1,1]), that is, PBC is applied in all three dimensions for 3D box. Setnp.array([1,1])for two-dimensional system.fnfile(str): the name of output file that stores the neighbor list, defaultneighborlist.dat
Example
from PyMatterSim.reader.dump_reader import DumpReader
from PyMatterSim.reader.reader_utils import DumpFileType
from PyMatterSim.neighbors.calculate_neighbors import Nnearests
filename = 'dump.atom'
readdump = DumpReader(filename, ndim=3, filetype=DumpFileType.LAMMPS, moltypes=None)
readdump.read_onefile()
Nnearests(readdump.snapshots, N=12, ppp=np.array([1,1,1]), fnfile='neighborlist.dat')
2. cutoffneighbors()
neighbors.calculate_neighbors.cutoffneighbors() gets the nearest neighbors around a particle by setting a global cutoff distance r_cut. Usually, the cutoff distance can be determined as the position of the first deep well in total pair correlation function.
Input Arguments
snapshots(reader.reader_utils.Snapshots):Snapshotsdata class returned byreader.dump_reader.DumpReaderfrom input configuration filer_cut(float): the global cutoff distance to screen the nearest neighborsppp(npt.NDArray): the periodic boundary conditions, setting 1 for yes and 0 for nodefault
np.array([1,1,1]), that is, PBC is applied in all three dimensions for 3D box. Setnp.array([1,1])for two-dimensional system.fnfile(str): the name of output file that stores the neighbor list, defaultneighborlist.dat
Example
from PyMatterSim.reader.dump_reader import DumpReader
from PyMatterSim.reader.reader_utils import DumpFileType
from PyMatterSim.neighbors.calculate_neighbors import cutoffneighbors
filename = 'dump.atom'
readdump = DumpReader(filename, ndim=3, filetype=DumpFileType.LAMMPS, moltypes=None)
readdump.read_onefile()
cutoffneighbors(readdump.snapshots, r_cut=3.8, ppp=np.array([1,1,1]), fnfile='neighborlist.dat')
3. cutoffneighbors_particletype()
neighbors.calculate_neighbors.cutoffneighbors_particletype() gets the nearest neighbors around a particle by setting a cutoff distance r_cut. Taken Cu-Zr system as an example, r_cut should be a 2D numpy array:
Usually, these cutoff distances can be determined as the position of the individual first deep well in partial pair correlation function of each particle pair.
Input Arguments
snapshots(reader.reader_utils.Snapshots):Snapshotsdata class returned byreader.dump_reader.DumpReaderfrom input configuration filer_cut(npt.NDArray): the cutoff distances of each particle pairppp(npt.NDArray): the periodic boundary conditions, setting 1 for yes and 0 for nodefault
np.array([1,1,1]), that is, PBC is applied in all three dimensions for 3D box. Setnp.array([1,1])for a two-dimensional systemfnfile(str): the name of output file that stores the neighbor list, defaultneighborlist.dat
Example
import numpy as np
from PyMatterSim.reader.dump_reader import DumpReader
from PyMatterSim.reader.reader_utils import DumpFileType
from PyMatterSim.neighbors.calculate_neighbors import cutoffneighbors_particletype
filename = 'dump.atom'
readdump = DumpReader(filename, ndim=3, filetype=DumpFileType.LAMMPS, moltypes=None)
readdump.read_onefile()
### a binary system
r_cut = np.zeros((2, 2))
r_cut[0, 0] = 3.6
r_cut[0, 1] = 3.4
r_cut[1, 0] = 3.4
r_cut[1, 1] = 3.9
cutoffneighbors_particletype(readdump.snapshots, r_cut=r_cut, ppp=np.array([1,1,1]), fnfile='neighborlist.dat')
III. Freud Neighbors
freud is a trajectory analysis package developed by Glotzer&###39;s group. To use freud easily, a function neighbors.freud_neighbors.convert_configuration is used to convert the dump file from our reader module to freud style. Correspondingly the list of box information and the list of the particle coordinates are returned for further analysis.
1. convert_configuration
Input Arguments
snapshots(reader.reader_utils.Snapshots):Snapshotsdata class returned byreader.dump_reader.DumpReaderfrom input configuration file
Return
list_box(list): the list of box information forfreudanalysislist_points(list): the list of particle positions forfreudanalysis
Example
from PyMatterSim.reader.dump_reader import DumpReader
from PyMatterSim.reader.reader_utils import DumpFileType
from PyMatterSim.neighbors.freud_neighbors import convert_configuration
filename = 'dump.atom'
readdump = DumpReader(filename, ndim=3, filetype=DumpFileType.LAMMPS, moltypes=None)
readdump.read_onefile()
list_box, list_points = convert_configuration(readdump.snapshots)
2. cal_neighbors
Calling neighbors.freud_neighbors.Voro_neighbors() first and then performing Voronoi analysis with voro++ package to calculate neighbors for both 2D and 3D systems. Three classes of information will be output:
neighbor list: atom coordination and ids of each atom
Voronoi face area (3D) or edge length (2D) list: between the center and each of its neighbors
overall information: coordination number, Voronoi volume or area of each atom
Input Arguments
snapshots(reader.reader_utils.Snapshots):Snapshotsdata class returned byreader.dump_reader.DumpReaderfrom input configuration fileoutputfile(str): filename of neighbor list and bond info, such as edge length (2D) or facearea(3D), defaultNone
Return
None (result is saved to file). For neighbor list, file with name outputfile+’.neighbor.dat’. For edgelength list (2D box), file with name outputfile+’.edgelength.dat’. For facearea list (3D box), file with name outputfile+’.facearea.dat’
Example
from PyMatterSim.reader.lammps_reader_helper import read_lammps_wrapper
from PyMatterSim.neighbors.freud_neighbors import cal_neighbors
filename = 'dump_2D.atom'
snapshots = read_lammps_wrapper(filename, ndim=2)
cal_neighbors(snapshots, outputfile='dump')
IV. Voro++ direct neighbors
neighbors.voronoi_neighbors() is used to perform radical Voronoi tessellation using voro++ for both PBC and non-PBC system.
The voro++ package considers non-periodic boundary conditions by default, so there may be some negative numbers in the neighbor list for non-periodic boundary conditions (please refer to the voro++ manual to know this well).
neighbors.voronoi_neighbors.voronowalls(): used for any non-periodic boundary condition(s)neighbors.voronoi_neighbors.cal_voro(): used for all periodic boundary conditions
1. get_input()
neighbors.voronoi_neighbors.get_input() is used to design input file for Voro++ by considering particle radii.
Input Arguments
snapshots(reader.reader_utils.Snapshots):Snapshotsdata class returned byreader.dump_reader.DumpReaderfrom input configuration fileradii(dict): radii of particles, must be a dict like{1 : 1.28, 2 : 1.60}if you do not want to consider radii, set the radii the same, default
{1:0.5, 2:0.5}
Return
position(list): input file for Voro++ with the format:bounds(list): box bounds for snapshots
Example
from PyMatterSim.reader.dump_reader import DumpReader
from PyMatterSim.reader.reader_utils import DumpFileType
from PyMatterSim.neighbors.voronoi_neighbors import get_input
filename = 'dump.atom'
readdump = DumpReader(filename, ndim=3, filetype=DumpFileType.LAMMPS, moltypes=None)
readdump.read_onefile()
get_input(readdump.snapshots, radii={1:1.0, 2:1.0})
2. cal_voro()
voronoi.voropp.cal_voro() is used to perform radical Voronoi tessellation if radii are given using voro++ for periodic boundary conditions.
Input Arguments
snapshots(reader.reader_utils.Snapshots):Snapshotsdata class returned byreader.dump_reader.DumpReaderfrom input configuration fileppp(str): Make the container periodic in all three directions, defaultppp='-p'radii(dict): radii of particles, must be a dict like{1 : 1.28, 2 : 1.60}if you do not want to consider radii, set the radii the same, default
{1:0.5, 2:0.5}outputfile(str): filename of output, including neighborlist, facearealist, voronoi index, overall (facearea and volume of particle).
Return
None[saved to file]for neighbor list, file with name
outputfile.neighbor.dat'for facearea list, file with name
outputfile.facearea.dat'for voronoi index, file with name
outputfile.voroindex.dat'for overall, file with name
outputfile.overall.dat'
Output files from voroindex and overall include a header for all snapshots. neighborlist and facearealist output files are in align with the format needed in the module neighbors and have headers for each individual snapshot.
Example
from PyMatterSim.reader.lammps_reader_helper import read_lammps_wrapper
from PyMatterSim.neighbors.voronoi_neighbors import cal_voro
test_file_3d = 'dump.atom'
snapshots = read_lammps_wrapper(test_file_3d, 3)
cal_voro(snapshots, outputfile='dump')
3. voronowalls()
voronoi.voropp.voronowalls() is used to perform radical Voronoi tessellation using voro++ for periodic boundary conditions.
Input Arguments
snapshots(reader.reader_utils.Snapshots):Snapshotsdata class returned byreader.dump_reader.DumpReaderfrom input configuration fileppp(str): Make the container periodic in a desired direction'-px','-py', and'-pz'for x, y, and z directions, respectivelyradii(dict): radii of particles, must be a dict like{1 : 1.28, 2 : 1.60}if you do not want to consider radii, set the radii the same, default
{1:0.5, 2:0.5}outputfile(str): filename of output, including neighborlist, facearealist, voronoi index, overall (facearea and volume of particle).
Return
None[saved to file]for neighbor list, file with name
outputfile.neighbor.dat'for facearea list, file with name
outputfile.facearea.dat'for voronoi index, file with name
outputfile.voroindex.dat'for overall, file with name
outputfile.overall.dat'
Output files from voroindex and overall include a header for all snapshots. neighborlist and facearealist output files are in align with the format needed in the module neighbors and have headers for each individual snapshot.
4. indicehis()
Statistics the frequency of voronoi index from the output of voronoi analysis. Only the top 50 voronoi index will be output along with their fractions.
Input Arguments
inputfile(str): the filename of saved Voronoi indexoutputfile(str): the output filename of the frequency of voronoi index, defaultNone
Return
None [saved to file], frequency of Voronoi Indices
Example
from PyMatterSim.neighbors.voronoi_neighbors import indicehis
indicehis('dump.voroindex.dat', outputfile='voroindex_frction.dat')