Community
cancel
Showing results for
Did you mean:
Beginner
157 Views

## Fortran PDGETRF + PDGETRI for Matrix Inversion - parameter with an illegal value

Hi everyone,

This is the first time that I am using libraries. I need to calculate the inverse matrix of a square matrix. I found the routine PDGETRF + PDGETRI from ScaLAPACK in the MKL documentation that can solve my problem, but I'm in trouble to compile this routines.

Can anyone help me?

The code I am trying to compile is:

```    program Invtest

implicit none

! Variables
integer :: i, j, info, lwork, liwork
integer, parameter :: dlen_ = 9, ia = 1, ja = 1, m=3, n=3
real(kind = 8), dimension(m,n) :: A, Ainv, Mf, LU
integer, dimension(size(A,1)) :: ipiv
integer, dimension(dlen_) :: desca
real(kind = 8), dimension(size(A,1)) :: work, iwork
external PDGETRF, PDGETRI

! Body of Invtest
A = reshape(source = (/1, 1, 1, 0, 3, 2, 0, 1, 0/), shape = (/3, 3/))
do i=1,m
print *, (A(i,j), j=1,n)
end do
info = 0
lwork = size(A,1)
work = 0
liwork = size(A,1)
iwork = 0

! PDGETRF computes an LU factorization of a general M-by-N distributed matrix.
LU = A
call pdgetrf(n, n, LU, ia, ja, desca, ipiv, info)

! PDGETRI computes the inverse of a matrix using the LU factorization computed by PDGETRF.
Ainv = LU
call pdgetri(n, Ainv, ia, ja, desca, ipiv, work, lwork, iwork, liwork, info)

! Computation of A^{-1} * A to check the inverse
Mf = matmul(Ainv,A)

print*,"Mf = "
do i=1,m
print*,Mf(i,:)
end do

pause

end program Invtest```

When I compile this code I get the following error message:

```{   -1,   -1}:  On entry to
PDGETRF parameter number  602 had an illegal value
{   -1,   -1}:  On entry to
PDGETRI parameter number  502 had an illegal value```

The university computer that I am using has installed Microsoft Visual Studio Professional 2013 Update 3, Intel Parallel Studio XE 2016 Update 2 Cluster Edition for Windows with Intel Math Kernel Library 11.3.

Thanks for the attention.

Employee
157 Views

Hi Jeferson,

For C sample, here is one  https://software.intel.com/en-us/articles/using-cluster-mkl-pblasscalapack-fortran-routine-in-your-c-program =>

https://software.intel.com/sites/default/files/article/165948/pdgemv.c

for fortran sample, you may search the scalapack function in internet.

like http://acts.nersc.gov/tau/example-pdgesv/pdgesvdriver.f90.html

In the code, you need at least some MPI init or blacs init code.   for example mkl build-in example

```*******************************************************************************
C----------------------------------------------------------------------
C Example program to show the use of the "CLUSTER_SPARSE_SOLVER" routine
C for solving symmetric linear systems
C----------------------------------------------------------------------
program cluster_sparse_solver_sym
implicit none
include 'mkl_cluster_sparse_solver.f77'
include 'mpif.h'
C.. Internal solver memory pointer for 64-bit architectures
INTEGER*8 pt(64)
C.. All other variables
INTEGER maxfct, mnum, mtype, phase, n, nrhs, error, msglvl
INTEGER*4 rank, mpi_stat
INTEGER iparm(64)
INTEGER ia(9)
INTEGER ja(18)
REAL*8 a(18)
REAL*8 b(8)
REAL*8 bs(8)
REAL*8 x(8)
INTEGER i, idum(1)
REAL*8 ddum(1)
REAL*8 res, res0
external mkl_dcsrsymv
C.. Fill all arrays containing matrix data. Necessary only on master process
DATA n /8/, nrhs /1/, maxfct /1/, mnum /1/
DATA ia /1,5,8,10,12,15,17,18,19/
DATA ja
1 /1,  3,    6,7,
2    2,3,  5,
3      3,        8,
4        4,    7,
5          5,6,7,
6            6,  8,
7              7,
8                8/
DATA a
1 /7.d0,     1.d0,          2.d0,7.d0,
2       -4.d0,8.d0,     2.d0,
3            1.d0,                    5.d0,
4                 7.d0,     9.d0,
5                      5.d0,1.d0,5.d0,
6                           -1.d0,     5.d0,
7                                11.d0,
8                                     5.d0/
C..
C.. Initialize MPI.
call MPI_INIT(mpi_stat)

call MPI_COMM_RANK(MPI_COMM_WORLD, rank, mpi_stat)
C..
```

call MPI_FINALIZE(mpi_stat)
end

Best Regards,

Ying