Skip to content

Commit f69c514

Browse files
committed
Merge branch 'master' into s/array-fixes
2 parents 4e681e8 + efc2e83 commit f69c514

23 files changed

+176
-81
lines changed

Project.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ModelingToolkit"
22
uuid = "961ee093-0014-501f-94e3-6117800e7a78"
33
authors = ["Chris Rackauckas <[email protected]>"]
4-
version = "5.17.3"
4+
version = "5.19.0"
55

66
[deps]
77
AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
@@ -14,6 +14,7 @@ DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b"
1414
Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b"
1515
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
1616
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
17+
DomainSets = "5b8099bc-c8ec-5219-889f-1d9e522a28bf"
1718
IfElse = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173"
1819
JuliaFormatter = "98e50ef6-434e-11e9-1051-2b60c6c9e899"
1920
LabelledArrays = "2ee39098-c373-598a-b85f-a56591580800"
@@ -50,6 +51,7 @@ DiffEqJump = "6.7.5"
5051
DiffRules = "0.1, 1.0"
5152
Distributions = "0.23, 0.24, 0.25"
5253
DocStringExtensions = "0.7, 0.8"
54+
DomainSets = "0.5"
5355
IfElse = "0.1"
5456
JuliaFormatter = "0.12, 0.13"
5557
LabelledArrays = "1.3"

docs/Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78"
33
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
44

55
[compat]
6-
Documenter = "0.24.2"
6+
Documenter = "0.27"

docs/src/systems/PDESystem.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,19 @@ PDESystem
3939

4040
Domains are specifying by saying `indepvar in domain`, where `indepvar` is a
4141
single or a collection of independent variables, and `domain` is the chosen
42-
domain type. Thus forms for the `indepvar` can be like:
42+
domain type. A 2-tuple can be used to indicate an `Interval`.
43+
Thus forms for the `indepvar` can be like:
4344

4445
```julia
45-
t IntervalDomain(0.0,1.0)
46+
t (0.0,1.0)
4647
(t,x) UnitDisk()
4748
[v,w,x,y,z] VectorUnitBall(5)
4849
```
4950

5051
#### Domain Types (WIP)
5152

52-
- `IntervalDomain(a,b)`: Defines the domain of an interval from `a` to `b`
53+
- `Interval(a,b)`: Defines the domain of an interval from `a` to `b` (requires explicit
54+
import from `DomainSets.jl`, but a 2-tuple can be used instead)
5355

5456
## `discretize` and `symbolic_discretize`
5557

docs/src/tutorials/tearing_parallelism.md

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,10 @@ end
2626

2727
function connect_heat(ps...)
2828
eqs = [
29-
0 ~ sum(p->p.Q_flow, ps) # KCL
29+
0 ~ sum(p->p.Q_flow, ps)
3030
]
31-
# KVL
3231
for i in 1:length(ps)-1
33-
push!(eqs, ps[i].T ~ ps[i+1].Q_flow)
32+
push!(eqs, ps[i].T ~ ps[i+1].T)
3433
end
3534

