Millepede-II  V04-00-00
 All Classes Files Functions Variables Enumerator
Dbandmatrix.f90
Go to the documentation of this file.
00001 
00002 ! Code converted using TO_F90 by Alan Miller
00003 ! Date: 2012-04-18  Time: 19:56:08
00004 
00213 
00214 
00215 !     (1) Symmetric matrix W: decomposition, solution, inverse
00216 
00225 
00226 SUBROUTINE dchdec(w,n, aux)
00227     implicit none
00228     integer :: i
00229     integer :: ii
00230     integer :: j
00231     integer :: jj
00232     integer :: k
00233     integer :: kk
00234     integer :: l
00235     integer :: m
00236 
00237 
00238     DOUBLE PRECISION, INTENT(IN OUT)         :: w(*)
00239     INTEGER, INTENT(IN)                      :: n
00240     DOUBLE PRECISION, INTENT(OUT)            :: aux(n)
00241 
00242     DOUBLE PRECISION :: b(*),x(*),v(*),suma,ratio
00243     !     ...
00244     DO i=1,n
00245         aux(i)=16.0D0*w((i*i+i)/2) ! save diagonal elements
00246     END DO
00247     ii=0
00248     DO i=1,n
00249         ii=ii+i
00250         IF(w(ii)+aux(i) /= aux(i)) THEN     ! GT
00251             w(ii)=1.0D0/w(ii)                ! (I,I) div !
00252         ELSE
00253             w(ii)=0.0D0
00254         END IF
00255         jj=ii
00256         DO j=i+1,n
00257             ratio=w(i+jj)*w(ii)              ! (I,J) (I,I)
00258             kk=jj
00259             DO k=j,n
00260                 w(kk+j)=w(kk+j)-w(kk+i)*ratio   ! (K,J) (K,I)
00261                 kk=kk+k
00262             END DO ! K
00263             w(i+jj)=ratio                    ! (I,J)
00264             jj=jj+j
00265         END DO ! J
00266     END DO ! I
00267 
00268 
00269     RETURN
00270 
00271     ENTRY dchslv(w,n,b, x)       ! solution B -> X
00272     WRITE(*,*) 'before copy'
00273     DO i=1,n
00274         x(i)=b(i)
00275     END DO
00276     WRITE(*,*) 'after copy'
00277     ii=0
00278     DO i=1,n
00279         suma=x(i)
00280         DO k=1,i-1
00281             suma=suma-w(k+ii)*x(k)             ! (K,I)
00282         END DO
00283         x(i)=suma
00284         ii=ii+i
00285     END DO
00286     WRITE(*,*) 'after forward'
00287     DO i=n,1,-1
00288         suma=x(i)*w(ii)                    ! (I,I)
00289         kk=ii
00290         DO k=i+1,n
00291             suma=suma-w(kk+i)*x(k)             ! (K,I)
00292             kk=kk+k
00293         END DO
00294         x(i)=suma
00295         ii=ii-i
00296     END DO
00297     WRITE(*,*) 'after backward'
00298     RETURN
00299 
00300     ENTRY dchinv(w,n,v)         ! inversion
00301     ii=(n*n-n)/2
00302     DO i=n,1,-1
00303         suma=w(ii+i)                       ! (I,I)
00304         DO j=i,1,-1
00305             DO k=j+1,n
00306                 l=MIN(i,k)
00307                 m=MAX(i,k)
00308                 suma=suma-w(j+(k*k-k)/2)*v(l+(m*m-m)/2) ! (J,K) (I,K)
00309             END DO
00310             v(ii+j)=suma                      ! (I,J)
00311             suma=0.0D0
00312         END DO
00313         ii=ii-i+1
00314     END DO
00315 END SUBROUTINE dchdec
00316 
00323 
00324 REAL FUNCTION condes(w,n,aux)
00325     implicit none
00326     real :: cond
00327     integer :: i
00328     integer :: ir
00329     integer :: is
00330     integer :: k
00331     integer :: kk
00332     real :: xla1
00333     real :: xlan
00334 
00335 
00336     DOUBLE PRECISION, INTENT(IN)             :: w(*)
00337     INTEGER, INTENT(IN)                      :: n
00338     DOUBLE PRECISION, INTENT(IN OUT)         :: aux(n)
00339 
00340     DOUBLE PRECISION :: suma,sumu,sums
00341 
00342     ir=1
00343     is=1
00344     DO i=1,n
00345         IF(w((i*i+i)/2) < w((is*is+is)/2)) is=i ! largest Dii
00346         IF(w((i*i+i)/2) > w((ir*ir+ir)/2)) ir=i ! smallest Dii
00347     END DO
00348 
00349     sumu=0.0     ! find smallest eigenvalue
00350     sums=0.0
00351     DO i=n,1,-1  ! backward
00352         suma=0.0
00353         IF(i == ir) suma=1.0D0
00354         kk=(i*i+i)/2
00355         DO k=i+1,n
00356             suma=suma-w(kk+i)*aux(k)             ! (K,I)
00357             kk=kk+k
00358         END DO
00359         aux(i)=suma
00360         sumu=sumu+aux(i)*aux(i)
00361     END DO
00362     xlan=SNGL(w((ir*ir+ir)/2)*DSQRT(sumu))
00363     IF(xlan /= 0.0) xlan=1.0/xlan
00364 
00365     DO i=1,n
00366         IF(i == is) THEN
00367             sums=1.0D0
00368         ELSE IF(i > is) THEN
00369             sums=sums+w(is+(i*i-i)/2)**2
00370         END IF
00371     END DO       ! is Ws
00372     xla1=0.0
00373     IF(w((is*is+is)/2) /= 0.0) xla1=SNGL(DSQRT(sums)/w((is*is+is)/2))
00374 
00375     cond=0.0
00376     IF(xla1 > 0.0.AND.xlan > 0.0) cond=xla1/xlan
00377     !     estimated condition
00378     condes=cond
00379 END FUNCTION condes
00380 
00381 
00382 !     (2) Symmetric band matrix: decomposition, solution, complete
00383 !                                inverse and band part of the inverse
00395 
00396 SUBROUTINE dbcdec(w,mp1,n, aux)  ! decomposition, bandwidth M
00397     implicit none
00398     integer :: i
00399     integer :: j
00400     integer :: k
00401     !     M=MP1-1                                    N*M(M-1) dot operations
00402 
00403     DOUBLE PRECISION, INTENT(IN OUT)         :: w(mp1,n)
00404     INTEGER, INTENT(IN)                      :: mp1
00405     INTEGER, INTENT(IN)                      :: n
00406     DOUBLE PRECISION, INTENT(OUT)            :: aux(n)
00407     ! decompos
00408     DOUBLE PRECISION :: v(mp1,n),b(n),x(n), vs(*),rxw
00409     !     ...
00410     DO i=1,n
00411         aux(i)=16.0D0*w(1,i) ! save diagonal elements
00412     END DO
00413     DO i=1,n
00414         IF(w(1,i)+aux(i) /= aux(i)) THEN
00415             w(1,i)=1.0/w(1,i)
00416         ELSE
00417             w(1,i)=0.0D0  ! singular
00418         END IF
00419         DO j=1,MIN(mp1-1,n-i)
00420             rxw=w(j+1,i)*w(1,i)
00421             DO k=1,MIN(mp1-1,n-i)+1-j
00422                 w(k,i+j)=w(k,i+j)-w(k+j,i)*rxw
00423             END DO
00424             w(j+1,i)=rxw
00425         END DO
00426     END DO
00427     RETURN
00428 
00429     ENTRY dbcslv(w,mp1,n,b, x)  ! solution B -> X
00430     !                                                N*(2M-1) dot operations
00431     DO i=1,n
00432         x(i)=b(i)
00433     END DO
00434     DO i=1,n ! forward substitution
00435         DO j=1,MIN(mp1-1,n-i)
00436             x(j+i)=x(j+i)-w(j+1,i)*x(i)
00437         END DO
00438     END DO
00439     DO i=n,1,-1 ! backward substitution
00440         rxw=x(i)*w(1,i)
00441         DO j=1,MIN(mp1-1,n-i)
00442             rxw=rxw-w(j+1,i)*x(j+i)
00443         END DO
00444         x(i)=rxw
00445     END DO
00446     RETURN
00447 
00448     ENTRY dbciel(w,mp1,n, v)    ! V = inverse band matrix elements
00449     !                                               N*M*(M-1) dot operations
00450     DO i=n,1,-1
00451         rxw=w(1,i)
00452         DO j=i,MAX(1,i-mp1+1),-1
00453             DO k=j+1,MIN(n,j+mp1-1)
00454                 rxw=rxw-v(1+ABS(i-k),MIN(i,k))*w(1+k-j,j)
00455             END DO
00456             v(1+i-j,j)=rxw
00457             rxw=0.0
00458         END DO
00459     END DO
00460     RETURN
00461 
00462     ENTRY dbcinb(w,mp1,n, vs)   ! VS = band part of inverse symmetric matrix
00463     !                                             N*M*(M-1) dot operations
00464     DO i=n,1,-1
00465         rxw=w(1,i)
00466         DO j=i,MAX(1,i-mp1+1),-1
00467             DO k=j+1,MIN(n,j+mp1-1)
00468                 rxw=rxw-vs((MAX(i,k)*(MAX(i,k)-1))/2+MIN(i,k))*w(1+k-j,j)
00469             END DO
00470             vs((i*i-i)/2+j)=rxw
00471             rxw=0.0
00472         END DO
00473     !       DO J=MAX(1,I-MP1+1)-1,1,-1
00474     !        VS((I*I-I)/2+J)=0.0
00475     !       END DO
00476     END DO
00477     RETURN
00478 
00479     ENTRY dbcinv(w,mp1,n, vs)   ! V = inverse symmetric matrix
00480     !                                             N*N/2*(M-1) dot operations
00481     DO i=n,1,-1
00482         rxw=w(1,i)
00483         DO j=i,1,-1
00484             DO k=j+1,MIN(n,j+mp1-1)
00485                 rxw=rxw-vs((MAX(i,k)*(MAX(i,k)-1))/2+MIN(i,k))*w(1+k-j,j)
00486             END DO
00487             vs((i*i-i)/2+j)=rxw
00488             rxw=0.0
00489         END DO
00490     END DO
00491     RETURN
00492 END SUBROUTINE dbcdec
00493 
00500 
00501 SUBROUTINE dbcprv(w,mp1,n,b)
00502     implicit none
00503     integer :: i
00504     integer :: j
00505     integer :: nj
00506     real :: rho
00507 
00508 
00509     DOUBLE PRECISION, INTENT(IN OUT)         :: w(mp1,n)
00510     INTEGER, INTENT(IN)                      :: mp1
00511     INTEGER, INTENT(IN)                      :: n
00512     DOUBLE PRECISION, INTENT(OUT)            :: b(n)
00513 
00514     DOUBLE PRECISION :: ERR
00515     INTEGER :: irho(5)
00516     !     ...
00517     WRITE(*,*) ' '
00518     WRITE(*,101)
00519 
00520     DO i=1,n
00521         ERR=DSQRT(w(1,i))
00522         nj=0
00523         DO j=2,mp1
00524             IF(i+1-j > 0.AND.nj < 5) THEN
00525                 nj=nj+1
00526                 rho=SNGL(w(j,i+1-j)/(ERR*DSQRT(w(1,i+1-j))))
00527                 irho(nj)=IFIX(100.0*ABS(rho)+0.5)
00528                 IF(rho < 0.0) irho(nj)=-irho(nj)
00529             END IF
00530         END DO
00531         WRITE(*,102) i,b(i),ERR,(irho(j),j=1,nj)
00532     END DO
00533     WRITE(*,103)
00534 101 FORMAT(5X,'i   Param',7X,'error',7X,'  c(i,i-1) c(i,i-2)'/)
00535 102 FORMAT(1X,i5,2G12.4,1X,5I9)
00536 103 FORMAT(33X,'(correlation coefficients in percent)')
00537 END SUBROUTINE dbcprv
00538 
00544 
00545 SUBROUTINE dbcprb(w,mp1,n)
00546     implicit none
00547     integer :: i
00548     integer :: j
00549 
00550 
00551     DOUBLE PRECISION, INTENT(IN OUT)         :: w(mp1,n)
00552     INTEGER, INTENT(IN)                      :: mp1
00553     INTEGER, INTENT(IN)                      :: n
00554 
00555 
00556     !     ...
00557     IF(mp1 > 6) RETURN
00558     WRITE(*,*) ' '
00559     WRITE(*,101)
00560     DO i=1,n
00561         WRITE(*,102) i,(w(j,i),j=1,mp1)
00562     END DO
00563     WRITE(*,*) ' '
00564 101 FORMAT(5X,'i   Diag  ')
00565 102 FORMAT(1X,i5,6G12.4)
00566 END SUBROUTINE dbcprb
00567 
00568 
00569 !     (3) Symmetric band matrix of band width m=1: decomposition,
00570 !            solution, complete, inverse and band part of the inverse
00571 
00592 
00593 SUBROUTINE db2dec(w,n, aux)
00594     implicit none
00595     integer :: i
00596 
00597 
00598     DOUBLE PRECISION, INTENT(IN OUT)         :: w(2,n)
00599     INTEGER, INTENT(IN OUT)                  :: n
00600     DOUBLE PRECISION, INTENT(OUT)            :: aux(n)
00601 
00602     DOUBLE PRECISION :: v(2,n),b(n),x(n), rxw
00603 
00604     DO i=1,n
00605         aux(i)=16.0D0*w(1,i) ! save diagonal elements
00606     END DO
00607     DO i=1,n-1
00608         IF(w(1,i)+aux(i) /= aux(i)) THEN
00609             w(1,i)=1.0D0/w(1,i)
00610             rxw=w(2,i)*w(1,i)
00611             w(1,i+1)=w(1,i+1)-w(2,i)*rxw
00612             w(2,i)=rxw
00613         ELSE ! singular
00614             w(1,i)=0.0D0
00615             w(2,i)=0.0D0
00616         END IF
00617     END DO
00618     IF(w(1,n)+aux(n) > aux(n)) THEN           ! N
00619         w(1,n)=1.0D0/w(1,n)
00620     ELSE ! singular
00621         w(1,n)=0.0D0
00622     END IF
00623     RETURN
00624 
00625     ENTRY db2slv(w,n,b, x)      ! solution B -> X
00626     !     The equation W(original)*X=B is solved for X; input is B in vector X.
00627     DO i=1,n
00628         x(i)=b(i)
00629     END DO
00630     DO i=1,n-1           ! by forward substitution
00631         x(i+1)=x(i+1)-w(2,i)*x(i)
00632     END DO
00633     x(n)=x(n)*w(1,n)     ! and backward substitution
00634     DO i=n-1,1,-1
00635         x(i)=x(i)*w(1,i)-w(2,i)*x(i+1)
00636     END DO
00637     RETURN
00638 
00639     ENTRY db2iel(w,n, v)        ! V = inverse band matrix elements
00640     !     The band elements of the inverse of W(original) are calculated,
00641     !     and stored in V in the same order as in W.
00642     !     Remaining elements of the inverse are not calculated.
00643     v(1,n  )= w(1,n)
00644     v(2,n-1)=-v(1,n  )*w(2,n-1)
00645     DO i=n-1,3,-1
00646         v(1,i  )= w(1,i  )-v(2,i  )*w(2,i  )
00647         v(2,i-1)=-v(1,i  )*w(2,i-1)
00648     END DO
00649     v(1,2)= w(1,2)-v(2,2)*w(2,2)
00650     v(2,1)=-v(1,2)*w(2,1)
00651     v(1,1)= w(1,1)-v(2,1)*w(2,1)
00652 END SUBROUTINE db2dec
00653 
00654 
00655 !     (4) Symmetric band matrix of band width m=2: decomposition,
00656 !            solution, complete, inverse and band part of the inverse
00657 
00678 
00679 SUBROUTINE db3dec(w,n, aux)      ! decomposition (M=2)
00680     implicit none
00681     integer :: i
00682 
00683 
00684     DOUBLE PRECISION, INTENT(IN OUT)         :: w(3,n)
00685     INTEGER, INTENT(IN OUT)                  :: n
00686     DOUBLE PRECISION, INTENT(OUT)            :: aux(n)
00687     ! decompos
00688 
00689     DOUBLE PRECISION :: v(3,n),b(n),x(n), rxw
00690 
00691     DO i=1,n
00692         aux(i)=16.0D0*w(1,i) ! save diagonal elements
00693     END DO
00694     DO i=1,n-2
00695         IF(w(1,i)+aux(i) /= aux(i)) THEN
00696             w(1,i)=1.0D0/w(1,i)
00697             rxw=w(2,i)*w(1,i)
00698             w(1,i+1)=w(1,i+1)-w(2,i)*rxw
00699             w(2,i+1)=w(2,i+1)-w(3,i)*rxw
00700             w(2,i)=rxw
00701             rxw=w(3,i)*w(1,i)
00702             w(1,i+2)=w(1,i+2)-w(3,i)*rxw
00703             w(3,i)=rxw
00704         ELSE ! singular
00705             w(1,i)=0.0D0
00706             w(2,i)=0.0D0
00707             w(3,i)=0.0D0
00708         END IF
00709     END DO
00710     IF(w(1,n-1)+aux(n-1) > aux(n-1)) THEN
00711         w(1,n-1)=1.0D0/w(1,n-1)
00712         rxw=w(2,n-1)*w(1,n-1)
00713         w(1,n)=w(1,n)-w(2,n-1)*rxw
00714         w(2,n-1)=rxw
00715     ELSE ! singular
00716         w(1,n-1)=0.0D0
00717         w(2,n-1)=0.0D0
00718     END IF
00719     IF(w(1,n)+aux(n) > aux(n)) THEN
00720         w(1,n)=1.0D0/w(1,n)
00721     ELSE ! singular
00722         w(1,n)=0.0D0
00723     END IF
00724     RETURN
00725 
00726     ENTRY db3slv(w,n,b, x)      ! solution B -> X
00727     DO i=1,n
00728         x(i)=b(i)
00729     END DO
00730     DO i=1,n-2           ! by forward substitution
00731         x(i+1)=x(i+1)-w(2,i)*x(i)
00732         x(i+2)=x(i+2)-w(3,i)*x(i)
00733     END DO
00734     x(n)=x(n)-w(2,n-1)*x(n-1)
00735     x(n)=x(n)*w(1,n)     ! and backward substitution
00736     x(n-1)=x(n-1)*w(1,n-1)-w(2,n-1)*x(n)
00737     DO i=n-2,1,-1
00738         x(i)=x(i)*w(1,i)-w(2,i)*x(i+1)-w(3,i)*x(i+2)
00739     END DO
00740     RETURN
00741 
00742     ENTRY db3iel(w,n, v)        ! V = inverse band matrix elements
00743     !     The band elements of the inverse of W(original) are calculated,
00744     !     and stored in V in the same order as in W.
00745     !     Remaining elements of the inverse are not calculated.
00746     v(1,n  )= w(1,n)
00747     v(2,n-1)=-v(1,n  )*w(2,n-1)
00748     v(3,n-2)=-v(2,n-1)*w(2,n-2)-v(1,n  )*w(3,n-2)
00749     v(1,n-1)= w(1,n-1) -v(2,n-1)*w(2,n-1)
00750     v(2,n-2)=-v(1,n-1)*w(2,n-2)-v(2,n-1)*w(3,n-2)
00751     v(3,n-3)=-v(2,n-2)*w(2,n-3)-v(1,n-1)*w(3,n-3)
00752     DO i=n-2,3,-1
00753         v(1,i  )= w(1,i  ) -v(2,i  )*w(2,i  )-v(3,i)*w(3,i  )
00754         v(2,i-1)=-v(1,i  )*w(2,i-1)-v(2,i)*w(3,i-1)
00755         v(3,i-2)=-v(2,i-1)*w(2,i-2)-v(1,i)*w(3,i-2)
00756     END DO
00757     v(1,2)= w(1,2) -v(2,2)*w(2,2)-v(3,2)*w(3,2)
00758     v(2,1)=-v(1,2)*w(2,1)-v(2,2)*w(3,1)
00759     v(1,1)= w(1,1) -v(2,1)*w(2,1)-v(3,1)*w(3,1)
00760 END SUBROUTINE db3dec
00761 
00762 
00763 !     (5) Symmetric matrix with band structure, bordered by full row/col
00764 !          - is not yet included -
00765 
00766 !      SUBROUTINE BSOLV1(N,CU,RU,CK,RK,CH,     BK,UH,   AU) ! 1
00767 !     Input:  CU = 3*N array         replaced by decomposition
00768 !             RU   N array rhs
00769 !             CK   diagonal element
00770 !             RK   rhs
00771 !             CH   N-vector
00772 
00773 !     Aux:    AU   N-vector auxliliary array
00774 
00775 !     Result: FK   curvature
00776 !             BK   variance
00777 !             UH   smoothed data points
00778 
00779 
00780 !      DOUBLE PRECISION CU(3,N),CI(3,N),CK,BK,AU(N),UH(N)
00781 !     ...
00782 !      CALL BDADEC(CU,3,N, AU)    ! decomposition
00783 !      CALL DBASLV(CU,3,N, RU,UH)  ! solve for zero curvature
00784 !      CALL DBASLV(CU,3,N, CH,AU)  ! solve for aux. vector
00785 !      CTZ=0.0D0
00786 !      ZRU=0.0D0
00787 !      DO I=1,N
00788 !       CTZ=CTZ+CH(I)*AU(I)        ! cT z
00789 !       ZRU=ZRU+RY(I)*AU(I)        ! zT ru
00790 !      END DO
00791 !      BK=1.0D0/(CK-CTZ)           ! variance of curvature
00792 !      FK=BK   *(RK-ZRU)           ! curvature
00793 !      DO I=1,N
00794 !       UH(I)=UH(I)-FK*AU(I)       ! smoothed data points
00795 !      END DO
00796 !      RETURN
00797 
00798 !      ENTRY BINV1(N,CU,CI, FK,AU)
00799 !      DOUBLE PRECISION CI(3,N)
00800 !     ...
00801 !      CALL DBAIBM(CU,3,N, CI)           ! block part of inverse
00802 !      DO I=1,N
00803 !       CI(1,I)=CI(1,I)+FK*AU(I)*AU(I)   ! diagonal elements
00804 !       IF(I.LT.N) CI(2,I)=CI(2,I)+FK*AU(I)*AU(I+1) ! next diagonal
00805 !       IF(I.LT.N-1) CI(3,I)=CI(3,I)+FK*AU(I)*AU(I+2) ! next diagonal
00806 !      END DO
00807 
00808 !      END
00809 
00818 
00819 SUBROUTINE dcfdec(w,n)
00820 
00821     IMPLICIT NONE
00822     DOUBLE PRECISION, INTENT(OUT)            :: w(*)
00823     INTEGER, INTENT(IN)                      :: n
00824     INTEGER :: i,j,k
00825     DOUBLE PRECISION :: epsm,gamm,xchi,beta,delta,theta
00826 
00827     epsm=2.2D-16 ! machine precision
00828     gamm=0.0D0   ! max diagonal element
00829     xchi=0.0D0   ! max off-diagonal element
00830     DO k=1,n
00831         gamm=MAX(gamm,ABS(w((k*k+k)/2)))
00832         DO j=k+1,n
00833             xchi=MAX(xchi,ABS(w((j*j-j)/2+k)))
00834         END DO
00835     END DO
00836     beta=SQRT(MAX(gamm,xchi/MAX(1.0D0,SQRT(dfloat(n*n-1))),epsm))
00837     delta=epsm*MAX(1.0D0,gamm+xchi)
00838 
00839     DO k=1,n
00840         DO i=1,k-1
00841             w((k*k-k)/2+i)=w((k*k-k)/2+i)*w((i*i+i)/2)
00842         END DO
00843         DO j=k+1,n
00844             DO i=1,k-1
00845                 w((j*j-j)/2+k)=w((j*j-j)/2+k)-w((k*k-k)/2+i)*w((j*j-j)/2+i)
00846             END DO
00847         END DO
00848         theta=0.0D0
00849         DO j=k+1,n
00850             theta=MAX(theta,ABS(w((j*j-j)/2+k)))
00851         END DO
00852         w((k*k+k)/2)=1.0D0/MAX(ABS(w((k*k+k)/2)),(theta/beta)**2,delta)
00853         DO j=k+1,n
00854             w((j*j+j)/2)=w((j*j+j)/2)-w((j*j-j)/2+k)**2*w((k*k+k)/2)
00855         END DO
00856     END DO ! K
00857 
00858 END SUBROUTINE dcfdec
00859 
00869 
00870 SUBROUTINE dbfdec(w,mp1,n)
00871 
00872     IMPLICIT NONE
00873     DOUBLE PRECISION, INTENT(OUT)            :: w(mp1,n)
00874     INTEGER, INTENT(IN OUT)                  :: mp1
00875     INTEGER, INTENT(IN)                      :: n
00876     INTEGER :: i,j,k
00877     DOUBLE PRECISION :: epsm,gamm,xchi,beta,delta,theta
00878 
00879     epsm=2.2D-16 ! machine precision
00880     gamm=0.0D0   ! max diagonal element
00881     xchi=0.0D0   ! max off-diagonal element
00882     DO k=1,n
00883         gamm=MAX(gamm,ABS(w(1,k)))
00884         DO j=2,MIN(mp1,n-k+1)
00885             xchi=MAX(xchi,ABS(w(j,k)))
00886         END DO
00887     END DO
00888     beta=SQRT(MAX(gamm,xchi/MAX(1.0D0,SQRT(dfloat(n*n-1))),epsm))
00889     delta=epsm*MAX(1.0D0,gamm+xchi)
00890 
00891     DO k=1,n
00892         DO i=2,MIN(mp1,k)
00893             w(i,k-i+1)=w(i,k-i+1)*w(1,k-i+1)
00894         END DO
00895         DO j=2,MIN(mp1,n-k+1)
00896             DO i=MAX(2,j+k+1-mp1),k
00897                 w(j,k)=w(j,k)-w(k-i+2,i-1)*w(j-i+k+1,i-1)
00898             END DO
00899         END DO
00900         theta=0.0D0
00901         DO j=2,MIN(mp1,n-k+1)
00902             theta=MAX(theta,ABS(w(j,k)))
00903         END DO
00904         w(1,k)=1.0D0/MAX(ABS(w(1,k)),(theta/beta)**2,delta)
00905         DO j=2,MIN(mp1,n-k+1)
00906             w(1,k+j-1)=w(1,k+j-1)-w(1,k)*w(j,k)**2
00907         END DO
00908     END DO ! K
00909 
00910 END SUBROUTINE dbfdec
00911 
00912