| 
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