AlloyViewDocumentation
GitHub

Validation record

Validation date: 2026-10-06 (America/New_York)

Voronoi edges, selection and load-time preparation

HEA CPU modeFirst kernel begins, before → preparedFirst complete analysis, before → prepared
Private coordinates32.7 → 21.0 ms817.5 → 661.3 ms
Shared coordinates29.0 → 5.7 ms738.5 → 740.4 ms

Floating views and Voronoi display

Voronoi element subsets and full-cell display

Parallel Voronoi and selected-cell geometry

ExampleAtomsOld 4 WorkersNew cold / reused 4 Workers
NiGB_minimized.cfg129,90460.84 s17.83 / 14.67 s
Fe_disloc_loop.dump60,2291.12 s0.934 / 0.630 s

Hidden selections and automatic color ranges

Bond statistics, Voronoi analysis and CSV exports

Advanced display, property import and tool categories

The earlier validation sections below retain their original test totals.

Viewport atom details and measurement vectors

Reproduce with npm test, npm run build, npm run test:browser:atom-details and npm run test:browser.

Parallel DXA preparation and coordination cutoff presets

Reproduce with npm test, npm run build, npm run test:browser, npm run test:browser:coordination-presets, npm run test:browser:dxa-visual -- --software, npm run test:browser:dxa-gpu -- --software --integration-only and npm run test:browser:dxa-parallel -- --software.

Continuous DXA tubes and independent crystal visibility

Run npm run test:browser:dxa-visual -- --software; add --capture-baseline before committing to compare with the renderer at the current Git HEAD.

Fe dump, geometry references and automatic examples

The new examples/Fe_disloc_loop.dump is a supported LAMMPS text dump with 60,229 atoms, unsorted stable IDs, triclinic periodic geometry, image flags, and 14 scalar properties. It has no element column: input and legend retain Type 1 rather than inferring Fe from a filename. Numeric type identifiers also retain safe integers beyond the signed 32-bit range.

Reproduce with npm test, npm run build, npm run test:browser, npm run test:browser:fe-input, npm run test:browser:fe-loop and npm run test:browser:fe-lattice-gpu. GPU results here use a software adapter and do not establish hardware speed.

GPU local DXA correspondence

The next DXA stage runs nearest-shell search, local CNA and ordered ideal-bond graph matching on the existing WebGPU device. Neighbor vectors remain resident between kernels. Structure types and ordered neighbor indices return to the retained native session; cluster construction, periodic Delaunay, mapping, interface construction and line tracing still run on CPU/Wasm.

Reproduce with npm test, npm run test:browser:dxa-local-gpu, npm run test:browser:dxa-f64 and npm run test:browser:dxa-gpu. These are software-adapter correctness checks, not hardware speed measurements. Cold compilation and execution on the software adapter can exceed the production smoke test's initial 60-second extraction timeout. The test now allows 180 seconds for extraction and passed on a separate run; this changes the validation deadline, not product behavior.

Hybrid GPU DXA

The preceding migration ran tetrahedron alpha filtering and elastic-compatibility checks on the existing WebGPU device, then continues interface construction and tracing in its retained CPU/Wasm session. The final backend is reported as hybrid; CPU local correspondence, crystal mapping, robust periodic Delaunay and line tracing were retained in that stage; local correspondence has since migrated as described above.

Parallel Delaunay insertion can change which representative atom anchors a circuit center. The upstream uses perturbed edge vectors with unperturbed anchors, so periodic endpoint residuals are bounded by four times its epsilon = 1e-10 * |a+b+c|, plus arithmetic rounding. Winding tests now check all three components against the integer cell-vector winding with that derived bound; Burgers vectors, connectivity and relative arc-length checks remain. For the screw this bound is about 4.55e-8 Å, rather than an arbitrary 1e-8 Å.

