Modeling the Brusselator PDE:
using ComponentArrays: ComponentArray
using SimpleUnPack
using OrdinaryDiffEq
using PlotsModel parameters and initial conditions
function build_u0_ps(; x_min=0.0, x_max=1.0, y_min=0.0, y_max=1.0, α=10.0, N=26::Int)
u0 = ComponentArray(u=zeros(N, N), v=zeros(N, N))
xx = range(x_min, x_max, length=N)
yy = range(y_min, y_max, length=N)
dx = step(xx)
dy = step(yy)
for I in CartesianIndices((N, N))
x = xx[I[1]]
y = yy[I[2]]
u0.u[I] = 22 * (y * (1 - y))
u0.v[I] = 27 * (x * (1 - x))
end
ps = (; xx=xx, yy=yy, Dx=α/dx^2, Dy=α/dy^2, N=N)
return u0, ps
endbuild_u0_ps (generic function with 1 method)A discretized PDE problem is a coupled ODE problem under the hood.
function model!(ds, s, p, t)
SimpleUnPack.@unpack xx, yy, Dx, Dy, N = p
SimpleUnPack.@unpack u, v = s
brusselator_f(x, y, t) = (((x - 0.3)^2 + (y - 0.6)^2) <= 0.1^2) * (t >= 1.1) * 5
# Interating all grid points
@inbounds for I in CartesianIndices((N, N))
i, j = Tuple(I)
x = xx[I[1]]
y = yy[I[2]]
uterm = 1.0 + v[i, j] * u[i, j]^2 - 4.4 * u[i, j] + brusselator_f(x, y, t)
vterm = 3.4 * u[i, j] - v[i, j] * u[i, j]^2
# No flux boundary conditions
i_prev = clamp(i - 1, 1, N)
i_next = clamp(i + 1, 1, N)
j_prev = clamp(j - 1, 1, N)
j_next = clamp(j + 1, 1, N)
unabla = Dx * (u[i, j_prev] - 2u[i, j] + u[i, j_next]) + Dy * (u[i_prev, j] - 2u[i, j] + u[i_next, j])
vnabla = Dx * (v[i, j_prev] - 2v[i, j] + v[i, j_next]) + Dy * (v[i_prev, j] - 2v[i, j] + v[i_next, j])
ds.u[i, j] = unabla + uterm
ds.v[i, j] = vnabla + vterm
end
return nothing
endmodel! (generic function with 1 method)u0, ps = build_u0_ps(;N=26)
tspan = (0, 11.5)
prob = ODEProblem(model!, u0, tspan, ps)
@time sol = solve(prob, FBDF(), saveat=0.1) 19.134840 seconds (23.69 M allocations: 1.338 GiB, 3.56% gc time, 36.66% compilation time)
retcode: Success
Interpolation: 1st order linear
t: 116-element Vector{Float64}:
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
⋮
10.7
10.8
10.9
11.0
11.1
11.2
11.3
11.4
11.5
u: 116-element Vector{ComponentArrays.ComponentVector{Float64, Vector{Float64}, Tuple{ComponentArrays.Axis{(u = ViewAxis(1:676, ShapedAxis((26, 26))), v = ViewAxis(677:1352, ShapedAxis((26, 26))))}}}}:
ComponentVector{Float64}(u = [0.0 0.8447999999999999 … 0.8448000000000007 0.0; 0.0 0.8447999999999999 … 0.8448000000000007 0.0; … ; 0.0 0.8447999999999999 … 0.8448000000000007 0.0; 0.0 0.8447999999999999 … 0.8448000000000007 0.0], v = [0.0 0.0 … 0.0 0.0; 1.0368 1.0368 … 1.0368 1.0368; … ; 1.0368000000000008 1.0368000000000008 … 1.0368000000000008 1.0368000000000008; 0.0 0.0 … 0.0 0.0])
ComponentVector{Float64}(u = [6.690974066392926 6.690974084129741 … 6.690974084124253 6.6909740663873585; 6.6909740575741194 6.690974072744522 … 6.690974072739038 6.690974057568552; … ; 6.690974057566035 6.690974072736439 … 6.690974072730952 6.690974057560464; 6.6909740663847215 6.690974084121538 … 6.690974084116051 6.690974066379153], v = [0.6972494595615119 0.6972494414850176 … 0.6972494414867465 0.6972494595632667; 0.697249467784067 0.6972494522786455 … 0.6972494522803739 0.6972494677858221; … ; 0.6972494677846709 0.6972494522792488 … 0.6972494522809759 0.6972494677864267; 0.6972494595621245 0.6972494414856293 … 0.6972494414873588 0.6972494595638793])
ComponentVector{Float64}(u = [6.301786034949539 6.301786030093742 … 6.301786030093748 6.301786034949544; 6.301785998750481 6.301785991776989 … 6.301785991776991 6.3017859987504865; … ; 6.301785998750488 6.301785991776995 … 6.301785991776995 6.301785998750494; 6.301786034949547 6.301786030093749 … 6.301786030093754 6.301786034949551], v = [0.5313506863767766 0.5313506912722211 … 0.53135069127222 0.5313506863767778; 0.5313507227328611 0.5313507297475542 … 0.5313507297475589 0.5313507227328603; … ; 0.5313507227328623 0.5313507297475566 … 0.531350729747562 0.5313507227328611; 0.5313506863767784 0.5313506912722225 … 0.5313506912722211 0.5313506863767796])
ComponentVector{Float64}(u = [5.754728319649757 5.7547283197697325 … 5.754728319769731 5.754728319649759; 5.7547283253253125 5.754728325832598 … 5.754728325832606 5.754728325325309; … ; 5.754728325325311 5.7547283258326045 … 5.754728325832601 5.7547283253253125; 5.754728319649758 5.754728319769732 … 5.7547283197697325 5.754728319649758], v = [0.5758999143579149 0.5758999142351253 … 0.5758999142351261 0.5758999143579145; 0.5758999086608881 0.5758999081504541 … 0.5758999081504527 0.5758999086608887; … ; 0.5758999086608879 0.5758999081504548 … 0.5758999081504539 0.5758999086608882; 0.575899914357915 0.5758999142351252 … 0.5758999142351257 0.5758999143579149])
ComponentVector{Float64}(u = [5.25284710288988 5.2528471021581655 … 5.252847102158162 5.25284710288988; 5.252847101574421 5.2528471008395465 … 5.2528471008395465 5.252847101574419; … ; 5.252847101574423 5.25284710083954 … 5.2528471008395465 5.25284710157442; 5.252847102889879 5.2528471021581655 … 5.252847102158164 5.25284710288988], v = [0.6277881204854723 0.6277881212210165 … 0.6277881212210168 0.6277881204854723; 0.6277881218086021 0.6277881225473452 … 0.6277881225473438 0.6277881218086027; … ; 0.6277881218086016 0.6277881225473471 … 0.6277881225473447 0.6277881218086024; 0.6277881204854727 0.6277881212210156 … 0.6277881212210166 0.6277881204854726])
ComponentVector{Float64}(u = [4.794823371259632 4.794823371180575 … 4.794823371180582 4.794823371259635; 4.7948233706602 4.794823370574589 … 4.794823370574592 4.794823370660206; … ; 4.794823370660199 4.794823370574587 … 4.7948233705745835 4.7948233706602; 4.794823371259631 4.794823371180574 … 4.794823371180576 4.794823371259629], v = [0.6838288646593704 0.6838288647406734 … 0.6838288647406745 0.6838288646593703; 0.6838288652660593 0.683828865353931 … 0.6838288653539297 0.6838288652660607; … ; 0.6838288652660646 0.6838288653539355 … 0.6838288653539346 0.6838288652660651; 0.6838288646593754 0.6838288647406785 … 0.6838288647406789 0.6838288646593752])
ComponentVector{Float64}(u = [4.376146989537958 4.376146989557447 … 4.376146989557451 4.376146989537965; 4.376146989577701 4.376146989597205 … 4.376146989597215 4.376146989577709; … ; 4.3761469895777 4.376146989597204 … 4.376146989597204 4.376146989577699; 4.376146989537956 4.3761469895574425 … 4.37614698955744 4.376146989537953], v = [0.7442155906854842 0.7442155906657928 … 0.7442155906657933 0.7442155906854857; 0.7442155906453024 0.7442155906255989 … 0.744215590625601 0.744215590645303; … ; 0.7442155906453132 0.7442155906256102 … 0.744215590625613 0.7442155906453131; 0.744215590685495 0.7442155906658035 … 0.7442155906658039 0.7442155906854964])
ComponentVector{Float64}(u = [3.9927371636143345 3.992737163609306 … 3.992737163609285 3.9927371636143003; 3.9927371636051845 3.992737163600139 … 3.9927371636001037 3.9927371636051436; … ; 3.992737163605153 3.9927371636001054 … 3.9927371636000752 3.9927371636051143; 3.9927371636143043 3.9927371636092843 … 3.992737163609246 3.992737163614261], v = [0.8092264117828594 0.8092264117878738 … 0.8092264117878696 0.8092264117828526; 0.8092264117920411 0.8092264117970795 … 0.8092264117970749 0.8092264117920338; … ; 0.8092264117920408 0.809226411797081 … 0.8092264117970824 0.8092264117920436; 0.8092264117828598 0.8092264117878746 … 0.8092264117878761 0.8092264117828613])
ComponentVector{Float64}(u = [3.6411991243950292 3.641199124397415 … 3.641199124397742 3.6411991243955435; 3.6411991243979065 3.6411991244002637 … 3.6411991244006416 3.6411991243984647; … ; 3.6411991243983213 3.641199124400578 … 3.6411991244011124 3.6411991243989794; 3.641199124395474 3.6411991243977355 … 3.641199124398322 3.6411991243961888], v = [0.8791283501785478 0.8791283501762547 … 0.8791283501763046 0.879128350178638; 0.8791283501755428 0.8791283501732498 … 0.8791283501733097 0.8791283501756453; … ; 0.8791283501755406 0.879128350173229 … 0.8791283501732176 0.8791283501755255; 0.87912835017853 0.8791283501762244 … 0.8791283501762306 0.8791283501785339])
ComponentVector{Float64}(u = [3.3184625421488576 3.318462542144817 … 3.3184625421451655 3.318462542149225; 3.318462542140383 3.3184625421363956 … 3.318462542136697 3.3184625421407294; … ; 3.318462542140397 3.3184625421364675 … 3.3184625421370497 3.318462542141074; 3.318462542148907 3.318462542144935 … 3.318462542145499 3.318462542149546], v = [0.9541177869056965 0.9541177869097569 … 0.9541177869096917 0.9541177869055951; 0.9541177869143306 0.9541177869183727 … 0.954117786918304 0.9541177869142331; … ; 0.954117786914158 0.9541177869182128 … 0.9541177869180966 0.9541177869140427; 0.9541177869055298 0.9541177869095998 … 0.954117786909459 0.9541177869053812])
⋮
ComponentVector{Float64}(u = [0.4045715532362504 0.4046034186264429 … 0.40640093375080166 0.4063731041919179; 0.404562118935386 0.40459419097271565 … 0.40639734493667323 0.4063680168055632; … ; 0.4027322686706153 0.4027398957313349 … 0.4033986909255462 0.4033999472295391; 0.40271760325714495 0.40272504324969705 … 0.40337491370417927 0.40337631955188474], v = [4.107394941852322 4.107394961246611 … 4.107396618908551 4.107396621009837; 4.107394924177594 4.107394943583407 … 4.1073966000068145 4.107396601965525; … ; 4.10739226458662 4.107392274590719 … 4.107393381909009 4.1073933880354785; 4.107392243684016 4.107392253602193 … 4.1073933559464555 4.107393362105948])
ComponentVector{Float64}(u = [0.40819351693156114 0.4082254044931697 … 0.41002476310403385 0.40999693342683524; 0.40818406517906775 0.408216159391964 … 0.4100211545526808 0.40999182608952484; … ; 0.40635160838393913 0.40635924509492516 … 0.4070190961548411 0.407020358099521; 0.40633692284729234 0.4063443723879513 … 0.40699529236433357 0.40699670388882064], v = [4.1771766440255735 4.177176641080208 … 4.177176436508552 4.177176438627734; 4.177176644034583 4.177176641096822 … 4.177176437604009 4.177176439794666; … ; 4.177176623205957 4.177176623447838 … 4.177176660896286 4.177176661287718; 4.177176622669044 4.17717662292762 … 4.177176661783268 4.177176662171673])
ComponentVector{Float64}(u = [0.4126134621448478 0.4126453736142927 … 0.4144467213587148 0.41441889158275885; 0.41260399154511956 0.4126361096702874 … 0.41444309149408626 0.4144137627020828; … ; 0.41076872036567225 0.4107763674948691 … 0.41143735890379274 0.41143862694573075; 0.4107540131021911 0.41076147295099635 … 0.4114135264393614 0.41141494409994694], v = [4.245761901051587 4.245761874016905 … 4.2457596600719 4.245759662181246; 4.245761920158713 4.245761893127455 … 4.245759682761455 4.245759685172713; … ; 4.245764748550617 4.245764738253195 … 4.245763620211324 4.245763614403495; 4.245764770002643 4.245764759832472 … 4.2457636500750295 4.245763644225379])
ComponentVector{Float64}(u = [0.41778000206512794 0.41781193917653797 … 0.4196154220574837 0.41958759221379843; 0.41777051121263875 0.4178026549844717 … 0.4196117692929154 0.4195824401868981; … ; 0.41593221659010265 0.4159398749091491 … 0.41660209175712964 0.41660336635835726; 0.4159174859875201 0.4159249569082696 … 0.41657822850759296 0.4165796527689985], v = [4.313090077907614 4.313090025036077 … 4.313085654183481 4.313085656243398; 4.313090117537492 4.313090064664952 … 4.313085700075193 4.3130857026836775; … ; 4.313096006850886 4.31309598523342 … 4.313093625463373 4.313093612986386; 4.313096051923954 4.313096030552171 … 4.313093686437826 4.313093673877544])
ComponentVector{Float64}(u = [0.4236613932044165 0.4236933574961377 … 0.4254991051132995 0.42547127523081135; 0.42365188085033567 0.4236840518074543 … 0.42549542803940754 0.425466098633886; … ; 0.42181037712861164 0.4218180473220796 … 0.4224815651927393 0.42248284676476844; 0.42179562175553525 0.4218031044258631 … 0.4224576692843481 0.42245910056053537], v = [4.379159768418079 4.379159688160975 … 4.37915302959148 4.379153031566045; 4.379159829836014 4.379159749573202 … 4.379153100112281 4.379153102896519; … ; 4.379168968023201 4.379168934391977 … 4.3791652562794985 4.379165236715727; 4.379169038166217 4.379169004906046 … 4.3791653502571695 4.379165330566177])
ComponentVector{Float64}(u = [0.43026859408453644 0.43030058751664685 … 0.4321087624668472 0.4320809325295324; 0.4302590586914076 0.4302912587942038 … 0.4321050593463526 0.43207572960642915; … ; 0.42841411592552237 0.4284217988461081 … 0.429086710855386 0.4290879998934816; 0.42839933400538727 0.42840682926888096 … 0.4290627799416798 0.42906421873107675], v = [4.443876560488901 4.443876450870788 … 4.443867340339212 4.443867342236233; 4.443876645251543 4.44387653562274 … 4.443867437248545 4.443867440235239; … ; 4.443889264920679 4.443889218414732 … 4.443884127712063 4.443884100557925; 4.443889361930054 4.443889315929707 … 4.443884257063616 4.443884229735169])
ComponentVector{Float64}(u = [0.43765771085018484 0.4376897353492331 … 0.43950050116898187 0.4394726712404051; 0.43764815082978586 0.43768038200503134 … 0.4394967702082634 0.4394674401799122; … ; 0.4357995334562183 0.43580722997152527 … 0.43647363221218083 0.4364749292432297; 0.4357847231740029 0.4357922318896379 … 0.4364496639260368 0.4364511107584779], v = [4.507111839255956 4.507111698335094 … 4.507099970563206 4.507099972309238; 4.507111948973512 4.507111808036772 … 4.507100095679199 4.507100098812522; … ; 4.507128288730841 4.507128228471865 … 4.507121627758922 4.50712159247865; 4.507128414444499 4.50712835483433 … 4.507121794877613 4.507121759373005])
ComponentVector{Float64}(u = [0.44589652999084506 0.44592858767991245 … 0.44774212248828865 0.4477142925921497; 0.4458869436349614 0.4459192080060672 … 0.447738361759661 0.44770903144651764; … ; 0.44403439725906846 0.44404210830859336 … 0.444710104226703 0.44471140981055207; 0.44401955665213627 0.44402707974974914 … 0.44468609599379977 0.44468755143254624], v = [4.568725507014843 4.568725332652365 … 4.5687108077691985 4.568710809331232; 4.568725643417911 4.568725469034053 … 4.568710963044078 4.568710966311114; … ; 4.568745960781223 4.568745885818288 … 4.568737670273179 4.568737626298064; 4.568746117185426 4.568746043024201 … 4.568737877759918 4.568737833507028])
ComponentVector{Float64}(u = [0.45507826554913716 0.45511035886632045 … 0.45692686751439193 0.45689903768616497; 0.45506865089093024 0.45510095089638086 … 0.45692307479653066 0.4568937442112784; … ; 0.45321188275651075 0.453219609421896 … 0.4538893180711706 0.45389063285205655; 0.45319700956671743 0.4532045481168496 … 0.45386526693022433 0.4538667316232725], v = [4.6285194874551685 4.6285192771942825 … 4.62850174823936 4.628501749570329; 4.628519652536262 4.628519442248138 … 4.628501935923606 4.628501939300117; … ; 4.628544243806707 4.6285441530465015 … 4.6285342020901945 4.628534148765204; 4.628544433186109 4.628544343391675 … 4.62853445293748 4.628534399277524])This notebook was generated using Literate.jl.