The LinearSolversApplication is a thin wrapper for the Eigen linear algebra library.
The application provides the following direct sparse solvers:
Python class | solver_type | Matrix kind | Domain | Dependencies |
---|---|---|---|---|
SparseLUSolver | sparse_lu |
Square | Real | None |
SparseQRSolver | sparse_qr |
Rectangular | Real | None |
SparseCGSolver | sparse_cg |
SPD* | Real | None |
PardisoLLTSolver | pardiso_llt |
SPD* | Real | Intel® MKL |
PardisoLDLTSolver | pardiso_ldlt |
SPD* | Real | Intel® MKL |
PardisoLUSolver | pardiso_lu |
Square | Real | Intel® MKL |
ComplexSparseLUSolver | sparse_lu_complex |
Square | Complex | None |
ComplexPardisoLLTSolver | pardiso_llt_complex |
SPD* | Complex | Intel® MKL |
ComplexPardisoLDLTSolver | pardiso_ldlt_complex |
SPD* | Complex | Intel® MKL |
ComplexPardisoLUSolver | pardiso_lu_complex |
Square | Complex | Intel® MKL |
*SPD = Symmetric Positive Definite
Example:
{
"solver_type": "eigen_sparse_lu"
}
The application provides the following direct solvers for dense systems of equations:
Python class | solver_type | Matrix requirements | Domain | Dependencies |
---|---|---|---|---|
DenseColPivHouseholderQRSolver** | dense_col_piv_householder_qr |
None | Real | None |
DenseHouseholderQRSolver** | dense_householder_qr |
None | Real | None |
DenseLLTSolver** | dense_llt |
SPD* | Real | None |
DensePartialPivLUSolver** | dense_partial_piv_lu |
Invertible | Real | None |
ComplexDenseColPivHouseholderQRSolver | complex_dense_col_piv_householder_qr |
None | Complex | None |
ComplexDenseHouseholderQRSolver | complex_dense_householder_qr |
None | Complex | None |
ComplexDensePartialPivLUSolver | complex_dense_partial_piv_lu |
Invertible | Complex | None |
*SPD = Symmetric Positive Definite
**Can also be used to solve equation systems with multiple right hand sides.
The application provides the following generalized eigensystem Ax=λBx
solver for sparse matrices.
Python class | solver_type | Matrix kind A | Matrix kind B | Domain | Dependencies |
---|---|---|---|---|---|
EigensystemSolver | eigen_eigensystem |
Symmetric | SPD* | Real | None |
SpectraSymGEigsShiftSolver | spectra_sym_g_eigs_shift |
Symmetric | SPD* | Real | None |
FEASTGeneralEigensystemSolver** | feast |
General | General | Real | Intel® MKL |
ComplexFEASTGeneralEigensystemSolver** | feast_complex |
General | General | Complex | Intel® MKL |
*SPD = Symmetric Positive Definite **A special version for symmetric matrices can be triggered in the solver settings.
EigensystemSolver
and SpectraSymGEigsShiftSolver
compute the smallest eigenvalues and corresponding eigenvectors of the system. MKL routines are used automatically if they are available.
SpectraSymGEigsShiftSolver
interfaces a solver from the Spectra library, and has a shift mode that can be used to compute the smallest eigenvalues > shift
.
Example:
{
"solver_type": "spectra_sym_g_eigs_shift",
"number_of_eigenvalues": 3,
"max_iteration": 1000,
"echo_level": 1
}
If the application is compiled with MKL, FEAST 4.0 can be used to solve the generalized eigenvalue problem for real and complex systems (symmetric or unsymmetric). The cmake switch USE_EIGEN_FEAST
must be set to ON
with
-DUSE_EIGEN_FEAST=ON \
Example:
{
"solver_type": "feast",
"symmetric": true,
"number_of_eigenvalues": 3,
"search_lowest_eigenvalues": true,
"e_min" : 0.0,
"e_max" : 0.2
}
-
Set the required definitions for cmake
As any other app:
Windows: in
configure.bat
set KRATOS_APPLICATIONS=%KRATOS_APPLICATIONS%%KRATOS_APP_DIR%\LinearSolversApplication;
Linux: in
configure.sh
add_app ${KRATOS_APP_DIR}/LinearSolversApplication
-
Build Kratos
-
Setup the
ProjectParameters.json
"linear_solver_settings": { "solver_type" : "LinearSolversApplication.sparse_lu" }
-
Run the simulation
In case you have installed MKL (see below), you can also use the Pardiso solvers.
-
Run the MKL setup script before building Kratos:
Windows:
call "C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\mkl\bin\mklvars.bat" intel64 lp64
Linux:
source /opt/intel/mkl/bin/mklvars.sh intel64 lp64
-
Add the following flag to CMake to your configure script:
Windows:
-DUSE_EIGEN_MKL=ON ^
Linux:
-DUSE_EIGEN_MKL=ON \
-
Build Kratos
-
Usage:
Windows:
Copy the required MKL libraries to the Kratos
lib
C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\redist\intel64_win\mkl\mkl_core.dll C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\redist\intel64_win\mkl\mkl_rt.dll C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\redist\intel64_win\mkl\mkl_intel_thread.dll C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\redist\intel64_win\mkl\mkl_def.dll C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\redist\intel64_win\compiler\libiomp5md.dll
or add the folders to your
PATH
/LD_LIBRARY_PATH
variable.Linux:
Set the environment before using MKL
source /opt/intel/mkl/bin/mklvars.sh intel64 lp64
Intel MKL can be installed with apt on Ubuntu. A guide can be found in https://software.intel.com/en-us/articles/installing-intel-free-libs-and-python-apt-repo. For example to install the MKL 2020 version
sudo bash
# <type your user password when prompted. this will put you in a root shell>
# cd to /tmp where this shell has write permission
cd /tmp
# now get the key:
wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
# now install that key
apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
# now remove the public key file exit the root shell
rm GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
# add the repository for mkl only (other packages are not needed here)
sh -c 'echo deb https://apt.repos.intel.com/mkl all main > /etc/apt/sources.list.d/intel-mkl.list'
apt-get update -y
# install specific version of intel-mkl
apt-get install -y intel-mkl-2020.0-088
exit
To enable the MKL environment (needs to be done before build/run) use
source /opt/intel/mkl/bin/mklvars.sh intel64 lp64