Reproduce with npm test, npm run test:browser:dxa-gpu, npm run test:browser:dxa and npm run test:browser:dxa-parallel after npm run build. GPU checks use a software adapter by default; -- --hardware requires a real hardware adapter. No physical-GPU speedup is established by these correctness checks.

Dynamic CPU prewarming and one DXA heap

The application now uses one active CPU budget of max(1, navigator.hardwareConcurrency - 2) across ordinary analyses and DXA. Actual parallelism also depends on atom count, analysis type and memory limits. Idle prewarmed Workers hold no CPU permit. Ordinary heavy-analysis prewarming includes the PTM module's initial 16 MiB heap in its memory estimate.

File indexing overlaps module initialization, then the parsed atom count grows the existing pools. Physical replication validates its projected atom count and starts additional prewarming during coordinate generation. Display copies do not change the analysis pool target. Frame visits check actual pool health so a previously terminated ordinary analysis Worker can be prepared again.

DXA creates one shared Wasm module even when only one computation thread is needed on an isolated host. Higher thread counts asynchronously load additional pthread Workers into that same module and shared memory; lower counts retain the unused slots. Normal source changes and shared-memory cancellation keep the heap. The host sets a shared cancellation word without a receive-side reset that could erase a racing abort. The client retains its CPU lease until native work acknowledges cancellation. PDEL insertion currently acknowledges only after its current stage completes. Static hosts cannot interrupt synchronous Wasm through a shared word, so running serial cancellation still terminates and replaces its Worker. Asynchronous module prewarming is retained on both hosts.

Reproduce with npm test, npm run build, npm run test:browser:cpu-warmup -- --software, npm run test:browser:dxa-parallel -- --software, npm run test:browser:dxa -- --software and npm run test:browser.

Shared-memory DXA

The CPU backend now has separate serial and pthread Wasm artifacts built with Emscripten 3.1.69. Local structure identification, periodic PDEL tessellation, ghost-cell classification and elastic/alpha tetrahedron tests share one heap. A bounded adapter also caps Geogram's eight-task Hilbert groups to the requested computation threads; it does not modify Geogram's robust predicates. Global numbering, ideal-edge mapping and dislocation tracing retain their coordinator.

npm run benchmark:dxa -- --workers 1 and the corresponding --workers 4 command analyze real Z×2 replication of NiGB: 259,808 atoms, 249,620 FCC and 10,188 Other, zero dislocation segments in both runs. Node v24.19.0 in this cloud container reports five available processors with a four-CPU cgroup quota. One cold and one warm extraction were measured per backend; parsing and real replication are outside these timings. Cold includes Wasm/pool initialization; warm reuses the module. These CPU observations are not a general scaling guarantee or a physical GPU benchmark.

MeasurementSerialFour computation threads
Cold whole extraction17.64 s8.05 s
Warm whole extraction15.06 s7.23 s
Warm local identification1.52 s0.40 s
Warm periodic tessellation6.43 s2.47 s
Warm interface construction4.84 s2.05 s
Process RSS after warm run701.9 MiB759.7 MiB

The observed warm whole-frame speedup is about 2.08×. RSS includes Node, input/replicated JS arrays and retained Wasm capacity; it is not a sampled peak or an isolated kernel allocation measurement. Shared-memory execution requires an isolated host; GitHub Pages without these headers uses the serial kernel. These CPU measurements predate the hybrid classifier described above. The resident GPU design records the remaining periodic geometry and tracing work for a fully GPU extraction. WebGL2 drawing requires final network transfer; changing the renderer is not a prerequisite for that work.

Reproduce with npm test, npm run test:browser:dxa-parallel -- --software, npm run test:browser:dxa -- --software and the benchmark commands above. Rebuild both artifacts with npm run build:dxa and npm run build:dxa:threaded after numerical source changes.

Initial CPU DXA

