Routine: ZLAREF()  File: SRC\zlaref.f

 
 
# lines: 331
  # code: 331
  # comment: 0
  # blank:0
# Variables:54
# Callers:1
# Callings:0
# Words:121
# Keywords:56
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  ZLAREF applies one or several Householder reflectors of size 3
     to one or two matrices (if column is specified) on either their
     rows or columns.
  Arguments
  =========
  TYPE    (global input) CHARACTER*1
          If 'R': Apply reflectors to the rows of the matrix
              (apply from left)
          Otherwise: Apply reflectors to the columns of the matrix
          Unchanged on exit.
  A       (global input/output) COMPLEX*16 array, (LDA,*)
          On entry, the matrix to receive the reflections.
          The updated matrix on exit.
  LDA     (local input) INTEGER
          On entry, the leading dimension of A.  Unchanged on exit.
  WANTZ   (global input) LOGICAL
          If .TRUE., then apply any column reflections to Z as well.
          If .FALSE., then do no additional work on Z.
  Z       (global input/output) COMPLEX*16 array, (LDZ,*)
          On entry, the second matrix to receive column reflections.
          This is changed only if WANTZ is set.
  LDZ     (local input) INTEGER
          On entry, the leading dimension of Z.  Unchanged on exit.
  BLOCK   (global input) LOGICAL
          If .TRUE., then apply several reflectors at once and read
             their data from the VECS array.
          If .FALSE., apply the single reflector given by V2, V3,
             T1, T2, and T3.
  IROW1   (local input/output) INTEGER
          On entry, the local row element of A.
          Undefined on output.
  ICOL1   (local input/output) INTEGER
          On entry, the local column element of A.
          Undefined on output.
  ISTART  (global input) INTEGER
          Specifies the "number" of the first reflector.  This is
              used as an index into VECS if BLOCK is set.
              ISTART is ignored if BLOCK is .FALSE..
  ISTOP   (global input) INTEGER
          Specifies the "number" of the last reflector.  This is
              used as an index into VECS if BLOCK is set.
              ISTOP is ignored if BLOCK is .FALSE..
  ITMP1   (local input) INTEGER
          Starting range into A.  For rows, this is the local
              first column.  For columns, this is the local first row.
  ITMP2   (local input) INTEGER
          Ending range into A.  For rows, this is the local last
              column.  For columns, this is the local last row.
  LILOZ
  LIHIZ   (local input) INTEGER
          These serve the same purpose as ITMP1,ITMP2 but for Z
              when WANTZ is set.
  VECS    (global input) COMPLEX*16 array of size 3*N (matrix size)
          This holds the size 3 reflectors one after another and this
              is only accessed when BLOCK is .TRUE.
  V2
  V3
  T1
  T2
  T3      (global input/output) COMPLEX*16
          This holds information on a single size 3 Householder
              reflector and is read when BLOCK is .FALSE., and
              overwritten when BLOCK is .TRUE.
  Further Details
  ===============
  Implemented by:  M. Fahey, May 28, 1999
  =====================================================================
     .. Local Scalars ..

 
