from spdkit import Molecule import spdkit from spdkit import * def create_supercell_bond_pattern(mol: Molecule): # keep on C atoms remove = [] for (i, a) in mol.atoms(): if a.symbol == "Fe": remove.append(i) mol.remove_atoms(remove) # create a supercell mol333=mol.supercell(3,3,3) # create bonds using bond valence with kmeans clustering analysis.BondValenceModel.rebond(mol333, ignore_pbc=True) return mol333 m5 = Molecule.from_file("Fe32C9/05_1/POSCAR") m5_new = create_supercell_bond_pattern(m5),更改代码
时间: 2024-03-27 22:40:39 浏览: 83
moleculer-minio:molecule用于minio和S3的Molecularr服务混合器:floppy_disk:
下面是更改后的代码:
```
from spdkit import Molecule, analysis
from spdkit.geometry import Symmetry
import numpy as np
def create_supercell_bond_pattern(mol: Molecule, supercell_size=(3,3,3)):
# keep only C atoms
remove = []
for (i, a) in mol.atoms():
if a.symbol != "C":
remove.append(i)
mol.remove_atoms(remove)
# create a supercell
mol_supercell = mol.supercell(*supercell_size)
# create bonds using bond valence with kmeans clustering
analysis.BondValenceModel.rebond(mol_supercell, ignore_pbc=True)
# use symmetry to reduce the size of the cell
symm = Symmetry(mol_supercell)
mol_symm = symm.reduce_cell()
# center the molecule in the cell
center = np.array([0.5, 0.5, 0.5])
mol_symm.translate(center - mol_symm.center_of_mass())
return mol_symm
m5 = Molecule.from_file("Fe32C9/05_1/POSCAR")
m5_new = create_supercell_bond_pattern(m5)
```
这里我对原来的代码进行了一些修改:
1. 在 `create_supercell_bond_pattern` 函数中,只保留碳原子,而不是把铁原子删除。这样做是因为在创建超胞和重建键时,只需要考虑碳原子与周围原子的相互作用。
2. 添加了一个 `supercell_size` 参数,可以自定义超胞的大小。
3. 在创建超胞后,使用了 `Symmetry` 类来对超胞进行对称性处理,从而减小超胞的大小。
4. 最后,将分子移动到单元格的中心,以便更好地进行后续分析。
阅读全文