|
229 | 229 | @test p ≈ 0.0
|
230 | 230 | @test success
|
231 | 231 | end
|
| 232 | + |
| 233 | + @testset "DAEProblem" begin |
| 234 | + function daerhs(du, u, p, t) |
| 235 | + return [u[1] * t + p, u[1]^2 - u[2]^2] |
| 236 | + end |
| 237 | + # unknowns are u[2], p, D(u[1]), D(u[2]). Parameters are u[1], t |
| 238 | + initprob = NonlinearProblem([1.0, 1.0, 1.0, 1.0], [1.0, 0.0]) do x, _p |
| 239 | + u2, p, du1, du2 = x |
| 240 | + u1, t = _p |
| 241 | + return [u1^3 - u2^3, p^2 - 2p + 1, du1 - u1 * t - p, 2u1 * du1 - 2u2 * du2] |
| 242 | + end |
| 243 | + |
| 244 | + update_initializeprob! = function (iprob, integ) |
| 245 | + iprob.p[1] = integ.u[1] |
| 246 | + iprob.p[2] = integ.t |
| 247 | + end |
| 248 | + initprobmap = function (nlsol) |
| 249 | + return [parameter_values(nlsol)[1], nlsol.u[1]] |
| 250 | + end |
| 251 | + initprobpmap = function (_, nlsol) |
| 252 | + return nlsol.u[2] |
| 253 | + end |
| 254 | + initprob_du0map = function (nlsol) |
| 255 | + return nlsol.u[3:4] |
| 256 | + end |
| 257 | + initialization_data = SciMLBase.OverrideInitData( |
| 258 | + initprob, update_initializeprob!, initprobmap, initprobpmap, initprob_du0map) |
| 259 | + fn = DAEFunction(daerhs; initialization_data) |
| 260 | + prob = DAEProblem(fn, [0.0, 0.0], [2.0, 0.0], (0.0, 1.0), 0.0) |
| 261 | + integ = init(prob, DImplicitEuler(); initializealg = NoInit()) |
| 262 | + |
| 263 | + initialization_data2 = SciMLBase.OverrideInitData( |
| 264 | + initprob, update_initializeprob!, initprobmap, initprobpmap) |
| 265 | + fn2 = DAEFunction(daerhs; initialization_data = initialization_data2) |
| 266 | + prob2 = DAEProblem(fn2, [0.0, 0.0], [2.0, 0.0], (0.0, 1.0), 0.0) |
| 267 | + integ2 = init(prob2, DImplicitEuler(); initializealg = NoInit()) |
| 268 | + |
| 269 | + nlsolve_alg = FastShortcutNonlinearPolyalg() |
| 270 | + @testset "Doesn't return `du0` by default" begin |
| 271 | + @test length(SciMLBase.get_initial_values( |
| 272 | + prob, integ, fn, SciMLBase.OverrideInit(), |
| 273 | + Val(false); nlsolve_alg, abstol, reltol)) == 3 |
| 274 | + end |
| 275 | + @testset "`du0 === nothing` if missing `du0map`" begin |
| 276 | + du0, u0, p, success = SciMLBase.get_initial_values( |
| 277 | + prob2, integ2, fn2, SciMLBase.OverrideInit(), Val(false); |
| 278 | + nlsolve_alg, abstol, reltol, return_du0 = true) |
| 279 | + @test du0 === nothing |
| 280 | + @test u0 ≈ [2.0, 2.0] |
| 281 | + @test p ≈ 1.0 |
| 282 | + @test success |
| 283 | + end |
| 284 | + @testset "With `return_du0 = true`" begin |
| 285 | + du0, u0, p, success = SciMLBase.get_initial_values( |
| 286 | + prob, integ, fn, SciMLBase.OverrideInit(), Val(false); |
| 287 | + nlsolve_alg, abstol, reltol, return_du0 = true) |
| 288 | + @test du0 ≈ [1.0, 1.0] |
| 289 | + @test u0 ≈ [2.0, 2.0] |
| 290 | + @test p ≈ 1.0 |
| 291 | + @test success |
| 292 | + end |
| 293 | + end |
232 | 294 | end
|
0 commit comments