1*> \brief \b CUNBDB1 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download CUNBDB1 + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cunbdb1.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cunbdb1.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cunbdb1.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE CUNBDB1( M, P, Q, X11, LDX11, X21, LDX21, THETA, PHI, 22* TAUP1, TAUP2, TAUQ1, WORK, LWORK, INFO ) 23* 24* .. Scalar Arguments .. 25* INTEGER INFO, LWORK, M, P, Q, LDX11, LDX21 26* .. 27* .. Array Arguments .. 28* REAL PHI(*), THETA(*) 29* COMPLEX TAUP1(*), TAUP2(*), TAUQ1(*), WORK(*), 30* $ X11(LDX11,*), X21(LDX21,*) 31* .. 32* 33* 34*> \par Purpose: 35* ============= 36*> 37*>\verbatim 38*> 39*> CUNBDB1 simultaneously bidiagonalizes the blocks of a tall and skinny 40*> matrix X with orthonomal columns: 41*> 42*> [ B11 ] 43*> [ X11 ] [ P1 | ] [ 0 ] 44*> [-----] = [---------] [-----] Q1**T . 45*> [ X21 ] [ | P2 ] [ B21 ] 46*> [ 0 ] 47*> 48*> X11 is P-by-Q, and X21 is (M-P)-by-Q. Q must be no larger than P, 49*> M-P, or M-Q. Routines CUNBDB2, CUNBDB3, and CUNBDB4 handle cases in 50*> which Q is not the minimum dimension. 51*> 52*> The unitary matrices P1, P2, and Q1 are P-by-P, (M-P)-by-(M-P), 53*> and (M-Q)-by-(M-Q), respectively. They are represented implicitly by 54*> Householder vectors. 55*> 56*> B11 and B12 are Q-by-Q bidiagonal matrices represented implicitly by 57*> angles THETA, PHI. 58*> 59*>\endverbatim 60* 61* Arguments: 62* ========== 63* 64*> \param[in] M 65*> \verbatim 66*> M is INTEGER 67*> The number of rows X11 plus the number of rows in X21. 68*> \endverbatim 69*> 70*> \param[in] P 71*> \verbatim 72*> P is INTEGER 73*> The number of rows in X11. 0 <= P <= M. 74*> \endverbatim 75*> 76*> \param[in] Q 77*> \verbatim 78*> Q is INTEGER 79*> The number of columns in X11 and X21. 0 <= Q <= 80*> MIN(P,M-P,M-Q). 81*> \endverbatim 82*> 83*> \param[in,out] X11 84*> \verbatim 85*> X11 is COMPLEX array, dimension (LDX11,Q) 86*> On entry, the top block of the matrix X to be reduced. On 87*> exit, the columns of tril(X11) specify reflectors for P1 and 88*> the rows of triu(X11,1) specify reflectors for Q1. 89*> \endverbatim 90*> 91*> \param[in] LDX11 92*> \verbatim 93*> LDX11 is INTEGER 94*> The leading dimension of X11. LDX11 >= P. 95*> \endverbatim 96*> 97*> \param[in,out] X21 98*> \verbatim 99*> X21 is COMPLEX array, dimension (LDX21,Q) 100*> On entry, the bottom block of the matrix X to be reduced. On 101*> exit, the columns of tril(X21) specify reflectors for P2. 102*> \endverbatim 103*> 104*> \param[in] LDX21 105*> \verbatim 106*> LDX21 is INTEGER 107*> The leading dimension of X21. LDX21 >= M-P. 108*> \endverbatim 109*> 110*> \param[out] THETA 111*> \verbatim 112*> THETA is REAL array, dimension (Q) 113*> The entries of the bidiagonal blocks B11, B21 are defined by 114*> THETA and PHI. See Further Details. 115*> \endverbatim 116*> 117*> \param[out] PHI 118*> \verbatim 119*> PHI is REAL array, dimension (Q-1) 120*> The entries of the bidiagonal blocks B11, B21 are defined by 121*> THETA and PHI. See Further Details. 122*> \endverbatim 123*> 124*> \param[out] TAUP1 125*> \verbatim 126*> TAUP1 is COMPLEX array, dimension (P) 127*> The scalar factors of the elementary reflectors that define 128*> P1. 129*> \endverbatim 130*> 131*> \param[out] TAUP2 132*> \verbatim 133*> TAUP2 is COMPLEX array, dimension (M-P) 134*> The scalar factors of the elementary reflectors that define 135*> P2. 136*> \endverbatim 137*> 138*> \param[out] TAUQ1 139*> \verbatim 140*> TAUQ1 is COMPLEX array, dimension (Q) 141*> The scalar factors of the elementary reflectors that define 142*> Q1. 143*> \endverbatim 144*> 145*> \param[out] WORK 146*> \verbatim 147*> WORK is COMPLEX array, dimension (LWORK) 148*> \endverbatim 149*> 150*> \param[in] LWORK 151*> \verbatim 152*> LWORK is INTEGER 153*> The dimension of the array WORK. LWORK >= M-Q. 154*> 155*> If LWORK = -1, then a workspace query is assumed; the routine 156*> only calculates the optimal size of the WORK array, returns 157*> this value as the first entry of the WORK array, and no error 158*> message related to LWORK is issued by XERBLA. 159*> \endverbatim 160*> 161*> \param[out] INFO 162*> \verbatim 163*> INFO is INTEGER 164*> = 0: successful exit. 165*> < 0: if INFO = -i, the i-th argument had an illegal value. 166*> \endverbatim 167* 168* Authors: 169* ======== 170* 171*> \author Univ. of Tennessee 172*> \author Univ. of California Berkeley 173*> \author Univ. of Colorado Denver 174*> \author NAG Ltd. 175* 176*> \ingroup complexOTHERcomputational 177* 178*> \par Further Details: 179* ===================== 180 181*> \verbatim 182*> 183*> The upper-bidiagonal blocks B11, B21 are represented implicitly by 184*> angles THETA(1), ..., THETA(Q) and PHI(1), ..., PHI(Q-1). Every entry 185*> in each bidiagonal band is a product of a sine or cosine of a THETA 186*> with a sine or cosine of a PHI. See [1] or CUNCSD for details. 187*> 188*> P1, P2, and Q1 are represented as products of elementary reflectors. 189*> See CUNCSD2BY1 for details on generating P1, P2, and Q1 using CUNGQR 190*> and CUNGLQ. 191*> \endverbatim 192* 193*> \par References: 194* ================ 195*> 196*> [1] Brian D. Sutton. Computing the complete CS decomposition. Numer. 197*> Algorithms, 50(1):33-65, 2009. 198*> 199* ===================================================================== 200 SUBROUTINE CUNBDB1( M, P, Q, X11, LDX11, X21, LDX21, THETA, PHI, 201 $ TAUP1, TAUP2, TAUQ1, WORK, LWORK, INFO ) 202* 203* -- LAPACK computational routine -- 204* -- LAPACK is a software package provided by Univ. of Tennessee, -- 205* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 206* 207* .. Scalar Arguments .. 208 INTEGER INFO, LWORK, M, P, Q, LDX11, LDX21 209* .. 210* .. Array Arguments .. 211 REAL PHI(*), THETA(*) 212 COMPLEX TAUP1(*), TAUP2(*), TAUQ1(*), WORK(*), 213 $ X11(LDX11,*), X21(LDX21,*) 214* .. 215* 216* ==================================================================== 217* 218* .. Parameters .. 219 COMPLEX ONE 220 PARAMETER ( ONE = (1.0E0,0.0E0) ) 221* .. 222* .. Local Scalars .. 223 REAL C, S 224 INTEGER CHILDINFO, I, ILARF, IORBDB5, LLARF, LORBDB5, 225 $ LWORKMIN, LWORKOPT 226 LOGICAL LQUERY 227* .. 228* .. External Subroutines .. 229 EXTERNAL CLARF, CLARFGP, CUNBDB5, CSROT, XERBLA 230 EXTERNAL CLACGV 231* .. 232* .. External Functions .. 233 REAL SCNRM2 234 EXTERNAL SCNRM2 235* .. 236* .. Intrinsic Function .. 237 INTRINSIC ATAN2, COS, MAX, SIN, SQRT 238* .. 239* .. Executable Statements .. 240* 241* Test input arguments 242* 243 INFO = 0 244 LQUERY = LWORK .EQ. -1 245* 246 IF( M .LT. 0 ) THEN 247 INFO = -1 248 ELSE IF( P .LT. Q .OR. M-P .LT. Q ) THEN 249 INFO = -2 250 ELSE IF( Q .LT. 0 .OR. M-Q .LT. Q ) THEN 251 INFO = -3 252 ELSE IF( LDX11 .LT. MAX( 1, P ) ) THEN 253 INFO = -5 254 ELSE IF( LDX21 .LT. MAX( 1, M-P ) ) THEN 255 INFO = -7 256 END IF 257* 258* Compute workspace 259* 260 IF( INFO .EQ. 0 ) THEN 261 ILARF = 2 262 LLARF = MAX( P-1, M-P-1, Q-1 ) 263 IORBDB5 = 2 264 LORBDB5 = Q-2 265 LWORKOPT = MAX( ILARF+LLARF-1, IORBDB5+LORBDB5-1 ) 266 LWORKMIN = LWORKOPT 267 WORK(1) = LWORKOPT 268 IF( LWORK .LT. LWORKMIN .AND. .NOT.LQUERY ) THEN 269 INFO = -14 270 END IF 271 END IF 272 IF( INFO .NE. 0 ) THEN 273 CALL XERBLA( 'CUNBDB1', -INFO ) 274 RETURN 275 ELSE IF( LQUERY ) THEN 276 RETURN 277 END IF 278* 279* Reduce columns 1, ..., Q of X11 and X21 280* 281 DO I = 1, Q 282* 283 CALL CLARFGP( P-I+1, X11(I,I), X11(I+1,I), 1, TAUP1(I) ) 284 CALL CLARFGP( M-P-I+1, X21(I,I), X21(I+1,I), 1, TAUP2(I) ) 285 THETA(I) = ATAN2( REAL( X21(I,I) ), REAL( X11(I,I) ) ) 286 C = COS( THETA(I) ) 287 S = SIN( THETA(I) ) 288 X11(I,I) = ONE 289 X21(I,I) = ONE 290 CALL CLARF( 'L', P-I+1, Q-I, X11(I,I), 1, CONJG(TAUP1(I)), 291 $ X11(I,I+1), LDX11, WORK(ILARF) ) 292 CALL CLARF( 'L', M-P-I+1, Q-I, X21(I,I), 1, CONJG(TAUP2(I)), 293 $ X21(I,I+1), LDX21, WORK(ILARF) ) 294* 295 IF( I .LT. Q ) THEN 296 CALL CSROT( Q-I, X11(I,I+1), LDX11, X21(I,I+1), LDX21, C, 297 $ S ) 298 CALL CLACGV( Q-I, X21(I,I+1), LDX21 ) 299 CALL CLARFGP( Q-I, X21(I,I+1), X21(I,I+2), LDX21, TAUQ1(I) ) 300 S = REAL( X21(I,I+1) ) 301 X21(I,I+1) = ONE 302 CALL CLARF( 'R', P-I, Q-I, X21(I,I+1), LDX21, TAUQ1(I), 303 $ X11(I+1,I+1), LDX11, WORK(ILARF) ) 304 CALL CLARF( 'R', M-P-I, Q-I, X21(I,I+1), LDX21, TAUQ1(I), 305 $ X21(I+1,I+1), LDX21, WORK(ILARF) ) 306 CALL CLACGV( Q-I, X21(I,I+1), LDX21 ) 307 C = SQRT( SCNRM2( P-I, X11(I+1,I+1), 1 )**2 308 $ + SCNRM2( M-P-I, X21(I+1,I+1), 1 )**2 ) 309 PHI(I) = ATAN2( S, C ) 310 CALL CUNBDB5( P-I, M-P-I, Q-I-1, X11(I+1,I+1), 1, 311 $ X21(I+1,I+1), 1, X11(I+1,I+2), LDX11, 312 $ X21(I+1,I+2), LDX21, WORK(IORBDB5), LORBDB5, 313 $ CHILDINFO ) 314 END IF 315* 316 END DO 317* 318 RETURN 319* 320* End of CUNBDB1 321* 322 END 323 324