1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666 IMPLICIT NONE
1667
1668 INTEGER :: INFO, LDA, LDW, M, N, RANK, MAXRANK
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680 INTEGER :: TOL_OPT
1681 REAL :: TOLEPS
1682 INTEGER :: JPVT(*)
1683 REAL :: RWORK(*)
1684 REAL :: A(LDA,*), TAU(*)
1685 REAL :: WORK(LDW,*)
1686 LOGICAL :: ISLR
1687 REAL :: TOLEPS_EFF, TRUNC_ERR
1688 INTEGER, PARAMETER :: INB=1, inbmin=2
1689 INTEGER :: J, JB, MINMN, NB
1690 INTEGER :: OFFSET, ITEMP
1691 INTEGER :: LSTICC, PVT, K, RK
1692 REAL :: TEMP, TEMP2, TOL3Z
1693 REAL :: AKK
1694 LOGICAL INADMISSIBLE
1695 REAL, PARAMETER :: RZERO=0.0e+0, rone=1.0e+0
1696 REAL :: ZERO
1697 REAL :: ONE
1698 parameter( one = 1.0e+0 )
1699 parameter( zero = 0.0e+0 )
1700 REAL :: slamch
1701 INTEGER :: ilaenv, isamax
1706 REAL, EXTERNAL :: snrm2
1707 info = 0
1708 islr = .false.
1709 IF( m.LT.0 ) THEN
1710 info = -1
1711 ELSE IF( n.LT.0 ) THEN
1712 info = -2
1713 ELSE IF( lda.LT.
max( 1, m ) )
THEN
1714 info = -4
1715 END IF
1716 IF( info.EQ.0 ) THEN
1717 IF( ldw.LT.n ) THEN
1718 info = -8
1719 END IF
1720 END IF
1721 IF( info.NE.0 ) THEN
1722 WRITE(*,999) -info
1723 RETURN
1724 END IF
1726 IF( minmn.EQ.0 ) THEN
1727 rank = 0
1728 RETURN
1729 END IF
1730 nb =
ilaenv( inb,
'CGEQRF', '
', M, N, -1, -1 )
1731 SELECT CASE(abs(TOL_OPT))
1732 CASE(1)
1733 TOLEPS_EFF = TOLEPS
1734 CASE(2)
1735
1736 CASE DEFAULT
1738 & TOL_OPT
1739 CALL MUMPS_ABORT()
1740 END SELECT
1741 TOLEPS_EFF = TOLEPS
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753 DO J = 1, N
1754
1755 RWORK( J ) = snrm2( M, A( 1, J ), 1 )
1756
1757 RWORK( N + J ) = RWORK( J )
1758 JPVT(J) = J
1759 END DO
1760.LT. IF (TOL_OPT0) THEN
1761
1762
1763 TRUNC_ERR = snrm2( N, RWORK( 1 ), 1 )
1764 ENDIF
1765 OFFSET = 0
1766 TOL3Z = SQRT(slamch('epsilon'))
1767 DO
1768 JB = MIN(NB,MINMN-OFFSET)
1769 LSTICC = 0
1770 K = 0
1771 DO
1772.EQ. IF(KJB) EXIT
1773 K = K+1
1774 RK = OFFSET+K
1775
1776 PVT = ( RK-1 ) + isamax( N-RK+1, RWORK( RK ), 1 )
1777.EQ. IF (RK1) THEN
1778
1779.EQ. IF (abs(TOL_OPT)2) TOLEPS_EFF = RWORK(PVT)*TOLEPS
1780 ENDIF
1781.GT. IF (TOL_OPT0) THEN
1782
1783 TRUNC_ERR = RWORK(PVT)
1784
1785
1786 ENDIF
1787.LT. IF(TRUNC_ERRTOLEPS_EFF) THEN
1788 RANK = RK-1
1789 ISLR = .TRUE.
1790 RETURN
1791 ENDIF
1792.GT. INADMISSIBLE = (RKMAXRANK)
1793 IF (INADMISSIBLE) THEN
1794 RANK = RK
1795 INFO = RK
1796 ISLR = .FALSE.
1797 RETURN
1798 END IF
1799.NE. IF( PVTRK ) THEN
1800 CALL sswap( M, A( 1, PVT ), 1, A( 1, RK ), 1 )
1801
1802
1803 CALL sswap( K-1, WORK( PVT-OFFSET, 2 ), LDW,
1804 & WORK( K, 2 ), LDW )
1805 ITEMP = JPVT(PVT)
1806 JPVT(PVT) = JPVT(RK)
1807 JPVT(RK) = ITEMP
1808
1809
1810 RWORK(PVT) = RWORK(RK)
1811 RWORK(N+PVT) = RWORK(N+RK)
1812 END IF
1813
1814
1815.GT. IF( K1 ) THEN
1816 CALL sgemv( 'no transpose', M-RK+1, K-1, -ONE,
1817
1818 & A(RK,OFFSET+1), LDA, WORK(K,2), LDW,
1819 & ONE, A(RK,RK), 1 )
1820 END IF
1821
1822.LT. IF( RKM ) THEN
1823 CALL slarfg( M-RK+1, A(RK,RK), A(RK+1,RK), 1, TAU(RK) )
1824 ELSE
1825 CALL slarfg( 1, A(RK,RK), A(RK,RK), 1, TAU(RK) )
1826 END IF
1827 AKK = A(RK,RK)
1828 A(RK,RK) = ONE
1829
1830
1831.LT. IF( RKN ) THEN
1832 CALL sgemv( 'transpose', M-RK+1, N-RK, TAU(RK),
1833 & A(RK,RK+1), LDA, A(RK,RK), 1, ZERO,
1834
1835 & WORK( K+1, K+1 ), 1 )
1836 END IF
1837
1838 DO J = 1, K
1839
1840 WORK( J, K+1 ) = ZERO
1841 END DO
1842
1843
1844
1845.GT. IF( K1 ) THEN
1846 CALL sgemv( 'transpose', M-RK+1, K-1, -TAU(RK),
1847 & A(RK,OFFSET+1), LDA, A(RK,RK), 1, ZERO,
1848 & WORK(1,1), 1 )
1849
1850 CALL sgemv( 'no transpose', N-OFFSET, K-1, ONE,
1851 & WORK(1,2), LDW, WORK(1,1), 1, ONE, WORK(1,K+1), 1 )
1852
1853 END IF
1854
1855
1856.LT. IF( RKN ) THEN
1857
1858 CALL sgemv( 'no transpose', N-RK, K, -ONE, WORK( K+1,2 ),
1859 & LDW,
1860 & A( RK, OFFSET+1 ), LDA, ONE, A( RK, RK+1 ), LDA )
1861 END IF
1862
1863
1864.LT. IF( RKMINMN ) THEN
1865 DO J = RK + 1, N
1866
1867.NE. IF( RWORK( J )RZERO ) THEN
1868
1869
1870
1871
1872
1873 TEMP = ABS( A( RK, J ) ) / RWORK( J )
1874 TEMP = MAX( RZERO, ( RONE+TEMP )*( RONE-TEMP ) )
1875
1876 TEMP2 = TEMP*( RWORK( J ) / RWORK( N+J ) )**2
1877.LE. IF( TEMP2 TOL3Z ) THEN
1878
1879 RWORK( N+J ) = REAL( LSTICC )
1880 LSTICC = J
1881 ELSE
1882
1883 RWORK( J ) = RWORK( J )*SQRT( TEMP )
1884 END IF
1885 END IF
1886 END DO
1887 END IF
1888 A( RK, RK ) = AKK
1889.NE. IF (LSTICC0) EXIT
1890.LT. IF (TOL_OPT0) THEN
1891
1892
1893 TRUNC_ERR = snrm2( N-RK, RWORK( RK+1 ), 1 )
1894 ENDIF
1895 END DO
1896
1897
1898
1899.LT. IF( RKMIN(N,M) ) THEN
1900 CALL sgemm( 'no transpose', 'transpose', M-RK,
1901 & N-RK, K, -ONE, A(RK+1,OFFSET+1), LDA,
1902
1903 & WORK(K+1,2), LDW, ONE, A(RK+1,RK+1), LDA )
1904 END IF
1905
1906.GT. DO WHILE( LSTICC0 )
1907
1908 ITEMP = NINT( RWORK( N + LSTICC ) )
1909
1910 RWORK( LSTICC ) = snrm2( M-RK, A( RK+1, LSTICC ), 1 )
1911
1912
1913
1914
1915
1916
1917 RWORK( N + LSTICC ) = RWORK( LSTICC )
1918 LSTICC = ITEMP
1919 END DO
1920.GE. IF(RKMINMN) EXIT
1921 OFFSET = RK
1922.LT. IF (TOL_OPT0) THEN
1923
1924
1925 TRUNC_ERR = snrm2( N-RK, RWORK( RK+1 ), 1 )
1926 ENDIF
1927 END DO
1928 RANK = RK
1929.NOT..GT. ISLR = (RKMAXRANK)
1930 RETURN
1932 & I2,' had an illegal value')
integer function ilaenv(ispec, name, opts, n1, n2, n3, n4)
ILAENV
subroutine xerbla(srname, info)
XERBLA
integer function isamax(n, sx, incx)
ISAMAX
subroutine sgeqrf(m, n, a, lda, tau, work, lwork, info)
SGEQRF
subroutine slarfg(n, alpha, x, incx, tau)
SLARFG generates an elementary reflector (Householder matrix).
subroutine sormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
SORMQR
subroutine sswap(n, sx, incx, sy, incy)
SSWAP
subroutine sgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
SGEMV
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
real function slamch(cmach)
SLAMCH
subroutine smumps_truncated_rrqr(m, n, a, lda, jpvt, tau, work, ldw, rwork, toleps, tol_opt, rank, maxrank, info, islr)