| import sys | |
| from pathlib import Path | |
| # 把本仓库根目录放到 sys.path 最前面,避免 PYTHONPATH 中其他同名 model 包干扰 | |
| sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) | |
| import model # noqa: E402 | |
| import ase | |
| from ase.build import bulk | |
| import torch | |
| from pymatgen.core.structure import Structure | |
| from onescience.utils.matris import StructOptimizer | |
| model_name = "matris_10m_oam" | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| matris_opt = StructOptimizer( | |
| model=model_name, | |
| task = "efsm", | |
| optimizer = "FIRE", # FIRE, BFGS ... | |
| device=device | |
| ) | |
| atom = Structure.from_file("cif_file/demo.cif") | |
| max_steps = 500 | |
| fmax = 0.05 | |
| opt_result = matris_opt.relax( | |
| atoms=atom, # pymatgen.Structure or ase.Atoms | |
| verbose=True, | |
| steps=max_steps, | |
| fmax=fmax, | |
| relax_cell=max_steps > 0, | |
| ase_filter="FrechetCellFilter", | |
| ) | |
| trajectory = opt_result['trajectory'] | |
| energy = trajectory.energies[-1] | |
| force = trajectory.forces[-1] | |
| stress = trajectory.stresses[-1] | |
| magmom = trajectory.magmoms[-1] | |
| final_structure = opt_result['final_structure'] | |