## lapack

## Table of Content

### About

LAPACK is a free package of linear algebra subroutines written in Fortran that can be used to solve:

- Systems of Linear equations
- Linear least squares problems
- Eigenvalue problems
- Singular value problems
- Associated Computations
- Matrix factorizations (LU, Cholesky, QR, SVD, Schur, generalized Schur)
- Reordering of the Schur factorizations
- Estimating condition numbers
- And much more . . .

LAPACK can be used for the following types of matrices:

- Dense and band (not general sparse matrices)
- Real and complex
- Single and double precision

### Versions and Availability

###### Module Names for **lapack** on qb2

Machine | Version | Module Name |
---|---|---|

None Available | N/A | N/A |

###### ▶ **FIX-ME** FAQ?

### Usage

LAPACK is a binary library, so it is linked to your program by the
compiler during the build process by adding the `-llapack`

flag to the link line:

#### Fortran

$ ifort sample.f -llapack

###### Open Fortran Example?

### Fortran Source

!********************************************** ! THIS EXAMPLE USES THE LAPACK ROUTINE DGESV ! TO SOLVE A SYSTEM OF LINEAR EQUATIONS AX=B ! A = [1, 2, 3; 4, 5, 6; 7, 8 10] ! B = [1, 0; 0, 1; 0, 0] ! ********************************************* program lapack_test integer ipiv(3), info, i, j double precision A(3,3), B(3,2) A(1,1)=1 A(1,2)=2 A(1,3)=3 A(2,1)=4 A(2,2)=5 A(2,3)=6 A(3,1)=7 A(3,2)=8 A(3,3)=10 B(1,1)=1 B(2,1)=0 B(3,1)=0 B(1,2)=0 B(2,2)=1 B(3,2)=0 call dgesv (3,2,A,3,ipiv,B,3,info) if(info .EQ. 0) then do i=1,3 write(*,'(2F8.3)') (B(i,j), j=1,2) enddo endif end program lapack_test

### Build and Execute

$ ifort lapack_test.f90 -llapack $ ./a.out -0.667 -1.333 -0.667 3.667 1.000 -2.000

#### C

The LAPACK routines must be declared with `extern`

,
the routine name must be in lowercase, and it must be followed by
an **_** (i.e. underscore):

extern void dgetrf_(int*, int*, double*, int*, int*, int*);

Be sure when calling the LAPACK routing that all arguments
are *passed by reference*.

**Note:** *Since C matrices are stored in row major order,
and Fortran matrices are stored in column major order, a transpose
is necessary to go from C to Fortran order, and the result transposed
again from Fortran to C order. It is more efficient to change the
array indexing to take this into account. *

$ icc sample.c -llapack

###### Open C Example?

#### C Source

$ cat lapack_test.c /********************************************** * THIS EXAMPLE USES THE LAPACK ROUTINE DGESV * TO SOLVE A SYSTEM OF LINEAR EQUATIONS AX=B * A = [1, 2, 3; 4, 5, 6; 7, 8 10] * B = [1, 0; 0, 1; 0, 0] **********************************************/ #includeextern void dgesv_(int*, int*, double*, int*, int*, double*, int*, int*); int main() { int n, nrhs, lda, ldb, IPIV[3], info, i; double A[3][3], B[2][3]; // Matrices must be transposed A[0][0] = 1; A[1][0] = 2; A[2][0] = 3; A[0][1] = 4; A[1][1] = 5; A[2][1] = 6; A[0][2] = 7; A[1][2] = 8; A[2][2] = 10; B[0][0] = 1; B[0][1] = 0; B[0][2] = 0; B[1][0] = 0; B[1][1] = 1; B[1][2] = 0; n = 3; nrhs = 2; lda = 3; ldb = 3; dgesv_(&n, &nrhs, (double *)A, &lda, IPIV, (double *)B, &ldb, &info); if(info == 0) { for(i = 0; i < 3; i++) printf("%8.3f %8.3f\n", B[0][i], B[1][i]); } }

#### Build and Execute

#### C++

The LAPACK routines must be declared with ```
extern
"C"
```

, the routine name must be in lowercase, and it must
be followed by an **_** (i.e. underscore):

extern "C" void dgetrf_(int*, int*, double*, int*, int*, int*);

Be sure when calling the LAPACK routing that all arguments
are *passed by reference*.

**Note:** *Since C++ matrices are stored in row major order,
and Fortran matrices are stored in column major order, a transpose
is necessary to go from C to Fortran order, and the result transposed
again from Fortran to C order. It is more efficient to change the
array indexing to take this into account.*

$ icpc sample.c -llapack

###### Open C++ Example?

#### C Source

$ cat lapack_test.c /********************************************** * THIS EXAMPLE USES THE LAPACK ROUTINE DGESV * TO SOLVE A SYSTEM OF LINEAR EQUATIONS AX=B * A = [1, 2, 3; 4, 5, 6; 7, 8 10] * B = [1, 0; 0, 1; 0, 0] **********************************************/ #includeextern void dgesv_(int*, int*, double*, int*, int*, double*, int*, int*); int main() { int n, nrhs, lda, ldb, IPIV[3], info, i; double A[3][3], B[2][3]; // Matrices must be transposed A[0][0] = 1; A[1][0] = 2; A[2][0] = 3; A[0][1] = 4; A[1][1] = 5; A[2][1] = 6; A[0][2] = 7; A[1][2] = 8; A[2][2] = 10; B[0][0] = 1; B[0][1] = 0; B[0][2] = 0; B[1][0] = 0; B[1][1] = 1; B[1][2] = 0; n = 3; nrhs = 2; lda = 3; ldb = 3; dgesv_(&n, &nrhs, (double *)A, &lda, IPIV, (double *)B, &ldb, &info); if(info == 0) { for(i = 0; i < 3; i++) printf("%8.3f %8.3f\n", B[0][i], B[1][i]); } }

#### Build and Execute

### Resources

- LAPACK Users Guide
- Individual LAPACK routines are documented in their own man page.
To get more information on a given routine, use the command:
$ man routine_name

For example, to get informantion on

`dgesvd`

:$ man dgesvd

Last modified: June 12 2015 16:24:59.