The initial DXA module ports the actual OVITO v3.9.4 numerical core with a dedicated, non-shared CPU/Wasm Worker. The checked-in factory and binary build with Emscripten 3.1.69 / LLVM 19; the build verifies 58 vendored/adapted source files. The per-file MIT option, Geogram BSD notice and source pin are retained. FCC/BCC/cubic-diamond preferred crystal orientations match the upstream defaults. GPU-enabled requests explicitly use CPU for this version.

Reproduce with npm test, npm run build, npm run test:browser and npm run test:browser:dxa -- --software. Rebuild the numerical artifact only when needed with npm run build:dxa. The generated screw fixture is in tests/helpers/dislocations.js; the optional native OVITO oracle remains research tooling outside the application's dependencies.

This is initial validation, not broad parity across realistic networks. Edge dislocations, partials, loops, junctions, complicated interfaces and newer HCP low-c/a behavior still need independent fixtures. The source review and first native NiGB record remain in DXA review.

GPU ideal lattice reference and the enabled default

The latest checks use Node.js v24.19.0 and Chromium 151 with Google SwiftShader. These are real WebGPU shader executions on a software adapter; physical GPU performance for the new ideal-strain stages remains unmeasured.

GPU checks pass as separate kernel, native-application and production-build scopes. Their commands are:

npm run test:gpu -- --kernels-only
npm run test:gpu -- --application-only
npm run test:gpu -- --built-only

Both Ni benchmarks use every atom in examples/NiGB_minimized.cfg (129,904). Fresh calculation matches all five PTM arrays exactly on both calls. The nine strain fields have matching 4,627-atom NaN masks and maximum absolute difference 7.45e-9, with no CPU neighbor corrections. The edited-reference run changes Ni's a from 3.52 to 3.4 Å, retains the same NaN masks/error bound and uses no CPU corrections. Both measured edited calls reuse private and GPU fit inputs; the fit upload count remains one.

CalculationCPU first / subsequent (ms)Software WebGPU first / subsequent (ms)
Fresh ideal strain, complete hybrid pipeline2039.0 / 1640.954582.2 / 52781.0
Edited reference with resident PTM fit279.0 / 253.262.0 / 52.1

Fresh GPU timing includes neighbors, CPU fitting, reference conversion, tensor evaluation, transfers and assembly, using four CPU fitting Workers. The edited row uses three CPU tensor Workers and starts with its fit already resident: CPU PTM preparation takes 1704.9 ms separately, and initial GPU upload/reference/ tensor preparation takes 252.4 ms separately. Its first measured edit therefore does not include initial device or fitting cost. Integer-emulated IEEE64 neighbor preparation makes the fresh software pipeline slower here; resident GPU reference edits are faster in this software run. These timings do not establish speedups on a physical GPU.

Reproduce these scopes with npm run benchmark:gpu -- --software --kernel=strainFresh and npm run benchmark:gpu -- --software --kernel=strainEdited. The existing --kernel=strain mode measures reference conversion and tensor evaluation from a cached CPU PTM fit.

Optional WebGPU analysis

The following sections preserve earlier validation snapshots. Their feature scope and default-off checks describe the application at the time of each run.

Validated with Node.js v24.19.0 and Chromium 151 using the Google SwiftShader software WebGPU adapter. These checks execute actual WGSL compute shaders; they do not establish performance on a physical GPU.

Representative full-call wall times from this software-adapter run:

Analysis and parametersCPU first / subsequent (ms)WebGPU first / subsequent (ms)
Coordination, cutoff 3.1 Å193.8 / 108.0870.6 / 520.7
RDF, cutoff 2.48 Å, 100 bins480.4 / 312.9686.5 / 545.7
Local geometric shear, cutoff 3.1 Å691.9 / 756.51878.3 / 1467.7

