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.

sgsvj0.f 46 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078
  1. *> \brief \b SGSVJ0 pre-processor for the routine sgesvj.
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download SGSVJ0 + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/sgsvj0.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/sgsvj0.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/sgsvj0.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE SGSVJ0( JOBV, M, N, A, LDA, D, SVA, MV, V, LDV, EPS,
  22. * SFMIN, TOL, NSWEEP, WORK, LWORK, INFO )
  23. *
  24. * .. Scalar Arguments ..
  25. * INTEGER INFO, LDA, LDV, LWORK, M, MV, N, NSWEEP
  26. * REAL EPS, SFMIN, TOL
  27. * CHARACTER*1 JOBV
  28. * ..
  29. * .. Array Arguments ..
  30. * REAL A( LDA, * ), SVA( N ), D( N ), V( LDV, * ),
  31. * $ WORK( LWORK )
  32. * ..
  33. *
  34. *
  35. *> \par Purpose:
  36. * =============
  37. *>
  38. *> \verbatim
  39. *>
  40. *> SGSVJ0 is called from SGESVJ as a pre-processor and that is its main
  41. *> purpose. It applies Jacobi rotations in the same way as SGESVJ does, but
  42. *> it does not check convergence (stopping criterion). Few tuning
  43. *> parameters (marked by [TP]) are available for the implementer.
  44. *> \endverbatim
  45. *
  46. * Arguments:
  47. * ==========
  48. *
  49. *> \param[in] JOBV
  50. *> \verbatim
  51. *> JOBV is CHARACTER*1
  52. *> Specifies whether the output from this procedure is used
  53. *> to compute the matrix V:
  54. *> = 'V': the product of the Jacobi rotations is accumulated
  55. *> by postmulyiplying the N-by-N array V.
  56. *> (See the description of V.)
  57. *> = 'A': the product of the Jacobi rotations is accumulated
  58. *> by postmulyiplying the MV-by-N array V.
  59. *> (See the descriptions of MV and V.)
  60. *> = 'N': the Jacobi rotations are not accumulated.
  61. *> \endverbatim
  62. *>
  63. *> \param[in] M
  64. *> \verbatim
  65. *> M is INTEGER
  66. *> The number of rows of the input matrix A. M >= 0.
  67. *> \endverbatim
  68. *>
  69. *> \param[in] N
  70. *> \verbatim
  71. *> N is INTEGER
  72. *> The number of columns of the input matrix A.
  73. *> M >= N >= 0.
  74. *> \endverbatim
  75. *>
  76. *> \param[in,out] A
  77. *> \verbatim
  78. *> A is REAL array, dimension (LDA,N)
  79. *> On entry, M-by-N matrix A, such that A*diag(D) represents
  80. *> the input matrix.
  81. *> On exit,
  82. *> A_onexit * D_onexit represents the input matrix A*diag(D)
  83. *> post-multiplied by a sequence of Jacobi rotations, where the
  84. *> rotation threshold and the total number of sweeps are given in
  85. *> TOL and NSWEEP, respectively.
  86. *> (See the descriptions of D, TOL and NSWEEP.)
  87. *> \endverbatim
  88. *>
  89. *> \param[in] LDA
  90. *> \verbatim
  91. *> LDA is INTEGER
  92. *> The leading dimension of the array A. LDA >= max(1,M).
  93. *> \endverbatim
  94. *>
  95. *> \param[in,out] D
  96. *> \verbatim
  97. *> D is REAL array, dimension (N)
  98. *> The array D accumulates the scaling factors from the fast scaled
  99. *> Jacobi rotations.
  100. *> On entry, A*diag(D) represents the input matrix.
  101. *> On exit, A_onexit*diag(D_onexit) represents the input matrix
  102. *> post-multiplied by a sequence of Jacobi rotations, where the
  103. *> rotation threshold and the total number of sweeps are given in
  104. *> TOL and NSWEEP, respectively.
  105. *> (See the descriptions of A, TOL and NSWEEP.)
  106. *> \endverbatim
  107. *>
  108. *> \param[in,out] SVA
  109. *> \verbatim
  110. *> SVA is REAL array, dimension (N)
  111. *> On entry, SVA contains the Euclidean norms of the columns of
  112. *> the matrix A*diag(D).
  113. *> On exit, SVA contains the Euclidean norms of the columns of
  114. *> the matrix onexit*diag(D_onexit).
  115. *> \endverbatim
  116. *>
  117. *> \param[in] MV
  118. *> \verbatim
  119. *> MV is INTEGER
  120. *> If JOBV .EQ. 'A', then MV rows of V are post-multipled by a
  121. *> sequence of Jacobi rotations.
  122. *> If JOBV = 'N', then MV is not referenced.
  123. *> \endverbatim
  124. *>
  125. *> \param[in,out] V
  126. *> \verbatim
  127. *> V is REAL array, dimension (LDV,N)
  128. *> If JOBV .EQ. 'V' then N rows of V are post-multipled by a
  129. *> sequence of Jacobi rotations.
  130. *> If JOBV .EQ. 'A' then MV rows of V are post-multipled by a
  131. *> sequence of Jacobi rotations.
  132. *> If JOBV = 'N', then V is not referenced.
  133. *> \endverbatim
  134. *>
  135. *> \param[in] LDV
  136. *> \verbatim
  137. *> LDV is INTEGER
  138. *> The leading dimension of the array V, LDV >= 1.
  139. *> If JOBV = 'V', LDV .GE. N.
  140. *> If JOBV = 'A', LDV .GE. MV.
  141. *> \endverbatim
  142. *>
  143. *> \param[in] EPS
  144. *> \verbatim
  145. *> EPS is REAL
  146. *> EPS = SLAMCH('Epsilon')
  147. *> \endverbatim
  148. *>
  149. *> \param[in] SFMIN
  150. *> \verbatim
  151. *> SFMIN is REAL
  152. *> SFMIN = SLAMCH('Safe Minimum')
  153. *> \endverbatim
  154. *>
  155. *> \param[in] TOL
  156. *> \verbatim
  157. *> TOL is REAL
  158. *> TOL is the threshold for Jacobi rotations. For a pair
  159. *> A(:,p), A(:,q) of pivot columns, the Jacobi rotation is
  160. *> applied only if ABS(COS(angle(A(:,p),A(:,q)))) .GT. TOL.
  161. *> \endverbatim
  162. *>
  163. *> \param[in] NSWEEP
  164. *> \verbatim
  165. *> NSWEEP is INTEGER
  166. *> NSWEEP is the number of sweeps of Jacobi rotations to be
  167. *> performed.
  168. *> \endverbatim
  169. *>
  170. *> \param[out] WORK
  171. *> \verbatim
  172. *> WORK is REAL array, dimension LWORK.
  173. *> \endverbatim
  174. *>
  175. *> \param[in] LWORK
  176. *> \verbatim
  177. *> LWORK is INTEGER
  178. *> LWORK is the dimension of WORK. LWORK .GE. M.
  179. *> \endverbatim
  180. *>
  181. *> \param[out] INFO
  182. *> \verbatim
  183. *> INFO is INTEGER
  184. *> = 0 : successful exit.
  185. *> < 0 : if INFO = -i, then the i-th argument had an illegal value
  186. *> \endverbatim
  187. *
  188. * Authors:
  189. * ========
  190. *
  191. *> \author Univ. of Tennessee
  192. *> \author Univ. of California Berkeley
  193. *> \author Univ. of Colorado Denver
  194. *> \author NAG Ltd.
  195. *
  196. *> \date December 2016
  197. *
  198. *> \ingroup realOTHERcomputational
  199. *
  200. *> \par Further Details:
  201. * =====================
  202. *>
  203. *> SGSVJ0 is used just to enable SGESVJ to call a simplified version of
  204. *> itself to work on a submatrix of the original matrix.
  205. *>
  206. *> \par Contributors:
  207. * ==================
  208. *>
  209. *> Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany)
  210. *>
  211. *> \par Bugs, Examples and Comments:
  212. * =================================
  213. *>
  214. *> Please report all bugs and send interesting test examples and comments to
  215. *> drmac@math.hr. Thank you.
  216. *
  217. * =====================================================================
  218. SUBROUTINE SGSVJ0( JOBV, M, N, A, LDA, D, SVA, MV, V, LDV, EPS,
  219. $ SFMIN, TOL, NSWEEP, WORK, LWORK, INFO )
  220. *
  221. * -- LAPACK computational routine (version 3.7.0) --
  222. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  223. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  224. * December 2016
  225. *
  226. * .. Scalar Arguments ..
  227. INTEGER INFO, LDA, LDV, LWORK, M, MV, N, NSWEEP
  228. REAL EPS, SFMIN, TOL
  229. CHARACTER*1 JOBV
  230. * ..
  231. * .. Array Arguments ..
  232. REAL A( LDA, * ), SVA( N ), D( N ), V( LDV, * ),
  233. $ WORK( LWORK )
  234. * ..
  235. *
  236. * =====================================================================
  237. *
  238. * .. Local Parameters ..
  239. REAL ZERO, HALF, ONE
  240. PARAMETER ( ZERO = 0.0E0, HALF = 0.5E0, ONE = 1.0E0)
  241. * ..
  242. * .. Local Scalars ..
  243. REAL AAPP, AAPP0, AAPQ, AAQQ, APOAQ, AQOAP, BIG,
  244. $ BIGTHETA, CS, MXAAPQ, MXSINJ, ROOTBIG, ROOTEPS,
  245. $ ROOTSFMIN, ROOTTOL, SMALL, SN, T, TEMP1, THETA,
  246. $ THSIGN
  247. INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
  248. $ ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, NBL,
  249. $ NOTROT, p, PSKIPPED, q, ROWSKIP, SWBAND
  250. LOGICAL APPLV, ROTOK, RSVEC
  251. * ..
  252. * .. Local Arrays ..
  253. REAL FASTR( 5 )
  254. * ..
  255. * .. Intrinsic Functions ..
  256. INTRINSIC ABS, MAX, FLOAT, MIN, SIGN, SQRT
  257. * ..
  258. * .. External Functions ..
  259. REAL SDOT, SNRM2
  260. INTEGER ISAMAX
  261. LOGICAL LSAME
  262. EXTERNAL ISAMAX, LSAME, SDOT, SNRM2
  263. * ..
  264. * .. External Subroutines ..
  265. EXTERNAL SAXPY, SCOPY, SLASCL, SLASSQ, SROTM, SSWAP
  266. * ..
  267. * .. Executable Statements ..
  268. *
  269. * Test the input parameters.
  270. *
  271. APPLV = LSAME( JOBV, 'A' )
  272. RSVEC = LSAME( JOBV, 'V' )
  273. IF( .NOT.( RSVEC .OR. APPLV .OR. LSAME( JOBV, 'N' ) ) ) THEN
  274. INFO = -1
  275. ELSE IF( M.LT.0 ) THEN
  276. INFO = -2
  277. ELSE IF( ( N.LT.0 ) .OR. ( N.GT.M ) ) THEN
  278. INFO = -3
  279. ELSE IF( LDA.LT.M ) THEN
  280. INFO = -5
  281. ELSE IF( ( RSVEC.OR.APPLV ) .AND. ( MV.LT.0 ) ) THEN
  282. INFO = -8
  283. ELSE IF( ( RSVEC.AND.( LDV.LT.N ) ).OR.
  284. $ ( APPLV.AND.( LDV.LT.MV ) ) ) THEN
  285. INFO = -10
  286. ELSE IF( TOL.LE.EPS ) THEN
  287. INFO = -13
  288. ELSE IF( NSWEEP.LT.0 ) THEN
  289. INFO = -14
  290. ELSE IF( LWORK.LT.M ) THEN
  291. INFO = -16
  292. ELSE
  293. INFO = 0
  294. END IF
  295. *
  296. * #:(
  297. IF( INFO.NE.0 ) THEN
  298. CALL XERBLA( 'SGSVJ0', -INFO )
  299. RETURN
  300. END IF
  301. *
  302. IF( RSVEC ) THEN
  303. MVL = N
  304. ELSE IF( APPLV ) THEN
  305. MVL = MV
  306. END IF
  307. RSVEC = RSVEC .OR. APPLV
  308. ROOTEPS = SQRT( EPS )
  309. ROOTSFMIN = SQRT( SFMIN )
  310. SMALL = SFMIN / EPS
  311. BIG = ONE / SFMIN
  312. ROOTBIG = ONE / ROOTSFMIN
  313. BIGTHETA = ONE / ROOTEPS
  314. ROOTTOL = SQRT( TOL )
  315. *
  316. * .. Row-cyclic Jacobi SVD algorithm with column pivoting ..
  317. *
  318. EMPTSW = ( N*( N-1 ) ) / 2
  319. NOTROT = 0
  320. FASTR( 1 ) = ZERO
  321. *
  322. * .. Row-cyclic pivot strategy with de Rijk's pivoting ..
  323. *
  324. SWBAND = 0
  325. *[TP] SWBAND is a tuning parameter. It is meaningful and effective
  326. * if SGESVJ is used as a computational routine in the preconditioned
  327. * Jacobi SVD algorithm SGESVJ. For sweeps i=1:SWBAND the procedure
  328. * ......
  329. KBL = MIN( 8, N )
  330. *[TP] KBL is a tuning parameter that defines the tile size in the
  331. * tiling of the p-q loops of pivot pairs. In general, an optimal
  332. * value of KBL depends on the matrix dimensions and on the
  333. * parameters of the computer's memory.
  334. *
  335. NBL = N / KBL
  336. IF( ( NBL*KBL ).NE.N )NBL = NBL + 1
  337. BLSKIP = ( KBL**2 ) + 1
  338. *[TP] BLKSKIP is a tuning parameter that depends on SWBAND and KBL.
  339. ROWSKIP = MIN( 5, KBL )
  340. *[TP] ROWSKIP is a tuning parameter.
  341. LKAHEAD = 1
  342. *[TP] LKAHEAD is a tuning parameter.
  343. SWBAND = 0
  344. PSKIPPED = 0
  345. *
  346. DO 1993 i = 1, NSWEEP
  347. * .. go go go ...
  348. *
  349. MXAAPQ = ZERO
  350. MXSINJ = ZERO
  351. ISWROT = 0
  352. *
  353. NOTROT = 0
  354. PSKIPPED = 0
  355. *
  356. DO 2000 ibr = 1, NBL
  357. igl = ( ibr-1 )*KBL + 1
  358. *
  359. DO 1002 ir1 = 0, MIN( LKAHEAD, NBL-ibr )
  360. *
  361. igl = igl + ir1*KBL
  362. *
  363. DO 2001 p = igl, MIN( igl+KBL-1, N-1 )
  364. * .. de Rijk's pivoting
  365. q = ISAMAX( N-p+1, SVA( p ), 1 ) + p - 1
  366. IF( p.NE.q ) THEN
  367. CALL SSWAP( M, A( 1, p ), 1, A( 1, q ), 1 )
  368. IF( RSVEC )CALL SSWAP( MVL, V( 1, p ), 1,
  369. $ V( 1, q ), 1 )
  370. TEMP1 = SVA( p )
  371. SVA( p ) = SVA( q )
  372. SVA( q ) = TEMP1
  373. TEMP1 = D( p )
  374. D( p ) = D( q )
  375. D( q ) = TEMP1
  376. END IF
  377. *
  378. IF( ir1.EQ.0 ) THEN
  379. *
  380. * Column norms are periodically updated by explicit
  381. * norm computation.
  382. * Caveat:
  383. * Some BLAS implementations compute SNRM2(M,A(1,p),1)
  384. * as SQRT(SDOT(M,A(1,p),1,A(1,p),1)), which may result in
  385. * overflow for ||A(:,p)||_2 > SQRT(overflow_threshold), and
  386. * undeflow for ||A(:,p)||_2 < SQRT(underflow_threshold).
  387. * Hence, SNRM2 cannot be trusted, not even in the case when
  388. * the true norm is far from the under(over)flow boundaries.
  389. * If properly implemented SNRM2 is available, the IF-THEN-ELSE
  390. * below should read "AAPP = SNRM2( M, A(1,p), 1 ) * D(p)".
  391. *
  392. IF( ( SVA( p ).LT.ROOTBIG ) .AND.
  393. $ ( SVA( p ).GT.ROOTSFMIN ) ) THEN
  394. SVA( p ) = SNRM2( M, A( 1, p ), 1 )*D( p )
  395. ELSE
  396. TEMP1 = ZERO
  397. AAPP = ONE
  398. CALL SLASSQ( M, A( 1, p ), 1, TEMP1, AAPP )
  399. SVA( p ) = TEMP1*SQRT( AAPP )*D( p )
  400. END IF
  401. AAPP = SVA( p )
  402. ELSE
  403. AAPP = SVA( p )
  404. END IF
  405. *
  406. IF( AAPP.GT.ZERO ) THEN
  407. *
  408. PSKIPPED = 0
  409. *
  410. DO 2002 q = p + 1, MIN( igl+KBL-1, N )
  411. *
  412. AAQQ = SVA( q )
  413. IF( AAQQ.GT.ZERO ) THEN
  414. *
  415. AAPP0 = AAPP
  416. IF( AAQQ.GE.ONE ) THEN
  417. ROTOK = ( SMALL*AAPP ).LE.AAQQ
  418. IF( AAPP.LT.( BIG / AAQQ ) ) THEN
  419. AAPQ = ( SDOT( M, A( 1, p ), 1, A( 1,
  420. $ q ), 1 )*D( p )*D( q ) / AAQQ )
  421. $ / AAPP
  422. ELSE
  423. CALL SCOPY( M, A( 1, p ), 1, WORK, 1 )
  424. CALL SLASCL( 'G', 0, 0, AAPP, D( p ),
  425. $ M, 1, WORK, LDA, IERR )
  426. AAPQ = SDOT( M, WORK, 1, A( 1, q ),
  427. $ 1 )*D( q ) / AAQQ
  428. END IF
  429. ELSE
  430. ROTOK = AAPP.LE.( AAQQ / SMALL )
  431. IF( AAPP.GT.( SMALL / AAQQ ) ) THEN
  432. AAPQ = ( SDOT( M, A( 1, p ), 1, A( 1,
  433. $ q ), 1 )*D( p )*D( q ) / AAQQ )
  434. $ / AAPP
  435. ELSE
  436. CALL SCOPY( M, A( 1, q ), 1, WORK, 1 )
  437. CALL SLASCL( 'G', 0, 0, AAQQ, D( q ),
  438. $ M, 1, WORK, LDA, IERR )
  439. AAPQ = SDOT( M, WORK, 1, A( 1, p ),
  440. $ 1 )*D( p ) / AAPP
  441. END IF
  442. END IF
  443. *
  444. MXAAPQ = MAX( MXAAPQ, ABS( AAPQ ) )
  445. *
  446. * TO rotate or NOT to rotate, THAT is the question ...
  447. *
  448. IF( ABS( AAPQ ).GT.TOL ) THEN
  449. *
  450. * .. rotate
  451. * ROTATED = ROTATED + ONE
  452. *
  453. IF( ir1.EQ.0 ) THEN
  454. NOTROT = 0
  455. PSKIPPED = 0
  456. ISWROT = ISWROT + 1
  457. END IF
  458. *
  459. IF( ROTOK ) THEN
  460. *
  461. AQOAP = AAQQ / AAPP
  462. APOAQ = AAPP / AAQQ
  463. THETA = -HALF*ABS( AQOAP-APOAQ ) / AAPQ
  464. *
  465. IF( ABS( THETA ).GT.BIGTHETA ) THEN
  466. *
  467. T = HALF / THETA
  468. FASTR( 3 ) = T*D( p ) / D( q )
  469. FASTR( 4 ) = -T*D( q ) / D( p )
  470. CALL SROTM( M, A( 1, p ), 1,
  471. $ A( 1, q ), 1, FASTR )
  472. IF( RSVEC )CALL SROTM( MVL,
  473. $ V( 1, p ), 1,
  474. $ V( 1, q ), 1,
  475. $ FASTR )
  476. SVA( q ) = AAQQ*SQRT( MAX( ZERO,
  477. $ ONE+T*APOAQ*AAPQ ) )
  478. AAPP = AAPP*SQRT( MAX( ZERO,
  479. $ ONE-T*AQOAP*AAPQ ) )
  480. MXSINJ = MAX( MXSINJ, ABS( T ) )
  481. *
  482. ELSE
  483. *
  484. * .. choose correct signum for THETA and rotate
  485. *
  486. THSIGN = -SIGN( ONE, AAPQ )
  487. T = ONE / ( THETA+THSIGN*
  488. $ SQRT( ONE+THETA*THETA ) )
  489. CS = SQRT( ONE / ( ONE+T*T ) )
  490. SN = T*CS
  491. *
  492. MXSINJ = MAX( MXSINJ, ABS( SN ) )
  493. SVA( q ) = AAQQ*SQRT( MAX( ZERO,
  494. $ ONE+T*APOAQ*AAPQ ) )
  495. AAPP = AAPP*SQRT( MAX( ZERO,
  496. $ ONE-T*AQOAP*AAPQ ) )
  497. *
  498. APOAQ = D( p ) / D( q )
  499. AQOAP = D( q ) / D( p )
  500. IF( D( p ).GE.ONE ) THEN
  501. IF( D( q ).GE.ONE ) THEN
  502. FASTR( 3 ) = T*APOAQ
  503. FASTR( 4 ) = -T*AQOAP
  504. D( p ) = D( p )*CS
  505. D( q ) = D( q )*CS
  506. CALL SROTM( M, A( 1, p ), 1,
  507. $ A( 1, q ), 1,
  508. $ FASTR )
  509. IF( RSVEC )CALL SROTM( MVL,
  510. $ V( 1, p ), 1, V( 1, q ),
  511. $ 1, FASTR )
  512. ELSE
  513. CALL SAXPY( M, -T*AQOAP,
  514. $ A( 1, q ), 1,
  515. $ A( 1, p ), 1 )
  516. CALL SAXPY( M, CS*SN*APOAQ,
  517. $ A( 1, p ), 1,
  518. $ A( 1, q ), 1 )
  519. D( p ) = D( p )*CS
  520. D( q ) = D( q ) / CS
  521. IF( RSVEC ) THEN
  522. CALL SAXPY( MVL, -T*AQOAP,
  523. $ V( 1, q ), 1,
  524. $ V( 1, p ), 1 )
  525. CALL SAXPY( MVL,
  526. $ CS*SN*APOAQ,
  527. $ V( 1, p ), 1,
  528. $ V( 1, q ), 1 )
  529. END IF
  530. END IF
  531. ELSE
  532. IF( D( q ).GE.ONE ) THEN
  533. CALL SAXPY( M, T*APOAQ,
  534. $ A( 1, p ), 1,
  535. $ A( 1, q ), 1 )
  536. CALL SAXPY( M, -CS*SN*AQOAP,
  537. $ A( 1, q ), 1,
  538. $ A( 1, p ), 1 )
  539. D( p ) = D( p ) / CS
  540. D( q ) = D( q )*CS
  541. IF( RSVEC ) THEN
  542. CALL SAXPY( MVL, T*APOAQ,
  543. $ V( 1, p ), 1,
  544. $ V( 1, q ), 1 )
  545. CALL SAXPY( MVL,
  546. $ -CS*SN*AQOAP,
  547. $ V( 1, q ), 1,
  548. $ V( 1, p ), 1 )
  549. END IF
  550. ELSE
  551. IF( D( p ).GE.D( q ) ) THEN
  552. CALL SAXPY( M, -T*AQOAP,
  553. $ A( 1, q ), 1,
  554. $ A( 1, p ), 1 )
  555. CALL SAXPY( M, CS*SN*APOAQ,
  556. $ A( 1, p ), 1,
  557. $ A( 1, q ), 1 )
  558. D( p ) = D( p )*CS
  559. D( q ) = D( q ) / CS
  560. IF( RSVEC ) THEN
  561. CALL SAXPY( MVL,
  562. $ -T*AQOAP,
  563. $ V( 1, q ), 1,
  564. $ V( 1, p ), 1 )
  565. CALL SAXPY( MVL,
  566. $ CS*SN*APOAQ,
  567. $ V( 1, p ), 1,
  568. $ V( 1, q ), 1 )
  569. END IF
  570. ELSE
  571. CALL SAXPY( M, T*APOAQ,
  572. $ A( 1, p ), 1,
  573. $ A( 1, q ), 1 )
  574. CALL SAXPY( M,
  575. $ -CS*SN*AQOAP,
  576. $ A( 1, q ), 1,
  577. $ A( 1, p ), 1 )
  578. D( p ) = D( p ) / CS
  579. D( q ) = D( q )*CS
  580. IF( RSVEC ) THEN
  581. CALL SAXPY( MVL,
  582. $ T*APOAQ, V( 1, p ),
  583. $ 1, V( 1, q ), 1 )
  584. CALL SAXPY( MVL,
  585. $ -CS*SN*AQOAP,
  586. $ V( 1, q ), 1,
  587. $ V( 1, p ), 1 )
  588. END IF
  589. END IF
  590. END IF
  591. END IF
  592. END IF
  593. *
  594. ELSE
  595. * .. have to use modified Gram-Schmidt like transformation
  596. CALL SCOPY( M, A( 1, p ), 1, WORK, 1 )
  597. CALL SLASCL( 'G', 0, 0, AAPP, ONE, M,
  598. $ 1, WORK, LDA, IERR )
  599. CALL SLASCL( 'G', 0, 0, AAQQ, ONE, M,
  600. $ 1, A( 1, q ), LDA, IERR )
  601. TEMP1 = -AAPQ*D( p ) / D( q )
  602. CALL SAXPY( M, TEMP1, WORK, 1,
  603. $ A( 1, q ), 1 )
  604. CALL SLASCL( 'G', 0, 0, ONE, AAQQ, M,
  605. $ 1, A( 1, q ), LDA, IERR )
  606. SVA( q ) = AAQQ*SQRT( MAX( ZERO,
  607. $ ONE-AAPQ*AAPQ ) )
  608. MXSINJ = MAX( MXSINJ, SFMIN )
  609. END IF
  610. * END IF ROTOK THEN ... ELSE
  611. *
  612. * In the case of cancellation in updating SVA(q), SVA(p)
  613. * recompute SVA(q), SVA(p).
  614. IF( ( SVA( q ) / AAQQ )**2.LE.ROOTEPS )
  615. $ THEN
  616. IF( ( AAQQ.LT.ROOTBIG ) .AND.
  617. $ ( AAQQ.GT.ROOTSFMIN ) ) THEN
  618. SVA( q ) = SNRM2( M, A( 1, q ), 1 )*
  619. $ D( q )
  620. ELSE
  621. T = ZERO
  622. AAQQ = ONE
  623. CALL SLASSQ( M, A( 1, q ), 1, T,
  624. $ AAQQ )
  625. SVA( q ) = T*SQRT( AAQQ )*D( q )
  626. END IF
  627. END IF
  628. IF( ( AAPP / AAPP0 ).LE.ROOTEPS ) THEN
  629. IF( ( AAPP.LT.ROOTBIG ) .AND.
  630. $ ( AAPP.GT.ROOTSFMIN ) ) THEN
  631. AAPP = SNRM2( M, A( 1, p ), 1 )*
  632. $ D( p )
  633. ELSE
  634. T = ZERO
  635. AAPP = ONE
  636. CALL SLASSQ( M, A( 1, p ), 1, T,
  637. $ AAPP )
  638. AAPP = T*SQRT( AAPP )*D( p )
  639. END IF
  640. SVA( p ) = AAPP
  641. END IF
  642. *
  643. ELSE
  644. * A(:,p) and A(:,q) already numerically orthogonal
  645. IF( ir1.EQ.0 )NOTROT = NOTROT + 1
  646. PSKIPPED = PSKIPPED + 1
  647. END IF
  648. ELSE
  649. * A(:,q) is zero column
  650. IF( ir1.EQ.0 )NOTROT = NOTROT + 1
  651. PSKIPPED = PSKIPPED + 1
  652. END IF
  653. *
  654. IF( ( i.LE.SWBAND ) .AND.
  655. $ ( PSKIPPED.GT.ROWSKIP ) ) THEN
  656. IF( ir1.EQ.0 )AAPP = -AAPP
  657. NOTROT = 0
  658. GO TO 2103
  659. END IF
  660. *
  661. 2002 CONTINUE
  662. * END q-LOOP
  663. *
  664. 2103 CONTINUE
  665. * bailed out of q-loop
  666. SVA( p ) = AAPP
  667. ELSE
  668. SVA( p ) = AAPP
  669. IF( ( ir1.EQ.0 ) .AND. ( AAPP.EQ.ZERO ) )
  670. $ NOTROT = NOTROT + MIN( igl+KBL-1, N ) - p
  671. END IF
  672. *
  673. 2001 CONTINUE
  674. * end of the p-loop
  675. * end of doing the block ( ibr, ibr )
  676. 1002 CONTINUE
  677. * end of ir1-loop
  678. *
  679. *........................................................
  680. * ... go to the off diagonal blocks
  681. *
  682. igl = ( ibr-1 )*KBL + 1
  683. *
  684. DO 2010 jbc = ibr + 1, NBL
  685. *
  686. jgl = ( jbc-1 )*KBL + 1
  687. *
  688. * doing the block at ( ibr, jbc )
  689. *
  690. IJBLSK = 0
  691. DO 2100 p = igl, MIN( igl+KBL-1, N )
  692. *
  693. AAPP = SVA( p )
  694. *
  695. IF( AAPP.GT.ZERO ) THEN
  696. *
  697. PSKIPPED = 0
  698. *
  699. DO 2200 q = jgl, MIN( jgl+KBL-1, N )
  700. *
  701. AAQQ = SVA( q )
  702. *
  703. IF( AAQQ.GT.ZERO ) THEN
  704. AAPP0 = AAPP
  705. *
  706. * .. M x 2 Jacobi SVD ..
  707. *
  708. * .. Safe Gram matrix computation ..
  709. *
  710. IF( AAQQ.GE.ONE ) THEN
  711. IF( AAPP.GE.AAQQ ) THEN
  712. ROTOK = ( SMALL*AAPP ).LE.AAQQ
  713. ELSE
  714. ROTOK = ( SMALL*AAQQ ).LE.AAPP
  715. END IF
  716. IF( AAPP.LT.( BIG / AAQQ ) ) THEN
  717. AAPQ = ( SDOT( M, A( 1, p ), 1, A( 1,
  718. $ q ), 1 )*D( p )*D( q ) / AAQQ )
  719. $ / AAPP
  720. ELSE
  721. CALL SCOPY( M, A( 1, p ), 1, WORK, 1 )
  722. CALL SLASCL( 'G', 0, 0, AAPP, D( p ),
  723. $ M, 1, WORK, LDA, IERR )
  724. AAPQ = SDOT( M, WORK, 1, A( 1, q ),
  725. $ 1 )*D( q ) / AAQQ
  726. END IF
  727. ELSE
  728. IF( AAPP.GE.AAQQ ) THEN
  729. ROTOK = AAPP.LE.( AAQQ / SMALL )
  730. ELSE
  731. ROTOK = AAQQ.LE.( AAPP / SMALL )
  732. END IF
  733. IF( AAPP.GT.( SMALL / AAQQ ) ) THEN
  734. AAPQ = ( SDOT( M, A( 1, p ), 1, A( 1,
  735. $ q ), 1 )*D( p )*D( q ) / AAQQ )
  736. $ / AAPP
  737. ELSE
  738. CALL SCOPY( M, A( 1, q ), 1, WORK, 1 )
  739. CALL SLASCL( 'G', 0, 0, AAQQ, D( q ),
  740. $ M, 1, WORK, LDA, IERR )
  741. AAPQ = SDOT( M, WORK, 1, A( 1, p ),
  742. $ 1 )*D( p ) / AAPP
  743. END IF
  744. END IF
  745. *
  746. MXAAPQ = MAX( MXAAPQ, ABS( AAPQ ) )
  747. *
  748. * TO rotate or NOT to rotate, THAT is the question ...
  749. *
  750. IF( ABS( AAPQ ).GT.TOL ) THEN
  751. NOTROT = 0
  752. * ROTATED = ROTATED + 1
  753. PSKIPPED = 0
  754. ISWROT = ISWROT + 1
  755. *
  756. IF( ROTOK ) THEN
  757. *
  758. AQOAP = AAQQ / AAPP
  759. APOAQ = AAPP / AAQQ
  760. THETA = -HALF*ABS( AQOAP-APOAQ ) / AAPQ
  761. IF( AAQQ.GT.AAPP0 )THETA = -THETA
  762. *
  763. IF( ABS( THETA ).GT.BIGTHETA ) THEN
  764. T = HALF / THETA
  765. FASTR( 3 ) = T*D( p ) / D( q )
  766. FASTR( 4 ) = -T*D( q ) / D( p )
  767. CALL SROTM( M, A( 1, p ), 1,
  768. $ A( 1, q ), 1, FASTR )
  769. IF( RSVEC )CALL SROTM( MVL,
  770. $ V( 1, p ), 1,
  771. $ V( 1, q ), 1,
  772. $ FASTR )
  773. SVA( q ) = AAQQ*SQRT( MAX( ZERO,
  774. $ ONE+T*APOAQ*AAPQ ) )
  775. AAPP = AAPP*SQRT( MAX( ZERO,
  776. $ ONE-T*AQOAP*AAPQ ) )
  777. MXSINJ = MAX( MXSINJ, ABS( T ) )
  778. ELSE
  779. *
  780. * .. choose correct signum for THETA and rotate
  781. *
  782. THSIGN = -SIGN( ONE, AAPQ )
  783. IF( AAQQ.GT.AAPP0 )THSIGN = -THSIGN
  784. T = ONE / ( THETA+THSIGN*
  785. $ SQRT( ONE+THETA*THETA ) )
  786. CS = SQRT( ONE / ( ONE+T*T ) )
  787. SN = T*CS
  788. MXSINJ = MAX( MXSINJ, ABS( SN ) )
  789. SVA( q ) = AAQQ*SQRT( MAX( ZERO,
  790. $ ONE+T*APOAQ*AAPQ ) )
  791. AAPP = AAPP*SQRT( MAX( ZERO,
  792. $ ONE-T*AQOAP*AAPQ ) )
  793. *
  794. APOAQ = D( p ) / D( q )
  795. AQOAP = D( q ) / D( p )
  796. IF( D( p ).GE.ONE ) THEN
  797. *
  798. IF( D( q ).GE.ONE ) THEN
  799. FASTR( 3 ) = T*APOAQ
  800. FASTR( 4 ) = -T*AQOAP
  801. D( p ) = D( p )*CS
  802. D( q ) = D( q )*CS
  803. CALL SROTM( M, A( 1, p ), 1,
  804. $ A( 1, q ), 1,
  805. $ FASTR )
  806. IF( RSVEC )CALL SROTM( MVL,
  807. $ V( 1, p ), 1, V( 1, q ),
  808. $ 1, FASTR )
  809. ELSE
  810. CALL SAXPY( M, -T*AQOAP,
  811. $ A( 1, q ), 1,
  812. $ A( 1, p ), 1 )
  813. CALL SAXPY( M, CS*SN*APOAQ,
  814. $ A( 1, p ), 1,
  815. $ A( 1, q ), 1 )
  816. IF( RSVEC ) THEN
  817. CALL SAXPY( MVL, -T*AQOAP,
  818. $ V( 1, q ), 1,
  819. $ V( 1, p ), 1 )
  820. CALL SAXPY( MVL,
  821. $ CS*SN*APOAQ,
  822. $ V( 1, p ), 1,
  823. $ V( 1, q ), 1 )
  824. END IF
  825. D( p ) = D( p )*CS
  826. D( q ) = D( q ) / CS
  827. END IF
  828. ELSE
  829. IF( D( q ).GE.ONE ) THEN
  830. CALL SAXPY( M, T*APOAQ,
  831. $ A( 1, p ), 1,
  832. $ A( 1, q ), 1 )
  833. CALL SAXPY( M, -CS*SN*AQOAP,
  834. $ A( 1, q ), 1,
  835. $ A( 1, p ), 1 )
  836. IF( RSVEC ) THEN
  837. CALL SAXPY( MVL, T*APOAQ,
  838. $ V( 1, p ), 1,
  839. $ V( 1, q ), 1 )
  840. CALL SAXPY( MVL,
  841. $ -CS*SN*AQOAP,
  842. $ V( 1, q ), 1,
  843. $ V( 1, p ), 1 )
  844. END IF
  845. D( p ) = D( p ) / CS
  846. D( q ) = D( q )*CS
  847. ELSE
  848. IF( D( p ).GE.D( q ) ) THEN
  849. CALL SAXPY( M, -T*AQOAP,
  850. $ A( 1, q ), 1,
  851. $ A( 1, p ), 1 )
  852. CALL SAXPY( M, CS*SN*APOAQ,
  853. $ A( 1, p ), 1,
  854. $ A( 1, q ), 1 )
  855. D( p ) = D( p )*CS
  856. D( q ) = D( q ) / CS
  857. IF( RSVEC ) THEN
  858. CALL SAXPY( MVL,
  859. $ -T*AQOAP,
  860. $ V( 1, q ), 1,
  861. $ V( 1, p ), 1 )
  862. CALL SAXPY( MVL,
  863. $ CS*SN*APOAQ,
  864. $ V( 1, p ), 1,
  865. $ V( 1, q ), 1 )
  866. END IF
  867. ELSE
  868. CALL SAXPY( M, T*APOAQ,
  869. $ A( 1, p ), 1,
  870. $ A( 1, q ), 1 )
  871. CALL SAXPY( M,
  872. $ -CS*SN*AQOAP,
  873. $ A( 1, q ), 1,
  874. $ A( 1, p ), 1 )
  875. D( p ) = D( p ) / CS
  876. D( q ) = D( q )*CS
  877. IF( RSVEC ) THEN
  878. CALL SAXPY( MVL,
  879. $ T*APOAQ, V( 1, p ),
  880. $ 1, V( 1, q ), 1 )
  881. CALL SAXPY( MVL,
  882. $ -CS*SN*AQOAP,
  883. $ V( 1, q ), 1,
  884. $ V( 1, p ), 1 )
  885. END IF
  886. END IF
  887. END IF
  888. END IF
  889. END IF
  890. *
  891. ELSE
  892. IF( AAPP.GT.AAQQ ) THEN
  893. CALL SCOPY( M, A( 1, p ), 1, WORK,
  894. $ 1 )
  895. CALL SLASCL( 'G', 0, 0, AAPP, ONE,
  896. $ M, 1, WORK, LDA, IERR )
  897. CALL SLASCL( 'G', 0, 0, AAQQ, ONE,
  898. $ M, 1, A( 1, q ), LDA,
  899. $ IERR )
  900. TEMP1 = -AAPQ*D( p ) / D( q )
  901. CALL SAXPY( M, TEMP1, WORK, 1,
  902. $ A( 1, q ), 1 )
  903. CALL SLASCL( 'G', 0, 0, ONE, AAQQ,
  904. $ M, 1, A( 1, q ), LDA,
  905. $ IERR )
  906. SVA( q ) = AAQQ*SQRT( MAX( ZERO,
  907. $ ONE-AAPQ*AAPQ ) )
  908. MXSINJ = MAX( MXSINJ, SFMIN )
  909. ELSE
  910. CALL SCOPY( M, A( 1, q ), 1, WORK,
  911. $ 1 )
  912. CALL SLASCL( 'G', 0, 0, AAQQ, ONE,
  913. $ M, 1, WORK, LDA, IERR )
  914. CALL SLASCL( 'G', 0, 0, AAPP, ONE,
  915. $ M, 1, A( 1, p ), LDA,
  916. $ IERR )
  917. TEMP1 = -AAPQ*D( q ) / D( p )
  918. CALL SAXPY( M, TEMP1, WORK, 1,
  919. $ A( 1, p ), 1 )
  920. CALL SLASCL( 'G', 0, 0, ONE, AAPP,
  921. $ M, 1, A( 1, p ), LDA,
  922. $ IERR )
  923. SVA( p ) = AAPP*SQRT( MAX( ZERO,
  924. $ ONE-AAPQ*AAPQ ) )
  925. MXSINJ = MAX( MXSINJ, SFMIN )
  926. END IF
  927. END IF
  928. * END IF ROTOK THEN ... ELSE
  929. *
  930. * In the case of cancellation in updating SVA(q)
  931. * .. recompute SVA(q)
  932. IF( ( SVA( q ) / AAQQ )**2.LE.ROOTEPS )
  933. $ THEN
  934. IF( ( AAQQ.LT.ROOTBIG ) .AND.
  935. $ ( AAQQ.GT.ROOTSFMIN ) ) THEN
  936. SVA( q ) = SNRM2( M, A( 1, q ), 1 )*
  937. $ D( q )
  938. ELSE
  939. T = ZERO
  940. AAQQ = ONE
  941. CALL SLASSQ( M, A( 1, q ), 1, T,
  942. $ AAQQ )
  943. SVA( q ) = T*SQRT( AAQQ )*D( q )
  944. END IF
  945. END IF
  946. IF( ( AAPP / AAPP0 )**2.LE.ROOTEPS ) THEN
  947. IF( ( AAPP.LT.ROOTBIG ) .AND.
  948. $ ( AAPP.GT.ROOTSFMIN ) ) THEN
  949. AAPP = SNRM2( M, A( 1, p ), 1 )*
  950. $ D( p )
  951. ELSE
  952. T = ZERO
  953. AAPP = ONE
  954. CALL SLASSQ( M, A( 1, p ), 1, T,
  955. $ AAPP )
  956. AAPP = T*SQRT( AAPP )*D( p )
  957. END IF
  958. SVA( p ) = AAPP
  959. END IF
  960. * end of OK rotation
  961. ELSE
  962. NOTROT = NOTROT + 1
  963. PSKIPPED = PSKIPPED + 1
  964. IJBLSK = IJBLSK + 1
  965. END IF
  966. ELSE
  967. NOTROT = NOTROT + 1
  968. PSKIPPED = PSKIPPED + 1
  969. IJBLSK = IJBLSK + 1
  970. END IF
  971. *
  972. IF( ( i.LE.SWBAND ) .AND. ( IJBLSK.GE.BLSKIP ) )
  973. $ THEN
  974. SVA( p ) = AAPP
  975. NOTROT = 0
  976. GO TO 2011
  977. END IF
  978. IF( ( i.LE.SWBAND ) .AND.
  979. $ ( PSKIPPED.GT.ROWSKIP ) ) THEN
  980. AAPP = -AAPP
  981. NOTROT = 0
  982. GO TO 2203
  983. END IF
  984. *
  985. 2200 CONTINUE
  986. * end of the q-loop
  987. 2203 CONTINUE
  988. *
  989. SVA( p ) = AAPP
  990. *
  991. ELSE
  992. IF( AAPP.EQ.ZERO )NOTROT = NOTROT +
  993. $ MIN( jgl+KBL-1, N ) - jgl + 1
  994. IF( AAPP.LT.ZERO )NOTROT = 0
  995. END IF
  996. 2100 CONTINUE
  997. * end of the p-loop
  998. 2010 CONTINUE
  999. * end of the jbc-loop
  1000. 2011 CONTINUE
  1001. *2011 bailed out of the jbc-loop
  1002. DO 2012 p = igl, MIN( igl+KBL-1, N )
  1003. SVA( p ) = ABS( SVA( p ) )
  1004. 2012 CONTINUE
  1005. *
  1006. 2000 CONTINUE
  1007. *2000 :: end of the ibr-loop
  1008. *
  1009. * .. update SVA(N)
  1010. IF( ( SVA( N ).LT.ROOTBIG ) .AND. ( SVA( N ).GT.ROOTSFMIN ) )
  1011. $ THEN
  1012. SVA( N ) = SNRM2( M, A( 1, N ), 1 )*D( N )
  1013. ELSE
  1014. T = ZERO
  1015. AAPP = ONE
  1016. CALL SLASSQ( M, A( 1, N ), 1, T, AAPP )
  1017. SVA( N ) = T*SQRT( AAPP )*D( N )
  1018. END IF
  1019. *
  1020. * Additional steering devices
  1021. *
  1022. IF( ( i.LT.SWBAND ) .AND. ( ( MXAAPQ.LE.ROOTTOL ) .OR.
  1023. $ ( ISWROT.LE.N ) ) )SWBAND = i
  1024. *
  1025. IF( ( i.GT.SWBAND+1 ) .AND. ( MXAAPQ.LT.FLOAT( N )*TOL ) .AND.
  1026. $ ( FLOAT( N )*MXAAPQ*MXSINJ.LT.TOL ) ) THEN
  1027. GO TO 1994
  1028. END IF
  1029. *
  1030. IF( NOTROT.GE.EMPTSW )GO TO 1994
  1031. 1993 CONTINUE
  1032. * end i=1:NSWEEP loop
  1033. * #:) Reaching this point means that the procedure has comleted the given
  1034. * number of iterations.
  1035. INFO = NSWEEP - 1
  1036. GO TO 1995
  1037. 1994 CONTINUE
  1038. * #:) Reaching this point means that during the i-th sweep all pivots were
  1039. * below the given tolerance, causing early exit.
  1040. *
  1041. INFO = 0
  1042. * #:) INFO = 0 confirms successful iterations.
  1043. 1995 CONTINUE
  1044. *
  1045. * Sort the vector D.
  1046. DO 5991 p = 1, N - 1
  1047. q = ISAMAX( N-p+1, SVA( p ), 1 ) + p - 1
  1048. IF( p.NE.q ) THEN
  1049. TEMP1 = SVA( p )
  1050. SVA( p ) = SVA( q )
  1051. SVA( q ) = TEMP1
  1052. TEMP1 = D( p )
  1053. D( p ) = D( q )
  1054. D( q ) = TEMP1
  1055. CALL SSWAP( M, A( 1, p ), 1, A( 1, q ), 1 )
  1056. IF( RSVEC )CALL SSWAP( MVL, V( 1, p ), 1, V( 1, q ), 1 )
  1057. END IF
  1058. 5991 CONTINUE
  1059. *
  1060. RETURN
  1061. * ..
  1062. * .. END OF SGSVJ0
  1063. * ..
  1064. END