Benchmark 1: ReaxFF oxide film

MDEngine · benchmark 1 · run 2026-09-11

Benchmark 1: a ReaxFF oxide film on aluminium, 50,000 steps, one hosted job

This page shows one real job on the MDEngine hosted GPU tier, with the deck, the job id, the pace and the price to the cent. Nothing here is projected. The numbers come from the run’s own LAMMPS log and the invoice line on the account.

What ran

An 8,393-atom aluminium slab, relaxed for the force field it is simulated with, under oxygen gas. One O2 molecule is added every 500 steps and lands on the surface about 2 ps later. Reactive force field: ReaxFF Al/O, Hong and van Duin, J. Phys. Chem. C 2015 (DOI 10.1021/acs.jpcc.5b04650), with charge equilibration every step. 100 molecules, 50,000 steps of 0.25 fs, 12.5 ps of simulated time. This is the first 50,000 steps of the protocol we use for a full 2 nm film.

The numbers

job idMDJOB-20260911-F0F59D
GPU servedNVIDIA RTX 4090, secure cloud
atoms8,393 Al at the start, 8,593 at the end
steps50,001 in 101 run commands
atom-steps424,708,393
LAMMPS loop time4,531 s
pace11.0 steps/s, 90.6 ms per step, flat from the first segment to the last
wall time billed4,560 s from first heartbeat to results uploaded
price$1.09 ($1.0871, priced by work)
resultexit 0, no lost atoms, results tarball with trajectory, log and restart file

How the price was computed

Hosted runs are priced by the work the deck does, not by the clock. For the reaxff class the price is $8 per million steps plus $1.50 per billion atom-steps plus $0.05 per job. This job: 0.050 million steps × $8 = $0.40, 0.4247 billion atom-steps × $1.50 = $0.64, plus $0.05. Total $1.09. The same deck costs the same on a slower card. A job is never billed more than its wall limit at the hourly rate, here 3 h × $2.00.

What the run shows

Last frame of the benchmark: aluminium slab seen from the side, oxygen atoms on top coloured by charge
Last frame, front view. Atoms coloured by charge, from -0.64 e (blue) to +0.74 e (yellow). Scale bar 10 Å.

At 12.5 ps, 152 of the 200 deposited oxygen atoms are bound to the surface with a mean charge of -0.43 e. 45 are still in flight. Three have moved below the original surface plane. The top aluminium layer has risen by 0.6 Å as it is pulled into the forming oxide. The slab interior stays at a uniform density. This is the chemisorption stage. A full film needs the remaining 1.1 million steps of the same protocol.

Run it yourself

The deck below is complete except for the force field file. The Al/O parameters come from the supporting information of the paper cited above and are for research use. We do not redistribute them. Save them as ffield.reax.AlO_HongVanDuin2015 in the deck directory, together with the slab data file and O2.data, then:

mdengine capabilities in.bench1.reaxff      # preflight: 13 GPU styles, 0 missing
mdengine run --gpu in.bench1.reaxff --gpu-type any --wall-hours 3

Before you submit, the account tool quotes the exact price from the deck’s step count and atom count. The slab must be relaxed for the force field you use. A slab relaxed for another potential sits under gigapascals of stress and collapses. The deck checks this at step 0 and stops if it fails.

The deck, in.bench1.reaxff
# in.bench1.reaxff — MDEngine benchmark 1: ReaxFF Al/O oxide-film growth on the hosted GPU (2026-09-11).
# 8393-atom Al slab relaxed for this force field, O2 deposited one molecule per 500 steps, 100 molecules = 50,000 steps.
# Design points, each one learned the hard way:
#  - the insertion band [zsurf+6, zsurf+10] and the QEq zone (z < zsurf+3) track the surface height every segment
#  - fix wall/reflect at zhi: a molecule that bounces stays in the box instead of leaving through the open top face
#  - segmented QEq: in-flight O2 sits at q=0, a landed molecule joins charge equilibration at the next segment
#  - the thermostat covers the QEq zone minus the frozen base: the slab and the oxide, never the in-flight gas
#  - step-0 PREFLIGHT gate: in-slab stress and density must match a slab relaxed for THIS force field, else quit
#  - fix deposit rejects dynamic regions, so one segment = one deposition; dump and restart cadences are segment multiples
# Units real: dt 0.25 fs.
variable T_depart  equal 300
variable dt        equal 0.25
variable tag       index BENCH-1.reaxff-film
variable nO2       index 100
variable depEvery  index 500                       # 100 x 500 = 50k steps = 12.5 ps
variable ffield    index ffield.reax.AlO_HongVanDuin2015   # deck dir is self-contained (remote transport rule)
variable elems     index "O Al"
variable ckptEvery index 25000                     # = 50 x depEvery: checkpoints land on segment ends
variable dumpEvery index 2500                      # = 5 x depEvery -> 21 frames
variable fresh     index yes                       # no = resume from ${resume}
variable resume    index none                      # checkpoint path; `if` cannot compare dotted strings, hence the flag

units           real
atom_style      charge
boundary        p p f
processors      * * 1
# substrate relaxed FOR this force field; a slab relaxed for another potential fails the gate below
if "${fresh} == yes" then &
  "read_data       al-slab.reaxff-HvD2015.data" &
  "change_box      all z final -2.0 130.0 units box" &
else &
  "read_restart    ${resume}"
# read_restart restores atoms, velocities, box, static groups (Oxy, Al, base, qeqgrp, mobile) and
# the timestep; pair style, molecule, regions, computes, variables and fixes must be re-specified.

mass            1 15.999
mass            2 26.982
group           Oxy type 1
group           Al  type 2
molecule        O2 O2.data

