Skip to content

Commit 1d8a45f

Browse files
committed
Don't set jacobian prototype if jacobian is not sparse
1 parent 9ab4354 commit 1d8a45f

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

src/Reactor.jl

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,20 @@ function Reactor(domain::T, y0::Array{T1,1}, tspan::Tuple, interfaces::Z=[]; p::
5454
prectmp = ilu(W, τ=tau)
5555
preccache = Ref(prectmp)
5656

57+
if sparsity > 0.8
58+
jac_prototype = J
59+
else
60+
jac_prototype = nothing
61+
end
62+
5763
if (forwardsensitivities || !forwarddiff) && domain isa Union{ConstantTPDomain,ConstantVDomain,ConstantPDomain,ParametrizedTPDomain,ParametrizedVDomain,ParametrizedPDomain,ConstantTVDomain,ParametrizedTConstantVDomain,ConstantTAPhiDomain}
5864
if !forwardsensitivities
5965
odefcn = ODEFunction(dydt; jac=jacy!, paramjac=jacp!)
6066
else
6167
odefcn = ODEFunction(dydt; paramjac=jacp!)
6268
end
6369
else
64-
odefcn = ODEFunction(dydt; jac=jacyforwarddiff!, paramjac=jacpforwarddiff!, jac_prototype=float.(J)) #jac_prototype is not needed/used for Sundials solvers but maybe needed for Julia solvers
70+
odefcn = ODEFunction(dydt; jac=jacyforwarddiff!, paramjac=jacpforwarddiff!, jac_prototype=jac_prototype) #jac_prototype is not needed/used for Sundials solvers but maybe needed for Julia solvers
6571
end
6672
if forwardsensitivities
6773
ode = ODEForwardSensitivityProblem(odefcn, y0, tspan, p)
@@ -78,9 +84,9 @@ function Reactor(domain::T, y0::Array{T1,1}, tspan::Tuple, interfaces::Z=[]; p::
7884
sys = modelingtoolkitize(ode)
7985
jac = eval(ModelingToolkit.generate_jacobian(sys)[2])
8086
if (forwardsensitivities || !forwarddiff) && domain isa Union{ConstantTPDomain,ConstantVDomain,ConstantPDomain,ParametrizedTPDomain,ParametrizedVDomain,ParametrizedPDomain,ConstantTVDomain,ParametrizedTConstantVDomain,ConstantTAPhiDomain}
81-
odefcn = ODEFunction(dydt; jac=jac, paramjac=jacp!)
87+
odefcn = ODEFunction(dydt; jac=jac, paramjac=jacp!, jac_prototype=jac_prototype)
8288
else
83-
odefcn = ODEFunction(dydt; jac=jac, paramjac=jacpforwarddiff!)
89+
odefcn = ODEFunction(dydt; jac=jac, paramjac=jacpforwarddiff!, jac_prototype=jac_prototype)
8490
end
8591
if forwardsensitivities
8692
ode = ODEForwardSensitivityProblem(odefcn, y0, tspan, p)
@@ -217,18 +223,24 @@ function Reactor(domains::T, y0s::W1, tspan::W2, interfaces::Z=Tuple(), ps::X=Sc
217223
prectmp = ilu(W, τ=tau)
218224
preccache = Ref(prectmp)
219225

226+
if sparsity > 0.8
227+
jac_prototype = J
228+
else
229+
jac_prototype = nothing
230+
end
231+
220232
if forwardsensitivities
221-
odefcn = ODEFunction(dydt; paramjac=jacp!)
233+
odefcn = ODEFunction(dydt; paramjac=jacp!, jac_prototype=jac_prototype)
222234
ode = ODEForwardSensitivityProblem(odefcn, y0, tspan, p)
223235
recsolver = Sundials.CVODE_BDF(linear_solver=:GMRES)
224236
if modelingtoolkit
225237
sys = modelingtoolkitize(ode)
226238
jac = eval(ModelingToolkit.generate_jacobian(sys)[2])
227-
odefcn = ODEFunction(dydt; jac=jac, paramjac=jacp!)
239+
odefcn = ODEFunction(dydt; jac=jac, paramjac=jacp!, jac_prototype=jac_prototype)
228240
ode = ODEForwardSensitivityProblem(odefcn, y0, tspan, p)
229241
end
230242
else
231-
odefcn = ODEFunction(dydt; jac=jacy!, paramjac=jacp!, jac_prototype=float.(J))
243+
odefcn = ODEFunction(dydt; jac=jacy!, paramjac=jacp!, jac_prototype=jac_prototype)
232244
ode = ODEProblem(odefcn, y0, tspan, p)
233245
if sparsity > 0.8 #empirical threshold to use preconditioner
234246
recsolver = Sundials.CVODE_BDF(linear_solver=:GMRES, prec=precsundials, psetup=psetupsundials, prec_side=1)
@@ -238,7 +250,7 @@ function Reactor(domains::T, y0s::W1, tspan::W2, interfaces::Z=Tuple(), ps::X=Sc
238250
if modelingtoolkit
239251
sys = modelingtoolkitize(ode)
240252
jac = eval(ModelingToolkit.generate_jacobian(sys)[2])
241-
odefcn = ODEFunction(dydt; jac=jac, paramjac=jacp!)
253+
odefcn = ODEFunction(dydt; jac=jac, paramjac=jacp!, jac_prototype=jac_prototype)
242254
ode = ODEProblem(odefcn, y0, tspan, p)
243255
end
244256
end
@@ -256,7 +268,6 @@ function Reactor(domain::T, y0unlumped::Array{W1,1}, tspan::Tuple, reducedmodelm
256268
dydt(dy::X, y::T, p::V, t::Q) where {X,T,Q,V} = dydtreactor!(dy, y, t, domain, interfaces, reducedmodelmappings, reducedmodelcache, p=p)
257269
jacy!(J::Q2, y::T, p::V, t::Q) where {Q2,T,Q,V} = jacobianyforwarddiff!(J, y, p, t, domain, interfaces, reducedmodelmappings, reducedmodelcache)
258270
jacp!(J::Q2, y::T, p::V, t::Q) where {Q2,T,Q,V} = jacobianpforwarddiff!(J, y, p, t, domain, interfaces, reducedmodelmappings, reducedmodelcache)
259-
260271
#y0 in Y space
261272
y0 = zeros(length(reducedmodelmappings.reducedindexes) + length(reducedmodelmappings.lumpedgroupmapping) + length(domain.thermovariabledict))
262273
@inbounds @views y0[1:end-length(domain.thermovariabledict)-length(reducedmodelmappings.lumpedgroupmapping)] .= y0unlumped[reducedmodelmappings.reducedindexes]
@@ -294,7 +305,13 @@ function Reactor(domain::T, y0unlumped::Array{W1,1}, tspan::Tuple, reducedmodelm
294305
prectmp = ilu(W, τ=tau)
295306
preccache = Ref(prectmp)
296307

297-
odefcn = ODEFunction(dydt; jac=jacy!, paramjac=jacp!, jac_prototype=float.(J)) #jac_prototype is not needed/used for Sundials solvers but maybe needed for Julia solvers
308+
if sparsity > 0.8
309+
jac_prototype = J
310+
else
311+
jac_prototype = nothing
312+
end
313+
314+
odefcn = ODEFunction(dydt; jac=jacy!, paramjac=jacp!, jac_prototype=jac_prototype) #jac_prototype is not needed/used for Sundials solvers but maybe needed for Julia solvers
298315

299316
if forwardsensitivities
300317
ode = ODEForwardSensitivityProblem(odefcn, y0, tspan, p)
@@ -310,7 +327,7 @@ function Reactor(domain::T, y0unlumped::Array{W1,1}, tspan::Tuple, reducedmodelm
310327
if modelingtoolkit
311328
sys = modelingtoolkitize(ode)
312329
jac = eval(ModelingToolkit.generate_jacobian(sys)[2])
313-
odefcn = ODEFunction(dydt; jac=jac, paramjac=jacp!)
330+
odefcn = ODEFunction(dydt; jac=jac, paramjac=jacp!, jac_prototype=jac_prototype)
314331
if forwardsensitivities
315332
ode = ODEForwardSensitivityProblem(odefcn, y0, tspan, p)
316333
else

0 commit comments

Comments
 (0)