File: pslasizesyev.f

package info (click to toggle)
scalapack 1.7-5
  • links: PTS
  • area: main
  • in suites: woody
  • size: 33,956 kB
  • ctags: 30,434
  • sloc: fortran: 309,685; ansic: 64,027; makefile: 1,836; sh: 4
file content (131 lines) | stat: -rw-r--r-- 4,282 bytes parent folder | download | duplicates (12)
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 PSLASIZESYEV( 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
*  =======
*
*  PSLASIZESYEV computes the amount of memory needed by PSSYEV
*  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 PSSYEV 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 PSSYEV
*
      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 PSLASIZESYEV
*
      END