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.

dgesvj.f 68 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612
  1. *> \brief \b DGESVJ
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download DGESVJ + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgesvj.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgesvj.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgesvj.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE DGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
  22. * LDV, WORK, LWORK, INFO )
  23. *
  24. * .. Scalar Arguments ..
  25. * INTEGER INFO, LDA, LDV, LWORK, M, MV, N
  26. * CHARACTER*1 JOBA, JOBU, JOBV
  27. * ..
  28. * .. Array Arguments ..
  29. * DOUBLE PRECISION A( LDA, * ), SVA( N ), V( LDV, * ),
  30. * $ WORK( LWORK )
  31. * ..
  32. *
  33. *
  34. *> \par Purpose:
  35. * =============
  36. *>
  37. *> \verbatim
  38. *>
  39. *> DGESVJ computes the singular value decomposition (SVD) of a real
  40. *> M-by-N matrix A, where M >= N. The SVD of A is written as
  41. *> [++] [xx] [x0] [xx]
  42. *> A = U * SIGMA * V^t, [++] = [xx] * [ox] * [xx]
  43. *> [++] [xx]
  44. *> where SIGMA is an N-by-N diagonal matrix, U is an M-by-N orthonormal
  45. *> matrix, and V is an N-by-N orthogonal matrix. The diagonal elements
  46. *> of SIGMA are the singular values of A. The columns of U and V are the
  47. *> left and the right singular vectors of A, respectively.
  48. *> DGESVJ can sometimes compute tiny singular values and their singular vectors much
  49. *> more accurately than other SVD routines, see below under Further Details.
  50. *> \endverbatim
  51. *
  52. * Arguments:
  53. * ==========
  54. *
  55. *> \param[in] JOBA
  56. *> \verbatim
  57. *> JOBA is CHARACTER*1
  58. *> Specifies the structure of A.
  59. *> = 'L': The input matrix A is lower triangular;
  60. *> = 'U': The input matrix A is upper triangular;
  61. *> = 'G': The input matrix A is general M-by-N matrix, M >= N.
  62. *> \endverbatim
  63. *>
  64. *> \param[in] JOBU
  65. *> \verbatim
  66. *> JOBU is CHARACTER*1
  67. *> Specifies whether to compute the left singular vectors
  68. *> (columns of U):
  69. *> = 'U': The left singular vectors corresponding to the nonzero
  70. *> singular values are computed and returned in the leading
  71. *> columns of A. See more details in the description of A.
  72. *> The default numerical orthogonality threshold is set to
  73. *> approximately TOL=CTOL*EPS, CTOL=DSQRT(M), EPS=DLAMCH('E').
  74. *> = 'C': Analogous to JOBU='U', except that user can control the
  75. *> level of numerical orthogonality of the computed left
  76. *> singular vectors. TOL can be set to TOL = CTOL*EPS, where
  77. *> CTOL is given on input in the array WORK.
  78. *> No CTOL smaller than ONE is allowed. CTOL greater
  79. *> than 1 / EPS is meaningless. The option 'C'
  80. *> can be used if M*EPS is satisfactory orthogonality
  81. *> of the computed left singular vectors, so CTOL=M could
  82. *> save few sweeps of Jacobi rotations.
  83. *> See the descriptions of A and WORK(1).
  84. *> = 'N': The matrix U is not computed. However, see the
  85. *> description of A.
  86. *> \endverbatim
  87. *>
  88. *> \param[in] JOBV
  89. *> \verbatim
  90. *> JOBV is CHARACTER*1
  91. *> Specifies whether to compute the right singular vectors, that
  92. *> is, the matrix V:
  93. *> = 'V': the matrix V is computed and returned in the array V
  94. *> = 'A': the Jacobi rotations are applied to the MV-by-N
  95. *> array V. In other words, the right singular vector
  96. *> matrix V is not computed explicitly, instead it is
  97. *> applied to an MV-by-N matrix initially stored in the
  98. *> first MV rows of V.
  99. *> = 'N': the matrix V is not computed and the array V is not
  100. *> referenced
  101. *> \endverbatim
  102. *>
  103. *> \param[in] M
  104. *> \verbatim
  105. *> M is INTEGER
  106. *> The number of rows of the input matrix A. 1/DLAMCH('E') > M >= 0.
  107. *> \endverbatim
  108. *>
  109. *> \param[in] N
  110. *> \verbatim
  111. *> N is INTEGER
  112. *> The number of columns of the input matrix A.
  113. *> M >= N >= 0.
  114. *> \endverbatim
  115. *>
  116. *> \param[in,out] A
  117. *> \verbatim
  118. *> A is DOUBLE PRECISION array, dimension (LDA,N)
  119. *> On entry, the M-by-N matrix A.
  120. *> On exit :
  121. *> If JOBU = 'U' .OR. JOBU = 'C' :
  122. *> If INFO = 0 :
  123. *> RANKA orthonormal columns of U are returned in the
  124. *> leading RANKA columns of the array A. Here RANKA <= N
  125. *> is the number of computed singular values of A that are
  126. *> above the underflow threshold DLAMCH('S'). The singular
  127. *> vectors corresponding to underflowed or zero singular
  128. *> values are not computed. The value of RANKA is returned
  129. *> in the array WORK as RANKA=NINT(WORK(2)). Also see the
  130. *> descriptions of SVA and WORK. The computed columns of U
  131. *> are mutually numerically orthogonal up to approximately
  132. *> TOL=DSQRT(M)*EPS (default); or TOL=CTOL*EPS (JOBU = 'C'),
  133. *> see the description of JOBU.
  134. *> If INFO > 0 :
  135. *> the procedure DGESVJ did not converge in the given number
  136. *> of iterations (sweeps). In that case, the computed
  137. *> columns of U may not be orthogonal up to TOL. The output
  138. *> U (stored in A), SIGMA (given by the computed singular
  139. *> values in SVA(1:N)) and V is still a decomposition of the
  140. *> input matrix A in the sense that the residual
  141. *> ||A-SCALE*U*SIGMA*V^T||_2 / ||A||_2 is small.
  142. *>
  143. *> If JOBU = 'N' :
  144. *> If INFO = 0 :
  145. *> Note that the left singular vectors are 'for free' in the
  146. *> one-sided Jacobi SVD algorithm. However, if only the
  147. *> singular values are needed, the level of numerical
  148. *> orthogonality of U is not an issue and iterations are
  149. *> stopped when the columns of the iterated matrix are
  150. *> numerically orthogonal up to approximately M*EPS. Thus,
  151. *> on exit, A contains the columns of U scaled with the
  152. *> corresponding singular values.
  153. *> If INFO > 0 :
  154. *> the procedure DGESVJ did not converge in the given number
  155. *> of iterations (sweeps).
  156. *> \endverbatim
  157. *>
  158. *> \param[in] LDA
  159. *> \verbatim
  160. *> LDA is INTEGER
  161. *> The leading dimension of the array A. LDA >= max(1,M).
  162. *> \endverbatim
  163. *>
  164. *> \param[out] SVA
  165. *> \verbatim
  166. *> SVA is DOUBLE PRECISION array, dimension (N)
  167. *> On exit :
  168. *> If INFO = 0 :
  169. *> depending on the value SCALE = WORK(1), we have:
  170. *> If SCALE = ONE :
  171. *> SVA(1:N) contains the computed singular values of A.
  172. *> During the computation SVA contains the Euclidean column
  173. *> norms of the iterated matrices in the array A.
  174. *> If SCALE .NE. ONE :
  175. *> The singular values of A are SCALE*SVA(1:N), and this
  176. *> factored representation is due to the fact that some of the
  177. *> singular values of A might underflow or overflow.
  178. *> If INFO > 0 :
  179. *> the procedure DGESVJ did not converge in the given number of
  180. *> iterations (sweeps) and SCALE*SVA(1:N) may not be accurate.
  181. *> \endverbatim
  182. *>
  183. *> \param[in] MV
  184. *> \verbatim
  185. *> MV is INTEGER
  186. *> If JOBV = 'A', then the product of Jacobi rotations in DGESVJ
  187. *> is applied to the first MV rows of V. See the description of JOBV.
  188. *> \endverbatim
  189. *>
  190. *> \param[in,out] V
  191. *> \verbatim
  192. *> V is DOUBLE PRECISION array, dimension (LDV,N)
  193. *> If JOBV = 'V', then V contains on exit the N-by-N matrix of
  194. *> the right singular vectors;
  195. *> If JOBV = 'A', then V contains the product of the computed right
  196. *> singular vector matrix and the initial matrix in
  197. *> the array V.
  198. *> If JOBV = 'N', then V is not referenced.
  199. *> \endverbatim
  200. *>
  201. *> \param[in] LDV
  202. *> \verbatim
  203. *> LDV is INTEGER
  204. *> The leading dimension of the array V, LDV >= 1.
  205. *> If JOBV = 'V', then LDV >= max(1,N).
  206. *> If JOBV = 'A', then LDV >= max(1,MV) .
  207. *> \endverbatim
  208. *>
  209. *> \param[in,out] WORK
  210. *> \verbatim
  211. *> WORK is DOUBLE PRECISION array, dimension (LWORK)
  212. *> On entry :
  213. *> If JOBU = 'C' :
  214. *> WORK(1) = CTOL, where CTOL defines the threshold for convergence.
  215. *> The process stops if all columns of A are mutually
  216. *> orthogonal up to CTOL*EPS, EPS=DLAMCH('E').
  217. *> It is required that CTOL >= ONE, i.e. it is not
  218. *> allowed to force the routine to obtain orthogonality
  219. *> below EPS.
  220. *> On exit :
  221. *> WORK(1) = SCALE is the scaling factor such that SCALE*SVA(1:N)
  222. *> are the computed singular values of A.
  223. *> (See description of SVA().)
  224. *> WORK(2) = NINT(WORK(2)) is the number of the computed nonzero
  225. *> singular values.
  226. *> WORK(3) = NINT(WORK(3)) is the number of the computed singular
  227. *> values that are larger than the underflow threshold.
  228. *> WORK(4) = NINT(WORK(4)) is the number of sweeps of Jacobi
  229. *> rotations needed for numerical convergence.
  230. *> WORK(5) = max_{i.NE.j} |COS(A(:,i),A(:,j))| in the last sweep.
  231. *> This is useful information in cases when DGESVJ did
  232. *> not converge, as it can be used to estimate whether
  233. *> the output is still useful and for post festum analysis.
  234. *> WORK(6) = the largest absolute value over all sines of the
  235. *> Jacobi rotation angles in the last sweep. It can be
  236. *> useful for a post festum analysis.
  237. *> \endverbatim
  238. *>
  239. *> \param[in] LWORK
  240. *> \verbatim
  241. *> LWORK is INTEGER
  242. *> length of WORK, WORK >= MAX(6,M+N)
  243. *> \endverbatim
  244. *>
  245. *> \param[out] INFO
  246. *> \verbatim
  247. *> INFO is INTEGER
  248. *> = 0: successful exit.
  249. *> < 0: if INFO = -i, then the i-th argument had an illegal value
  250. *> > 0: DGESVJ did not converge in the maximal allowed number (30)
  251. *> of sweeps. The output may still be useful. See the
  252. *> description of WORK.
  253. *> \endverbatim
  254. *
  255. * Authors:
  256. * ========
  257. *
  258. *> \author Univ. of Tennessee
  259. *> \author Univ. of California Berkeley
  260. *> \author Univ. of Colorado Denver
  261. *> \author NAG Ltd.
  262. *
  263. *> \ingroup doubleGEcomputational
  264. *
  265. *> \par Further Details:
  266. * =====================
  267. *>
  268. *> \verbatim
  269. *>
  270. *> The orthogonal N-by-N matrix V is obtained as a product of Jacobi plane
  271. *> rotations. The rotations are implemented as fast scaled rotations of
  272. *> Anda and Park [1]. In the case of underflow of the Jacobi angle, a
  273. *> modified Jacobi transformation of Drmac [4] is used. Pivot strategy uses
  274. *> column interchanges of de Rijk [2]. The relative accuracy of the computed
  275. *> singular values and the accuracy of the computed singular vectors (in
  276. *> angle metric) is as guaranteed by the theory of Demmel and Veselic [3].
  277. *> The condition number that determines the accuracy in the full rank case
  278. *> is essentially min_{D=diag} kappa(A*D), where kappa(.) is the
  279. *> spectral condition number. The best performance of this Jacobi SVD
  280. *> procedure is achieved if used in an accelerated version of Drmac and
  281. *> Veselic [5,6], and it is the kernel routine in the SIGMA library [7].
  282. *> Some tuning parameters (marked with [TP]) are available for the
  283. *> implementer.
  284. *> The computational range for the nonzero singular values is the machine
  285. *> number interval ( UNDERFLOW , OVERFLOW ). In extreme cases, even
  286. *> denormalized singular values can be computed with the corresponding
  287. *> gradual loss of accurate digits.
  288. *> \endverbatim
  289. *
  290. *> \par Contributors:
  291. * ==================
  292. *>
  293. *> \verbatim
  294. *>
  295. *> ============
  296. *>
  297. *> Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany)
  298. *> \endverbatim
  299. *
  300. *> \par References:
  301. * ================
  302. *>
  303. *> \verbatim
  304. *>
  305. *> [1] A. A. Anda and H. Park: Fast plane rotations with dynamic scaling.
  306. *> SIAM J. matrix Anal. Appl., Vol. 15 (1994), pp. 162-174.
  307. *> [2] P. P. M. De Rijk: A one-sided Jacobi algorithm for computing the
  308. *> singular value decomposition on a vector computer.
  309. *> SIAM J. Sci. Stat. Comp., Vol. 10 (1998), pp. 359-371.
  310. *> [3] J. Demmel and K. Veselic: Jacobi method is more accurate than QR.
  311. *> [4] Z. Drmac: Implementation of Jacobi rotations for accurate singular
  312. *> value computation in floating point arithmetic.
  313. *> SIAM J. Sci. Comp., Vol. 18 (1997), pp. 1200-1222.
  314. *> [5] Z. Drmac and K. Veselic: New fast and accurate Jacobi SVD algorithm I.
  315. *> SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp. 1322-1342.
  316. *> LAPACK Working note 169.
  317. *> [6] Z. Drmac and K. Veselic: New fast and accurate Jacobi SVD algorithm II.
  318. *> SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp. 1343-1362.
  319. *> LAPACK Working note 170.
  320. *> [7] Z. Drmac: SIGMA - mathematical software library for accurate SVD, PSV,
  321. *> QSVD, (H,K)-SVD computations.
  322. *> Department of Mathematics, University of Zagreb, 2008.
  323. *> \endverbatim
  324. *
  325. *> \par Bugs, examples and comments:
  326. * =================================
  327. *>
  328. *> \verbatim
  329. *> ===========================
  330. *> Please report all bugs and send interesting test examples and comments to
  331. *> drmac@math.hr. Thank you.
  332. *> \endverbatim
  333. *>
  334. * =====================================================================
  335. SUBROUTINE DGESVJ( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
  336. $ LDV, WORK, LWORK, INFO )
  337. *
  338. * -- LAPACK computational routine --
  339. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  340. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  341. *
  342. * .. Scalar Arguments ..
  343. INTEGER INFO, LDA, LDV, LWORK, M, MV, N
  344. CHARACTER*1 JOBA, JOBU, JOBV
  345. * ..
  346. * .. Array Arguments ..
  347. DOUBLE PRECISION A( LDA, * ), SVA( N ), V( LDV, * ),
  348. $ WORK( LWORK )
  349. * ..
  350. *
  351. * =====================================================================
  352. *
  353. * .. Local Parameters ..
  354. DOUBLE PRECISION ZERO, HALF, ONE
  355. PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0)
  356. INTEGER NSWEEP
  357. PARAMETER ( NSWEEP = 30 )
  358. * ..
  359. * .. Local Scalars ..
  360. DOUBLE PRECISION AAPP, AAPP0, AAPQ, AAQQ, APOAQ, AQOAP, BIG,
  361. $ BIGTHETA, CS, CTOL, EPSLN, LARGE, MXAAPQ,
  362. $ MXSINJ, ROOTBIG, ROOTEPS, ROOTSFMIN, ROOTTOL,
  363. $ SKL, SFMIN, SMALL, SN, T, TEMP1, THETA,
  364. $ THSIGN, TOL
  365. INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
  366. $ ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, N2, N34,
  367. $ N4, NBL, NOTROT, p, PSKIPPED, q, ROWSKIP,
  368. $ SWBAND
  369. LOGICAL APPLV, GOSCALE, LOWER, LSVEC, NOSCALE, ROTOK,
  370. $ RSVEC, UCTOL, UPPER
  371. * ..
  372. * .. Local Arrays ..
  373. DOUBLE PRECISION FASTR( 5 )
  374. * ..
  375. * .. Intrinsic Functions ..
  376. INTRINSIC DABS, MAX, MIN, DBLE, DSIGN, DSQRT
  377. * ..
  378. * .. External Functions ..
  379. * ..
  380. * from BLAS
  381. DOUBLE PRECISION DDOT, DNRM2
  382. EXTERNAL DDOT, DNRM2
  383. INTEGER IDAMAX
  384. EXTERNAL IDAMAX
  385. * from LAPACK
  386. DOUBLE PRECISION DLAMCH
  387. EXTERNAL DLAMCH
  388. LOGICAL LSAME
  389. EXTERNAL LSAME
  390. * ..
  391. * .. External Subroutines ..
  392. * ..
  393. * from BLAS
  394. EXTERNAL DAXPY, DCOPY, DROTM, DSCAL, DSWAP
  395. * from LAPACK
  396. EXTERNAL DLASCL, DLASET, DLASSQ, XERBLA
  397. *
  398. EXTERNAL DGSVJ0, DGSVJ1
  399. * ..
  400. * .. Executable Statements ..
  401. *
  402. * Test the input arguments
  403. *
  404. LSVEC = LSAME( JOBU, 'U' )
  405. UCTOL = LSAME( JOBU, 'C' )
  406. RSVEC = LSAME( JOBV, 'V' )
  407. APPLV = LSAME( JOBV, 'A' )
  408. UPPER = LSAME( JOBA, 'U' )
  409. LOWER = LSAME( JOBA, 'L' )
  410. *
  411. IF( .NOT.( UPPER .OR. LOWER .OR. LSAME( JOBA, 'G' ) ) ) THEN
  412. INFO = -1
  413. ELSE IF( .NOT.( LSVEC .OR. UCTOL .OR. LSAME( JOBU, 'N' ) ) ) THEN
  414. INFO = -2
  415. ELSE IF( .NOT.( RSVEC .OR. APPLV .OR. LSAME( JOBV, 'N' ) ) ) THEN
  416. INFO = -3
  417. ELSE IF( M.LT.0 ) THEN
  418. INFO = -4
  419. ELSE IF( ( N.LT.0 ) .OR. ( N.GT.M ) ) THEN
  420. INFO = -5
  421. ELSE IF( LDA.LT.M ) THEN
  422. INFO = -7
  423. ELSE IF( MV.LT.0 ) THEN
  424. INFO = -9
  425. ELSE IF( ( RSVEC .AND. ( LDV.LT.N ) ) .OR.
  426. $ ( APPLV .AND. ( LDV.LT.MV ) ) ) THEN
  427. INFO = -11
  428. ELSE IF( UCTOL .AND. ( WORK( 1 ).LE.ONE ) ) THEN
  429. INFO = -12
  430. ELSE IF( LWORK.LT.MAX( M+N, 6 ) ) THEN
  431. INFO = -13
  432. ELSE
  433. INFO = 0
  434. END IF
  435. *
  436. * #:(
  437. IF( INFO.NE.0 ) THEN
  438. CALL XERBLA( 'DGESVJ', -INFO )
  439. RETURN
  440. END IF
  441. *
  442. * #:) Quick return for void matrix
  443. *
  444. IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) )RETURN
  445. *
  446. * Set numerical parameters
  447. * The stopping criterion for Jacobi rotations is
  448. *
  449. * max_{i<>j}|A(:,i)^T * A(:,j)|/(||A(:,i)||*||A(:,j)||) < CTOL*EPS
  450. *
  451. * where EPS is the round-off and CTOL is defined as follows:
  452. *
  453. IF( UCTOL ) THEN
  454. * ... user controlled
  455. CTOL = WORK( 1 )
  456. ELSE
  457. * ... default
  458. IF( LSVEC .OR. RSVEC .OR. APPLV ) THEN
  459. CTOL = DSQRT( DBLE( M ) )
  460. ELSE
  461. CTOL = DBLE( M )
  462. END IF
  463. END IF
  464. * ... and the machine dependent parameters are
  465. *[!] (Make sure that DLAMCH() works properly on the target machine.)
  466. *
  467. EPSLN = DLAMCH( 'Epsilon' )
  468. ROOTEPS = DSQRT( EPSLN )
  469. SFMIN = DLAMCH( 'SafeMinimum' )
  470. ROOTSFMIN = DSQRT( SFMIN )
  471. SMALL = SFMIN / EPSLN
  472. BIG = DLAMCH( 'Overflow' )
  473. * BIG = ONE / SFMIN
  474. ROOTBIG = ONE / ROOTSFMIN
  475. LARGE = BIG / DSQRT( DBLE( M*N ) )
  476. BIGTHETA = ONE / ROOTEPS
  477. *
  478. TOL = CTOL*EPSLN
  479. ROOTTOL = DSQRT( TOL )
  480. *
  481. IF( DBLE( M )*EPSLN.GE.ONE ) THEN
  482. INFO = -4
  483. CALL XERBLA( 'DGESVJ', -INFO )
  484. RETURN
  485. END IF
  486. *
  487. * Initialize the right singular vector matrix.
  488. *
  489. IF( RSVEC ) THEN
  490. MVL = N
  491. CALL DLASET( 'A', MVL, N, ZERO, ONE, V, LDV )
  492. ELSE IF( APPLV ) THEN
  493. MVL = MV
  494. END IF
  495. RSVEC = RSVEC .OR. APPLV
  496. *
  497. * Initialize SVA( 1:N ) = ( ||A e_i||_2, i = 1:N )
  498. *(!) If necessary, scale A to protect the largest singular value
  499. * from overflow. It is possible that saving the largest singular
  500. * value destroys the information about the small ones.
  501. * This initial scaling is almost minimal in the sense that the
  502. * goal is to make sure that no column norm overflows, and that
  503. * DSQRT(N)*max_i SVA(i) does not overflow. If INFinite entries
  504. * in A are detected, the procedure returns with INFO=-6.
  505. *
  506. SKL= ONE / DSQRT( DBLE( M )*DBLE( N ) )
  507. NOSCALE = .TRUE.
  508. GOSCALE = .TRUE.
  509. *
  510. IF( LOWER ) THEN
  511. * the input matrix is M-by-N lower triangular (trapezoidal)
  512. DO 1874 p = 1, N
  513. AAPP = ZERO
  514. AAQQ = ONE
  515. CALL DLASSQ( M-p+1, A( p, p ), 1, AAPP, AAQQ )
  516. IF( AAPP.GT.BIG ) THEN
  517. INFO = -6
  518. CALL XERBLA( 'DGESVJ', -INFO )
  519. RETURN
  520. END IF
  521. AAQQ = DSQRT( AAQQ )
  522. IF( ( AAPP.LT.( BIG / AAQQ ) ) .AND. NOSCALE ) THEN
  523. SVA( p ) = AAPP*AAQQ
  524. ELSE
  525. NOSCALE = .FALSE.
  526. SVA( p ) = AAPP*( AAQQ*SKL)
  527. IF( GOSCALE ) THEN
  528. GOSCALE = .FALSE.
  529. DO 1873 q = 1, p - 1
  530. SVA( q ) = SVA( q )*SKL
  531. 1873 CONTINUE
  532. END IF
  533. END IF
  534. 1874 CONTINUE
  535. ELSE IF( UPPER ) THEN
  536. * the input matrix is M-by-N upper triangular (trapezoidal)
  537. DO 2874 p = 1, N
  538. AAPP = ZERO
  539. AAQQ = ONE
  540. CALL DLASSQ( p, A( 1, p ), 1, AAPP, AAQQ )
  541. IF( AAPP.GT.BIG ) THEN
  542. INFO = -6
  543. CALL XERBLA( 'DGESVJ', -INFO )
  544. RETURN
  545. END IF
  546. AAQQ = DSQRT( AAQQ )
  547. IF( ( AAPP.LT.( BIG / AAQQ ) ) .AND. NOSCALE ) THEN
  548. SVA( p ) = AAPP*AAQQ
  549. ELSE
  550. NOSCALE = .FALSE.
  551. SVA( p ) = AAPP*( AAQQ*SKL)
  552. IF( GOSCALE ) THEN
  553. GOSCALE = .FALSE.
  554. DO 2873 q = 1, p - 1
  555. SVA( q ) = SVA( q )*SKL
  556. 2873 CONTINUE
  557. END IF
  558. END IF
  559. 2874 CONTINUE
  560. ELSE
  561. * the input matrix is M-by-N general dense
  562. DO 3874 p = 1, N
  563. AAPP = ZERO
  564. AAQQ = ONE
  565. CALL DLASSQ( M, A( 1, p ), 1, AAPP, AAQQ )
  566. IF( AAPP.GT.BIG ) THEN
  567. INFO = -6
  568. CALL XERBLA( 'DGESVJ', -INFO )
  569. RETURN
  570. END IF
  571. AAQQ = DSQRT( AAQQ )
  572. IF( ( AAPP.LT.( BIG / AAQQ ) ) .AND. NOSCALE ) THEN
  573. SVA( p ) = AAPP*AAQQ
  574. ELSE
  575. NOSCALE = .FALSE.
  576. SVA( p ) = AAPP*( AAQQ*SKL)
  577. IF( GOSCALE ) THEN
  578. GOSCALE = .FALSE.
  579. DO 3873 q = 1, p - 1
  580. SVA( q ) = SVA( q )*SKL
  581. 3873 CONTINUE
  582. END IF
  583. END IF
  584. 3874 CONTINUE
  585. END IF
  586. *
  587. IF( NOSCALE )SKL= ONE
  588. *
  589. * Move the smaller part of the spectrum from the underflow threshold
  590. *(!) Start by determining the position of the nonzero entries of the
  591. * array SVA() relative to ( SFMIN, BIG ).
  592. *
  593. AAPP = ZERO
  594. AAQQ = BIG
  595. DO 4781 p = 1, N
  596. IF( SVA( p ).NE.ZERO )AAQQ = MIN( AAQQ, SVA( p ) )
  597. AAPP = MAX( AAPP, SVA( p ) )
  598. 4781 CONTINUE
  599. *
  600. * #:) Quick return for zero matrix
  601. *
  602. IF( AAPP.EQ.ZERO ) THEN
  603. IF( LSVEC )CALL DLASET( 'G', M, N, ZERO, ONE, A, LDA )
  604. WORK( 1 ) = ONE
  605. WORK( 2 ) = ZERO
  606. WORK( 3 ) = ZERO
  607. WORK( 4 ) = ZERO
  608. WORK( 5 ) = ZERO
  609. WORK( 6 ) = ZERO
  610. RETURN
  611. END IF
  612. *
  613. * #:) Quick return for one-column matrix
  614. *
  615. IF( N.EQ.1 ) THEN
  616. IF( LSVEC )CALL DLASCL( 'G', 0, 0, SVA( 1 ), SKL, M, 1,
  617. $ A( 1, 1 ), LDA, IERR )
  618. WORK( 1 ) = ONE / SKL
  619. IF( SVA( 1 ).GE.SFMIN ) THEN
  620. WORK( 2 ) = ONE
  621. ELSE
  622. WORK( 2 ) = ZERO
  623. END IF
  624. WORK( 3 ) = ZERO
  625. WORK( 4 ) = ZERO
  626. WORK( 5 ) = ZERO
  627. WORK( 6 ) = ZERO
  628. RETURN
  629. END IF
  630. *
  631. * Protect small singular values from underflow, and try to
  632. * avoid underflows/overflows in computing Jacobi rotations.
  633. *
  634. SN = DSQRT( SFMIN / EPSLN )
  635. TEMP1 = DSQRT( BIG / DBLE( N ) )
  636. IF( ( AAPP.LE.SN ) .OR. ( AAQQ.GE.TEMP1 ) .OR.
  637. $ ( ( SN.LE.AAQQ ) .AND. ( AAPP.LE.TEMP1 ) ) ) THEN
  638. TEMP1 = MIN( BIG, TEMP1 / AAPP )
  639. * AAQQ = AAQQ*TEMP1
  640. * AAPP = AAPP*TEMP1
  641. ELSE IF( ( AAQQ.LE.SN ) .AND. ( AAPP.LE.TEMP1 ) ) THEN
  642. TEMP1 = MIN( SN / AAQQ, BIG / ( AAPP*DSQRT( DBLE( N ) ) ) )
  643. * AAQQ = AAQQ*TEMP1
  644. * AAPP = AAPP*TEMP1
  645. ELSE IF( ( AAQQ.GE.SN ) .AND. ( AAPP.GE.TEMP1 ) ) THEN
  646. TEMP1 = MAX( SN / AAQQ, TEMP1 / AAPP )
  647. * AAQQ = AAQQ*TEMP1
  648. * AAPP = AAPP*TEMP1
  649. ELSE IF( ( AAQQ.LE.SN ) .AND. ( AAPP.GE.TEMP1 ) ) THEN
  650. TEMP1 = MIN( SN / AAQQ, BIG / ( DSQRT( DBLE( N ) )*AAPP ) )
  651. * AAQQ = AAQQ*TEMP1
  652. * AAPP = AAPP*TEMP1
  653. ELSE
  654. TEMP1 = ONE
  655. END IF
  656. *
  657. * Scale, if necessary
  658. *
  659. IF( TEMP1.NE.ONE ) THEN
  660. CALL DLASCL( 'G', 0, 0, ONE, TEMP1, N, 1, SVA, N, IERR )
  661. END IF
  662. SKL= TEMP1*SKL
  663. IF( SKL.NE.ONE ) THEN
  664. CALL DLASCL( JOBA, 0, 0, ONE, SKL, M, N, A, LDA, IERR )
  665. SKL= ONE / SKL
  666. END IF
  667. *
  668. * Row-cyclic Jacobi SVD algorithm with column pivoting
  669. *
  670. EMPTSW = ( N*( N-1 ) ) / 2
  671. NOTROT = 0
  672. FASTR( 1 ) = ZERO
  673. *
  674. * A is represented in factored form A = A * diag(WORK), where diag(WORK)
  675. * is initialized to identity. WORK is updated during fast scaled
  676. * rotations.
  677. *
  678. DO 1868 q = 1, N
  679. WORK( q ) = ONE
  680. 1868 CONTINUE
  681. *
  682. *
  683. SWBAND = 3
  684. *[TP] SWBAND is a tuning parameter [TP]. It is meaningful and effective
  685. * if DGESVJ is used as a computational routine in the preconditioned
  686. * Jacobi SVD algorithm DGESVJ. For sweeps i=1:SWBAND the procedure
  687. * works on pivots inside a band-like region around the diagonal.
  688. * The boundaries are determined dynamically, based on the number of
  689. * pivots above a threshold.
  690. *
  691. KBL = MIN( 8, N )
  692. *[TP] KBL is a tuning parameter that defines the tile size in the
  693. * tiling of the p-q loops of pivot pairs. In general, an optimal
  694. * value of KBL depends on the matrix dimensions and on the
  695. * parameters of the computer's memory.
  696. *
  697. NBL = N / KBL
  698. IF( ( NBL*KBL ).NE.N )NBL = NBL + 1
  699. *
  700. BLSKIP = KBL**2
  701. *[TP] BLKSKIP is a tuning parameter that depends on SWBAND and KBL.
  702. *
  703. ROWSKIP = MIN( 5, KBL )
  704. *[TP] ROWSKIP is a tuning parameter.
  705. *
  706. LKAHEAD = 1
  707. *[TP] LKAHEAD is a tuning parameter.
  708. *
  709. * Quasi block transformations, using the lower (upper) triangular
  710. * structure of the input matrix. The quasi-block-cycling usually
  711. * invokes cubic convergence. Big part of this cycle is done inside
  712. * canonical subspaces of dimensions less than M.
  713. *
  714. IF( ( LOWER .OR. UPPER ) .AND. ( N.GT.MAX( 64, 4*KBL ) ) ) THEN
  715. *[TP] The number of partition levels and the actual partition are
  716. * tuning parameters.
  717. N4 = N / 4
  718. N2 = N / 2
  719. N34 = 3*N4
  720. IF( APPLV ) THEN
  721. q = 0
  722. ELSE
  723. q = 1
  724. END IF
  725. *
  726. IF( LOWER ) THEN
  727. *
  728. * This works very well on lower triangular matrices, in particular
  729. * in the framework of the preconditioned Jacobi SVD (xGEJSV).
  730. * The idea is simple:
  731. * [+ 0 0 0] Note that Jacobi transformations of [0 0]
  732. * [+ + 0 0] [0 0]
  733. * [+ + x 0] actually work on [x 0] [x 0]
  734. * [+ + x x] [x x]. [x x]
  735. *
  736. CALL DGSVJ0( JOBV, M-N34, N-N34, A( N34+1, N34+1 ), LDA,
  737. $ WORK( N34+1 ), SVA( N34+1 ), MVL,
  738. $ V( N34*q+1, N34+1 ), LDV, EPSLN, SFMIN, TOL,
  739. $ 2, WORK( N+1 ), LWORK-N, IERR )
  740. *
  741. CALL DGSVJ0( JOBV, M-N2, N34-N2, A( N2+1, N2+1 ), LDA,
  742. $ WORK( N2+1 ), SVA( N2+1 ), MVL,
  743. $ V( N2*q+1, N2+1 ), LDV, EPSLN, SFMIN, TOL, 2,
  744. $ WORK( N+1 ), LWORK-N, IERR )
  745. *
  746. CALL DGSVJ1( JOBV, M-N2, N-N2, N4, A( N2+1, N2+1 ), LDA,
  747. $ WORK( N2+1 ), SVA( N2+1 ), MVL,
  748. $ V( N2*q+1, N2+1 ), LDV, EPSLN, SFMIN, TOL, 1,
  749. $ WORK( N+1 ), LWORK-N, IERR )
  750. *
  751. CALL DGSVJ0( JOBV, M-N4, N2-N4, A( N4+1, N4+1 ), LDA,
  752. $ WORK( N4+1 ), SVA( N4+1 ), MVL,
  753. $ V( N4*q+1, N4+1 ), LDV, EPSLN, SFMIN, TOL, 1,
  754. $ WORK( N+1 ), LWORK-N, IERR )
  755. *
  756. CALL DGSVJ0( JOBV, M, N4, A, LDA, WORK, SVA, MVL, V, LDV,
  757. $ EPSLN, SFMIN, TOL, 1, WORK( N+1 ), LWORK-N,
  758. $ IERR )
  759. *
  760. CALL DGSVJ1( JOBV, M, N2, N4, A, LDA, WORK, SVA, MVL, V,
  761. $ LDV, EPSLN, SFMIN, TOL, 1, WORK( N+1 ),
  762. $ LWORK-N, IERR )
  763. *
  764. *
  765. ELSE IF( UPPER ) THEN
  766. *
  767. *
  768. CALL DGSVJ0( JOBV, N4, N4, A, LDA, WORK, SVA, MVL, V, LDV,
  769. $ EPSLN, SFMIN, TOL, 2, WORK( N+1 ), LWORK-N,
  770. $ IERR )
  771. *
  772. CALL DGSVJ0( JOBV, N2, N4, A( 1, N4+1 ), LDA, WORK( N4+1 ),
  773. $ SVA( N4+1 ), MVL, V( N4*q+1, N4+1 ), LDV,
  774. $ EPSLN, SFMIN, TOL, 1, WORK( N+1 ), LWORK-N,
  775. $ IERR )
  776. *
  777. CALL DGSVJ1( JOBV, N2, N2, N4, A, LDA, WORK, SVA, MVL, V,
  778. $ LDV, EPSLN, SFMIN, TOL, 1, WORK( N+1 ),
  779. $ LWORK-N, IERR )
  780. *
  781. CALL DGSVJ0( JOBV, N2+N4, N4, A( 1, N2+1 ), LDA,
  782. $ WORK( N2+1 ), SVA( N2+1 ), MVL,
  783. $ V( N2*q+1, N2+1 ), LDV, EPSLN, SFMIN, TOL, 1,
  784. $ WORK( N+1 ), LWORK-N, IERR )
  785. END IF
  786. *
  787. END IF
  788. *
  789. * .. Row-cyclic pivot strategy with de Rijk's pivoting ..
  790. *
  791. DO 1993 i = 1, NSWEEP
  792. *
  793. * .. go go go ...
  794. *
  795. MXAAPQ = ZERO
  796. MXSINJ = ZERO
  797. ISWROT = 0
  798. *
  799. NOTROT = 0
  800. PSKIPPED = 0
  801. *
  802. * Each sweep is unrolled using KBL-by-KBL tiles over the pivot pairs
  803. * 1 <= p < q <= N. This is the first step toward a blocked implementation
  804. * of the rotations. New implementation, based on block transformations,
  805. * is under development.
  806. *
  807. DO 2000 ibr = 1, NBL
  808. *
  809. igl = ( ibr-1 )*KBL + 1
  810. *
  811. DO 1002 ir1 = 0, MIN( LKAHEAD, NBL-ibr )
  812. *
  813. igl = igl + ir1*KBL
  814. *
  815. DO 2001 p = igl, MIN( igl+KBL-1, N-1 )
  816. *
  817. * .. de Rijk's pivoting
  818. *
  819. q = IDAMAX( N-p+1, SVA( p ), 1 ) + p - 1
  820. IF( p.NE.q ) THEN
  821. CALL DSWAP( M, A( 1, p ), 1, A( 1, q ), 1 )
  822. IF( RSVEC )CALL DSWAP( MVL, V( 1, p ), 1,
  823. $ V( 1, q ), 1 )
  824. TEMP1 = SVA( p )
  825. SVA( p ) = SVA( q )
  826. SVA( q ) = TEMP1
  827. TEMP1 = WORK( p )
  828. WORK( p ) = WORK( q )
  829. WORK( q ) = TEMP1
  830. END IF
  831. *
  832. IF( ir1.EQ.0 ) THEN
  833. *
  834. * Column norms are periodically updated by explicit
  835. * norm computation.
  836. * Caveat:
  837. * Unfortunately, some BLAS implementations compute DNRM2(M,A(1,p),1)
  838. * as DSQRT(DDOT(M,A(1,p),1,A(1,p),1)), which may cause the result to
  839. * overflow for ||A(:,p)||_2 > DSQRT(overflow_threshold), and to
  840. * underflow for ||A(:,p)||_2 < DSQRT(underflow_threshold).
  841. * Hence, DNRM2 cannot be trusted, not even in the case when
  842. * the true norm is far from the under(over)flow boundaries.
  843. * If properly implemented DNRM2 is available, the IF-THEN-ELSE
  844. * below should read "AAPP = DNRM2( M, A(1,p), 1 ) * WORK(p)".
  845. *
  846. IF( ( SVA( p ).LT.ROOTBIG ) .AND.
  847. $ ( SVA( p ).GT.ROOTSFMIN ) ) THEN
  848. SVA( p ) = DNRM2( M, A( 1, p ), 1 )*WORK( p )
  849. ELSE
  850. TEMP1 = ZERO
  851. AAPP = ONE
  852. CALL DLASSQ( M, A( 1, p ), 1, TEMP1, AAPP )
  853. SVA( p ) = TEMP1*DSQRT( AAPP )*WORK( p )
  854. END IF
  855. AAPP = SVA( p )
  856. ELSE
  857. AAPP = SVA( p )
  858. END IF
  859. *
  860. IF( AAPP.GT.ZERO ) THEN
  861. *
  862. PSKIPPED = 0
  863. *
  864. DO 2002 q = p + 1, MIN( igl+KBL-1, N )
  865. *
  866. AAQQ = SVA( q )
  867. *
  868. IF( AAQQ.GT.ZERO ) THEN
  869. *
  870. AAPP0 = AAPP
  871. IF( AAQQ.GE.ONE ) THEN
  872. ROTOK = ( SMALL*AAPP ).LE.AAQQ
  873. IF( AAPP.LT.( BIG / AAQQ ) ) THEN
  874. AAPQ = ( DDOT( M, A( 1, p ), 1, A( 1,
  875. $ q ), 1 )*WORK( p )*WORK( q ) /
  876. $ AAQQ ) / AAPP
  877. ELSE
  878. CALL DCOPY( M, A( 1, p ), 1,
  879. $ WORK( N+1 ), 1 )
  880. CALL DLASCL( 'G', 0, 0, AAPP,
  881. $ WORK( p ), M, 1,
  882. $ WORK( N+1 ), LDA, IERR )
  883. AAPQ = DDOT( M, WORK( N+1 ), 1,
  884. $ A( 1, q ), 1 )*WORK( q ) / AAQQ
  885. END IF
  886. ELSE
  887. ROTOK = AAPP.LE.( AAQQ / SMALL )
  888. IF( AAPP.GT.( SMALL / AAQQ ) ) THEN
  889. AAPQ = ( DDOT( M, A( 1, p ), 1, A( 1,
  890. $ q ), 1 )*WORK( p )*WORK( q ) /
  891. $ AAQQ ) / AAPP
  892. ELSE
  893. CALL DCOPY( M, A( 1, q ), 1,
  894. $ WORK( N+1 ), 1 )
  895. CALL DLASCL( 'G', 0, 0, AAQQ,
  896. $ WORK( q ), M, 1,
  897. $ WORK( N+1 ), LDA, IERR )
  898. AAPQ = DDOT( M, WORK( N+1 ), 1,
  899. $ A( 1, p ), 1 )*WORK( p ) / AAPP
  900. END IF
  901. END IF
  902. *
  903. MXAAPQ = MAX( MXAAPQ, DABS( AAPQ ) )
  904. *
  905. * TO rotate or NOT to rotate, THAT is the question ...
  906. *
  907. IF( DABS( AAPQ ).GT.TOL ) THEN
  908. *
  909. * .. rotate
  910. *[RTD] ROTATED = ROTATED + ONE
  911. *
  912. IF( ir1.EQ.0 ) THEN
  913. NOTROT = 0
  914. PSKIPPED = 0
  915. ISWROT = ISWROT + 1
  916. END IF
  917. *
  918. IF( ROTOK ) THEN
  919. *
  920. AQOAP = AAQQ / AAPP
  921. APOAQ = AAPP / AAQQ
  922. THETA = -HALF*DABS(AQOAP-APOAQ)/AAPQ
  923. *
  924. IF( DABS( THETA ).GT.BIGTHETA ) THEN
  925. *
  926. T = HALF / THETA
  927. FASTR( 3 ) = T*WORK( p ) / WORK( q )
  928. FASTR( 4 ) = -T*WORK( q ) /
  929. $ WORK( p )
  930. CALL DROTM( M, A( 1, p ), 1,
  931. $ A( 1, q ), 1, FASTR )
  932. IF( RSVEC )CALL DROTM( MVL,
  933. $ V( 1, p ), 1,
  934. $ V( 1, q ), 1,
  935. $ FASTR )
  936. SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
  937. $ ONE+T*APOAQ*AAPQ ) )
  938. AAPP = AAPP*DSQRT( MAX( ZERO,
  939. $ ONE-T*AQOAP*AAPQ ) )
  940. MXSINJ = MAX( MXSINJ, DABS( T ) )
  941. *
  942. ELSE
  943. *
  944. * .. choose correct signum for THETA and rotate
  945. *
  946. THSIGN = -DSIGN( ONE, AAPQ )
  947. T = ONE / ( THETA+THSIGN*
  948. $ DSQRT( ONE+THETA*THETA ) )
  949. CS = DSQRT( ONE / ( ONE+T*T ) )
  950. SN = T*CS
  951. *
  952. MXSINJ = MAX( MXSINJ, DABS( SN ) )
  953. SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
  954. $ ONE+T*APOAQ*AAPQ ) )
  955. AAPP = AAPP*DSQRT( MAX( ZERO,
  956. $ ONE-T*AQOAP*AAPQ ) )
  957. *
  958. APOAQ = WORK( p ) / WORK( q )
  959. AQOAP = WORK( q ) / WORK( p )
  960. IF( WORK( p ).GE.ONE ) THEN
  961. IF( WORK( q ).GE.ONE ) THEN
  962. FASTR( 3 ) = T*APOAQ
  963. FASTR( 4 ) = -T*AQOAP
  964. WORK( p ) = WORK( p )*CS
  965. WORK( q ) = WORK( q )*CS
  966. CALL DROTM( M, A( 1, p ), 1,
  967. $ A( 1, q ), 1,
  968. $ FASTR )
  969. IF( RSVEC )CALL DROTM( MVL,
  970. $ V( 1, p ), 1, V( 1, q ),
  971. $ 1, FASTR )
  972. ELSE
  973. CALL DAXPY( M, -T*AQOAP,
  974. $ A( 1, q ), 1,
  975. $ A( 1, p ), 1 )
  976. CALL DAXPY( M, CS*SN*APOAQ,
  977. $ A( 1, p ), 1,
  978. $ A( 1, q ), 1 )
  979. WORK( p ) = WORK( p )*CS
  980. WORK( q ) = WORK( q ) / CS
  981. IF( RSVEC ) THEN
  982. CALL DAXPY( MVL, -T*AQOAP,
  983. $ V( 1, q ), 1,
  984. $ V( 1, p ), 1 )
  985. CALL DAXPY( MVL,
  986. $ CS*SN*APOAQ,
  987. $ V( 1, p ), 1,
  988. $ V( 1, q ), 1 )
  989. END IF
  990. END IF
  991. ELSE
  992. IF( WORK( q ).GE.ONE ) THEN
  993. CALL DAXPY( M, T*APOAQ,
  994. $ A( 1, p ), 1,
  995. $ A( 1, q ), 1 )
  996. CALL DAXPY( M, -CS*SN*AQOAP,
  997. $ A( 1, q ), 1,
  998. $ A( 1, p ), 1 )
  999. WORK( p ) = WORK( p ) / CS
  1000. WORK( q ) = WORK( q )*CS
  1001. IF( RSVEC ) THEN
  1002. CALL DAXPY( MVL, T*APOAQ,
  1003. $ V( 1, p ), 1,
  1004. $ V( 1, q ), 1 )
  1005. CALL DAXPY( MVL,
  1006. $ -CS*SN*AQOAP,
  1007. $ V( 1, q ), 1,
  1008. $ V( 1, p ), 1 )
  1009. END IF
  1010. ELSE
  1011. IF( WORK( p ).GE.WORK( q ) )
  1012. $ THEN
  1013. CALL DAXPY( M, -T*AQOAP,
  1014. $ A( 1, q ), 1,
  1015. $ A( 1, p ), 1 )
  1016. CALL DAXPY( M, CS*SN*APOAQ,
  1017. $ A( 1, p ), 1,
  1018. $ A( 1, q ), 1 )
  1019. WORK( p ) = WORK( p )*CS
  1020. WORK( q ) = WORK( q ) / CS
  1021. IF( RSVEC ) THEN
  1022. CALL DAXPY( MVL,
  1023. $ -T*AQOAP,
  1024. $ V( 1, q ), 1,
  1025. $ V( 1, p ), 1 )
  1026. CALL DAXPY( MVL,
  1027. $ CS*SN*APOAQ,
  1028. $ V( 1, p ), 1,
  1029. $ V( 1, q ), 1 )
  1030. END IF
  1031. ELSE
  1032. CALL DAXPY( M, T*APOAQ,
  1033. $ A( 1, p ), 1,
  1034. $ A( 1, q ), 1 )
  1035. CALL DAXPY( M,
  1036. $ -CS*SN*AQOAP,
  1037. $ A( 1, q ), 1,
  1038. $ A( 1, p ), 1 )
  1039. WORK( p ) = WORK( p ) / CS
  1040. WORK( q ) = WORK( q )*CS
  1041. IF( RSVEC ) THEN
  1042. CALL DAXPY( MVL,
  1043. $ T*APOAQ, V( 1, p ),
  1044. $ 1, V( 1, q ), 1 )
  1045. CALL DAXPY( MVL,
  1046. $ -CS*SN*AQOAP,
  1047. $ V( 1, q ), 1,
  1048. $ V( 1, p ), 1 )
  1049. END IF
  1050. END IF
  1051. END IF
  1052. END IF
  1053. END IF
  1054. *
  1055. ELSE
  1056. * .. have to use modified Gram-Schmidt like transformation
  1057. CALL DCOPY( M, A( 1, p ), 1,
  1058. $ WORK( N+1 ), 1 )
  1059. CALL DLASCL( 'G', 0, 0, AAPP, ONE, M,
  1060. $ 1, WORK( N+1 ), LDA,
  1061. $ IERR )
  1062. CALL DLASCL( 'G', 0, 0, AAQQ, ONE, M,
  1063. $ 1, A( 1, q ), LDA, IERR )
  1064. TEMP1 = -AAPQ*WORK( p ) / WORK( q )
  1065. CALL DAXPY( M, TEMP1, WORK( N+1 ), 1,
  1066. $ A( 1, q ), 1 )
  1067. CALL DLASCL( 'G', 0, 0, ONE, AAQQ, M,
  1068. $ 1, A( 1, q ), LDA, IERR )
  1069. SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
  1070. $ ONE-AAPQ*AAPQ ) )
  1071. MXSINJ = MAX( MXSINJ, SFMIN )
  1072. END IF
  1073. * END IF ROTOK THEN ... ELSE
  1074. *
  1075. * In the case of cancellation in updating SVA(q), SVA(p)
  1076. * recompute SVA(q), SVA(p).
  1077. *
  1078. IF( ( SVA( q ) / AAQQ )**2.LE.ROOTEPS )
  1079. $ THEN
  1080. IF( ( AAQQ.LT.ROOTBIG ) .AND.
  1081. $ ( AAQQ.GT.ROOTSFMIN ) ) THEN
  1082. SVA( q ) = DNRM2( M, A( 1, q ), 1 )*
  1083. $ WORK( q )
  1084. ELSE
  1085. T = ZERO
  1086. AAQQ = ONE
  1087. CALL DLASSQ( M, A( 1, q ), 1, T,
  1088. $ AAQQ )
  1089. SVA( q ) = T*DSQRT( AAQQ )*WORK( q )
  1090. END IF
  1091. END IF
  1092. IF( ( AAPP / AAPP0 ).LE.ROOTEPS ) THEN
  1093. IF( ( AAPP.LT.ROOTBIG ) .AND.
  1094. $ ( AAPP.GT.ROOTSFMIN ) ) THEN
  1095. AAPP = DNRM2( M, A( 1, p ), 1 )*
  1096. $ WORK( p )
  1097. ELSE
  1098. T = ZERO
  1099. AAPP = ONE
  1100. CALL DLASSQ( M, A( 1, p ), 1, T,
  1101. $ AAPP )
  1102. AAPP = T*DSQRT( AAPP )*WORK( p )
  1103. END IF
  1104. SVA( p ) = AAPP
  1105. END IF
  1106. *
  1107. ELSE
  1108. * A(:,p) and A(:,q) already numerically orthogonal
  1109. IF( ir1.EQ.0 )NOTROT = NOTROT + 1
  1110. *[RTD] SKIPPED = SKIPPED + 1
  1111. PSKIPPED = PSKIPPED + 1
  1112. END IF
  1113. ELSE
  1114. * A(:,q) is zero column
  1115. IF( ir1.EQ.0 )NOTROT = NOTROT + 1
  1116. PSKIPPED = PSKIPPED + 1
  1117. END IF
  1118. *
  1119. IF( ( i.LE.SWBAND ) .AND.
  1120. $ ( PSKIPPED.GT.ROWSKIP ) ) THEN
  1121. IF( ir1.EQ.0 )AAPP = -AAPP
  1122. NOTROT = 0
  1123. GO TO 2103
  1124. END IF
  1125. *
  1126. 2002 CONTINUE
  1127. * END q-LOOP
  1128. *
  1129. 2103 CONTINUE
  1130. * bailed out of q-loop
  1131. *
  1132. SVA( p ) = AAPP
  1133. *
  1134. ELSE
  1135. SVA( p ) = AAPP
  1136. IF( ( ir1.EQ.0 ) .AND. ( AAPP.EQ.ZERO ) )
  1137. $ NOTROT = NOTROT + MIN( igl+KBL-1, N ) - p
  1138. END IF
  1139. *
  1140. 2001 CONTINUE
  1141. * end of the p-loop
  1142. * end of doing the block ( ibr, ibr )
  1143. 1002 CONTINUE
  1144. * end of ir1-loop
  1145. *
  1146. * ... go to the off diagonal blocks
  1147. *
  1148. igl = ( ibr-1 )*KBL + 1
  1149. *
  1150. DO 2010 jbc = ibr + 1, NBL
  1151. *
  1152. jgl = ( jbc-1 )*KBL + 1
  1153. *
  1154. * doing the block at ( ibr, jbc )
  1155. *
  1156. IJBLSK = 0
  1157. DO 2100 p = igl, MIN( igl+KBL-1, N )
  1158. *
  1159. AAPP = SVA( p )
  1160. IF( AAPP.GT.ZERO ) THEN
  1161. *
  1162. PSKIPPED = 0
  1163. *
  1164. DO 2200 q = jgl, MIN( jgl+KBL-1, N )
  1165. *
  1166. AAQQ = SVA( q )
  1167. IF( AAQQ.GT.ZERO ) THEN
  1168. AAPP0 = AAPP
  1169. *
  1170. * .. M x 2 Jacobi SVD ..
  1171. *
  1172. * Safe Gram matrix computation
  1173. *
  1174. IF( AAQQ.GE.ONE ) THEN
  1175. IF( AAPP.GE.AAQQ ) THEN
  1176. ROTOK = ( SMALL*AAPP ).LE.AAQQ
  1177. ELSE
  1178. ROTOK = ( SMALL*AAQQ ).LE.AAPP
  1179. END IF
  1180. IF( AAPP.LT.( BIG / AAQQ ) ) THEN
  1181. AAPQ = ( DDOT( M, A( 1, p ), 1, A( 1,
  1182. $ q ), 1 )*WORK( p )*WORK( q ) /
  1183. $ AAQQ ) / AAPP
  1184. ELSE
  1185. CALL DCOPY( M, A( 1, p ), 1,
  1186. $ WORK( N+1 ), 1 )
  1187. CALL DLASCL( 'G', 0, 0, AAPP,
  1188. $ WORK( p ), M, 1,
  1189. $ WORK( N+1 ), LDA, IERR )
  1190. AAPQ = DDOT( M, WORK( N+1 ), 1,
  1191. $ A( 1, q ), 1 )*WORK( q ) / AAQQ
  1192. END IF
  1193. ELSE
  1194. IF( AAPP.GE.AAQQ ) THEN
  1195. ROTOK = AAPP.LE.( AAQQ / SMALL )
  1196. ELSE
  1197. ROTOK = AAQQ.LE.( AAPP / SMALL )
  1198. END IF
  1199. IF( AAPP.GT.( SMALL / AAQQ ) ) THEN
  1200. AAPQ = ( DDOT( M, A( 1, p ), 1, A( 1,
  1201. $ q ), 1 )*WORK( p )*WORK( q ) /
  1202. $ AAQQ ) / AAPP
  1203. ELSE
  1204. CALL DCOPY( M, A( 1, q ), 1,
  1205. $ WORK( N+1 ), 1 )
  1206. CALL DLASCL( 'G', 0, 0, AAQQ,
  1207. $ WORK( q ), M, 1,
  1208. $ WORK( N+1 ), LDA, IERR )
  1209. AAPQ = DDOT( M, WORK( N+1 ), 1,
  1210. $ A( 1, p ), 1 )*WORK( p ) / AAPP
  1211. END IF
  1212. END IF
  1213. *
  1214. MXAAPQ = MAX( MXAAPQ, DABS( AAPQ ) )
  1215. *
  1216. * TO rotate or NOT to rotate, THAT is the question ...
  1217. *
  1218. IF( DABS( AAPQ ).GT.TOL ) THEN
  1219. NOTROT = 0
  1220. *[RTD] ROTATED = ROTATED + 1
  1221. PSKIPPED = 0
  1222. ISWROT = ISWROT + 1
  1223. *
  1224. IF( ROTOK ) THEN
  1225. *
  1226. AQOAP = AAQQ / AAPP
  1227. APOAQ = AAPP / AAQQ
  1228. THETA = -HALF*DABS(AQOAP-APOAQ)/AAPQ
  1229. IF( AAQQ.GT.AAPP0 )THETA = -THETA
  1230. *
  1231. IF( DABS( THETA ).GT.BIGTHETA ) THEN
  1232. T = HALF / THETA
  1233. FASTR( 3 ) = T*WORK( p ) / WORK( q )
  1234. FASTR( 4 ) = -T*WORK( q ) /
  1235. $ WORK( p )
  1236. CALL DROTM( M, A( 1, p ), 1,
  1237. $ A( 1, q ), 1, FASTR )
  1238. IF( RSVEC )CALL DROTM( MVL,
  1239. $ V( 1, p ), 1,
  1240. $ V( 1, q ), 1,
  1241. $ FASTR )
  1242. SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
  1243. $ ONE+T*APOAQ*AAPQ ) )
  1244. AAPP = AAPP*DSQRT( MAX( ZERO,
  1245. $ ONE-T*AQOAP*AAPQ ) )
  1246. MXSINJ = MAX( MXSINJ, DABS( T ) )
  1247. ELSE
  1248. *
  1249. * .. choose correct signum for THETA and rotate
  1250. *
  1251. THSIGN = -DSIGN( ONE, AAPQ )
  1252. IF( AAQQ.GT.AAPP0 )THSIGN = -THSIGN
  1253. T = ONE / ( THETA+THSIGN*
  1254. $ DSQRT( ONE+THETA*THETA ) )
  1255. CS = DSQRT( ONE / ( ONE+T*T ) )
  1256. SN = T*CS
  1257. MXSINJ = MAX( MXSINJ, DABS( SN ) )
  1258. SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
  1259. $ ONE+T*APOAQ*AAPQ ) )
  1260. AAPP = AAPP*DSQRT( MAX( ZERO,
  1261. $ ONE-T*AQOAP*AAPQ ) )
  1262. *
  1263. APOAQ = WORK( p ) / WORK( q )
  1264. AQOAP = WORK( q ) / WORK( p )
  1265. IF( WORK( p ).GE.ONE ) THEN
  1266. *
  1267. IF( WORK( q ).GE.ONE ) THEN
  1268. FASTR( 3 ) = T*APOAQ
  1269. FASTR( 4 ) = -T*AQOAP
  1270. WORK( p ) = WORK( p )*CS
  1271. WORK( q ) = WORK( q )*CS
  1272. CALL DROTM( M, A( 1, p ), 1,
  1273. $ A( 1, q ), 1,
  1274. $ FASTR )
  1275. IF( RSVEC )CALL DROTM( MVL,
  1276. $ V( 1, p ), 1, V( 1, q ),
  1277. $ 1, FASTR )
  1278. ELSE
  1279. CALL DAXPY( M, -T*AQOAP,
  1280. $ A( 1, q ), 1,
  1281. $ A( 1, p ), 1 )
  1282. CALL DAXPY( M, CS*SN*APOAQ,
  1283. $ A( 1, p ), 1,
  1284. $ A( 1, q ), 1 )
  1285. IF( RSVEC ) THEN
  1286. CALL DAXPY( MVL, -T*AQOAP,
  1287. $ V( 1, q ), 1,
  1288. $ V( 1, p ), 1 )
  1289. CALL DAXPY( MVL,
  1290. $ CS*SN*APOAQ,
  1291. $ V( 1, p ), 1,
  1292. $ V( 1, q ), 1 )
  1293. END IF
  1294. WORK( p ) = WORK( p )*CS
  1295. WORK( q ) = WORK( q ) / CS
  1296. END IF
  1297. ELSE
  1298. IF( WORK( q ).GE.ONE ) THEN
  1299. CALL DAXPY( M, T*APOAQ,
  1300. $ A( 1, p ), 1,
  1301. $ A( 1, q ), 1 )
  1302. CALL DAXPY( M, -CS*SN*AQOAP,
  1303. $ A( 1, q ), 1,
  1304. $ A( 1, p ), 1 )
  1305. IF( RSVEC ) THEN
  1306. CALL DAXPY( MVL, T*APOAQ,
  1307. $ V( 1, p ), 1,
  1308. $ V( 1, q ), 1 )
  1309. CALL DAXPY( MVL,
  1310. $ -CS*SN*AQOAP,
  1311. $ V( 1, q ), 1,
  1312. $ V( 1, p ), 1 )
  1313. END IF
  1314. WORK( p ) = WORK( p ) / CS
  1315. WORK( q ) = WORK( q )*CS
  1316. ELSE
  1317. IF( WORK( p ).GE.WORK( q ) )
  1318. $ THEN
  1319. CALL DAXPY( M, -T*AQOAP,
  1320. $ A( 1, q ), 1,
  1321. $ A( 1, p ), 1 )
  1322. CALL DAXPY( M, CS*SN*APOAQ,
  1323. $ A( 1, p ), 1,
  1324. $ A( 1, q ), 1 )
  1325. WORK( p ) = WORK( p )*CS
  1326. WORK( q ) = WORK( q ) / CS
  1327. IF( RSVEC ) THEN
  1328. CALL DAXPY( MVL,
  1329. $ -T*AQOAP,
  1330. $ V( 1, q ), 1,
  1331. $ V( 1, p ), 1 )
  1332. CALL DAXPY( MVL,
  1333. $ CS*SN*APOAQ,
  1334. $ V( 1, p ), 1,
  1335. $ V( 1, q ), 1 )
  1336. END IF
  1337. ELSE
  1338. CALL DAXPY( M, T*APOAQ,
  1339. $ A( 1, p ), 1,
  1340. $ A( 1, q ), 1 )
  1341. CALL DAXPY( M,
  1342. $ -CS*SN*AQOAP,
  1343. $ A( 1, q ), 1,
  1344. $ A( 1, p ), 1 )
  1345. WORK( p ) = WORK( p ) / CS
  1346. WORK( q ) = WORK( q )*CS
  1347. IF( RSVEC ) THEN
  1348. CALL DAXPY( MVL,
  1349. $ T*APOAQ, V( 1, p ),
  1350. $ 1, V( 1, q ), 1 )
  1351. CALL DAXPY( MVL,
  1352. $ -CS*SN*AQOAP,
  1353. $ V( 1, q ), 1,
  1354. $ V( 1, p ), 1 )
  1355. END IF
  1356. END IF
  1357. END IF
  1358. END IF
  1359. END IF
  1360. *
  1361. ELSE
  1362. IF( AAPP.GT.AAQQ ) THEN
  1363. CALL DCOPY( M, A( 1, p ), 1,
  1364. $ WORK( N+1 ), 1 )
  1365. CALL DLASCL( 'G', 0, 0, AAPP, ONE,
  1366. $ M, 1, WORK( N+1 ), LDA,
  1367. $ IERR )
  1368. CALL DLASCL( 'G', 0, 0, AAQQ, ONE,
  1369. $ M, 1, A( 1, q ), LDA,
  1370. $ IERR )
  1371. TEMP1 = -AAPQ*WORK( p ) / WORK( q )
  1372. CALL DAXPY( M, TEMP1, WORK( N+1 ),
  1373. $ 1, A( 1, q ), 1 )
  1374. CALL DLASCL( 'G', 0, 0, ONE, AAQQ,
  1375. $ M, 1, A( 1, q ), LDA,
  1376. $ IERR )
  1377. SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
  1378. $ ONE-AAPQ*AAPQ ) )
  1379. MXSINJ = MAX( MXSINJ, SFMIN )
  1380. ELSE
  1381. CALL DCOPY( M, A( 1, q ), 1,
  1382. $ WORK( N+1 ), 1 )
  1383. CALL DLASCL( 'G', 0, 0, AAQQ, ONE,
  1384. $ M, 1, WORK( N+1 ), LDA,
  1385. $ IERR )
  1386. CALL DLASCL( 'G', 0, 0, AAPP, ONE,
  1387. $ M, 1, A( 1, p ), LDA,
  1388. $ IERR )
  1389. TEMP1 = -AAPQ*WORK( q ) / WORK( p )
  1390. CALL DAXPY( M, TEMP1, WORK( N+1 ),
  1391. $ 1, A( 1, p ), 1 )
  1392. CALL DLASCL( 'G', 0, 0, ONE, AAPP,
  1393. $ M, 1, A( 1, p ), LDA,
  1394. $ IERR )
  1395. SVA( p ) = AAPP*DSQRT( MAX( ZERO,
  1396. $ ONE-AAPQ*AAPQ ) )
  1397. MXSINJ = MAX( MXSINJ, SFMIN )
  1398. END IF
  1399. END IF
  1400. * END IF ROTOK THEN ... ELSE
  1401. *
  1402. * In the case of cancellation in updating SVA(q)
  1403. * .. recompute SVA(q)
  1404. IF( ( SVA( q ) / AAQQ )**2.LE.ROOTEPS )
  1405. $ THEN
  1406. IF( ( AAQQ.LT.ROOTBIG ) .AND.
  1407. $ ( AAQQ.GT.ROOTSFMIN ) ) THEN
  1408. SVA( q ) = DNRM2( M, A( 1, q ), 1 )*
  1409. $ WORK( q )
  1410. ELSE
  1411. T = ZERO
  1412. AAQQ = ONE
  1413. CALL DLASSQ( M, A( 1, q ), 1, T,
  1414. $ AAQQ )
  1415. SVA( q ) = T*DSQRT( AAQQ )*WORK( q )
  1416. END IF
  1417. END IF
  1418. IF( ( AAPP / AAPP0 )**2.LE.ROOTEPS ) THEN
  1419. IF( ( AAPP.LT.ROOTBIG ) .AND.
  1420. $ ( AAPP.GT.ROOTSFMIN ) ) THEN
  1421. AAPP = DNRM2( M, A( 1, p ), 1 )*
  1422. $ WORK( p )
  1423. ELSE
  1424. T = ZERO
  1425. AAPP = ONE
  1426. CALL DLASSQ( M, A( 1, p ), 1, T,
  1427. $ AAPP )
  1428. AAPP = T*DSQRT( AAPP )*WORK( p )
  1429. END IF
  1430. SVA( p ) = AAPP
  1431. END IF
  1432. * end of OK rotation
  1433. ELSE
  1434. NOTROT = NOTROT + 1
  1435. *[RTD] SKIPPED = SKIPPED + 1
  1436. PSKIPPED = PSKIPPED + 1
  1437. IJBLSK = IJBLSK + 1
  1438. END IF
  1439. ELSE
  1440. NOTROT = NOTROT + 1
  1441. PSKIPPED = PSKIPPED + 1
  1442. IJBLSK = IJBLSK + 1
  1443. END IF
  1444. *
  1445. IF( ( i.LE.SWBAND ) .AND. ( IJBLSK.GE.BLSKIP ) )
  1446. $ THEN
  1447. SVA( p ) = AAPP
  1448. NOTROT = 0
  1449. GO TO 2011
  1450. END IF
  1451. IF( ( i.LE.SWBAND ) .AND.
  1452. $ ( PSKIPPED.GT.ROWSKIP ) ) THEN
  1453. AAPP = -AAPP
  1454. NOTROT = 0
  1455. GO TO 2203
  1456. END IF
  1457. *
  1458. 2200 CONTINUE
  1459. * end of the q-loop
  1460. 2203 CONTINUE
  1461. *
  1462. SVA( p ) = AAPP
  1463. *
  1464. ELSE
  1465. *
  1466. IF( AAPP.EQ.ZERO )NOTROT = NOTROT +
  1467. $ MIN( jgl+KBL-1, N ) - jgl + 1
  1468. IF( AAPP.LT.ZERO )NOTROT = 0
  1469. *
  1470. END IF
  1471. *
  1472. 2100 CONTINUE
  1473. * end of the p-loop
  1474. 2010 CONTINUE
  1475. * end of the jbc-loop
  1476. 2011 CONTINUE
  1477. *2011 bailed out of the jbc-loop
  1478. DO 2012 p = igl, MIN( igl+KBL-1, N )
  1479. SVA( p ) = DABS( SVA( p ) )
  1480. 2012 CONTINUE
  1481. ***
  1482. 2000 CONTINUE
  1483. *2000 :: end of the ibr-loop
  1484. *
  1485. * .. update SVA(N)
  1486. IF( ( SVA( N ).LT.ROOTBIG ) .AND. ( SVA( N ).GT.ROOTSFMIN ) )
  1487. $ THEN
  1488. SVA( N ) = DNRM2( M, A( 1, N ), 1 )*WORK( N )
  1489. ELSE
  1490. T = ZERO
  1491. AAPP = ONE
  1492. CALL DLASSQ( M, A( 1, N ), 1, T, AAPP )
  1493. SVA( N ) = T*DSQRT( AAPP )*WORK( N )
  1494. END IF
  1495. *
  1496. * Additional steering devices
  1497. *
  1498. IF( ( i.LT.SWBAND ) .AND. ( ( MXAAPQ.LE.ROOTTOL ) .OR.
  1499. $ ( ISWROT.LE.N ) ) )SWBAND = i
  1500. *
  1501. IF( ( i.GT.SWBAND+1 ) .AND. ( MXAAPQ.LT.DSQRT( DBLE( N ) )*
  1502. $ TOL ) .AND. ( DBLE( N )*MXAAPQ*MXSINJ.LT.TOL ) ) THEN
  1503. GO TO 1994
  1504. END IF
  1505. *
  1506. IF( NOTROT.GE.EMPTSW )GO TO 1994
  1507. *
  1508. 1993 CONTINUE
  1509. * end i=1:NSWEEP loop
  1510. *
  1511. * #:( Reaching this point means that the procedure has not converged.
  1512. INFO = NSWEEP - 1
  1513. GO TO 1995
  1514. *
  1515. 1994 CONTINUE
  1516. * #:) Reaching this point means numerical convergence after the i-th
  1517. * sweep.
  1518. *
  1519. INFO = 0
  1520. * #:) INFO = 0 confirms successful iterations.
  1521. 1995 CONTINUE
  1522. *
  1523. * Sort the singular values and find how many are above
  1524. * the underflow threshold.
  1525. *
  1526. N2 = 0
  1527. N4 = 0
  1528. DO 5991 p = 1, N - 1
  1529. q = IDAMAX( N-p+1, SVA( p ), 1 ) + p - 1
  1530. IF( p.NE.q ) THEN
  1531. TEMP1 = SVA( p )
  1532. SVA( p ) = SVA( q )
  1533. SVA( q ) = TEMP1
  1534. TEMP1 = WORK( p )
  1535. WORK( p ) = WORK( q )
  1536. WORK( q ) = TEMP1
  1537. CALL DSWAP( M, A( 1, p ), 1, A( 1, q ), 1 )
  1538. IF( RSVEC )CALL DSWAP( MVL, V( 1, p ), 1, V( 1, q ), 1 )
  1539. END IF
  1540. IF( SVA( p ).NE.ZERO ) THEN
  1541. N4 = N4 + 1
  1542. IF( SVA( p )*SKL.GT.SFMIN )N2 = N2 + 1
  1543. END IF
  1544. 5991 CONTINUE
  1545. IF( SVA( N ).NE.ZERO ) THEN
  1546. N4 = N4 + 1
  1547. IF( SVA( N )*SKL.GT.SFMIN )N2 = N2 + 1
  1548. END IF
  1549. *
  1550. * Normalize the left singular vectors.
  1551. *
  1552. IF( LSVEC .OR. UCTOL ) THEN
  1553. DO 1998 p = 1, N2
  1554. CALL DSCAL( M, WORK( p ) / SVA( p ), A( 1, p ), 1 )
  1555. 1998 CONTINUE
  1556. END IF
  1557. *
  1558. * Scale the product of Jacobi rotations (assemble the fast rotations).
  1559. *
  1560. IF( RSVEC ) THEN
  1561. IF( APPLV ) THEN
  1562. DO 2398 p = 1, N
  1563. CALL DSCAL( MVL, WORK( p ), V( 1, p ), 1 )
  1564. 2398 CONTINUE
  1565. ELSE
  1566. DO 2399 p = 1, N
  1567. TEMP1 = ONE / DNRM2( MVL, V( 1, p ), 1 )
  1568. CALL DSCAL( MVL, TEMP1, V( 1, p ), 1 )
  1569. 2399 CONTINUE
  1570. END IF
  1571. END IF
  1572. *
  1573. * Undo scaling, if necessary (and possible).
  1574. IF( ( ( SKL.GT.ONE ) .AND. ( SVA( 1 ).LT.( BIG / SKL) ) )
  1575. $ .OR. ( ( SKL.LT.ONE ) .AND. ( SVA( MAX( N2, 1 ) ) .GT.
  1576. $ ( SFMIN / SKL) ) ) ) THEN
  1577. DO 2400 p = 1, N
  1578. SVA( P ) = SKL*SVA( P )
  1579. 2400 CONTINUE
  1580. SKL= ONE
  1581. END IF
  1582. *
  1583. WORK( 1 ) = SKL
  1584. * The singular values of A are SKL*SVA(1:N). If SKL.NE.ONE
  1585. * then some of the singular values may overflow or underflow and
  1586. * the spectrum is given in this factored representation.
  1587. *
  1588. WORK( 2 ) = DBLE( N4 )
  1589. * N4 is the number of computed nonzero singular values of A.
  1590. *
  1591. WORK( 3 ) = DBLE( N2 )
  1592. * N2 is the number of singular values of A greater than SFMIN.
  1593. * If N2<N, SVA(N2:N) contains ZEROS and/or denormalized numbers
  1594. * that may carry some information.
  1595. *
  1596. WORK( 4 ) = DBLE( i )
  1597. * i is the index of the last sweep before declaring convergence.
  1598. *
  1599. WORK( 5 ) = MXAAPQ
  1600. * MXAAPQ is the largest absolute value of scaled pivots in the
  1601. * last sweep
  1602. *
  1603. WORK( 6 ) = MXSINJ
  1604. * MXSINJ is the largest absolute value of the sines of Jacobi angles
  1605. * in the last sweep
  1606. *
  1607. RETURN
  1608. * ..
  1609. * .. END OF DGESVJ
  1610. * ..
  1611. END