Skip to content

Commit ec0a26d

Browse files
committed
.
1 parent 4656361 commit ec0a26d

File tree

6 files changed

+149
-124
lines changed

6 files changed

+149
-124
lines changed

src/bcs/generate_bc_eqs.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ function _boundary_rules(s, orders, x, val)
44

55
args = substitute.(args, (x=>val,))
66

7-
rules = [operation(u)(args...) => (operation(u)(args...), x) for u in s.ū]
7+
rules = [operation(u)(args...) => [operation(u)(args...), x] for u in s.ū]
88

9-
return vcat(rules, vec([(Differential(x)^d)(operation(u)(args...)) => (operation(u)(args...), x) for d in orders[x], u in s.ū]))
9+
return vcat(rules, vec([(Differential(x)^d)(operation(u)(args...)) => [operation(u)(args...), x] for d in orders[x], u in s.ū]))
1010
end
1111

1212
function generate_boundary_matching_rules(s, orders)

src/discretization/generate_finite_difference_rules.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ end
142142
end
143143

144144
@inline function generate_nonlinlap_rules(II, s, derivweights, terms)
145-
rules = [@rule *(~~c, $(Differential(x))(*(~~a, $(Differential(x))(u), ~~b)), ~~d) => cartesian_nonlinear_laplacian(*(a..., b...), II, derivweights, s, x, u) for x in s.x̄, u in s.ū]
145+
rules = [@rule *(~~c, $(Differential(x))(*(~~a, $(Differential(x))(u), ~~b)), ~~d) => *(~~c,cartesian_nonlinear_laplacian(*(a..., b...), II, derivweights, s, x, u), ~~d) for x in s.x̄, u in s.ū]
146146

147147
rules = [@rule $(Differential(x))(*(~~a, $(Differential(x))(u), ~~b)) => cartesian_nonlinear_laplacian(*(a..., b...), II, derivweights, s, x, u) for x in s.x̄, u in s.ū]
148148

@@ -162,6 +162,10 @@ end
162162
@inline function generate_spherical_diffusion_rules(II, s, derivweights, terms)
163163
rules = vec([@rule *(~~a, 1/(r^2), ($(Differential(r))(*(~~c, (r^2), ~~d, $(Differential(r))(u), ~~e))), ~~b) => *(~a..., spherical_diffusion(*(~c..., ~d..., ~e...), II, derivweights, s, r, u), ~b...)
164164
for r in s.x̄, u in s.ū])
165+
166+
rules = vcat(rules, vec([@rule *(~~a, (r^2)^-2, ($(Differential(r))(*(~~c, (r^2), ~~d, $(Differential(r))(u), ~~e))), ~~b) => *(~a..., spherical_diffusion(*(~c..., ~d..., ~e...), II, derivweights, s, r, u), ~b...)
167+
for r in s.x̄, u in s.ū]))
168+
165169
rules = vcat(rules, vec([@rule /(($(Differential(r))(*(~~c, (r^2), ~~d, $(Differential(r))(u), ~~e))), (r^2)) => spherical_diffusion(*(~c..., ~d..., ~e...), II, derivweights, s, r, u)
166170
for r in s.x̄, u in s.ū]))
167171

test/MOL_original.jl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
using ModelingToolkit: operation, istree, arguments, variable
22
import DomainSets
3+
using DiffEqOperators, DiffEqBase, SciMLBase
34

45
# Method of lines discretization scheme
56

67
@enum GridAlign center_align edge_align
78

8-
struct MOLFiniteDifference_origial{T,T2} <: DiffEqBase.AbstractDiscretization
9+
struct MOLFiniteDifference_original{T,T2} <: DiffEqBase.AbstractDiscretization
910
dxs::T
1011
time::T2
1112
upwind_order::Int
@@ -41,7 +42,7 @@ function calculate_weights_spherical_original(order::Int, x0::T, x::AbstractVect
4142
end
4243

4344

44-
function symbolic_discretize_original(pdesys::ModelingToolkit.PDESystem,discretization::DiffEqOperators.MOLFiniteDifference)
45+
function symbolic_discretize_original(pdesys::ModelingToolkit.PDESystem,discretization::MOLFiniteDifference_original)
4546
grid_align = discretization.grid_align
4647
pdeeqs = pdesys.eqs isa Vector ? pdesys.eqs : [pdesys.eqs]
4748
t = discretization.time
@@ -398,11 +399,13 @@ function symbolic_discretize_original(pdesys::ModelingToolkit.PDESystem,discreti
398399
return sys, nothing
399400
else
400401
sys = ODESystem(vcat(alleqs,unique(bceqs)),t,vec(reduce(vcat,vec(alldepvarsdisc))),ps,defaults=Dict(defaults),name=pdesys.name)
402+
@show alleqs
403+
@show bceqs
401404
return sys, tspan
402405
end
403406
end
404407

405-
function discretize_original(pdesys::ModelingToolkit.PDESystem,discretization::DiffEqOperators.MOLFiniteDifference)
408+
function discretize_original(pdesys::ModelingToolkit.PDESystem,discretization::MOLFiniteDifference_original)
406409
sys, tspan = SciMLBase.symbolic_discretize(pdesys,discretization)
407410
if tspan == nothing
408411
return prob = NonlinearProblem(sys, ones(length(sys.states)))

test/pde_systems/MOL_1D_Linear_Diffusion.jl

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ end
231231
discretization_edge = MOLFiniteDifference([x=>dx_],t;grid_align=edge_align, approx_order=6)
232232

233233
# Convert the PDE problem into an ODE problem
234-
for disc [discretization, discretization_edge]
234+
for (j,disc) enumerate([discretization, discretization_edge])
235235
prob = discretize(pdesys,disc)
236236

237237
# Solve ODE problem
@@ -243,7 +243,15 @@ end
243243
x = ((0.0-dx_/2): dx_ : (Float64(π)+dx_/2))[2:end-1]
244244
end
245245
t = sol.t
246-
246+
# Plots
247+
using Plots
248+
anim = @animate for (i,T) in enumerate(t)
249+
exact = u_exact(x, T)
250+
plot(x, exact, seriestype = :scatter,label="Analytic solution")
251+
plot!(x, sol.u[i], label="Numeric solution")
252+
plot!(x, log.(abs.(exact-sol.u[i])), label="Error at t = $(t[i])")
253+
end
254+
gif(anim, "plots/MOL_Linear_Diffusion_1D_Test03a_$disc.gif", fps = 5)
247255
# Test against exact solution
248256
# exact integral based on Neumann BCs
249257
integral_u_exact = t -> sum(sol.u[1] * dx[2]) + 2 * (exp(-t) - 1)
@@ -328,7 +336,8 @@ end
328336
# PDE system
329337
@named pdesys = PDESystem(eq,bcs,domains,[t,x],[u(t,x)])
330338

331-
# Method of lines discretization
339+
# Method of lines discretizationinclusions
340+
332341
dx = 0.01
333342
order = 4
334343
discretization = MOLFiniteDifference([x=>dx],t; approx_order=order)

0 commit comments

Comments
 (0)