1 subroutine qrsolv(n,r,ldr,ipvt,diag,qtb,x,sdiag,wa)
4 double precision r(ldr,n),diag(n),qtb(n),x(n),sdiag(n),wa(n)
82 integer i,j,jp1,k,kp1,l,nsing
83 double precision cos,cotan,p5,p25,qtbpj,sin,sum,tan,temp,zero
84 data p5,p25,zero /5.0d-1,2.5d-1,0.0d0/
107 if (diag(l) .ne. zero)
then
123 if (sdiag(k) .ne. zero)
then
124 if (dabs(r(k,k)) .ge. dabs(sdiag(k)))
then
125 tan = sdiag(k)/r(k,k)
126 cos = p5/dsqrt(p25+p25*tan**2)
129 cotan = r(k,k)/sdiag(k)
130 sin = p5/dsqrt(p25+p25*cotan**2)
137 r(k,k) = cos*r(k,k) + sin*sdiag(k)
138 temp = cos*wa(k) + sin*qtbpj
139 qtbpj = -sin*wa(k) + cos*qtbpj
147 temp = cos*r(i,k) + sin*sdiag(i)
148 sdiag(i) = -sin*r(i,k) + cos*sdiag(i)
168 if (sdiag(j) .eq. zero .and. nsing .eq. n) nsing = j - 1
169 if (nsing .lt. n) wa(j) = zero
172 if (nsing .ge. 1)
then
177 if (jp1 .le. nsing)
then
178 do 120 i = jp1, nsing
179 sum = sum + r(i,j)*wa(i)
182 wa(j) = (wa(j) - sum)/sdiag(j)
subroutine qrsolv(n, r, ldr, ipvt, diag, qtb, x, sdiag, wa)