Fortran: LAPACK
<< zur Fortran-Startseite | |
< FGSL | OpenMP > |
Allgemeines
[Bearbeiten]LAPACK steht für "Linear Algebra Package". LAPACK ist eine Bibliothek zwecks Lösung von
- linearen Gleichungssystemen
- LLS-Aufgaben
- Eigenwertproblemen
- Singulärwertproblemen
LAPACK ist in FORTRAN 77 geschrieben und nutzt weitgehend Funktionen von BLAS Level 3. Falls keine für einen bestimmten Prozessor optimierte Version von BLAS, z.B. ATLAS, bereits installiert ist, kann LAPACK mit der eigenen BLAS-Implementierung kompiliert werden. Aus FORTRAN 77 resultierende Namensbeschränkung auf eine maximale Länge von 6 Zeichen führt zu sehr kryptischen Unterprogrammbezeichnungen, z.B.
D | G | E | T | R | F | |
Zeichenposition: | D1 | M1 | M2 | O1 | O2 | O3 |
Erläuterung der Zeichenpositionen:
D1 | Datentyp:
| ||||||||||||
M1, M2 | Matrixtyp, z.B.
| ||||||||||||
O1, O2, (O3) | Operation, z.B.
|
Eine detailliertere und umfassendere Beschreibung des Funktionsumfanges und der Anwendungsmöglichkeiten der LAPACK-Bibliothek bietet der LAPACK Users' Guide. Die einzelnen Subroutinen inklusive Unterprogrammparameter sind zudem auch in den LAPACK-Sourcecode-Dateien ausführlich dokumentiert.
Beispiel: Lösen eines einfachen Gleichungssystems
[Bearbeiten]Gegeben ist folgendes Gleichungssystem:
bzw. in Matrixschreibweise:
Gesucht sind die Unbekannten x und y:
Fortran 90/95-Code (free source form) |
program bsp implicit none integer :: info real, dimension(2,2) :: a = reshape ( (/2.,3.,1.,1./), (/2,2/) ) real, dimension(2) :: b = (/5., 6./), ipiv ! SUBROUTINE SGESV(N, NRHS, A, LDA, IPIV, B, LDB, INFO) ! s ... real, ge ... general matrix type, sv ... solver call sgesv(2, 1, a, 2, ipiv, b, 2, info) write(*,*) "Lösung (x, y): ", b if(info == 0) then write(*,*) "Ergebnis OK" else write(*,*) "Ergebnis NOK" end if ! Ausgabe: Lösung (x, y): 1.000000 3.000000 ! Ausgabe: Ergebnis OK end program bsp |
Kompilieren, Linken:
gfortran bsp.f95 -llapack -lblas
Beispiel: Inverse Matrix
[Bearbeiten]Gegeben ist eine 3x3-Matrix
die invertiert werden soll. Die Zahlenwerte dieser Matrix A entsprechen einem Beispiel aus Bartsch: Mathematische Formeln, 21. Auflage, VEB Fachbuchverlag Leipzig, 1986, Seite 109, ebenfalls zum Thema "Inverse Matrix".
Verwendet werden hierzu die beiden LAPACK-Subroutinen:
- SGETRF
- S ... Datentyp: real
- GE ... Matrixtyp: general
- TRF ... Operation: LU-Faktorisierung (Dreiecksform)
- SGETRI
- S ... Datentyp: real
- GE ... Matrixtyp: general
- TRI ... Operation: Invertierung einer LU-faktorisierten Matrix
Fortran 90/95-Code (free source form) |
program bsp implicit none real, dimension( 3, 3 ) :: A integer, dimension( 3 ) :: ipiv real, dimension( 3 ) :: work integer :: m = 3, n = 3, lda = 3, lwork = 3, info A = reshape( (/ 3.0, -3.0, 2.0, -2.0, 5.0, -1.0, 1.0, 0.0, 2.0 /), & shape( A ) ) ! LU-Faktorisierung (Dreieckszerlegung) der Matrix A call sgetrf( m, n, A, lda, ipiv, info ) ! Inverse der LU-faktorisierten Matrix A call sgetri( n, A, lda, ipiv, work, lwork, info ) write( *, * ) "Inverse Matrix Ai =", A write( *, * ) "Testweise wie im Bartsch-Beispiel, Ai = 1/11 * (", A * 11, ")" if( info == 0 ) then write( *, * ) "OK" else write( *, * ) "Nicht OK" end if ! Ausgabe: ! Inverse Matrix Ai = 0.909091 0.54545456 -0.63636374 0.2727273 ! 0.36363637 -0.090909116 -0.45454553 -0.2727273 0.81818193 ! Testweise wie im Bartsch-Beispiel, Ai = 1/11 * ( 10.000001 6. -7.000001 ! 3.0000005 4. -1.0000002 -5.000001 -3.0000005 9.000001 ) ! OK end program bsp |
Weblinks
[Bearbeiten]- LAPACK - Linear Algebra Package
- LAPACK Search Engine
- LAPACK95 - Fortran95 interface to LAPACK
- Erstellen der LAPACK-Bibliothek mit gfortran
<< zur Fortran-Startseite | |
< FGSL | OpenMP > |