93SUBROUTINE sqminv(v,b,n,nrank,diag,next)
108 INTEGER(mpi) :: next0
110 REAL(mpd),
INTENT(IN OUT) :: v(*)
111 REAL(mpd),
INTENT(OUT) :: b(n)
112 INTEGER(mpi),
INTENT(IN) :: n
113 INTEGER(mpi),
INTENT(OUT) :: nrank
114 REAL(mpd),
INTENT(OUT) :: diag(n)
115 INTEGER(mpi),
INTENT(OUT) :: next(n)
122 eps = 16.0_mpd * epsilon(eps)
128 diag(i)=abs(v((i*i+i)/2))
141 IF(abs(v(jj)) > max(abs(vkk),eps*diag(j)))
THEN
189 v(jl)=v(jl)-v(lk)*vjk
196 IF(next(k) /= 0)
THEN
199 IF(next(j) /= 0) v((k*k-k)/2+j)=0.0_mpd
233 INTEGER(mpi) :: next0
235 REAL(mpd),
INTENT(IN OUT) :: v(*)
236 REAL(mpd),
INTENT(OUT) :: b(n)
237 INTEGER(mpi),
INTENT(IN) :: n
238 INTEGER(mpi),
INTENT(OUT) :: nrank
239 REAL(mpd),
INTENT(OUT) :: diag(n)
240 INTEGER(mpi),
INTENT(OUT) :: next(n)
255 REAL(mpd),
PARAMETER :: eps=1.0e-10_mpd
262 diag(i)=abs(v((i8*i8+i8)/2))
275 IF(abs(v(jj)) > max(abs(vkk),eps*diag(j)))
THEN
334 v(ljl)=v(ljl)-v(llk)*vjk
341 v(ljl)=v(ljl)-v(llk)*vjk
350 IF(next(k) /= 0)
THEN
353 IF(next(j) /= 0) v(kk+int8(j))=0.0_mpd
360 10
DO jj=1,(int8(n)*int8(n)+int8(n))/2
382 INTEGER(mpi),
INTENT(IN) :: n
383 REAL(mpd),
INTENT(OUT) :: diag(n)
384 REAL(mpd),
INTENT(OUT) :: u(n,n)
385 REAL(mpd),
INTENT(IN) :: v(*)
386 REAL(mpd),
INTENT(OUT) :: work(n)
387 INTEGER(mpi),
INTENT(OUT) :: iwork(n)
390 INTEGER(mpi),
PARAMETER :: itmax=30
391 REAL(mpd),
PARAMETER :: tol=epsilon(tol)
392 REAL(mpd),
PARAMETER :: eps=epsilon(eps)
429 IF(abs(u(i,k)) > tol) g=g+u(i,k)*u(i,k)
439 IF(f >= 0.0_mpd) sh=-sh
450 IF(abs(u(j,k)) > tol.AND.abs(u(i,k)) > tol)
THEN
455 IF(abs(u(k,j)) > tol.AND.abs(u(i,k)) > tol)
THEN
470 u(j,k)=u(j,k)-f*work(k)-g*u(i,k)
482 IF(diag(i) /= 0.0)
THEN
489 u(k,j)=u(k,j)-g*u(k,i)
511 h=eps*(abs(diag(l))+abs(work(l)))
514 IF(abs(work(m)) <= b)
GO TO 10
51710
IF(m == l)
GO TO 30
51920
IF(j == itmax)
THEN
520 WRITE(*,*)
'DEVROT: Iteration limit reached'
521 CALL peend(32,
'Aborted, iteration limit reached in diagonalization')
526 p=(diag(l+1)-g)/(2.0_mpd*work(l))
529 IF(p < 0.0_mpd) diag(l)=diag(l)/(p-r)
530 IF(p >= 0.0_mpd) diag(l)=diag(l)/(p+r)
543 IF(abs(p) >= abs(work(i)))
THEN
552 work(i+1)=s*work(i)*r
557 diag(i+1)=h+s*(c*g+s*diag(i))
561 u(k,i+1)=s*u(k,i)+c*h
567 IF(abs(work(l)) > b)
GO TO 20
58060
IF(diag(iwork(l+m)) > diag(iwork(l)))
THEN
591 IF(iwork(i) /= i)
THEN
624 INTEGER(mpi),
INTENT(IN) :: n
625 REAL(mpd),
INTENT(IN) :: diag(n)
626 REAL(mpd),
INTENT(IN) :: u(n,n)
627 REAL(mpd),
INTENT(IN) :: b(n)
628 REAL(mpd),
INTENT(OUT) :: coef(n)
635 IF(diag(i) > 0.0_mpd)
THEN
638 dsum=dsum+u(j,i)*b(j)
640 coef(i)=abs(dsum)/sqrt(diag(i))
662 INTEGER(mpi),
INTENT(IN) :: n
663 REAL(mpd),
INTENT(IN) :: diag(n)
664 REAL(mpd),
INTENT(IN) :: u(n,n)
665 REAL(mpd),
INTENT(IN) :: b(n)
666 REAL(mpd),
INTENT(OUT) :: x(n)
667 REAL(mpd),
INTENT(OUT) :: work(n)
676 IF(diag(j) /= 0.0_mpd)
THEN
713 INTEGER(mpi),
INTENT(IN) :: n
714 REAL(mpd),
INTENT(IN) :: diag(n)
715 REAL(mpd),
INTENT(IN) :: u(n,n)
716 REAL(mpd),
INTENT(OUT) :: v(*)
725 IF(diag(k) /= 0.0_mpd)
THEN
726 dsum=dsum+u(i,k)*u(j,k)/diag(k)
764 REAL(mpd),
INTENT(IN OUT) :: g(*)
765 INTEGER(mpi),
INTENT(IN) :: n
772 IF(g(ii) /= 0.0) g(ii)=1.0/g(ii)
778 g(kk+j)=g(kk+j)-g(kk+i)*ratio
809 REAL(mpd),
INTENT(IN) :: g(*)
810 REAL(mpd),
INTENT(IN OUT) :: x(n)
811 INTEGER(mpi),
INTENT(IN) :: n
817 dsum=dsum-g(k+ii)*x(k)
826 dsum=dsum-g(kk+i)*x(k)
857 REAL(mpd),
INTENT(IN) :: g(*)
858 REAL(mpd),
INTENT( OUT) :: v(*)
859 INTEGER(mpi),
INTENT(IN) :: n
868 dsum=dsum-g(j+(k*k-k)/2)*v(l+(m*m-m)/2)
917 INTEGER(mpi),
INTENT(IN) :: n
918 REAL(mpd),
INTENT(IN OUT) :: val(*)
919 INTEGER(mpi),
INTENT(IN) :: ilptr(n)
925 REAL(mpd),
PARAMETER :: one=1.0_mpd
926 REAL(mpd),
PARAMETER :: two=2.0_mpd
927 REAL(mpd),
PARAMETER :: eps = epsilon(eps)
929 WRITE(*,*)
'Variable band matrix Cholesky decomposition'
934 IF(ilptr(i) == j)
THEN
935 IF(val(j) <= 0.0_mpd)
GO TO 01
936 dgamma=max(dgamma,abs(val(j)))
942 WRITE(*,*)
' ',in,
' positive diagonal elements'
947 IF(ilptr(i) == j)
THEN
950 xi=max(xi,abs(val(j)))
954 delta=eps*max(1.0_mpd,dgamma+xi)
956 IF(n > 1) sn=1.0_mpd/sqrt(real(n*n-1,mpd))
957 beta=sqrt(max(eps,dgamma,xi*sn))
958 WRITE(*,*)
' DELTA and BETA ',delta,beta
961 mk=k-ilptr(k)+ilptr(k-1)+1
966 mj=j-ilptr(j)+ilptr(j-1)+1
971 -val(ilptr(k)-k+i)*val(ilptr(i))*val(ilptr(j)-j+i)
975 theta=max(theta,abs(val(kj)))
978 IF(val(ilptr(j)) /= 0.0_mpd)
THEN
979 val(kj)=val(kj)/val(ilptr(j))
988 val(kj)=max(abs(val(kj)),(theta/beta)**2,delta)
989 IF(valkj /= val(kj))
THEN
990 WRITE(*,*)
' Index K=',k
991 WRITE(*,*)
' ',valkj,val(kj), (theta/beta)**2,delta,theta
1000 IF(val(ilptr(k)) /= 0.0_mpd) val(ilptr(k))=1.0_mpd/val(ilptr(k))
1020 INTEGER(mpi),
INTENT(IN) :: n
1021 REAL(mpd),
INTENT(IN OUT) :: val(*)
1022 INTEGER(mpi),
INTENT(IN) :: ilptr(n)
1027 IF(val(ilptr(k)) > val(ilptr(ks))) ks=k
1028 IF(val(ilptr(k)) < val(ilptr(kr))) kr=k
1029 IF(val(ilptr(k)) > 0.0.AND.val(ilptr(k)) < val(ilptr(kp))) kp=k
1031 WRITE(*,*)
' Index value ',ks,val(ilptr(ks))
1032 WRITE(*,*)
' Index value ',kp,val(ilptr(kp))
1033 WRITE(*,*)
' Index value ',kr,val(ilptr(kr))
1057 INTEGER(mpi),
INTENT(IN) :: n
1058 REAL(mpd),
INTENT(IN OUT) :: val(*)
1059 INTEGER(mpi),
INTENT(IN) :: ilptr(n)
1060 REAL(mpd),
INTENT(IN OUT) :: x(n)
1063 mk=k-ilptr(k)+ilptr(k-1)+1
1065 x(k)=x(k)-val(ilptr(k)-k+j)*x(j)
1070 x(k)=x(k)*val(ilptr(k))
1074 mk=k-ilptr(k)+ilptr(k-1)+1
1076 x(j)=x(j)-val(ilptr(k)-k+j)*x(k)
1097 INTEGER(mpi),
INTENT(IN) :: n
1098 REAL(
mpd),
INTENT(IN) :: dx(*)
1099 REAL(
mpd),
INTENT(IN) :: dy(*)
1103 dtemp=dtemp+dx(i)*dy(i)
1105 DO i =mod(n,5)+1,n,5
1106 dtemp=dtemp+dx(i)*dy(i)+dx(i+1)*dy(i+1)+dx(i+2)*dy(i+2) &
1107 +dx(i+3)*dy(i+3)+dx(i+4)*dy(i+4)
1127 INTEGER(mpi),
INTENT(IN) :: n
1128 REAL(mpd),
INTENT(IN) :: dx(*)
1129 REAL(mpd),
INTENT(IN OUT) :: dy(*)
1130 REAL(mpd),
INTENT(IN) :: da
1133 dy(i)=dy(i)+da*dx(i)
1136 dy(i )=dy(i )+da*dx(i )
1137 dy(i+1)=dy(i+1)+da*dx(i+1)
1138 dy(i+2)=dy(i+2)+da*dx(i+2)
1139 dy(i+3)=dy(i+3)+da*dx(i+3)
1164 INTEGER(mpi),
INTENT(IN) :: n
1165 REAL(mpd),
INTENT(IN) :: v(*)
1166 REAL(mpd),
INTENT(IN) :: a(*)
1167 REAL(mpd),
INTENT(OUT) :: b(*)
1175 dsum=dsum+v(ij)*a(j)
1206 INTEGER(mpi),
INTENT(IN) :: n
1207 REAL(mpd),
INTENT(IN) :: v(*)
1208 REAL(mpd),
INTENT(IN) :: a(*)
1209 REAL(mpd),
INTENT(OUT) :: b(*)
1219 dsum=dsum+v(ij)*a(j)
1247 REAL(mpd),
INTENT(IN) :: a(*)
1248 REAL(mpd),
INTENT(IN) :: x(*)
1249 REAL(mpd),
INTENT(OUT) :: y(*)
1250 INTEGER(mpi),
INTENT(IN) :: m
1251 INTEGER(mpi),
INTENT(IN) :: n
1259 y(i)=y(i)+a(ij)*x(j)
1292 REAL(mpd),
INTENT(IN) :: v(*)
1293 REAL(mpd),
INTENT(IN) :: a(*)
1294 REAL(mpd),
INTENT(INOUT) :: w(*)
1295 INTEGER(mpi),
INTENT(IN) :: n
1296 INTEGER(mpi),
INTENT(IN) :: ms
1321 cik=cik+a(il+l)*v(lk)
1325 cik=cik+a(il+l)*v(lk)
1331 w(ij)=w(ij)+cik*a(jk)
1359 INTEGER(mpi) :: mc(15)
1364 INTEGER(mpi),
INTENT(IN) :: lun
1365 REAL(mpd),
INTENT(IN) :: x(*)
1366 REAL(mpd),
INTENT(IN) :: v(*)
1367 INTEGER(mpi),
INTENT(IN) :: n
1376 IF(v(ii) > 0.0) err=sqrt(real(v(ii),mps))
1383 pd=real(v(ii)*v(jj),mps)
1384 IF(pd > 0.0) rho=real(v(ij),mps)/sqrt(pd)
1386 mc(l)=nint(100.0*abs(rho),
mpi)
1387 IF(rho < 0.0) mc(l)=-mc(l)
1388 IF(j == i.OR.l == 15)
THEN
1391 WRITE(lun,102) i,x(i),err,(mc(m),m=1,l-1)
1393 WRITE(lun,102) i,x(i),err,(mc(m),m=1,l)
1397 WRITE(lun,103) (mc(m),m=1,l-1)
1399 WRITE(lun,103) (mc(m),m=1,l)
1409101
FORMAT(9x,
'Param',7x,
'error',7x,
'correlation coefficients'/)
1410102
FORMAT(1x,i5,2g12.4,1x,15i5)
1412104
FORMAT(33x,
'(correlation coefficients in percent)')
1427 INTEGER(mpi),
PARAMETER :: istp=6
1435 INTEGER(mpi),
INTENT(IN) :: lun
1436 REAL(mpd),
INTENT(IN) :: v(*)
1437 INTEGER(mpi),
INTENT(IN) :: n
1447 WRITE(lun,102) i, ip+1-ips, (v(k),k=ip+1,min(ipn,ipe))
1454101
FORMAT(1x,
'--- DBPRV -----------------------------------')
1455102
FORMAT(1x,2i3,6g12.4)
1478 REAL(mps),
INTENT(IN OUT) :: a(*)
1479 INTEGER(mpi),
INTENT(IN) :: n
1500 IF(a(j) < a(j+1)) j=j+1
1526 INTEGER(mpi) :: nlev
1533 INTEGER(mpi) :: lr(nlev)
1535 INTEGER(mpi) :: maxlev
1539 INTEGER(mpi),
INTENT(IN OUT) :: a(*)
1540 INTEGER(mpi),
INTENT(IN) :: n
1548 IF(a(l) > a(r))
THEN
1567 IF(mod(l,2) == 1.AND.mod(r,2) == 1) lrh=lrh+1
1572 IF(a(i) < a1)
GO TO 20
1574 IF(a(j) > a1)
GO TO 30
1581 IF(lev+2 > nlev)
THEN
1582 CALL peend(33,
'Aborted, stack overflow in quicksort')
1583 stop
'SORT1K (quicksort): stack overflow'
1595 maxlev=max(maxlev,lev)
1611 INTEGER(mpi) :: nlev
1618 INTEGER(mpi) ::lr(nlev)
1620 INTEGER(mpi) ::maxlev
1625 INTEGER(mpi),
INTENT(IN OUT) :: a(2,*)
1626 INTEGER(mpi),
INTENT(IN) :: n
1633 IF(a(1,l) > a(1,r).OR.( a(1,l) == a(1,r).AND.a(2,l) > a(2,r)))
THEN
1645 WRITE(*,*)
'SORT2K (quicksort): maxlevel used/available =', maxlev,
'/64'
1654 IF(mod(l,2) == 1.AND.mod(r,2) == 1) lrh=lrh+1
1660 IF(a(1,i) < a1)
GO TO 20
1661 IF(a(1,i) == a1.AND.a(2,i) < a2)
GO TO 20
1663 IF(a(1,j) > a1)
GO TO 30
1664 IF(a(1,j) == a1.AND.a(2,j) > a2)
GO TO 30
1674 IF(lev+2 > nlev)
THEN
1675 CALL peend(33,
'Aborted, stack overflow in quicksort')
1676 stop
'SORT2K (quicksort): stack overflow'
1688 maxlev=max(maxlev,lev)
1704 INTEGER(mpi) :: nlev
1711 INTEGER(mpi) ::lr(nlev)
1713 INTEGER(mpi) ::maxlev
1718 INTEGER(mpi),
INTENT(IN OUT) :: a(3,*)
1719 INTEGER(mpi),
INTENT(IN) :: n
1726 IF(a(1,l) > a(1,r).OR.( a(1,l) == a(1,r).AND.a(2,l) > a(2,r)))
THEN
1741 WRITE(*,*)
'SORT2I (quicksort): maxlevel used/available =', maxlev,
'/64'
1750 IF(mod(l,2) == 1.AND.mod(r,2) == 1) lrh=lrh+1
1756 IF(a(1,i) < a1)
GO TO 20
1757 IF(a(1,i) == a1.AND.a(2,i) < a2)
GO TO 20
1759 IF(a(1,j) > a1)
GO TO 30
1760 IF(a(1,j) == a1.AND.a(2,j) > a2)
GO TO 30
1773 IF(lev+2 > nlev)
THEN
1774 CALL peend(33,
'Aborted, stack overflow in quicksort')
1775 stop
'SORT2I (quicksort): stack overflow'
1787 maxlev=max(maxlev,lev)
1805 INTEGER(mpi),
INTENT(IN) :: n
1806 INTEGER(mpi),
INTENT(IN) :: nd
1809 REAL(
mps) ::table(30,3)
1812 DATA sn/0.47523,1.690140,2.782170/
1813 DATA table/ 1.0000, 1.1479, 1.1753, 1.1798, 1.1775, 1.1730, 1.1680, 1.1630, &
1814 1.1581, 1.1536, 1.1493, 1.1454, 1.1417, 1.1383, 1.1351, 1.1321, &
1815 1.1293, 1.1266, 1.1242, 1.1218, 1.1196, 1.1175, 1.1155, 1.1136, &
1816 1.1119, 1.1101, 1.1085, 1.1070, 1.1055, 1.1040, &
1817 4.0000, 3.0900, 2.6750, 2.4290, 2.2628, 2.1415, 2.0481, 1.9736, &
1818 1.9124, 1.8610, 1.8171, 1.7791, 1.7457, 1.7161, 1.6897, 1.6658, &
1819 1.6442, 1.6246, 1.6065, 1.5899, 1.5745, 1.5603, 1.5470, 1.5346, &
1820 1.5230, 1.5120, 1.5017, 1.4920, 1.4829, 1.4742, &
1821 9.0000, 5.9146, 4.7184, 4.0628, 3.6410, 3.3436, 3.1209, 2.9468, &
1822 2.8063, 2.6902, 2.5922, 2.5082, 2.4352, 2.3711, 2.3143, 2.2635, &
1823 2.2178, 2.1764, 2.1386, 2.1040, 2.0722, 2.0428, 2.0155, 1.9901, &
1824 1.9665, 1.9443, 1.9235, 1.9040, 1.8855, 1.8681/
1834 chindl=(sn(m)+sqrt(real(nd+nd-1,
mps)))**2/real(nd+nd,
mps)
1889 INTEGER(mpi),
INTENT(IN) :: n
1890 REAL(mpd),
INTENT(IN OUT) :: c(*)
1891 INTEGER(mpi),
INTENT(IN) :: india(n)
1892 INTEGER(mpi),
INTENT(OUT) :: nrkd
1893 INTEGER(mpi),
INTENT(IN) :: iopt
1896 eps = 16.0_mpd * epsilon(eps)
1901 IF(c(india(1)) > 0.0)
THEN
1902 c(india(1))=1.0_mpd/sqrt(c(india(1)))
1909 mk=k-india(k)+india(k-1)+1
1912 IF(j > 1) mj=j-india(j)+india(j-1)+1
1918 c(kj)=c(kj) - c(india(k)-k+i)*c(india(j)-j+i)
1921 IF(j /= k) c(kj)=c(kj)*diag
1924 IF(c(india(k)) > eps*diag)
THEN
1925 c(india(k))=1.0_mpd/sqrt(c(india(k)))
1928 c(india(k)-k+j)=0.0_mpd
1930 IF (iopt > 0 .and. diag > 0.0)
THEN
1931 c(india(k))=1.0_mpd/sqrt(diag)
1966 INTEGER(mpi),
INTENT(IN) :: n
1967 REAL(mpd),
INTENT(IN) :: c(*)
1968 INTEGER(mpi),
INTENT(IN) :: india(n)
1969 REAL(mpd),
INTENT(IN OUT) :: x(n)
1971 x(1)=x(1)*c(india(1))
1973 DO j=k-india(k)+india(k-1)+1,k-1
1974 x(k)=x(k)-c(india(k)-k+j)*x(j)
1976 x(k)=x(k)*c(india(k))
2001 INTEGER(mpi),
INTENT(IN) :: n
2002 REAL(mpd),
INTENT(IN) :: c(*)
2003 INTEGER(mpi),
INTENT(IN) :: india(n)
2004 REAL(mpd),
INTENT(IN OUT) :: x(n)
2007 x(k)=x(k)*c(india(k))
2008 DO j=k-india(k)+india(k-1)+1,k-1
2009 x(j)=x(j)-c(india(k)-k+j)*x(k)
2012 x(1)=x(1)*c(india(1))
2043 INTEGER(mpi),
INTENT(IN) :: n
2044 INTEGER(mpi),
INTENT(IN) :: m
2045 INTEGER(mpi),
INTENT(IN) :: ls
2046 REAL(mpd),
INTENT(IN OUT) :: c(*)
2047 INTEGER(mpi),
INTENT(IN OUT) :: india(n+m)
2048 INTEGER(mpi),
INTENT(OUT) :: nrkd
2049 INTEGER(mpi),
INTENT(OUT) :: nrkd2
2056 CALL lltdec(n,c,india,nrkd,ls)
2060 CALL lltfwd(n,c,india,c(india(n)+(i-1)*n+1))
2069 c(jk)=c(jk)+c(india(n)+(j-1)*n+i)*c(india(n)+(k-1)*n+i)
2076 india(n+i)=india(n+i-1)+min(i,m)
2079 CALL lltdec(m,c(india(n)+n*m+1),india(n+1),nrkd2,0)
2107 INTEGER(mpi),
INTENT(IN) :: n
2108 INTEGER(mpi),
INTENT(IN) :: m
2109 REAL(mpd),
INTENT(IN) :: c(*)
2110 INTEGER(mpi),
INTENT(IN) :: india(n+m)
2111 REAL(mpd),
INTENT(IN OUT) :: x(n+m)
2118 x(n+i)=x(n+i)-x(j)*c(india(n)+(i-1)*n+j)
2121 CALL lltfwd(m,c(india(n)+n*m+1),india(n+1),x(n+1))
2124 CALL lltbwd(m,c(india(n)+n*m+1),india(n+1),x(n+1))
2131 x(i)=x(i)-x(n+j)*c(india(n)+(j-1)*n+i)
2183 INTEGER(mpi),
INTENT(IN) :: p
2184 INTEGER(mpi),
INTENT(IN) :: n
2185 REAL(mpd),
INTENT(IN) :: c(n)
2186 REAL(mpd),
INTENT(OUT) :: cu(n)
2187 REAL(mpd),
INTENT(IN OUT) :: a(n,p)
2188 REAL(mpd),
INTENT(OUT) :: s((p*p+p)/2)
2189 INTEGER(mpi),
INTENT(OUT) :: nrkd
2201 IF (div > 0.0_mpd)
THEN
2202 cu(i)=1.0_mpd/sqrt(div)
2211 s(jk)=s(jk)+a(i,j)*a(i,k)
2219 IF(s(ii) /= 0.0_mpd) s(ii)=1.0_mpd/s(ii)
2225 s(kk+j)=s(kk+j)-s(kk+i)*ratio
2255 INTEGER(mpi),
INTENT(IN) :: p
2256 INTEGER(mpi),
INTENT(IN) :: n
2258 REAL(mpd),
INTENT(IN) :: cu(n)
2259 REAL(mpd),
INTENT(IN) :: a(n,p)
2260 REAL(mpd),
INTENT(IN) :: s((p*p+p)/2)
2261 REAL(mpd),
INTENT(OUT) :: x(n+p)
2262 REAL(mpd),
INTENT(IN) :: y(n+p)
2272 x(n+j)=x(n+j)-a(i,j)*x(i)
2280 dsum=dsum-s(k+jj)*x(n+k)
2290 dsum=dsum+s(kk+j)*x(n+k)
2299 x(i)=x(i)-a(i,j)*x(n+j)
2354SUBROUTINE sqmibb(v,b,n,nbdr,nbnd,inv,nrank,vbnd,vbdr,aux,vbk,vzru,scdiag,scflag)
2368 INTEGER(mpi) :: ioff
2376 INTEGER(mpi) :: joff
2380 INTEGER(mpi) :: npri
2381 INTEGER(mpi) :: nrankb
2383 REAL(mpd),
INTENT(IN OUT) :: v(*)
2384 REAL(mpd),
INTENT(OUT) :: b(n)
2385 INTEGER(mpi),
INTENT(IN) :: n
2386 INTEGER(mpi),
INTENT(IN) :: nbdr
2387 INTEGER(mpi),
INTENT(IN) :: nbnd
2388 INTEGER(mpi),
INTENT(IN) :: inv
2389 INTEGER(mpi),
INTENT(OUT) :: nrank
2391 REAL(mpd),
INTENT(OUT) :: vbnd(n*(nbnd+1))
2392 REAL(mpd),
INTENT(OUT) :: vbdr(n*nbdr)
2393 REAL(mpd),
INTENT(OUT) :: aux(n*nbdr)
2394 REAL(mpd),
INTENT(OUT) :: vbk((nbdr*nbdr+nbdr)/2)
2395 REAL(mpd),
INTENT(OUT) :: vzru(nbdr)
2396 REAL(mpd),
INTENT(OUT) :: scdiag(nbdr)
2397 INTEGER(mpi),
INTENT(OUT) :: scflag(nbdr)
2410 DO j=i,min(n,i+nbnd)
2414 vbnd(ib+(i-nb1)*mp1)=v(ip)
2432 CALL dbcdec(vbnd,mp1,nmb,aux)
2437 IF (vbnd(ip) <= 0.0_mpd)
THEN
2440 IF (vbnd(ip) == 0.0_mpd)
THEN
2441 print *,
' SQMIBB matrix singular', n, nbdr, nbnd
2443 print *,
' SQMIBB matrix not positive definite', n, nbdr, nbnd
2461 CALL dbcslv(vbnd,mp1,nmb,b,b)
2464 CALL dbcinv(vbnd,mp1,nmb,v)
2466 CALL dbcinb(vbnd,mp1,nmb,v)
2475 CALL dbcslv(vbnd,mp1,nmb,vbdr(ioff),aux(ioff))
2479 vzru(ib)=vzru(ib)-b(nb1+i)*aux(ioff+i)
2484 CALL dbcslv(vbnd,mp1,nmb,b(nb1),b(nb1))
2494 vbk(ip)=vbk(ip)-vbdr(ioff+i)*aux(joff+i)
2501 CALL sqminv(vbk,vzru,nbdr,nrankb,scdiag,scflag)
2502 IF (nrankb == nbdr)
THEN
2506 IF (npri >= 0) print *,
' SQMIBB undef border ', n, nbdr, nbnd, nrankb
2510 DO ip=(nbdr*nbdr+nbdr)/2,1,-1
2519 b(nb1+i)=b(nb1+i)-b(ib)*aux(ioff+i)
2526 CALL dbcinv(vbnd,mp1,nmb,v)
2528 CALL dbcinb(vbnd,mp1,nmb,v)
2535 IF (inv == 1) j0=max(0,i-nbnd)
2543 ij=(ij*ij-ij)/2+min(ib,jb)
2544 v(ip2)=v(ip2)+vbk(ij)*aux(ioff+i)*aux(joff+j)
2560 ij=(ij*ij-ij)/2+min(ib,jb)
2561 v(ip2)=v(ip2)-vbk(ij)*aux(i+joff)
2568 DO ip=(nbdr*nbdr+nbdr)/2,1,-1
2610SUBROUTINE sqmibb2(v,b,n,nbdr,nbnd,inv,nrank,vbnd,vbdr,aux,vbk,vzru,scdiag,scflag)
2624 INTEGER(mpi) :: ioff
2631 INTEGER(mpi) :: joff
2632 INTEGER(mpi) :: koff
2636 INTEGER(mpi) :: npri
2637 INTEGER(mpi) :: nrankb
2639 REAL(mpd),
INTENT(IN OUT) :: v(*)
2640 REAL(mpd),
INTENT(OUT) :: b(n)
2641 INTEGER(mpi),
INTENT(IN) :: n
2642 INTEGER(mpi),
INTENT(IN) :: nbdr
2643 INTEGER(mpi),
INTENT(IN) :: nbnd
2644 INTEGER(mpi),
INTENT(IN) :: inv
2645 INTEGER(mpi),
INTENT(OUT) :: nrank
2647 REAL(mpd),
INTENT(OUT) :: vbnd(n*(nbnd+1))
2648 REAL(mpd),
INTENT(OUT) :: vbdr(n*nbdr)
2649 REAL(mpd),
INTENT(OUT) :: aux(n*nbdr)
2650 REAL(mpd),
INTENT(OUT) :: vbk((nbdr*nbdr+nbdr)/2)
2651 REAL(mpd),
INTENT(OUT) :: vzru(nbdr)
2652 REAL(mpd),
INTENT(OUT) :: scdiag(nbdr)
2653 INTEGER(mpi),
INTENT(OUT) :: scflag(nbdr)
2666 DO j=i,min(nmb,i+nbnd)
2670 vbnd(ib+(i-1)*mp1)=v(ip)
2679 vbdr(ioff+j)=v(ip+j)
2685 CALL dbcdec(vbnd,mp1,nmb,aux)
2690 IF (vbnd(ip) <= 0.0_mpd)
THEN
2693 IF (vbnd(ip) == 0.0_mpd)
THEN
2694 print *,
' SQMIBB2 matrix singular', n, nbdr, nbnd
2696 print *,
' SQMIBB2 matrix not positive definite', n, nbdr, nbnd
2714 CALL dbcslv(vbnd,mp1,nmb,b,b)
2717 CALL dbcinv(vbnd,mp1,nmb,v)
2719 CALL dbcinb(vbnd,mp1,nmb,v)
2728 CALL dbcslv(vbnd,mp1,nmb,vbdr(ioff+1),aux(ioff+1))
2732 vzru(ib)=vzru(ib)-b(i)*aux(ioff+i)
2737 CALL dbcslv(vbnd,mp1,nmb,b,b)
2746 vbk(ip)=vbdr(koff+jb)
2748 vbk(ip)=vbk(ip)-vbdr(ioff+i)*aux(joff+i)
2757 CALL sqminv(vbk,vzru,nbdr,nrankb,scdiag,scflag)
2758 IF (nrankb == nbdr)
THEN
2762 IF (npri >= 0) print *,
' SQMIBB2 undef border ', n, nbdr, nbnd, nrankb
2766 DO ip=(nbdr*nbdr+nbdr)/2,1,-1
2774 b(i)=b(i)-vzru(ib)*aux(ioff+i)
2782 CALL dbcinv(vbnd,mp1,nmb,v)
2784 CALL dbcinb(vbnd,mp1,nmb,v)
2792 IF (inv == 1) j0=max(0,i-nbnd)
2799 ij=(ij*ij-ij)/2+min(ib,jb)
2800 v(ip1)=v(ip1)+vbk(ij)*aux(ioff+i)*aux(joff+j)
2819 ij=(ij*ij-ij)/2+min(ib,jb)
2820 v(ip1)=v(ip1)-vbk(ij)*aux(i+joff)
subroutine dbcdec(w, mp1, n, aux)
Decomposition of symmetric band matrix.
subroutine cholin(g, v, n)
Inversion after decomposition.
subroutine sqmibb2(v, b, n, nbdr, nbnd, inv, nrank, vbnd, vbdr, aux, vbk, vzru, scdiag, scflag)
Band bordered matrix.
subroutine vabmmm(n, val, ilptr)
Variable band matrix print minimum and maximum.
subroutine precon(p, n, c, cu, a, s, nrkd)
Constrained preconditioner, decomposition.
subroutine devsol(n, diag, u, b, x, work)
Solution by diagonalization.
subroutine sqminl(v, b, n, nrank, diag, next)
Matrix inversion for LARGE matrices.
subroutine dbsvxl(v, a, b, n)
Product LARGE symmetric matrix, vector.
subroutine devrot(n, diag, u, v, work, iwork)
Diagonalization.
subroutine dbmprv(lun, x, v, n)
Print symmetric matrix, vector.
subroutine dbaxpy(n, da, dx, dy)
Multiply, addition.
subroutine equslv(n, m, c, india, x)
Solution of equilibrium systems (after decomposition).
subroutine heapf(a, n)
Heap sort direct (real).
real(mpd) function dbdot(n, dx, dy)
Dot product.
subroutine equdec(n, m, ls, c, india, nrkd, nrkd2)
Decomposition of equilibrium systems.
subroutine vabdec(n, val, ilptr)
Variable band matrix decomposition.
subroutine vabslv(n, val, ilptr, x)
Variable band matrix solution.
subroutine choldc(g, n)
Cholesky decomposition.
subroutine sort1k(a, n)
Quick sort 1.
subroutine sqminv(v, b, n, nrank, diag, next)
Matrix inversion and solution.
subroutine lltbwd(n, c, india, x)
Backward solution.
subroutine dbgax(a, x, y, m, n)
Multiply general M-by-N matrix A and N-vector X.
subroutine sqmibb(v, b, n, nbdr, nbnd, inv, nrank, vbnd, vbdr, aux, vbk, vzru, scdiag, scflag)
Bordered band matrix.
subroutine presol(p, n, cu, a, s, x, y)
Constrained preconditioner, solution.
subroutine dbprv(lun, v, n)
Print symmetric matrix.
subroutine devinv(n, diag, u, v)
Inversion by diagonalization. Get inverse matrix V from DIAG and U.
subroutine lltdec(n, c, india, nrkd, iopt)
LLT decomposition.
subroutine cholsl(g, x, n)
Solution after decomposition.
subroutine sort2k(a, n)
Quick sort 2.
subroutine devsig(n, diag, u, b, coef)
Calculate significances.
real(mps) function chindl(n, nd)
Chi2/ndf cuts.
subroutine lltfwd(n, c, india, x)
Forward solution.
subroutine dbsvx(v, a, b, n)
Product symmetric matrix, vector.
subroutine dbavat(v, a, w, n, ms)
A V AT product (similarity).
subroutine sort2i(a, n)
Quick sort 2 with index.
integer, parameter parameter
subroutine peend(icode, cmessage)
Print exit code.