| from ase.build import molecule |
| from ase.io import write |
| from ase.optimize import LBFGS |
| import numpy as np |
|
|
| |
| import os |
| _REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| _JD_PATH = os.path.join(_REPO_ROOT, "weight", "Jd.pt") |
| if os.path.isfile(_JD_PATH): |
| os.environ.setdefault("ONESCIENCE_UMA_JD_PATH", _JD_PATH) |
|
|
| from onescience.utils.uma.units.mlip_unit import load_predict_unit |
| from onescience.utils.uma.calculate.ase_calculator import FAIRChemCalculator |
|
|
| |
| CKPT = "../weight/uma-s-1p1_converted.pt" |
|
|
| |
| RELAX = False |
| FMAX = 0.05 |
| STEPS = 200 |
|
|
| |
| predictor = load_predict_unit(CKPT, device="cuda") |
|
|
| def make_state(mol_name: str, mult: int, charge: int = 0): |
| atoms = molecule(mol_name) |
| atoms.pbc = False |
| |
| atoms.info["spin"] = mult |
| atoms.info["spin_multiplicity"] = mult |
| atoms.info["charge"] = charge |
| atoms.calc = FAIRChemCalculator(predictor, task_name="omol") |
| return atoms |
|
|
| |
| singlet = make_state("CH2_s1A1d", mult=1, charge=0) |
| triplet = make_state("CH2_s3B1d", mult=3, charge=0) |
|
|
| |
| if RELAX: |
| for tag, atoms in [("singlet", singlet), ("triplet", triplet)]: |
| opt = LBFGS(atoms, logfile=f"{tag}_opt.log") |
| opt.run(fmax=FMAX, steps=STEPS) |
| write(f"{tag}_final.xyz", atoms) |
|
|
| |
| E_s = singlet.get_potential_energy() |
| E_t = triplet.get_potential_energy() |
|
|
| gap_ev = E_t - E_s |
| gap_kcal = gap_ev * 23.060543 |
|
|
| print(f"Singlet energy (CH2 1A1): {E_s:.6f} eV") |
| print(f"Triplet energy (CH2 3B1): {E_t:.6f} eV") |
| print(f"Gap (T - S): {gap_ev:.6f} eV ({gap_kcal:.2f} kcal/mol)") |
|
|
| |
| write("CH2_singlet.xyz", singlet) |
| write("CH2_triplet.xyz", triplet) |
|
|
| |
| print("Singlet info:", {k: singlet.info[k] for k in ("spin", "spin_multiplicity", "charge")}) |
| print("Triplet info:", {k: triplet.info[k] for k in ("spin", "spin_multiplicity", "charge")}) |
|
|