# Schwarzschild pseudospectrum: three finite discretizations

This computation package retains a numerical failure diagnostic,
not a certified continuum pseudospectrum. It compares strong Chebyshev–Lobatto
collocation, weak shifted-Legendre Galerkin projection and weak C2 quintic
Hermite finite elements for the same axial gravitational ell=2 Schwarzschild
differential expression. It contains original programs and data, not copied
third-party code or plots. No figure is included or required to run it.

## Start with the retained results

Extract `pseudospectrum-discretizations.zip` into a new directory, preserving
all subdirectories. Run commands from that directory. Python 3.9.6 and the
four exact dependency versions in `requirements.txt` produced the retained
results. A local virtual environment is recommended; this package does not
install anything or access the network automatically.

```sh
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
export OPENBLAS_NUM_THREADS=1
export OMP_NUM_THREADS=1
.venv/bin/python -B scripts/black-hole-perturbations/pseudospectrum-portable-check.py --self-test
```

The last command authenticates all 21 payload files, validates the 15 explicit
metadata-path substitutions, and runs the unchanged saved-data audit with
six semantic negative controls. Six additional in-memory package controls
check missing/changed files, original-source authentication, path coverage,
path redirection and false continuum promotion. No input file is mutated and
no matrix assembly, singular-value solve or evolution is performed. A fast
stdlib-only integrity check is available with `--verify-only`; it does not
replace the saved-data audit. `--output` may name a fresh report file.

The complete sweep is in
`plans/evidence/black-hole-perturbations-pseudospectrum-discretization-run1/`:

- `summary.json`: parameters, all finite spectra, both Gram diagnostics,
  pulse normalizations, probe values, source hashes and scope limitations.
- `resolvent.csv`: 29,700 rows, the exact product of 18 configurations,
  two norms and a 25-by-33 complex-plane grid.
- `transient.csv`: 360 rows for the same configurations and norms at ten
  dimensionless times, comparing the optimal norm with one fixed pulse.

The six adjacent `plans/evidence/black-hole-perturbations-pseudospectrum-*.json`
check reports retain polynomial, Hermite, high-precision and saved-data tests,
including both weak producers' own checks. Structural passes do not erase
failed projection-defect or residual-quadrature samples.

## Interpret the finite experiment

The coordinate is sigma=2GM/r in [0,1], with null infinity at 0 and the horizon
at 1. The minimal-gauge time has physical scale T0=4GM, and the generator-plane
coordinate is z=-i omega. Every endpoint degree of freedom is retained: no
reflecting rows are imposed. The state is (phi,psi), psi=partial_tau phi.

The energy quadratic form is one half the integral of
`p |phi'|^2 + q |phi|^2 + w |psi|^2`, with
`p=2 sigma^2(1-sigma)`, `q=12-6 sigma`, `w=2(1+sigma)` and
`gamma=1-2 sigma^2`. The second squared norm is E(u)+E(partial_sigma u),
with derivative coefficient one. The matrix A is held fixed when changing
the norm. The two global methods use N=12,20,32,48,64,80 and dimension
2(N+1); Hermite uses m=4,6,10,16,24,32 elements and dimension 6(m+1).
The first two trial spaces coincide but their residual projections differ;
the local C2 space is different. C2 continuity is sufficient for this particular
unmodified H1 action test: it avoids an omitted interface delta in the residual
of the original acceleration. It is not a universal requirement on discretizations.

The common initial state phi=0, psi=sigma(1-sigma) is exactly representable
in every space. Its squared E and H1 norms are 1/20 and 11/20. The CSV pulse
ratios and optimal norms are **unsquared state-norm ratios**, not energy
ratios. At tau=8 the largest collocation energy-operator norm is approximately
2.21136, while both weak energy-operator norms are one to numerical accuracy.
Nevertheless, all three fixed-pulse energy-norm ratios are approximately
0.070000454735. Agreement of these ratios does not establish agreement of
full spatial profiles or validate worst-case amplification.

The independently rebuilt N=12 witness at 60 and 90 decimal digits has
positive strong-collocation energy derivative, while its original PDE flux
and direct weak derivative are negative. That finite defect is not physical
energy growth or merely binary64 roundoff. This witness does not certify
N=80 arithmetic or perform high-precision maximization.

