Hello,
We have a written a small program to calculate SVD of a matrix using the PDGESVD routine found in ScaLapack 1.8 library. The programs runs and completes the the calculations without any errors.
But when we compare the results obtained by the PDGESVD routine against the results from the dgesvd routine in lapack, we observe a lot of variations between the two results.
Please note there is only one process in the process grid when calling the PDGESVD routine.
It would be of great help if any one could shed some light on what we might be doing wrong in the program. I have pasted the code below for your reference:
Thanks in advance
-Vikas
START OF CODE
CALL BLACS_PINFO( IAM, NPROCS )
*
* Open file to read configs
*
OPEN( NIN, FILE='TestProg1Config.dat', STATUS='OLD' )
READ( NIN, FMT = * ) TOTMEM
READ( NIN, FMT = * ) lwork
READ( NIN, FMT = * ) SIZE
READ( NIN, FMT = * ) NB
READ( NIN, FMT = * ) NPROW
READ( NIN, FMT = * ) NPCOL
MEMSIZ = TOTMEM / CPLXSZ
ALLOCATE (MEM(MEMSIZ), STAT=INFO)
WRITE( *, FMT = * )'Allocation successful:', INFO
M = SIZE
N = SIZE
MYROW = 1
MYCOL = 1
CALL CPU_TIME(STARTTIME)
CALL BLACS_GET( -1, 0, ICTXT )
CALL BLACS_GRIDINIT( ICTXT, 'Row-major', NPROW, NPCOL )
CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
IA = 1
JA = 1
IU = 1
JU = 1
IVT = 1
JVT = 1
LDA = NUMROC( M, NB, MYROW, 0, NPROW )
LDA = MAX( 1, LDA )
NQ = NUMROC( N, NB, MYCOL, 0, NPCOL )
LDU = LDA
SIZEQ = NUMROC( SIZE, NB, MYCOL, 0, NPCOL )
LDVT = NUMROC( N, NB, MYROW, 0, NPROW )
LDVT = MAX( 1, LDVT )
CALL DESCINIT( DESCA, M, N, NB, NB, 0, 0, ICTXT, LDA, INFO )
CALL DESCINIT( DESCU, M, N, NB, NB, 0, 0, ICTXT, LDU, INFO )
CALL DESCINIT( DESCVT, N, N, NB, NB, 0, 0, ICTXT, LDVT,
$ INFO )
IPA = 1
IPS = IPA + LDA*NQ
IPW = IPS + SIZE
*
IPU = IPW
IPVT = IPW
! Dummy call to get the space needed.
CALL PDGESVD( 'V', 'V', M, N, MEM( IPA ), IA, JA, DESCA,
$ MEM( IPS ), MEM( IPU ), IU, JU, DESCU,
$ MEM( IPVT ), IVT, JVT, DESCVT,
$ MEM( IPW ), -1, DINFO )
WPDGESVD = INT( MEM( IPW ) )
WRITE( *, FMT = * )'Extra Workspace for SVD:', WPDGESVD
IPVT = IPU + LDU*SIZEQ
*
* Check all processes for an error
*
CALL IGSUM2D( ICTXT, 'All', ' ', 1, 1, INFO, 1, -1, 0 )
IF( INFO.GT.0 ) THEN
IF( IAM.EQ.0 )
$ WRITE( *, FMT = * ) 'MEMORY'
END IF
CALL PDLAREAD( 'MAT.dat', MEM(IPA), DESCA, 0, 0,MEM(IPW) )
CALL PDGESVD( 'V', 'V', M, N, MEM(IPA), IA, JA, DESCA,
$ MEM(IPS), MEM(IPU), IU, JU, DESCU,
$ MEM(IPVT), IVT, JVT, DESCVT,
$ MEM(IPW), WPDGESVD , INFO )
WRITE( *, FMT = * )
$ 'INFO:',INFO
* Printing the output to file.
CALL PDLAWRITE( 'TestProgSOLU.dat', M, M, MEM(IPU), 1, 1, DESCU,
$ 0, 0, MEM(IPW) )
CALL PDLAWRITE( 'TestProg1SOLVT.dat', M, M,MEM(IPVT), 1, 1,DESCVT,
$ 0, 0, MEM(IPW) )
CALL PDLAWRITE( 'TestProg1SOLS.dat', M, 1, MEM(IPS), 1, 1, DESCU,
$ 0, 0, MEM(IPW) )
CALL BLACS_GRIDEXIT( ICTXT )
CALL BLACS_EXIT( 0 )
END OF CODE