Kernels run in the listed order through the same CPU/GPU pools. "First" means the first call of that kernel; earlier calls can already have initialized the device and Workers. Subsequent GPU calls reuse their uploaded input. Wall times include preparation/upload, execution, corrections, readback and assembly. CPU coordination uses three Workers; RDF and geometric shear use four on this machine. RDF corrects 38,552 pairs near bin/cutoff boundaries. Its cutoff stays below half the example's 4.97773 Å periodic Z face height.

Software WebGPU is slower here. Run npm run benchmark:gpu -- --hardware on a machine with a physical adapter and inspect the reported adapter to assess hardware acceleration; neither software timing nor atom count alone predicts a GPU speedup.

Linux NVIDIA hardware validation

Validated on 2026-10-04 with Node.js v26.10.0, Chrome 144.0.7559.109, NVIDIA GeForce GTX 1080 Ti and driver 580.178.04. Chrome reports vendor nvidia, architecture pascal and isFallbackAdapter: false.

The original hardware runner returned no adapter. Explicit Vulkan flags alone still failed with the inherited SSH display 127.0.0.1:857.0; Chrome logged DisplayVkXcb.cpp:62 (initialize): xcb_connect() failed, error 1 and EGL initialization errors. Removing DISPLAY alone selected SwiftShader instead. Enabling headless GPU/Vulkan and removing DISPLAY together selects NVIDIA. The runner now applies this configuration automatically and rejects software adapters in hardware mode, including Chrome initialization logs on failure.

Representative full-call hardware wall times from one run:

Analysis and parametersCPU first / subsequent (ms)GPU first / subsequent (ms)Subsequent CPU / GPU ratio
Coordination, cutoff 3.1 Å272.3 / 222.9669.4 / 46.74.77
RDF, cutoff 2.48 Å, 100 bins492.6 / 382.4251.6 / 97.53.92
Local geometric shear, cutoff 3.1 Å953.4 / 961.1494.7 / 154.36.23

The same run order and full-call timing scope described above apply. CPU coordination uses three Workers; RDF and local shear use six. These ratios describe this file, parameters and one workstation run. Coordination's first GPU call includes initialization and takes longer than CPU.

GPU preparation and trajectory caching

Validated on the same GTX 1080 Ti workstation with hardware and SwiftShader WebGPU. Enabling GPU computing prepares a device and 10 common pipelines, then uploads the displayed frame and fills either a complete trajectory cache or the nearest frame window within an allocation budget.

GPU bonds and ideal lattice strain tensor

Additional real Chromium/SwiftShader checks execute the bond and ideal-strain WGSL kernels. Software-adapter measurements below do not measure physical GPU acceleration; the preceding GTX 1080 Ti results cover the earlier kernels.

Software-adapter calculationCPU first / subsequent (ms)WebGPU first / subsequent (ms)
Bonds, cutoff 3.1 Å838.1 / 521.32772.3 / 2399.3
Ideal strain tensor, cached PTM, Ni reference a=3.52 Å244.9 / 195.8289.1 / 88.0

These kernels were benchmarked separately with npm run benchmark:gpu -- --software --kernel=bonds and npm run benchmark:gpu -- --software --kernel=strain. Each command reports its adapter and full-call timing scope. The strain report separately identifies the CPU PTM preparation engine and elapsed time.

GPU CNA and reference-frame strain

Validated on 2026-10-04 with Node.js v24.19.0 and Chromium 151 using the Google SwiftShader software WebGPU adapter. These checks execute actual GPU shaders; they do not measure performance on a physical GPU.

Full examples/NiGB_minimized.cfg runs use all 129,904 atoms. Fixed CNA uses 3.1 Å; adaptive CNA uses local shell scales. Reference strain uses 3.1 Å and a controlled affine copy with F = [1.02, 0.12, 0.03; 0, 0.98, 0.05; 0, 0, 1.04], rather than a trajectory. All three analyses execute genuine GPU kernels without fallback and agree exactly with CPU, including all 18 reference-strain fields and zero incomplete reference fits. Adaptive CNA returns 4,954 Other, 124,810 FCC and 140 BCC atoms.