3635
return eqs
@@ -160,7 +159,7 @@ end
160159
eqs = [
161160
D(E) ~ sum(((i, sys),)->getproperty(sys, Symbol(:resistor, i)).h.Q_flow, enumerate(rc_systems))
162161
]
163-
big_rc = ODESystem(eqs, t, [], [], systems=rc_systems, defaults=Dict(E=>0.0))
162+
big_rc = ODESystem(eqs, t, [E], [], systems=rc_systems, defaults=Dict(E=>0.0))
164163
```
165164

166165
Now let's say we want to expose a bit more parallelism via running tearing.
@@ -185,8 +184,9 @@ equations(big_rc)
185184
0 ~ rc1₊resistor1₊p₊i(t) + rc1₊source₊p₊i(t)
186185
rc1₊source₊p₊v(t) ~ rc1₊resistor1₊p₊v(t)
187186
0 ~ rc1₊capacitor1₊p₊i(t) + rc1₊resistor1₊n₊i(t)
187+
rc1₊resistor1₊n₊v(t) ~ rc1₊capacitor1₊p₊v(t)
188188
189-
rc50₊source₊V ~ rc50₊source₊p₊v(t) - (rc50₊source₊n₊v(t))
189+
rc50₊source₊V ~ rc50₊source₊p₊v(t) - rc50₊source₊n₊v(t)
190190
0 ~ rc50₊source₊n₊i(t) + rc50₊source₊p₊i(t)
191191
rc50₊ground₊g₊v(t) ~ 0
192192
Differential(t)(rc50₊heat_capacitor50₊h₊T(t)) ~ rc50₊heat_capacitor50₊h₊Q_flow(t)*(rc50₊heat_capacitor50₊V^-1)*(rc50₊heat_capacitor50₊cp^-1)*(rc50₊heat_capacitor50₊rho^-1)
@@ -199,15 +199,16 @@ redundancies we arrive at 151 equations:
199199
equations(sys)
200200

201201
151-element Vector{Equation}:
202-
Differential(t)(E(t)) ~ rc1₊resistor1₊p₊i(t)*((rc1₊capacitor1₊v(t)) - rc1₊source₊V) + rc4₊resistor4₊p₊i(t)*((rc4₊capacitor4₊v(t)) - rc4₊source₊V) - ((rc10₊capacitor10₊p₊i(t))*(rc10₊source₊V - (rc10₊capacitor10₊v(t)))) - ((rc11₊capacitor11₊p₊i(t))*(rc11₊source₊V - (rc11₊capacitor11₊v(t)))) - ((rc12₊capacitor12₊p₊i(t))*(rc12₊source₊V - (rc12₊capacitor12₊v(t)))) - ((rc13₊capacitor13₊p₊i(t))*(rc13₊source₊V - (rc13₊capacitor13₊v(t)))) - ((rc14₊capacitor14₊p₊i(t))*(rc14₊source₊V - (rc14₊capacitor14₊v(t)))) - ((rc15₊capacitor15₊p₊i(t))*(rc15₊source₊V - (rc15₊capacitor15₊v(t)))) - ((rc16₊capacitor16₊p₊i(t))*(rc16₊source₊V - (rc16₊capacitor16₊v(t)))) - ((rc17₊capacitor17₊p₊i(t))*(rc17₊source₊V - (rc17₊capacitor17₊v(t)))) - ((rc18₊capacitor18₊p₊i(t))*(rc18₊source₊V - (rc18₊capacitor18₊v(t)))) - ((rc19₊capacitor19₊p₊i(t))*(rc19₊source₊V - (rc19₊capacitor19₊v(t)))) - ((rc20₊capacitor20₊p₊i(t))*(rc20₊source₊V - (rc20₊capacitor20₊v(t)))) - ((rc21₊capacitor21₊p₊i(t))*(rc21₊source₊V - (rc21₊capacitor21₊v(t)))) - ((rc22₊capacitor22₊p₊i(t))*(rc22₊source₊V - (rc22₊capacitor22₊v(t)))) - ((rc23₊capacitor23₊p₊i(t))*(rc23₊source₊V - (rc23₊capacitor23₊v(t)))) - ((rc24₊capacitor24₊p₊i(t))*(rc24₊source₊V - (rc24₊capacitor24₊v(t)))) - ((rc25₊capacitor25₊p₊i(t))*(rc25₊source₊V - (rc25₊capacitor25₊v(t)))) - ((rc26₊capacitor26₊p₊i(t))*(rc26₊source₊V - (rc26₊capacitor26₊v(t)))) - ((rc27₊capacitor27₊p₊i(t))*(rc27₊source₊V - (rc27₊capacitor27₊v(t)))) - ((rc28₊capacitor28₊p₊i(t))*(rc28₊source₊V - (rc28₊capacitor28₊v(t)))) - ((rc29₊capacitor29₊p₊i(t))*(rc29₊source₊V - (rc29₊capacitor29₊v(t)))) - ((rc2₊capacitor2₊p₊i(t))*(rc2₊source₊V - (rc2₊capacitor2₊v(t)))) - ((rc30₊capacitor30₊p₊i(t))*(rc30₊source₊V - (rc30₊capacitor30₊v(t)))) - ((rc31₊capacitor31₊p₊i(t))*(rc31₊source₊V - (rc31₊capacitor31₊v(t)))) - ((rc32₊capacitor32₊p₊i(t))*(rc32₊source₊V - (rc32₊capacitor32₊v(t)))) - ((rc33₊capacitor33₊p₊i(t))*(rc33₊source₊V - (rc33₊capacitor33₊v(t)))) - ((rc34₊capacitor34₊p₊i(t))*(rc34₊source₊V - (rc34₊capacitor34₊v(t)))) - ((rc35₊capacitor35₊p₊i(t))*(rc35₊source₊V - (rc35₊capacitor35₊v(t)))) - ((rc36₊capacitor36₊p₊i(t))*(rc36₊source₊V - (rc36₊capacitor36₊v(t)))) - ((rc37₊capacitor37₊p₊i(t))*(rc37₊source₊V - (rc37₊capacitor37₊v(t)))) - ((rc38₊capacitor38₊p₊i(t))*(rc38₊source₊V - (rc38₊capacitor38₊v(t)))) - ((rc39₊capacitor39₊p₊i(t))*(rc39₊source₊V - (rc39₊capacitor39₊v(t)))) - ((rc3₊capacitor3₊p₊i(t))*(rc3₊source₊V - (rc3₊capacitor3₊v(t)))) - ((rc40₊capacitor40₊p₊i(t))*(rc40₊source₊V - (rc40₊capacitor40₊v(t)))) - ((rc41₊capacitor41₊p₊i(t))*(rc41₊source₊V - (rc41₊capacitor41₊v(t)))) - ((rc42₊capacitor42₊p₊i(t))*(rc42₊source₊V - (rc42₊capacitor42₊v(t)))) - ((rc43₊capacitor43₊p₊i(t))*(rc43₊source₊V - (rc43₊capacitor43₊v(t)))) - ((rc44₊capacitor44₊p₊i(t))*(rc44₊source₊V - (rc44₊capacitor44₊v(t)))) - ((rc45₊capacitor45₊p₊i(t))*(rc45₊source₊V - (rc45₊capacitor45₊v(t)))) - ((rc46₊capacitor46₊p₊i(t))*(rc46₊source₊V - (rc46₊capacitor46₊v(t)))) - ((rc47₊capacitor47₊p₊i(t))*(rc47₊source₊V - (rc47₊capacitor47₊v(t)))) - ((rc48₊capacitor48₊p₊i(t))*(rc48₊source₊V - (rc48₊capacitor48₊v(t)))) - ((rc49₊capacitor49₊p₊i(t))*(rc49₊source₊V - (rc49₊capacitor49₊v(t)))) - ((rc50₊capacitor50₊p₊i(t))*(rc50₊source₊V - (rc50₊capacitor50₊v(t)))) - ((rc5₊capacitor5₊p₊i(t))*(rc5₊source₊V - (rc5₊capacitor5₊v(t)))) - ((rc6₊capacitor6₊p₊i(t))*(rc6₊source₊V - (rc6₊capacitor6₊v(t)))) - ((rc7₊capacitor7₊p₊i(t))*(rc7₊source₊V - (rc7₊capacitor7₊v(t)))) - ((rc8₊capacitor8₊p₊i(t))*(rc8₊source₊V - (rc8₊capacitor8₊v(t)))) - ((rc9₊capacitor9₊p₊i(t))*(rc9₊source₊V - (rc9₊capacitor9₊v(t))))
203-
0 ~ rc1₊resistor1₊R*rc1₊resistor1₊p₊i(t)*(1 + (rc1₊resistor1₊alpha*((-rc1₊resistor1₊TAmbient) - ((rc1₊resistor1₊p₊i(t))*((rc1₊capacitor1₊v(t)) - rc1₊source₊V))))) + rc1₊capacitor1₊v(t) - rc1₊source₊V
202+
Differential(t)(E(t)) ~ -rc10₊capacitor10₊p₊i(t)*(rc10₊source₊V - rc10₊capacitor10₊v(t)) - (rc11₊capacitor11₊p₊i(t)*(rc11₊source₊V - rc11₊capacitor11₊v(t))) - (rc12₊capacitor12₊p₊i(t)*(rc12₊source₊V - rc12₊capacitor12₊v(t))) - (rc13₊capacitor13₊p₊i(t)*(rc13₊source₊V - rc13₊capacitor13₊v(t))) - (rc14₊capacitor14₊p₊i(t)*(rc14₊source₊V - rc14₊capacitor14₊v(t))) - (rc15₊capacitor15₊p₊i(t)*(rc15₊source₊V - rc15₊capacitor15₊v(t))) - (rc16₊capacitor16₊p₊i(t)*(rc16₊source₊V - rc16₊capacitor16₊v(t))) - (rc17₊capacitor17₊p₊i(t)*(rc17₊source₊V - rc17₊capacitor17₊v(t))) - (rc18₊capacitor18₊p₊i(t)*(rc18₊source₊V - rc18₊capacitor18₊v(t))) - (rc19₊capacitor19₊p₊i(t)*(rc19₊source₊V - rc19₊capacitor19₊v(t))) - (rc1₊resistor1₊p₊i(t)*(rc1₊source₊V - rc1₊capacitor1₊v(t))) - (rc20₊capacitor20₊p₊i(t)*(rc20₊source₊V - rc20₊capacitor20₊v(t))) - (rc21₊capacitor21₊p₊i(t)*(rc21₊source₊V - rc21₊capacitor21₊v(t))) - (rc22₊capacitor22₊p₊i(t)*(rc22₊source₊V - rc22₊capacitor22₊v(t))) - (rc23₊capacitor23₊p₊i(t)*(rc23₊source₊V - rc23₊capacitor23₊v(t))) - (rc24₊capacitor24₊p₊i(t)*(rc24₊source₊V - rc24₊capacitor24₊v(t))) - (rc25₊capacitor25₊p₊i(t)*(rc25₊source₊V - rc25₊capacitor25₊v(t))) - (rc26₊capacitor26₊p₊i(t)*(rc26₊source₊V - rc26₊capacitor26₊v(t))) - (rc27₊capacitor27₊p₊i(t)*(rc27₊source₊V - rc27₊capacitor27₊v(t))) - (rc28₊capacitor28₊p₊i(t)*(rc28₊source₊V - rc28₊capacitor28₊v(t))) - (rc29₊capacitor29₊p₊i(t)*(rc29₊source₊V - rc29₊capacitor29₊v(t))) - (rc2₊capacitor2₊p₊i(t)*(rc2₊source₊V - rc2₊capacitor2₊v(t))) - (rc30₊capacitor30₊p₊i(t)*(rc30₊source₊V - rc30₊capacitor30₊v(t))) - (rc31₊capacitor31₊p₊i(t)*(rc31₊source₊V - rc31₊capacitor31₊v(t))) - (rc32₊capacitor32₊p₊i(t)*(rc32₊source₊V - rc32₊capacitor32₊v(t))) - (rc33₊capacitor33₊p₊i(t)*(rc33₊source₊V - rc33₊capacitor33₊v(t))) - (rc34₊capacitor34₊p₊i(t)*(rc34₊source₊V - rc34₊capacitor34₊v(t))) - (rc35₊capacitor35₊p₊i(t)*(rc35₊source₊V - rc35₊capacitor35₊v(t))) - (rc36₊capacitor36₊p₊i(t)*(rc36₊source₊V - rc36₊capacitor36₊v(t))) - (rc37₊capacitor37₊p₊i(t)*(rc37₊source₊V - rc37₊capacitor37₊v(t))) - (rc38₊capacitor38₊p₊i(t)*(rc38₊source₊V - rc38₊capacitor38₊v(t))) - (rc39₊capacitor39₊p₊i(t)*(rc39₊source₊V - rc39₊capacitor39₊v(t))) - (rc3₊capacitor3₊p₊i(t)*(rc3₊source₊V - rc3₊capacitor3₊v(t))) - (rc40₊capacitor40₊p₊i(t)*(rc40₊source₊V - rc40₊capacitor40₊v(t))) - (rc41₊capacitor41₊p₊i(t)*(rc41₊source₊V - rc41₊capacitor41₊v(t))) - (rc42₊capacitor42₊p₊i(t)*(rc42₊source₊V - rc42₊capacitor42₊v(t))) - (rc43₊capacitor43₊p₊i(t)*(rc43₊source₊V - rc43₊capacitor43₊v(t))) - (rc44₊capacitor44₊p₊i(t)*(rc44₊source₊V - rc44₊capacitor44₊v(t))) - (rc45₊capacitor45₊p₊i(t)*(rc45₊source₊V - rc45₊capacitor45₊v(t))) - (rc46₊capacitor46₊p₊i(t)*(rc46₊source₊V - rc46₊capacitor46₊v(t))) - (rc47₊capacitor47₊p₊i(t)*(rc47₊source₊V - rc47₊capacitor47₊v(t))) - (rc48₊capacitor48₊p₊i(t)*(rc48₊source₊V - rc48₊capacitor48₊v(t))) - (rc49₊capacitor49₊p₊i(t)*(rc49₊source₊V - rc49₊capacitor49₊v(t))) - (rc4₊resistor4₊p₊i(t)*(rc4₊source₊V - rc4₊capacitor4₊v(t))) - (rc50₊capacitor50₊p₊i(t)*(rc50₊source₊V - rc50₊capacitor50₊v(t))) - (rc5₊capacitor5₊p₊i(t)*(rc5₊source₊V - rc5₊capacitor5₊v(t))) - (rc6₊capacitor6₊p₊i(t)*(rc6₊source₊V - rc6₊capacitor6₊v(t))) - (rc7₊capacitor7₊p₊i(t)*(rc7₊source₊V - rc7₊capacitor7₊v(t))) - (rc8₊capacitor8₊p₊i(t)*(rc8₊source₊V - rc8₊capacitor8₊v(t))) - (rc9₊capacitor9₊p₊i(t)*(rc9₊source₊V - rc9₊capacitor9₊v(t)))
203+
0 ~ rc1₊capacitor1₊v(t) + rc1₊resistor1₊R*rc1₊resistor1₊p₊i(t)*(1 + rc1₊resistor1₊alpha*(rc1₊heat_capacitor1₊h₊T(t) - rc1₊resistor1₊TAmbient)) - rc1₊source₊V
204204
Differential(t)(rc1₊capacitor1₊v(t)) ~ rc1₊resistor1₊p₊i(t)*(rc1₊capacitor1₊C^-1)
205-
Differential(t)(rc1₊heat_capacitor1₊h₊T(t)) ~ -rc1₊resistor1₊p₊i(t)*(rc1₊heat_capacitor1₊V^-1)*(rc1₊heat_capacitor1₊cp^-1)*(rc1₊heat_capacitor1₊rho^-1)*((rc1₊capacitor1₊v(t)) - rc1₊source₊V)
205+
Differential(t)(rc1₊heat_capacitor1₊h₊T(t)) ~ rc1₊resistor1₊p₊i(t)*(rc1₊heat_capacitor1₊V^-1)*(rc1₊heat_capacitor1₊cp^-1)*(rc1₊heat_capacitor1₊rho^-1)*(rc1₊source₊V - rc1₊capacitor1₊v(t))
206+
0 ~ rc2₊resistor2₊R*rc2₊capacitor2₊p₊i(t)*(1 + rc2₊resistor2₊alpha*(rc2₊heat_capacitor2₊h₊T(t) - rc2₊resistor2₊TAmbient)) + rc2₊capacitor2₊v(t) - rc2₊source₊V
206207
207-
Differential(t)(rc49₊heat_capacitor49₊h₊T(t)) ~ rc49₊capacitor49₊p₊i(t)*(rc49₊heat_capacitor49₊V^-1)*(rc49₊heat_capacitor49₊cp^-1)*(rc49₊heat_capacitor49₊rho^-1)*(rc49₊source₊V - (rc49₊capacitor49₊v(t)))
208-
0 ~ rc50₊resistor50₊R*rc50₊capacitor50₊p₊i(t)*(1 + (rc50₊resistor50₊alpha*(((rc50₊capacitor50₊p₊i(t))*(rc50₊source₊V - (rc50₊capacitor50₊v(t)))) - rc50₊resistor50₊TAmbient))) - (rc50₊source₊V - (rc50₊capacitor50₊v(t)))
208+
Differential(t)(rc49₊heat_capacitor49₊h₊T(t)) ~ rc49₊capacitor49₊p₊i(t)*(rc49₊heat_capacitor49₊V^-1)*(rc49₊heat_capacitor49₊cp^-1)*(rc49₊heat_capacitor49₊rho^-1)*(rc49₊source₊V - rc49₊capacitor49₊v(t))
209+
0 ~ rc50₊capacitor50₊v(t) + rc50₊resistor50₊R*rc50₊capacitor50₊p₊i(t)*(1 + rc50₊resistor50₊alpha*(rc50₊heat_capacitor50₊h₊T(t) - rc50₊resistor50₊TAmbient)) - rc50₊source₊V
209210
Differential(t)(rc50₊capacitor50₊v(t)) ~ rc50₊capacitor50₊p₊i(t)*(rc50₊capacitor50₊C^-1)
210-
Differential(t)(rc50₊heat_capacitor50₊h₊T(t)) ~ rc50₊capacitor50₊p₊i(t)*(rc50₊heat_capacitor50₊V^-1)*(rc50₊heat_capacitor50₊cp^-1)*(rc50₊heat_capacitor50₊rho^-1)*(rc50₊source₊V - (rc50₊capacitor50₊v(t)))
211+
Differential(t)(rc50₊heat_capacitor50₊h₊T(t)) ~ rc50₊capacitor50₊p₊i(t)*(rc50₊heat_capacitor50₊V^-1)*(rc50₊heat_capacitor50₊cp^-1)*(rc50₊heat_capacitor50₊rho^-1)*(rc50₊source₊V - rc50₊capacitor50₊v(t))
211212
```
212213