Display dynamic version Find AutoScroll Reload FontSize: - + Hide Comments Hide Blanks Frame FullScreen MailPrint

 
001        SUBROUTINE ZLAREF( TYPE , A , LDA , WANTZ , Z , LDZ , BLOCK , IROW1 ,
002       $ICOL1 , ISTART , ISTOP , ITMP1 , ITMP2 , LILOZ ,
003       $LIHIZ , VECS , V2 , V3 , T1 , T2 , T3 )
004  
005  *     -- ScaLAPACK routine(version 1.7) --
006  *     Univ. of Tennessee , Univ. of California Berkeley , NAG Ltd. ,
007  *     Courant Institute , Argonne National Lab , and Rice University
008  *     May 28 , 1999
009  
010  *     .. Scalar Arguments ..
011        LOGICAL BLOCK , WANTZ
012        CHARACTER TYPE
013        INTEGER ICOL1 , IROW1 , ISTART , ISTOP , ITMP1 , ITMP2 , LDA ,
014       $LDZ , LIHIZ , LILOZ
015        COMPLEX*16 T1 , T2 , T3 , V2 , V3
016        INTEGER J , K
017        COMPLEX*16 A1 , A11 , A2 , A22 , A3 , A4 , A5 , B1 , B2 , B3 , B4 ,
018       $B5 , H11 , H22 , SUM , SUM1 , SUM2 , SUM3 , T12 , T13 ,
019       $T22 , T23 , T32 , T33 , TMP1 , TMP2 , TMP3 , V22 , V23 ,
020       $V32 , V33
021  *     ..
022  *     .. External Functions ..
023        LOGICAL LSAME
024        EXTERNAL LSAME
025  *     ..
026  *     .. Intrinsic Functions ..
027        INTRINSIC DCONJG , MOD
028  *     ..
029  *     .. Executable Statements ..
030  
031        IF( LSAME( TYPE , 'R' ) ) THEN
032            IF( BLOCK ) THEN
033                DO 30 K = ISTART , ISTOP - MOD( ISTOP - ISTART + 1 , 3 ) , 3
034                    V2 = VECS(( K - 1 )*3 + 1 )
035                    V3 = VECS(( K - 1 )*3 + 2 )
036                    T1 = VECS(( K - 1 )*3 + 3 )
037                    V22 = VECS(( K - 1 )*3 + 4 )
038                    V32 = VECS(( K - 1 )*3 + 5 )
039                    T12 = VECS(( K - 1 )*3 + 6 )
040                    V23 = VECS(( K - 1 )*3 + 7 )
041                    V33 = VECS(( K - 1 )*3 + 8 )
042                    T13 = VECS(( K - 1 )*3 + 9 )
043                    T2 = T1*V2
044                    T3 = T1*V3
045                    T22 = T12*V22
046                    T32 = T12*V32
047                    T23 = T13*V23
048                    T33 = T13*V33
049                    DO 10 J = ITMP1 , ITMP2 - MOD( ITMP2 - ITMP1 + 1 , 2 ) , 2
050                        A1 = A( IROW1 , J )
051                        A2 = A( IROW1 + 1 , J )
052                        A3 = A( IROW1 + 2 , J )
053                        A4 = A( IROW1 + 3 , J )
054                        A5 = A( IROW1 + 4 , J )
055                        B1 = A( IROW1 , J + 1 )
056                        B2 = A( IROW1 + 1 , J + 1 )
057                        B3 = A( IROW1 + 2 , J + 1 )
058                        B4 = A( IROW1 + 3 , J + 1 )
059                        B5 = A( IROW1 + 4 , J + 1 )
060                        SUM1 = DCONJG( T1 )*A1 + DCONJG( T2 )*A2 +
061       $                DCONJG( T3 )*A3
062                        A( IROW1 , J ) = A1 - SUM1
063                        H11 = A2 - SUM1*V2
064                        H22 = A3 - SUM1*V3
065                        TMP1 = DCONJG( T1 )*B1 + DCONJG( T2 )*B2 +
066       $                DCONJG( T3 )*B3
067                        A( IROW1 , J + 1 ) = B1 - TMP1
068                        A11 = B2 - TMP1*V2
069                        A22 = B3 - TMP1*V3
070                        SUM2 = DCONJG( T12 )*H11 + DCONJG( T22 )*H22 +
071       $                DCONJG( T32 )*A4
072                        A( IROW1 + 1 , J ) = H11 - SUM2
073                        H11 = H22 - SUM2*V22
074                        H22 = A4 - SUM2*V32
075                        TMP2 = DCONJG( T12 )*A11 + DCONJG( T22 )*A22 +
076       $                DCONJG( T32 )*B4
077                        A( IROW1 + 1 , J + 1 ) = A11 - TMP2
078                        A11 = A22 - TMP2*V22
079                        A22 = B4 - TMP2*V32
080                        SUM3 = DCONJG( T13 )*H11 + DCONJG( T23 )*H22 +
081       $                DCONJG( T33 )*A5
082                        A( IROW1 + 2 , J ) = H11 - SUM3
083                        A( IROW1 + 3 , J ) = H22 - SUM3*V23
084                        A( IROW1 + 4 , J ) = A5 - SUM3*V33
085                        TMP3 = DCONJG( T13 )*A11 + DCONJG( T23 )*A22 +
086       $                DCONJG( T33 )*B5
087                        A( IROW1 + 2 , J + 1 ) = A11 - TMP3
088                        A( IROW1 + 3 , J + 1 ) = A22 - TMP3*V23
089                        A( IROW1 + 4 , J + 1 ) = B5 - TMP3*V33
090     10             CONTINUE
091                    DO 20 J = ITMP2 - MOD( ITMP2 - ITMP1 + 1 , 2 ) + 1 , ITMP2
092                        SUM = DCONJG( T1 )*A( IROW1 , J ) +
093       $                DCONJG( T2 )*A( IROW1 + 1 , J ) +
094       $                DCONJG( T3 )*A( IROW1 + 2 , J )
095                        A( IROW1 , J ) = A( IROW1 , J ) - SUM
096                        H11 = A( IROW1 + 1 , J ) - SUM*V2
097                        H22 = A( IROW1 + 2 , J ) - SUM*V3
098                        SUM = DCONJG( T12 )*H11 + DCONJG( T22 )*H22 +
099       $                DCONJG( T32 )*A( IROW1 + 3 , J )
100                        A( IROW1 + 1 , J ) = H11 - SUM
101                        H11 = H22 - SUM*V22
102                        H22 = A( IROW1 + 3 , J ) - SUM*V32
103                        SUM = DCONJG( T13 )*H11 + DCONJG( T23 )*H22 +
104       $                DCONJG( T33 )*A( IROW1 + 4 , J )
105                        A( IROW1 + 2 , J ) = H11 - SUM
106                        A( IROW1 + 3 , J ) = H22 - SUM*V23
107                        A( IROW1 + 4 , J ) = A( IROW1 + 4 , J ) - SUM*V33
108     20             CONTINUE
109                    IROW1 = IROW1 + 3
110     30         CONTINUE
111                DO 50 K = ISTOP - MOD( ISTOP - ISTART + 1 , 3 ) + 1 , ISTOP
112                    V2 = VECS(( K - 1 )*3 + 1 )
113                    V3 = VECS(( K - 1 )*3 + 2 )
114                    T1 = VECS(( K - 1 )*3 + 3 )
115                    T2 = T1*V2
116                    T3 = T1*V3
117                    DO 40 J = ITMP1 , ITMP2
118                        SUM = DCONJG( T1 )*A( IROW1 , J ) +
119       $                DCONJG( T2 )*A( IROW1 + 1 , J ) +
120       $                DCONJG( T3 )*A( IROW1 + 2 , J )
121                        A( IROW1 , J ) = A( IROW1 , J ) - SUM
122                        A( IROW1 + 1 , J ) = A( IROW1 + 1 , J ) - SUM*V2
123                        A( IROW1 + 2 , J ) = A( IROW1 + 2 , J ) - SUM*V3
124     40             CONTINUE
125                    IROW1 = IROW1 + 1
126     50         CONTINUE
127            ELSE
128                DO 60 J = ITMP1 , ITMP2
129                    SUM = DCONJG( T1 )*A( IROW1 , J ) +
130       $            DCONJG( T2 )*A( IROW1 + 1 , J ) +
131       $            DCONJG( T3 )*A( IROW1 + 2 , J )
132                    A( IROW1 , J ) = A( IROW1 , J ) - SUM
133                    A( IROW1 + 1 , J ) = A( IROW1 + 1 , J ) - SUM*V2
134                    A( IROW1 + 2 , J ) = A( IROW1 + 2 , J ) - SUM*V3
135     60         CONTINUE
136            END IF
137        ELSE
138  
139  *         Do column transforms
140  
141            IF( BLOCK ) THEN
142                DO 90 K = ISTART , ISTOP - MOD( ISTOP - ISTART + 1 , 3 ) , 3
143                    V2 = VECS(( K - 1 )*3 + 1 )
144                    V3 = VECS(( K - 1 )*3 + 2 )
145                    T1 = VECS(( K - 1 )*3 + 3 )
146                    V22 = VECS(( K - 1 )*3 + 4 )
147                    V32 = VECS(( K - 1 )*3 + 5 )
148                    T12 = VECS(( K - 1 )*3 + 6 )
149                    V23 = VECS(( K - 1 )*3 + 7 )
150                    V33 = VECS(( K - 1 )*3 + 8 )
151                    T13 = VECS(( K - 1 )*3 + 9 )
152                    T2 = T1*V2
153                    T3 = T1*V3
154                    T22 = T12*V22
155                    T32 = T12*V32
156                    T23 = T13*V23
157                    T33 = T13*V33
158                    DO 70 J = ITMP1 , ITMP2
159                        SUM = T1*A( J , ICOL1 ) + T2*A( J , ICOL1 + 1 ) +
160       $                T3*A( J , ICOL1 + 2 )
161                        A( J , ICOL1 ) = A( J , ICOL1 ) - SUM
162                        H11 = A( J , ICOL1 + 1 ) - SUM*DCONJG( V2 )
163                        H22 = A( J , ICOL1 + 2 ) - SUM*DCONJG( V3 )
164                        SUM = T12*H11 + T22*H22 + T32*A( J , ICOL1 + 3 )
165                        A( J , ICOL1 + 1 ) = H11 - SUM
166                        H11 = H22 - SUM*DCONJG( V22 )
167                        H22 = A( J , ICOL1 + 3 ) - SUM*DCONJG( V32 )
168                        SUM = T13*H11 + T23*H22 + T33*A( J , ICOL1 + 4 )
169                        A( J , ICOL1 + 2 ) = H11 - SUM
170                        A( J , ICOL1 + 3 ) = H22 - SUM*DCONJG( V23 )
171                        A( J , ICOL1 + 4 ) = A( J , ICOL1 + 4 ) - SUM*DCONJG( V33 )
172     70             CONTINUE
173                    IF( WANTZ ) THEN
174                        DO 80 J = LILOZ , LIHIZ
175                            SUM = T1*Z( J , ICOL1 ) + T2*Z( J , ICOL1 + 1 ) +
176       $                    T3*Z( J , ICOL1 + 2 )
177                            Z( J , ICOL1 ) = Z( J , ICOL1 ) - SUM
178                            H11 = Z( J , ICOL1 + 1 ) - SUM*DCONJG( V2 )
179                            H22 = Z( J , ICOL1 + 2 ) - SUM*DCONJG( V3 )
180                            SUM = T12*H11 + T22*H22 + T32*Z( J , ICOL1 + 3 )
181                            Z( J , ICOL1 + 1 ) = H11 - SUM
182                            H11 = H22 - SUM*DCONJG( V22 )
183                            H22 = Z( J , ICOL1 + 3 ) - SUM*DCONJG( V32 )
184                            SUM = T13*H11 + T23*H22 + T33*Z( J , ICOL1 + 4 )
185                            Z( J , ICOL1 + 2 ) = H11 - SUM
186                            Z( J , ICOL1 + 3 ) = H22 - SUM*DCONJG( V23 )
187                            Z( J , ICOL1 + 4 ) = Z( J , ICOL1 + 4 ) -
188       $                    SUM*DCONJG( V33 )
189     80                 CONTINUE
190                    END IF
191                    ICOL1 = ICOL1 + 3
192     90         CONTINUE
193                DO 120 K = ISTOP - MOD( ISTOP - ISTART + 1 , 3 ) + 1 , ISTOP
194                    V2 = VECS(( K - 1 )*3 + 1 )
195                    V3 = VECS(( K - 1 )*3 + 2 )
196                    T1 = VECS(( K - 1 )*3 + 3 )
197                    T2 = T1*V2
198                    T3 = T1*V3
199                    DO 100 J = ITMP1 , ITMP2
200                        SUM = T1*A( J , ICOL1 ) + T2*A( J , ICOL1 + 1 ) +
201       $                T3*A( J , ICOL1 + 2 )
202                        A( J , ICOL1 ) = A( J , ICOL1 ) - SUM
203                        A( J , ICOL1 + 1 ) = A( J , ICOL1 + 1 ) - SUM*DCONJG( V2 )
204                        A( J , ICOL1 + 2 ) = A( J , ICOL1 + 2 ) - SUM*DCONJG( V3 )
205    100             CONTINUE
206                    IF( WANTZ ) THEN
207                        DO 110 J = LILOZ , LIHIZ
208                            SUM = T1*Z( J , ICOL1 ) + T2*Z( J , ICOL1 + 1 ) +
209       $                    T3*Z( J , ICOL1 + 2 )
210                            Z( J , ICOL1 ) = Z( J , ICOL1 ) - SUM
211                            Z( J , ICOL1 + 1 ) = Z( J , ICOL1 + 1 ) -
212       $                    SUM*DCONJG( V2 )
213                            Z( J , ICOL1 + 2 ) = Z( J , ICOL1 + 2 ) -
214       $                    SUM*DCONJG( V3 )
215    110                 CONTINUE
216                    END IF
217                    ICOL1 = ICOL1 + 1
218    120         CONTINUE
219            ELSE
220                DO 130 J = ITMP1 , ITMP2
221                    SUM = T1*A( J , ICOL1 ) + T2*A( J , ICOL1 + 1 ) +
222       $            T3*A( J , ICOL1 + 2 )
223                    A( J , ICOL1 ) = A( J , ICOL1 ) - SUM
224                    A( J , ICOL1 + 1 ) = A( J , ICOL1 + 1 ) - SUM*DCONJG( V2 )
225                    A( J , ICOL1 + 2 ) = A( J , ICOL1 + 2 ) - SUM*DCONJG( V3 )
226    130         CONTINUE
227            END IF
228        END IF
229        RETURN
230  
231  *     End of ZLAREF
232  
233        END