TSUNAMI NOTEBOOK-FAITHFUL WEB IMPLEMENTATION Build 2026-09-21-r10 DELIVERY STATUS This is the corrected source package, not a claim that the live website has been published or that the production tsunami case has been physically validated. The original archive contained JavaScript, notebooks and one parity fixture, but no site HTML, stylesheet or publishing credentials. This package therefore supplies matching replacement HTML and CSS as well as the corrected modules. Deploy the complete package together; the new controller is not a drop-in replacement for unknown old HTML. The six uploaded notebooks are unchanged in python/. Their hashes match the current uploads. The reference generator extracts named numerical functions from those notebooks instead of replacing their equations with a different tsunami method. The oracle uses NumPy in place of CuPy to run regression tests here; this is not a recorded NVIDIA/CUDA execution. 251 numerical/reference checks, 37 data interoperability checks and 45 host layout/scheduling checks passed in the preparation environment. The r6 browser screenshot reported PASS for all 247 device checks. Build r9 retains the verified solver, the location-based bathymetry workflow and the source-to-gauge screening horizon. It adds a one-click 2011 Tohoku to DART 21418 physical gauge check. The device gate still repeats the reference suite before enabling a simulation, and each simulation repeats intermediate-array parity on its requested grid and parameters. Build r10 adds a numerical colour bar directly below every field image. Signed source and surface-elevation fields use the same symmetric blue–white–red scale for the image and bar, labelled at the negative limit, zero and positive limit in metres. The bathymetry bar follows its displayed water-to-land scale and reports its minimum, midpoint and maximum. BUILT-IN TOHOKU–DART 21418 VALIDATION Select “Load this validation case.” The page loads the USGS event position 38.297 N, 142.373 E, DART 21418 at 38.7167 N, 148.7000 E, a matching ETOPO1 subset, the simplified Notebook 1 source controls, zero linear drag, a 180-minute duration and a 0.10 m sustained threshold. Prepare the source, pass the device test, run propagation, then select “Compare built-in DART 21418 record” in Step 4. The measured comparison begins 20 minutes after the earthquake origin so the earlier coseismic and high-frequency motion is not labelled as tsunami arrival. The supplied residual series first sustains 0.10 m at 1716 seconds, or 28.6 minutes. The code-level case passes only when the model gauge peak is at least 0.01 m and the model sustained 0.10 m arrival lies within 15 minutes of 28.6 minutes. Waveform RMSE is reported independently. A pass does not establish complete physical validation because the notebook’s rectangular source is not the USGS finite-fault displacement field. Official references: USGS event: https://earthquake.usgs.gov/earthquakes/eventpage/official20110311054624120_30/ex USGS finite fault: https://earthquake.usgs.gov/earthquakes/eventpage/official20110311054624120_30/finite-fault NOAA DART station 21418: https://www.ndbc.noaa.gov/station_page.php?station=21418 The actual-device reports from builds r2 and r3 each passed 239 of 240 stage checks. Their only failure was overlap_nonlinear rhs3 eta, with maximum absolute difference 2.9802322387695312e-8 and relative L2 error 5.9592755242583454e-8. The r3 report localized the tolerance violation to flat index 173: actual 0.00011604465544223785, reference 0.00011603906750679016, error/tolerance 1.0194782104991857. This proved that the r3 depth-flux storage pass did not remove the remaining discrepancy. The r4 and r5 device reports were numerically identical to r3 at every recorded checkpoint. Build r6 corrected the test topology by supplying the exact Python stage checkpoint to each isolated RHS test while retaining complete propagated-stage, sponge, boundary, final-field and gauge checks. The r6 browser result passed all 247 checks. Builds r7 and r8 preserve those equations and tolerances. The source location, destination location, domain buffer and requested grid size select a live ETOPO1 bedrock subset from PacIOOS ERDDAP; r8 then sets a conservative duration guidance value without changing the propagation equations. RUN LOCALLY Extract the archive to a directory of your choice. In that extracted directory, run: python3 start_local.py Open http://localhost:8000/ in a WebGPU-capable desktop browser. In WSL, the browser can be the Windows browser. Keep the server terminal open. Use --port 8001 when port 8000 is occupied. No npm install or frontend build is needed. Internet access is required when Step 1 requests the location-matched ETOPO1 subset. Node is required only for the optional automated JavaScript tests. Do not open index.html by double-clicking it as a file URL: module workers, reference fetches and WebGPU require the appropriate origin/context. The server binds only to 127.0.0.1 and does not expose the project on the LAN. LOCATION-BASED ONLINE BATHYMETRY Step 1 follows the original site workflow. It forms a domain containing the entered earthquake and destination locations, expands that domain by the requested buffer, selects a stride from the requested longest grid dimension, and downloads signed elevation from the PacIOOS ERDDAP etopo1_bedrock dataset. The exact request URL, stride, domain and dataset identity are retained in the run provenance. The online grid is location-matched but is not claimed to equal a separately saved Python bathymetry array. Bathymetry remains signed elevation in metres: water negative and land positive. An optional saved eta0 classic NetCDF file can still be interpolated to the downloaded grid exactly as in Notebook 3. For NetCDF4/HDF5, or for the most explicit reproducible transfer, install the Python exporter dependencies in a suitable Python environment: python3 -m pip install -r requirements.txt Create a self-contained JSON case using the exact paths to your real files: python3 python/export_case.py --bathymetry "/path/to/your/bathymetry.nc" --source "/path/to/your/initial_displacement.nc" --event-id "your-event-identifier" --output tsunami-case.json The two quoted input paths above are placeholders, not filenames that the application expects. No dataset is chosen by a hard-coded filename. Use --z-variable NAME when the bathymetry field is ambiguous. The exporter reproduces Notebook 3's linear source interpolation onto the bathymetry coordinates, zero outside the source domain, float32 conversion, and clipping to [-50,50] metres. Bathymetry is not resampled. JSON arrays use base64 little-endian float32 with recorded hashes and provenance. Longitude/latitude remain numeric coordinate arrays. When no saved eta0 exists, omit --source and explicitly choose a source in the browser. Alternatively use --source-mode notebook1, notebook2 or notebook3 with the exporter. These modes are different; they are not interchangeable names for one implementation. BROWSER WORKFLOW Use Test this WebGPU device. A failure remains a failure, and the solver stays locked. Save device test report to retain the actual browser compilation/parity diagnostics. A prior report is never loaded as a substitute for running the tests. The standalone gpu-tests.html page runs the same checks. Enter the source and destination coordinates in Step 1 and select Search and load online bathymetry. Geographic changes invalidate the loaded grid and previous results until the new subset is loaded. An optional saved eta0 file takes precedence when Imported eta0 is selected. In Step 2, select Imported eta0 to reproduce a saved source file. Otherwise select the appropriate notebook implementation and prepare it. Source generation runs in a module worker using the checked JavaScript port, followed by float32 upload to the GPU; source generation itself is not claimed to run on WebGPU. Parameters absent from a selected notebook formula are disabled rather than displayed as working controls. The supplied defaults describe Sumatra, not an automatically relocated earthquake anywhere on Earth. In Step 3, use the notebook's parameters or change them explicitly. Pick an offshore gauge inside the domain, using the same longitude convention as the file. Out-of-domain coordinates and a nearest cell on land are rejected; neither is silently relocated. The initial default is the domain centre, not a NOAA station lookup. Every run builds and compares its exact intermediate arrays before propagating. Changes to the grid, source, gauge, event or solver settings invalidate previous results. The default retention policy saves the gauge history and final fields, avoiding a large snapshot memory allocation. Retaining full elevation snapshots is optional and has an explicit 512 MB budget. The code never reduces the native grid to satisfy that budget. Actual-grid preflight retains many intermediate arrays and can require substantial memory on large grids. The app checks GPU buffer/dispatch limits and reports an error rather than silently using a smaller problem. In Step 4, the original first-threshold-sample arrival and an additional sustained-threshold diagnostic are separate. Sustained means consecutive saved samples, not every integration timestep. No arrival returns null, not zero or the simulation's final time. A signal already present at the gauge in eta0 is identified as initial displacement, not established propagated arrival. The first saved solver sample is after the first completed timestep, following Notebook 3. Observed data must be supplied explicitly as a CSV with header time_s,eta_m. Times are seconds from the same event origin; elevation is detided residual elevation in metres. Convert raw NOAA water-column records externally with a documented method. No arbitrary mean subtraction, hidden time shift, hard-coded 2011 station file or fabricated validation score is used here. The event identifiers must match and station coordinates must map to the modelled wet cell. At least two observed samples must overlap the model record before RMSE is reported. A low RMSE alone is not an automatic declaration of physical validation. The gauge CSV contains completed-step times and elevations. Tecplot export uses I=nx, J=ny with longitude varying fastest, validates every field dimension before writing, and includes signed elevation, H0, eta, u and v. The run report records settings, selected source, device audit, actual-grid checks and arrival/observation diagnostics. It is not a replacement for saving full snapshots when those fields are required later. DEPLOY INTO THE EXISTING SITE Create a new versioned site directory, for example tsunami-20260921, and upload index.html, style.css, gpu-tests.html, webgpu/, parity/, tests/gpu-browser.js, README.txt and reports/AUDIT.txt with the directory structure unchanged. Hosting the complete package is also acceptable for a private research site. The unchanged python/ notebooks are included for reproducibility; publish them only according to your intended sharing policy. Point the relevant site page/link at that new index.html, or integrate the full matching application markup and modules. Do not run the previous tsunami-calculator.js alongside this controller. A versioned directory prevents cached old modules from being mixed with the new ones. Serve .js as JavaScript and .json as JSON; the server must return a real missing-file error instead of substituting an HTML index page for a missing module or parity JSON. Use HTTPS for a remotely hosted application. Its content-security policy must allow same-origin module scripts, module workers, same-origin reference fetches and the PacIOOS ERDDAP request. No external chart library or CDN is required. After deploying, run the device verification on the browser and GPU used for research. TESTS AND REPRODUCIBILITY Run the bundled reference, data and host checks with: npm test Equivalent commands are node tests/test_cpu.mjs, node tests/test_data.mjs, and node tests/test_host.mjs. Existing fixtures are bundled, so these commands do not require Python. Regenerate reference fixtures from the unchanged notebooks with: python3 python/notebook_oracle.py Regenerate the synthetic NetCDF interoperability fixtures with: python3 tests/make_data_fixtures.py The files under tests/data are synthetic interoperability inputs, not historical tsunami datasets. They are not automatically loaded by the application. The optional offline DOM test is python3 tests/test_ui.py. It requires Playwright and a Chromium executable; its test environment uses /usr/bin/chromium. It combines the local modules into an inline bundle solely to test interface state transitions where browser navigation is restricted. It does not test HTTP module loading, worker execution or WebGPU shader execution. Normal application modules remain separate and unchanged by that test. A PASS compares the port with the supplied numerical reference. It does not correct the reference notebooks' modelling limitations or certify emergency use. In particular, the supplied solver is collocated despite its Arakawa filename, and H_MIN is applied over land. The code does not claim wetting/drying, coastal inundation, a full analytical Okada source or a validated tsunami forecast.