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) 23.040158 seconds (14.49 M allocations: 1.129 GiB, 3.13% gc time, 39.67% 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.690974984007653 6.690975001822107 … 6.6909750018117204 6.690974983997116; 6.690974975116299 6.690974990390786 … 6.690974990380409 6.690974975105758; … ; 6.690974975113438 6.690974990387927 … 6.690974990377549 6.6909749751028995; 6.690974984004754 6.690975001819204 … 6.6909750018088205 6.6909749839942165], v = [0.6972489073156851 0.6972488891401697 … 0.6972488891434477 0.6972489073190079; 0.6972489155831907 0.6972488999523364 … 0.6972488999556022 0.6972489155865178; … ; 0.6972489155834277 0.6972488999525726 … 0.6972488999558377 0.6972489155867551; 0.6972489073159249 0.6972488891404098 … 0.6972488891436883 0.6972489073192479])
ComponentVector{Float64}(u = [6.3017864066105655 6.301786401752524 … 6.301786401752529 6.301786406610573; 6.301786370385783 6.301786363408424 … 6.301786363408436 6.30178637038579; … ; 6.301786370385786 6.301786363408426 … 6.3017863634084375 6.301786370385792; 6.301786406610568 6.301786401752526 … 6.301786401752532 6.301786406610577], v = [0.5313506273837374 0.5313506322813808 … 0.5313506322813811 0.5313506273837391; 0.5313506637655242 0.5313506707840377 … 0.5313506707840416 0.5313506637655243; … ; 0.5313506637655242 0.5313506707840394 … 0.5313506707840415 0.531350663765525; 0.5313506273837382 0.531350632281381 … 0.5313506322813818 0.5313506273837396])
ComponentVector{Float64}(u = [5.754728677829969 5.754728677949021 … 5.754728677949021 5.754728677829968; 5.754728683501431 5.754728684007517 … 5.754728684007516 5.7547286835014315; … ; 5.7547286835014315 5.754728684007512 … 5.754728684007516 5.7547286835014315; 5.754728677829966 5.754728677949023 … 5.754728677949021 5.754728677829968], v = [0.5758998312352215 0.5758998311133672 … 0.5758998311133672 0.5758998312352216; 0.5758998255423224 0.5758998250331073 … 0.5758998250331078 0.5758998255423223; … ; 0.5758998255423221 0.575899825033108 … 0.5758998250331073 0.5758998255423224; 0.5758998312352216 0.5758998311133671 … 0.5758998311133673 0.5758998312352215])
ComponentVector{Float64}(u = [5.252847377392548 5.252847376660399 … 5.2528473766604 5.25284737739255; 5.252847376076641 5.2528473753413145 … 5.252847375341316 5.252847376076642; … ; 5.25284737607664 5.25284737534132 … 5.25284737534132 5.252847376076639; 5.252847377392549 5.252847376660399 … 5.252847376660397 5.252847377392549], v = [0.6277880907790726 0.6277880915150558 … 0.6277880915150552 0.6277880907790729; 0.6277880921026566 0.6277880928418448 … 0.6277880928418464 0.6277880921026565; … ; 0.6277880921026573 0.6277880928418437 … 0.6277880928418461 0.6277880921026565; 0.6277880907790726 0.6277880915150561 … 0.6277880915150552 0.6277880907790728])
ComponentVector{Float64}(u = [4.794823646740092 4.794823646660868 … 4.794823646660854 4.794823646740079; 4.794823646138433 4.794823646052611 … 4.794823646052602 4.794823646138415; … ; 4.79482364613842 4.794823646052594 … 4.794823646052609 4.794823646138429; 4.794823646740078 4.794823646660856 … 4.794823646660866 4.794823646740089], v = [0.683828816606854 0.6838288166883293 … 0.6838288166883353 0.68382881660686; 0.6838288172157881 0.6838288173038748 … 0.6838288173038803 0.6838288172157944; … ; 0.6838288172157877 0.6838288173038753 … 0.6838288173038791 0.6838288172157923; 0.6838288166068542 0.6838288166883291 … 0.6838288166883334 0.6838288166068587])
ComponentVector{Float64}(u = [4.376147537542502 4.376147537561973 … 4.376147537561945 4.376147537542476; 4.37614753758229 4.376147537601783 … 4.376147537601757 4.376147537582264; … ; 4.376147537582267 4.376147537601758 … 4.376147537601778 4.376147537582284; 4.3761475375424785 4.37614753756195 … 4.376147537561968 4.376147537542496], v = [0.7442155456344994 0.7442155456148262 … 0.7442155456148402 0.7442155456345139; 0.7442155455942755 0.744215545574584 … 0.7442155455745982 0.7442155455942898; … ; 0.7442155455942754 0.7442155455745847 … 0.7442155455745955 0.7442155455942855; 0.7442155456344998 0.7442155456148258 … 0.7442155456148358 0.7442155456345103])
ComponentVector{Float64}(u = [3.992737706761862 3.9927377067568375 … 3.9927377067568193 3.9927377067618264; 3.9927377067526892 3.992737706747647 … 3.9927377067476204 3.9927377067526497; … ; 3.9927377067527345 3.992737706747685 … 3.992737706747621 3.9927377067526626; 3.992737706761916 3.9927377067568877 … 3.992737706756812 3.9927377067618353], v = [0.8092263137515917 0.8092263137566065 … 0.8092263137566097 0.809226313751596; 0.809226313760795 0.8092263137658333 … 0.8092263137658373 0.8092263137607989; … ; 0.8092263137607878 0.8092263137658271 … 0.8092263137658312 0.8092263137607926; 0.8092263137515826 0.8092263137565969 … 0.8092263137566039 0.8092263137515877])
ComponentVector{Float64}(u = [3.6411995339637357 3.6411995339659864 … 3.641199533966431 3.6411995339643615; 3.6411995339665686 3.6411995339688543 … 3.641199533969334 3.641199533967214; … ; 3.6411995339662977 3.6411995339686287 … 3.6411995339691146 3.6411995339668475; 3.641199533963326 3.641199533965631 … 3.641199533966285 3.6411995339640435], v = [0.8791282259946718 0.8791282259924353 … 0.8791282259923862 0.8791282259946147; 0.8791282259917431 0.8791282259894676 … 0.8791282259894205 0.8791282259916933; … ; 0.87912822599181 0.8791282259895334 … 0.8791282259894957 0.8791282259917834; 0.8791282259947695 0.8791282259925329 … 0.87912822599247 0.8791282259947215])
ComponentVector{Float64}(u = [3.3184626516374083 3.318462651633492 … 3.318462651634393 3.318462651638304; 3.3184626516290088 3.318462651625038 … 3.31846265162587 3.3184626516298255; … ; 3.318462651629592 3.3184626516255853 … 3.318462651625479 3.3184626516295146; 3.3184626516381077 3.3184626516341273 … 3.3184626516338978 3.3184626516378706], v = [0.9541176955360849 0.9541176955400734 … 0.9541176955398962 0.9541176955359175; 0.9541176955446261 0.9541176955486651 … 0.9541176955484849 0.9541176955444545; … ; 0.9541176955446289 0.9541176955486556 … 0.9541176955485343 0.9541176955444928; 0.95411769553608 0.9541176955400528 … 0.9541176955399455 0.9541176955359595])
⋮
ComponentVector{Float64}(u = [0.40457146680306827 0.40460333219358846 … 0.4064008473437194 0.4063730177848023; 0.4045620325019777 0.40459410453963474 … 0.4063972585293337 0.4063679303981866; … ; 0.4027321822026817 0.40273980926353115 … 0.40339860447142106 0.40339986077548146; 0.4027175167889428 0.4027249567816233 … 0.4033748272496873 0.4033762330974605], v = [4.107398046757654 4.107398066151611 … 4.10739972378758 4.1073997258888975; 4.107398029083153 4.107398048488636 … 4.107399704886105 4.107399706844849; … ; 4.107395369527042 4.107395379531009 … 4.107396486835474 4.107396492961877; 4.107395348624709 4.107395358542757 … 4.107396460873292 4.107396467032715])
ComponentVector{Float64}(u = [0.4081934547559677 0.40822534231813146 … 0.41002470097427085 0.40999687129705126; 0.4081840030030577 0.4082160972165091 … 0.410021092422444 0.4099917639592616; … ; 0.4063515461452532 0.4063591828564724 … 0.4070190339415475 0.4070202958863578; 0.4063368606081213 0.40634431014901085 … 0.4069952301503901 0.4069966416750086], v = [4.177179728156893 4.177179725210965 … 4.177179520593629 4.17717952271283; 4.177179728166322 4.177179725228004 … 4.177179521689565 4.177179523880245; … ; 4.1771797074011 4.177179707642746 … 4.177179745065712 4.177179745457011; 4.177179706864676 4.177179707123018 … 4.177179745953349 4.177179746341619])
ComponentVector{Float64}(u = [0.41261342342140866 0.41264533489158306 … 0.414446682696486 0.4144188529205245; 0.41260395282111223 0.4126360709470098 … 0.41444305283121163 0.4144137240391958; … ; 0.4107686815567141 0.4107763286862257 … 0.41143732012944556 0.4114385881715656; 0.41075397429257665 0.41076143414169297 … 0.4114134876641437 0.41141490532491237], v = [4.2457649616324975 4.24576493459708 … 4.245762720590991 4.245762722700343; 4.2457649807402 4.245764953708208 … 4.245762743281204 4.24576274569247; … ; 4.245767809218121 4.245767798920381 … 4.245766680843744 4.245766675035728; 4.2457678306708155 4.245767820500326 … 4.245766710708328 4.245766704858493])
ComponentVector{Float64}(u = [0.4177800198932605 0.4178119570055562 … 0.41961543996093514 0.4195876101172624; 0.4177705290400587 0.4178026728127775 … 0.41961178719555997 0.41958245808954736; … ; 0.41593223431150456 0.41593989263094266 … 0.4166021095219833 0.4166033841234433; 0.4159175037081045 0.4159249746292412 … 0.41657824627137185 0.4165796705330116], v = [4.313093070047199 4.3130930171747695 … 4.313088646246872 4.3130886483067705; 4.313093109677801 4.31309305680437 … 4.3130886921394005 4.313088694747876; … ; 4.313098999098689 4.313098977480828 … 4.313096617667079 4.313096605189858; 4.31309904417259 4.313099022800412 … 4.313096678642618 4.313096666082099])
ComponentVector{Float64}(u = [0.42366147568046697 0.42369343997303305 … 0.42549918766183203 0.4254713577793683; 0.4236519633256922 0.4236841342836557 … 0.42549551058715585 0.4254661811816512; … ; 0.42181045950101753 0.421818129694865 … 0.4224816476075053 0.4224829291797646; 0.4217957041271482 0.4218031867978516 … 0.4224577516980789 0.4224591829744975], v = [4.379162649876516 4.379162569618559 … 4.37915591097657 4.379155912951106; 4.379162711295154 4.379162631031491 … 4.379155981498166 4.379155984282384; … ; 4.3791718495867755 4.379171815955168 … 4.379168137800063 4.379168118236058; 4.379171919730597 4.379171886470045 … 4.379168231778783 4.379168212087555])
ComponentVector{Float64}(u = [0.43026873421612444 0.43030072764915095 … 0.4321089026755225 0.4320810727382023; 0.43025919882227404 0.43029139892598667 … 0.43210519955421284 0.43207586981427465; … ; 0.42841425594865395 0.42842193886963836 … 0.4290868509225688 0.42908813996089756; 0.4283994740276873 0.42840696929157535 … 0.4290629200077648 0.4290643587973966], v = [4.4438793815677124 4.443879271948679 … 4.443870161340195 4.443870163237217; 4.443879466331087 4.443879356701362 … 4.443870258250353 4.443870261237058; … ; 4.443892086109275 4.443892039602925 … 4.443886948856021 4.443886921701647; 4.443892183119494 4.443892137118747 … 4.443887078208684 4.443887050879998])
ComponentVector{Float64}(u = [0.4376578936783838 0.43768991817849656 … 0.4395006840869949 0.4394728541584179; 0.4376483336571419 0.4376805648334521 … 0.43949695312532283 0.43946762309696147; … ; 0.4357997161577822 0.43580741267355483 … 0.4364738149652121 0.436475111996534; 0.435784905874596 0.4357924145906917 … 0.4364498466777881 0.436451293510504], v = [4.507114600331788 4.507114459409854 … 4.507102731548288 4.507102733294315; 4.5071147100502 4.507114569112386 … 4.507102856665246 4.507102859798575; … ; 4.507131049934862 4.507130989675416 … 4.507124388910811 4.50712435363026; 4.507131175649503 4.507131116038868 … 4.507124556030795 4.507124520525908])
ComponentVector{Float64}(u = [0.4458967583762473 0.44592881606646967 … 0.447742350971341 0.4477145210752065; 0.44588717201944444 0.44591943639170517 … 0.4477385902416748 0.4477092599285242; … ; 0.4440346255065029 0.44404233655653497 … 0.4447103325302571 0.4447116381144055; 0.44401978489851324 0.44402730799662776 … 0.44468632429596205 0.44468777973500917], v = [4.568728196779349 4.5687280224157085 … 4.5687134974350565 4.568713498997076; 4.568728333183348 4.568728158798326 … 4.568713652710986 4.568713655978024; … ; 4.568748650685418 4.568748575721969 … 4.568740360120503 4.568740316145087; 4.56874880709069 4.568748732928959 … 4.568740567608652 4.568740523355457])
ComponentVector{Float64}(u = [0.4550785319652183 0.45511062528364815 … 0.4569271340357284 0.45689930420750297; 0.45506891730602195 0.45510121731271924 … 0.4569233413167491 0.4568940107314861; … ; 0.4532121490240078 0.4532198756899387 … 0.4538895843990857 0.453890899180293; 0.4531972758330754 0.4532048143837477 … 0.453865533256639 0.45386699795001056], v = [4.628522120209166 4.628521909947024 … 4.628504380887041 4.6285043822180025; 4.628522285291262 4.628522075001882 … 4.62850456857242 4.628504571948936; … ; 4.628546876711141 4.628546785950384 … 4.628536834933399 4.628536781608083; 4.628547066091697 4.6285469762967155 … 4.6285370857822015 4.628537032121916])This notebook was generated using Literate.jl.