You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

clarot.f 11 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. *> \brief \b CLAROT
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. * Definition:
  9. * ===========
  10. *
  11. * SUBROUTINE CLAROT( LROWS, LLEFT, LRIGHT, NL, C, S, A, LDA, XLEFT,
  12. * XRIGHT )
  13. *
  14. * .. Scalar Arguments ..
  15. * LOGICAL LLEFT, LRIGHT, LROWS
  16. * INTEGER LDA, NL
  17. * COMPLEX C, S, XLEFT, XRIGHT
  18. * ..
  19. * .. Array Arguments ..
  20. * COMPLEX A( * )
  21. * ..
  22. *
  23. *
  24. *> \par Purpose:
  25. * =============
  26. *>
  27. *> \verbatim
  28. *>
  29. *> CLAROT applies a (Givens) rotation to two adjacent rows or
  30. *> columns, where one element of the first and/or last column/row
  31. *> for use on matrices stored in some format other than GE, so
  32. *> that elements of the matrix may be used or modified for which
  33. *> no array element is provided.
  34. *>
  35. *> One example is a symmetric matrix in SB format (bandwidth=4), for
  36. *> which UPLO='L': Two adjacent rows will have the format:
  37. *>
  38. *> row j: C> C> C> C> C> . . . .
  39. *> row j+1: C> C> C> C> C> . . . .
  40. *>
  41. *> '*' indicates elements for which storage is provided,
  42. *> '.' indicates elements for which no storage is provided, but
  43. *> are not necessarily zero; their values are determined by
  44. *> symmetry. ' ' indicates elements which are necessarily zero,
  45. *> and have no storage provided.
  46. *>
  47. *> Those columns which have two '*'s can be handled by SROT.
  48. *> Those columns which have no '*'s can be ignored, since as long
  49. *> as the Givens rotations are carefully applied to preserve
  50. *> symmetry, their values are determined.
  51. *> Those columns which have one '*' have to be handled separately,
  52. *> by using separate variables "p" and "q":
  53. *>
  54. *> row j: C> C> C> C> C> p . . .
  55. *> row j+1: q C> C> C> C> C> . . . .
  56. *>
  57. *> The element p would have to be set correctly, then that column
  58. *> is rotated, setting p to its new value. The next call to
  59. *> CLAROT would rotate columns j and j+1, using p, and restore
  60. *> symmetry. The element q would start out being zero, and be
  61. *> made non-zero by the rotation. Later, rotations would presumably
  62. *> be chosen to zero q out.
  63. *>
  64. *> Typical Calling Sequences: rotating the i-th and (i+1)-st rows.
  65. *> ------- ------- ---------
  66. *>
  67. *> General dense matrix:
  68. *>
  69. *> CALL CLAROT(.TRUE.,.FALSE.,.FALSE., N, C,S,
  70. *> A(i,1),LDA, DUMMY, DUMMY)
  71. *>
  72. *> General banded matrix in GB format:
  73. *>
  74. *> j = MAX(1, i-KL )
  75. *> NL = MIN( N, i+KU+1 ) + 1-j
  76. *> CALL CLAROT( .TRUE., i-KL.GE.1, i+KU.LT.N, NL, C,S,
  77. *> A(KU+i+1-j,j),LDA-1, XLEFT, XRIGHT )
  78. *>
  79. *> [ note that i+1-j is just MIN(i,KL+1) ]
  80. *>
  81. *> Symmetric banded matrix in SY format, bandwidth K,
  82. *> lower triangle only:
  83. *>
  84. *> j = MAX(1, i-K )
  85. *> NL = MIN( K+1, i ) + 1
  86. *> CALL CLAROT( .TRUE., i-K.GE.1, .TRUE., NL, C,S,
  87. *> A(i,j), LDA, XLEFT, XRIGHT )
  88. *>
  89. *> Same, but upper triangle only:
  90. *>
  91. *> NL = MIN( K+1, N-i ) + 1
  92. *> CALL CLAROT( .TRUE., .TRUE., i+K.LT.N, NL, C,S,
  93. *> A(i,i), LDA, XLEFT, XRIGHT )
  94. *>
  95. *> Symmetric banded matrix in SB format, bandwidth K,
  96. *> lower triangle only:
  97. *>
  98. *> [ same as for SY, except:]
  99. *> . . . .
  100. *> A(i+1-j,j), LDA-1, XLEFT, XRIGHT )
  101. *>
  102. *> [ note that i+1-j is just MIN(i,K+1) ]
  103. *>
  104. *> Same, but upper triangle only:
  105. *> . . .
  106. *> A(K+1,i), LDA-1, XLEFT, XRIGHT )
  107. *>
  108. *> Rotating columns is just the transpose of rotating rows, except
  109. *> for GB and SB: (rotating columns i and i+1)
  110. *>
  111. *> GB:
  112. *> j = MAX(1, i-KU )
  113. *> NL = MIN( N, i+KL+1 ) + 1-j
  114. *> CALL CLAROT( .TRUE., i-KU.GE.1, i+KL.LT.N, NL, C,S,
  115. *> A(KU+j+1-i,i),LDA-1, XTOP, XBOTTM )
  116. *>
  117. *> [note that KU+j+1-i is just MAX(1,KU+2-i)]
  118. *>
  119. *> SB: (upper triangle)
  120. *>
  121. *> . . . . . .
  122. *> A(K+j+1-i,i),LDA-1, XTOP, XBOTTM )
  123. *>
  124. *> SB: (lower triangle)
  125. *>
  126. *> . . . . . .
  127. *> A(1,i),LDA-1, XTOP, XBOTTM )
  128. *> \endverbatim
  129. *
  130. * Arguments:
  131. * ==========
  132. *
  133. *> \verbatim
  134. *> LROWS - LOGICAL
  135. *> If .TRUE., then CLAROT will rotate two rows. If .FALSE.,
  136. *> then it will rotate two columns.
  137. *> Not modified.
  138. *>
  139. *> LLEFT - LOGICAL
  140. *> If .TRUE., then XLEFT will be used instead of the
  141. *> corresponding element of A for the first element in the
  142. *> second row (if LROWS=.FALSE.) or column (if LROWS=.TRUE.)
  143. *> If .FALSE., then the corresponding element of A will be
  144. *> used.
  145. *> Not modified.
  146. *>
  147. *> LRIGHT - LOGICAL
  148. *> If .TRUE., then XRIGHT will be used instead of the
  149. *> corresponding element of A for the last element in the
  150. *> first row (if LROWS=.FALSE.) or column (if LROWS=.TRUE.) If
  151. *> .FALSE., then the corresponding element of A will be used.
  152. *> Not modified.
  153. *>
  154. *> NL - INTEGER
  155. *> The length of the rows (if LROWS=.TRUE.) or columns (if
  156. *> LROWS=.FALSE.) to be rotated. If XLEFT and/or XRIGHT are
  157. *> used, the columns/rows they are in should be included in
  158. *> NL, e.g., if LLEFT = LRIGHT = .TRUE., then NL must be at
  159. *> least 2. The number of rows/columns to be rotated
  160. *> exclusive of those involving XLEFT and/or XRIGHT may
  161. *> not be negative, i.e., NL minus how many of LLEFT and
  162. *> LRIGHT are .TRUE. must be at least zero; if not, XERBLA
  163. *> will be called.
  164. *> Not modified.
  165. *>
  166. *> C, S - COMPLEX
  167. *> Specify the Givens rotation to be applied. If LROWS is
  168. *> true, then the matrix ( c s )
  169. *> ( _ _ )
  170. *> (-s c ) is applied from the left;
  171. *> if false, then the transpose (not conjugated) thereof is
  172. *> applied from the right. Note that in contrast to the
  173. *> output of CROTG or to most versions of CROT, both C and S
  174. *> are complex. For a Givens rotation, |C|**2 + |S|**2 should
  175. *> be 1, but this is not checked.
  176. *> Not modified.
  177. *>
  178. *> A - COMPLEX array.
  179. *> The array containing the rows/columns to be rotated. The
  180. *> first element of A should be the upper left element to
  181. *> be rotated.
  182. *> Read and modified.
  183. *>
  184. *> LDA - INTEGER
  185. *> The "effective" leading dimension of A. If A contains
  186. *> a matrix stored in GE, HE, or SY format, then this is just
  187. *> the leading dimension of A as dimensioned in the calling
  188. *> routine. If A contains a matrix stored in band (GB, HB, or
  189. *> SB) format, then this should be *one less* than the leading
  190. *> dimension used in the calling routine. Thus, if A were
  191. *> dimensioned A(LDA,*) in CLAROT, then A(1,j) would be the
  192. *> j-th element in the first of the two rows to be rotated,
  193. *> and A(2,j) would be the j-th in the second, regardless of
  194. *> how the array may be stored in the calling routine. [A
  195. *> cannot, however, actually be dimensioned thus, since for
  196. *> band format, the row number may exceed LDA, which is not
  197. *> legal FORTRAN.]
  198. *> If LROWS=.TRUE., then LDA must be at least 1, otherwise
  199. *> it must be at least NL minus the number of .TRUE. values
  200. *> in XLEFT and XRIGHT.
  201. *> Not modified.
  202. *>
  203. *> XLEFT - COMPLEX
  204. *> If LLEFT is .TRUE., then XLEFT will be used and modified
  205. *> instead of A(2,1) (if LROWS=.TRUE.) or A(1,2)
  206. *> (if LROWS=.FALSE.).
  207. *> Read and modified.
  208. *>
  209. *> XRIGHT - COMPLEX
  210. *> If LRIGHT is .TRUE., then XRIGHT will be used and modified
  211. *> instead of A(1,NL) (if LROWS=.TRUE.) or A(NL,1)
  212. *> (if LROWS=.FALSE.).
  213. *> Read and modified.
  214. *> \endverbatim
  215. *
  216. * Authors:
  217. * ========
  218. *
  219. *> \author Univ. of Tennessee
  220. *> \author Univ. of California Berkeley
  221. *> \author Univ. of Colorado Denver
  222. *> \author NAG Ltd.
  223. *
  224. *> \ingroup complex_matgen
  225. *
  226. * =====================================================================
  227. SUBROUTINE CLAROT( LROWS, LLEFT, LRIGHT, NL, C, S, A, LDA, XLEFT,
  228. $ XRIGHT )
  229. *
  230. * -- LAPACK auxiliary routine --
  231. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  232. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  233. *
  234. * .. Scalar Arguments ..
  235. LOGICAL LLEFT, LRIGHT, LROWS
  236. INTEGER LDA, NL
  237. COMPLEX C, S, XLEFT, XRIGHT
  238. * ..
  239. * .. Array Arguments ..
  240. COMPLEX A( * )
  241. * ..
  242. *
  243. * =====================================================================
  244. *
  245. * .. Local Scalars ..
  246. INTEGER IINC, INEXT, IX, IY, IYT, J, NT
  247. COMPLEX TEMPX
  248. * ..
  249. * .. Local Arrays ..
  250. COMPLEX XT( 2 ), YT( 2 )
  251. * ..
  252. * .. External Subroutines ..
  253. EXTERNAL XERBLA
  254. * ..
  255. * .. Intrinsic Functions ..
  256. INTRINSIC CONJG
  257. * ..
  258. * .. Executable Statements ..
  259. *
  260. * Set up indices, arrays for ends
  261. *
  262. IF( LROWS ) THEN
  263. IINC = LDA
  264. INEXT = 1
  265. ELSE
  266. IINC = 1
  267. INEXT = LDA
  268. END IF
  269. *
  270. IF( LLEFT ) THEN
  271. NT = 1
  272. IX = 1 + IINC
  273. IY = 2 + LDA
  274. XT( 1 ) = A( 1 )
  275. YT( 1 ) = XLEFT
  276. ELSE
  277. NT = 0
  278. IX = 1
  279. IY = 1 + INEXT
  280. END IF
  281. *
  282. IF( LRIGHT ) THEN
  283. IYT = 1 + INEXT + ( NL-1 )*IINC
  284. NT = NT + 1
  285. XT( NT ) = XRIGHT
  286. YT( NT ) = A( IYT )
  287. END IF
  288. *
  289. * Check for errors
  290. *
  291. IF( NL.LT.NT ) THEN
  292. CALL XERBLA( 'CLAROT', 4 )
  293. RETURN
  294. END IF
  295. IF( LDA.LE.0 .OR. ( .NOT.LROWS .AND. LDA.LT.NL-NT ) ) THEN
  296. CALL XERBLA( 'CLAROT', 8 )
  297. RETURN
  298. END IF
  299. *
  300. * Rotate
  301. *
  302. * CROT( NL-NT, A(IX),IINC, A(IY),IINC, C, S ) with complex C, S
  303. *
  304. DO 10 J = 0, NL - NT - 1
  305. TEMPX = C*A( IX+J*IINC ) + S*A( IY+J*IINC )
  306. A( IY+J*IINC ) = -CONJG( S )*A( IX+J*IINC ) +
  307. $ CONJG( C )*A( IY+J*IINC )
  308. A( IX+J*IINC ) = TEMPX
  309. 10 CONTINUE
  310. *
  311. * CROT( NT, XT,1, YT,1, C, S ) with complex C, S
  312. *
  313. DO 20 J = 1, NT
  314. TEMPX = C*XT( J ) + S*YT( J )
  315. YT( J ) = -CONJG( S )*XT( J ) + CONJG( C )*YT( J )
  316. XT( J ) = TEMPX
  317. 20 CONTINUE
  318. *
  319. * Stuff values back into XLEFT, XRIGHT, etc.
  320. *
  321. IF( LLEFT ) THEN
  322. A( 1 ) = XT( 1 )
  323. XLEFT = YT( 1 )
  324. END IF
  325. *
  326. IF( LRIGHT ) THEN
  327. XRIGHT = XT( NT )
  328. A( IYT ) = YT( NT )
  329. END IF
  330. *
  331. RETURN
  332. *
  333. * End of CLAROT
  334. *
  335. END