Note
Go to the end to download the full example code.
2.4.3 Kuramoto-Sivashinsky - Using custom class
This example implements a scalar PDE using a custom class. We here consider the Kuramoto–Sivashinsky equation, which for instance describes the dynamics of flame fronts:
\[\partial_t u = -\frac12 |\nabla u|^2 - \nabla^2 u - \nabla^4 u\]
0%| | 0/10.0 [00:00<?, ?it/s]
Initializing: 0%| | 0/10.0 [00:00<?, ?it/s]
0%| | 0/10.0 [00:00<?, ?it/s]
3%|▎ | 0.31/10.0 [00:00<00:09, 1.01it/s]
8%|▊ | 0.85/10.0 [00:00<00:03, 2.38it/s]
32%|███▎ | 3.25/10.0 [00:00<00:01, 5.57it/s]
83%|████████▎ | 8.3/10.0 [00:01<00:00, 7.65it/s]
83%|████████▎ | 8.3/10.0 [00:01<00:00, 6.56it/s]
100%|██████████| 10.0/10.0 [00:01<00:00, 7.90it/s]
100%|██████████| 10.0/10.0 [00:01<00:00, 7.90it/s]
from pde import PDEBase, ScalarField, UnitGrid
class KuramotoSivashinskyPDE(PDEBase):
"""Implementation of the normalized Kuramoto–Sivashinsky equation."""
def evolution_rate(self, state, t=0):
"""Implement the python version of the evolution equation."""
state_lap = state.laplace(bc="auto_periodic_neumann")
state_lap2 = state_lap.laplace(bc="auto_periodic_neumann")
state_grad = state.gradient(bc="auto_periodic_neumann")
return -state_grad.to_scalar("squared_sum") / 2 - state_lap - state_lap2
grid = UnitGrid([32, 32]) # generate grid
state = ScalarField.random_uniform(grid) # generate initial condition
eq = KuramotoSivashinskyPDE() # define the pde
result = eq.solve(state, t_range=10, dt=0.01)
result.plot()
Total running time of the script: (0 minutes 1.364 seconds)