Add alloc-free in-place Tridiagonal
solves and lu!
#50535
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This implements @stevengj's suggestions,
lu!(F::LU{<:Tridiagonal}, ::Tridiagonal)
, which essentially copies the data from the second argument to the first and applies the in-placelu!
. This avoids the allocation ofipiv
(and potentiallydu2
) and is therefore completely allocation-free. Second, this adds anldiv!(::Tridiagonal, VecOrMat)
which combines the in-place lu and the in-place solve. Naturally, this needs to overwrite the tridiagonal matrix, but this seems to be fine for some use cases, see CliMA/ClimaAtmos.jl#715.It seems that this(must have been a measurement artifact), but comes with the advantage of stability due to partial pivoting.ldiv!
is even slightly faster than the Thomas algorithmCloses #46099.