Skip to content

Commit 18a22ef

Browse files
fix: remake initialization problem during DAE initialization
1 parent 46e3153 commit 18a22ef

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
4242
SparseDiffTools = "47a9eef4-7e08-11e9-0b38-333d64bd3804"
4343
StaticArrayInterface = "0d7ed370-da01-4f52-bd93-41d350b8b718"
4444
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
45+
SymbolicIndexingInterface = "2efcf032-c050-4f8e-a9bb-153293bab1f5"
4546
TruncatedStacktraces = "781d530d-4396-4725-bb49-402e4bee1e77"
4647

4748
[compat]
@@ -84,6 +85,7 @@ SparseArrays = "1.9"
8485
SparseDiffTools = "2.3"
8586
StaticArrayInterface = "1.2"
8687
StaticArrays = "1.0"
88+
SymbolicIndexingInterface = "0.3.16"
8789
TruncatedStacktraces = "1.2"
8890
julia = "1.10"
8991

src/OrdinaryDiffEq.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ using ExponentialUtilities
6464

6565
using NonlinearSolve
6666

67+
using SymbolicIndexingInterface
68+
6769
# Required by temporary fix in not in-place methods with 12+ broadcasts
6870
# `MVector` is used by Nordsieck forms
6971
import StaticArrays: SArray, MVector, SVector, @SVector, StaticArray, MMatrix, SA

src/initialize_dae.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,16 @@ end
134134
function _initialize_dae!(integrator, prob::Union{ODEProblem, DAEProblem},
135135
alg::OverrideInit, isinplace::Union{Val{true}, Val{false}})
136136
initializeprob = prob.f.initializeprob
137-
137+
if initializeprob.f.sys !== nothing && prob.f.sys !== nothing
138+
initu0vars = variable_symbols(initializeprob)
139+
initu0order = variable_index.((initializeprob,), initu0vars)
140+
# Variable symbols are not guaranteed to be in order
141+
invpermute!(initu0vars, initu0order)
142+
initu0 = getu(prob.f.initializeprob, initu0vars)(prob)
143+
initp = remake_buffer(initializeprob, parameter_values(initializeprob),
144+
Dict(sym => getu(prob, sym)(prob) for sym in parameter_symbols(initializeprob)))
145+
initializeprob = remake(initializeprob; u0 = initu0, p = initp)
146+
end
138147
# If it doesn't have autodiff, assume it comes from symbolic system like ModelingToolkit
139148
# Since then it's the case of not a DAE but has initializeprob
140149
# In which case, it should be differentiable

0 commit comments

Comments
 (0)