GeneralBrokenLines  Rev:70
 All Classes Files Functions Variables Pages
Dbandmatrix.f
Go to the documentation of this file.
1 
209 
210 
211 * (1) symmetric matrix w: decomposition, solution, inverse
212 
221 *
222  SUBROUTINE dchdec(W,N, AUX)
223 *
224  INTEGER n
225  DOUBLE PRECISION w(*),aux(n),b(*),x(*),v(*),sum,ratio
226 * ...
227  DO i=1,n
228  aux(i)=16.0d0*w((i*i+i)/2) ! save diagonal elements
229  END DO
230  ii=0
231  DO i=1,n
232  ii=ii+i
233  IF(w(ii)+aux(i).NE.aux(i)) THEN ! GT
234  w(ii)=1.0d0/w(ii) ! (I,I) div !
235  ELSE
236  w(ii)=0.0d0
237  END IF
238  jj=ii
239  DO j=i+1,n
240  ratio=w(i+jj)*w(ii) ! (I,J) (I,I)
241  kk=jj
242  DO k=j,n
243  w(kk+j)=w(kk+j)-w(kk+i)*ratio ! (K,J) (K,I)
244  kk=kk+k
245  END DO ! K
246  w(i+jj)=ratio ! (I,J)
247  jj=jj+j
248  END DO ! J
249  END DO ! I
250 
251 
252  return
253 
254  entry dchslv(w,n,b, x) ! solution B -> X
255  WRITE(*,*) 'before copy'
256  DO i=1,n
257  x(i)=b(i)
258  END DO
259  WRITE(*,*) 'after copy'
260  ii=0
261  DO i=1,n
262  sum=x(i)
263  DO k=1,i-1
264  sum=sum-w(k+ii)*x(k) ! (K,I)
265  END DO
266  x(i)=sum
267  ii=ii+i
268  END DO
269  WRITE(*,*) 'after forward'
270  DO i=n,1,-1
271  sum=x(i)*w(ii) ! (I,I)
272  kk=ii
273  DO k=i+1,n
274  sum=sum-w(kk+i)*x(k) ! (K,I)
275  kk=kk+k
276  END DO
277  x(i)=sum
278  ii=ii-i
279  END DO
280  WRITE(*,*) 'after backward'
281  return
282 
283  entry dchinv(w,n,v) ! inversion
284  ii=(n*n-n)/2
285  DO i=n,1,-1
286  sum=w(ii+i) ! (I,I)
287  DO j=i,1,-1
288  DO k=j+1,n
289  l=min(i,k)
290  m=max(i,k)
291  sum=sum-w(j+(k*k-k)/2)*v(l+(m*m-m)/2) ! (J,K) (I,K)
292  END DO
293  v(ii+j)=sum ! (I,J)
294  sum=0.0d0
295  END DO
296  ii=ii-i+1
297  END DO
298  END
299 
306 *
307  FUNCTION condes(W,N,AUX)
308 *
309  INTEGER n
310  DOUBLE PRECISION w(*),aux(n),sum,sumu,sums
311 *
312  ir=1
313  is=1
314  DO i=1,n
315  IF(w((i*i+i)/2).LT.w((is*is+is)/2)) is=i ! largest Dii
316  IF(w((i*i+i)/2).GT.w((ir*ir+ir)/2)) ir=i ! smallest Dii
317  END DO
318 
319  sumu=0.0 ! find smallest eigenvalue
320  DO i=n,1,-1 ! backward
321  sum=0.0
322  IF(i.EQ.ir) sum=1.0d0
323  kk=(i*i+i)/2
324  DO k=i+1,n
325  sum=sum-w(kk+i)*aux(k) ! (K,I)
326  kk=kk+k
327  END DO
328  aux(i)=sum
329  sumu=sumu+aux(i)*aux(i)
330  END DO
331  xlan=sngl(w((ir*ir+ir)/2)*dsqrt(sumu))
332  IF(xlan.NE.0.0) xlan=1.0/xlan
333 
334  DO i=1,n
335  IF(i.EQ.is) THEN
336  sums=1.0d0
337  ELSE IF(i.GT.is) THEN
338  sums=sums+w(is+(i*i-i)/2)**2
339  END IF
340  END DO ! is Ws
341  xla1=0.0
342  IF(w((is*is+is)/2).NE.0.0) xla1=sngl(dsqrt(sums)/w((is*is+is)/2))
343 
344  cond=0.0
345  IF(xla1.GT.0.0.AND.xlan.GT.0.0) cond=xla1/xlan
346 * estimated condition
347  condes=cond
348  END
349 
350 
351 * (2) symmetric band matrix: decomposition, solution, complete
352 * inverse and band part of the inverse
364 *
365  SUBROUTINE dbcdec(W,MP1,N, AUX) ! decomposition, bandwidth M
366 * m=mp1-1 n*m(m-1) dot operations
367  INTEGER mp1,n
368  DOUBLE PRECISION w(mp1,n),v(mp1,n),b(n),x(n),aux(n),vs(*),rxw
369 * ...
370  DO i=1,n
371  aux(i)=16.0d0*w(1,i) ! save diagonal elements
372  END DO
373  DO i=1,n
374  IF(w(1,i)+aux(i).NE.aux(i)) THEN
375  w(1,i)=1.0/w(1,i)
376  ELSE
377  w(1,i)=0.0d0 ! singular
378  END IF
379  DO j=1,min(mp1-1,n-i)
380  rxw=w(j+1,i)*w(1,i)
381  DO k=1,min(mp1-1,n-i)+1-j
382  w(k,i+j)=w(k,i+j)-w(k+j,i)*rxw
383  END DO
384  w(j+1,i)=rxw
385  END DO
386  END DO
387  return
388 
389  entry dbcslv(w,mp1,n,b, x) ! solution B -> X
390 * n*(2m-1) dot operations
391  DO i=1,n
392  x(i)=b(i)
393  END DO
394  DO i=1,n ! forward substitution
395  DO j=1,min(mp1-1,n-i)
396  x(j+i)=x(j+i)-w(j+1,i)*x(i)
397  END DO
398  END DO
399  DO i=n,1,-1 ! backward substitution
400  rxw=x(i)*w(1,i)
401  DO j=1,min(mp1-1,n-i)
402  rxw=rxw-w(j+1,i)*x(j+i)
403  END DO
404  x(i)=rxw
405  END DO
406  return
407 
408  entry dbciel(w,mp1,n, v) ! V = inverse band matrix elements
409 * n*m*(m-1) dot operations
410  DO i=n,1,-1
411  rxw=w(1,i)
412  DO j=i,max(1,i-mp1+1),-1
413  DO k=j+1,min(n,j+mp1-1)
414  rxw=rxw-v(1+abs(i-k),min(i,k))*w(1+k-j,j)
415  END DO
416  v(1+i-j,j)=rxw
417  rxw=0.0
418  END DO
419  END DO
420  return
421 
422  entry dbcinb(w,mp1,n, vs) ! VS = band part of inverse symmetric matrix
423 * n*m*(m-1) dot operations
424  DO i=n,1,-1
425  rxw=w(1,i)
426  DO j=i,max(1,i-mp1+1),-1
427  DO k=j+1,min(n,j+mp1-1)
428  rxw=rxw-vs((max(i,k)*(max(i,k)-1))/2+min(i,k))*w(1+k-j,j)
429  END DO
430  vs((i*i-i)/2+j)=rxw
431  rxw=0.0
432  END DO
433 c DO j=max(1,i-mp1+1)-1,1,-1
434 c vs((i*i-i)/2+j)=0.0
435 c END DO
436  END DO
437  return
438 
439  entry dbcinv(w,mp1,n, vs) ! V = inverse symmetric matrix
440 * n*n/2*(m-1) dot operations
441  DO i=n,1,-1
442  rxw=w(1,i)
443  DO j=i,1,-1
444  DO k=j+1,min(n,j+mp1-1)
445  rxw=rxw-vs((max(i,k)*(max(i,k)-1))/2+min(i,k))*w(1+k-j,j)
446  END DO
447  vs((i*i-i)/2+j)=rxw
448  rxw=0.0
449  END DO
450  END DO
451  return
452  END
453 
460 *
461  SUBROUTINE dbcprv(W,MP1,N,B)
462 *
463  INTEGER mp1,n
464  DOUBLE PRECISION w(mp1,n),b(n),err
465  INTEGER irho(5)
466 * ...
467  WRITE(*,*) ' '
468  WRITE(*,101)
469  DO i=1,n
470  err=dsqrt(w(1,i))
471  nj=0
472  DO j=2,mp1
473  IF(i+1-j.GT.0.AND.nj.LT.5) THEN
474  nj=nj+1
475  rho=sngl(w(j,i+1-j)/(err*dsqrt(w(1,i+1-j))))
476  irho(nj)=ifix(100.0*abs(rho)+0.5)
477  IF(rho.LT.0.0) irho(nj)=-irho(nj)
478  END IF
479  END DO
480  WRITE(*,102) i,b(i),err,(irho(j),j=1,nj)
481  END DO
482  WRITE(*,103)
483  101 format(5x,'i Param',7x,'error',7x,' c(i,i-1) c(i,i-2)'/)
484  102 format(1x,i5,2g12.4,1x,5i9)
485  103 format(33x,'(correlation coefficients in percent)')
486  END
487 
493 *
494  SUBROUTINE dbcprb(W,MP1,N)
495 *
496  INTEGER mp1,n
497  DOUBLE PRECISION w(mp1,n)
498 * ...
499  IF(mp1.GT.6) return
500  WRITE(*,*) ' '
501  WRITE(*,101)
502  DO i=1,n
503  WRITE(*,102) i,(w(j,i),j=1,mp1)
504  END DO
505  WRITE(*,*) ' '
506  101 format(5x,'i Diag ')
507  102 format(1x,i5,6g12.4)
508  END
509 
510 
511 * (3) symmetric band matrix of band width m=1: decomposition,
512 * solution, complete, inverse and band part of the inverse
513 
534 *
535  SUBROUTINE db2dec(W,N, AUX)
536 *
537  INTEGER n
538  DOUBLE PRECISION w(2,n),v(2,n),b(n),x(n),aux(n),rxw
539 *
540  DO i=1,n
541  aux(i)=16.0d0*w(1,i) ! save diagonal elements
542  END DO
543  DO i=1,n-1
544  IF(w(1,i)+aux(i).NE.aux(i)) THEN
545  w(1,i)=1.0d0/w(1,i)
546  rxw=w(2,i)*w(1,i)
547  w(1,i+1)=w(1,i+1)-w(2,i)*rxw
548  w(2,i)=rxw
549  ELSE ! singular
550  w(1,i)=0.0d0
551  w(2,i)=0.0d0
552  END IF
553  END DO
554  IF(w(1,n)+aux(n).GT.aux(n)) THEN ! N
555  w(1,n)=1.0d0/w(1,n)
556  ELSE ! singular
557  w(1,n)=0.0d0
558  END IF
559  return
560 
561  entry db2slv(w,n,b, x) ! solution B -> X
562 * the equation w(original)*x=b is solved for x; input is b in vector x.
563  DO i=1,n
564  x(i)=b(i)
565  END DO
566  DO i=1,n-1 ! by forward substitution
567  x(i+1)=x(i+1)-w(2,i)*x(i)
568  END DO
569  x(n)=x(n)*w(1,n) ! and backward substitution
570  DO i=n-1,1,-1
571  x(i)=x(i)*w(1,i)-w(2,i)*x(i+1)
572  END DO
573  return
574 
575  entry db2iel(w,n, v) ! V = inverse band matrix elements
576 * the band elements of the inverse of w(original) are calculated,
577 * and stored in v in the same order as in w.
578 * remaining elements of the inverse are not calculated.
579  v(1,n )= w(1,n)
580  v(2,n-1)=-v(1,n )*w(2,n-1)
581  DO i=n-1,3,-1
582  v(1,i )= w(1,i )-v(2,i )*w(2,i )
583  v(2,i-1)=-v(1,i )*w(2,i-1)
584  END DO
585  v(1,2)= w(1,2)-v(2,2)*w(2,2)
586  v(2,1)=-v(1,2)*w(2,1)
587  v(1,1)= w(1,1)-v(2,1)*w(2,1)
588  END
589 
590 
591 * (4) symmetric band matrix of band width m=2: decomposition,
592 * solution, complete, inverse and band part of the inverse
593 
614 *
615  SUBROUTINE db3dec(W,N, AUX) ! decomposition (M=2)
616 *
617  INTEGER n
618  DOUBLE PRECISION w(3,n),v(3,n),b(n),x(n),aux(n),rxw
619 *
620  DO i=1,n
621  aux(i)=16.0d0*w(1,i) ! save diagonal elements
622  END DO
623  DO i=1,n-2
624  IF(w(1,i)+aux(i).NE.aux(i)) THEN
625  w(1,i)=1.0d0/w(1,i)
626  rxw=w(2,i)*w(1,i)
627  w(1,i+1)=w(1,i+1)-w(2,i)*rxw
628  w(2,i+1)=w(2,i+1)-w(3,i)*rxw
629  w(2,i)=rxw
630  rxw=w(3,i)*w(1,i)
631  w(1,i+2)=w(1,i+2)-w(3,i)*rxw
632  w(3,i)=rxw
633  ELSE ! singular
634  w(1,i)=0.0d0
635  w(2,i)=0.0d0
636  w(3,i)=0.0d0
637  END IF
638  END DO
639  IF(w(1,n-1)+aux(n-1).GT.aux(n-1)) THEN
640  w(1,n-1)=1.0d0/w(1,n-1)
641  rxw=w(2,n-1)*w(1,n-1)
642  w(1,n)=w(1,n)-w(2,n-1)*rxw
643  w(2,n-1)=rxw
644  ELSE ! singular
645  w(1,n-1)=0.0d0
646  w(2,n-1)=0.0d0
647  END IF
648  IF(w(1,n)+aux(n).GT.aux(n)) THEN
649  w(1,n)=1.0d0/w(1,n)
650  ELSE ! singular
651  w(1,n)=0.0d0
652  END IF
653  return
654 
655  entry db3slv(w,n,b, x) ! solution B -> X
656  DO i=1,n
657  x(i)=b(i)
658  END DO
659  DO i=1,n-2 ! by forward substitution
660  x(i+1)=x(i+1)-w(2,i)*x(i)
661  x(i+2)=x(i+2)-w(3,i)*x(i)
662  END DO
663  x(n)=x(n)-w(2,n-1)*x(n-1)
664  x(n)=x(n)*w(1,n) ! and backward substitution
665  x(n-1)=x(n-1)*w(1,n-1)-w(2,n-1)*x(n)
666  DO i=n-2,1,-1
667  x(i)=x(i)*w(1,i)-w(2,i)*x(i+1)-w(3,i)*x(i+2)
668  END DO
669  return
670 
671  entry db3iel(w,n, v) ! V = inverse band matrix elements
672 * the band elements of the inverse of w(original) are calculated,
673 * and stored in v in the same order as in w.
674 * remaining elements of the inverse are not calculated.
675  v(1,n )= w(1,n)
676  v(2,n-1)=-v(1,n )*w(2,n-1)
677  v(3,n-2)=-v(2,n-1)*w(2,n-2)-v(1,n )*w(3,n-2)
678  v(1,n-1)= w(1,n-1)
679  + -v(2,n-1)*w(2,n-1)
680  v(2,n-2)=-v(1,n-1)*w(2,n-2)-v(2,n-1)*w(3,n-2)
681  v(3,n-3)=-v(2,n-2)*w(2,n-3)-v(1,n-1)*w(3,n-3)
682  DO i=n-2,3,-1
683  v(1,i )= w(1,i )
684  + -v(2,i )*w(2,i )-v(3,i)*w(3,i )
685  v(2,i-1)=-v(1,i )*w(2,i-1)-v(2,i)*w(3,i-1)
686  v(3,i-2)=-v(2,i-1)*w(2,i-2)-v(1,i)*w(3,i-2)
687  END DO
688  v(1,2)= w(1,2)
689  + -v(2,2)*w(2,2)-v(3,2)*w(3,2)
690  v(2,1)=-v(1,2)*w(2,1)-v(2,2)*w(3,1)
691  v(1,1)= w(1,1)
692  + -v(2,1)*w(2,1)-v(3,1)*w(3,1)
693  END
694 
695 
696 * (5) symmetric matrix with band structure, bordered by full row/col
697 * - is not yet included -
698 
699 c SUBROUTINE bsolv1(N,CU,RU,CK,RK,CH, BK,UH, AU) ! 1
700 * input: cu = 3*n array replaced by decomposition
701 * ru n array rhs
702 * ck diagonal element
703 * rk rhs
704 * ch n-vector
705 *
706 * aux: au n-vector auxliliary array
707 *
708 * result: fk curvature
709 * bk variance
710 * uh smoothed data points
711 *
712 
713 c DOUBLE PRECISION cu(3,n),ci(3,n),ck,bk,au(n),uh(n)
714 * ...
715 c CALL bdadec(cu,3,n, au) ! decomposition
716 c CALL dbaslv(cu,3,n, ru,uh) ! solve for zero curvature
717 c CALL dbaslv(cu,3,n, ch,au) ! solve for aux. vector
718 c ctz=0.0d0
719 c zru=0.0d0
720 c DO i=1,n
721 c ctz=ctz+ch(i)*au(i) ! cT z
722 c zru=zru+ry(i)*au(i) ! zT ru
723 c END DO
724 c bk=1.0d0/(ck-ctz) ! variance of curvature
725 c fk=bk *(rk-zru) ! curvature
726 c DO i=1,n
727 c uh(i)=uh(i)-fk*au(i) ! smoothed data points
728 c END DO
729 c return
730 
731 c entry binv1(n,cu,ci, fk,au)
732 c DOUBLE PRECISION ci(3,n)
733 * ...
734 c CALL dbaibm(cu,3,n, ci) ! block part of inverse
735 c DO i=1,n
736 c ci(1,i)=ci(1,i)+fk*au(i)*au(i) ! diagonal elements
737 c IF(i.LT.n) ci(2,i)=ci(2,i)+fk*au(i)*au(i+1) ! next diagonal
738 c IF(i.LT.n-1) ci(3,i)=ci(3,i)+fk*au(i)*au(i+2) ! next diagonal
739 c END DO
740 
741 c END
742 
751 *
752  SUBROUTINE dcfdec(W,N)
753 
754  IMPLICIT NONE
755  INTEGER n,i,j,k
756  DOUBLE PRECISION w(*),epsm,gamm,xchi,beta,delta,theta
757 *
758  epsm=2.2d-16 ! machine precision
759  gamm=0.0d0 ! max diagonal element
760  xchi=0.0d0 ! max off-diagonal element
761  DO k=1,n
762  gamm=max(gamm,abs(w((k*k+k)/2)))
763  DO j=k+1,n
764  xchi=max(xchi,abs(w((j*j-j)/2+k)))
765  END DO
766  END DO
767  beta=sqrt(max(gamm,xchi/max(1.0d0,sqrt(dfloat(n*n-1))),epsm))
768  delta=epsm*max(1.0d0,gamm+xchi)
769 
770  DO k=1,n
771  DO i=1,k-1
772  w((k*k-k)/2+i)=w((k*k-k)/2+i)*w((i*i+i)/2)
773  END DO
774  DO j=k+1,n
775  DO i=1,k-1
776  w((j*j-j)/2+k)=w((j*j-j)/2+k)-w((k*k-k)/2+i)*w((j*j-j)/2+i)
777  END DO
778  END DO
779  theta=0.0d0
780  DO j=k+1,n
781  theta=max(theta,abs(w((j*j-j)/2+k)))
782  END DO
783  w((k*k+k)/2)=1.0d0/max(abs(w((k*k+k)/2)),(theta/beta)**2,delta)
784  DO j=k+1,n
785  w((j*j+j)/2)=w((j*j+j)/2)-w((j*j-j)/2+k)**2*w((k*k+k)/2)
786  END DO
787  END DO ! K
788 
789  END
790 
800 *
801  SUBROUTINE dbfdec(W,MP1,N)
802 *
803  IMPLICIT NONE
804  INTEGER mp1,n,i,j,k
805  DOUBLE PRECISION w(mp1,n),epsm,gamm,xchi,beta,delta,theta
806 *
807  epsm=2.2d-16 ! machine precision
808  gamm=0.0d0 ! max diagonal element
809  xchi=0.0d0 ! max off-diagonal element
810  DO k=1,n
811  gamm=max(gamm,abs(w(1,k)))
812  DO j=2,min(mp1,n-k+1)
813  xchi=max(xchi,abs(w(j,k)))
814  END DO
815  END DO
816  beta=sqrt(max(gamm,xchi/max(1.0d0,sqrt(dfloat(n*n-1))),epsm))
817  delta=epsm*max(1.0d0,gamm+xchi)
818 
819  DO k=1,n
820  DO i=2,min(mp1,k)
821  w(i,k-i+1)=w(i,k-i+1)*w(1,k-i+1)
822  END DO
823  DO j=2,min(mp1,n-k+1)
824  DO i=max(2,j+k+1-mp1),k
825  w(j,k)=w(j,k)-w(k-i+2,i-1)*w(j-i+k+1,i-1)
826  END DO
827  END DO
828  theta=0.0d0
829  DO j=2,min(mp1,n-k+1)
830  theta=max(theta,abs(w(j,k)))
831  END DO
832  w(1,k)=1.0d0/max(abs(w(1,k)),(theta/beta)**2,delta)
833  DO j=2,min(mp1,n-k+1)
834  w(1,k+j-1)=w(1,k+j-1)-w(1,k)*w(j,k)**2
835  END DO
836  END DO ! K
837 
838  END
839 
840