Skip to content

Commit 16cb5f7

Browse files
committed
Fix Brusselator problems
1 parent 995cf70 commit 16cb5f7

File tree

2 files changed

+127
-89
lines changed

2 files changed

+127
-89
lines changed

REQUIRE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ julia 0.6
22
ParameterizedFunctions 2.0.0
33
DiffEqBase 3.0.3
44
DiffEqPDEBase
5+
DiffEqOperators

src/ode_premade_problems.jl

Lines changed: 126 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -376,104 +376,133 @@ const MM_linear =full(Diagonal(0.5ones(4)))
376376
(::typeof(mm_linear))(::Type{Val{:analytic}},u0,p,t) = expm(inv(MM_linear)*mm_A*t)*u0
377377
prob_ode_mm_linear = ODEProblem(mm_linear,rand(4),(0.0,1.0),mass_matrix=MM_linear)
378378

379+
"""
380+
2D Brusselator
381+
382+
```math
383+
\\begin{align}
384+
\\frac{\\partial u}{\\partial t} &= 1 + u^2v - 4.4u + \\alpha(\frac{\\partial^2 u}{\\partial x^2} + \frac{\\partial^2 u}{\\partial y^2}) + f(x, y, t)
385+
\\frac{\\partial v}{\\partial t} &= 3.4u - u^2v + \\alpha(\frac{\\partial^2 u}{\\partial x^2} + \frac{\\partial^2 u}{\\partial y^2})
386+
\\end{align}
387+
```
388+
389+
where
390+
391+
```math
392+
f(x, y, t) = \\begin{cases}
393+
5 & \\quad \\text{if } (x-0.3)^2+(y-0.6)^2 ≤ 0.1^2 \\text{ and } t ≥ 1.1 \\\\
394+
0 & \\quad \\text{else}
395+
\\end{cases}
396+
```
397+
398+
and the initial conditions are
399+
400+
```math
401+
\\begin{align}
402+
u(x, y, 0) &= 22\\cdot y(1-y)^{3/2} \\\\
403+
v(x, y, 0) &= 27\\cdot x(1-x)^{3/2}
404+
\\end{align}
405+
```
406+
407+
with the periodic boundary condition
408+
409+
```math
410+
\\begin{align}
411+
u(x+1,y,t) &= u(x,y,t) \\\\
412+
u(x,y+1,t) &= u(x,y,t)
413+
\\end{align}
414+
```
415+
416+
From Hairer Norsett Wanner Solving Ordinary Differential Equations II - Stiff and Differential-Algebraic Problems Page 152
417+
"""
418+
brusselator_f(x, y, t) = ifelse((((x-0.3)^2 + (y-0.6)^2) <= 0.1^2) &&
419+
(t >= 1.1), 5., 0.)
420+
function limit(a, N)
421+
if a == N+1
422+
return 1
423+
elseif a == 0
424+
return N
425+
else
426+
return a
427+
end
428+
end
379429
function brusselator_2d_loop(du, u, p, t)
380430
@inbounds begin
381-
A, B, α, dx, N = p
431+
A, B, α, xyd, dx, N = p
382432
α = α/dx^2
383-
# Interior
384-
for i in 2:N-1, j in 2:N-1
385-
du[i,j,1] = α*(u[i-1,j,1] + u[i+1,j,1] + u[i,j+1,1] + u[i,j-1,1] - 4u[i,j,1]) +
386-
B + u[i,j,1]^2*u[i,j,2] - (A + 1)*u[i,j,1]
387-
end
388-
for i in 2:N-1, j in 2:N-1
389-
du[i,j,2] = α*(u[i-1,j,2] + u[i+1,j,2] + u[i,j+1,2] + u[i,j-1,2] - 4u[i,j,2]) +
390-
A*u[i,j,1] - u[i,j,1]^2*u[i,j,2]
391-
end
392-
393-
# Boundary @ edges
394-
for j in 2:N-1
395-
i = 1
396-
du[1,j,1] = α*(2u[i+1,j,1] + u[i,j+1,1] + u[i,j-1,1] - 4u[i,j,1]) +
397-
B + u[i,j,1]^2*u[i,j,2] - (A + 1)*u[i,j,1]
398-
end
399-
for j in 2:N-1
400-
i = 1
401-
du[1,j,2] = α*(2u[i+1,j,2] + u[i,j+1,2] + u[i,j-1,2] - 4u[i,j,2]) +
402-
A*u[i,j,1] - u[i,j,1]^2*u[i,j,2]
403-
end
404-
for j in 2:N-1
405-
i = N
406-
du[end,j,1] = α*(2u[i-1,j,1] + u[i,j+1,1] + u[i,j-1,1] - 4u[i,j,1]) +
407-
B + u[i,j,1]^2*u[i,j,2] - (A + 1)*u[i,j,1]
408-
end
409-
for j in 2:N-1
410-
i = N
411-
du[end,j,2] = α*(2u[i-1,j,2] + u[i,j+1,2] + u[i,j-1,2] - 4u[i,j,2]) +
412-
A*u[i,j,1] - u[i,j,1]^2*u[i,j,2]
413-
end
414-
for i in 2:N-1
415-
j = 1
416-
du[i,1,1] = α*(u[i-1,j,1] + u[i+1,j,1] + 2u[i,j+1,1] - 4u[i,j,1]) +
417-
B + u[i,j,1]^2*u[i,j,2] - (A + 1)*u[i,j,1]
418-
end
419-
for i in 2:N-1
420-
j = 1
421-
du[i,1,2] = α*(u[i-1,j,2] + u[i+1,j,2] + 2u[i,j+1,2] - 4u[i,j,2]) +
422-
A*u[i,j,1] - u[i,j,1]^2*u[i,j,2]
423-
end
424-
for i in 2:N-1
425-
j = N
426-
du[i,end,1] = α*(u[i-1,j,1] + u[i+1,j,1] + 2u[i,j-1,1] - 4u[i,j,1]) +
427-
B + u[i,j,1]^2*u[i,j,2] - (A + 1)*u[i,j,1]
433+
for I in CartesianRange((N, N))
434+
x = xyd[I[1]]
435+
y = xyd[I[2]]
436+
i = I[1]
437+
j = I[2]
438+
ip1 = limit(i+1, N)
439+
im1 = limit(i-1, N)
440+
jp1 = limit(j+1, N)
441+
jm1 = limit(j-1, N)
442+
du[i,j,1] = α*(u[im1,j,1] + u[ip1,j,1] + u[i,jp1,1] + u[i,jm1,1] - 4u[i,j,1]) +
443+
B + u[i,j,1]^2*u[i,j,2] - (A + 1)*u[i,j,1] + brusselator_f(x, y, t)
428444
end
429-
for i in 2:N-1
430-
j = N
431-
du[i,end,2] = α*(u[i-1,j,2] + u[i+1,j,2] + 2u[i,j-1,2] - 4u[i,j,2]) +
445+
for I in CartesianRange((N, N))
446+
i = I[1]
447+
j = I[2]
448+
ip1 = limit(i+1, N)
449+
im1 = limit(i-1, N)
450+
jp1 = limit(j+1, N)
451+
jm1 = limit(j-1, N)
452+
du[i,j,2] = α*(u[im1,j,2] + u[ip1,j,2] + u[i,jp1,2] + u[i,jm1,2] - 4u[i,j,2]) +
432453
A*u[i,j,1] - u[i,j,1]^2*u[i,j,2]
433454
end
434-
435-
# Boundary @ four vertexes
436-
i = 1; j = 1
437-
du[1,1,1] = α*(2u[i+1,j,1] + 2u[i,j+1,1] - 4u[i,j,1]) +
438-
B + u[i,j,1]^2*u[i,j,2] - (A + 1)*u[i,j,1]
439-
du[1,1,2] = α*(2u[i+1,j,2] + 2u[i,j+1,2] - 4u[i,j,2]) +
440-
A*u[i,j,1] - u[i,j,1]^2*u[i,j,2]
441-
442-
i = 1; j = N
443-
du[1,N,1] = α*(2u[i+1,j,1] + 2u[i,j-1,1] - 4u[i,j,1]) +
444-
B + u[i,j,1]^2*u[i,j,2] - (A + 1)*u[i,j,1]
445-
du[1,N,2] = α*(2u[i+1,j,2] + 2u[i,j-1,2] - 4u[i,j,2]) +
446-
A*u[i,j,1] - u[i,j,1]^2*u[i,j,2]
447-
448-
i = N; j = 1
449-
du[N,1,1] = α*(2u[i-1,j,1] + 2u[i,j+1,1] - 4u[i,j,1]) +
450-
B + u[i,j,1]^2*u[i,j,2] - (A + 1)*u[i,j,1]
451-
du[N,1,2] = α*(2u[i-1,j,2] + 2u[i,j+1,2] - 4u[i,j,2]) +
452-
A*u[i,j,1] - u[i,j,1]^2*u[i,j,2]
453-
454-
i = N; j = N
455-
du[end,end,1] = α*(2u[i-1,j,1] + 2u[i,j-1,1] - 4u[i,j,1]) +
456-
B + u[i,j,1]^2*u[i,j,2] - (A + 1)*u[i,j,1]
457-
du[end,end,2] = α*(2u[i-1,j,2] + 2u[i,j-1,2] - 4u[i,j,2]) +
458-
A*u[i,j,1] - u[i,j,1]^2*u[i,j,2]
459455
end
460456
end
461457
function init_brusselator_2d(xyd)
462-
M = length(xyd)
463-
u = zeros(M, M, 2)
464-
for I in CartesianRange((M, M))
465-
u[I,1] = (2 + 0.25xyd[I[2]])
466-
u[I,2] = (1 + 0.8xyd[I[1]])
458+
N = length(xyd)
459+
u = zeros(N, N, 2)
460+
for I in CartesianRange((N, N))
461+
x = xyd[I[1]]
462+
y = xyd[I[2]]
463+
u[I,1] = 22*(y[I]*(1-y[I]))^(3/2)
464+
u[I,2] = 27*(x[I]*(1-x[I]))^(3/2)
467465
end
468466
u
469467
end
470-
const N_brusselator_2d = 128
468+
xyd_brusselator = linspace(0,1,128)
471469
prob_ode_brusselator_2d = ODEProblem(brusselator_2d_loop,
472-
init_brusselator_2d(linspace(0,1,N_brusselator_2d)),
473-
(0.,1),
474-
(3.4, 1., 0.002, 1/(N_brusselator_2d-1),
475-
N_brusselator_2d))
470+
init_brusselator_2d(xyd_brusselator),
471+
(0.,11.5),
472+
(3.4, 1., 0.1,
473+
xyd_brusselator, step(xyd_brusselator),
474+
length(xyd_brusselator)))
475+
476+
"""
477+
1D Brusselator
478+
479+
```math
480+
\\begin{align}
481+
\\frac{\\partial u}{\\partial t} &= A + u^2v - (B+1)u + \\alpha\frac{\\partial^2 u}{\\partial x^2}
482+
\\frac{\\partial v}{\\partial t} &= Bu - u^2v + \\alpha\frac{\\partial^2 u}{\\partial x^2}
483+
\\end{align}
484+
```
485+
486+
and the initial conditions are
476487
488+
```math
489+
\\begin{align}
490+
u(x,0) &= 1+\\sin(2π x) \\\\
491+
v(x,0) &= 3
492+
\\end{align}
493+
```
494+
495+
with the boundary condition
496+
497+
```math
498+
\\begin{align}
499+
u(0,t) &= u(1,t) = 1 \\\\
500+
v(0,t) &= v(1,t) = 3
501+
\\end{align}
502+
```
503+
504+
From Hairer Norsett Wanner Solving Ordinary Differential Equations II - Stiff and Differential-Algebraic Problems Page 6
505+
"""
477506
const N_brusselator_1d = 40
478507
const D_brusselator_u = DerivativeOperator{Float64}(2,2,1/(N_brusselator_1d-1),
479508
N_brusselator_1d,
@@ -510,13 +539,19 @@ prob_ode_brusselator_1d = ODEProblem(brusselator_1d,
510539
(0.,10.),
511540
(1., 3., 1/50, zeros(N_brusselator_1d)))
512541

542+
"""
543+
[Orego Problem](http://nbviewer.jupyter.org/github/JuliaDiffEq/DiffEqBenchmarks.jl/blob/master/StiffODE/Orego.ipynb)
544+
"""
513545
orego = @ode_def Orego begin
514546
dy1 = p1*(y2+y1*(1-p2*y1-y2))
515547
dy2 = (y3-(1+y1)*y2)/p1
516548
dy3 = p3*(y1-y3)
517549
end p1 p2 p3
518550
prob_ode_orego = ODEProblem(orego,[1.0,2.0,3.0],(0.0,30.0),[77.27,8.375e-6,0.161])
519551

552+
"""
553+
[Hires Problem](http://nbviewer.jupyter.org/github/JuliaDiffEq/DiffEqBenchmarks.jl/blob/master/StiffODE/Hires.ipynb)
554+
"""
520555
hires = @ode_def Hires begin
521556
dy1 = -1.71*y1 + 0.43*y2 + 8.32*y3 + 0.0007
522557
dy2 = 1.71*y1 - 8.75*y2
@@ -533,6 +568,9 @@ u0[1] = 1
533568
u0[8] = 0.0057
534569
prob_ode_hires = ODEProblem(hires,u0,(0.0,321.8122))
535570

571+
"""
572+
[Pollution Problem](http://nbviewer.jupyter.org/github/JuliaDiffEq/DiffEqBenchmarks.jl/blob/master/StiffODE/Pollution.ipynb)
573+
"""
536574
const k1=.35e0
537575
const k2=.266e2
538576
const k3=.123e5
@@ -724,10 +762,9 @@ u0[9] = 0.01
724762
u0[17] = 0.007
725763
prob_ode_pollution = ODEProblem(pollution,u0,(0.0,60.0))
726764

727-
######################################################
728-
# Filament
729-
######################################################
730-
765+
"""
766+
[Filament PDE Discretization](http://nbviewer.jupyter.org/github/JuliaDiffEq/DiffEqBenchmarks.jl/blob/master/StiffODE/Filament.ipynb)
767+
"""
731768
const T = Float64
732769
abstract type AbstractFilamentCache end
733770
abstract type AbstractMagneticForce end
@@ -945,4 +982,4 @@ function filament_prob(::SolverDiffEq; N=20, Cm=32, ω=200, time_end=1.)
945982
stiffness_matrix!(f)
946983
prob = ODEProblem(f, r0, (0., time_end))
947984
end
948-
prob_ode_filament = filament(SolverDiffEq())
985+
prob_ode_filament = filament_prob(SolverDiffEq())

0 commit comments

Comments
 (0)