@@ -292,3 +292,100 @@ prob = SteadyStateProblem(osys, u0, ps)
292292 getsym (prob, [:X , :X2 ])(prob) == [0.1 , 0.2 ]
293293@test getsym (prob, (X, X2))(prob) == getsym (prob, (osys. X, osys. X2))(prob) ==
294294 getsym (prob, (:X , :X2 ))(prob) == (0.1 , 0.2 )
295+
296+ @testset " SCCNonlinearProblem" begin
297+ # TODO : Rewrite this example when the MTK codegen is merged
298+
299+ function fullf! (du, u, p)
300+ du[1 ] = cos (u[2 ]) - u[1 ]
301+ du[2 ] = sin (u[1 ] + u[2 ]) + u[2 ]
302+ du[3 ] = 2 u[4 ] + u[3 ] + p[1 ]
303+ du[4 ] = u[5 ]^ 2 + u[4 ]
304+ du[5 ] = u[3 ]^ 2 + u[5 ]
305+ du[6 ] = u[1 ] + u[2 ] + u[3 ] + u[4 ] + u[5 ] + 2.0 u[6 ] + 2.5 u[7 ] + 1.5 u[8 ]
306+ du[7 ] = u[1 ] + u[2 ] + u[3 ] + 2.0 u[4 ] + u[5 ] + 4.0 u[6 ] - 1.5 u[7 ] + 1.5 u[8 ]
307+ du[8 ] = u[1 ] + 2.0 u[2 ] + 3.0 u[3 ] + 5.0 u[4 ] + 6.0 u[5 ] + u[6 ] - u[7 ] - u[8 ]
308+ end
309+ @variables u[1 : 8 ]= zeros (8 ) [irreducible = true ]
310+ u2 = collect (u)
311+ @parameters p = 1.0
312+ eqs = Any[0 for _ in 1 : 8 ]
313+ fullf! (eqs, u, [p])
314+ @named model = NonlinearSystem (0 .~ eqs, [u... ], [p])
315+ model = complete (model; split = false )
316+
317+ cache = zeros (4 )
318+ cache[1 ] = 1.0
319+
320+ function f1! (du, u, p)
321+ du[1 ] = cos (u[2 ]) - u[1 ]
322+ du[2 ] = sin (u[1 ] + u[2 ]) + u[2 ]
323+ end
324+ explicitfun1 (cache, sols) = nothing
325+
326+ f1! (eqs, u2[1 : 2 ], [p])
327+ @named subsys1 = NonlinearSystem (0 .~ eqs[1 : 2 ], [u2[1 : 2 ]. .. ], [p])
328+ subsys1 = complete (subsys1; split = false )
329+ prob1 = NonlinearProblem (
330+ NonlinearFunction {true, SciMLBase.NoSpecialize} (f1!; sys = subsys1),
331+ zeros (2 ), copy (cache))
332+
333+ function f2! (du, u, p)
334+ du[1 ] = 2 u[2 ] + u[1 ] + p[1 ]
335+ du[2 ] = u[3 ]^ 2 + u[2 ]
336+ du[3 ] = u[1 ]^ 2 + u[3 ]
337+ end
338+ explicitfun2 (cache, sols) = nothing
339+
340+ f2! (eqs, u2[3 : 5 ], [p])
341+ @named subsys2 = NonlinearSystem (0 .~ eqs[1 : 3 ], [u2[3 : 5 ]. .. ], [p])
342+ subsys2 = complete (subsys2; split = false )
343+ prob2 = NonlinearProblem (
344+ NonlinearFunction {true, SciMLBase.NoSpecialize} (f2!; sys = subsys2),
345+ zeros (3 ), copy (cache))
346+
347+ function f3! (du, u, p)
348+ du[1 ] = p[2 ] + 2.0 u[1 ] + 2.5 u[2 ] + 1.5 u[3 ]
349+ du[2 ] = p[3 ] + 4.0 u[1 ] - 1.5 u[2 ] + 1.5 u[3 ]
350+ du[3 ] = p[4 ] + + u[1 ] - u[2 ] - u[3 ]
351+ end
352+ function explicitfun3 (cache, sols)
353+ cache[2 ] = sols[1 ][1 ] + sols[1 ][2 ] + sols[2 ][1 ] + sols[2 ][2 ] + sols[2 ][3 ]
354+ cache[3 ] = sols[1 ][1 ] + sols[1 ][2 ] + sols[2 ][1 ] + 2.0 sols[2 ][2 ] + sols[2 ][3 ]
355+ cache[4 ] = sols[1 ][1 ] + 2.0 sols[1 ][2 ] + 3.0 sols[2 ][1 ] + 5.0 sols[2 ][2 ] +
356+ 6.0 sols[2 ][3 ]
357+ end
358+
359+ @parameters tmpvar[1 : 3 ]
360+ f3! (eqs, u2[6 : 8 ], [p, tmpvar... ])
361+ @named subsys3 = NonlinearSystem (0 .~ eqs[1 : 3 ], [u2[6 : 8 ]. .. ], [p, tmpvar... ])
362+ subsys3 = complete (subsys3; split = false )
363+ prob3 = NonlinearProblem (
364+ NonlinearFunction {true, SciMLBase.NoSpecialize} (f3!; sys = subsys3),
365+ zeros (3 ), copy (cache))
366+
367+ prob = NonlinearProblem (model, [])
368+ sccprob = SciMLBase. SCCNonlinearProblem ([prob1, prob2, prob3],
369+ SciMLBase. Void {Any} .([explicitfun1, explicitfun2, explicitfun3]),
370+ model, copy (cache))
371+
372+ for sym in [u, u... , u[2 ] + u[3 ], p * u[1 ] + u[2 ]]
373+ @test prob[sym] ≈ sccprob[sym]
374+ end
375+
376+ for sym in [p, 2 p + 1 ]
377+ @test prob. ps[sym] ≈ sccprob. ps[sym]
378+ end
379+
380+ for (i, sym) in enumerate ([u[1 ], u[3 ], u[6 ]])
381+ sccprob[sym] = 0.5 i
382+ @test sccprob[sym] ≈ 0.5 i
383+ @test sccprob. probs[i]. u0[1 ] ≈ 0.5 i
384+ end
385+ sccprob. ps[p] = 2.5
386+ @test sccprob. ps[p] ≈ 2.5
387+ @test sccprob. parameter_object[1 ] ≈ 2.5
388+ for scc in sccprob. probs
389+ @test parameter_values (scc)[1 ] ≈ 2.5
390+ end
391+ end
0 commit comments