Skip to content

Commit e325bb8

Browse files
committed
Add 1d Brusselator PDE
1 parent 8656d31 commit e325bb8

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

src/DiffEqProblemLibrary.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export prob_ode_linear, prob_ode_bigfloatlinear, prob_ode_2Dlinear,
1414
prob_ode_large2Dlinear, prob_ode_bigfloat2Dlinear, prob_ode_rigidbody,
1515
prob_ode_2Dlinear_notinplace, prob_ode_vanderpol, prob_ode_vanderpol_stiff,
1616
prob_ode_lorenz, prob_ode_rober, prob_ode_threebody, prob_ode_mm_linear, prob_ode_pleiades,
17-
prob_ode_brusselator
17+
prob_ode_brusselator_1d, prob_ode_brusselator_2d
1818

1919
#SDE Example Problems
2020
export prob_sde_wave, prob_sde_linear, prob_sde_cubic, prob_sde_2Dlinear, prob_sde_lorenz,

src/ode_premade_problems.jl

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ 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-
function brusselator_loop(du, u, p, t)
379+
function brusselator_2d_loop(du, u, p, t)
380380
@inbounds begin
381381
A, B, α, dx, N = p
382382
α = α/dx^2
@@ -458,7 +458,7 @@ function brusselator_loop(du, u, p, t)
458458
A*u[i,j,1] - u[i,j,1]^2*u[i,j,2]
459459
end
460460
end
461-
function init_brusselator(xyd)
461+
function init_brusselator_2d(xyd)
462462
M = length(xyd)
463463
u = zeros(M, M, 2)
464464
for I in CartesianRange((M, M))
@@ -467,7 +467,45 @@ function init_brusselator(xyd)
467467
end
468468
u
469469
end
470-
prob_ode_brusselator = ODEProblem(brusselator_loop,
471-
init_brusselator(linspace(0,1,128)),
472-
(0.,1),
473-
(3.4, 1., 0.002, 1/127, 128))
470+
const N_brusselator_2d = 128
471+
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))
476+
477+
const N_brusselator_1d = 40
478+
const D_brusselator_u = DerivativeOperator{Float64}(2,2,1/(N_brusselator_1d-1),
479+
N_brusselator_1d,
480+
:Dirichlet,:Dirichlet;
481+
BC=(1.,1.))
482+
const D_brusselator_v = DerivativeOperator{Float64}(2,2,1/(N_brusselator_1d-1),
483+
N_brusselator_1d,
484+
:Dirichlet,:Dirichlet;
485+
BC=(3.,3.))
486+
function brusselator_1d(du, u_, p, t)
487+
A, B, α, buffer = p
488+
u = @view(u_[:, 1])
489+
v = @view(u_[:, 2])
490+
A_mul_B!(buffer, D_brusselator_u, u)
491+
Du = buffer
492+
@. du[:, 1] = A + u^2*v - (B+1)*u + α*Du
493+
494+
A_mul_B!(buffer, D_brusselator_v, v)
495+
Dv = buffer
496+
@. du[:, 2] = B*u - u^2*v + α*Dv
497+
nothing
498+
end
499+
function init_brusselator_1d(N)
500+
u = zeros(N, 2)
501+
x = linspace(0, 1, N)
502+
for i in 1:N
503+
u[i, 1] = 1 + sin(2pi*x[i])
504+
u[i, 2] = 3.
505+
end
506+
u
507+
end
508+
prob_ode_brusselator_1d = ODEProblem(brusselator_1d,
509+
init_brusselator_1d(N_brusselator_1d),
510+
(0.,10.),
511+
(1., 3., 1/50, zeros(N_brusselator_1d)))

0 commit comments

Comments
 (0)