home

Atomistic Simulation Methods

Choose a model for the quantities and configurations your simulation must predict. Speed, accuracy, and transferability depend on the task; they are not universal scores.


Atomistic Simulation Methods

Download

PNG PNG (HD) PDF SVG

Code

atomistic-simulation-methods.typ (128 lines)

#import "@preview/cetz:0.5.2": canvas, draw

#set page(width: 780pt, height: auto, margin: 22pt, fill: none)
#set text(font: "Avenir Next", size: 10.5pt, fill: rgb("#19324f"))
#set par(leading: 0.55em)

#let card(title, body, caption) = grid(
  columns: (100%,),
  block(
    width: 100%,
    inset: 12pt,
    radius: 8pt,
    fill: rgb("#cdd3da"),
    breakable: false,
  )[
    #text(size: 13pt, weight: "bold", title)
    #v(8pt)
    // Fill the available width; each drawing keeps its own aspect ratio.
    #layout(size => std.scale(
      size.width / measure(body).width * 100%,
      reflow: true,
      body,
    ))
    #v(7pt)
    #caption
  ],
)
#let takeaway = block.with(
  width: 100%,
  inset: 12pt,
  radius: 6pt,
  fill: rgb("#c6d8d2"),
  breakable: false,
)

// === 1  What is evaluated? ===
#let figure-0 = canvas({
  let rows = (
    (
      [Classical force field],
      [positions],
      [fitted energy formula],
      [energy + forces],
      rgb("#d6e9f8"),
    ),
    (
      [ML potential],
      [local environments],
      [trained neural model],
      [energy + forces],
      rgb("#d3ede5"),
    ),
    (
      [Density functional theory],
      [nuclei + electrons],
      [self-consistent electrons],
      [energy + forces],
      rgb("#fbe4d4"),
    ),
  )
  for (idx, (title, input, method, output, color)) in rows.enumerate() {
    let y = -idx * 1.9
    for (col, label) in ((0, input), (1, method), (2, output)) {
      draw.content(
        (col * 5.2, y),
        label,
        frame: "rect",
        padding: 10pt,
        fill: color,
        stroke: none,
        name: str(idx) + "-" + str(col),
      )
    }
    draw.content(
      (rel: (0, .45), to: str(idx) + "-0.north-west"),
      title,
      anchor: "west",
    )
    for col in range(2) {
      draw.line(
        str(idx) + "-" + str(col) + ".east",
        str(idx) + "-" + str(col + 1) + ".west",
        mark: (end: "stealth"),
        stroke: gray + 1pt,
      )
    }
  }
})

// === 2  What must be validated? ===
#let figure-1 = [
  #box(width: 680pt)[#table(
    columns: (1fr, 2fr),
    inset: 9pt,
    stroke: rgb("#cad4df") + .5pt,
    table.header([*Method*], [*Checks for the intended application*]),
    [Classical force field],
    [Functional form and parameter coverage; bonding changes, charges, and long-range interactions.],

    [ML potential],
    [Training-domain coverage; errors on representative structures, forces, defects, and trajectories.],

    [DFT],
    [Functional, basis and sampling convergence; relevant charge, spin, and electronic states.],
  )]
]

#text(size: 27pt, weight: "bold")[Atomistic Simulation Methods]
#v(5pt)
Choose a model for the quantities and configurations your simulation must predict. Speed, accuracy, and transferability depend on the task; they are not universal scores.
#v(14pt)
#stack(
  dir: ttb,
  spacing: 12pt,
  card(
    [1  What is evaluated?],
    figure-0,
    [All three can supply energies and forces for atomistic simulation. They differ in how that mapping is built and what electronic physics is represented.],
  ),
  card(
    [2  What must be validated?],
    figure-1,
    [Benchmark the same observable, structures, and accuracy target on the intended hardware. Report throughput and errors with units; test transfer on configurations excluded from fitting.],
  ),
)
#v(12pt)
#takeaway[*Ask “good enough for this task?” before “which is best?”* Classical and ML models amortize a fitted approximation over many evaluations. DFT solves an approximate electronic problem for each configuration. None guarantees accuracy outside its validated setting.]