I m trying to make a program that calls the routine PDGEQRF for computing the QR form of a matrix A.
I use the matrix and the block size exactly as it given in example 1.
(So A = 9 x 9 and mb=nb=2 in a 2x3 process grid)
However I get error messages !!
Here is the code :
- Code: Select all
--------------------------------------
PROGRAM TESTINGQR
*
*
* PARAMETERS
INTEGER M, N, MB, NB, RSRC, CSRC, MXLLDA,
$ IA, JA, LWORK , MXLOCC , NOUT
PARAMETER ( M = 9, N = 9, MB = 2, NB = 2, RSRC = 0, CSRC = 0,
$ MXLLDA = 5, IA = 1, JA = 1, LWORK = -1, MXLOCC = 4,
$ NOUT = 6 )
* SCALARS *
INTEGER ICTXT, MYROW, MYCOL, NPCOL, NPROW, INFO
*
* ARRAYS
INTEGER DESCA(9)
DOUBLE PRECISION A(MXLLDA, MXLOCC), TAU(9), WORK( LWORK )
*
* EXTERNAL SUBROUTINES
EXTERNAL BLACS_EXIT, BLACS_GRIDEXIT, BLACS_GRIDINFO,
$ DESCINIT, MATINIT, SL_INIT
*
DATA NPROW / 2 /, NPCOL / 3 /
*
* ---------------------------
* INITIALIZE THE PROCESS GRID
* ---------------------------
CALL SL_INIT( ICTXT, NPROW, NPCOL )
CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
*
* If I'm not in the process grid, go to the end of the program
*
IF( MYROW.EQ.-1 )
$ GO TO 10
*
* -------------------------------------------
* DISTRIBUTE THE MATRIX OVER THE PROCESS GRID
* -------------------------------------------
CALL DESCINIT( DESCA, M, N, MB, NB, RSRC, CSRC, ICTXT, MXLLDA,
$ INFO )
*
* -------------------------------------------------------
* GENERATE MATRIX A AND DISTRIBUTE IT ON THE PROCESS GRID
* -------------------------------------------------------
CALL MATINIT( A, DESCA )
*
* ------------------------
* CALL THE ROUTINE PDGEQRF
* ------------------------
CALL PDGEQRF( M, N, A, IA, JA, DESCA, TAU, WORK, LWORK,
$ INFO )
*
*
IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 ) THEN
WRITE( NOUT, FMT = 9999 )
WRITE( NOUT, FMT = 9998 )M, N, NB
WRITE( NOUT, FMT = 9997 )NPROW*NPCOL, NPROW, NPCOL
WRITE( NOUT, FMT = 9996 )INFO
END IF
*
* ------------------------
* RELEASE THE PROCESS GRID
* ------------------------
*
CALL BLACS_GRIDEXIT( ICTXT )
*
10 CONTINUE
*
*
*
CALL BLACS_EXIT( 0 )
*
*
9999 FORMAT( / 'ScaLAPACK tESTING QR' )
9998 FORMAT( / 'COMPUTING A=QR WHERE A IS A ', I3, ' by ', I3,
$ ' matrix with a block size of ', I3 )
9997 FORMAT( 'Running on ', I3, ' processes, where the process grid',
$ ' is ', I3, ' by ', I3 )
9996 FORMAT( / 'INFO code returned by PDGEQRF = ', I3 )
STOP
END
*
*
*
SUBROUTINE MATINIT( AA, DESCA )
*
* MATINIT generates and distributes matrices A and B (depicted in
* figures 2.5 and 2.6) to a 2 x 3 process grid
*
* .. Array Arguments ..
INTEGER DESCA( * )
DOUBLE PRECISION AA( * )
* .. Parameters ..
INTEGER CTXT_, LLD_
PARAMETER ( CTXT_ = 2, LLD_ = 9 )
* ..
* .. Local Scalars ..
INTEGER ICTXT, MXLLDA, MYCOL, MYROW, NPCOL, NPROW
DOUBLE PRECISION A, C, K, L, P, S
* ..
* .. External Subroutines ..
EXTERNAL BLACS_GRIDINFO
* ..
* .. Executable Statements ..
*
ICTXT = DESCA( CTXT_ )
CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
*
S = 19.0D0
C = 3.0D0
A = 1.0D0
L = 12.0D0
P = 16.0D0
K = 11.0D0
*
MXLLDA = DESCA( LLD_ )
*
IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 ) THEN
AA( 1 ) = S
AA( 2 ) = -S
AA( 3 ) = -S
AA( 4 ) = -S
AA( 5 ) = -S
AA( 1+MXLLDA ) = C
AA( 2+MXLLDA ) = C
AA( 3+MXLLDA ) = -C
AA( 4+MXLLDA ) = -C
AA( 5+MXLLDA ) = -C
AA( 1+2*MXLLDA ) = A
AA( 2+2*MXLLDA ) = A
AA( 3+2*MXLLDA ) = A
AA( 4+2*MXLLDA ) = A
AA( 5+2*MXLLDA ) = -A
AA( 1+3*MXLLDA ) = C
AA( 2+3*MXLLDA ) = C
AA( 3+3*MXLLDA ) = C
AA( 4+3*MXLLDA ) = C
AA( 5+3*MXLLDA ) = -C
ELSE IF( MYROW.EQ.0 .AND. MYCOL.EQ.1 ) THEN
AA( 1 ) = A
AA( 2 ) = A
AA( 3 ) = -A
AA( 4 ) = -A
AA( 5 ) = -A
AA( 1+MXLLDA ) = L
AA( 2+MXLLDA ) = L
AA( 3+MXLLDA ) = -L
AA( 4+MXLLDA ) = -L
AA( 5+MXLLDA ) = -L
AA( 1+2*MXLLDA ) = K
AA( 2+2*MXLLDA ) = K
AA( 3+2*MXLLDA ) = K
AA( 4+2*MXLLDA ) = K
AA( 5+2*MXLLDA ) = K
ELSE IF( MYROW.EQ.0 .AND. MYCOL.EQ.2 ) THEN
AA( 1 ) = A
AA( 2 ) = A
AA( 3 ) = A
AA( 4 ) = -A
AA( 5 ) = -A
AA( 1+MXLLDA ) = P
AA( 2+MXLLDA ) = P
AA( 3+MXLLDA ) = P
AA( 4+MXLLDA ) = P
AA( 5+MXLLDA ) = -P
ELSE IF( MYROW.EQ.1 .AND. MYCOL.EQ.0 ) THEN
AA( 1 ) = -S
AA( 2 ) = -S
AA( 3 ) = -S
AA( 4 ) = -S
AA( 1+MXLLDA ) = -C
AA( 2+MXLLDA ) = -C
AA( 3+MXLLDA ) = -C
AA( 4+MXLLDA ) = C
AA( 1+2*MXLLDA ) = A
AA( 2+2*MXLLDA ) = A
AA( 3+2*MXLLDA ) = A
AA( 4+2*MXLLDA ) = -A
AA( 1+3*MXLLDA ) = C
AA( 2+3*MXLLDA ) = C
AA( 3+3*MXLLDA ) = C
AA( 4+3*MXLLDA ) = C
ELSE IF( MYROW.EQ.1 .AND. MYCOL.EQ.1 ) THEN
AA( 1 ) = A
AA( 2 ) = -A
AA( 3 ) = -A
AA( 4 ) = -A
AA( 1+MXLLDA ) = L
AA( 2+MXLLDA ) = L
AA( 3+MXLLDA ) = -L
AA( 4+MXLLDA ) = -L
AA( 1+2*MXLLDA ) = K
AA( 2+2*MXLLDA ) = K
AA( 3+2*MXLLDA ) = K
AA( 4+2*MXLLDA ) = K
ELSE IF( MYROW.EQ.1 .AND. MYCOL.EQ.2 ) THEN
AA( 1 ) = A
AA( 2 ) = A
AA( 3 ) = -A
AA( 4 ) = -A
AA( 1+MXLLDA ) = P
AA( 2+MXLLDA ) = P
AA( 3+MXLLDA ) = -P
AA( 4+MXLLDA ) = -P
END IF
RETURN
END
------------------------------
and the error messages i get are :
INTEGER M, N, MB, NB, RSRC, CSRC, MXLLDA,
^
Error 707 at (5: incomplete statement)
PARAMETER ( M = 9, N = 9, MB = 2, NB = 2, RSRC = 0, CSRC = 0,
^
Error 703 at (7) : unbalanced parenthesis
Error 707 at (7) : incomplete statement
CALL DESCINIT( DESCA, M, N, MB, NB, RSRC, CSRC, ICTXT, MXLLDA
Error 703 at (37) : unbalanced parenthesis
Error 739 : In program unit TESTINGQR label 10 is not set
WHAT AM I DOING WRONG ???? :( :( :(
The example1 runs perfectly but my program not..
I m not very familiar to Scalapack and it took me long to write this.
Please help !

