结构微扰模块
本模块用于对结构进行扩胞和微扰生成,基于dpdata库实现。
模块概述
该模块提供了一组函数,用于:
自动寻找最优扩胞倍数
创建超胞结构
对结构进行晶格和原子位置的微扰
生成大量微扰后的结构用于机器学习训练
主要函数说明
find_optimal_supercell(structure, max_atoms=150, max_supercell=4)
寻找最优的扩胞倍数,使原子数接近但不超过最大限制。
参数:
- structure: pymatgen的Structure对象,原始晶体结构
- max_atoms: 最大允许原子数(默认150)
- max_supercell: 最大扩胞倍数(默认4)
返回: - 扩胞倍数列表 [a, b, c],三个方向上的扩胞倍数
作用: 自动计算最佳扩胞策略,优先考虑三个方向同时扩胞,不满足要求时再考虑单方向扩胞。
create_supercell(structure, scaling_matrix)
创建超胞结构。
参数:
- structure: pymatgen的Structure对象,原始晶体结构
- scaling_matrix: 扩胞倍数列表 [a, b, c]
返回: - 扩胞后的Structure对象
作用: 根据给定的扩胞倍数创建超胞。
process_structure_for_perturbation(poscar_path, output_base_dir, config)
处理单个结构进行扩胞和微扰。
参数:
- poscar_path: POSCAR文件路径
- output_base_dir: 输出文件的基础目录
- config: 配置字典,包含微扰参数
返回: - 生成的微扰结构数量
作用: 读取POSCAR文件,进行扩胞处理,然后使用dpdata生成微扰结构。
generate_perturbation_fallback(structure, output_dir, base_filename, perturb_params)
备用微扰生成方法(使用pymatgen)。
参数:
- structure: 要微扰的结构(Structure对象)
- output_dir: 输出目录
- base_filename: 基础文件名
- perturb_params: 微扰参数字典
返回: - 生成的微扰结构数量
作用: 当dpdata不可用时,使用pymatgen进行简单的随机微扰。
main(config_file=”input.yaml”)
主函数,驱动整个扩胞和微扰过程。
参数:
- config_file: 配置文件路径(默认”input.yaml”)
返回: - 无返回值
作用: 加载配置,遍历所有POSCAR文件,对每个结构进行扩胞和微扰处理。
配置参数说明
配置文件需要包含以下微扰相关参数:
perturbation:
max_atoms: 150 # 扩胞后最大原子数
max_supercell: 4 # 最大扩胞倍数
n_structures: 100 # 每个结构生成的微扰结构数
cell_pert_fraction: 0.05 # 晶格微扰幅度(相对变化)
atom_pert_distance: 0.05 # 原子位置微扰距离(Å)
atom_pert_style: 'uniform' # 微扰样式
使用示例
# 直接运行模块
python perturb_structures.py --config_file input.yaml
# 或在Python代码中调用
from perturb_structures import main
main("input.yaml")
输出文件结构
模块将生成以下目录结构:
perturb/
├── BaTiO3/ # 按化学式分类
│ ├── BaTiO3_mp-2998/ # 按结构名称分类
│ │ ├── BaTiO3_mp-2998_supercell.vasp # 扩胞后的结构
│ │ ├── BaTiO3_mp-2998_supercell_perturb_0001.vasp # 微扰结构1
│ │ ├── BaTiO3_mp-2998_supercell_perturb_0002.vasp # 微扰结构2
│ │ └── ...
│ └── ...
├── SrTiO3/
└── ...
注意事项
需要先运行结构下载模块生成基础POSCAR文件
依赖dpdata库进行微扰,备选使用pymatgen
微扰结构按化学式和组织结构名称分类,便于管理
每个原始结构生成的微扰结构数量由配置控制