Allen-Cahn¤
exponax.stepper.reaction.AllenCahn
¤
Bases: BaseStepper
Source code in exponax/stepper/reaction/_allen_cahn.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 120 121 122 123 124 125 126 127 128 |
|
__init__
¤
__init__(
num_spatial_dims: int,
domain_extent: float,
num_points: int,
dt: float,
*,
diffusivity: float = 0.005,
first_order_coefficient: float = 1.0,
third_order_coefficient: float = -1.0,
order: int = 2,
dealiasing_fraction: float = 1 / 2,
num_circle_points: int = 16,
circle_radius: float = 1.0
)
Timestepper for the d-dimensional (d ∈ {1, 2, 3}
) Allen-Cahn
reaction-diffusion equation on periodic boundary conditions. This
reaction-diffusion equation is a model for phase separation, for example
the separation of oil and water.
In 1d, the Allen-Cahn equation is given by
uₜ = ν uₓₓ + c₁ u + c₃ u³
with ν
the diffusivity, c₁
the first order coefficient, and c₃
the
third order coefficient. No matter the spatial dimension, the state
always only has one channel. In higher dimensions, the equation reads
uₜ = ν Δu + c₁ u + c₃ u³
with Δ
the Laplacian.
The expected temporal behavior is the formation of sharp interfaces between the two phases. The limit of the solution is a step function that separates the two phases.
Note that the Allen-Cahn is often solved with Dirichlet boundary conditions, but here we use periodic boundary conditions.
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
: The diffusivityν
. The default value is5e-3
.first_order_coefficient
: The first order coefficientc₁
. The default value is1.0
.third_order_coefficient
: The third order coefficientc₃
. The default value is-1.0
.dealiasing_fraction
: The fraction of the highest wavenumbers to dealias. Default is1/2
because the default polynomial has a highest degree of 3.order
: The order of the Exponential Time Differencing Runge Kutta method. Must be one of {0, 1, 2, 3, 4}. The option0
only solves the linear part of the equation. Use higher values for higher accuracy and stability. The default choice of2
is a good compromise for single precision floats.num_circle_points
: How many points to use in the complex contour integral method to compute the coefficients of the exponential time differencing Runge Kutta method. Default: 16.circle_radius
: The radius of the contour used to compute the coefficients of the exponential time differencing Runge Kutta method. Default: 1.0.
Notes:
- See https://github.com/chebfun/chebfun/blob/db207bc9f48278ca4def15bf90591bfa44d0801d/spin.m#L48 for an example IC of the Allen-Cahn in 1d.
Source code in exponax/stepper/reaction/_allen_cahn.py
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 |
|
__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 |
|