58 SUBROUTINE sqminv(v,b,n,nrank,diag,next)
73 DOUBLE PRECISION,
INTENT(IN OUT) :: v(*)
74 DOUBLE PRECISION,
INTENT(OUT) :: b(n)
75 INTEGER,
INTENT(IN) :: n
76 INTEGER,
INTENT(OUT) :: nrank
77 DOUBLE PRECISION,
INTENT(OUT) :: diag(n)
78 INTEGER,
INTENT(OUT) :: next(n)
80 DOUBLE PRECISION :: vkk
81 DOUBLE PRECISION ::vjk
83 DOUBLE PRECISION,
PARAMETER :: eps=1.0d-10
88 diag(i)=abs(v((i*i+i)/2))
101 IF(abs(v(jj)) > max(abs(vkk),eps*diag(j)))
THEN
148 v(jl)=v(jl)-v(lk)*vjk
155 IF(next(k) /= 0)
THEN
158 IF(next(j) /= 0) v((k*k-k)/2+j)=0.0d0
185 INTEGER,
INTENT(IN) :: n
186 DOUBLE PRECISION,
INTENT(OUT) :: diag(n)
187 DOUBLE PRECISION,
INTENT(OUT) :: u(n,n)
188 DOUBLE PRECISION,
INTENT(IN) :: v(*)
189 DOUBLE PRECISION,
INTENT(OUT) :: work(n)
190 INTEGER,
INTENT(OUT) :: iwork(n)
192 INTEGER,
PARAMETER :: itmax=30
193 DOUBLE PRECISION,
PARAMETER :: tol=1.0d-16
194 DOUBLE PRECISION,
PARAMETER :: eps=1.0d-16
196 DOUBLE PRECISION :: f
197 DOUBLE PRECISION :: g
198 DOUBLE PRECISION :: h
199 DOUBLE PRECISION :: sh
200 DOUBLE PRECISION :: hh
201 DOUBLE PRECISION :: b
202 DOUBLE PRECISION :: p
203 DOUBLE PRECISION :: r
204 DOUBLE PRECISION :: s
205 DOUBLE PRECISION :: c
206 DOUBLE PRECISION :: workd
231 IF(abs(u(i,k)) > tol) g=g+u(i,k)*u(i,k)
241 IF(f >= 0.0d0) sh=-sh
252 IF(abs(u(j,k)) > tol.AND.abs(u(i,k)) > tol)
THEN
257 IF(abs(u(k,j)) > tol.AND.abs(u(i,k)) > tol)
THEN
272 u(j,k)=u(j,k)-f*work(k)-g*u(i,k)
284 IF(diag(i) /= 0.0)
THEN
291 u(k,j)=u(k,j)-g*u(k,i)
313 h=eps*(abs(diag(l))+abs(work(l)))
316 IF(abs(work(m)) <= b) go to 10
319 10
IF(m == l) go to 30
321 20
IF(j == itmax)
THEN
322 WRITE(*,*)
'DEVROT: Iteration limit reached'
327 p=(diag(l+1)-g)/(2.0d0*work(l))
330 IF(p < 0.0d0) diag(l)=diag(l)/(p-r)
331 IF(p >= 0.0d0) diag(l)=diag(l)/(p+r)
344 IF(abs(p) >= abs(work(i)))
THEN
353 work(i+1)=s*work(i)*r
358 diag(i+1)=h+s*(c*g+s*diag(i))
362 u(k,i+1)=s*u(k,i)+c*h
368 IF(abs(work(l)) > b) go to 20
381 60
IF(diag(iwork(l+m)) > diag(iwork(l)))
THEN
392 IF(iwork(i) /= i)
THEN
433 DOUBLE PRECISION,
INTENT(IN) :: a(*)
434 DOUBLE PRECISION,
INTENT(IN) :: x(*)
435 DOUBLE PRECISION,
INTENT(OUT) :: y(*)
436 INTEGER,
INTENT(IN) :: m
437 INTEGER,
INTENT(IN) :: n
476 DOUBLE PRECISION,
INTENT(IN) :: v(*)
477 DOUBLE PRECISION,
INTENT(IN) :: a(*)
478 DOUBLE PRECISION,
INTENT(OUT) :: w(*)
479 INTEGER,
INTENT(IN) :: n
480 INTEGER,
INTENT(IN) :: m
482 DOUBLE PRECISION :: cik
500 cik=cik+a(il+l)*v(lk)
504 cik=cik+a(il+l)*v(lk)
510 w(ij)=w(ij)+cik*a(jk)
557 SUBROUTINE sqmibb(v,b,n,nbdr,nbnd,inv,nrank)
566 USE gbltraj, ONLY: maxFitPar, maxBandWidth, maxBorderSize
586 DOUBLE PRECISION,
INTENT(IN OUT) :: v(*)
587 DOUBLE PRECISION,
INTENT(OUT) :: b(n)
588 INTEGER,
INTENT(IN) :: n
589 INTEGER,
INTENT(IN) :: nbdr
590 INTEGER,
INTENT(IN) :: nbnd
591 INTEGER,
INTENT(IN) :: inv
592 INTEGER,
INTENT(OUT) :: nrank
594 DOUBLE PRECISION :: vbnd(maxfitpar*(maxbandwidth+1))
595 DOUBLE PRECISION :: vbdr(maxfitpar*maxbordersize)
596 DOUBLE PRECISION :: aux(maxfitpar*maxbordersize)
597 DOUBLE PRECISION :: vbk((maxbordersize*maxbordersize+maxbordersize)/2)
598 DOUBLE PRECISION :: vzru(maxbordersize)
599 DOUBLE PRECISION ::scdiag(maxbordersize)
600 INTEGER :: scflag(maxbordersize)
617 vbnd(ib+(i-nb1)*mp1)=v(ip)
635 CALL
dbcdec(vbnd,mp1,nmb,aux)
640 IF (vbnd(ip) <= 0.0d0)
THEN
643 IF (vbnd(ip) == 0.0d0)
THEN
644 print *,
' SQMIBB matrix singular', n, nbdr, nbnd
646 print *,
' SQMIBB matrix not positive definite', n, nbdr, nbnd
664 CALL dbcslv(vbnd,mp1,nmb,b,b)
667 CALL dbcinv(vbnd,mp1,nmb,v)
669 CALL dbcinb(vbnd,mp1,nmb,v)
678 CALL dbcslv(vbnd,mp1,nmb,vbdr(ioff),aux(ioff))
682 vzru(ib)=vzru(ib)-b(nb1+i)*aux(ioff+i)
687 CALL dbcslv(vbnd,mp1,nmb,b(nb1),b(nb1))
697 vbk(ip)=vbk(ip)-vbdr(ioff+i)*aux(joff+i)
704 CALL
sqminv(vbk,vzru,nbdr,nrankb,scdiag,scflag)
705 IF (nrankb == nbdr)
THEN
709 IF (npri >= 0) print *,
' SQMIBB undef border ', n, nbdr, nbnd, nrankb
713 DO ip=(nbdr*nbdr+nbdr)/2,1,-1
722 b(nb1+i)=b(nb1+i)-b(ib)*aux(ioff+i)
729 CALL dbcinv(vbnd,mp1,nmb,v)
731 CALL dbcinb(vbnd,mp1,nmb,v)
738 IF (inv == 1) j0=max(0,i-nbnd)
746 ij=(ij*ij-ij)/2+min(ib,jb)
747 v(ip2)=v(ip2)+vbk(ij)*aux(ioff+i)*aux(joff+j)
763 ij=(ij*ij-ij)/2+min(ib,jb)
764 v(ip2)=v(ip2)-vbk(ij)*aux(i+joff)
771 DO ip=(nbdr*nbdr+nbdr)/2,1,-1
797 INTEGER,
INTENT(IN OUT) :: lun
798 DOUBLE PRECISION,
INTENT(IN OUT) :: v(*)
799 INTEGER,
INTENT(IN) :: n
801 INTEGER,
PARAMETER :: istp=6
811 WRITE(lun,102), i, ip+1-ips, (v(k),k=ip+1,min(ipn,ipe))
818 101 format(1x,
'--- DBPRV -----------------------------------')
819 102 format(1x,2i3,6g12.4)