Repository navigation
Expand file tree
/
Copy pathatomistic-simulation-methods.typ
More file actions
115 lines (107 loc) · 3.77 KB
/
Copy pathatomistic-simulation-methods.typ
File metadata and controls
115 lines (107 loc) · 3.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#import "@preview/cetz:0.5.2": canvas, draw
#let label-size = 12pt
#let paragraph-size = 14pt
#let heading-size = 16pt
#let card(title, body, caption) = grid(
columns: (100%,),
block(
width: 100%,
inset: 12pt,
radius: 8pt,
fill: rgb("#cdd3da"),
breakable: false,
)[
#text(size: heading-size, weight: "bold", title)
#v(8pt)
// Measure unconstrained artwork before scaling, including content wider than its card.
#layout(size => {
let artwork = text(size: label-size, body)
std.scale(size.width / measure(artwork).width * 100%, reflow: true, artwork)
})
#v(7pt)
#text(size: paragraph-size, caption)
],
)
#let takeaway(body) = block(
width: 100%,
inset: 12pt,
radius: 6pt,
fill: rgb("#c6d8d2"),
breakable: false,
text(size: paragraph-size, body),
)
#set page(width: 780pt, height: auto, margin: 22pt, fill: none)
#set text(font: "Avenir Next", size: paragraph-size, fill: rgb("#19324f"))
#set par(leading: 0.55em)
// === 1 What is evaluated? ===
#let figure-0 = canvas(length: 1.7cm, {
let rows = (
([Classical force field], [positions], [fitted energy formula], rgb("#d6e9f8")),
([ML potential], [local environments], [trained neural model], rgb("#d3ede5")),
(
[Density functional theory],
[nuclei + electrons],
[self-consistent electrons],
rgb("#fbe4d4"),
),
)
for (idx, (title, input, method, color)) in rows.enumerate() {
let y = -idx * 1.9
for (col, label) in (input, method, [energy + forces]).enumerate() {
// left-align the input boxes so each row's title lines up with the others
draw.content(
if col == 0 { (-1.3, y) } else { (col * 5.2, y) },
label,
anchor: if col == 0 { "west" } else { "center" },
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: rgb("#6b7685") + 1pt,
)
}
}
})
// === 2 What must be validated? ===
#let figure-1 = [
#set text(size: paragraph-size)
#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.],
)]
]
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.]