从一个实例中学习python中的排列组合的实现
ZrO2中掺杂Y元素
一个96原子的晶胞,去掉一个氧空位,再取代两个Zr原子,就是一个通用的YSZ模型(95 原子)。
但是Y与Vo的相对位置,是一个麻烦。
Y的掺杂会不会带来晶胞大小的变化。我这里的处理是根据以往的文献,确定一个可能的构型。
然后考虑一下掺杂对晶胞尺寸带来的影响,然后就定了,Y再换其他位置也认为不会再影响了。(因为比起相对位置,肯定有无Y原子才是影响的大头)
确定了晶胞尺寸,结构优化后,再把Y换成Zr。然后随机取代,最终确定$C_{32}^2$个结构,计算单点能,用于机器学习势学习。
代码
由大G老师支持。
from ase.io import read
from ase.io.vasp import write_vasp
from itertools import combinations
import os
at = read('POSCAR')
# 找到所有 Zr 原子的索引
zr_indices = [i for i, atom in enumerate(at) if atom.symbol == 'Zr']
print(f"找到 {len(zr_indices)} 个 Zr 原子")
# 创建保存目录
os.makedirs("ZrO_Y2_structures", exist_ok=True)
# 枚举所有 Zr 的两两组合,逐个替换为 Y
for count, (i, j) in enumerate(combinations(zr_indices, 2)):
new_at = at.copy()
new_at[i].symbol = 'Y'
new_at[j].symbol = 'Y'
# 写入文件
subdir = f"ZrO_Y2_structures/{count}"
os.makedirs(subdir, exist_ok=True)
filename = os.path.join(subdir, "POSCAR")
write_vasp(filename, new_at,direct=True,sort=True)
print(f"写入结构:{filename}")
print(f"共生成 {count + 1} 个结构。")
combations
类是python中实现组合的高效方式。参数为一个列表,一个长度。返回一个包含若干元组的列表。
for count, (i, j) in enumerate(combinations(zr_indices, 2)):
这里用(i,j)对一个元组进行了解包。