|
numerics
|
2-D Time-Dependent Schrödinger Equation solver More...
#include "core/types.hpp"#include "core/vector.hpp"#include "pde/adi.hpp"#include <vector>#include <complex>#include <cmath>Go to the source code of this file.
Classes | |
| struct | tdse::EigenMode |
| struct | tdse::Stats |
| class | tdse::TDSESolver |
Namespaces | |
| namespace | tdse |
Enumerations | |
| enum class | tdse::Potential { tdse::Free , tdse::Barrier , tdse::DoubleSlit , tdse::Harmonic , tdse::CircularWell } |
Functions | |
| const char * | tdse::potential_name (Potential p) |
2-D Time-Dependent Schrödinger Equation solver
Algorithm: Strang operator splitting e^{-iHdt} ~= e^{-iVdt/2} * e^{-iTx*dt/2} * e^{-iTy*dt} * e^{-iTx*dt/2} * e^{-iVdt/2}
Each kinetic sub-step uses Crank-Nicolson -> complex tridiagonal solve (Thomas algorithm). Potential kick is a diagonal phase multiplication: psi *= exp(-i*V*tau).
Eigenstate computation uses num::lanczos on the real Hamiltonian matrix (H is real symmetric for real V, so eigenstates are real).
Bessel function zeros (for CircularWell exact eigenvalues) are found via num::brent. Norm/energy observables use num::gauss_legendre on radial marginals.
Grid: NxN interior points, domain [0,L]x[0,L], Dirichlet BCs (psi=0 on boundary). Storage: row-major idx = i*N + j, i = row (x), j = col (y).
Definition in file tdse_solver.hpp.