Calc colvar
thmd.calc.colvar
¶
This module contains classes and functions to compute Order parameters, Collective variables,...
Modules:
-
cv_CoordNum– -
cv_PairANGLE– -
cv_Steinhardt– -
cv_fccCUBIC– -
cv_localCRYSTALLINITY– -
cv_slip_atom– -
find_neighbor– -
sph_harmonics– -
switch_function– -
voronoi–
Classes:
-
RATIONAL–Create an Object of SWITCHING FUNCTION
-
HEAVISIDE– -
CUBIC–Create an Object of SWITCHING FUNCTION
-
SMAP–
RATIONAL(r0, d0=0.0, n=6, m=12, dmax_tol=0.001)
¶
Create an Object of SWITCHING FUNCTION
Parameters:
-
r0(float) –The r_0 parameter of the switching function
-
d0(float, default:0.0) –The d_0 parameter of the switching function
-
n(float, default:6) –The n parameter of the switching function
-
m(float, default:12) –The m parameter of the switching function
Returns:
-
Obj(object) –Object of the switching function
Notes
Dmin != D0 D0, R0 : are the parameter of switching function Dmin, Dmax : are the bounds at which the switching take affect
Examples:
create some intiatial attributes...
Methods:
Attributes:
CUBIC(d0, dmax)
¶
Create an Object of SWITCHING FUNCTION
Parameters:
-
d0(float) –The r_0 parameter of the switching function
-
dmax(float) –The d_0 parameter of the switching function
Returns:
-
Obj(object) –Object of the switching function
Examples:
create some intiatial attributes...
Methods:
-
eval–compute & return value and derivation of sw function
Attributes:
d0 = d0
instance-attribute
¶
dmax = dmax
instance-attribute
¶
eval(x, compute_der=False)
¶
compute & return value and derivation of sw function
Parameters:
-
x(float or ndarray) –input values
Returns:
-
f(float or ndarray) –value of the switching function
-
df((float or ndarray, optional)) –value of the derivative of the switching function. Just return if
compute_der=True
SMAP(r0, a=10, b=20, d0=0, tol=0.0001)
¶
create some intiatial attributes...
Methods:
-
eval– -
findDmax– -
findDmin– -
find_Dmin_Dmax–find Dmin and Dmax of function based on given tolerance
-
estimate_ab–Estimate a and b parameters of SMAP function based on given
R0,DmaxandDmin. -
estimate_ab_old_manual–Estimate a and b parameters of SMAP function based on given
R0,DmaxandDmin.
Attributes:
a = a
instance-attribute
¶
b = b
instance-attribute
¶
d0 = d0
instance-attribute
¶
r0 = r0
instance-attribute
¶
tol = tol
instance-attribute
¶
eval(x, compute_der=False)
¶
findDmax(tol=None, upper_bound=100, gridSize=0.0001)
¶
findDmin(tol=None, lower_bound=None, gridSize=0.0001)
¶
find_Dmin_Dmax(tol=None, gridSize=0.0001, upper_bound=50)
¶
find Dmin and Dmax of function based on given tolerance
estimate_ab(target_Dmin, target_Dmax, init_a=None, init_b=None, tol=0.001)
¶
Estimate a and b parameters of SMAP function based on given R0, Dmax and Dmin.
This version employs scipy.optimize.minimize
Parameters:
-
target_Dmin(float) –target Dmin
-
target_Dmax(float) –target Dmax
-
search_step(float) –incremental value of A/B for searching. Defaults to 0.2.
-
tol(float, default:0.001) –tolerance of Dmin/Dmax. Defaults to 1e-3. Should be smaller than 1e-3 (larger value will cause problem)
-
A(int) –initial value of A. Defaults to 10.
-
B(int) –initial value of B. Defaults to 20.
Returns:
-
A(float) –found A
-
B(float) –found B
estimate_ab_old_manual(target_Dmin, target_Dmax, init_a=None, init_b=None, tol=0.001, search_step=0.1)
¶
Estimate a and b parameters of SMAP function based on given R0, Dmax and Dmin.
This version use manual search.
Parameters:
-
target_Dmin(float) –target Dmin
-
target_Dmax(float) –target Dmax
-
search_step(float, default:0.1) –incremental value of A/B for searching. Defaults to 0.2.
-
tol(float, default:0.001) –tolerance of Dmin/Dmax. Defaults to 1e-3. Should be smaller than 1e-3 (larger value will cause problem)
-
A(int) –initial value of A. Defaults to 10.
-
B(int) –initial value of B. Defaults to 20.
Returns:
-
A(float) –found A
-
B(float) –found B
cv_CoordNum
¶
Functions:
-
coord_number–The Coordination is the size of input "Points", this function just weight it with a switching function
coord_number(Points, **kwargs)
¶
The Coordination is the size of input "Points", this function just weight it with a switching function * Compulsory Inputs: ** optional Inputs: switchFunc=[1,1...,1] : Nx1 array, contain values of switching function s(Rj) (Rj is positions of atom j) Returns: coord : scalar, Order Parameter Examples: S = thmd.OrderPara.Coordination([1,0,0; 0,1,0], SW=sw) By Cao Thang, Aug 2020
cv_PairANGLE
¶
Functions:
-
PairANGLE–Order Parameter based on pair functions of Angles in the first shell:
PairANGLE(Points, CENTER, SIGMA, **kwargs)
¶
Order Parameter based on pair functions of Angles in the first shell:
Agrs
Points : Nx3 Matrix, contain bonding vectors between neighboring atoms j and ref atom i CENTER=[pi/3, pi/2, 2*pi/3, pi] : list, centers of Gaussians SIGMA =[0.03,0.04,0.04,0.03] : list, sigmas of Gaussians switchFunc=[1,1...,1] : Nx1 array, contain values of switching function s(Rj) (Rj is positions of atom j)
Returns:
-
gamma(float) –Order Parameter
Examples:
Notes
Require to best chose Rcut for Switching function
Refs
- Gobbob et al., "Nucleation of Molecular Crystals Driven by Relative Information Entropy"
cv_Steinhardt
¶
Functions:
-
Ql_Steinhardt–compute origincal Stainhardt of l-th order
-
Local_Ql_Steinhardt–compute Local Stainhardt of l-th order (modified Steinhardt as: 10.1021/acs.jctc.6b01073)
Ql_Steinhardt(ql_i)
¶
compute origincal Stainhardt of l-th order Args: ql_i : a vector of (2l+1) complex components, qlm(i) vector of atom i Returns: Ql : scalar value of l-th order Stainhardt parameter
Local_Ql_Steinhardt(ql_i, qlm_j, SW)
¶
compute Local Stainhardt of l-th order (modified Steinhardt as: 10.1021/acs.jctc.6b01073) Args: ql_i : 1x(2l+1) array, vector of (2l+1) complex components, qlm(i) vector of atom i qlm_j : Nx(2l+1) array, rows are vectors of (2l+1) complex components, qlm(j) of all neighbors j of atom i Returns: Local_Ql_i : scalar value of l-th order Stainhardt parameter of atom i * PreRequire: compute ql_i complex vector for all atoms before this function can be used
cv_fccCUBIC
¶
Functions:
-
fccCUBIC–Function to Calculate FCC CUBIC parameters.
fccCUBIC(points, alpha=27, zDirect='001', switch_function=None)
¶
Function to Calculate FCC CUBIC parameters.
By thangckt, Mar 2020
Parameters:
-
points(Nx3 np.array) –array contains bonding vectors between neighboring atoms j and ref atom i
-
alpha(int, default:27) –coefficient of harmonic function. Default to 27.
-
zDirect(str, default:'001') –direction of Z-direction, available '001' '110' '111'. Default to '001'.
-
switch_function(list, default:None) –list contain values of switching function s(Rj) (Rj is positions of atom j). Default to None.
Returns:
-
param(float) –Order Parameter.
Examples:
Notes
Must choose suitable Rcut for Switching function.
cv_localCRYSTALLINITY
¶
Functions:
-
localCRYSTALLINITY–Function to Calculate Order Parameter with multi_vectors K.
-
compute_Gvectors_FCC–Function to convert reciprocal vectors G to be used in
localCRYSTALLINITY.
localCRYSTALLINITY(points: np.array, g_vectors: list[list], switch_function=None)
¶
Function to Calculate Order Parameter with multi_vectors K.
By thangckt, Apr 2019
Parameters:
-
points(Nx3 np.array) –array contains bonding vectors between neighboring atoms j and ref atom i g_vectors (tuple): 2d-tuple contains "directions_vectors" for g_vectors (ex: ((4*pi/a)(1,0,0), (4*pi/a)(0,1,0)). The actual g_vectors will be computed in function. Default to ((1,0,0)).
-
switch_function(object, default:None) –switching function s(Rj) (Rj is positions of atom j). Default to None.
Returns:
-
aveLC(float) –is average Order Parameter , tage over on input g_factors, 0 <= LC <=1
-
LC(list) –list of real numbers, are Order Parameters corresponding to each g-vector 0 <= LC <=1
-
S(list) –(not computed) Kx1 vetor of complex numbers, are Static Structure Factors corresponding to each g-vector
Examples:
Notes
If multi g-vectors is input, then OrderPara is take by averaging over all g-vectors.
compute_Gvectors_FCC(g_directions: list[list] = [[1, 0, 0]], lattice_constant: float = 1.0, zDirect: str = '001') -> list[list]
¶
Function to convert reciprocal vectors G to be used in localCRYSTALLINITY.
Parameters:
-
g_directions(list, default:[[1, 0, 0]]) –2d-list contains "directions_vectors" for g_vectors (ex: ((1,0,0), (0,1,0)). The actual g_vectors will be computed. Default to ((1,0,0)).
-
lattice_constant(float, default:1.0) –lattice constant of crystal. Default to 1.
-
zDirect(str, default:'001') –direction of Z-direction, available '001' '110' '111'. Default to '001'.
Returns:
-
g_vectors(list) –2d-list contains g_vectors
cv_slip_atom
¶
Functions:
-
slip_atom–Function to Calculate FCC CUBIC parameters.
slip_atom(points, d_ref, d_diff)
¶
Function to Calculate FCC CUBIC parameters.
Parameters:
-
points(Nx3 np.array) –array contains bonding vectors between neighboring atoms j and ref atom i
-
d_ref(float) –reference distance.
-
d_diff(float) –difference distance to referred as dislocation.
Returns:
-
param(float) –Order Parameter.
Examples:
Notes
Must choose suitable Rcut for Switching function.
find_neighbor
¶
Functions:
-
find_neighbor_gen–find Nearest_Neighbors, return generator of Nearest_IDs, "Nearest relative-Position vetors from atom i"
-
find_neighbor_list–find Nearest_Neighbors, return list of Nearest_IDs, "Nearest relative-Position vetors from atom i"
find_neighbor_gen(points: Union[np.array, list[list]], box: Union[np.array, list[list]], bound_cond: list = [1, 1, 1], cutoff_neighbor=None, k_neighbor=None, k_cutoff=20, keep_ref=False) -> Generator[list, list[list], None]
¶
find Nearest_Neighbors, return generator of Nearest_IDs, "Nearest relative-Position vetors from atom i" Ver 2: spatial.cKDTree
thangckt, Sep 2019. Update: Aug 2022 to use generator
Parameters:
-
points(array) –Nx3 array contain positions of atoms
-
box(array) –simulation box
-
bound_cond(list, default:[1, 1, 1]) –boundary condition
-
cutoff_neighbor(float, default:None) –find neighbors within a Cutoff.
-
k_neighbor(int, default:None) –find k nearest neighbors
-
keep_ref(bool, default:False) –include referal-atom in result
Returns:
-
obj(generator) –this output a GEN contains (Idx_neigh, Rij_vectors)
Examples:
old version
access items in generator with:
for Near_ID, Rij_vector in GEN:
print (Near_ID, Rij_vector)
- Idx_neigh : Nx1 list of Mx1-vectors, contain Image_IDs(id of the original atoms before make periodicity) of Nearest atoms
- Rij_vectors : Nx1 list of Mx3-Matrices, contain Nearest Rij relative-Position vetors from Ref.atom i (Nearest Positions)
find_neighbor_list(points, box, bound_cond=[1, 1, 1], cutoff_neighbor=None, k_neighbor=None, k_cutoff=20, keep_ref=False)
¶
find Nearest_Neighbors, return list of Nearest_IDs, "Nearest relative-Position vetors from atom i" Ver 2: spatial.cKDTree
Parameters:
-
points(array) –Nx3 array contain positions of atoms
-
box(array) –simulation box
-
bound_cond(list, default:[1, 1, 1]) –boundary condition
-
cutoff_neighbor(float, default:None) –find neighbors within a Cutoff.
-
k_neighbor(int, default:None) –find k nearest neighbors
-
keep_ref(bool, default:False) –include referal-atom in result
Returns:
-
Idx_neigh(array) –Nx1 list of Mx1-vectors, contain Image_IDs(id of the original atoms before make periodicity) of Nearest atoms
-
Rij_vectors(array) –Nx1 list of Mx3-Matrices, contain Nearest Rij relative-Position vetors from Ref.atom i (Nearest Positions)
Examples:
Idx_neigh, Rij_vectors = colvar.find_neighbors_list(P, box, bound_cond = [1, 1, 1], cutoff_neighbor=9, keep_ref=False)
Notes
don't compute Rij_Bond to save memory Rij_Bonds (np.array): Nx1 list of scalars, contain Rij_bonds from Ref.atom to Nearest_atoms (Nearest-bonds)
sph_harmonics
¶
Functions:
-
yl_i–Compute vector of Spherical Harmonics for a set of point (ylm vector have (2l+1) components)
yl_i(l, Rij, SW=None, kind='real', normalization='4pi', deg=False)
¶
Compute vector of Spherical Harmonics for a set of point (ylm vector have (2l+1) components)
Parameters:
-
l (int)–degree of Spherical Harmonic
-
Rij(array - like) –Nx3 array contain Rij of nearest neighbors compute from atom i
-
SW(array - like, default:None) –Nx1 values of switching function. Default to 'None'
-
kind(str, default:'real') –kind of return result. Possible
complex/real. Default tocomplex -
normalization(str, default:'4pi') –'4pi', 'ortho', 'schmidt', or 'unnorm' for geodesy 4pi normalized, orthonormalized, Schmidt semi-normalized, or unnormalized spherical harmonic functions, respectively. Default to '4pi'
-
deg(bool, default:False) –If True, theta and phi are expressed in degrees. Default to
False
Returns:
-
yl(array - like) –vector of (2l+1) components
Notes
This functions used the function spharm_lm() from pyshtools
Refs
- Visualizing the real forms of the spherical harmonics
- In
scipy.special.sph_harmfunction the azimuthal coordinate, theta, comes before the polar coordinate, phi; anh may return complex number only
switch_function
¶
Classes:
-
RATIONAL–Create an Object of SWITCHING FUNCTION
-
HEAVISIDE– -
CUBIC–Create an Object of SWITCHING FUNCTION
-
SMAP–
RATIONAL(r0, d0=0.0, n=6, m=12, dmax_tol=0.001)
¶
Create an Object of SWITCHING FUNCTION
Parameters:
-
r0(float) –The r_0 parameter of the switching function
-
d0(float, default:0.0) –The d_0 parameter of the switching function
-
n(float, default:6) –The n parameter of the switching function
-
m(float, default:12) –The m parameter of the switching function
Returns:
-
Obj(object) –Object of the switching function
Notes
Dmin != D0 D0, R0 : are the parameter of switching function Dmin, Dmax : are the bounds at which the switching take affect
Examples:
create some intiatial attributes...
Methods:
Attributes:
CUBIC(d0, dmax)
¶
Create an Object of SWITCHING FUNCTION
Parameters:
-
d0(float) –The r_0 parameter of the switching function
-
dmax(float) –The d_0 parameter of the switching function
Returns:
-
Obj(object) –Object of the switching function
Examples:
create some intiatial attributes...
Methods:
-
eval–compute & return value and derivation of sw function
Attributes:
d0 = d0
instance-attribute
¶
dmax = dmax
instance-attribute
¶
eval(x, compute_der=False)
¶
compute & return value and derivation of sw function
Parameters:
-
x(float or ndarray) –input values
Returns:
-
f(float or ndarray) –value of the switching function
-
df((float or ndarray, optional)) –value of the derivative of the switching function. Just return if
compute_der=True
SMAP(r0, a=10, b=20, d0=0, tol=0.0001)
¶
create some intiatial attributes...
Methods:
-
eval– -
findDmax– -
findDmin– -
find_Dmin_Dmax–find Dmin and Dmax of function based on given tolerance
-
estimate_ab–Estimate a and b parameters of SMAP function based on given
R0,DmaxandDmin. -
estimate_ab_old_manual–Estimate a and b parameters of SMAP function based on given
R0,DmaxandDmin.
Attributes:
a = a
instance-attribute
¶
b = b
instance-attribute
¶
d0 = d0
instance-attribute
¶
r0 = r0
instance-attribute
¶
tol = tol
instance-attribute
¶
eval(x, compute_der=False)
¶
findDmax(tol=None, upper_bound=100, gridSize=0.0001)
¶
findDmin(tol=None, lower_bound=None, gridSize=0.0001)
¶
find_Dmin_Dmax(tol=None, gridSize=0.0001, upper_bound=50)
¶
find Dmin and Dmax of function based on given tolerance
estimate_ab(target_Dmin, target_Dmax, init_a=None, init_b=None, tol=0.001)
¶
Estimate a and b parameters of SMAP function based on given R0, Dmax and Dmin.
This version employs scipy.optimize.minimize
Parameters:
-
target_Dmin(float) –target Dmin
-
target_Dmax(float) –target Dmax
-
search_step(float) –incremental value of A/B for searching. Defaults to 0.2.
-
tol(float, default:0.001) –tolerance of Dmin/Dmax. Defaults to 1e-3. Should be smaller than 1e-3 (larger value will cause problem)
-
A(int) –initial value of A. Defaults to 10.
-
B(int) –initial value of B. Defaults to 20.
Returns:
-
A(float) –found A
-
B(float) –found B
estimate_ab_old_manual(target_Dmin, target_Dmax, init_a=None, init_b=None, tol=0.001, search_step=0.1)
¶
Estimate a and b parameters of SMAP function based on given R0, Dmax and Dmin.
This version use manual search.
Parameters:
-
target_Dmin(float) –target Dmin
-
target_Dmax(float) –target Dmax
-
search_step(float, default:0.1) –incremental value of A/B for searching. Defaults to 0.2.
-
tol(float, default:0.001) –tolerance of Dmin/Dmax. Defaults to 1e-3. Should be smaller than 1e-3 (larger value will cause problem)
-
A(int) –initial value of A. Defaults to 10.
-
B(int) –initial value of B. Defaults to 20.
Returns:
-
A(float) –found A
-
B(float) –found B
voronoi
¶
Classes:
-
Voro3D–Voro ++ library
Functions:
-
layer_extractor–Extract atoms of outermost layers, based on Voronoi analysis
-
surface_detect–Extract atoms on free surface, are atoms have Voronoi with max(faceArea) >= max_edge**2
Voro3D()
¶
Voro ++ library
Methods:
-
fAtomicVol_Bulk_gen–compute atomic-volume of each atom in Bulk models
-
fAtomicVol_Plate_gen–compute atomic-volume of each atom in Plate models
-
fAtomicVol_Bulk–compute atomic-volume of each atom in Bulk models
-
fAtomicVol_Plate–compute atomic-volume of each atom in Plate models
fAtomicVol_Bulk_gen(P, box, coord_number=False)
¶
compute atomic-volume of each atom in Bulk models Args: P : Nx3 Matrix contain positions of atoms box : simulation box coord_number=False : compute coordiation number Returns: atomicVol : 1xM array of atomic volume coord, cell_neighbor : 1xN list, Nxlist index of neighbors of each atom in original input points
Examples:
fAtomicVol_Plate_gen(P, box, bound_cond=(1, 1, 0), max_edge=3.1, surf_deep=15, virtual_surface=True, offset=False, coord_number=False)
¶
compute atomic-volume of each atom in Plate models update Ver2: copy layer 2nd and 3rd to cover free surface, offset distance = inter-layer distance. So, no need to input offset value Args: P : Nx3 Matrix contain positions of atoms box : simulation box
**Optional: bound_cond=(1, 1, 0) : tuple of boundary condtions max_edge=3.1 : value to to compute face-area = max_edge**2 surf_deep=15 : = max(peak) - min(valey), unit in Angstrom, use to reduce input data to save memory virtual_surface=True : apply virtual surface to cover real surface before compute Voronoi + offset=False: extract 2 layers near outmost layer, and use to cover surface, offset_distance is auto computed based on atomic arrangement + offset=true: extract 1 layer near outmost layer, and use to cover surface with offset_distance = offset value coord_number=False : compute coordiation number Returns: atomicVol : 1xM array of atomic volume coord, cell_neighbor : 1xN list, Nxlist index of neighbors of each atom in original input points
fAtomicVol_Bulk(P, box, coord_number=False)
¶
compute atomic-volume of each atom in Bulk models Args: P : Nx3 Matrix contain positions of atoms box : simulation box **Optional: coord_number=False : compute coordiation number Returns: atomicVol : 1xM array of atomic volume coord, cell_neighbor : 1xN list, Nxlist index of neighbors of each atom in original input points
fAtomicVol_Plate(P, box, bound_cond=(1, 1, 0), max_edge=3.1, surf_deep=15, virtual_surface=True, offset=False, coord_number=False)
¶
compute atomic-volume of each atom in Plate models update Ver2: copy layer 2nd and 3rd to cover free surface, offset distance = inter-layer distance. So, no need to input offset value Args: P : Nx3 Matrix contain positions of atoms box : simulation box
**Optional: bound_cond=(1, 1, 0) : tuple of boundary condtions max_edge=3.1 : value to to compute face-area = max_edge**2 surf_deep=15 : = max(peak) - min(valey), unit in Angstrom, use to reduce input data to save memory virtual_surface=True : apply virtual surface to cover real surface before compute Voronoi + offset=False: extract 2 layers near outmost layer, and use to cover surface, offset_distance is auto computed based on atomic arrangement + offset=true: extract 1 layer near outmost layer, and use to cover surface with offset_distance = offset value coord_number=False : compute coordiation number Returns: atomicVol : 1xM array of atomic volume coord, cell_neighbor : 1xN list, Nxlist index of neighbors of each atom in original input points
layer_extractor(P, bound_cond=(1, 1, 0), layer_num=1, max_edge=3.0, surf_deep=15, method='max_face_perimeter')
¶
Extract atoms of outermost layers, based on Voronoi analysis Args: P : Nx3 Matrix contain positions of atoms bound_cond=(1, 1, 0) : tuple of boundary condtions layer_num : number of Layers need to extract (layer_num=0 will extract all layers) max_edge : value to to compute face-area = max_edge**2 surf_deep : = max(peak) - min(valey), unit in Angstrom, use to reduce input data to save memory method : 'max_face_perimeter' or 'max_face_area' Returns: hiLayerIndex, loLayerIndex: list of lists (1xM index of atoms in each layer) By Cao Thang, Jan 2020
surface_detect(P, bound_cond=(1, 1, 0), max_edge=3.0, surf_deep=15, method='max_face_perimeter')
¶
Extract atoms on free surface, are atoms have Voronoi with max(faceArea) >= max_edge**2 Agrs: P : Nx3 Matrix contain positions of atoms bound_cond=(1, 1, 0) : tuple of boundary condtions max_edge : value to to compute face-area = max_edge**2 surf_deep : = max(peak) - min(valey), unit in Angstrom, use to reduce input data to save memory method : 'max_face_perimeter' or 'max_face_area'
Returns:
-
–
hiSurIndex, loSurIndex: 1xM array, index of surface atoms in the original input points
Notes
experimental choose: max_edge=0.73*latticeConst only 1 pair of surface is detect each time