|
ScaLAPACK
2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
|
00001 SUBROUTINE PCLASIZESEP( DESCA, IPREPAD, IPOSTPAD, SIZEMQRLEFT, 00002 $ SIZEMQRRIGHT, SIZEQRF, SIZETMS, RSIZEQTQ, 00003 $ RSIZECHK, SIZEHEEVX, RSIZEHEEVX, 00004 $ ISIZEHEEVX, SIZEHEEVD, RSIZEHEEVD, 00005 $ ISIZEHEEVD, SIZESUBTST, RSIZESUBTST, 00006 $ ISIZESUBTST, SIZETST, RSIZETST, ISIZETST ) 00007 * 00008 * -- ScaLAPACK routine (version 1.7) -- 00009 * University of Tennessee, Knoxville, Oak Ridge National Laboratory, 00010 * and University of California, Berkeley. 00011 * May 1, 1997 00012 * 00013 * .. Scalar Arguments .. 00014 INTEGER IPOSTPAD, IPREPAD, ISIZEHEEVD, ISIZEHEEVX, 00015 $ ISIZESUBTST, ISIZETST, RSIZECHK, RSIZEHEEVD, 00016 $ RSIZEHEEVX, RSIZEQTQ, RSIZESUBTST, RSIZETST, 00017 $ SIZEHEEVD, SIZEHEEVX, SIZEMQRLEFT, 00018 $ SIZEMQRRIGHT, SIZEQRF, SIZESUBTST, SIZETMS, 00019 $ SIZETST 00020 * .. 00021 * .. Array Arguments .. 00022 INTEGER DESCA( * ) 00023 * .. 00024 * 00025 * Purpose 00026 * ======= 00027 * 00028 * PCLASIZESEP computes the amount of memory needed by 00029 * various SEP test routines, as well as HEEVX itself 00030 * 00031 * Arguments 00032 * ========= 00033 * 00034 * DESCA (global input) INTEGER array dimension ( DLEN_ ) 00035 * Array descriptor as passed to PCHEEVX 00036 * 00037 * SIZEMQRLEFT LWORK for the 1st PCUNMQR call in PCLAGHE 00038 * 00039 * SIZEMQRRIGHT LWORK for the 2nd PCUNMQR call in PCLAGHE 00040 * 00041 * SIZEQRF LWORK for PCGEQRF in PCLAGHE 00042 * 00043 * SIZETMS LWORK for PCLATMS 00044 * 00045 * RSIZEQTQ LWORK for PCSEPQTQ (nexer complex) 00046 * 00047 * RSIZECHK LWORK for PCSEPCHK 00048 * 00049 * SIZEHEEVX LWORK for PCHEEVX 00050 * 00051 * RSIZEHEEVX LRWORK for PCHEEVX 00052 * 00053 * ISIZEHEEVX LIWORK for PCHEEVX 00054 * 00055 * SIZEHEEVD LWORK for PCHEEVD 00056 * 00057 * RSIZEHEEVD LRWORK for PCHEEVD 00058 * 00059 * ISIZEHEEVD LIWORK for PCHEEVD 00060 * 00061 * SIZESUBTST LWORK for PCSUBTST 00062 * 00063 * RSIZESUBTST LRWORK for PCSUBTST 00064 * 00065 * ISIZESUBTST LIWORK for PCSUBTST 00066 * 00067 * SIZETST LWORK for PCTST 00068 * 00069 * RSIZETST LRWORK for PCTST 00070 * 00071 * ISIZETST LIWORK for PCTST 00072 * 00073 * .. Parameters .. 00074 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_, 00075 $ MB_, NB_, RSRC_, CSRC_, LLD_ 00076 PARAMETER ( BLOCK_CYCLIC_2D = 1, DLEN_ = 9, DTYPE_ = 1, 00077 $ CTXT_ = 2, M_ = 3, N_ = 4, MB_ = 5, NB_ = 6, 00078 $ RSRC_ = 7, CSRC_ = 8, LLD_ = 9 ) 00079 * .. 00080 * .. Local Scalars .. 00081 INTEGER ANB, CSRC_A, IACOL, IAROW, ICOFFA, ICTXT, 00082 $ IROFFA, LCM, LCMQ, LDA, MQ0, MYCOL, MYROW, N, 00083 $ NB, NEIG, NHETRD_LWOPT, NN, NNP, NP, NP0, 00084 $ NPCOL, NPROW, NPS, NQ, RSRC_A, SIZECHK, 00085 $ SIZEQTQ, SQNPC 00086 * .. 00087 * .. External Functions .. 00088 INTEGER ICEIL, ILCM, INDXG2P, NUMROC, PJLAENV 00089 EXTERNAL ICEIL, ILCM, INDXG2P, NUMROC, PJLAENV 00090 * .. 00091 ** .. Executable Statements .. 00092 * This is just to keep ftnchek happy 00093 * .. External Subroutines .. 00094 EXTERNAL BLACS_GRIDINFO 00095 * .. 00096 * .. Intrinsic Functions .. 00097 INTRINSIC INT, MAX, REAL, SQRT 00098 * .. 00099 * .. Executable Statements .. 00100 IF( BLOCK_CYCLIC_2D*CSRC_*CTXT_*DLEN_*DTYPE_*LLD_*MB_*M_*NB_*N_* 00101 $ RSRC_.LT.0 )RETURN 00102 * 00103 N = DESCA( M_ ) 00104 NB = DESCA( MB_ ) 00105 RSRC_A = DESCA( RSRC_ ) 00106 CSRC_A = DESCA( CSRC_ ) 00107 * 00108 LDA = DESCA( LLD_ ) 00109 CALL BLACS_GRIDINFO( DESCA( CTXT_ ), NPROW, NPCOL, MYROW, MYCOL ) 00110 * 00111 LCM = ILCM( NPROW, NPCOL ) 00112 LCMQ = LCM / NPCOL 00113 IROFFA = 0 00114 ICOFFA = 0 00115 IAROW = INDXG2P( 1, NB, MYROW, RSRC_A, NPROW ) 00116 IACOL = INDXG2P( 1, NB, MYCOL, CSRC_A, NPCOL ) 00117 NP = NUMROC( N+IROFFA, NB, MYROW, IAROW, NPROW ) 00118 NQ = NUMROC( N+ICOFFA, NB, MYCOL, IACOL, NPCOL ) 00119 SIZEMQRLEFT = MAX( ( NB*( NB-1 ) ) / 2, ( NP+NQ )*NB ) + NB*NB 00120 SIZEMQRRIGHT = MAX( ( NB*( NB-1 ) ) / 2, 00121 $ ( NQ+MAX( NP+NUMROC( NUMROC( N+ICOFFA, NB, 0, 0, 00122 $ NPCOL ), NB, 0, 0, LCMQ ), NP ) )*NB ) + NB*NB 00123 SIZEQRF = NB*NP + NB*NQ + NB*NB 00124 SIZETMS = ( LDA+1 )*MAX( 1, NQ ) + 00125 $ MAX( SIZEMQRLEFT, SIZEMQRRIGHT, SIZEQRF ) 00126 * 00127 NP0 = NUMROC( N, DESCA( MB_ ), 0, 0, NPROW ) 00128 MQ0 = NUMROC( N, DESCA( NB_ ), 0, 0, NPCOL ) 00129 SIZEQTQ = 0 00130 SIZECHK = 0 00131 RSIZEQTQ = 2 + MAX( DESCA( MB_ ), 2 )*( 2*NP0+MQ0 ) 00132 RSIZECHK = NUMROC( N, DESCA( NB_ ), MYCOL, 0, NPCOL ) 00133 * 00134 NEIG = N 00135 NN = MAX( N, NB, 2 ) 00136 NP0 = NUMROC( NN, NB, 0, 0, NPROW ) 00137 MQ0 = NUMROC( MAX( NEIG, NB, 2 ), NB, 0, 0, NPCOL ) 00138 SIZEHEEVX = N + ( NP0+MQ0+NB )*NB 00139 RSIZEHEEVX = 4*N + MAX( 5*NN, NP0*MQ0 ) + 00140 $ ICEIL( NEIG, NPROW*NPCOL )*NN 00141 NNP = MAX( N, NPROW*NPCOL+1, 4 ) 00142 ISIZEHEEVX = 6*NNP 00143 * 00144 ICTXT = DESCA( CTXT_ ) 00145 ANB = PJLAENV( ICTXT, 3, 'PCHETTRD', 'L', 0, 0, 0, 0 ) 00146 SQNPC = INT( SQRT( REAL( NPROW*NPCOL ) ) ) 00147 NPS = MAX( NUMROC( N, 1, 0, 0, SQNPC ), 2*ANB ) 00148 NHETRD_LWOPT = 2*( ANB+1 )*( 4*NPS+2 ) + ( NPS+2 )*NPS 00149 * 00150 SIZEHEEVX = MAX( SIZEHEEVX, N+NHETRD_LWOPT ) 00151 * 00152 SIZEHEEVD = SIZEHEEVX 00153 RSIZEHEEVD = 7*N + 3*NP0*MQ0 00154 ISIZEHEEVD = 7*N + 8*NPCOL + 2 00155 SIZESUBTST = MAX( SIZETMS, SIZEQTQ, SIZECHK, SIZEHEEVX, 00156 $ SIZEHEEVD ) + IPREPAD + IPOSTPAD 00157 RSIZESUBTST = MAX( RSIZEHEEVX, RSIZEHEEVD, RSIZEQTQ, RSIZECHK ) + 00158 $ IPREPAD + IPOSTPAD 00159 ISIZESUBTST = MAX( ISIZEHEEVX, ISIZEHEEVD ) + IPREPAD + IPOSTPAD 00160 * 00161 * Allow room for A, COPYA and Z and WORK 00162 * 00163 SIZETST = 3*( LDA*NP+IPREPAD+IPOSTPAD ) + SIZESUBTST 00164 * 00165 * Room for DIAG, WIN, WNEW, GAP and RWORK 00166 * 00167 RSIZETST = 4*( N+IPREPAD+IPOSTPAD ) + RSIZESUBTST 00168 * 00169 * Allow room for IFAIL, ICLUSTR, and IWORK (all in PCHEEVX) 00170 * 00171 ISIZETST = N + 2*NPROW*NPCOL + 2*( IPREPAD+IPOSTPAD ) + 00172 $ ISIZESUBTST 00173 * 00174 RETURN 00175 END