ScaLAPACK  2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
pdlasizesepr.f
Go to the documentation of this file.
00001       SUBROUTINE PDLASIZESEPR( DESCA, IPREPAD, IPOSTPAD, SIZEMQRLEFT,
00002      $                         SIZEMQRRIGHT, SIZEQRF, SIZETMS, SIZEQTQ,
00003      $                         SIZECHK, SIZESYEVR, ISIZESYEVR,
00004      $                         SIZESUBTST, ISIZESUBTST, SIZETST,
00005      $                         ISIZETST )
00006 *
00007 *  -- ScaLAPACK routine (@(MODE)version *TBA*) --
00008 *     University of California, Berkeley and
00009 *     University of Tennessee, Knoxville. 
00010 *     October 21, 2006
00011 *
00012       IMPLICIT NONE
00013 *
00014 *     .. Scalar Arguments ..
00015       INTEGER            IPOSTPAD, IPREPAD, ISIZESUBTST, ISIZESYEVR,
00016      $                   ISIZETST, SIZECHK, SIZEMQRLEFT, SIZEMQRRIGHT,
00017      $                   SIZEQRF, SIZEQTQ, SIZESUBTST, SIZESYEVR,
00018      $                   SIZETMS, SIZETST
00019 *     ..
00020 *     .. Array Arguments ..
00021       INTEGER            DESCA( * )
00022 *
00023 *  Purpose
00024 *  =======
00025 *
00026 *  PDLASIZESEPR computes the amount of memory needed by
00027 *  various SEPR test routines, as well as PDSYEVR itself.
00028 *
00029 *  Arguments
00030 *  =========
00031 *
00032 *  DESCA        (global input) INTEGER array dimension ( DLEN_ )
00033 *               Array descriptor for dense matrix.
00034 *
00035 *  SIZEMQRLEFT  LWORK for the 1st PDORMQR call in PDLAGSY
00036 *
00037 *  SIZEMQRRIGHT LWORK for the 2nd PDORMQR call in PDLAGSY
00038 *
00039 *  SIZEQRF      LWORK for PDGEQRF in PDLAGSY
00040 *
00041 *  SIZETMS      LWORK for PDLATMS
00042 *
00043 *  SIZEQTQ      LWORK for PDSEPQTQ
00044 *
00045 *  SIZECHK      LWORK for PDSEPCHK
00046 *
00047 *  SIZESYEVR    LWORK for PDSYEVR
00048 *
00049 *  ISIZESYEVR   LIWORK for PDSYEVR
00050 *
00051 *  SIZESUBTST   LWORK for PDSEPRSUBTST
00052 *
00053 *  ISIZESUBTST  LIWORK for PDSEPRSUBTST
00054 *
00055 *  SIZETST      LWORK for PDSEPRTST
00056 *
00057 *  ISIZETST     LIWORK for PDSEPRTST
00058 *
00059 *
00060 *     .. Parameters ..
00061       INTEGER            CTXT_, M_,
00062      $                   MB_, NB_, RSRC_, CSRC_, LLD_
00063       PARAMETER          ( 
00064      $                   CTXT_ = 2, M_ = 3, MB_ = 5, NB_ = 6,
00065      $                   RSRC_ = 7, CSRC_ = 8, LLD_ = 9 )
00066 *     ..
00067 *     .. Local Scalars ..
00068       INTEGER            CSRC_A, IACOL, IAROW, ICOFFA, IROFFA, LCM,
00069      $                   LCMQ, LDA, MQ0, MYCOL, MYROW, N, NB, NEIG, NN,
00070      $                   NNP, NP, NP0, NPCOL, NPROW, NQ, RSRC_A
00071 *     ..
00072 *     .. External Functions ..
00073       INTEGER            ICEIL, ILCM, INDXG2P, NUMROC
00074       EXTERNAL           ICEIL, ILCM, INDXG2P, NUMROC
00075 *
00076 *     .. External Subroutines ..
00077       EXTERNAL           BLACS_GRIDINFO
00078 *     ..
00079 *     .. Intrinsic Functions ..
00080       INTRINSIC          MAX
00081 *     ..
00082 *     .. Executable Statements ..
00083 *
00084       N = DESCA( M_ )
00085       NB = DESCA( MB_ )
00086       RSRC_A = DESCA( RSRC_ )
00087       CSRC_A = DESCA( CSRC_ )
00088 *
00089       LDA = DESCA( LLD_ )
00090       CALL BLACS_GRIDINFO( DESCA( CTXT_ ), NPROW, NPCOL, MYROW, MYCOL )
00091 *
00092       LCM = ILCM( NPROW, NPCOL )
00093       LCMQ = LCM / NPCOL
00094       IROFFA = 0
00095       ICOFFA = 0
00096       IAROW = INDXG2P( 1, NB, MYROW, RSRC_A, NPROW )
00097       IACOL = INDXG2P( 1, NB, MYCOL, CSRC_A, NPCOL )
00098       NP = NUMROC( N+IROFFA, NB, MYROW, IAROW, NPROW )
00099       NQ = NUMROC( N+ICOFFA, NB, MYCOL, IACOL, NPCOL )
00100       SIZEMQRLEFT = MAX( ( NB*( NB-1 ) ) / 2, ( NP+NQ )*NB ) + NB*NB
00101       SIZEMQRRIGHT = MAX( ( NB*( NB-1 ) ) / 2,
00102      $               ( NQ+MAX( NP+NUMROC( NUMROC( N+ICOFFA, NB, 0, 0,
00103      $               NPCOL ), NB, 0, 0, LCMQ ), NP ) )*NB ) + NB*NB
00104       SIZEQRF = NB*NP + NB*NQ + NB*NB
00105       SIZETMS = ( LDA+1 )*MAX( 1, NQ ) +
00106      $          MAX( SIZEMQRLEFT, SIZEMQRRIGHT, SIZEQRF )
00107 *
00108       NP0 = NUMROC( N, DESCA( MB_ ), 0, 0, NPROW )
00109       MQ0 = NUMROC( N, DESCA( NB_ ), 0, 0, NPCOL )
00110       SIZEQTQ = 2 + MAX( DESCA( MB_ ), 2 )*( 2*NP0+MQ0 )
00111       SIZECHK = NUMROC( N, DESCA( NB_ ), MYCOL, 0, NPCOL )
00112 *
00113       NEIG = N
00114       NN = MAX( N, NB, 2 ) + 1
00115       NP0 = NUMROC( NN, NB, 0, 0, NPROW )
00116       MQ0 = NUMROC( MAX( NEIG, NB, 2 ), NB, 0, 0, NPCOL )
00117       NNP = MAX( N, NPROW*NPCOL+1, 4 )
00118 *
00119 *
00120       SIZESYEVR = 1 + 5*N + MAX( 18*NN, NP0*MQ0+2*NB*NB ) +
00121      $            (2 + ICEIL( NEIG, NPROW*NPCOL ))*NN
00122       SIZESYEVR = MAX(3, SIZESYEVR)
00123 *
00124       ISIZESYEVR = 12*NNP + 2*N
00125 *
00126       SIZESUBTST = MAX( SIZETMS, SIZEQTQ, SIZECHK, SIZESYEVR ) +
00127      $             IPREPAD + IPOSTPAD
00128       ISIZESUBTST = ISIZESYEVR + IPREPAD + IPOSTPAD
00129 *
00130 *     Allow room for A, COPYA and Z and DIAG, WIN, WNEW, GAP, WORK
00131 *
00132       SIZETST = 3*( LDA*NP+IPREPAD+IPOSTPAD ) +
00133      $          4*( N+IPREPAD+IPOSTPAD ) + SIZESUBTST
00134 *
00135 *     Allow room for IFAIL, ICLUSTR, and IWORK 
00136 *     (only needed for PDSYEVX)
00137 *
00138       ISIZETST = N + 2*NPROW*NPCOL + 2*( IPREPAD+IPOSTPAD ) +
00139      $           ISIZESUBTST
00140 *
00141 *
00142       RETURN
00143       END