block_diag_ilu is a C++ implementation of an incomplete LU factorization, ILU(0).
block_diag_ilu is an open source C++ single header-file implementation of an incomplete LU decomposition routine suitable for diagonally dominant (square) block diagonal matrices with sub- and super diagonals of small magnitude. It is useful for preconditioning linear systems. The use-case in mind is for integrating discretized PDEs of mixed chemical kinetics / diffusion problems where the diffusion process may be accurately considered a mild perturbation.
A picture is worth a thousand words, so if your matrix looks anything like this:
then its LU decomposition then looks like this:
then block_diag_ilu should be able to save quite a bit of time when solving linear systems approximately, e.g. for preconditioning.
The following macros affect the compilation:
|Macro name||Action (when defined)||Default|
|NDEBUG||use std::unique_ptr instead of std::vector as underlying data structure.||undefined|
|BLOCK_DIAG_ILUT_WITH_OPENMP||factorize blocks in parallel. Set the environment variable BLOCK_DIAG_ILU_NUM_THREADS to control number of threads.||undefined|
|BLOCK_DIAG_ILU_WITH_GETRF||Use unblocked (parallell) internal implementation of LAPACK’s dgetrf.||undefined|
setup.py will set these when envinronment variables with those are set to “1”.
The source code is Open Source and is released under the very permissive “simplified (2-clause) BSD license”. See LICENSE.txt for further details.
Contributors are welcome to suggest improvements at https://github.com/chemreac/block_diag_ilu