1 *> \brief \b ZLARF 2 * 3 * =========== DOCUMENTATION =========== 4 * 5 * Online html documentation available at 6 * http://www.netlib.org/lapack/explore-html/ 7 * 8 *> \htmlonly 9 *> Download ZLARF + dependencies 10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarf.f"> 11 *> [TGZ]</a> 12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarf.f"> 13 *> [ZIP]</a> 14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarf.f"> 15 *> [TXT]</a> 16 *> \endhtmlonly 17 * 18 * Definition: 19 * =========== 20 * 21 * SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) 22 * 23 * .. Scalar Arguments .. 24 * CHARACTER SIDE 25 * INTEGER INCV, LDC, M, N 26 * COMPLEX*16 TAU 27 * .. 28 * .. Array Arguments .. 29 * COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) 30 * .. 31 * 32 * 33 *> \par Purpose: 34 * ============= 35 *> 36 *> \verbatim 37 *> 38 *> ZLARF applies a complex elementary reflector H to a complex M-by-N 39 *> matrix C, from either the left or the right. H is represented in the 40 *> form 41 *> 42 *> H = I - tau * v * v**H 43 *> 44 *> where tau is a complex scalar and v is a complex vector. 45 *> 46 *> If tau = 0, then H is taken to be the unit matrix. 47 *> 48 *> To apply H**H, supply conjg(tau) instead 49 *> tau. 50 *> \endverbatim 51 * 52 * Arguments: 53 * ========== 54 * 55 *> \param[in] SIDE 56 *> \verbatim 57 *> SIDE is CHARACTER*1 58 *> = 'L': form H * C 59 *> = 'R': form C * H 60 *> \endverbatim 61 *> 62 *> \param[in] M 63 *> \verbatim 64 *> M is INTEGER 65 *> The number of rows of the matrix C. 66 *> \endverbatim 67 *> 68 *> \param[in] N 69 *> \verbatim 70 *> N is INTEGER 71 *> The number of columns of the matrix C. 72 *> \endverbatim 73 *> 74 *> \param[in] V 75 *> \verbatim 76 *> V is COMPLEX*16 array, dimension 77 *> (1 + (M-1)*abs(INCV)) if SIDE = 'L' 78 *> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' 79 *> The vector v in the representation of H. V is not used if 80 *> TAU = 0. 81 *> \endverbatim 82 *> 83 *> \param[in] INCV 84 *> \verbatim 85 *> INCV is INTEGER 86 *> The increment between elements of v. INCV <> 0. 87 *> \endverbatim 88 *> 89 *> \param[in] TAU 90 *> \verbatim 91 *> TAU is COMPLEX*16 92 *> The value tau in the representation of H. 93 *> \endverbatim 94 *> 95 *> \param[in,out] C 96 *> \verbatim 97 *> C is COMPLEX*16 array, dimension (LDC,N) 98 *> On entry, the M-by-N matrix C. 99 *> On exit, C is overwritten by the matrix H * C if SIDE = 'L', 100 *> or C * H if SIDE = 'R'. 101 *> \endverbatim 102 *> 103 *> \param[in] LDC 104 *> \verbatim 105 *> LDC is INTEGER 106 *> The leading dimension of the array C. LDC >= max(1,M). 107 *> \endverbatim 108 *> 109 *> \param[out] WORK 110 *> \verbatim 111 *> WORK is COMPLEX*16 array, dimension 112 *> (N) if SIDE = 'L' 113 *> or (M) if SIDE = 'R' 114 *> \endverbatim 115 * 116 * Authors: 117 * ======== 118 * 119 *> \author Univ. of Tennessee 120 *> \author Univ. of California Berkeley 121 *> \author Univ. of Colorado Denver 122 *> \author NAG Ltd. 123 * 124 *> \date November 2011 125 * 126 *> \ingroup complex16OTHERauxiliary 127 * 128 * ===================================================================== 129 SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) 130 * 131 * -- LAPACK auxiliary routine (version 3.4.0) -- 132 * -- LAPACK is a software package provided by Univ. of Tennessee, -- 133 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 134 * November 2011 135 * 136 * .. Scalar Arguments .. 137 CHARACTER SIDE 138 INTEGER INCV, LDC, M, N 139 COMPLEX*16 TAU 140 * .. 141 * .. Array Arguments .. 142 COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) 143 * .. 144 * 145 * ===================================================================== 146 * 147 * .. Parameters .. 148 COMPLEX*16 ONE, ZERO 149 PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), 150 $ ZERO = ( 0.0D+0, 0.0D+0 ) ) 151 * .. 152 * .. Local Scalars .. 153 LOGICAL APPLYLEFT 154 INTEGER I, LASTV, LASTC 155 * .. 156 * .. External Subroutines .. 157 EXTERNAL ZGEMV, ZGERC 158 * .. 159 * .. External Functions .. 160 LOGICAL LSAME 161 INTEGER ILAZLR, ILAZLC 162 EXTERNAL LSAME, ILAZLR, ILAZLC 163 * .. 164 * .. Executable Statements .. 165 * 166 APPLYLEFT = LSAME( SIDE, 'L' ) 167 LASTV = 0 168 LASTC = 0 169 IF( TAU.NE.ZERO ) THEN 170 * Set up variables for scanning V. LASTV begins pointing to the end 171 * of V. 172 IF( APPLYLEFT ) THEN 173 LASTV = M 174 ELSE 175 LASTV = N 176 END IF 177 IF( INCV.GT.0 ) THEN 178 I = 1 + (LASTV-1) * INCV 179 ELSE 180 I = 1 181 END IF 182 * Look for the last non-zero row in V. 183 DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) 184 LASTV = LASTV - 1 185 I = I - INCV 186 END DO 187 IF( APPLYLEFT ) THEN 188 * Scan for the last non-zero column in C(1:lastv,:). 189 LASTC = ILAZLC(LASTV, N, C, LDC) 190 ELSE 191 * Scan for the last non-zero row in C(:,1:lastv). 192 LASTC = ILAZLR(M, LASTV, C, LDC) 193 END IF 194 END IF 195 * Note that lastc.eq.0 renders the BLAS operations null; no special 196 * case is needed at this level. 197 IF( APPLYLEFT ) THEN 198 * 199 * Form H * C 200 * 201 IF( LASTV.GT.0 ) THEN 202 * 203 * w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) 204 * 205 CALL ZGEMV( 'Conjugate transpose', LASTV, LASTC, ONE, 206 $ C, LDC, V, INCV, ZERO, WORK, 1 ) 207 * 208 * C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H 209 * 210 CALL ZGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) 211 END IF 212 ELSE 213 * 214 * Form C * H 215 * 216 IF( LASTV.GT.0 ) THEN 217 * 218 * w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) 219 * 220 CALL ZGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, 221 $ V, INCV, ZERO, WORK, 1 ) 222 * 223 * C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H 224 * 225 CALL ZGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) 226 END IF 227 END IF 228 RETURN 229 * 230 * End of ZLARF 231 * 232 END 233