AnalysisCPU first / subsequent (ms)Software WebGPU first / subsequent (ms)Sparse CPU correction atoms
Fixed CNA791.8 / 435.01105.8 / 972.2404 (0.3110%)
Adaptive CNA938.2 / 611.82606.4 / 2080.94,822 (3.7120%)
Reference-frame strain1765.7 / 1453.05323.5 / 4823.0124 (0.0955%)

Each row comes from a separate cold/subsequent benchmark using four CPU Workers. Full-call time includes preparation/upload, shader execution, corrections, readback and assembly. Subsequent calls reuse inputs. More than 96% of adaptive CNA atoms need no CPU classification; its correction limit is 16,384 atoms, after which the complete calculation uses CPU. These software GPU timings are slower than CPU and do not establish hardware acceleration.

The shared arithmetic change also passes the cached PTM/ideal-strain tensor regression on this file: maximum absolute error 7.45e-9 and 4,627 matching NaN atoms. PTM preparation takes 2164 ms separately; tensor-only CPU first/ subsequent times are 248.9/215.2 ms, and software GPU times are 224.6/109.9 ms.

GPU central symmetry and displacement

Validated on 2026-10-04 with Node.js v24.19.0 and Chromium 151 using the Google SwiftShader software WebGPU adapter. The final Node suite passes 635 tests with no failures or skips; the full normal browser smoke also passes CPU analysis, cancellation, configuration, mobile and large-structure checks.

The full 129,904-atom Ni grain boundary runs use genuine GPU CSP without fallback or direct CPU pairing corrections. Manual 8-neighbor error is 5.96e-8; manual 12 and Auto errors are 2.98e-8. Auto retains 124,810 FCC, 140 BCC and 4,954 Other labels; all Other sites inherit a supported shell, and no environments remain unresolved. Its first call performs adaptive GPU CNA with 4,822 sparse CNA corrections; the subsequent call reuses recognition without repeating that classification.

AnalysisCPU first / subsequent (ms)Software WebGPU first / subsequent (ms)
Manual CSP, 8 neighbors835.5 / 547.156275.5 / 50421.4
Manual CSP, 12 neighbors821.5 / 536.958466.9 / 56233.2
Auto CSP932.0 / 625.162303.1 / 53690.8
Displacement, excluding ID preparation97.9 / 43.9281.1 / 69.2

Each CSP row comes from a separate first/subsequent benchmark using four CPU Workers and includes preparation/upload, shader execution, readback and assembly. Strict ordering uses integer-emulated IEEE64 arithmetic on this adapter, and software GPU CSP is substantially slower than CPU here. These results verify execution and numerical agreement; they do not establish performance on a physical GPU.

The displacement run uses a synthetic Cartesian translation [0.12, −0.08, 0.05] Å with known same-row correspondence to the Ni reference, rather than trajectory motion. All 129,904 atoms match, all 389,712 Float32 components agree exactly, and Float64 magnitude maximum absolute/relative errors are 1.3878e-16 Å / 9.09e-16. The GPU uses no CPU corrections or fallback. Its CPU calculation uses three Workers; shared ID matching and coordinate preparation take 53.3 ms separately and are excluded from the table's displacement timings. The benchmark also reports workflow totals including that preparation cost.

Atom selection groups and physical replication

Legend coloring quantity selector

AtomEye analysis and viewer alignment

Validated on 2026-10-03 with Node.js v24.19.0 and Chromium software WebGL:

A separate Node run on 97,556 FCC atoms used six actual Workers throughout: bonds took approximately 731 ms (585,336 edges), RDF 654 ms and local geometric shear 1,033 ms. No additional Workers were created between these jobs; source buffers stayed intact. Peak process RSS was about 330 MiB. These are local CPU measurements, not browser/GPU timing guarantees.

Scalar palettes and persistent Auto ranges