pair_style      reaxff NULL safezone 2.0 mincap 200
pair_coeff      * * ${ffield} ${elems}

# ---- QEq zone: first snapshot uses a STATIC bound (compute-backed variables are not evaluable
#      before the first run); the surface-tracking region replaces it right after `run 1`. ----
compute         zAl Al property/atom z
compute         zAlmax Al reduce max c_zAl
compute         zAlmin Al reduce min c_zAl          # preflight gate (slab thickness)
thermo_modify   lost ignore flush yes
region          qeqzone0 block INF INF INF INF INF 52.5 units box     # slab top is z~49.6 at t=0 (al-slab.reaxff-HvD2015.data)
if "${fresh} == yes" then "group           qeqgrp region qeqzone0"
fix             qeq qeqgrp qeq/reaxff 1 0.0 10.0 1e-6 reaxff

compute         chargeOxy Oxy property/atom q
compute         q_Oxy Oxy reduce ave c_chargeOxy
compute         chargeAl Al property/atom q
compute         q_Al Al reduce ave c_chargeAl
variable        nOxy equal count(Oxy)

region          base block INF INF INF INF INF 5.1 units box
if "${fresh} == yes" then "group           base region base"
fix             hold base setforce 0.0 0.0 0.0
timestep        ${dt}
thermo_style    custom step temp pe etotal atoms c_q_Al c_q_Oxy v_nOxy pxx pyy   # pxx/pyy: the preflight gate reads them
thermo          1000
if "${fresh} == yes" then &
  "velocity        all create ${T_depart} 277387" &
  "velocity        base set 0.0 0.0 0.0 units box" &
  "fix             en0 all nve/limit 0.01" &
  "run             1" &
  "unfix           en0" &
  "reset_timestep  0" &
else &
  "run             0 post no"
# ---- surface tracking (valid now that one run has initialized the computes) ----
variable        zsurf equal c_zAlmax
variable        zqeq  equal v_zsurf+3.0
variable        zdlo  equal v_zsurf+6.0
variable        zdhi  equal v_zsurf+10.0
region          qeqzone block INF INF INF INF INF ${zqeq} units box   # static; rebuilt each segment
variable        hslab equal v_zsurf-c_zAlmin
variable        pin   equal 0.5*(pxx+pyy)*lz/v_hslab
variable        rho   equal count(Al)*26.982*1.6605/(lx*ly*v_hslab)
if "${fresh} == yes" then "variable gate equal 1" else "variable gate equal 0"
if "${gate} == 1" then "print 'PREFLIGHT pin_atm ${pin} rho_gcc ${rho} hslab ${hslab} natoms $(count(Al))'"
if "${gate} == 1 && (${pin} > 10000 || ${pin} < -10000)" then &
  "print 'PREFLIGHT GATE FAILED: in-slab stress ${pin} atm - substrate not relaxed for ${ffield}'" "quit 3"
if "${gate} == 1 && (${rho} < 2.4 || ${rho} > 3.0)" then &
  "print 'PREFLIGHT GATE FAILED: slab density ${rho} g/cc'" "quit 3"
if "${gate} == 1" then "print 'PREFLIGHT GATE PASSED'"
fix             mdall all nve
group           mobile subtract qeqgrp base
fix             thermostat mobile langevin ${T_depart} ${T_depart} 10.0 58783
fix             lid all wall/reflect zhi EDGE
thermo_style    custom step temp pe etotal atoms c_q_Al c_q_Oxy v_nOxy v_zsurf cpu
thermo_modify   lost ignore flush yes
thermo          1000

variable        Tnow equal temp
fix             guard all halt 500 v_Tnow > 1500 error hard

restart         ${ckptEvery} ${tag}.ckpt.a ${tag}.ckpt.b
dump            traj all custom ${dumpEvery} ${tag}.traj id type x y z q
dump_modify     traj sort id

# ---- segmented production: each segment = rebuild regions at the current surface, deposit one O2,
#      re-snapshot QEq (landed O joins; in-flight O2 stays at q=0), run depEvery steps ----
variable        iseg0 equal floor(step/v_depEvery)+1   # resume-safe: segments already done come from the restored step
variable        iseg1 equal ${iseg0}
label           segloop
variable        iseg loop ${iseg1} ${nO2}
unfix           qeq
region          qeqzone delete
region          qeqzone block INF INF INF INF INF ${zqeq} units box
group           qeqgrp delete
group           qeqgrp region qeqzone
group           mobile subtract qeqgrp base      # thermostat follows the QEq zone: landed O join, in-flight gas stays free
fix             qeq qeqgrp qeq/reaxff 1 0.0 10.0 1e-6 reaxff
region          dep_zone block EDGE EDGE EDGE EDGE ${zdlo} ${zdhi} units box   # fix deposit rejects INF
variable        dseed equal 12345+v_iseg
fix             dep all deposit 1 0 1 ${dseed} region dep_zone near 2.0 mol O2 vz -0.004 -0.002 attempt 50
run             ${depEvery} post no
unfix           dep
group           Oxy type 1                       # groups are static: adopt the O2 just deposited
region          dep_zone delete
next            iseg
jump            SELF segloop
write_restart   ${tag}.final.restart

Benchmark run by ForceField Silicon on the MDEngine hosted endpoint, 2026-09-11 23:22 to 00:37 UTC. Card, price and pace are those of the run, not a list price. More benchmarks follow: EAM aluminium melt and quench, a Lennard-Jones scaling ladder, a streptavidin-biotin pull in OpenMM, and an aluminium bicrystal with the grain tool.