Numerics and units¶
This page summarizes the physical units and the numerical discretizations used in torus-solver.
It is intentionally short; each model page contains the governing equations and links to the implementation.
Coordinate system and base units¶
Lengths are in meters: \(R_0\) [m], \(a\) [m].
Angles \((\theta, \phi)\) are dimensionless and lie on \([0,2\pi)\).
Cartesian points \(\mathbf x = (x,y,z)\) are in meters.
Surface quantities and units¶
Model A (electrodes / surface voltage)¶
Surface potential: \(V(\theta,\phi)\) [V]
Sheet conductivity (uniform): \(\sigma_s\) [S] (Siemens)
Surface current density: \(\mathbf K(\theta,\phi)\) [A/m]
Injected current density: \(s(\theta,\phi)\) [A/m\(^2\)]
Electrode parameters:
electrode location \((\theta_i,\phi_i)\) [rad]
injected current \(I_i\) [A]
Governing equations implemented:
Implementation note:
solve_current_potential(...) solves the unit-conductivity form \(-\Delta_s V=b\) (with gauge fixing),
so the electrode model passes b = s/σ_s and then uses K = -σ_s ∇_s V.
For uniform \(\sigma_s\), \(\mathbf K\) is (up to numerical error) invariant to \(\sigma_s\); changing
sigma_s mainly rescales \(V\).
Model B (current potential / REGCOIL-like)¶
Current potential: \(\Phi(\theta,\phi)\) [A]
Surface current density: \(\mathbf K = \hat{\mathbf n}\times\nabla_s\Phi\) [A/m]
Optional net currents: \(I_{\mathrm{pol}}, I_{\mathrm{tor}}\) [A]
In the VMEC example, the optimized Fourier coefficients are dimensionless and are scaled by Phi_scale
to give \(\Phi\) in amperes.
Magnetic field and normalization¶
Magnetic field: \(\mathbf B(\mathbf x)\) [T]
Biot–Savart:
\(\mu_0 = 4\pi\times 10^{-7}\) [H/m]
inputs: \(\mathbf K\) [A/m]
outputs: \(\mathbf B\) [T]
Throughout the repository we report and optimize the normalized normal field
which is dimensionless.
Discretization choices¶
The winding surface is a uniform periodic grid in \((\theta,\phi)\).
Surface derivatives use spectral (FFT) differentiation in both angles.
The surface Poisson solve uses conjugate gradients (
jax.scipy.sparse.linalg.cg) with:area-mean gauge fix for \(V\)
optional constant-coefficient spectral preconditioner (
use_preconditioner=True)
Field-line tracing uses fixed-step RK4 with
lax.scan:If
normalize=True, the ODE uses \(\mathbf b=\mathbf B/\|\mathbf B\|\) sostep_sizeis approximately an arc-length step in meters.
Practical numerics tips¶
Prefer
jax_enable_x64=Truefor tight physics comparisons and regression tests.Expect a one-time JIT “compile” cost on first call; subsequent calls are fast.
For large evaluation grids,
biot_savart_surface(..., chunk_size=...)avoids allocating a huge(N_eval, N_surface, 3)tensor at once.