Millepede-II  V04-00-00_preview
 All Classes Files Functions Variables Enumerator Pages
Dbandmatrix.f90
Go to the documentation of this file.
1 
2 ! Code converted using TO_F90 by Alan Miller
3 ! Date: 2012-04-18 Time: 19:56:08
4 
213 
214 
215 ! (1) Symmetric matrix W: decomposition, solution, inverse
216 
225 
226 SUBROUTINE dchdec(w,n, aux)
227  implicit none
228  integer :: i
229  integer :: ii
230  integer :: j
231  integer :: jj
232  integer :: k
233  integer :: kk
234  integer :: l
235  integer :: m
236 
237 
238  DOUBLE PRECISION, INTENT(IN OUT) :: w(*)
239  INTEGER, INTENT(IN) :: n
240  DOUBLE PRECISION, INTENT(OUT) :: aux(n)
241 
242  DOUBLE PRECISION :: b(*),x(*),v(*),suma,ratio
243  ! ...
244  DO i=1,n
245  aux(i)=16.0d0*w((i*i+i)/2) ! save diagonal elements
246  END DO
247  ii=0
248  DO i=1,n
249  ii=ii+i
250  IF(w(ii)+aux(i) /= aux(i)) THEN ! GT
251  w(ii)=1.0d0/w(ii) ! (I,I) div !
252  ELSE
253  w(ii)=0.0d0
254  END IF
255  jj=ii
256  DO j=i+1,n
257  ratio=w(i+jj)*w(ii) ! (I,J) (I,I)
258  kk=jj
259  DO k=j,n
260  w(kk+j)=w(kk+j)-w(kk+i)*ratio ! (K,J) (K,I)
261  kk=kk+k
262  END DO ! K
263  w(i+jj)=ratio ! (I,J)
264  jj=jj+j
265  END DO ! J
266  END DO ! I
267 
268 
269  return
270 
271  entry dchslv(w,n,b, x) ! solution B -> X
272  WRITE(*,*) 'before copy'
273  DO i=1,n
274  x(i)=b(i)
275  END DO
276  WRITE(*,*) 'after copy'
277  ii=0
278  DO i=1,n
279  suma=x(i)
280  DO k=1,i-1
281  suma=suma-w(k+ii)*x(k) ! (K,I)
282  END DO
283  x(i)=suma
284  ii=ii+i
285  END DO
286  WRITE(*,*) 'after forward'
287  DO i=n,1,-1
288  suma=x(i)*w(ii) ! (I,I)
289  kk=ii
290  DO k=i+1,n
291  suma=suma-w(kk+i)*x(k) ! (K,I)
292  kk=kk+k
293  END DO
294  x(i)=suma
295  ii=ii-i
296  END DO
297  WRITE(*,*) 'after backward'
298  return
299 
300  entry dchinv(w,n,v) ! inversion
301  ii=(n*n-n)/2
302  DO i=n,1,-1
303  suma=w(ii+i) ! (I,I)
304  DO j=i,1,-1
305  DO k=j+1,n
306  l=min(i,k)
307  m=max(i,k)
308  suma=suma-w(j+(k*k-k)/2)*v(l+(m*m-m)/2) ! (J,K) (I,K)
309  END DO
310  v(ii+j)=suma ! (I,J)
311  suma=0.0d0
312  END DO
313  ii=ii-i+1
314  END DO
315 END SUBROUTINE dchdec
316 
323 
324 REAL FUNCTION condes(w,n,aux)
325  implicit none
326  real :: cond
327  integer :: i
328  integer :: ir
329  integer :: is
330  integer :: k
331  integer :: kk
332  real :: xla1
333  real :: xlan
334 
335 
336  DOUBLE PRECISION, INTENT(IN) :: w(*)
337  INTEGER, INTENT(IN) :: n
338  DOUBLE PRECISION, INTENT(IN OUT) :: aux(n)
339 
340  DOUBLE PRECISION :: suma,sumu,sums
341 
342  ir=1
343  is=1
344  DO i=1,n
345  IF(w((i*i+i)/2) < w((is*is+is)/2)) is=i ! largest Dii
346  IF(w((i*i+i)/2) > w((ir*ir+ir)/2)) ir=i ! smallest Dii
347  END DO
348 
349  sumu=0.0 ! find smallest eigenvalue
350  sums=0.0
351  DO i=n,1,-1 ! backward
352  suma=0.0
353  IF(i == ir) suma=1.0d0
354  kk=(i*i+i)/2
355  DO k=i+1,n
356  suma=suma-w(kk+i)*aux(k) ! (K,I)
357  kk=kk+k
358  END DO
359  aux(i)=suma
360  sumu=sumu+aux(i)*aux(i)
361  END DO
362  xlan=sngl(w((ir*ir+ir)/2)*dsqrt(sumu))
363  IF(xlan /= 0.0) xlan=1.0/xlan
364 
365  DO i=1,n
366  IF(i == is) THEN
367  sums=1.0d0
368  ELSE IF(i > is) THEN
369  sums=sums+w(is+(i*i-i)/2)**2
370  END IF
371  END DO ! is Ws
372  xla1=0.0
373  IF(w((is*is+is)/2) /= 0.0) xla1=sngl(dsqrt(sums)/w((is*is+is)/2))
374 
375  cond=0.0
376  IF(xla1 > 0.0.AND.xlan > 0.0) cond=xla1/xlan
377  ! estimated condition
378  condes=cond
379 END FUNCTION condes
380 
381 
382 ! (2) Symmetric band matrix: decomposition, solution, complete
383 ! inverse and band part of the inverse
395 
396 SUBROUTINE dbcdec(w,mp1,n, aux) ! decomposition, bandwidth M
397  implicit none
398  integer :: i
399  integer :: j
400  integer :: k
401  ! M=MP1-1 N*M(M-1) dot operations
402 
403  DOUBLE PRECISION, INTENT(IN OUT) :: w(mp1,n)
404  INTEGER, INTENT(IN) :: mp1
405  INTEGER, INTENT(IN) :: n
406  DOUBLE PRECISION, INTENT(OUT) :: aux(n)
407  ! decompos
408  DOUBLE PRECISION :: v(mp1,n),b(n),x(n), vs(*),rxw
409  ! ...
410  DO i=1,n
411  aux(i)=16.0d0*w(1,i) ! save diagonal elements
412  END DO
413  DO i=1,n
414  IF(w(1,i)+aux(i) /= aux(i)) THEN
415  w(1,i)=1.0/w(1,i)
416  ELSE
417  w(1,i)=0.0d0 ! singular
418  END IF
419  DO j=1,min(mp1-1,n-i)
420  rxw=w(j+1,i)*w(1,i)
421  DO k=1,min(mp1-1,n-i)+1-j
422  w(k,i+j)=w(k,i+j)-w(k+j,i)*rxw
423  END DO
424  w(j+1,i)=rxw
425  END DO
426  END DO
427  return
428 
429  entry dbcslv(w,mp1,n,b, x) ! solution B -> X
430  ! N*(2M-1) dot operations
431  DO i=1,n
432  x(i)=b(i)
433  END DO
434  DO i=1,n ! forward substitution
435  DO j=1,min(mp1-1,n-i)
436  x(j+i)=x(j+i)-w(j+1,i)*x(i)
437  END DO
438  END DO
439  DO i=n,1,-1 ! backward substitution
440  rxw=x(i)*w(1,i)
441  DO j=1,min(mp1-1,n-i)
442  rxw=rxw-w(j+1,i)*x(j+i)
443  END DO
444  x(i)=rxw
445  END DO
446  return
447 
448  entry dbciel(w,mp1,n, v) ! V = inverse band matrix elements
449  ! N*M*(M-1) dot operations
450  DO i=n,1,-1
451  rxw=w(1,i)
452  DO j=i,max(1,i-mp1+1),-1
453  DO k=j+1,min(n,j+mp1-1)
454  rxw=rxw-v(1+abs(i-k),min(i,k))*w(1+k-j,j)
455  END DO
456  v(1+i-j,j)=rxw
457  rxw=0.0
458  END DO
459  END DO
460  return
461 
462  entry dbcinb(w,mp1,n, vs) ! VS = band part of inverse symmetric matrix
463  ! N*M*(M-1) dot operations
464  DO i=n,1,-1
465  rxw=w(1,i)
466  DO j=i,max(1,i-mp1+1),-1
467  DO k=j+1,min(n,j+mp1-1)
468  rxw=rxw-vs((max(i,k)*(max(i,k)-1))/2+min(i,k))*w(1+k-j,j)
469  END DO
470  vs((i*i-i)/2+j)=rxw
471  rxw=0.0
472  END DO
473  ! DO J=MAX(1,I-MP1+1)-1,1,-1
474  ! VS((I*I-I)/2+J)=0.0
475  ! END DO
476  END DO
477  return
478 
479  entry dbcinv(w,mp1,n, vs) ! V = inverse symmetric matrix
480  ! N*N/2*(M-1) dot operations
481  DO i=n,1,-1
482  rxw=w(1,i)
483  DO j=i,1,-1
484  DO k=j+1,min(n,j+mp1-1)
485  rxw=rxw-vs((max(i,k)*(max(i,k)-1))/2+min(i,k))*w(1+k-j,j)
486  END DO
487  vs((i*i-i)/2+j)=rxw
488  rxw=0.0
489  END DO
490  END DO
491  return
492 END SUBROUTINE dbcdec
493 
500 
501 SUBROUTINE dbcprv(w,mp1,n,b)
502  implicit none
503  integer :: i
504  integer :: j
505  integer :: nj
506  real :: rho
507 
508 
509  DOUBLE PRECISION, INTENT(IN OUT) :: w(mp1,n)
510  INTEGER, INTENT(IN) :: mp1
511  INTEGER, INTENT(IN) :: n
512  DOUBLE PRECISION, INTENT(OUT) :: b(n)
513 
514  DOUBLE PRECISION :: err
515  INTEGER :: irho(5)
516  ! ...
517  WRITE(*,*) ' '
518  WRITE(*,101)
519 
520  DO i=1,n
521  err=dsqrt(w(1,i))
522  nj=0
523  DO j=2,mp1
524  IF(i+1-j > 0.AND.nj < 5) THEN
525  nj=nj+1
526  rho=sngl(w(j,i+1-j)/(err*dsqrt(w(1,i+1-j))))
527  irho(nj)=ifix(100.0*abs(rho)+0.5)
528  IF(rho < 0.0) irho(nj)=-irho(nj)
529  END IF
530  END DO
531  WRITE(*,102) i,b(i),err,(irho(j),j=1,nj)
532  END DO
533  WRITE(*,103)
534 101 format(5x,'i Param',7x,'error',7x,' c(i,i-1) c(i,i-2)'/)
535 102 format(1x,i5,2g12.4,1x,5i9)
536 103 format(33x,'(correlation coefficients in percent)')
537 END SUBROUTINE dbcprv
538 
544 
545 SUBROUTINE dbcprb(w,mp1,n)
546  implicit none
547  integer :: i
548  integer :: j
549 
550 
551  DOUBLE PRECISION, INTENT(IN OUT) :: w(mp1,n)
552  INTEGER, INTENT(IN) :: mp1
553  INTEGER, INTENT(IN) :: n
554 
555 
556  ! ...
557  IF(mp1 > 6) return
558  WRITE(*,*) ' '
559  WRITE(*,101)
560  DO i=1,n
561  WRITE(*,102) i,(w(j,i),j=1,mp1)
562  END DO
563  WRITE(*,*) ' '
564 101 format(5x,'i Diag ')
565 102 format(1x,i5,6g12.4)
566 END SUBROUTINE dbcprb
567 
568 
569 ! (3) Symmetric band matrix of band width m=1: decomposition,
570 ! solution, complete, inverse and band part of the inverse
571 
592 
593 SUBROUTINE db2dec(w,n, aux)
594  implicit none
595  integer :: i
596 
597 
598  DOUBLE PRECISION, INTENT(IN OUT) :: w(2,n)
599  INTEGER, INTENT(IN OUT) :: n
600  DOUBLE PRECISION, INTENT(OUT) :: aux(n)
601 
602  DOUBLE PRECISION :: v(2,n),b(n),x(n), rxw
603 
604  DO i=1,n
605  aux(i)=16.0d0*w(1,i) ! save diagonal elements
606  END DO
607  DO i=1,n-1
608  IF(w(1,i)+aux(i) /= aux(i)) THEN
609  w(1,i)=1.0d0/w(1,i)
610  rxw=w(2,i)*w(1,i)
611  w(1,i+1)=w(1,i+1)-w(2,i)*rxw
612  w(2,i)=rxw
613  ELSE ! singular
614  w(1,i)=0.0d0
615  w(2,i)=0.0d0
616  END IF
617  END DO
618  IF(w(1,n)+aux(n) > aux(n)) THEN ! N
619  w(1,n)=1.0d0/w(1,n)
620  ELSE ! singular
621  w(1,n)=0.0d0
622  END IF
623  return
624 
625  entry db2slv(w,n,b, x) ! solution B -> X
626  ! The equation W(original)*X=B is solved for X; input is B in vector X.
627  DO i=1,n
628  x(i)=b(i)
629  END DO
630  DO i=1,n-1 ! by forward substitution
631  x(i+1)=x(i+1)-w(2,i)*x(i)
632  END DO
633  x(n)=x(n)*w(1,n) ! and backward substitution
634  DO i=n-1,1,-1
635  x(i)=x(i)*w(1,i)-w(2,i)*x(i+1)
636  END DO
637  return
638 
639  entry db2iel(w,n, v) ! V = inverse band matrix elements
640  ! The band elements of the inverse of W(original) are calculated,
641  ! and stored in V in the same order as in W.
642  ! Remaining elements of the inverse are not calculated.
643  v(1,n )= w(1,n)
644  v(2,n-1)=-v(1,n )*w(2,n-1)
645  DO i=n-1,3,-1
646  v(1,i )= w(1,i )-v(2,i )*w(2,i )
647  v(2,i-1)=-v(1,i )*w(2,i-1)
648  END DO
649  v(1,2)= w(1,2)-v(2,2)*w(2,2)
650  v(2,1)=-v(1,2)*w(2,1)
651  v(1,1)= w(1,1)-v(2,1)*w(2,1)
652 END SUBROUTINE db2dec
653 
654 
655 ! (4) Symmetric band matrix of band width m=2: decomposition,
656 ! solution, complete, inverse and band part of the inverse
657 
678 
679 SUBROUTINE db3dec(w,n, aux) ! decomposition (M=2)
680  implicit none
681  integer :: i
682 
683 
684  DOUBLE PRECISION, INTENT(IN OUT) :: w(3,n)
685  INTEGER, INTENT(IN OUT) :: n
686  DOUBLE PRECISION, INTENT(OUT) :: aux(n)
687  ! decompos
688 
689  DOUBLE PRECISION :: v(3,n),b(n),x(n), rxw
690 
691  DO i=1,n
692  aux(i)=16.0d0*w(1,i) ! save diagonal elements
693  END DO
694  DO i=1,n-2
695  IF(w(1,i)+aux(i) /= aux(i)) THEN
696  w(1,i)=1.0d0/w(1,i)
697  rxw=w(2,i)*w(1,i)
698  w(1,i+1)=w(1,i+1)-w(2,i)*rxw
699  w(2,i+1)=w(2,i+1)-w(3,i)*rxw
700  w(2,i)=rxw
701  rxw=w(3,i)*w(1,i)
702  w(1,i+2)=w(1,i+2)-w(3,i)*rxw
703  w(3,i)=rxw
704  ELSE ! singular
705  w(1,i)=0.0d0
706  w(2,i)=0.0d0
707  w(3,i)=0.0d0
708  END IF
709  END DO
710  IF(w(1,n-1)+aux(n-1) > aux(n-1)) THEN
711  w(1,n-1)=1.0d0/w(1,n-1)
712  rxw=w(2,n-1)*w(1,n-1)
713  w(1,n)=w(1,n)-w(2,n-1)*rxw
714  w(2,n-1)=rxw
715  ELSE ! singular
716  w(1,n-1)=0.0d0
717  w(2,n-1)=0.0d0
718  END IF
719  IF(w(1,n)+aux(n) > aux(n)) THEN
720  w(1,n)=1.0d0/w(1,n)
721  ELSE ! singular
722  w(1,n)=0.0d0
723  END IF
724  return
725 
726  entry db3slv(w,n,b, x) ! solution B -> X
727  DO i=1,n
728  x(i)=b(i)
729  END DO
730  DO i=1,n-2 ! by forward substitution
731  x(i+1)=x(i+1)-w(2,i)*x(i)
732  x(i+2)=x(i+2)-w(3,i)*x(i)
733  END DO
734  x(n)=x(n)-w(2,n-1)*x(n-1)
735  x(n)=x(n)*w(1,n) ! and backward substitution
736  x(n-1)=x(n-1)*w(1,n-1)-w(2,n-1)*x(n)
737  DO i=n-2,1,-1
738  x(i)=x(i)*w(1,i)-w(2,i)*x(i+1)-w(3,i)*x(i+2)
739  END DO
740  return
741 
742  entry db3iel(w,n, v) ! V = inverse band matrix elements
743  ! The band elements of the inverse of W(original) are calculated,
744  ! and stored in V in the same order as in W.
745  ! Remaining elements of the inverse are not calculated.
746  v(1,n )= w(1,n)
747  v(2,n-1)=-v(1,n )*w(2,n-1)
748  v(3,n-2)=-v(2,n-1)*w(2,n-2)-v(1,n )*w(3,n-2)
749  v(1,n-1)= w(1,n-1) -v(2,n-1)*w(2,n-1)
750  v(2,n-2)=-v(1,n-1)*w(2,n-2)-v(2,n-1)*w(3,n-2)
751  v(3,n-3)=-v(2,n-2)*w(2,n-3)-v(1,n-1)*w(3,n-3)
752  DO i=n-2,3,-1
753  v(1,i )= w(1,i ) -v(2,i )*w(2,i )-v(3,i)*w(3,i )
754  v(2,i-1)=-v(1,i )*w(2,i-1)-v(2,i)*w(3,i-1)
755  v(3,i-2)=-v(2,i-1)*w(2,i-2)-v(1,i)*w(3,i-2)
756  END DO
757  v(1,2)= w(1,2) -v(2,2)*w(2,2)-v(3,2)*w(3,2)
758  v(2,1)=-v(1,2)*w(2,1)-v(2,2)*w(3,1)
759  v(1,1)= w(1,1) -v(2,1)*w(2,1)-v(3,1)*w(3,1)
760 END SUBROUTINE db3dec
761 
762 
763 ! (5) Symmetric matrix with band structure, bordered by full row/col
764 ! - is not yet included -
765 
766 ! SUBROUTINE BSOLV1(N,CU,RU,CK,RK,CH, BK,UH, AU) ! 1
767 ! Input: CU = 3*N array replaced by decomposition
768 ! RU N array rhs
769 ! CK diagonal element
770 ! RK rhs
771 ! CH N-vector
772 
773 ! Aux: AU N-vector auxliliary array
774 
775 ! Result: FK curvature
776 ! BK variance
777 ! UH smoothed data points
778 
779 
780 ! DOUBLE PRECISION CU(3,N),CI(3,N),CK,BK,AU(N),UH(N)
781 ! ...
782 ! CALL BDADEC(CU,3,N, AU) ! decomposition
783 ! CALL DBASLV(CU,3,N, RU,UH) ! solve for zero curvature
784 ! CALL DBASLV(CU,3,N, CH,AU) ! solve for aux. vector
785 ! CTZ=0.0D0
786 ! ZRU=0.0D0
787 ! DO I=1,N
788 ! CTZ=CTZ+CH(I)*AU(I) ! cT z
789 ! ZRU=ZRU+RY(I)*AU(I) ! zT ru
790 ! END DO
791 ! BK=1.0D0/(CK-CTZ) ! variance of curvature
792 ! FK=BK *(RK-ZRU) ! curvature
793 ! DO I=1,N
794 ! UH(I)=UH(I)-FK*AU(I) ! smoothed data points
795 ! END DO
796 ! RETURN
797 
798 ! ENTRY BINV1(N,CU,CI, FK,AU)
799 ! DOUBLE PRECISION CI(3,N)
800 ! ...
801 ! CALL DBAIBM(CU,3,N, CI) ! block part of inverse
802 ! DO I=1,N
803 ! CI(1,I)=CI(1,I)+FK*AU(I)*AU(I) ! diagonal elements
804 ! IF(I.LT.N) CI(2,I)=CI(2,I)+FK*AU(I)*AU(I+1) ! next diagonal
805 ! IF(I.LT.N-1) CI(3,I)=CI(3,I)+FK*AU(I)*AU(I+2) ! next diagonal
806 ! END DO
807 
808 ! END
809 
818 
819 SUBROUTINE dcfdec(w,n)
820 
821  IMPLICIT NONE
822  DOUBLE PRECISION, INTENT(OUT) :: w(*)
823  INTEGER, INTENT(IN) :: n
824  INTEGER :: i,j,k
825  DOUBLE PRECISION :: epsm,gamm,xchi,beta,delta,theta
826 
827  epsm=2.2d-16 ! machine precision
828  gamm=0.0d0 ! max diagonal element
829  xchi=0.0d0 ! max off-diagonal element
830  DO k=1,n
831  gamm=max(gamm,abs(w((k*k+k)/2)))
832  DO j=k+1,n
833  xchi=max(xchi,abs(w((j*j-j)/2+k)))
834  END DO
835  END DO
836  beta=sqrt(max(gamm,xchi/max(1.0d0,sqrt(dfloat(n*n-1))),epsm))
837  delta=epsm*max(1.0d0,gamm+xchi)
838 
839  DO k=1,n
840  DO i=1,k-1
841  w((k*k-k)/2+i)=w((k*k-k)/2+i)*w((i*i+i)/2)
842  END DO
843  DO j=k+1,n
844  DO i=1,k-1
845  w((j*j-j)/2+k)=w((j*j-j)/2+k)-w((k*k-k)/2+i)*w((j*j-j)/2+i)
846  END DO
847  END DO
848  theta=0.0d0
849  DO j=k+1,n
850  theta=max(theta,abs(w((j*j-j)/2+k)))
851  END DO
852  w((k*k+k)/2)=1.0d0/max(abs(w((k*k+k)/2)),(theta/beta)**2,delta)
853  DO j=k+1,n
854  w((j*j+j)/2)=w((j*j+j)/2)-w((j*j-j)/2+k)**2*w((k*k+k)/2)
855  END DO
856  END DO ! K
857 
858 END SUBROUTINE dcfdec
859 
869 
870 SUBROUTINE dbfdec(w,mp1,n)
871 
872  IMPLICIT NONE
873  DOUBLE PRECISION, INTENT(OUT) :: w(mp1,n)
874  INTEGER, INTENT(IN OUT) :: mp1
875  INTEGER, INTENT(IN) :: n
876  INTEGER :: i,j,k
877  DOUBLE PRECISION :: epsm,gamm,xchi,beta,delta,theta
878 
879  epsm=2.2d-16 ! machine precision
880  gamm=0.0d0 ! max diagonal element
881  xchi=0.0d0 ! max off-diagonal element
882  DO k=1,n
883  gamm=max(gamm,abs(w(1,k)))
884  DO j=2,min(mp1,n-k+1)
885  xchi=max(xchi,abs(w(j,k)))
886  END DO
887  END DO
888  beta=sqrt(max(gamm,xchi/max(1.0d0,sqrt(dfloat(n*n-1))),epsm))
889  delta=epsm*max(1.0d0,gamm+xchi)
890 
891  DO k=1,n
892  DO i=2,min(mp1,k)
893  w(i,k-i+1)=w(i,k-i+1)*w(1,k-i+1)
894  END DO
895  DO j=2,min(mp1,n-k+1)
896  DO i=max(2,j+k+1-mp1),k
897  w(j,k)=w(j,k)-w(k-i+2,i-1)*w(j-i+k+1,i-1)
898  END DO
899  END DO
900  theta=0.0d0
901  DO j=2,min(mp1,n-k+1)
902  theta=max(theta,abs(w(j,k)))
903  END DO
904  w(1,k)=1.0d0/max(abs(w(1,k)),(theta/beta)**2,delta)
905  DO j=2,min(mp1,n-k+1)
906  w(1,k+j-1)=w(1,k+j-1)-w(1,k)*w(j,k)**2
907  END DO
908  END DO ! K
909 
910 END SUBROUTINE dbfdec
911 
912