2 subroutine dogleg ( n, r, lr, diag, qtb, delta, x )
66 integer,
parameter :: rk =
r_kind
71 real ( kind = rk ) alpha
72 real ( kind = rk ) bnorm
73 real ( kind = rk ) delta
74 real ( kind = rk ) diag(n)
75 real ( kind = rk )
enorm
76 real ( kind = rk ) epsmch
77 real ( kind = rk ) gnorm
83 real ( kind = rk ) qnorm
84 real ( kind = rk ) qtb(n)
85 real ( kind = rk ) r(lr)
86 real ( kind = rk ) sgnorm
87 real ( kind = rk ) sum2
88 real ( kind = rk ) temp
89 real ( kind = rk ) wa1(n)
90 real ( kind = rk ) wa2(n)
91 real ( kind = rk ) x(n)
93 epsmch = epsilon( epsmch )
97 jj = ( n * ( n + 1 ) ) / 2 + 1
107 sum2 = sum2 + r(l) * x(i)
113 if ( temp == 0.0d+00 )
then
117 temp = max( temp, abs( r(l)) )
121 if ( temp == 0.0d+00 )
then
129 x(j) = ( qtb(j) - sum2 ) / temp
136 wa2(1:n) = diag(1:n) * x(1:n)
137 qnorm =
enorm( n, wa2 )
139 if ( qnorm <= delta )
then
150 wa1(i) = wa1(i) + r(l) * temp
153 wa1(j) = wa1(j) / diag(j)
159 gnorm =
enorm( n, wa1 )
161 alpha = delta / qnorm
163 if ( gnorm /= 0.0d+00 )
then
167 wa1(1:n) = ( wa1(1:n) / gnorm ) / diag(1:n)
173 sum2 = sum2 + r(l) * wa1(i)
179 temp =
enorm( n, wa2 )
180 sgnorm = ( gnorm / temp ) / temp
189 if ( sgnorm < delta )
then
191 bnorm =
enorm( n, qtb )
192 temp = ( bnorm / gnorm ) * ( bnorm / qnorm ) * ( sgnorm / delta )
193 temp = temp - ( delta / qnorm ) * ( sgnorm / delta) ** 2 &
194 + sqrt( ( temp - ( delta / qnorm ) ) ** 2 &
195 + ( 1.0d+00 - ( delta / qnorm ) ** 2 ) &
196 * ( 1.0d+00 - ( sgnorm / delta ) ** 2 ) )
198 alpha = ( ( delta / qnorm ) * ( 1.0d+00 - ( sgnorm / delta ) ** 2 ) ) &
208 temp = ( 1.0d+00 - alpha ) * min( sgnorm, delta )
210 x(1:n) = temp * wa1(1:n) + alpha * x(1:n)
266 integer,
parameter :: rk =
r_kind
270 real ( kind = rk ) agiant
271 real ( kind = rk )
enorm
273 real ( kind = rk ) rdwarf
274 real ( kind = rk ) rgiant
275 real ( kind = rk ) s1
276 real ( kind = rk ) s2
277 real ( kind = rk ) s3
278 real ( kind = rk ) x(n)
279 real ( kind = rk ) xabs
280 real ( kind = rk ) x1max
281 real ( kind = rk ) x3max
283 rdwarf = sqrt( tiny( rdwarf ) )
284 rgiant = sqrt( huge( rgiant ) )
291 agiant = rgiant / real( n, kind = rk )
297 if ( xabs <= rdwarf )
then
299 if ( x3max < xabs )
then
300 s3 = 1.0d+00 + s3 * ( x3max / xabs ) ** 2
302 else if ( xabs /= 0.0d+00 )
then
303 s3 = s3 + ( xabs / x3max ) ** 2
306 else if ( agiant <= xabs )
then
308 if ( x1max < xabs )
then
309 s1 = 1.0d+00 + s1 * ( x1max / xabs ) ** 2
312 s1 = s1 + ( xabs / x1max ) ** 2
325 if ( s1 /= 0.0d+00 )
then
327 enorm = x1max * sqrt( s1 + ( s2 / x1max ) / x1max )
329 else if ( s2 /= 0.0d+00 )
then
331 if ( x3max <= s2 )
then
332 enorm = sqrt( s2 * ( 1.0d+00 + ( x3max / s2 ) * ( x3max * s3 ) ) )
334 enorm = sqrt( x3max * ( ( s2 / x3max ) + ( x3max * s3 ) ) )
339 enorm = x3max * sqrt( s3 )
345 subroutine fdjac1 ( fcn, n, x, fvec, fjac, ldfjac, ml, mu, epsfcn )
413 integer,
parameter :: rk =
r_kind
418 real ( kind = rk ) eps
419 real ( kind = rk ) epsfcn
420 real ( kind = rk ) epsmch
422 real ( kind = rk ) fjac(ldfjac,n)
423 real ( kind = rk ) fvec(n)
431 real ( kind = rk ) temp
432 real ( kind = rk ) wa1(n)
433 real ( kind = rk ) wa2(n)
434 real ( kind = rk ) x(n)
436 epsmch = epsilon( epsmch )
438 eps = sqrt( max( epsfcn, epsmch ) )
443 if ( n <= msum )
then
448 h = eps * abs( temp )
449 if ( h == 0.0d+00 )
then
454 call fcn ( n, x, wa1 )
457 fjac(1:n,j) = ( wa1(1:n) - fvec(1:n) ) / h
469 h = eps * abs( wa2(j) )
470 if ( h == 0.0d+00 )
then
476 call fcn ( n, x, wa1 )
482 h = eps * abs( wa2(j) )
483 if ( h == 0.0d+00 )
then
487 fjac(1:n,j) = 0.0d+00
490 if ( j - mu <= i .and. i <= j + ml )
then
491 fjac(i,j) = ( wa1(i) - fvec(i) ) / h
503 subroutine fsolve ( fcn, n, x, fvec, tol, info )
572 integer,
parameter :: rk =
r_kind
576 real ( kind = rk ) diag(n)
577 real ( kind = rk ) epsfcn
578 real ( kind = rk ) factor
580 real ( kind = rk ) fjac(n,n)
581 real ( kind = rk ) fvec(n)
590 real ( kind = rk ) qtf(n)
591 real ( kind = rk ) r((n*(n+1))/2)
592 real ( kind = rk ) tol
593 real ( kind = rk ) x(n)
594 real ( kind = rk ) xtol
601 if ( tol < 0.0d+00 )
then
607 maxfev = 200 * ( n + 1 )
616 fjac(1:n,1:n) = 0.0d+00
618 r(1:(n*(n+1))/2) = 0.0d+00
619 lr = ( n * ( n + 1 ) ) / 2
622 call hybrd ( fcn, n, x, fvec, xtol, maxfev, ml, mu, epsfcn, diag, mode, &
623 factor, info, nfev, fjac, ldfjac, r, lr, qtf )
625 if ( info == 5 )
then
631 subroutine hybrd ( fcn, n, x, fvec, xtol, maxfev, ml, mu, epsfcn, diag, mode, &
632 factor, info, nfev, fjac, ldfjac, r, lr, qtf )
744 integer,
parameter :: rk =
r_kind
750 real ( kind = rk ) actred
751 real ( kind = rk ) delta
752 real ( kind = rk ) diag(n)
753 real ( kind = rk )
enorm
754 real ( kind = rk ) epsfcn
755 real ( kind = rk ) epsmch
756 real ( kind = rk ) factor
758 real ( kind = rk ) fjac(ldfjac,n)
759 real ( kind = rk ) fnorm
760 real ( kind = rk ) fnorm1
761 real ( kind = rk ) fvec(n)
780 real ( kind = rk ) pnorm
781 real ( kind = rk ) prered
782 real ( kind = rk ) qtf(n)
783 real ( kind = rk ) r(lr)
784 real ( kind = rk ) ratio
786 real ( kind = rk ) sum2
787 real ( kind = rk ) temp
788 real ( kind = rk ) wa1(n)
789 real ( kind = rk ) wa2(n)
790 real ( kind = rk ) wa3(n)
791 real ( kind = rk ) wa4(n)
792 real ( kind = rk ) x(n)
793 real ( kind = rk ) xnorm
794 real ( kind = rk ) xtol
796 epsmch = epsilon( epsmch )
805 else if ( xtol < 0.0d+00 )
then
807 else if ( maxfev <= 0 )
then
809 else if ( ml < 0 )
then
811 else if ( mu < 0 )
then
813 else if ( factor <= 0.0d+00 )
then
815 else if ( ldfjac < n )
then
817 else if ( lr < ( n * ( n + 1 ) ) / 2 )
then
821 if ( mode == 2 )
then
824 if ( diag(j) <= 0.0d+00 )
then
834 call fcn ( n, x, fvec )
837 fnorm =
enorm( n, fvec )
841 msum = min( ml + mu + 1, n )
859 call fdjac1 ( fcn, n, x, fvec, fjac, ldfjac, ml, mu, epsfcn )
866 call qrfac ( n, n, fjac, ldfjac, pivot, iwa, 1, wa1, wa2 )
871 if ( iter == 1 )
then
873 if ( mode /= 2 )
then
877 if ( wa2(j) == 0.0d+00 )
then
887 wa3(1:n) = diag(1:n) * x(1:n)
888 xnorm =
enorm( n, wa3 )
889 delta = factor * xnorm
890 if ( delta == 0.0d+00 )
then
902 if ( fjac(j,j) /= 0.0d+00 )
then
903 temp = - dot_product( qtf(j:n), fjac(j:n,j) ) / fjac(j,j)
904 qtf(j:n) = qtf(j:n) + fjac(j:n,j) * temp
920 if ( wa1(j) == 0.0d+00 )
then
927 call qform ( n, n, fjac, ldfjac )
931 if ( mode /= 2 )
then
933 diag(j) = max( diag(j), wa2(j) )
943 call dogleg ( n, r, lr, diag, qtf, delta, wa1 )
948 wa1(1:n) = - wa1(1:n)
949 wa2(1:n) = x(1:n) + wa1(1:n)
950 wa3(1:n) = diag(1:n) * wa1(1:n)
952 pnorm =
enorm( n, wa3 )
956 if ( iter == 1 )
then
957 delta = min( delta, pnorm )
962 call fcn ( n, wa2, wa4 )
964 fnorm1 =
enorm( n, wa4 )
969 if ( fnorm1 < fnorm )
then
970 actred = 1.0d+00 - ( fnorm1 / fnorm ) ** 2
979 sum2 = sum2 + r(l) * wa1(j)
982 wa3(i) = qtf(i) + sum2
985 temp =
enorm( n, wa3 )
987 if ( temp < fnorm )
then
988 prered = 1.0d+00 - ( temp / fnorm ) ** 2
994 if ( 0.0d+00 < prered )
then
995 ratio = actred / prered
1000 if ( ratio < 0.1d+00 )
then
1004 delta = 0.5d+00 * delta
1011 if ( 0.5d+00 <= ratio .or. 1 < ncsuc )
then
1012 delta = max( delta, pnorm / 0.5d+00 )
1015 if ( abs( ratio - 1.0d+00 ) <= 0.1d+00 )
then
1016 delta = pnorm / 0.5d+00
1026 if ( 0.0001d+00 <= ratio )
then
1028 wa2(1:n) = diag(1:n) * x(1:n)
1029 fvec(1:n) = wa4(1:n)
1030 xnorm =
enorm( n, wa2 )
1038 if ( 0.001d+00 <= actred )
then
1046 if ( 0.1d+00 <= actred )
then
1052 if ( delta <= xtol * xnorm .or. fnorm == 0.0d+00 )
then
1056 if ( info /= 0 )
then
1062 if ( maxfev <= nfev )
then
1066 if ( 0.1d+00 * max( 0.1d+00 * delta, pnorm ) <= epsmch * xnorm )
then
1070 if ( nslow2 == 5 )
then
1074 if ( nslow1 == 10 )
then
1078 if ( info /= 0 )
then
1085 if ( ncfail == 2 )
then
1093 sum2 = dot_product( wa4(1:n), fjac(1:n,j) )
1094 wa2(j) = ( sum2 - wa3(j) ) / pnorm
1095 wa1(j) = diag(j) * ( ( diag(j) * wa1(j) ) / pnorm )
1096 if ( 0.0001d+00 <= ratio )
then
1103 call r1updt ( n, n, r, lr, wa1, wa2, wa3, sing )
1104 call r1mpyq ( n, n, fjac, ldfjac, wa2, wa3 )
1105 call r1mpyq ( 1, n, qtf, 1, wa2, wa3 )
1171 integer,
parameter :: rk =
r_kind
1181 real ( kind = rk ) q(ldq,m)
1182 real ( kind = rk ) temp
1183 real ( kind = rk ) wa(m)
1188 q(1:j-1,j) = 0.0d+00
1193 q(1:m,n+1:m) = 0.0d+00
1210 if ( wa(k) /= 0.0d+00 )
then
1213 temp = dot_product( wa(k:m), q(k:m,j) ) / wa(k)
1214 q(k:m,j) = q(k:m,j) - temp * wa(k:m)
1223 subroutine qrfac ( m, n, a, lda, pivot, ipvt, lipvt, rdiag, acnorm )
1301 integer,
parameter :: rk =
r_kind
1308 real ( kind = rk ) a(lda,n)
1309 real ( kind = rk ) acnorm(n)
1310 real ( kind = rk ) ajnorm
1311 real ( kind = rk )
enorm
1312 real ( kind = rk ) epsmch
1320 real ( kind = rk ) r8_temp(m)
1321 real ( kind = rk ) rdiag(n)
1322 real ( kind = rk ) temp
1323 real ( kind = rk ) wa(n)
1325 epsmch = epsilon( epsmch )
1330 acnorm(j) =
enorm( m, a(1:m,j) )
1333 rdiag(1:n) = acnorm(1:n)
1334 wa(1:n) = acnorm(1:n)
1355 if ( rdiag(kmax) < rdiag(k) )
then
1360 if ( kmax /= j )
then
1362 r8_temp(1:m) = a(1:m,j)
1363 a(1:m,j) = a(1:m,kmax)
1364 a(1:m,kmax) = r8_temp(1:m)
1366 rdiag(kmax) = rdiag(j)
1370 ipvt(j) = ipvt(kmax)
1371 ipvt(kmax) = i4_temp
1380 ajnorm =
enorm( m-j+1, a(j,j) )
1382 if ( ajnorm /= 0.0d+00 )
then
1384 if ( a(j,j) < 0.0d+00 )
then
1388 a(j:m,j) = a(j:m,j) / ajnorm
1389 a(j,j) = a(j,j) + 1.0d+00
1395 temp = dot_product( a(j:m,j), a(j:m,k) ) / a(j,j)
1397 a(j:m,k) = a(j:m,k) - temp * a(j:m,j)
1399 if ( pivot .and. rdiag(k) /= 0.0d+00 )
then
1401 temp = a(j,k) / rdiag(k)
1402 rdiag(k) = rdiag(k) * sqrt( max( 0.0d+00, 1.0d+00 - temp ** 2 ) )
1404 if ( 0.05d+00 * ( rdiag(k) / wa(k) ) ** 2 <= epsmch )
then
1405 rdiag(k) =
enorm( m-j, a(j+1,k) )
1477 integer,
parameter :: rk =
r_kind
1483 real ( kind = rk ) a(lda,n)
1484 real ( kind = rk ) c
1487 real ( kind = rk ) s
1488 real ( kind = rk ) temp
1489 real ( kind = rk ) v(n)
1490 real ( kind = rk ) w(n)
1496 if ( 1.0d+00 < abs( v(j) ) )
then
1498 s = sqrt( 1.0d+00 - c ** 2 )
1501 c = sqrt( 1.0d+00 - s ** 2 )
1505 temp = c * a(i,j) - s * a(i,n)
1506 a(i,n) = s * a(i,j) + c * a(i,n)
1516 if ( 1.0d+00 < abs( w(j) ) )
then
1518 s = sqrt( 1.0d+00 - c ** 2 )
1521 c = sqrt( 1.0d+00 - s ** 2 )
1525 temp = c * a(i,j) + s * a(i,n)
1526 a(i,n) = - s * a(i,j) + c * a(i,n)
1534 subroutine r1updt ( m, n, s, ls, u, v, w, sing )
1607 integer,
parameter :: rk =
r_kind
1613 real ( kind = rk ) cos
1614 real ( kind = rk ) cotan
1615 real ( kind = rk ) giant
1620 real ( kind = rk ) s(ls)
1621 real ( kind = rk ) sin
1623 real ( kind = rk ) tan
1624 real ( kind = rk ) tau
1625 real ( kind = rk ) temp
1626 real ( kind = rk ) u(m)
1627 real ( kind = rk ) v(n)
1628 real ( kind = rk ) w(m)
1632 giant = huge( giant )
1636 jj = ( n * ( 2 * m - n + 1 ) ) / 2 - ( m - n )
1651 jj = jj - ( m - j + 1 )
1654 if ( v(j) /= 0.0d+00 )
then
1658 if ( abs( v(n) ) < abs( v(j) ) )
then
1660 sin = 0.5d+00 / sqrt( 0.25d+00 + 0.25d+00 * cotan ** 2 )
1663 if ( abs( cos ) * giant > 1.0d+00 )
then
1668 cos = 0.5d+00 / sqrt( 0.25d+00 + 0.25d+00 * tan ** 2 )
1676 v(n) = sin * v(j) + cos * v(n)
1683 temp = cos * s(l) - sin * w(i)
1684 w(i) = sin * s(l) + cos * w(i)
1695 w(1:m) = w(1:m) + v(n) * u(1:m)
1703 if ( w(j) /= 0.0d+00 )
then
1708 if ( abs( s(jj) ) < abs( w(j) ) )
then
1710 cotan = s(jj) / w(j)
1711 sin = 0.5d+00 / sqrt( 0.25d+00 + 0.25d+00 * cotan ** 2 )
1714 if ( 1.0d+00 < abs( cos ) * giant )
then
1723 cos = 0.5d+00 / sqrt( 0.25d+00 + 0.25d+00 * tan ** 2 )
1733 temp = cos * s(l) + sin * w(i)
1734 w(i) = - sin * s(l) + cos * w(i)
1747 if ( s(jj) == 0.0d+00 )
then
1751 jj = jj + ( m - j + 1 )
1763 if ( s(jj) == 0.0d+00 )
then