You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add chromatic dispersion with sign-verified validation
Fiber gains a `dispersion` parameter (D in ps/nm/km). Propagation solves the
linear NLSE exactly in the frequency domain: A(z,w) = A(0,w)*exp(i*b2*w^2*z/2),
an all-pass phase rotation, so it conserves energy and inverts exactly.
beta2 is computed per band from that band's own wavelength. Two channels
hundreds of nanometres apart really do disperse differently, and the multi-band
signal model gets that right with no special handling — a single-carrier model
could not express it at all.
New: kernels.py (frequency grid, D->beta2, dispersion propagator) as the narrow
array-in/array-out boundary a CuPy or native back-end can later replace;
analysis.py (RMS time width, peak/instantaneous power); GaussianPulse source,
which exists because a Gaussian through pure GVD has a closed-form solution and
is therefore the reference input for validating the fiber.
Validation (18 new tests, 85 total):
- Unchirped broadening T1/T0 = sqrt(1 + (z/L_D)^2) across z/L_D = 0.5 to 3
- L_D is where the pulse broadens by sqrt(2); broadening scales as T0^2
- Chirped broadening, including compression to ~45% for C=+2 in anomalous fiber
- Energy conservation (Parseval), exact reversibility with +D then -D
- beta2 = -21.7 ps^2/km for D = 17 ps/nm/km at 1550 nm, with the sign asserted
- Each band dispersed at its own wavelength
The chirped tests are not redundant with the unchirped ones: the unchirped
broadening factor is even in beta2 and passes under either sign. Verified by
flipping the sign in the propagator — 13 unchirped tests still passed while all
5 chirped ones failed. That blind spot is documented in kernels.py.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
0 commit comments