213214
That's not all though. In addition, the tearing process has turned the sets of

src/ModelingToolkit.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,6 @@ export runge_kutta_discretize
158158
export PDESystem
159159
export Reaction, ReactionSystem, ismassaction, oderatelaw, jumpratelaw
160160
export Differential, expand_derivatives, @derivatives
161-
export IntervalDomain, ProductDomain, , CircleDomain
162161
export Equation, ConstrainedEquation
163162
export Term, Sym
164163
export SymScope, LocalScope, ParentScope, GlobalScope

src/domains.jl

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,17 @@
1-
abstract type AbstractDomain{T,N} end
1+
import DomainSets: Interval, Ball, infimum, supremum
22

3-
struct VarDomainPairing
4-
variables
5-
domain::AbstractDomain
6-
end
7-
Base.:(variable::ModelingToolkit.Num,domain::AbstractDomain) = VarDomainPairing(value(variable),domain)
8-
Base.:(variables::NTuple{N,ModelingToolkit.Num},domain::AbstractDomain) where N = VarDomainPairing(value.(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)
3+
@deprecate IntervalDomain(a,b) Interval(a,b)
4+
@deprecate CircleDomain() Ball()
225

23-
struct CircleDomain <: AbstractDomain{Float64,2}
24-
polar::Bool
25-
CircleDomain(polar=false) = new(polar)
6+
# type piracy on Interval for downstream compatibility to be reverted once upgrade is complete
7+
function Base.getproperty(domain::Interval, sym::Symbol)
8+
if sym === :lower
9+
@warn "domain.lower is deprecated, use infimum(domain) instead"
10+
return infimum(domain)
11+
elseif sym === :upper
12+
@warn "domain.upper is deprecated, use supremum(domain) instead"
13+
return supremum(domain)
14+
else
15+
return getfield(domain, sym)
16+
end
2617
end

src/systems/control/controlsystem.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ struct ControlSystem <: AbstractControlSystem
6060
ps::Vector
6161
observed::Vector{Equation}
6262
"""
63-
Name: the name of the system
63+
Name: the name of the system. These are required to have unique names.
6464
"""
6565
name::Symbol
6666
"""
@@ -84,6 +84,10 @@ function ControlSystem(loss, deqs::AbstractVector{<:Equation}, iv, dvs, controls
8484
if !(isempty(default_u0) && isempty(default_p))
8585
Base.depwarn("`default_u0` and `default_p` are deprecated. Use `defaults` instead.", :ControlSystem, force=true)
8686
end
87+
sysnames = nameof.(systems)
88+
if length(unique(sysnames)) != length(sysnames)
89+
throw(ArgumentError("System names must be unique."))
90+
end
8791
iv′ = value(iv)
8892
dvs′ = value.(dvs)
8993
controls′ = value.(controls)

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ end
1919

2020
function calculate_jacobian(sys::AbstractODESystem;
2121
sparse=false, simplify=false)
22-
isempty(get_jac(sys)[]) || return get_jac(sys)[] # use cached Jacobian, if possible
22+
cache = get_jac(sys)[]
23+
if cache isa Tuple && cache[2] == (sparse, simplify)
24+
return cache[1]
25+
end
2326
rhs = [eq.rhs for eq equations(sys)]
2427

2528
iv = get_iv(sys)
@@ -31,7 +34,7 @@ function calculate_jacobian(sys::AbstractODESystem;
3134
jac = jacobian(rhs, dvs, simplify=simplify)
3235
end
3336

34-
get_jac(sys)[] = jac # cache Jacobian
37+
get_jac(sys)[] = jac, (sparse, simplify) # cache Jacobian
3538
return jac
3639
end
3740

@@ -109,9 +112,11 @@ function calculate_massmatrix(sys::AbstractODESystem; simplify=false)
109112
eqs = equations(sys)
110113
dvs = states(sys)
111114
M = zeros(length(eqs),length(eqs))
115+
state2idx = Dict(s => i for (i, s) in enumerate(dvs))
112116
for (i,eq) in enumerate(eqs)
113117
if eq.lhs isa Term && operation(eq.lhs) isa Differential
114-
j = findfirst(x->isequal(tosymbol(x),tosymbol(var_from_nested_derivative(eq.lhs)[1])),dvs)
118+
st = var_from_nested_derivative(eq.lhs)[1]
119+
j = state2idx[st]
115120
M[i,j] = 1
116121
else
117122
_iszero(eq.lhs) || error("Only semi-explicit constant mass matrices are currently supported. Faulty equation: $eq.")
@@ -215,13 +220,22 @@ function DiffEqBase.ODEFunction{iip}(sys::AbstractODESystem, dvs = states(sys),
215220
end
216221
end
217222

218-
uElType = eltype(u0)
223+
jac_prototype = if sparse
224+
uElType = u0 === nothing ? Float64 : eltype(u0)
225+
if jac
226+
similar(calculate_jacobian(sys, sparse=sparse), uElType)
227+
else
228+
similar(jacobian_sparsity(sys), uElType)
229+
end
230+
else
231+
nothing
232+
end
219233
ODEFunction{iip}(
220234
f,
221235
jac = _jac === nothing ? nothing : _jac,
222236
tgrad = _tgrad === nothing ? nothing : _tgrad,
223237
mass_matrix = _M,
224-
jac_prototype = (!isnothing(u0) && sparse) ? (!jac ? similar(jacobian_sparsity(sys),uElType) : SparseArrays.sparse(similar(get_jac(sys)[],uElType))) : nothing,
238+
jac_prototype = jac_prototype,
225239
syms = Symbol.(states(sys)),
226240
indepsym = Symbol(independent_variable(sys)),
227241
observed = observedfun,

src/systems/diffeqs/sdesystem.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ struct SDESystem <: AbstractODESystem
6363
"""
6464
name::Symbol
6565
"""
66-
Systems: the internal systems
66+
Systems: the internal systems. These are required to have unique names.
6767
"""
6868
systems::Vector{SDESystem}
6969
"""
@@ -89,7 +89,10 @@ function SDESystem(deqs::AbstractVector{<:Equation}, neqs, iv, dvs, ps;
8989
iv′ = value(iv)
9090
dvs′ = value.(dvs)
9191
ps′ = value.(ps)
92-
92+
sysnames = nameof.(systems)
93+
if length(unique(sysnames)) != length(sysnames)
94+
throw(ArgumentError("System names must be unique."))
95+
end
9396
if !(isempty(default_u0) && isempty(default_p))
9497
Base.depwarn("`default_u0` and `default_p` are deprecated. Use `defaults` instead.", :SDESystem, force=true)
9598
end

0 commit comments

Comments
 (0)