Validated with Node.js v24.19.0 and Chromium 151.0.7922.173:

Fixed ranges are represented by existing per-property recipe range entries; absence of an entry means Auto on. The configuration schema remains version 1.

Automatic local central symmetry

Validated with Node.js v24.19.0 and Chromium 151.0.7922.173:

Auto selects local neighbor settings rather than geometrically segmenting a structure. Local inference is a heuristic at defects/interfaces; CSP values from different crystal phases should be interpreted within their own phase.

Multiple tilted slices, processing recipes and PTM startup

Validated with Node.js v24.19.0 and Chromium 151.0.7922.173 using software WebGL:

Recipe files contain file metadata and parameters, not coordinates or computed result arrays. Browsers require the user to select local files again. Slice editing graphics are an interactive overlay; exported PNGs contain the clipped atom view and the independently selected legend/axis options.

Closing sources and page-wide file drops

Validated with Node.js v24.9.0 and Google Chrome 144.0.7559.109 using SwiftShader software WebGL:

Large structures after zooming and switching to Ortho

Validated with Node.js v24.9.0 and Google Chrome 144.0.7559.109 using SwiftShader software WebGL:

Continuous BCC logo and mobile camera gestures

Validated with Node.js v24.9.0 and Google Chrome 144.0.7559.109 using SwiftShader software WebGL:

Display replication and responsive tools

Validated with Node.js v24.19.0 and Chromium 151.0.7922.173:

Silent strain NaNs and analysis cancellation

Validated with Node.js v24.19.0 and Chromium 151.0.7922.173:

PTM, atomic elastic strain and PNG arrows

Validated with Node.js v24.19.0 and Chromium 151.0.7922.173:

These are deterministic scientific fixtures and browser correctness checks; they do not establish recognition accuracy across all temperatures/materials, million-atom performance or a target GPU's rendering speed. Atomic strain here uses an ideal lattice reference, not OVITO/AtomEye's trajectory reference-frame atomic-strain workflow.

CNA and normalized central-symmetry update

Validated in the cloud environment with Node.js v24.19.0 and Chromium 151.0.7922.173, using the existing SwiftShader browser runner.

Representative compute measurements used a periodic 97,556-atom ideal FCC fixture, with all CNA classifications checked against FCC and all normalized central-symmetry results checked against zero. These are single measurements of Node kernels / actual Node Worker execution, not browser rendering timings. Pooled times include Worker startup, coordinate sharing and output merging.

AnalysisSingle kernel3 Workers, shared input
Adaptive CNA1,996 ms860 ms
Normalized central symmetry, 12 neighbors1,974 ms821 ms

The scheduler reserved a core from the runtime's reported four available cores. These results establish working parallel computation for this representative fixture. Million-atom performance and broad thermal recognition accuracy were not validated by that update. PTM validation is recorded above.

Browser and deployment regression update

The current fixes were validated with Node.js v24.9.0 and Google Chrome 144.0.7559.109 using SwiftShader software WebGL. The inherited remote DISPLAY was removed for headless execution. This checks rendering and export correctness; it does not establish hardware GPU performance.

Executed commands:

npm test
npm run build
npm run test:browser

All 16 unit-test files passed. New regressions cover the earlier file Worker message and the current files message, single files and sequences, failed cloning, transparent legends, and a build version that changes even when only a Worker changes.

The browser test serves the production artifact at /AlloyView/ without COOP/COEP headers (crossOriginIsolated === false). It loaded a native local CFG selection, the FCC and BCC examples, and all 40 NEB images, including the last trajectory frames. It also calculated coordination, switched both themes and their logos, checked saved theme preference and custom viewport colors, and decoded actual PNG blobs for type and scalar legends.

For both legends with Include background in PNG unchecked, the exported corner and empty legend padding had alpha 0. With background enabled, the same pixels had alpha 255. Atoms and legend content remained in the exports. The documentation screenshots were captured from these real browser views.

