# LPSE 2D (Envelope-2D) Solver Example decks live in `configs/envelope-2d/`. To run one: ```bash uv run run.py --cfg configs/envelope-2d/tpd ``` ## Equations and Quantities These equations model the evolution and interaction of the complex envelopes of light waves and plasma waves. This is faster than modeling the plasma waves using a fluid or kinetic solver along with modeling the light waves. ### Note on Pump Depletion One can solve these equations with or without "pump depletion". "Pump depletion" is the effect of the plasma waves on the light waves. We do not currently have this implemented, so we have light waves that behave as external drivers for the plasma waves and we only model the plasma wave response. This approach is adequate for modeling laser plasma instabilities below the absolute instability threshold. ### Electron Plasma Waves $$ \nabla \cdot \left[ i \left(\frac{\partial}{\partial t} + \nu_e^{\circ} \right) + \frac{3 v_{te}^2}{2 \omega_{p0}} \nabla^2 + \frac{\omega_{p0}}{2}\left(1-\frac{n_b(x)}{n_0}\right) \right] \textbf{E}_h = S_{TPD} + S_h $$ ### Two Plasmon Decay $$ S_{\text{TPD}} \equiv \frac{e}{8 \omega_{p0} m_e} \frac{n_b(x)}{n_0} \nabla \cdot [\nabla (\textbf{E}_0 \cdot \textbf{E}_h^*) - \textbf{E}_0 \nabla\cdot \textbf{E}_h^*] e^{-i (\omega_0 - 2 \omega_{p0})t} $$ ### Laser Driver We only have a plane wave implementation for now: $$ E_0(t, x, y) = \sum_j^{N_c} A_j ~ \exp(-i k_0 x - i \omega_0 \Delta\omega_j ~ t + \phi_j) $$ ## Boundary Conditions Set per axis under `terms.epw.boundary`: | Value | Behaviour | |---|---| | `absorbing` | A damping layer of width `grid.boundary_width` is applied at both ends of that axis. The mask is $\exp(-\alpha \, dt \, (1 - \text{env}_x \text{env}_y))$ with $\alpha =$ `grid.boundary_abs_coeff` and a tanh ramp over `boundary_width / 5`, so the envelope is attenuated smoothly rather than clipped. | | anything else | **Periodic** — the underlying representation is spectral, so this is the default behaviour when no absorbing layer is requested. | `x` and `y` are configured independently, which is the usual arrangement for TPD: absorbing along the density gradient, periodic transverse to it. The $k=0$ mode is masked out of the spectral operators. ## Forcing and Drivers Because pump depletion is not implemented, **the laser is pure forcing** — it drives the plasma waves and is never itself depleted. That is the central approximation of this solver and the reason it is only valid below the absolute instability threshold. | Term | Role | |---|---| | $E_0$ (laser driver) | A sum of $N_c$ plane-wave components, each with amplitude $A_j$, frequency offset $\Delta\omega_j$, and phase $\phi_j$. Bandwidth models (SSD, CPP speckle) are built by populating these components — see the example decks `tpd-static-cpp-speckle.yaml` and `tpd-dynamic-ssd-speckle.yaml`. | | $S_\text{TPD}$ | The two-plasmon-decay source coupling $E_0$ to the plasma-wave envelope. | | $S_h$ | A noise/seed source for the plasma waves. | | $\nu_e^\circ$ | Landau damping of the plasma-wave envelope. | ## What Gets Saved **`binary/`**: | File | Contents | |---|---| | `fields.xr` | The real-space envelope fields over time | | `k-fields.xr` | The same in wavenumber space — this is where TPD growth is measured | | `series.xr` | Scalar time series | **`plots/`**, per field `k`: | File | Contents | |---|---| | `_x.png`, `_x_r.png` | Spatial profiles, magnitude and real part | | `.png`, `log-.png`, `real-.png` | Slices, linear / log / real part | | `spacetime-.png`, `spacetime-log-.png`, `spacetime-real-.png` | Space-time plots | The log-scaled space-time plots are the ones to read for instability growth rates. ## Configuration Reference See the [Configuration Reference](config.md) for complete YAML schema documentation.