|
1 | | -using OrdinaryDiffEq, ModelingToolkit, Test, SparseArrays |
| 1 | +using OrdinaryDiffEq, ModelingToolkit, SparseArrays |
2 | 2 |
|
3 | 3 | N = 3 |
4 | 4 | xyd_brusselator = range(0, stop = 1, length = N) |
@@ -82,3 +82,26 @@ prob = ODEProblem(sys, u0, (0, 11.5), sparse = true, jac = false) |
82 | 82 |
|
83 | 83 | prob = ODEProblem(sys, u0, (0, 11.5), sparse = true, jac = true) |
84 | 84 | @test eltype(prob.f.jac_prototype) == Float32 |
| 85 | + |
| 86 | +@testset "W matrix sparsity" begin |
| 87 | + @parameters g |
| 88 | + @variables x(t) y(t) [state_priority = 10] λ(t) |
| 89 | + eqs = [D(D(x)) ~ λ * x |
| 90 | + D(D(y)) ~ λ * y - g |
| 91 | + x^2 + y^2 ~ 1] |
| 92 | + @mtkbuild pend = ODESystem(eqs, t) |
| 93 | + |
| 94 | + u0 = [x => 1, y => 0] |
| 95 | + prob = ODEProblem(pend, u0, (0, 11.5), [g => 1], guesses = [λ => 1], sparse = true, jac = true) |
| 96 | + jac, jac! = generate_jacobian(pend; expression = Val{false}, sparse = true) |
| 97 | + jac_prototype = ModelingToolkit.jacobian_sparsity(pend) |
| 98 | + W_prototype = ModelingToolkit.W_sparsity(pend) |
| 99 | + @test nnz(W_prototype) == nnz(jac_prototype) + 2 |
| 100 | + |
| 101 | + @test findnz(prob.f.jac_prototype)[1:2] == findnz(W_prototype)[1:2] |
| 102 | + |
| 103 | + u = zeros(5) |
| 104 | + p = prob.p |
| 105 | + t = 0.0 |
| 106 | + @test_throws AssertionError jac!(similar(jac_prototype, Float64), u, p, t) |
| 107 | +end |
0 commit comments