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 id | MDJOB-20260911-F0F59D |
| GPU served | NVIDIA RTX 4090, secure cloud |
| atoms | 8,393 Al at the start, 8,593 at the end |
| steps | 50,001 in 101 run commands |
| atom-steps | 424,708,393 |
| LAMMPS loop time | 4,531 s |
| pace | 11.0 steps/s, 90.6 ms per step, flat from the first segment to the last |
| wall time billed | 4,560 s from first heartbeat to results uploaded |
| price | $1.09 ($1.0871, priced by work) |
| result | exit 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
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.