This project aims to be a collection of modern fortran interfaces to commonly used procedure, for now BLAS and LAPACK. The main goal is to reduce the pain of using such libraries, providing a generic interface to the intrinsic supported types and identifying the optional or reconstructible arguments of a given procedure. The code uses fypp, to generate the interfaces automatically to all supported types and kinds.
program main
use mfi_blas, only: mfi_gemm
use f77_blas, only: f77_gemm
use iso_fortran_env
implicit none
! ... variables and other boilerplate code here ...
! Original interface: type and precision dependent
call cgemm('N','N', N, N, N, alpha, A, N, B, N, beta, C, N)
! Improved F77 interface: still a lot of arguments
call f77_gemm('N','N', N, N, N, alpha, A, N, B, N, beta, C, N)
! Modern fortran interface: less arguments and more readable
call mfi_gemm(A,B,C)
end program
This project supports the Fortran Package Manager. Follow the directions on that page to install FPM if you haven't already.
Add a entry in the "dependencies" section of your project's fpm.toml
# fpm.toml
[ dependencies ]
mfi = { git="https://github.com/14NGiestas/mfi.git", branch="mfi-fpm" }
First get the code, by cloning the repo:
git clone https://github.com/14NGiestas/mfi.git
cd mfi/
Install the fypp using the command:
sudo pip install fypp
Install lapack and blas (use the static versions). This can be tricky, if you run into any problem, please open an issue.
Usually you can do the following:
make
fpm test
By default, the lapack-dev
package (which provides the reference blas) do not provide the i?amin
implementation (among other extensions)
in such cases you can use blas extensions with:
make FYPPFLAGS=-DMFI_EXTENSIONS
fpm test
Or if you have support to such extensions in your blas provider you can:
make FYPPFLAGS="-DMFI_EXTENSIONS -DMFI_LINK_EXTERNAL"
fpm test
which will generate the code linking extensions to the external library
Please note that this project is experimental, errors and mistakes are to be expected.
There four levels of interfaces that can be used:
- original f77: explicit declared original interface.
call cgemm('N','N', N, N, N, alpha, A, N, B, N, beta, C, N)
- improved f77: original argument convention without need of a prefix.
call f77_gemm('N','N', N, N, N, alpha, A, N, B, N, beta, C, N)
- modern interface with prefix:
call mfi_sgemm(A,B,C)
- modern interface:
call mfi_gemm(A,B,C)
If you are searching for a specific interface check the API reference
Most of BLAS level 1 routines can be replaced by intrinsincs and other features in modern fortran.
done | name | description | modern alternative |
---|---|---|---|
π | asum | Sum of vector magnitudes | sum |
π | axpy | Scalar-vector product | a*x + b |
π | copy | Copy vector | x = b |
π | dot | Dot product | dot_product |
π | dotc | Dot product conjugated | |
π | dotu | Dot product unconjugated | |
og77 | sdsdot | Compute the inner product of two vectors with extended precision accumulation. | |
og77 | dsdot | Compute the inner product of two vectors with extended precision accumulation and result. | |
π | nrm2 | Vector 2-norm (Euclidean norm) | norm2 |
π | rot | Plane rotation of points | |
π | rotg | Generate Givens rotation of points | |
π | rotm | Modified Givens plane rotation of points | |
π | rotmg | Generate modified Givens plane rotation of points | |
π | scal | Vector-scalar product | a*x + b |
π | swap | Vector-vector swap |
done? | name | description | modern alternatives | obs |
---|---|---|---|---|
π | iamax | Index of the maximum absolute value element of a vector | maxval, maxloc | |
π | iamin | Index of the minimum absolute value element of a vector | minval, minloc | |
π | lamch | Determines precision machine parameters. | huge, tiny, epsilon | Obs: had to add a parameter so fortran can distinguish between the single and double precision with the same interface. For values of cmach see: lamch |
done? | name | description |
---|---|---|
π | gbmv | Matrix-vector product using a general band matrix |
π | gemv | Matrix-vector product using a general matrix |
π | ger | Rank-1 update of a general matrix |
π | gerc | Rank-1 update of a conjugated general matrix |
π | geru | Rank-1 update of a general matrix, unconjugated |
π | hbmv | Matrix-vector product using a Hermitian band matrix |
π | hemv | Matrix-vector product using a Hermitian matrix |
π | her | Rank-1 update of a Hermitian matrix |
π | her2 | Rank-2 update of a Hermitian matrix |
π | hpmv | Matrix-vector product using a Hermitian packed matrix |
π | hpr | Rank-1 update of a Hermitian packed matrix |
π | hpr2 | Rank-2 update of a Hermitian packed matrix |
π | sbmv | Matrix-vector product using symmetric band matrix |
π | spmv | Matrix-vector product using a symmetric packed matrix |
π | spr | Rank-1 update of a symmetric packed matrix |
π | spr2 | Rank-2 update of a symmetric packed matrix |
π | symv | Matrix-vector product using a symmetric matrix |
π | syr | Rank-1 update of a symmetric matrix |
π | syr2 | Rank-2 update of a symmetric matrix |
π | tbmv | Matrix-vector product using a triangular band matrix |
π | tbsv | Solution of a linear system of equations with a triangular band matrix |
π | tpmv | Matrix-vector product using a triangular packed matrix |
π | tpsv | Solution of a linear system of equations with a triangular packed matrix |
π | trmv | Matrix-vector product using a triangular matrix |
π | trsv | Solution of a linear system of equations with a triangular matrix |
done? | name | description |
---|---|---|
π | gemm | Computes a matrix-matrix product with general matrices. |
π | hemm | Computes a matrix-matrix product where one input matrix is Hermitian and one is general. |
π | herk | Performs a Hermitian rank-k update. |
π | her2k | Performs a Hermitian rank-2k update. |
π | symm | Computes a matrix-matrix product where one input matrix is symmetric and one matrix is general. |
π | syrk | Performs a symmetric rank-k update. |
π | syr2k | Performs a symmetric rank-2k update. |
π | trmm | Computes a matrix-matrix product where one input matrix is triangular and one input matrix is general. |
π | trsm | Solves a triangular matrix equation (forward or backward solve). |
- Lapack is really huge, so I'm going to focus on getting the improved f77 interfaces ready first. Anything I end up using I'm going to implement.
done? | name | description |
---|---|---|
π | pocon | condition number estimate |
done? | name | description |
---|---|---|
π | geqrf | Computes the QR factorization of a general m-by-n matrix. |
π | gerqf | Computes the RQ factorization of a general m-by-n matrix. |
π | getrf | Computes the LU factorization of a general m-by-n matrix. |
π | getri | Computes the inverse of an LU-factored general matrix. |
π | getrs | Solves a system of linear equations with an LU-factored square coefficient matrix, with multiple right-hand sides. |
π | hetrf | Computes the Bunch-Kaufman factorization of a complex Hermitian matrix. |
π | potrf | Computes the Cholesky factorization of a symmetric (Hermitian) positive-definite matrix. |
π | potri | Computes the inverse of a Cholesky-factored symmetric (Hermitian) positive-definite matrix. |
π | potrs | Solves a system of linear equations with a Cholesky-factored symmetric (Hermitian) positive-definite coefficient matrix, with multiple right-hand sides. |
f77 | orgqr | Generates the real orthogonal matrix Q of the QR factorization formed by geqrf. |
f77 | orgrq | Generates the real orthogonal matrix Q of the RQ factorization formed by gerqf. |
f77 | ormqr | Multiplies a real matrix by the orthogonal matrix Q of the QR factorization formed by geqrf. |
f77 | ormrq | Multiplies a real matrix by the orthogonal matrix Q of the RQ factorization formed by gerqf. |
sytrf | Computes the Bunch-Kaufman factorization of a symmetric matrix. | |
trtrs | Solves a system of linear equations with a triangular coefficient matrix, with multiple right-hand sides. | |
f77 | ungqr | Generates the complex unitary matrix Q of the QR factorization formed by geqrf. |
f77 | ungrq | Generates the complex unitary matrix Q of the RQ factorization formed by gerqf. |
f77 | unmqr | Multiplies a complex matrix by the unitary matrix Q of the QR factorization formed by geqrf. |
f77 | unmrq | Multiplies a complex matrix by the unitary matrix Q of the RQ factorization formed by gerqf. |
f77 | org2r | |
f77 | orm2r | |
f77 | ung2r | |
f77 | unm2r | |
f77 | orgr2 | |
f77 | ormr2 | |
f77 | ungr2 | |
f77 | unmr2 |
done? | name | description |
---|---|---|
π | gesvd | Computes the singular value decomposition of a general rectangular matrix. |
π | heevd | Computes all eigenvalues and, optionally, all eigenvectors of a complex Hermitian matrix using divide and conquer algorithm. |
π | hegvd | Computes all eigenvalues and, optionally, all eigenvectors of a complex generalized Hermitian definite eigenproblem using divide and conquer algorithm. |
f77 | heevr | Computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices. |
f77 | heevx | Computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices. |
gebrd | Reduces a general matrix to bidiagonal form. | |
hetrd | Reduces a complex Hermitian matrix to tridiagonal form. | |
orgbr | Generates the real orthogonal matrix Q or PT determined by gebrd. | |
orgtr | Generates the real orthogonal matrix Q determined by sytrd. | |
ormtr | Multiplies a real matrix by the orthogonal matrix Q determined by sytrd. | |
syevd | Computes all eigenvalues and, optionally, all eigenvectors of a real symmetric matrix using divide and conquer algorithm. | |
sygvd | Computes all eigenvalues and, optionally, all eigenvectors of a real generalized symmetric definite eigenproblem using divide and conquer algorithm. | |
sytrd | Reduces a real symmetric matrix to tridiagonal form. | |
ungbr | Generates the complex unitary matrix Q or PT determined by gebrd. | |
ungtr | Generates the complex unitary matrix Q determined by hetrd. | |
unmtr | Multiplies a complex matrix by the unitary matrix Q determined by hetrd. |
done | name | description |
---|---|---|
f77 | gels | least squares using QR/LQ |
f77 | gelst | least squares using QR/LQ with T matrix |
f77 | gelss | least squares using SVD, QR iteration |
f77 | gelsd | least squares using SVD, divide and conquer |
f77 | gelsy | least squares using complete orthogonal factor |
f77 | getsls | least squares using tall-skinny QR/LQ |
f77 | gglse | equality-constrained least squares |
f77 | ggglm | Gauss-Markov linear model |
There are some other auxiliary lapack routines around, that may apear here:
name | Data Types | Description |
---|---|---|
mfi_lartg | s, d, c, z | Generates a plane rotation with real cosine and real/complex sine. |