1 SUBROUTINE qrsolv(n, r, ldr, ipvt, diag, qtb, x, sdiag, wa)
8 INTEGER,
DIMENSION(n),
INTENT(in) :: ipvt
9 REAL(rprec),
DIMENSION(ldr,n),
INTENT(inout) :: r
10 REAL(rprec),
DIMENSION(n) :: diag, qtb, x, sdiag, wa
14 REAL(rprec),
PARAMETER :: one = 1, zero = 0
18 INTEGER :: j, jp1, k, kp1, l, nsing, l1
19 REAL(rprec) :: COS, cotan, qtbpj, SIN, SUM0, TAN, temp
20 REAL(rprec) ,
ALLOCATABLE :: temp1u(:)
116 IF (diag(l) .ne. zero)
THEN
130 IF (sdiag(k) .ne. zero)
THEN
131 IF (abs(r(k,k)) .lt. abs(sdiag(k)))
THEN
132 cotan = r(k,k)/sdiag(k)
133 sin = one/sqrt(one + cotan*cotan)
136 tan = sdiag(k)/r(k,k)
137 cos = one/sqrt(one + tan*tan)
144 r(k,k) = cos*r(k,k) + sin*sdiag(k)
145 temp = cos*wa(k) + sin*qtbpj
146 qtbpj = (-sin*wa(k)) + cos*qtbpj
154 ALLOCATE (temp1u(l1))
155 temp1u(:l1) = cos*r(kp1:n,k) + sin*sdiag(kp1:n)
156 sdiag(kp1:n) = (-sin*r(kp1:n,k)) + cos*sdiag(kp1:n)
157 r(kp1:n,k) = temp1u(:l1)
176 IF (sdiag(j).eq.zero .and. nsing.eq.n) nsing = j - 1
177 IF (nsing .lt. n) wa(j) = zero
179 IF (nsing .ge. 1)
THEN
183 IF (nsing .lt. jp1)
THEN
186 sum0 = sum(r(jp1:nsing,j)*wa(jp1:nsing))
188 wa(j) = (wa(j)-sum0)/sdiag(j)
199 END SUBROUTINE qrsolv