You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.7 KiB
80 lines
2.7 KiB
2 years ago
|
import numpy as np
|
||
|
|
||
|
from cmmde_atoms import Atoms
|
||
|
from cmmde_clusterutil import get_element_info
|
||
|
|
||
|
|
||
|
def Decahedron(symbol, p, q, r, latticeconstant=None):
|
||
|
"""
|
||
|
Return a decahedral cluster.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
symbol: Chemical symbol (or atomic number) of the element.
|
||
|
|
||
|
p: Number of atoms on the (100) facets perpendicular to the five
|
||
|
fold axis.
|
||
|
|
||
|
q: Number of atoms on the (100) facets parallel to the five fold
|
||
|
axis. q = 1 corresponds to no visible (100) facets.
|
||
|
|
||
|
r: Depth of the Marks re-entrence at the pentagon corners. r = 0
|
||
|
corresponds to no re-entrence.
|
||
|
|
||
|
latticeconstant (optional): The lattice constant. If not given,
|
||
|
then it is extracted form ase.data.
|
||
|
"""
|
||
|
|
||
|
symbol, atomic_number, latticeconstant = get_element_info(
|
||
|
symbol, latticeconstant)
|
||
|
|
||
|
# Check values of p, q, r
|
||
|
if p < 1 or q < 1:
|
||
|
raise ValueError("p and q must be greater than 0.")
|
||
|
|
||
|
if r < 0:
|
||
|
raise ValueError("r must be greater than or equal to 0.")
|
||
|
|
||
|
# Defining constants
|
||
|
t = 2.0 * np.pi / 5.0
|
||
|
b = latticeconstant / np.sqrt(2.0)
|
||
|
a = b * np.sqrt(3.0) / 2.0
|
||
|
|
||
|
verticies = a * np.array([[np.cos(np.pi / 2.), np.sin(np.pi / 2.), 0.],
|
||
|
[np.cos(t * 1. + np.pi / 2.),
|
||
|
np.sin(t * 1. + np.pi / 2.), 0.],
|
||
|
[np.cos(t * 2. + np.pi / 2.),
|
||
|
np.sin(t * 2. + np.pi / 2.), 0.],
|
||
|
[np.cos(t * 3. + np.pi / 2.),
|
||
|
np.sin(t * 3. + np.pi / 2.), 0.],
|
||
|
[np.cos(t * 4. + np.pi / 2.), np.sin(t * 4. + np.pi / 2.), 0.]])
|
||
|
|
||
|
# Number of atoms on the five fold axis and a nice constant
|
||
|
h = p + q + 2 * r - 1
|
||
|
g = h - q + 1 # p + 2*r
|
||
|
|
||
|
positions = []
|
||
|
# Make the five fold axis
|
||
|
for j in range(h):
|
||
|
pos = np.array([0.0, 0.0, j * b - (h - 1) * b / 2.0])
|
||
|
positions.append(pos)
|
||
|
|
||
|
# Make pentagon rings around the five fold axis
|
||
|
for n in range(1, h):
|
||
|
# Condition for (100)-planes
|
||
|
if n < g:
|
||
|
for m in range(5):
|
||
|
v1 = verticies[m - 1]
|
||
|
v2 = verticies[m]
|
||
|
for i in range(n):
|
||
|
# Condition for marks re-entrence
|
||
|
if n - i < g - r and i < g - r:
|
||
|
for j in range(h - n):
|
||
|
pos = (n - i) * v1 + i * v2
|
||
|
pos += np.array([0.0, 0.0, j * b -
|
||
|
(h - n - 1) * b / 2.0])
|
||
|
positions.append(pos)
|
||
|
|
||
|
symbols = [atomic_number] * len(positions)
|
||
|
return Atoms(symbols=symbols, positions=positions)
|