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 pointsN
used 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Δt
between 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.NormalizedLinearStepper
withnormalized_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 |
|