Hyper-Diffusion¤
In 1D:
\[ \frac{\partial u}{\partial t} = \xi \frac{\partial^4 u}{\partial x^4} \]
In higher dimensions:
\[ \frac{\partial u}{\partial t} = \zeta \nabla \cdot (\nabla \odot \nabla \odot \nabla) u \]
or with spatial mixing:
\[ \frac{\partial u}{\partial t} = \zeta (\nabla \cdot \nabla)(\nabla \cdot \nabla) u \]
exponax.stepper.HyperDiffusion
¤
Bases: BaseStepper
Source code in exponax/stepper/_linear.py
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 |
|
__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, not 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.normalized.NormalizedLinearStepper
withnormalized_coefficients = [0, 0, 0, 0, alpha_4]
withalpha_4 = - hyper_diffusivity * dt / domain_extent**4
.
Source code in exponax/stepper/_linear.py
475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 |
|
__call__
¤
__call__(
u: Float[Array, "C ... N"]
) -> Float[Array, "C ... N"]
Performs a check
Source code in exponax/_base_stepper.py
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 |
|