Skip to content

Commit 8656d31

Browse files
committed
Add skeleton of Brusselator PDE
1 parent a346d45 commit 8656d31

File tree

2 files changed

+99
-2
lines changed

2 files changed

+99
-2
lines changed

src/DiffEqProblemLibrary.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ __precompile__()
22

33
module DiffEqProblemLibrary
44

5-
using DiffEqBase, ParameterizedFunctions, DiffEqPDEBase
5+
using DiffEqBase, ParameterizedFunctions, DiffEqPDEBase, DiffEqOperators
66

77
include("ode_premade_problems.jl")
88
include("dae_premade_problems.jl")
@@ -13,7 +13,8 @@ include("sde_premade_problems.jl")
1313
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,
16-
prob_ode_lorenz, prob_ode_rober, prob_ode_threebody, prob_ode_mm_linear, prob_ode_pleiades
16+
prob_ode_lorenz, prob_ode_rober, prob_ode_threebody, prob_ode_mm_linear, prob_ode_pleiades,
17+
prob_ode_brusselator
1718

1819
#SDE Example Problems
1920
export prob_sde_wave, prob_sde_linear, prob_sde_cubic, prob_sde_2Dlinear, prob_sde_lorenz,

src/ode_premade_problems.jl

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,3 +375,99 @@ end
375375
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)
378+
379+
function brusselator_loop(du, u, p, t)
380+
@inbounds begin
381+
A, B, α, dx, N = p
382+
α = α/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]
428+
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]) +
432+
A*u[i,j,1] - u[i,j,1]^2*u[i,j,2]
433+
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]
459+
end
460+
end
461+
function init_brusselator(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]])
467+
end
468+
u
469+
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))

0 commit comments

Comments
 (0)