I've tried to call p?getrf and p?getri to perform the inverse on a sub matrix of a general distributed matrix but failed. According to the documentations, my understanding is that you can do the inverse directly on the sub matrix by manipulating (m,n,... ia, ja...) easily. But when I set ia (or ja) not equal to 1, p?getrf and p?getri keeps telling me that the parameter 4 (or 5) is illegal. However, the subroutine works well at ia=ja=1, which means I can only perform the operation directly on the upper-left corner.
So I looked into the source code of pdgetrf and found this,
00178 IF( INFO.EQ.0 ) THEN
00179 IROFF = MOD( IA-1, DESCA( MB_ ) )
00180 ICOFF = MOD( JA-1, DESCA( NB_ ) )
00181 IF( IROFF.NE.0 ) THEN
00182 INFO = -4
00183 ELSE IF( ICOFF.NE.0 ) THEN
00184 INFO = -5
00185 ELSE IF( DESCA( MB_ ).NE.DESCA( NB_ ) ) THEN
00186 INFO = -(600+NB_)
00187 END IF
00188 END IF
I read the code as "you can only play with the sub matrix starting right at IA = x*blocksize + 1 and JA = y*blacksize + 1". Otherwise, iroff (or icoff) would not equal to 0 and the subroutine would exit and report its parameter 4(or 5) is illegal. Correct?
I am wondering if anyone has successfully did the LU decomp or matrix inverse on the bottom-right sub matrix directly? I'd really appreciate any feedback.