|
| 1 | + |
| 2 | +""" user passes in inverse function, and arg symbols """ |
1 | 3 | struct FunctionCall{F,A} <: SciMLLinearSolveAlgorithm |
2 | 4 | func!::F |
3 | | - argsyms::A |
| 5 | + argnames::A |
4 | 6 |
|
5 | | - function FunctionCall(func!::Function, argsyms::Tuple) |
6 | | - new{typeof(func!), typeof(argsyms)}(func!, argsyms) |
| 7 | + function FunctionCall(func!::Function, argnames::Tuple) |
| 8 | +# @assert hasfield(::LinearCache, argnames) |
| 9 | +# @assert isdefined |
| 10 | + new{typeof(func!), typeof(argnames)}(func!, argnames) |
7 | 11 | end |
8 | 12 | end |
9 | 13 |
|
10 | | -LdivBang2Args() = FunctionCall(ldiv!, (:A, :u)) |
11 | | -LdivBang3Args() = FunctionCall(ldiv!, (:u, :A, :b)) |
12 | | - |
13 | 14 | function (f::FunctionCall)(cache::LinearCache) |
14 | | - @unpack func!, argsyms = f |
15 | | - args = [getproperty(cache,argsym) for argsym in argsyms] |
| 15 | + @unpack func!, argnames = f |
| 16 | + args = [getproperty(cache,argname) for argname in argnames] |
16 | 17 | func!(args...) |
17 | 18 | end |
18 | 19 |
|
19 | 20 | function SciMLBase.solve(cache::LinearCache, alg::FunctionCall, |
20 | 21 | args...; kwargs...) |
21 | 22 | @unpack u, b = cache |
22 | | - copy!(u, b) |
23 | 23 | alg(cache) |
| 24 | + return SciMLBase.build_linear_solution(alg,cache.u,nothing,cache) |
| 25 | +end |
| 26 | + |
| 27 | +## |
24 | 28 |
|
| 29 | +""" apply ldiv!(A, u) """ |
| 30 | +struct ApplyLDivBang2Args <: SciMLLinearSolveAlgorithm end |
| 31 | +function SciMLBase.solve(cache::LinearCache, alg::ApplyLDivBang2Args, |
| 32 | + args...; kwargs...) |
| 33 | + @unpack A, b, u = cache |
| 34 | + copy!(u, b) |
| 35 | + LinearAlgebra.ldiv!(A, u) |
| 36 | + return SciMLBase.build_linear_solution(alg,cache.u,nothing,cache) |
| 37 | +end |
| 38 | + |
| 39 | +""" apply ldiv!(u, A, b) """ |
| 40 | +struct ApplyLDivBang3Args <: SciMLLinearSolveAlgorithm end |
| 41 | +function SciMLBase.solve(cache::LinearCache, alg::ApplyLDivBang3Args, |
| 42 | + args...; kwargs...) |
| 43 | + @unpack A, b, u = cache |
| 44 | + LinearAlgebra.ldiv!(u, A, b) |
25 | 45 | return SciMLBase.build_linear_solution(alg,cache.u,nothing,cache) |
26 | 46 | end |
0 commit comments