Logo Cineca Logo SCAI

You are here

Lapack solution

C

#include "stdio.h"
#include "stdlib.h"
#include "mkl.h"
#define N 10
int main()
{
int n = N, nrhs = 1, lda = N, ldb = N, info, i, j;
/* Matrices and vectors definitions */
double A[N*N], b[N];
int ipiv[N];

/* Vector and matrix elements generation */
for( i = 0; i < n; i++ ){
for( j = 0; j < n; j++ ){
if( i == j ) {
A[n*i+j] = (double)(10000);
} else {
A[n*i+j] = ((double)(i+1)+(double)(j+1)/(double)(2));
}
}
}
printf( "MATRIX A:\n" );
for( i = 0; i < n; i++ ){
for( j = 0; j < n; j++ ){
printf( "%12.6f ", A[n*i+j] );
}
printf( "\n" );
}
for( i = 0; i < n; i++ ){
b[i] = (double)(206 - i);
}
printf( "VECTOR b:\n" );
for( i = 0; i < n; i++ ){
printf( "%12.6f ", b[i] );
}
printf( "\n" );

/* Linear system equations solver */
dgesv_( &n, &nrhs, A, &lda, ipiv, b, &ldb, &info );

printf( "## dgesv ## VECTOR x:\n" );
for( i = 0; i < n; i++ ){
printf( "%12.6f ", b[i] );
}
printf( "\n" );
printf( "## dgesv ## VECTOR ipiv:\n" );
for( i = 0; i < n; i++ ){
printf( "%12d ", ipiv[i] );
}
printf( "\n" );
return 0;
}

 

FORTRAN

program es_lapack
implicit none

integer :: i, j, info
character(len=*) , parameter :: FMT1='(100E12.5)', FMT2='(100I5)'
! LAPACK routine
external :: dgesv
! Matrices and vectors definitions
integer :: N, LDA, LDB
parameter ( N=10 )
real*8 :: A(N,N), B(N)
integer :: ipiv(N)
LDA = N
LDB = N

! Vector and matrix elements generation
do j=1,N
do i=1,N
if(i.eq.j) then
A(i,j) = dble(10000)
else
A(i,j) = (dble(i)+dble(j)/dble(2.0))
endif
enddo
enddo
do i=1,N
B(i) = dble(207-i)
enddo

write(*,*) 'MATRIX A:'
do i=1,N
write(*,FMT1) ( A(i,j), j=1,N )
enddo
write(*,*) 'VECTOR B:'
write(*,FMT1) ( B(i), i=1,N )

! Linear system equations solver
call dgesv( N, 1, A, LDA, ipiv, B, LDB, info )
if(info.eq.0) write(*,*) 'CALL DGESV: OK'

write(*,*) 'VECTOR X:'
write(*,FMT1) ( B(i), i=1,N )
write(*,*) 'VECTOR IPIV:'
write(*,FMT2) ( ipiv(i), i=1,N )

end program es_lapack