def __init__(self, geom, allowed=None):
self._coords = []
geom = geom.supercell()
dist = geom.dist(geom)
radii = np.array([get_property(sp, 'covalent_radius') for sp in geom.species])
bondmatrix = dist < 1.3*(radii[None, :]+radii[:, None])
self.fragments, C = get_clusters(bondmatrix)
radii = np.array([get_property(sp, 'vdw_radius') for sp in geom.species])
shift = 0.
C_total = C.copy()
while not C_total.all():
bondmatrix |= ~C_total & (dist < radii[None, :]+radii[:, None]+shift)
C_total = get_clusters(bondmatrix)[1]
shift += 1.
for i, j in combinations(range(len(geom)), 2):
if bondmatrix[i, j]:
bond = Bond(i, j, C=C)
self.append(bond)
for j in range(len(geom)):
for i, k in combinations(np.flatnonzero(bondmatrix[j, :]), 2):
ang = Angle(i, j, k, C=C)
if ang.eval(geom.coords) > pi/4:
self.append(ang)
for bond in self.bonds:
self.extend(get_dihedrals([bond.i, bond.j], geom.coords, bondmatrix, C))
评论列表
文章目录