1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
*
*
SUBROUTINE PDLASIZESYEV( JOBZ, N, DESCA, MINSIZE )
*
*
* -- ScaLAPACK routine (version 1.7) --
* University of Tennessee, Knoxville, Oak Ridge National Laboratory,
* and University of California, Berkeley.
* May 1, 1997
*
* .. Scalar Arguments ..
CHARACTER JOBZ
INTEGER MINSIZE, N
* ..
* .. Array Arguments ..
INTEGER DESCA( * )
* ..
*
* Purpose
* =======
*
* PDLASIZESYEV computes the amount of memory needed by PDSYEV
* to calculate:
* 1) Eigenvectors and eigenvalues if JOBZ = 'V'
* 2) Eigenvalues only if JOBZ = 'N'
*
* Arguments
* =========
*
* NP = the number of rows local to a given process.
* NQ = the number of columns local to a given process.
*
* JOBZ (global input) CHARACTER*1
* Specifies whether or not to compute the eigenvectors:
* = 'N': Compute eigenvalues only.
* = 'V': Compute eigenvalues and eigenvectors.
*
* N (global input) INTEGER
* Size of the matrix to be tested. (global size)
*
* DESCA (global input) INTEGER array dimension ( DLEN_ )
*
* MINSIZE (global output) INTEGER
* Workspace required for PDSYEV to:
* 1) Eigenvectors and eigenvalues if JOBZ = 'V'
* 2) Eigenvalues only if JOBZ = 'N'
*
*
* .. Parameters ..
INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
$ MB_, NB_, RSRC_, CSRC_, LLD_
PARAMETER ( BLOCK_CYCLIC_2D = 1, DLEN_ = 9, DTYPE_ = 1,
$ CTXT_ = 2, M_ = 3, N_ = 4, MB_ = 5, NB_ = 6,
$ RSRC_ = 7, CSRC_ = 8, LLD_ = 9 )
* ..
* .. Local Scalars ..
LOGICAL WANTZ
INTEGER CONTEXTC, CSRC_A, IACOL, IAROW, ICOFFA, IROFFA,
$ LCM, LCMQ, LDC, MQ0, MYCOL, MYPCOLC, MYPROWC,
$ MYROW, NB, NN, NP, NP0, NPCOL, NPCOLC, NPROCS,
$ NPROW, NPROWC, NQ, NRC, QRMEM, RSRC_A,
$ SIZEMQRLEFT, SIZEMQRRIGHT
* ..
* .. External Functions ..
*
*
LOGICAL LSAME
INTEGER ILCM, INDXG2P, NUMROC, SL_GRIDRESHAPE
EXTERNAL ILCM, INDXG2P, LSAME, NUMROC, SL_GRIDRESHAPE
* ..
* .. External Subroutines ..
EXTERNAL BLACS_GRIDINFO, BLACS_GRIDEXIT
* ..
* .. Intrinsic Functions ..
INTRINSIC MAX
* ..
* .. Executable Statements ..
* This is just to keep ftnchek happy
IF( BLOCK_CYCLIC_2D*CSRC_*CTXT_*DLEN_*DTYPE_*LLD_*MB_*M_*NB_*N_*
$ RSRC_.LT.0 )RETURN
*
CALL BLACS_GRIDINFO( DESCA( CTXT_ ), NPROW, NPCOL, MYROW, MYCOL )
NB = DESCA( MB_ )
N = DESCA( M_ )
RSRC_A = DESCA( RSRC_ )
CSRC_A = DESCA( CSRC_ )
LCM = ILCM( NPROW, NPCOL )
LCMQ = LCM / NPCOL
IROFFA = 0
ICOFFA = 0
IAROW = INDXG2P( 1, NB, MYROW, RSRC_A, NPROW )
IACOL = INDXG2P( 1, NB, MYCOL, CSRC_A, NPCOL )
NP = NUMROC( N+IROFFA, NB, MYROW, IAROW, NPROW )
NQ = NUMROC( N+ICOFFA, NB, MYCOL, IACOL, NPCOL )
SIZEMQRLEFT = MAX( ( NB*( NB-1 ) ) / 2, ( NP+NQ )*NB ) + NB*NB
SIZEMQRRIGHT = MAX( ( NB*( NB-1 ) ) / 2,
$ ( NQ+MAX( NP+NUMROC( NUMROC( N+ICOFFA, NB, 0, 0,
$ NPCOL ), NB, 0, 0, LCMQ ), NP ) )*NB ) + NB*NB
NN = MAX( N, NB, 2 )
NP0 = NUMROC( NN, NB, 0, 0, NPROW )
MQ0 = NUMROC( NN, NB, 0, 0, NPCOL )
NPROCS = NPROW*NPCOL
WANTZ = LSAME( JOBZ, 'V' )
LDC = 0
*
* Create the new context that is used in PDSYEV
*
IF( WANTZ ) THEN
CONTEXTC = SL_GRIDRESHAPE( DESCA( CTXT_ ), 0, 1, 1, NPROCS, 1 )
CALL BLACS_GRIDINFO( CONTEXTC, NPROWC, NPCOLC, MYPROWC,
$ MYPCOLC )
NRC = NUMROC( N, NB, MYPROWC, 0, NPROCS)
LDC = MAX( 1, NRC )
CALL BLACS_GRIDEXIT( CONTEXTC )
END IF
*
* Compute the total amount of space needed
*
IF( WANTZ ) THEN
QRMEM = 5*N + MAX( 2*NP0 +MQ0 + NB*NN, 2*NN-2 ) + N*LDC
MINSIZE = MAX ( SIZEMQRLEFT, SIZEMQRRIGHT, QRMEM )
ELSE
MINSIZE = 5*N + 2*NP0 +MQ0 + NB*NN
END IF
*
RETURN
*
* End of PDLASIZESYEV
*
END
|