Choose the reference for the claim

Goal: distinguish implementation agreement, time accuracy and spatial resolution. Our Python verifier uses full, non-circular complex coefficient convolution and classical RK4. It does not use an FFT or ETD coefficients. It solves

\[\dot c_k=(1-Dk^2)c_k-\sum_{p+q+r=k}c_pc_qc_r,\qquad |k|\leq K.\]

It retains the full quadratic intermediate when forming the cubic, then extracts the final band. This independently checks the native FFT product and its projected evolution. The reference is a numerical solution at the same finite K, not an exact solution of the continuous PDE.

The verifier doubles its RK4 step count and reports the maximum coefficient change. That change must be much smaller than the chosen ETD error budget. For the default input, the default absolute field-error budget is \(2\times10^{-5}\). The separate reconstruction and ownership checks use tight tolerances because they do not include ETD time-discretization error.

Run the checker on your own attempt

From the directory containing the downloaded source, input and verifier:

python3 verify.py input.json /path/to/attempt/results

Replace the path with the attempt printed by openpfc run. The checker:

  1. Requires every global real cell and stored r2c coefficient to have exactly one owner.
  2. Checks that the per-rank coordinates match their reported inbox/outbox bounds.
  3. Reconstructs the physical field from the normalized coefficients and checks Parseval.
  4. Checks the intended retained band, global diagnostics and energy normalization.
  5. Compares the final field with refined direct-convolution RK4.

A numerical error budget is not a roundoff threshold. A run that exceeds the RK4 comparison budget may need a smaller time step, even if its FFT reconstruction is correct. Do not change a tolerance merely to hide an unexpected result; establish which comparison failed and why.

Inspect actual OpenPFC output

These profiles and tables come from the canonical CPU example, compiled against a clean SDK. They are saved solver output, separate from the browser’s mathematical experiments. The provenance record pins the exact source, input, toolchain, SDK capabilities and data checksums.

Recorded experiment / real OpenPFC output

Recorded OpenPFC CPU output: N=32, K=7, Δt=0.01, 1 rank(s). Maximum error against independent refined RK4 at the same K: 1.157e-5. 512 unique real cells; 272 unique r2c coefficients. This is saved output, not an in-browser OpenPFC run. Interactive controls appear when the experiment is ready.

Recorded OpenPFC profile compared with independent refined coefficient-space RK4
Default settings. Download the default data (CSV). The equations and worked example below explain the result.

No native program is launched by these controls. Each choice displays a recorded run at T=1. CSV exports the selected real field slice and its independent reference.

Recorded default case One rank Two ranks
Owned real cells 512 512
Owned r2c coefficients 272 272
Mean at T=1 0.369467077759 0.369467077759
Maximum fixed-K RK4 field difference 1.1570e-05 1.1570e-05
FFT reconstruction discrepancy 3.3511e-16 3.3511e-16

Maximum field difference across rank counts: 0.0000e+00.

Fixed-K coefficient difference after oversampling N=32 to 64: 1.3748e-17.

The three measured ETD2 time orders are 2.0167, 2.0083, 2.0041.

Download the machine-readable run/profile data, time-refinement table, cutoff-refinement table, one-rank diagnostics, two-rank diagnostics, and comparison checks.

Separate three experiments

Study Hold fixed Change What agreement establishes
Time refinement K=7, N=32, domain and T=1 Halve h, double steps ETD2 time order relative to the same Galerkin ODE
Cutoff refinement Domain, T=1, small h Increase K and enough N for 4K<N Evidence about spatial truncation and its interaction with time error
Oversampling K=7, h, domain and T=1 Increase N from 32 to 64 Same retained nonlinear operator, up to roundoff

For time refinement, estimate \(p=\log_2(E(h)/E(h/2))\). ETD2 should approach \(p=2\) for this smooth problem. The recorded table compares every run with the same independently refined \(K=7\) oracle.

For spatial refinement, compare \(K=3,7,15,31\) using compatible sampling grids. The table distinguishes error relative to each run’s own K oracle from differences to the independently refined \(K=31\) RK4 reference at common physical points. A difference from a finer finite reference is useful convergence evidence, not an exact PDE error. If that difference levels off, reduce the time step as well before attributing the floor to space.

Oversampling alone should not change the retained Galerkin answer: \(N=32\) and \(64\) both satisfy \(4K<N\) for \(K=7\). It adds product sampling, not additional retained physical modes. This is a direct check that N and K have not been confused in an operator or normalization.

Keep a simple analytic special case

For a spatially uniform initial value \(u_0\), diffusion vanishes and \(u'=u-u^3\). For \(|u_0|<1\),

\[u(t)=\frac{u_0}{\sqrt{u_0^2+(1-u_0^2)e^{-2t}}}.\]

Set a1 and a3 to zero to recover that case. The native example’s bounded tests use it to check the independent ODE reference, alongside nonlinear nonuniform dynamics and a mode with zero linear symbol. No single special case exercises every Fourier product or MPI layout.

Checkpoint: both rank counts agree, but both miss RK4

The serial and two-rank fields agree closely, but both disagree with the fixed-K reference. Where should you look?

First identify the error size and refine the time step. A second-order reduction suggests expected ETD2 time error. If the error stays unchanged, check the nonlinear projection, transform normalization, wavenumber units and the reference’s cutoff. Agreement across rank counts tests decomposition for this case; both executions can still share the same spatial or time implementation error. Conversely, matching a fixed-K oracle does not establish sufficient K for the PDE.