433subroutine dqrdc ( a, lda, n, p, qraux, jpvt, work, job )
500 integer ( kind = 4 ) lda
501 integer ( kind = 4 ) n
502 integer ( kind = 4 ) p
504 real ( kind = 8 ) a(lda,p)
505 integer ( kind = 4 ) jpvt(p)
506 real ( kind = 8 ) qraux(p)
507 real ( kind = 8 ) work(p)
508 integer ( kind = 4 ) j
509 integer ( kind = 4 ) job
510 integer ( kind = 4 ) jp
511 integer ( kind = 4 ) l
512 integer ( kind = 4 ) lup
513 integer ( kind = 4 ) maxj
514 real ( kind = 8 ) maxnrm
515 real ( kind = 8 ) nrmxl
516 integer ( kind = 4 ) pl
517 integer ( kind = 4 ) pu
518 real ( kind = 8 )
ddot
519 real ( kind = 8 )
dnrm2
535 if ( jpvt(j) < 0 )
then
544 call dswap ( n, a(1,pl), 1, a(1,j), 1 )
559 if ( jpvt(j) < 0 )
then
564 call dswap ( n, a(1,pu), 1, a(1,j), 1 )
581 qraux(j) =
dnrm2( n, a(1,j), 1 )
584 work(pl:pu) = qraux(pl:pu)
594 if ( pl <= l .and. l < pu )
then
599 if ( maxnrm < qraux(j) )
then
605 if ( maxj /= l )
then
606 call dswap ( n, a(1,l), 1, a(1,maxj), 1 )
607 qraux(maxj) = qraux(l)
622 nrmxl =
dnrm2( n-l+1, a(l,l), 1 )
624 if ( nrmxl /= 0.0d+00 )
then
626 if ( a(l,l) /= 0.0d+00 )
then
627 nrmxl = sign( nrmxl, a(l,l) )
630 call dscal ( n-l+1, 1.0d+00 / nrmxl, a(l,l), 1 )
631 a(l,l) = 1.0d+00 + a(l,l)
637 t = -
ddot( n-l+1, a(l,l), 1, a(l,j), 1 ) / a(l,l)
638 call daxpy ( n-l+1, t, a(l,l), 1, a(l,j), 1 )
640 if ( pl <= j .and. j <= pu )
then
642 if ( qraux(j) /= 0.0d+00 )
then
644 tt = 1.0d+00 - ( abs( a(l,j) ) / qraux(j) )**2
645 tt = max( tt, 0.0d+00 )
647 tt = 1.0d+00 + 0.05d+00 * tt * ( qraux(j) / work(j) )**2
649 if ( tt /= 1.0d+00 )
then
650 qraux(j) = qraux(j) * sqrt( t )
652 qraux(j) =
dnrm2( n-l, a(l+1,j), 1 )
937subroutine dqrsl ( a, lda, n, k, qraux, y, qy, qty, b, rsd, ab, job, info )
1065 integer ( kind = 4 ) k
1066 integer ( kind = 4 ) lda
1067 integer ( kind = 4 ) n
1069 real ( kind = 8 ) a(lda,*)
1070 real ( kind = 8 ) ab(n)
1071 real ( kind = 8 ) b(k)
1077 integer ( kind = 4 ) info
1078 integer ( kind = 4 ) j
1079 integer ( kind = 4 ) jj
1080 integer ( kind = 4 ) job
1081 integer ( kind = 4 ) ju
1082 integer ( kind = 4 ) kp1
1083 real ( kind = 8 ) qraux(*)
1084 real ( kind = 8 ) qty(n)
1085 real ( kind = 8 ) qy(n)
1086 real ( kind = 8 ) rsd(n)
1087 real ( kind = 8 )
ddot
1089 real ( kind = 8 ) temp
1090 real ( kind = 8 ) y(n)
1098 cqy = job / 10000 /= 0
1099 cqty = mod( job, 10000 ) /= 0
1100 cb = mod( job, 1000 ) / 100 /= 0
1101 cr = mod( job, 100 ) / 10 /= 0
1102 cab = mod( job, 10 ) /= 0
1124 if ( a(1,1) == 0.0d+00 )
then
1127 b(1) = y(1) / a(1,1)
1158 if ( qraux(j) /= 0.0d+00 )
then
1161 t = -
ddot( n-j+1, a(j,j), 1, qy(j), 1 ) / a(j,j)
1162 call daxpy ( n-j+1, t, a(j,j), 1, qy(j), 1 )
1175 if ( qraux(j) /= 0.0d+00 )
then
1178 t = -
ddot( n-j+1, a(j,j), 1, qty(j), 1 ) / a(j,j)
1179 call daxpy ( n-j+1, t, a(j,j), 1, qty(j), 1 )
1198 if ( cr .and. k < n )
then
1199 rsd(k+1:n) = qty(k+1:n)
1202 if ( cab .and. k+1 <= n )
then
1218 if ( a(j,j) == 0.0d+00 )
then
1227 call daxpy ( j-1, t, a(1,j), 1, b, 1 )
1234 if ( cr .or. cab )
then
1242 if ( qraux(j) /= 0.0d+00 )
then
1248 t = -
ddot( n-j+1, a(j,j), 1, rsd(j), 1 ) / a(j,j)
1249 call daxpy ( n-j+1, t, a(j,j), 1, rsd(j), 1 )
1253 t = -
ddot( n-j+1, a(j,j), 1, ab(j), 1 ) / a(j,j)
1254 call daxpy ( n-j+1, t, a(j,j), 1, ab(j), 1 )
1582subroutine dsvdc ( a, lda, m, n, s, e, u, ldu, v, ldv, work, job, info )
1675 integer ( kind = 4 ) lda
1676 integer ( kind = 4 ) ldu
1677 integer ( kind = 4 ) ldv
1678 integer ( kind = 4 ) m
1679 integer ( kind = 4 ) n
1681 real ( kind = 8 ) a(lda,n)
1684 real ( kind = 8 ) cs
1685 real ( kind = 8 ) e(*)
1686 real ( kind = 8 ) el
1687 real ( kind = 8 ) emm1
1690 integer ( kind = 4 ) info
1691 integer ( kind = 4 ) iter
1692 integer ( kind = 4 ) j
1693 integer ( kind = 4 ) job
1694 integer ( kind = 4 ) jobu
1695 integer ( kind = 4 ) k
1696 integer ( kind = 4 ) kase
1697 integer ( kind = 4 ) kk
1698 integer ( kind = 4 ) l
1699 integer ( kind = 4 ) ll
1700 integer ( kind = 4 ) lls
1701 integer ( kind = 4 ) ls
1702 integer ( kind = 4 ) lu
1703 integer ( kind = 4 ),
parameter :: maxit = 30
1704 integer ( kind = 4 ) mm
1705 integer ( kind = 4 ) mm1
1706 integer ( kind = 4 ) mn
1707 integer ( kind = 4 ) nct
1708 integer ( kind = 4 ) nctp1
1709 integer ( kind = 4 ) ncu
1710 integer ( kind = 4 ) nrt
1711 integer ( kind = 4 ) nrtp1
1712 real ( kind = 8 ) s(*)
1713 real ( kind = 8 ) scale
1714 real ( kind = 8 )
ddot
1715 real ( kind = 8 ) shift
1716 real ( kind = 8 ) sl
1717 real ( kind = 8 ) sm
1718 real ( kind = 8 ) smm1
1719 real ( kind = 8 ) sn
1720 real ( kind = 8 )
dnrm2
1722 real ( kind = 8 ) t1
1723 real ( kind = 8 ) test
1724 real ( kind = 8 ) u(ldu,m)
1725 real ( kind = 8 ) v(ldv,n)
1728 real ( kind = 8 ) work(m)
1729 real ( kind = 8 ) ztest
1735 jobu = mod( job, 100 ) / 10
1737 if ( 1 < jobu )
then
1743 if ( jobu /= 0 )
then
1747 if ( mod( job, 10 ) /= 0 )
then
1756 nrt = max( 0, min( m, n-2 ) )
1757 lu = max( nct, nrt )
1764 if ( l <= nct )
then
1766 s(l) =
dnrm2( m-l+1, a(l,l), 1 )
1768 if ( s(l) /= 0.0d+00 )
then
1769 if ( a(l,l) /= 0.0d+00 )
then
1770 s(l) = sign( s(l), a(l,l) )
1772 call dscal ( m-l+1, 1.0d+00 / s(l), a(l,l), 1 )
1773 a(l,l) = 1.0d+00 + a(l,l)
1784 if ( l <= nct .and. s(l) /= 0.0d+00 )
then
1785 t = -
ddot( m-l+1, a(l,l), 1, a(l,j), 1 ) / a(l,l)
1786 call daxpy ( m-l+1, t, a(l,l), 1, a(l,j), 1 )
1798 if ( wantu .and. l <= nct )
then
1805 if ( l <= nrt )
then
1807 e(l) =
dnrm2( n-l, e(l+1), 1 )
1809 if ( e(l) /= 0.0d+00 )
then
1810 if ( e(l+1) /= 0.0d+00 )
then
1811 e(l) = sign( e(l), e(l+1) )
1813 call dscal ( n-l, 1.0d+00 / e(l), e(l+1), 1 )
1814 e(l+1) = 1.0d+00 + e(l+1)
1821 if ( l + 1 <= m .and. e(l) /= 0.0d+00 )
then
1823 work(l+1:m) = 0.0d+00
1826 call daxpy ( m-l, e(j), a(l+1,j), 1, work(l+1), 1 )
1830 call daxpy ( m-l, -e(j)/e(l+1), work(l+1), 1, a(l+1,j), 1 )
1838 v(l+1:n,l) = e(l+1:n)
1847 mn = min( m + 1, n )
1852 s(nctp1) = a(nctp1,nctp1)
1859 if ( nrtp1 < mn )
then
1860 e(nrtp1) = a(nrtp1,mn)
1869 u(1:m,nctp1:ncu) = 0.0d+00
1879 if ( s(l) /= 0.0d+00 )
then
1882 t = -
ddot( m-l+1, u(l,l), 1, u(l,j), 1 ) / u(l,l)
1883 call daxpy ( m-l+1, t, u(l,l), 1, u(l,j), 1 )
1886 u(l:m,l) = -u(l:m,l)
1887 u(l,l) = 1.0d+00 + u(l,l)
1888 u(1:l-1,l) = 0.0d+00
1909 if ( l <= nrt .and. e(l) /= 0.0d+00 )
then
1912 t = -
ddot( n-l, v(l+1,l), 1, v(l+1,j), 1 ) / v(l+1,l)
1913 call daxpy ( n-l, t, v(l+1,l), 1, v(l+1,j), 1 )
1934 if ( maxit <= iter )
then
1958 test = abs( s(l) ) + abs( s(l+1) )
1959 ztest = test + abs( e(l) )
1961 if ( ztest == test )
then
1968 if ( l == mn - 1 )
then
1974 do lls = l + 1, mn + 1
1976 ls = mn - lls + l + 1
1983 if ( ls /= mn )
then
1984 test = test + abs( e(ls) )
1987 if ( ls /= l + 1 )
then
1988 test = test + abs( e(ls-1) )
1991 ztest = test + abs( s(ls) )
1993 if ( ztest == test )
then
2002 else if ( ls == mn )
then
2015 if ( kase == 1 )
then
2025 call drotg ( t1, f, cs, sn )
2030 e(k-1) = cs * e(k-1)
2034 call drot ( n, v(1,k), 1, v(1,mn), 1, cs, sn )
2041 else if ( kase == 2 )
then
2049 call drotg ( t1, f, cs, sn )
2054 call drot ( m, u(1,k), 1, u(1,l-1), 1, cs, sn )
2061 else if ( kase == 3 )
then
2065 scale = max( abs( s(mn) ), abs( s(mn-1) ), abs( e(mn-1) ), &
2066 abs( s(l) ), abs( e(l) ) )
2069 smm1 = s(mn-1) / scale
2070 emm1 = e(mn-1) / scale
2073 b = ( ( smm1 + sm ) * ( smm1 - sm ) + emm1 * emm1 ) / 2.0d+00
2074 c = sm * sm * emm1 * emm1
2077 if ( b /= 0.0d+00 .or. c /= 0.0d+00 )
then
2078 shift = sqrt( b * b + c )
2079 if ( b < 0.0d+00 )
then
2082 shift = c / ( b + shift )
2085 f = ( sl + sm ) * ( sl - sm ) + shift
2094 call drotg ( f, g, cs, sn )
2100 f = cs * s(k) + sn * e(k)
2101 e(k) = cs * e(k) - sn * s(k)
2103 s(k+1) = cs * s(k+1)
2106 call drot ( n, v(1,k), 1, v(1,k+1), 1, cs, sn )
2109 call drotg ( f, g, cs, sn )
2111 f = cs * e(k) + sn * s(k+1)
2112 s(k+1) = -sn * e(k) + cs * s(k+1)
2114 e(k+1) = cs * e(k+1)
2116 if ( wantu .and. k < m )
then
2117 call drot ( m, u(1,k), 1, u(1,k+1), 1, cs, sn )
2127 else if ( kase == 4 )
then
2131 if ( s(l) < 0.0d+00 )
then
2134 v(1:n,l) = -v(1:n,l)
2146 if ( s(l+1) <= s(l) )
then
2154 if ( wantv .and. l < n )
then
2155 call dswap ( n, v(1,l), 1, v(1,l+1), 1 )
2158 if ( wantu .and. l < m )
then
2159 call dswap ( m, u(1,l), 1, u(1,l+1), 1 )
2509 integer ( kind = 4 ) m
2510 integer ( kind = 4 ) n
2512 real ( kind = 8 ) a(m,n)
2513 real ( kind = 8 ) a_copy(m,n)
2514 real ( kind = 8 ) b(m)
2515 real ( kind = 8 ) e(max(m+1,n))
2516 integer ( kind = 4 ) i
2517 integer ( kind = 4 ) info
2518 integer ( kind = 4 ) lda
2519 integer ( kind = 4 ) ldu
2520 integer ( kind = 4 ) ldv
2521 integer ( kind = 4 ) job
2522 real ( kind = 8 ) sdiag(max(m+1,n))
2523 real ( kind = 8 ) smax
2524 real ( kind = 8 ) stol
2525 real ( kind = 8 ) sub(n)
2526 real ( kind = 8 ) u(m,m)
2527 real ( kind = 8 ) ub(m)
2528 real ( kind = 8 ) v(n,n)
2529 real ( kind = 8 ) work(m)
2530 real ( kind = 8 ) x(n)
2534 a_copy(1:m,1:n) = a(1:m,1:n)
2540 call dsvdc ( a_copy, lda, m, n, sdiag, e, u, ldu, v, ldv, work, job, info )
2542 if ( info /= 0 )
then
2543 write ( *,
'(a)' )
' '
2544 write ( *,
'(a)' )
'SVD_SOLVE - Failure!'
2545 write ( *,
'(a)' )
' The SVD could not be calculated.'
2546 write ( *,
'(a)' )
' LINPACK routine DSVDC returned a nonzero'
2547 write ( *,
'(a,i8)' )
' value of the error flag, INFO = ', info
2551 ub(1:m) = matmul( transpose( u(1:m,1:m) ), b(1:m) )
2559 smax = maxval( sdiag(1:n) )
2560 if ( smax <= epsilon( smax ) )
then
2564 stol = epsilon( smax ) * smax
2568 if ( stol <= sdiag(i) )
then
2569 sub(i) = ub(i) / sdiag(i)
2574 x(1:n) = matmul( v(1:n,1:n), sub(1:n) )