Applying foundation model on metal oxide surface gets irrational results #1396
Unanswered
certejlhj2223
asked this question in
Q&A
Replies: 1 comment
|
Well, I wouldn't call it irrational, in reality it depends on the temperature, oxygen partial pressure etc. But I'm sure that fine-tuning with a dozen configurations (take them from various stages of losing the oxygen) would help nail the DFT prediction right (and you have to be content with that, ML potentials can only speed up what you would see with DFT). |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Dear all:
I am using MACE foundation model to run a MD on CeO2 (100) surface.
The trajectory shows formation of oxygen gas (O2), which should not happen in reality.
The foundation models I tried are MACE-MH-1(head: oc20 and matpes_r2scan) and MACE-MP-0b3-medium
I wonder if it is the problem of the foundation models that not suitable for my system and whether fine-tuning are possible to fix this.
I used ASE to run MD simulation with script as follows:
warnings.filterwarnings("ignore")
from ase import units
from ase.io import read, write
from ase.md import Langevin
from ase.md.velocitydistribution import MaxwellBoltzmannDistribution
from ase.io.trajectory import Trajectory
import numpy as np
import time
from mace.calculators import MACECalculator
calculator = MACECalculator(model_paths='/HOME/cityu_hlxue/cityu_hlxue_3/HDD_POOL/models/mace-mh-1.model',device='cuda',head='matpes_r2scan')
atoms = read(f"quarter.in", format='espresso-in')
atoms.calc = calculator
traj = Trajectory('quarter-default.traj', 'w', atoms)
T_init = 300 # Initial temperature in K
MaxwellBoltzmannDistribution(atoms, T_init * units.kB)
dyn = Langevin(atoms, 1 * units.fs, T_init * units.kB, 0.001)
n_steps = 20000 # Number of steps to run
dyn.attach(traj.write, interval=20)
def printenergy(a=atoms):
"""Function to print the potential, kinetic and total energy"""
epot = a.get_potential_energy() / len(a)
ekin = a.get_kinetic_energy() / len(a)
print(
f'Energy per atom: Epot ={epot:6.3f}eV Ekin = {ekin:.3f}eV '
f'(T={ekin / (1.5 * units.kB):3.0f}K) Etot = {epot + ekin:.3f}eV'
)
dyn.attach(printenergy, interval=500)
printenergy()
dyn.run(n_steps)
All reactions