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

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