Diffusion¤
In 1D:
In higher dimensions:
or with anisotropic diffusion:
with \(A \in \R^{D \times D}\) symmetric positive definite.
exponax.stepper.Diffusion
¤
Bases: BaseStepper
Source code in exponax/stepper/_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 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 120 121 122 123 124 125 126 |
|
__init__
¤
__init__(
num_spatial_dims: int,
domain_extent: float,
num_points: int,
dt: float,
*,
diffusivity: Union[
Float[Array, "D D"], Float[Array, D], float
] = 0.01
)
Timestepper for the d-dimensional (d ∈ {1, 2, 3}
) diffusion equation
on periodic boundary conditions.
In 1d, the diffusion equation is given by
uₜ = ν uₓₓ
with ν ∈ ℝ
being the diffusivity.
In higher dimensions, the diffusion equation can written using the Laplacian operator.
uₜ = ν Δu
More generally speaking, there can be anistropic diffusivity given by a
A ∈ ℝᵈ ˣ ᵈ
sandwiched between the gradient and divergence operators.
uₜ = ∇ ⋅ (A ∇u)
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.diffusivity
(keyword-only): The diffusivityν
. In higher dimensions, this can be a scalar (=float), a vector of lengthd
, or a matrix of shaped ˣ d
. If a scalar is given, the diffusivity is assumed to be the same in all spatial dimensions. If a vector (of lengthd
) is given, the diffusivity varies across dimensions (=> diagonal diffusion). For a matrix, there is fully anisotropic diffusion. In this case,A
must be symmetric positive definite (SPD). Default:0.01
.
Notes:
- The stepper is unconditionally stable, no matter the choice of any argument because the equation is solved analytically in Fourier space.
- A
ν > 0
leads to stable and decaying solutions (i.e., energy is removed from the system). Aν < 0
leads to unstable and growing solutions (i.e., energy is added to the system). - Ultimately, only the factor
ν Δt / L²
affects the characteristic of the dynamics. See alsoexponax.stepper.generic.NormalizedLinearStepper
withnormalized_coefficients = [0, 0, alpha_2]
withalpha_2 = diffusivity * dt / domain_extent**2
.
Source code in exponax/stepper/_diffusion.py
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 |
|
__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 |
|