72 SUBROUTINE sqminv(v,b,n,nrank,diag,next) ! matrix inversion
87 DOUBLE PRECISION,
INTENT(IN OUT) :: v(*)
88 DOUBLE PRECISION,
INTENT(OUT) :: b(n)
89 INTEGER,
INTENT(IN) :: n
90 INTEGER,
INTENT(OUT) :: nrank
91 DOUBLE PRECISION,
INTENT(OUT) :: diag(n)
92 INTEGER,
INTENT(OUT) :: next(n)
93 DOUBLE PRECISION :: vkk
94 DOUBLE PRECISION :: vjk
96 DOUBLE PRECISION,
PARAMETER :: eps=1.0d-10
102 diag(i)=abs(v((i*i+i)/2))
115 IF(abs(v(jj)) > max(abs(vkk),eps*diag(j)))
THEN
163 v(jl)=v(jl)-v(lk)*vjk
170 IF(next(k) /= 0)
THEN
173 IF(next(j) /= 0) v((k*k-k)/2+j)=0.0d0
198 SUBROUTINE sqminl(v,b,n,nrank,diag,next) !
209 DOUBLE PRECISION,
INTENT(IN OUT) :: v(*)
210 DOUBLE PRECISION,
INTENT(OUT) :: b(n)
211 INTEGER,
INTENT(IN) :: n
212 INTEGER,
INTENT(OUT) :: nrank
213 DOUBLE PRECISION,
INTENT(OUT) :: diag(n)
214 INTEGER,
INTENT(OUT) :: next(n)
226 DOUBLE PRECISION :: vkk
227 DOUBLE PRECISION :: vjk
229 DOUBLE PRECISION,
PARAMETER :: eps=1.0d-10
236 diag(i)=abs(v((i8*i8+i8)/2))
249 IF(abs(v(jj)) > max(abs(vkk),eps*diag(j)))
THEN
308 v(ljl)=v(ljl)-v(llk)*vjk
315 v(ljl)=v(ljl)-v(llk)*vjk
324 IF(next(k) /= 0)
THEN
327 IF(next(j) /= 0) v(kk+int8(j))=0.0d0
334 10
DO jj=1,(int8(n)*int8(n)+int8(n))/2
351 SUBROUTINE devrot(n,diag,u,v,work,iwork) ! diagonalization
354 INTEGER,
INTENT(IN) :: n
355 DOUBLE PRECISION,
INTENT(OUT) :: diag(n)
356 DOUBLE PRECISION,
INTENT(OUT) :: u(n,n)
357 DOUBLE PRECISION,
INTENT(IN) :: v(*)
358 DOUBLE PRECISION,
INTENT(OUT) :: work(n)
359 INTEGER,
INTENT(OUT) :: iwork(n)
362 INTEGER,
PARAMETER :: itmax=30
363 DOUBLE PRECISION,
PARAMETER :: tol=1.0d-16
364 DOUBLE PRECISION,
PARAMETER :: eps=1.0d-16
366 DOUBLE PRECISION :: f
367 DOUBLE PRECISION :: g
368 DOUBLE PRECISION :: h
369 DOUBLE PRECISION :: sh
370 DOUBLE PRECISION :: hh
371 DOUBLE PRECISION :: b
372 DOUBLE PRECISION :: p
373 DOUBLE PRECISION :: r
374 DOUBLE PRECISION :: s
375 DOUBLE PRECISION :: c
376 DOUBLE PRECISION :: workd
401 IF(abs(u(i,k)) > tol) g=g+u(i,k)*u(i,k)
411 IF(f >= 0.0d0) sh=-sh
422 IF(abs(u(j,k)) > tol.AND.abs(u(i,k)) > tol)
THEN
427 IF(abs(u(k,j)) > tol.AND.abs(u(i,k)) > tol)
THEN
442 u(j,k)=u(j,k)-f*work(k)-g*u(i,k)
454 IF(diag(i) /= 0.0)
THEN
461 u(k,j)=u(k,j)-g*u(k,i)
483 h=eps*(abs(diag(l))+abs(work(l)))
486 IF(abs(work(m)) <= b) go to 10
489 10
IF(m == l) go to 30
491 20
IF(j == itmax)
THEN
492 WRITE(*,*)
'DEVROT: Iteration limit reached'
497 p=(diag(l+1)-g)/(2.0d0*work(l))
500 IF(p < 0.0d0) diag(l)=diag(l)/(p-r)
501 IF(p >= 0.0d0) diag(l)=diag(l)/(p+r)
514 IF(abs(p) >= abs(work(i)))
THEN
523 work(i+1)=s*work(i)*r
528 diag(i+1)=h+s*(c*g+s*diag(i))
532 u(k,i+1)=s*u(k,i)+c*h
538 IF(abs(work(l)) > b) go to 20
551 60
IF(diag(iwork(l+m)) > diag(iwork(l)))
THEN
562 IF(iwork(i) /= i)
THEN
593 INTEGER,
INTENT(IN) :: n
594 DOUBLE PRECISION,
INTENT(IN) :: diag(n)
595 DOUBLE PRECISION,
INTENT(IN) :: u(n,n)
596 DOUBLE PRECISION,
INTENT(IN) :: b(n)
597 DOUBLE PRECISION,
INTENT(OUT) :: coef(n)
600 DOUBLE PRECISION :: dsum
604 IF(diag(i) > 0.0d0)
THEN
607 dsum=dsum+u(j,i)*b(j)
609 coef(i)=abs(dsum)/sqrt(diag(i))
629 INTEGER,
INTENT(IN) :: n
630 DOUBLE PRECISION,
INTENT(IN) :: diag(n)
631 DOUBLE PRECISION,
INTENT(IN) :: u(n,n)
632 DOUBLE PRECISION,
INTENT(IN) :: b(n)
633 DOUBLE PRECISION,
INTENT(OUT) :: x(n)
634 DOUBLE PRECISION,
INTENT(OUT) :: work(n)
638 DOUBLE PRECISION :: s
643 IF(diag(j) /= 0.0d0)
THEN
679 INTEGER,
INTENT(IN) :: n
680 DOUBLE PRECISION,
INTENT(IN) :: diag(n)
681 DOUBLE PRECISION,
INTENT(IN) :: u(n,n)
682 DOUBLE PRECISION,
INTENT(OUT) :: v(*)
683 DOUBLE PRECISION:: dsum
691 IF(diag(k) /= 0.0d0)
THEN
692 dsum=dsum+u(i,k)*u(j,k)/diag(k)
728 DOUBLE PRECISION,
INTENT(IN OUT) :: g(*)
729 INTEGER,
INTENT(IN) :: n
731 DOUBLE PRECISION :: ratio
736 IF(g(ii) /= 0.0) g(ii)=1.0/g(ii)
742 g(kk+j)=g(kk+j)-g(kk+i)*ratio
765 DOUBLE PRECISION :: dsum
771 DOUBLE PRECISION,
INTENT(IN) :: g(*)
772 DOUBLE PRECISION,
INTENT(IN OUT) :: x(n)
773 INTEGER,
INTENT(IN) :: n
779 dsum=dsum-g(k+ii)*x(k)
788 dsum=dsum-g(kk+i)*x(k)
809 DOUBLE PRECISION :: dsum
817 DOUBLE PRECISION,
INTENT(IN) :: g(*)
818 DOUBLE PRECISION,
INTENT( OUT) :: v(*)
819 INTEGER,
INTENT(IN) :: n
828 dsum=dsum-g(j+(k*k-k)/2)*v(l+(m*m-m)/2)
870 DOUBLE PRECISION :: sn
871 DOUBLE PRECISION :: beta
872 DOUBLE PRECISION :: delta
873 DOUBLE PRECISION :: theta
875 INTEGER,
INTENT(IN) :: n
876 DOUBLE PRECISION,
INTENT(IN OUT) :: val(*)
877 INTEGER,
INTENT(IN) :: ilptr(n)
879 DOUBLE PRECISION :: dgamma
880 DOUBLE PRECISION :: xi
881 DOUBLE PRECISION :: eps
882 DOUBLE PRECISION :: prd
883 DOUBLE PRECISION :: valkj
885 DOUBLE PRECISION,
PARAMETER :: one=1.0d0
886 DOUBLE PRECISION,
PARAMETER :: two=2.0d0
888 DATA eps/2.22044605e-16/
891 IF(eps == 0.0d0)
THEN
896 IF(prd > one) go to 10
898 WRITE(*,*)
'Machine precision is ',eps
901 WRITE(*,*)
'Variable band matrix Cholesky decomposition'
906 IF(ilptr(i) == j)
THEN
907 IF(val(j) <= 0.0d0) go to 01
908 dgamma=max(dgamma,abs(val(j)))
914 WRITE(*,*)
' ',in,
' positive diagonal elements'
919 IF(ilptr(i) == j)
THEN
922 xi=max(xi,abs(val(j)))
926 delta=eps*max(1.0d0,dgamma+xi)
928 IF(n > 1) sn=1.0d0/sqrt(dfloat(n*n-1))
929 beta=sqrt(max(eps,dgamma,xi*sn))
930 WRITE(*,*)
' DELTA and BETA ',delta,beta
933 mk=k-ilptr(k)+ilptr(k-1)+1
938 mj=j-ilptr(j)+ilptr(j-1)+1
943 -val(ilptr(k)-k+i)*val(ilptr(i))*val(ilptr(j)-j+i)
947 theta=max(theta,abs(val(kj)))
950 IF(val(ilptr(j)) /= 0.0d0)
THEN
951 val(kj)=val(kj)/val(ilptr(j))
960 val(kj)=max(abs(val(kj)),(theta/beta)**2,delta)
961 IF(valkj /= val(kj))
THEN
962 WRITE(*,*)
' Index K=',k
963 WRITE(*,*)
' ',valkj,val(kj), (theta/beta)**2,delta,theta
972 IF(val(ilptr(k)) /= 0.0d0) val(ilptr(k))=1.0d0/val(ilptr(k))
990 INTEGER,
INTENT(IN) :: n
991 DOUBLE PRECISION,
INTENT(IN OUT) :: val(*)
992 INTEGER,
INTENT(IN) :: ilptr(n)
997 IF(val(ilptr(k)) > val(ilptr(ks))) ks=k
998 IF(val(ilptr(k)) < val(ilptr(kr))) kr=k
999 IF(val(ilptr(k)) > 0.0.AND.val(ilptr(k)) < val(ilptr(kp))) kp=k
1001 WRITE(*,*)
' Index value ',ks,val(ilptr(ks))
1002 WRITE(*,*)
' Index value ',kp,val(ilptr(kp))
1003 WRITE(*,*)
' Index value ',kr,val(ilptr(kr))
1025 INTEGER,
INTENT(IN) :: n
1026 DOUBLE PRECISION,
INTENT(IN OUT) :: val(*)
1027 INTEGER,
INTENT(IN) :: ilptr(n)
1028 DOUBLE PRECISION,
INTENT(IN OUT) :: x(n)
1031 mk=k-ilptr(k)+ilptr(k-1)+1
1033 x(k)=x(k)-val(ilptr(k)-k+j)*x(j)
1038 x(k)=x(k)*val(ilptr(k))
1042 mk=k-ilptr(k)+ilptr(k-1)+1
1044 x(j)=x(j)-val(ilptr(k)-k+j)*x(k)
1058 DOUBLE PRECISION FUNCTION dbdot(n,dx,dy)
1061 DOUBLE PRECISION :: dtemp
1063 INTEGER,
INTENT(IN) :: n
1064 DOUBLE PRECISION,
INTENT(IN) :: dx(*)
1065 DOUBLE PRECISION,
INTENT(IN) :: dy(*)
1069 dtemp=dtemp+dx(i)*dy(i)
1071 DO i =mod(n,5)+1,n,5
1072 dtemp=dtemp+dx(i)*dy(i)+dx(i+1)*dy(i+1)+dx(i+2)*dy(i+2) &
1073 +dx(i+3)*dy(i+3)+dx(i+4)*dy(i+4)
1091 INTEGER,
INTENT(IN) :: n
1092 DOUBLE PRECISION,
INTENT(IN) :: dx(*)
1093 DOUBLE PRECISION,
INTENT(IN OUT) :: dy(*)
1094 DOUBLE PRECISION,
INTENT(IN) :: da
1097 dy(i)=dy(i)+da*dx(i)
1100 dy(i )=dy(i )+da*dx(i )
1101 dy(i+1)=dy(i+1)+da*dx(i+1)
1102 dy(i+2)=dy(i+2)+da*dx(i+2)
1103 dy(i+3)=dy(i+3)+da*dx(i+3)
1126 INTEGER,
INTENT(IN) :: n
1127 DOUBLE PRECISION,
INTENT(IN) :: v(*)
1128 DOUBLE PRECISION,
INTENT(IN) :: a(*)
1129 DOUBLE PRECISION,
INTENT(OUT) :: b(*)
1131 DOUBLE PRECISION:: dsum
1137 dsum=dsum+v(ij)*a(j)
1147 END SUBROUTINE dbsvx
1158 SUBROUTINE dbsvxl(v,a,b,n) ! LARGE symm. matrix, vector
1166 INTEGER,
INTENT(IN) :: n
1167 DOUBLE PRECISION,
INTENT(IN) :: v(*)
1168 DOUBLE PRECISION,
INTENT(IN) :: a(*)
1169 DOUBLE PRECISION,
INTENT(OUT) :: b(*)
1171 DOUBLE PRECISION:: dsum
1179 dsum=dsum+v(ij)*a(j)
1205 DOUBLE PRECISION,
INTENT(IN) :: a(*)
1206 DOUBLE PRECISION,
INTENT(IN) :: x(*)
1207 DOUBLE PRECISION,
INTENT(OUT) :: y(*)
1208 INTEGER,
INTENT(IN) :: m
1209 INTEGER,
INTENT(IN) :: n
1217 y(i)=y(i)+a(ij)*x(j)
1220 END SUBROUTINE dbgax
1248 DOUBLE PRECISION,
INTENT(IN) :: v(*)
1249 DOUBLE PRECISION,
INTENT(IN) :: a(*)
1250 DOUBLE PRECISION,
INTENT(INOUT) :: w(*)
1251 INTEGER,
INTENT(IN) :: n
1252 INTEGER,
INTENT(IN) :: ms
1254 DOUBLE PRECISION :: cik
1277 cik=cik+a(il+l)*v(lk)
1281 cik=cik+a(il+l)*v(lk)
1287 w(ij)=w(ij)+cik*a(jk)
1318 INTEGER,
INTENT(IN) :: lun
1319 DOUBLE PRECISION,
INTENT(IN) :: x(*)
1320 DOUBLE PRECISION,
INTENT(IN) :: v(*)
1321 INTEGER,
INTENT(IN) :: n
1330 IF(v(ii) > 0.0) err=sqrt(
REAL(v(ii)))
1337 pd=
REAL(v(ii)*v(jj))
1338 IF(pd > 0.0) rho=
REAL(v(ij))/sqrt(pd)
1340 mc(l)=int(100.0*abs(rho)+0.5)
1341 IF(rho < 0.0) mc(l)=-mc(l)
1342 IF(j == i.OR.l == 15)
THEN
1345 WRITE(lun,102) i,x(i),err,(mc(m),m=1,l-1)
1347 WRITE(lun,102) i,x(i),err,(mc(m),m=1,l)
1351 WRITE(lun,103) (mc(m),m=1,l-1)
1353 WRITE(lun,103) (mc(m),m=1,l)
1363 101 format(9x,
'Param',7x,
'error',7x,
'correlation coefficients'/)
1364 102 format(1x,i5,2g12.4,1x,15i5)
1365 103 format(31x,15i5)
1366 104 format(33x,
'(correlation coefficients in percent)')
1379 INTEGER,
PARAMETER :: istp=6
1387 INTEGER,
INTENT(IN) :: lun
1388 DOUBLE PRECISION,
INTENT(IN) :: v(*)
1389 INTEGER,
INTENT(IN) :: n
1399 WRITE(lun,102), i, ip+1-ips, (v(k),k=ip+1,min(ipn,ipe))
1406 101 format(1x,
'--- DBPRV -----------------------------------')
1407 102 format(1x,2i3,6g12.4)
1408 END SUBROUTINE dbprv
1428 REAL,
INTENT(IN OUT) :: a(*)
1429 INTEGER,
INTENT(IN) :: n
1450 IF(a(j) < a(j+1)) j=j+1
1463 END SUBROUTINE heapf
1475 parameter(nlev=2*32)
1487 INTEGER,
INTENT(IN OUT) :: a(*)
1488 INTEGER,
INTENT(IN) :: n
1495 10
IF(r-l == 1)
THEN
1496 IF(a(l) > a(r))
THEN
1515 IF(mod(l,2) == 1.AND.mod(r,2) == 1) lrh=lrh+1
1520 IF(a(i) < a1) go to 20
1522 IF(a(j) > a1) go to 30
1529 IF(lev+2 > nlev) stop
'SORT1K (quicksort): stack overflow'
1540 maxlev=max(maxlev,lev)
1555 parameter(nlev=2*32)
1568 INTEGER,
INTENT(IN OUT) :: a(2,*)
1569 INTEGER,
INTENT(IN) :: n
1575 10
IF(r-l == 1)
THEN
1576 IF(a(1,l) > a(1,r).OR.( a(1,l) == a(1,r).AND.a(2,l) > a(2,r)))
THEN
1588 WRITE(*,*)
'SORT2K (quicksort): maxlevel used/available =', maxlev,
'/64'
1597 IF(mod(l,2) == 1.AND.mod(r,2) == 1) lrh=lrh+1
1603 IF(a(1,i) < a1) go to 20
1604 IF(a(1,i) == a1.AND.a(2,i) < a2) go to 20
1606 IF(a(1,j) > a1) go to 30
1607 IF(a(1,j) == a1.AND.a(2,j) > a2) go to 30
1617 IF(lev+2 > nlev) stop
'SORT2K (quicksort): stack overflow'
1628 maxlev=max(maxlev,lev)
1644 INTEGER,
INTENT(IN) :: n
1645 INTEGER,
INTENT(IN) :: nd
1651 DATA sn/0.47523,1.690140,2.782170/
1652 DATA table/ 1.0000, 1.1479, 1.1753, 1.1798, 1.1775, 1.1730, 1.1680, 1.1630, &
1653 1.1581, 1.1536, 1.1493, 1.1454, 1.1417, 1.1383, 1.1351, 1.1321, &
1654 1.1293, 1.1266, 1.1242, 1.1218, 1.1196, 1.1175, 1.1155, 1.1136, &
1655 1.1119, 1.1101, 1.1085, 1.1070, 1.1055, 1.1040, &
1656 4.0000, 3.0900, 2.6750, 2.4290, 2.2628, 2.1415, 2.0481, 1.9736, &
1657 1.9124, 1.8610, 1.8171, 1.7791, 1.7457, 1.7161, 1.6897, 1.6658, &
1658 1.6442, 1.6246, 1.6065, 1.5899, 1.5745, 1.5603, 1.5470, 1.5346, &
1659 1.5230, 1.5120, 1.5017, 1.4920, 1.4829, 1.4742, &
1660 9.0000, 5.9146, 4.7184, 4.0628, 3.6410, 3.3436, 3.1209, 2.9468, &
1661 2.8063, 2.6902, 2.5922, 2.5082, 2.4352, 2.3711, 2.3143, 2.2635, &
1662 2.2178, 2.1764, 2.1386, 2.1040, 2.0722, 2.0428, 2.0155, 1.9901, &
1663 1.9665, 1.9443, 1.9235, 1.9040, 1.8855, 1.8681/
1673 chindl=(sn(m)+sqrt(float(nd+nd-1)))**2/float(nd+nd)
1720 DOUBLE PRECISION::diag
1722 INTEGER,
INTENT(IN) :: n
1723 DOUBLE PRECISION,
INTENT(IN OUT) :: c(*)
1724 INTEGER,
INTENT(IN) :: india(n)
1725 INTEGER,
INTENT(OUT) :: nrkd
1730 IF(c(india(1)) > 0.0)
THEN
1731 c(india(1))=1.0d0/sqrt(c(india(1)))
1738 mk=k-india(k)+india(k-1)+1
1741 IF(j > 1) mj=j-india(j)+india(j-1)+1
1747 c(kj)=c(kj) - c(india(k)-k+i)*c(india(j)-j+i)
1750 IF(j /= k) c(kj)=c(kj)*diag
1753 IF(diag+c(india(k)) > diag)
THEN
1754 c(india(k))=1.0d0/sqrt(c(india(k)))
1757 c(india(k)-k+j)=0.0d0
1789 INTEGER,
INTENT(IN) :: n
1790 DOUBLE PRECISION,
INTENT(IN) :: c(*)
1791 INTEGER,
INTENT(IN) :: india(n)
1792 DOUBLE PRECISION,
INTENT(IN OUT) :: x(n)
1794 x(1)=x(1)*c(india(1))
1796 DO j=k-india(k)+india(k-1)+1,k-1
1797 x(k)=x(k)-c(india(k)-k+j)*x(j)
1799 x(k)=x(k)*c(india(k))
1821 INTEGER,
INTENT(IN) :: n
1822 DOUBLE PRECISION,
INTENT(IN) :: c(*)
1823 INTEGER,
INTENT(IN) :: india(n)
1824 DOUBLE PRECISION,
INTENT(IN OUT) :: x(n)
1827 x(k)=x(k)*c(india(k))
1828 DO j=k-india(k)+india(k-1)+1,k-1
1829 x(j)=x(j)-c(india(k)-k+j)*x(k)
1832 x(1)=x(1)*c(india(1))
1860 INTEGER,
INTENT(IN) :: n
1861 INTEGER,
INTENT(IN) :: m
1862 DOUBLE PRECISION,
INTENT(IN OUT) :: c(*)
1863 INTEGER,
INTENT(IN OUT) :: india(n+m)
1864 INTEGER,
INTENT(OUT) :: nrkd
1865 INTEGER,
INTENT(OUT) :: nrkd2
1868 parameter(eps=2.22044605e-16)
1870 ntotal=n+n*m+(m*m+m)/2
1872 CALL
lltdec(n,c,india,nrkd)
1874 CALL
lltfwd(n,c,india,c(india(n)+(i-1)*n+1))
1883 c(jk)=c(jk)+c(india(n)+(j-1)*n+i)*c(india(n)+(k-1)*n+i)
1890 india(n+i)=india(n+i-1)+min(i,m)
1893 CALL
lltdec(m,c(india(n)+n*m+1),india(n+1),nrkd2)
1895 ntotal=n+n*m+(m*m+m)/2
1915 SUBROUTINE equslv(n,m,c,india,x) ! solution vector
1920 INTEGER,
INTENT(IN) :: n
1921 INTEGER,
INTENT(IN) :: m
1922 DOUBLE PRECISION,
INTENT(IN) :: c(*)
1923 INTEGER,
INTENT(IN) :: india(n+m)
1924 DOUBLE PRECISION,
INTENT(IN OUT) :: x(n+m)
1929 x(n+i)=x(n+i)-x(j)*c(india(n)+(i-1)*n+j)
1932 CALL
lltfwd(m,c(india(n)+n*m+1),india(n+1),x(n+1))
1935 CALL
lltbwd(m,c(india(n)+n*m+1),india(n+1),x(n+1))
1942 x(i)=x(i)-x(n+j)*c(india(n)+(j-1)*n+i)
1987 INTEGER,
INTENT(IN) :: p
1988 INTEGER,
INTENT(IN) :: n
1989 DOUBLE PRECISION,
INTENT(IN) :: c(n)
1990 DOUBLE PRECISION,
INTENT(OUT) :: cu(n)
1991 DOUBLE PRECISION,
INTENT(IN OUT) :: a(n,p)
1992 DOUBLE PRECISION,
INTENT(OUT) :: s((p*p+p)/2)
1994 DOUBLE PRECISION :: div
1995 DOUBLE PRECISION :: ratio
2003 IF (div > 0.0d0)
THEN
2004 cu(i)=1.0d0/dsqrt(div)
2012 s(jk)=s(jk)+a(i,j)*a(i,k)
2020 IF(s(ii) /= 0.0d0) s(ii)=1.0d0/s(ii)
2026 s(kk+j)=s(kk+j)-s(kk+i)*ratio
2054 INTEGER,
INTENT(IN) :: p
2055 INTEGER,
INTENT(IN) :: n
2057 DOUBLE PRECISION,
INTENT(IN) :: cu(n)
2058 DOUBLE PRECISION,
INTENT(IN) :: a(n,p)
2059 DOUBLE PRECISION,
INTENT(IN) :: s((p*p+p)/2)
2060 DOUBLE PRECISION,
INTENT(OUT) :: x(n+p)
2061 DOUBLE PRECISION,
INTENT(IN) :: y(n+p)
2063 DOUBLE PRECISION :: dsum
2071 x(n+j)=x(n+j)-a(i,j)*x(i)
2079 dsum=dsum-s(k+jj)*x(n+k)
2089 dsum=dsum+s(kk+j)*x(n+k)
2098 x(i)=x(i)-a(i,j)*x(n+j)
2153 SUBROUTINE sqmibb(v,b,n,nbdr,nbnd,inv,nrank,vbnd,vbdr,aux,vbk,vzru,scdiag,scflag)
2180 DOUBLE PRECISION,
INTENT(IN OUT) :: v(*)
2181 DOUBLE PRECISION,
INTENT(OUT) :: b(n)
2182 INTEGER,
INTENT(IN) :: n
2183 INTEGER,
INTENT(IN) :: nbdr
2184 INTEGER,
INTENT(IN) :: nbnd
2185 INTEGER,
INTENT(IN) :: inv
2186 INTEGER,
INTENT(OUT) :: nrank
2188 DOUBLE PRECISION,
INTENT(OUT) :: vbnd(n*(nbnd+1))
2189 DOUBLE PRECISION,
INTENT(OUT) :: vbdr(n*nbdr)
2190 DOUBLE PRECISION,
INTENT(OUT) :: aux(n*nbdr)
2191 DOUBLE PRECISION,
INTENT(OUT) :: vbk((nbdr*nbdr+nbdr)/2)
2192 DOUBLE PRECISION,
INTENT(OUT) :: vzru(nbdr)
2193 DOUBLE PRECISION,
INTENT(OUT) :: scdiag(nbdr)
2194 INTEGER,
INTENT(OUT) :: scflag(nbdr)
2207 DO j=i,min(n,i+nbnd)
2211 vbnd(ib+(i-nb1)*mp1)=v(ip)
2229 CALL
dbcdec(vbnd,mp1,nmb,aux)
2234 IF (vbnd(ip) <= 0.0d0)
THEN
2237 IF (vbnd(ip) == 0.0d0)
THEN
2238 print *,
' SQMIBB matrix singular', n, nbdr, nbnd
2240 print *,
' SQMIBB matrix not positive definite', n, nbdr, nbnd
2258 CALL dbcslv(vbnd,mp1,nmb,b,b)
2261 CALL dbcinv(vbnd,mp1,nmb,v)
2263 CALL dbcinb(vbnd,mp1,nmb,v)
2272 CALL dbcslv(vbnd,mp1,nmb,vbdr(ioff),aux(ioff))
2276 vzru(ib)=vzru(ib)-b(nb1+i)*aux(ioff+i)
2281 CALL dbcslv(vbnd,mp1,nmb,b(nb1),b(nb1))
2291 vbk(ip)=vbk(ip)-vbdr(ioff+i)*aux(joff+i)
2298 CALL
sqminv(vbk,vzru,nbdr,nrankb,scdiag,scflag)
2299 IF (nrankb == nbdr)
THEN
2303 IF (npri >= 0) print *,
' SQMIBB undef border ', n, nbdr, nbnd, nrankb
2307 DO ip=(nbdr*nbdr+nbdr)/2,1,-1
2316 b(nb1+i)=b(nb1+i)-b(ib)*aux(ioff+i)
2323 CALL dbcinv(vbnd,mp1,nmb,v)
2325 CALL dbcinb(vbnd,mp1,nmb,v)
2332 IF (inv == 1) j0=max(0,i-nbnd)
2340 ij=(ij*ij-ij)/2+min(ib,jb)
2341 v(ip2)=v(ip2)+vbk(ij)*aux(ioff+i)*aux(joff+j)
2357 ij=(ij*ij-ij)/2+min(ib,jb)
2358 v(ip2)=v(ip2)-vbk(ij)*aux(i+joff)
2365 DO ip=(nbdr*nbdr+nbdr)/2,1,-1