1 SUBROUTINE lmpar (n, r, ldr, ipvt, diag, qtb, delta, par, x,
8 INTEGER,
INTENT(in) :: n, ldr, ipvt(n)
9 REAL(rprec),
INTENT(in) :: delta
10 REAL(rprec),
INTENT(inout) :: par
11 REAL(rprec),
DIMENSION(ldr,n),
INTENT(inout) :: r
12 REAL(rprec),
DIMENSION(n) :: wa1, wa2
13 REAL(rprec),
DIMENSION(n),
INTENT(in) :: diag, qtb
14 REAL(rprec),
DIMENSION(n),
INTENT(out) :: x, sdiag
18 REAL(rprec),
PARAMETER :: p1=0.1_dp, zero = 0,
23 INTEGER :: iter, j, jm1, jp1, k, l, nsing
24 REAL(rprec) :: dxnorm, dwarf, fp, gnorm, parc, parl, paru,
25 1 sum0, enorm, dpmpar, temp, epsmch
29 EXTERNAL dpmpar, enorm
129 epsmch = sqrt(dpmpar(1))
138 IF (abs(r(j,j)).le.epsmch .and. nsing.eq.n) nsing = j - 1
139 IF (nsing .lt. n) wa1(j) = zero
141 IF (nsing .ge. 1)
THEN
144 wa1(j) = wa1(j)/r(j,j)
148 wa1(:jm1) = wa1(:jm1) - r(:jm1,j)*temp
162 dxnorm = enorm(n,wa2)
165 IF (fp .le. p1*delta)
THEN
178 IF (nsing .ge. n)
THEN
179 wa1 = diag(ipvt)*(wa2(ipvt)/dxnorm)
183 IF (jm1 .ge. 1) sum0 = sum(r(:jm1,j)*wa1(:jm1))
184 wa1(j) = (wa1(j)-sum0)/r(j,j)
187 parl = ((fp/delta)/temp)/temp
193 sum0 = sum(r(:j,j)*qtb(:j))
195 wa1(j) = sum0/diag(l)
199 IF (paru .eq. zero) paru = dwarf/min(delta,p1)
206 IF (par .eq. zero) par = gnorm/dxnorm
215 IF (par .le. zero) par = max(dwarf,p001*paru)
219 CALL qrsolv (n, r, ldr, ipvt, wa1, qtb, x, sdiag, wa2)
221 dxnorm = enorm(n,wa2)
229 IF (abs(fp).le.p1*delta .or. parl.eq.zero .and.
230 1 fp.le.temp .and. temp.lt.zero .or. iter.eq.10)
EXIT
234 wa1 = diag(ipvt)*(wa2(ipvt)/dxnorm)
236 wa1(j) = wa1(j)/sdiag(j)
239 IF (n .ge. jp1) wa1(jp1:n) = wa1(jp1:n) - r(jp1:n,j)*temp
242 parc = ((fp/delta)/temp)/temp
246 IF (fp .gt. zero) parl = max(parl,par)
247 IF (fp .lt. zero) paru = min(paru,par)
251 par = max(parl,par + parc)