Hyper-Diffusion¤
In 1D:
In higher dimensions:
or with spatial mixing:
exponax.stepper.HyperDiffusion
¤
Bases: BaseStepper
Source code in exponax/stepper/_hyper_diffusion.py
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | |
__init__
¤
__init__(
num_spatial_dims: int,
domain_extent: float,
num_points: int,
dt: float,
*,
hyper_diffusivity: float = 0.0001,
diffuse_on_diffuse: bool = False
)
Timestepper for the d-dimensional (d ∈ {1, 2, 3}) hyper-diffusion
equation on periodic boundary conditions. A hyper-diffusion equation
acts like a diffusion equation but higher wavenumbers/modes are damped
even faster.
In 1d, the hyper-diffusion equation is given by
uₜ = - μ uₓₓₓₓ
with μ ∈ ℝ being the hyper-diffusivity.
Note the minus sign because by default, a fourth-order derivative dampens with a negative coefficient. To match the concept of second-order diffusion, a negation is introduced.
In higher dimensions, the hyper-diffusion equation can be written as
uₜ = − μ ((∇⊙∇) ⋅ (∇⊙∇)) u
or
uₜ = - μ Δ(Δu)
The latter introduces spatial mixing.
Arguments:
num_spatial_dims: The number of spatial dimensionsd.domain_extent: The size of the domainL; in higher dimensions the domain is assumed to be a scaled hypercubeΩ = (0, L)ᵈ.num_points: The number of pointsNused to discretize the domain. This includes the left boundary point and excludes the right boundary point. In higher dimensions; the number of points in each dimension is the same. Hence, the total number of degrees of freedom isNᵈ.dt: The timestep sizeΔtbetween two consecutive states.hyper_diffusivity(keyword-only): The hyper-diffusivityν. This stepper only supports scalar (=isotropic) hyper-diffusivity. Default: 0.0001.diffuse_on_diffuse(keyword-only): IfTrue, the second form of the hyper-diffusion equation in higher dimensions is used. As a consequence, there will be mixing in the spatial derivatives. Default:False.
Notes:
- The stepper is unconditionally stable, no matter the choice of any argument because the equation is solved analytically in Fourier space.
- Ultimately, only the factor
μ Δt / L⁴affects the characteristic of the dynamics. See alsoexponax.stepper.generic.NormalizedLinearStepperwithnormalized_coefficients = [0, 0, 0, 0, alpha_4]withalpha_4 = - hyper_diffusivity * dt / domain_extent**4.
Source code in exponax/stepper/_hyper_diffusion.py
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | |
__call__
¤
__call__(
u: Float[Array, "C ... N"]
) -> Float[Array, "C ... N"]
Perform one step of the time integration for a single state.
Arguments:
u: The state vector, shape(C, ..., N,).
Returns:
u_next: The state vector after one step, shape(C, ..., N,).
Tip
Use this call method together with exponax.rollout to efficiently
produce temporal trajectories.
Info
For batched operation, use jax.vmap on this function.
Source code in exponax/_base_stepper.py
240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 | |