|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /*
- LAPACKE_dgesv Example
- =====================
-
- The program computes the solution to the system of linear
- equations with a square matrix A and multiple
- right-hand sides B, where A is the coefficient matrix
- and b is the right-hand side matrix:
-
- Description
- ===========
-
- The routine solves for X the system of linear equations A*X = B,
- where A is an n-by-n matrix, the columns of matrix B are individual
- right-hand sides, and the columns of X are the corresponding
- solutions.
-
- The LU decomposition with partial pivoting and row interchanges is
- used to factor A as A = P*L*U, where P is a permutation matrix, L
- is unit lower triangular, and U is upper triangular. The factored
- form of A is then used to solve the system of equations A*X = B.
-
- LAPACKE Interface
- =================
-
- LAPACKE_dgesv (row-major, high-level) Example Program Results
-
- -- LAPACKE Example routine --
- -- LAPACK is a software package provided by Univ. of Tennessee, --
- -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
- */
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <lapacke.h>
- #include "lapacke_example_aux.h"
-
- /* Main program */
- int main(int argc, char **argv) {
-
- /* Locals */
- lapack_int n, nrhs, lda, ldb, info;
- int i, j;
- /* Local arrays */
- double *A, *b;
- lapack_int *ipiv;
-
- /* Default Value */
- n = 5; nrhs = 1;
-
- /* Arguments */
- for( i = 1; i < argc; i++ ) {
- if( strcmp( argv[i], "-n" ) == 0 ) {
- n = atoi(argv[i+1]);
- i++;
- }
- if( strcmp( argv[i], "-nrhs" ) == 0 ) {
- nrhs = atoi(argv[i+1]);
- i++;
- }
- }
-
- /* Initialization */
- lda=n, ldb=nrhs;
- A = (double *)malloc(n*n*sizeof(double)) ;
- if (A==NULL){ printf("error of memory allocation\n"); exit(0); }
- b = (double *)malloc(n*nrhs*sizeof(double)) ;
- if (b==NULL){ printf("error of memory allocation\n"); exit(0); }
- ipiv = (lapack_int *)malloc(n*sizeof(lapack_int)) ;
- if (ipiv==NULL){ printf("error of memory allocation\n"); exit(0); }
-
- for( i = 0; i < n; i++ ) {
- for( j = 0; j < n; j++ ) A[i*lda+j] = ((double) rand()) / ((double) RAND_MAX) - 0.5;
- }
-
- for(i=0;i<n*nrhs;i++)
- b[i] = ((double) rand()) / ((double) RAND_MAX) - 0.5;
-
- /* Print Entry Matrix */
- print_matrix_rowmajor( "Entry Matrix A", n, n, A, lda );
- /* Print Right Rand Side */
- print_matrix_rowmajor( "Right Rand Side b", n, nrhs, b, ldb );
- printf( "\n" );
- /* Executable statements */
- printf( "LAPACKE_dgesv (row-major, high-level) Example Program Results\n" );
- /* Solve the equations A*X = B */
- info = LAPACKE_dgesv( LAPACK_ROW_MAJOR, n, nrhs, A, lda, ipiv,
- b, ldb );
- /* Check for the exact singularity */
- if( info > 0 ) {
- printf( "The diagonal element of the triangular factor of A,\n" );
- printf( "U(%" LAPACK_IFMT ",%" LAPACK_IFMT ") is zero, so that A is singular;\n", info, info );
- printf( "the solution could not be computed.\n" );
- exit( 1 );
- }
- if (info <0) exit( 1 );
- /* Print solution */
- print_matrix_rowmajor( "Solution", n, nrhs, b, ldb );
- /* Print details of LU factorization */
- print_matrix_rowmajor( "Details of LU factorization", n, n, A, lda );
- /* Print pivot indices */
- print_vector( "Pivot indices", n, ipiv );
- exit( 0 );
- } /* End of LAPACKE_dgesv Example */
-
|