1 SUBROUTINE svdsolveuv(m, n, mp, np, wcut, file, a, b, x)
10 REAL(rprec),
DIMENSION(mp,np) :: a
11 REAL(rprec),
DIMENSION(n) :: x
12 REAL(rprec),
DIMENSION(m) :: b
16 REAL(rprec) :: zero = 0
20 INTEGER :: n1, nonzero, nlast, istat, i, j, iunit
21 REAL(rprec),
ALLOCATABLE :: u(:,:), w(:), v(:,:)
22 REAL(rprec) :: wmax, wcuta, udotb
54 ALLOCATE (u(mp,np), w(np), v(np,np), stat=istat)
55 IF (istat .eq. 0)
THEN
65 CALL safe_open(iunit, istat, file,
'old',
'formatted')
66 IF (istat .ne. 0)
GOTO 98
67 READ (iunit, *, err=98)
68 READ (iunit, *, err=98)
69 READ (iunit, *, err=98) m, n, nonzero
71 READ (iunit, *, err=98) w(i)
73 READ (iunit, *, err=98) v(j,i)
76 READ (iunit, *, err=98) u(j,i)
93 CALL svdcmp (u, m, n, mp, np, w, v)
97 CALL sortsvd (m, n, mp, np, w, u, v)
100 DO nonzero = n, 1, -1
102 IF (w(nonzero) .ne. 0)
EXIT
104 IF (nonzero .le. 0)
GOTO 999
109 IF (wcuta .gt. 1)
THEN
115 IF (w(i) .gt. wmax*wcuta)
THEN
126 IF (nlast.le.0 .or. nlast.gt.nonzero) nlast = nonzero
131 udotb = sum(u(:m,i)*b(:m))
137 x(:n) = x(:n) + udotb*v(:n,i)
143 IF (wcut .eq. 0)
THEN
144 CALL safe_open(iunit, istat, file,
'unknown',
'formatted')
145 WRITE (iunit, *)
'Max w = ', w(1),
', Min w = ', w(nonzero)
146 WRITE (iunit, *)
'Ratio = ', w(1)/w(nonzero)
147 WRITE (iunit, *) m, n, nonzero
149 WRITE (iunit, *) w(i)
151 WRITE (iunit, *) v(j,i)
154 WRITE (iunit, *) u(j,i)
163 DEALLOCATE (u, w, v, stat=istat)
165 END SUBROUTINE svdsolveuv