Routine: DLAREF()  File: SRC\dlaref.f

 
 
# lines: 278
  # code: 278
  # comment: 0
  # blank:0
# Variables:36
# Callers:1
# Callings:0
# Words:67
# Keywords:54
 

 

..
     .. Array Arguments ..
     ..
  Purpose
  =======
  DLAREF 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) DOUBLE PRECISION 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) DOUBLE PRECISION 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) DOUBLE PRECISION 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) DOUBLE PRECISION
          This holds information on a single size 3 Householder
              reflector and is read when BLOCK is .FALSE., and
              overwritten when BLOCK is .TRUE.
  Implemented by:  G. Henry, November 17, 1996
  =====================================================================
     .. Local Scalars ..

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

 
001        SUBROUTINE DLAREF( 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  *     University of Tennessee , Knoxville , Oak Ridge National Laboratory ,
007  *     and University of California , Berkeley.
008  *     December 31 , 1998
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        DOUBLE PRECISION T1 , T2 , T3 , V2 , V3
016        INTEGER J , K
017        DOUBLE PRECISION H11 , H22 , SUM , T12 , T13 , T22 , T23 , T32 , T33 ,
018       $V22 , V23 , V32 , V33
019  *     ..
020  *     .. External Functions ..
021        LOGICAL LSAME
022        EXTERNAL LSAME
023  *     ..
024  *     .. Intrinsic Functions ..
025        INTRINSIC MOD
026  *     ..
027  *     .. Executable Statements ..
028  
029        IF( LSAME( TYPE , 'R' ) ) THEN
030            IF( BLOCK ) THEN
031                DO 20 K = ISTART , ISTOP - MOD( ISTOP - ISTART + 1 , 3 ) , 3
032                    V2 = VECS(( K - 1 )*3 + 1 )
033                    V3 = VECS(( K - 1 )*3 + 2 )
034                    T1 = VECS(( K - 1 )*3 + 3 )
035                    V22 = VECS(( K - 1 )*3 + 4 )
036                    V32 = VECS(( K - 1 )*3 + 5 )
037                    T12 = VECS(( K - 1 )*3 + 6 )
038                    V23 = VECS(( K - 1 )*3 + 7 )
039                    V33 = VECS(( K - 1 )*3 + 8 )
040                    T13 = VECS(( K - 1 )*3 + 9 )
041                    T2 = T1*V2
042                    T3 = T1*V3
043                    T22 = T12*V22
044                    T32 = T12*V32
045                    T23 = T13*V23
046                    T33 = T13*V33
047                    DO 10 J = ITMP1 , ITMP2
048                        SUM = A( IROW1 , J ) + V2*A( IROW1 + 1 , J ) +
049       $                V3*A( IROW1 + 2 , J )
050                        A( IROW1 , J ) = A( IROW1 , J ) - SUM*T1
051                        H11 = A( IROW1 + 1 , J ) - SUM*T2
052                        H22 = A( IROW1 + 2 , J ) - SUM*T3
053                        SUM = H11 + V22*H22 + V32*A( IROW1 + 3 , J )
054                        A( IROW1 + 1 , J ) = H11 - SUM*T12
055                        H11 = H22 - SUM*T22
056                        H22 = A( IROW1 + 3 , J ) - SUM*T32
057                        SUM = H11 + V23*H22 + V33*A( IROW1 + 4 , J )
058                        A( IROW1 + 2 , J ) = H11 - SUM*T13
059                        A( IROW1 + 3 , J ) = H22 - SUM*T23
060                        A( IROW1 + 4 , J ) = A( IROW1 + 4 , J ) - SUM*T33
061     10             CONTINUE
062                    IROW1 = IROW1 + 3
063     20         CONTINUE
064                DO 40 K = ISTOP - MOD( ISTOP - ISTART + 1 , 3 ) + 1 , ISTOP
065                    V2 = VECS(( K - 1 )*3 + 1 )
066                    V3 = VECS(( K - 1 )*3 + 2 )
067                    T1 = VECS(( K - 1 )*3 + 3 )
068                    T2 = T1*V2
069                    T3 = T1*V3
070                    DO 30 J = ITMP1 , ITMP2
071                        SUM = A( IROW1 , J ) + V2*A( IROW1 + 1 , J ) +
072       $                V3*A( IROW1 + 2 , J )
073                        A( IROW1 , J ) = A( IROW1 , J ) - SUM*T1
074                        A( IROW1 + 1 , J ) = A( IROW1 + 1 , J ) - SUM*T2
075                        A( IROW1 + 2 , J ) = A( IROW1 + 2 , J ) - SUM*T3
076     30             CONTINUE
077                    IROW1 = IROW1 + 1
078     40         CONTINUE
079            ELSE
080                DO 50 J = ITMP1 , ITMP2
081                    SUM = A( IROW1 , J ) + V2*A( IROW1 + 1 , J ) +
082       $            V3*A( IROW1 + 2 , J )
083                    A( IROW1 , J ) = A( IROW1 , J ) - SUM*T1
084                    A( IROW1 + 1 , J ) = A( IROW1 + 1 , J ) - SUM*T2
085                    A( IROW1 + 2 , J ) = A( IROW1 + 2 , J ) - SUM*T3
086     50         CONTINUE
087            END IF
088        ELSE
089  
090  *         Do column transforms
091  
092            IF( BLOCK ) THEN
093                DO 80 K = ISTART , ISTOP - MOD( ISTOP - ISTART + 1 , 3 ) , 3
094                    V2 = VECS(( K - 1 )*3 + 1 )
095                    V3 = VECS(( K - 1 )*3 + 2 )
096                    T1 = VECS(( K - 1 )*3 + 3 )
097                    V22 = VECS(( K - 1 )*3 + 4 )
098                    V32 = VECS(( K - 1 )*3 + 5 )
099                    T12 = VECS(( K - 1 )*3 + 6 )
100                    V23 = VECS(( K - 1 )*3 + 7 )
101                    V33 = VECS(( K - 1 )*3 + 8 )
102                    T13 = VECS(( K - 1 )*3 + 9 )
103                    T2 = T1*V2
104                    T3 = T1*V3
105                    T22 = T12*V22
106                    T32 = T12*V32
107                    T23 = T13*V23
108                    T33 = T13*V33
109                    DO 60 J = ITMP1 , ITMP2
110                        SUM = A( J , ICOL1 ) + V2*A( J , ICOL1 + 1 ) +
111       $                V3*A( J , ICOL1 + 2 )
112                        A( J , ICOL1 ) = A( J , ICOL1 ) - SUM*T1
113                        H11 = A( J , ICOL1 + 1 ) - SUM*T2
114                        H22 = A( J , ICOL1 + 2 ) - SUM*T3
115                        SUM = H11 + V22*H22 + V32*A( J , ICOL1 + 3 )
116                        A( J , ICOL1 + 1 ) = H11 - SUM*T12
117                        H11 = H22 - SUM*T22
118                        H22 = A( J , ICOL1 + 3 ) - SUM*T32
119                        SUM = H11 + V23*H22 + V33*A( J , ICOL1 + 4 )
120                        A( J , ICOL1 + 2 ) = H11 - SUM*T13
121                        A( J , ICOL1 + 3 ) = H22 - SUM*T23
122                        A( J , ICOL1 + 4 ) = A( J , ICOL1 + 4 ) - SUM*T33
123     60             CONTINUE
124                    IF( WANTZ ) THEN
125                        DO 70 J = LILOZ , LIHIZ
126                            SUM = Z( J , ICOL1 ) + V2*Z( J , ICOL1 + 1 ) +
127       $                    V3*Z( J , ICOL1 + 2 )
128                            Z( J , ICOL1 ) = Z( J , ICOL1 ) - SUM*T1
129                            H11 = Z( J , ICOL1 + 1 ) - SUM*T2
130                            H22 = Z( J , ICOL1 + 2 ) - SUM*T3
131                            SUM = H11 + V22*H22 + V32*Z( J , ICOL1 + 3 )
132                            Z( J , ICOL1 + 1 ) = H11 - SUM*T12
133                            H11 = H22 - SUM*T22
134                            H22 = Z( J , ICOL1 + 3 ) - SUM*T32
135                            SUM = H11 + V23*H22 + V33*Z( J , ICOL1 + 4 )
136                            Z( J , ICOL1 + 2 ) = H11 - SUM*T13
137                            Z( J , ICOL1 + 3 ) = H22 - SUM*T23
138                            Z( J , ICOL1 + 4 ) = Z( J , ICOL1 + 4 ) - SUM*T33
139     70                 CONTINUE
140                    END IF
141                    ICOL1 = ICOL1 + 3
142     80         CONTINUE
143                DO 110 K = ISTOP - MOD( ISTOP - ISTART + 1 , 3 ) + 1 , ISTOP
144                    V2 = VECS(( K - 1 )*3 + 1 )
145                    V3 = VECS(( K - 1 )*3 + 2 )
146                    T1 = VECS(( K - 1 )*3 + 3 )
147                    T2 = T1*V2
148                    T3 = T1*V3
149                    DO 90 J = ITMP1 , ITMP2
150                        SUM = A( J , ICOL1 ) + V2*A( J , ICOL1 + 1 ) +
151       $                V3*A( J , ICOL1 + 2 )
152                        A( J , ICOL1 ) = A( J , ICOL1 ) - SUM*T1
153                        A( J , ICOL1 + 1 ) = A( J , ICOL1 + 1 ) - SUM*T2
154                        A( J , ICOL1 + 2 ) = A( J , ICOL1 + 2 ) - SUM*T3
155     90             CONTINUE
156                    IF( WANTZ ) THEN
157                        DO 100 J = LILOZ , LIHIZ
158                            SUM = Z( J , ICOL1 ) + V2*Z( J , ICOL1 + 1 ) +
159       $                    V3*Z( J , ICOL1 + 2 )
160                            Z( J , ICOL1 ) = Z( J , ICOL1 ) - SUM*T1
161                            Z( J , ICOL1 + 1 ) = Z( J , ICOL1 + 1 ) - SUM*T2
162                            Z( J , ICOL1 + 2 ) = Z( J , ICOL1 + 2 ) - SUM*T3
163    100                 CONTINUE
164                    END IF
165                    ICOL1 = ICOL1 + 1
166    110         CONTINUE
167            ELSE
168                DO 120 J = ITMP1 , ITMP2
169                    SUM = A( J , ICOL1 ) + V2*A( J , ICOL1 + 1 ) +
170       $            V3*A( J , ICOL1 + 2 )
171                    A( J , ICOL1 ) = A( J , ICOL1 ) - SUM*T1
172                    A( J , ICOL1 + 1 ) = A( J , ICOL1 + 1 ) - SUM*T2
173                    A( J , ICOL1 + 2 ) = A( J , ICOL1 + 2 ) - SUM*T3
174    120         CONTINUE
175            END IF
176        END IF
177        RETURN
178  
179  *     End of DLAREF
180  
181        END
182