NPT and D3 dispersion¶
Experimental
NPT and D3 carry an "experimental: not yet qualified" line in the run report until their qualification studies are recorded.
NPT¶
ensemble="NPT" in fm.md (and --ensemble NPT on the command line) is
ASE 3.27's LangevinBAOAB barostat on the graph engine:
run = fm.md("NbCl5.cif", model="mh1", head="matpes_r2scan", ensemble="NPT",
temperature_K=300, pressure_GPa=0.0, cell_mode="hydrostatic",
steps=200_000, repeat=(3, 3, 3), dispersion="d3bj", output="npt/", seed=1)
cell_mode is "hydrostatic" or "full". For other barostats, pass an
explicit integrator:
| Record | ASE class |
|---|---|
fm.integrators.LangevinBAOAB(...) |
LangevinBAOAB |
fm.integrators.MTK(..., cell_mode="hydrostatic" or "full") |
IsotropicMTKNPT, MTKNPT |
fm.integrators.Berendsen(..., pressure_GPa=...) |
NPTBerendsen, Inhomogeneous_NPTBerendsen (equilibration only, non-canonical) |
Cell divergence. A vapour at low pressure expands without bound.
LangevinBAOAB stops the run with CellDivergedError (restart and metadata
written first) once the volume leaves [V0/20, 20 V0] or a cell vector is
longer than 1000 Å. Change the limits with max_volume_ratio and
max_cell_length_A.
Stress convention. The force field returns the potential (virial)
stress as a full 3x3 tensor in ASE's sign convention; the integrator adds the
kinetic part, as ASE's get_stress(include_ideal_gas=True) does.
D3(BJ) dispersion¶
FastMACE has its own GPU D3(BJ) term. It runs inside the captured step in MD, in relaxations and in quenches, and needs no extra package.
run = fm.md(..., dispersion="d3bj")
"d3bj" is shorthand. FastMACE expands it to a complete fm.D3 record
before planning: Becke-Johnson damping with the parameter set of the head's
training functional (pbe for PBE-trained models, r2scan for
matpes_r2scan), 40 bohr pair and coordination cutoffs, no three-body term,
float64. The expanded record is printed in the report and recorded in
metadata.json.
"d3bj" is refused when:
- the training reference already contains dispersion (MACE-OFF, OMOL-0,
MH-1's
omolhead), since D3 would count it twice; - the training functional is unknown (a model loaded from a path or URL). Pass an explicit record then:
run = fm.md(..., model=model, dispersion=fm.D3(functional="pbe"))
PolarMACE (POLAR-1) with D3 is refused with any record.
An explicit fm.D3 is used as given; a functional that differs from the
training functional is a report warning. In TOML, a [dispersion] table
holds the record's fields.
When to use it. The molecular chlorides need D3 in NPT: without it, NbCl5 swelled by 20 % at 300 K and evaporated at 600 K in our tests.
See also: Integrators and optimisers, Models, D3, PolarMACE and schedules.