Only 9 of 825 E points and 80 of 825 H1 points pass the saved **finite-value**
screen comparing weak Legendre and weak Hermite only: both last adjacent
refinement changes below 1%, and final cross-method difference below 2%.
Independent off-grid defect (at most 5% of the smallest
singular value), residual quadrature, arithmetic and domain requirements
remain separate. Most inspected damped-half-plane points fail the defect
test. These counts are not accepted continuum points. Ten sampled times do
not find a global maximum over all times. Smooth endpoint behavior alone
does not identify isolated continued-retarded QNMs. No continuum convergence,
generator-domain theorem, physical instability or detector inference follows.

## Recompute bounded independent checks

Choose new output names; the checkers refuse to overwrite reports. These are
explicit scientific computations, not required deployment steps. The following
small spatial cases and N=12 precision witness are substantially cheaper than
the full contour sweep; timings depend on hardware and BLAS.

```sh
.venv/bin/python -B scripts/black-hole-perturbations/pseudospectrum-discretization-check.py --degrees 12 --output polynomial-small.json
.venv/bin/python -B scripts/black-hole-perturbations/pseudospectrum-hermite-check.py --elements 6 --output hermite-small.json
.venv/bin/python -B scripts/black-hole-perturbations/pseudospectrum-precision-check.py --degree 12 --precisions 60 90 --output precision-small.json
```

For the retained highest-resolution independent checks, use `--degrees 48 64
80` and `--elements 16 24 32`. Each spatial checker also supports
`--self-test` without an output file. Numerical agreement across computers is
not promised byte-for-byte: runtimes, BLAS roundoff and the binary64 initial
witness may differ. Preserve the reported residuals, thresholds and failures;
matching displayed digits or passing file integrity is not scientific certification.

## Optional complete sweep

This is the expensive operation: it assembles all three methods, computes
29,700 smallest singular values and 360 finite propagator samples. Do not
run it just to check the download or relocate metadata. The output directory
must not already exist; its parent must exist.

```sh
.venv/bin/python -B scripts/black-hole-perturbations/pseudospectrum-discretization-experiment.py --output-dir rerun-full
.venv/bin/python -B scripts/black-hole-perturbations/pseudospectrum-run-audit.py --input-dir rerun-full --output rerun-check.json
```

The frozen experiment's opening docstring still says “two-method” and one
helper docstring mentions “local cubic spaces.” Its actual CLI, assembly,
saved data and this documentation use all three methods and C2 quintics.
Those historical comment strings were not edited in the authenticated source.

## Paths, hashes and reproducibility

The archive has 22 members: eight unchanged numerical scripts, this README,
requirements, the portable wrapper, the package builder, nine result files
and `package-manifest.json`. All paths are relative; archive entries are
sorted, stored without compression, have fixed 1980 timestamps and regular
0644 file modes. Thus archive generation has no compressor-version ambiguity.

The builder changes exactly 15 JSON path values at listed JSON Pointers in
six files. It checks that reversing those unique string-token substitutions
recovers the authenticated original bytes exactly. All other bytes—including
every numerical lexeme, scope statement and original report hash—are unchanged.
The manifest records original and exported whole-file SHA-256, byte counts,
each substituted pointer, a digest of the undisclosed original path, and a
digest of every byte outside the replaced path tokens. The precision report,
CSVs and eight numerical sources remain byte-identical to their originals.

Hash fields *inside retained reports* still identify the original inputs before
path sanitization. For delivered files use the manifest's `exported_sha256`.
The portable checker validates both this distinction and the relative-path
contract, then adapts only the three summary source paths in memory for the
unchanged saved-data audit. It does not rewrite any retained report. Original
whole-file hashes are historical provenance: redacted files alone cannot
reconstruct those hashes. The builder's original-to-export proof can be
repeated by a maintainer with the authenticated original inputs. Download
integrity requires comparing the ZIP hash with the independently supplied
page/evidence value; an unsigned manifest is not an external trust anchor.

The builder is included for inspection. Its default mode is maintainer-only:
it expects the original repository inputs and the two named public README and
requirements files, not sanitized exports. Readers need only the portable
checker and numerical scripts. No solver, dependency installer, network call,
commit or deployment is hidden in either packaging or verification.
