Skip to content

Commit 695b232

Browse files
PDE infrastructure
1 parent 8af8d98 commit 695b232

File tree

9 files changed

+118
-27
lines changed

9 files changed

+118
-27
lines changed

Project.toml

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
1-
name = "ModelingToolkit"
2-
uuid = "961ee093-0014-501f-94e3-6117800e7a78"
3-
authors = ["Chris Rackauckas <accounts@chrisrackauckas.com>"]
4-
version = "0.7.2"
5-
6-
[deps]
7-
DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e"
8-
DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b"
9-
Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b"
10-
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
11-
GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb"
12-
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
13-
MacroTools = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
14-
NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
15-
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
16-
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
17-
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
18-
19-
[compat]
20-
julia = "1"
21-
22-
[extras]
23-
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
24-
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
25-
26-
[targets]
27-
test = ["OrdinaryDiffEq", "Test"]
1+
name = "ModelingToolkit"
2+
uuid = "961ee093-0014-501f-94e3-6117800e7a78"
3+
authors = ["Chris Rackauckas <accounts@chrisrackauckas.com>"]
4+
version = "0.7.2"
5+
6+
[deps]
7+
DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e"
8+
DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b"
9+
Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b"
10+
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
11+
GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb"
12+
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
13+
MacroTools = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
14+
NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
15+
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
16+
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
17+
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
18+
19+
[compat]
20+
julia = "1"
21+
22+
[extras]
23+
DiffEqOperators = "9fdde737-9c7f-55bf-ade8-46b3f136cc48"
24+
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
25+
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
26+
27+
[targets]
28+
test = ["DiffEqOperators", "OrdinaryDiffEq", "Test"]

src/ModelingToolkit.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ include("function_registration.jl")
8989
include("simplify.jl")
9090
include("utils.jl")
9191
include("direct.jl")
92+
include("domains.jl")
9293
include("systems/diffeqs/diffeqsystem.jl")
9394
include("systems/diffeqs/first_order_transform.jl")
9495
include("systems/nonlinear/nonlinear_system.jl")

src/domains.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
abstract type AbstractDomain{T,N} end
2+
3+
struct VarDomainPairing
4+
variables
5+
domain::AbstractDomain
6+
end
7+
Base.:(variable::ModelingToolkit.Operation,domain::AbstractDomain) = VarDomainPairing(variable,domain)
8+
Base.:(variables::NTuple{N,ModelingToolkit.Operation},domain::AbstractDomain) where N = VarDomainPairing(variables,domain)
9+
10+
## Specific Domains
11+
12+
struct IntervalDomain{T} <: AbstractDomain{T,1}
13+
lower::T
14+
upper::T
15+
end
16+
17+
18+
struct ProductDomain{D,T,N} <: AbstractDomain{T,N}
19+
domains::D
20+
end
21+
(args::AbstractDomain{T}...) where T = ProductDomain{typeof(args),T,length(args)}(args)
22+
23+
struct CircleDomain <: AbstractDomain{Float64,2}
24+
polar::Bool
25+
CircleDomain(polar=false) = new(polar)
26+
end

src/equations.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,8 @@ Equation(x() - y(), ModelingToolkit.Constant(0))
4040
Base.:~(lhs::Expression, rhs::Expression) = Equation(lhs, rhs)
4141
Base.:~(lhs::Expression, rhs::Number ) = Equation(lhs, rhs)
4242
Base.:~(lhs::Number , rhs::Expression) = Equation(lhs, rhs)
43+
44+
struct ConstrainedEquation
45+
constraints
46+
eq
47+
end

src/function_registration.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,6 @@ end
5454

5555
# special cases
5656
Base.:^(x::Expression,y::T) where T <: Integer = Operation(Base.:^, Expression[x, y])
57+
58+
@register Base.getindex(x,i)
59+
Base.getindex(x::Operation,i::Int64) = Operation(getindex,[x,i])

src/systems/pde/pdesystem.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
struct PDESystem <: ModelingToolkit.AbstractSystem
2+
eq
3+
bcs
4+
domain
5+
indvars
6+
depvars
7+
end

test/constraints.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using ModelingToolkit, DiffEqOperators, DiffEqBase, LinearAlgebra
2+
3+
# Define some variables
4+
@parameters t x y
5+
@variables u(..)
6+
7+
ConstrainedEquation([x ~ 0,y < 1/2], u(t,x,y) ~ x + y^2)

test/domains.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using ModelingToolkit
2+
3+
@parameters t x
4+
domains = [t IntervalDomain(0.0,1.0),
5+
x IntervalDomain(0.0,1.0)]
6+
7+
@parameters z
8+
z (IntervalDomain(0.0,1.0) IntervalDomain(0.0,1.0))
9+
10+
@parameters y
11+
(x,y) CircleDomain()
12+
@parameters r θ
13+
(r,θ) CircleDomain(true)

test/pde.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using ModelingToolkit, DiffEqOperators, DiffEqBase, LinearAlgebra
2+
3+
# Define some variables
4+
@parameters t x
5+
@variables u(..)
6+
@derivatives Dt'~t
7+
@derivatives Dxx''~x
8+
eq = Dt(u(t,x)) ~ Dxx(u(t,x))
9+
bcs = [u(0,x) ~ - x * (x-1) * sin(x),
10+
u(t,0) ~ 0, u(t,1) ~ 0]
11+
12+
domains = [t IntervalDomain(0.0,1.0),
13+
x IntervalDomain(0.0,1.0)]
14+
15+
pdesys = PDESystem(eq,bcs,domains,[t,x],[u])
16+
discretization = MOLFiniteDifference(0.1)
17+
prob = discretize(pdesys,discretization)
18+
19+
using OrdinaryDiffEq
20+
sol = solve(prob,Tsit5(),saveat=0.1)
21+
22+
#=
23+
using Plots
24+
plot(prob.space,Array(prob.extrapolation*sol[1]))
25+
plot!(prob.space,Array(prob.extrapolation*sol[2]))
26+
plot!(prob.space,Array(prob.extrapolation*sol[3]))
27+
plot!(prob.space,Array(prob.extrapolation*sol[4]))
28+
=#

0 commit comments

Comments
 (0)