1 SUBROUTINE svdsolveb(m, n, mp, np, wcut, file, a, b, x,
11 REAL(rprec),
DIMENSION(mp,np) :: a
12 REAL(rprec),
DIMENSION(n) :: x
13 REAL(rprec),
DIMENSION(m) :: b
14 INTEGER,
OPTIONAL :: nlast_opt
19 REAL(rprec) :: zero = 0
23 INTEGER :: n1, nonzero, nlast, istat, i, j, iunit
24 REAL(rprec),
ALLOCATABLE :: u(:,:), v(:,:), w(:)
25 REAL(rprec) :: wmax, wcuta, udotb
57 ALLOCATE (u(mp,np), w(np), v(np,np), stat=istat)
59 IF (istat .eq. 0)
THEN
70 CALL safe_open(iunit, istat, file,
'old',
'formatted')
71 IF (istat .ne. 0)
GOTO 98
72 READ (iunit, *, err=98)
73 READ (iunit, *, err=98)
74 READ (iunit, *, err=98) m, n, nonzero
77 READ (iunit, *, err=98) w(i)
80 READ (iunit, *, err=98) v(j,i)
86 IF (wcuta .gt. 1) nlast = wcuta
87 IF (wcuta .lt. 1)
THEN
91 IF (w(i) .gt. wmax*wcuta)
THEN
101 IF (nlast.le.0 .or. nlast.gt.nonzero) nlast = nonzero
103 x(:n) = x(:n) + v(:n,i)
117 CALL svdcmp (u, m, n, mp, np, w, v)
121 CALL sortsvd (m, n, mp, np, w, u, v)
124 DO nonzero = n, 1, -1
126 IF (w(nonzero) .ne. 0)
EXIT
128 IF (nonzero .gt. 0)
THEN
129 IF (wcuta .gt. 1)
THEN
137 IF (w(i) .gt. wmax*wcuta)
THEN
148 IF (nlast.le.0 .or. nlast.gt.nonzero) nlast = nonzero
153 udotb = sum(u(:m,i)*b(:m))
159 v(:n,i) = udotb*v(:n,i)
161 x(:n) = x(:n) + v(:n,i)
166 IF (wcut .eq. 0)
THEN
167 CALL safe_open(iunit, istat, file,
'unknown',
'formatted')
168 WRITE (iunit, *)
'Max w = ', w(1),
', Min w = ',
170 WRITE (iunit, *)
'Ratio = ', w(1)/w(nonzero)
171 WRITE (iunit, *) m, n, nonzero
173 WRITE (iunit, *) w(i)
176 WRITE (iunit, *) v(j,i)
186 IF (
PRESENT(nlast_opt)) nlast_opt = nlast
188 DEALLOCATE (u, w, v, stat=istat)
190 END SUBROUTINE svdsolveb