Follow-up UI checks drag the actual panel divider in both directions, verify that the WebGL canvas resizes, reset the width, check persistence on reload, and verify the stacked layout hides the divider below the desktop breakpoint. Cutoff edits are tested without clicking Calculate. Delayed real analyses exercise rapid edits, a single active Worker pool, skipping superseded requests, and switching back to a cached cutoff without allowing an older result to replace it. The browser also types a decimal legend limit one character at a time and clears the field to verify immediate application and preservation of the last valid range.

Homepage checks also load the supplied transparent crystal logo and capture both themes. Browser contrast checks use computed text colors, composited ancestor backgrounds and cumulative opacity, covering homepage copy, sidebar labels, help text, source descriptions, and scalar legends at a minimum 7:1. Controls, including disabled controls on the initial page, are checked at a minimum 4.5:1 after theme transition animations finish.

The earlier environment, benchmark and validation details below remain as a record of the original checks.

Original validation environment

The host GPU works, but the automated command sandbox did not expose an NVIDIA device or a usable browser graphics context. Firefox was launched through geckodriver in headless mode and loaded the application, but WebGL 2 creation failed with FEATURE_FAILURE_WEBGL_EXHAUSTED_DRIVERS; the forwarded display was not available to a non-headless process. Consequently, no GPU upload throughput, rotation FPS, PNG pixel comparison, or browser heap figure is reported here. The application includes live measurements for parse time, synchronous GPU-buffer upload completion (gl.finish()), interaction FPS, analysis time, and performance.memory when the browser exposes it. Those values must be collected on an actual target workstation before making a rendering performance claim.

Executed correctness tests

Command:

npm test

Result: all 14 test files passed (parser, coordination and range partitioning, Worker-count policy, cutoff recommendation, palette ranges, atomic radii, file-sequence discovery, multi-file LAMMPS indexing, trajectory unwrapping, adaptive frame-cache policy, renderer state, and suppression of blocking UI progress for background frame prefetch, plus playback interval/wrapping), with no failures. The cases executed were:

The FCC/BCC coordination expectations are analytic reference results for a cutoff between the first and second shells. A binary comparison against a built upstream AtomEye executable was not executed, because its native dependency stack was not built in this environment and its redistribution license remains unclear. The independent results do exercise the same reduced-coordinate, face-height-bin, PBC image invariants found in its source.

The optional C++ core was compiled as a native object with:

g++ -std=c++17 -O2 -Wall -Wextra -Wpedantic -c wasm/coordination.cpp

This checks the portable C++ source, not an Emscripten/Wasm artifact. The default Worker JavaScript path is the runtime that was executed by the automated tests.

npm run build also completed successfully. The generated static site was served locally and returned HTTP 200 for the document, the new coordination module Worker, and examples/fixed_end_climb/replica.39.cfg. The observed MIME types were text/html, text/javascript, and text/plain, and the server emitted the documented COOP/COEP/CORP headers.

97,556-atom CPU benchmark

Command: npm run benchmark. Dataset: generated 29×29×29 conventional FCC cells (97,556 atoms), 4.05 Å lattice constant, 3.0 Å cutoff, orthogonal PBC, 6.523 MiB LAMMPS text, single numeric scalar property.

StageMeasured result
Generate benchmark text (not a product stage)185.14 ms
Parse LAMMPS frame323.94 ms
Coordination analysis297.24 ms
Candidate pairs tested1,905,076
Resultall 97,556 atoms have coordination 12
Process RSS after run169.97 MiB
Node heap used after run58.65 MiB

These are one-run Node timings from the direct single-range kernel, not a browser Worker-pool speedup measurement or browser performance guarantee. File index time, GPU upload, and frame rate are separate stages and were not conflated with the CPU numbers. The 1,000,000-atom path was not executed; it is explicitly unverified.

Behavioral checks still requiring a browser