CalculiX  2.13
A Free Software Three-Dimensional Structural Finite Element Program
hybsvd.f File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine hybsvd (NA, NU, NV, NZ, NB, M, N, A, W, MATU, U, MATV, V, Z, B, IRHS, IERR, RV1)
 
subroutine mgnsvd (NU, NV, NZ, NB, M, N, W, MATU, U, MATV, V, Z,
 
subroutine grsvd (NU, NV, NB, M, N, W, MATU, U, MATV, V, B, IRHS,
 
real *8 function srelpr (DUMMY)
 

Function/Subroutine Documentation

◆ grsvd()

subroutine grsvd ( integer  NU,
integer  NV,
integer  NB,
integer  M,
integer  N,
real*8, dimension(1)  W,
logical  MATU,
real*8, dimension(nu,1)  U,
logical  MATV,
real*8, dimension(nv,1)  V,
real*8, dimension(nb,irhs)  B,
integer  IRHS 
)
456  * ierr, rv1)
457 c
458  INTEGER i, j, k, l, m, n, ii, i1, kk, k1, ll, l1, mn, nu, nv, nb,
459  * its, ierr, irhs
460  REAL*8 w(1), u(nu,1), v(nv,1), b(nb,irhs), rv1(1)
461  REAL*8 c, f, g, h, s, x, y, z, eps, scale, srelpr, dummy
462  REAL*8 dsqrt, dmax1, dabs, dsign
463  LOGICAL matu, matv
464 c
465 c this SUBROUTINE is a translation of the algol procedure svd,
466 c num. math. 14, 403-420(1970) by golub and reinsch.
467 c handbook for auto. comp., vol ii-linear algebra, 134-151(1971).
468 c
469 c this SUBROUTINE determines the singular value decomposition
470 c t
471 c a=usv of a REAL m by n rectangular matrix. householder
472 c bidiagonalization and a variant of the qr algorithm are used.
473 c grsvd assumes that a copy of the matrix a is in the array u. it
474 c also assumes m .GE. n. IF m .LT. n, THEN compute the singular
475 c t t t t
476 c VALUE decomposition of a . IF a =uwv , THEN a=vwu .
477 c
478 c grsvd can also be used to compute the minimal length least squares
479 c solution to the overdetermined linear system a*x=b.
480 c
481 c on input-
482 c
483 c nu must be set to the row dimension of two-dimensional
484 c array parameters u as declared in the calling PROGRAM
485 c dimension statement. note that nu must be at least
486 c as large as m,
487 c
488 c nv must be set to the row dimension of the two-dimensional
489 c array PARAMETER v as declared in the calling PROGRAM
490 c dimension statement. nv must be at least as large as n,
491 c
492 c nb must be set to the row dimension of two-dimensional
493 c array parameters b as declared in the calling PROGRAM
494 c dimension statement. note that nb must be at least
495 c as large as m,
496 c
497 c m is the number of rows of a(and u),
498 c
499 c n is the number of columns of a(and u) and the order of v,
500 c
501 c a CONTAINS the rectangular input matrix to be decomposed,
502 c
503 c b CONTAINS the irhs right-hand-sides of the overdetermined
504 c linear system a*x=b. IF irhs .GT. 0, THEN on output,
505 c the first n components of these irhs columns of b
506 c t
507 c will contain u b. thus, to compute the minimal length least
508 c +
509 c squares solution, one must compute v*w times the columns of
510 c + +
511 c b, WHERE w is a diagonal matrix, w(i)=0 IF w(i) is
512 c negligible, otherwise is 1/w(i). IF irhs=0, b may coincide
513 c with a or u and will not be referenced,
514 c
515 c irhs is the number of right-hand-sides of the overdetermined
516 c system a*x=b. irhs should be set to zero IF only the singula
517 c VALUE decomposition of a is desired,
518 c
519 c matu should be set to .true. IF the u matrix in the
520 c decomposition is desired, and to .false. otherwise,
521 c
522 c matv should be set to .true. IF the v matrix in the
523 c decomposition is desired, and to .false. otherwise.
524 c
525 c on output-
526 c
527 c w CONTAINS the n(non-negative) singular values of a(the
528 c diagonal elements of s). they are unordered. IF an
529 c error EXIT is made, the singular values should be correct
530 c for indices ierr+1,ierr+2,...,n,
531 c
532 c u CONTAINS the matrix u(orthogonal column vectors) of the
533 c decomposition IF matu has been set to .true. otherwise
534 c u is used as a temporary array.
535 c IF an error EXIT is made, the columns of u corresponding
536 c to indices of correct singular values should be correct,
537 c
538 c v CONTAINS the matrix v(orthogonal) of the decomposition IF
539 c matv has been set to .true. otherwise v is not referenced.
540 c IF an error EXIT is made, the columns of v corresponding to
541 c indices of correct singular values should be correct,
542 c
543 c ierr is set to
544 c zero for normal RETURN,
545 c k IF the k-th singular VALUE has not been
546 c determined after 30 iterations,
547 c -1 IF irhs .LT. 0 ,
548 c -2 IF m .LT. n ,
549 c -3 IF nu .LT. m .OR. nb .LT. m,
550 c -4 IF nv .LT. n .
551 c
552 c rv1 is a temporary storage array.
553 c
554 c this SUBROUTINE has been checked by the pfort verifier
555 c(ryder, b.g. 'THE PFORT VERIFIER', software - practice and
556 c experience, vol.4, 359-377, 1974) for adherence to a large,
557 c carefully defined, portable subset of american national standar
558 c fortran called pfort.
559 c
560 c original version of this code is SUBROUTINE svd in release 2 of
561 c eispack.
562 c
563 c modified by tony f. chan,
564 c comp. sci. dept, yale univ.,
565 c box 2158, yale station,
566 c ct 06520
567 c last modified : january, 1982.
568 c
569 c ------------------------------------------------------------------
570 c
571 c ********** srelpr is a machine-dependent FUNCTION specifying
572 c the relative precision of floating point arithmetic.
573 c
574 c **********
575 c
576  ierr = 0
577  IF (irhs.GE.0) GO TO 10
578  ierr = -1
579  RETURN
580  10 IF (m.GE.n) GO TO 20
581  ierr = -2
582  RETURN
583  20 IF (nu.GE.m .AND. nb.GE.m) GO TO 30
584  ierr = -3
585  RETURN
586  30 IF (nv.GE.n) GO TO 40
587  ierr = -4
588  RETURN
589  40 CONTINUE
590 c
591 c ********** householder reduction to bidiagonal form **********
592  g = 0.d0
593  scale = 0.d0
594  x = 0.d0
595 c
596  DO 260 i=1,n
597  l = i + 1
598  rv1(i) = scale*g
599  g = 0.d0
600  s = 0.d0
601  scale = 0.d0
602 c
603 c compute left transformations that zero the subdiagonal elements
604 c of the i-th column.
605 c
606  DO 50 k=i,m
607  scale = scale + dabs(u(k,i))
608  50 CONTINUE
609 c
610  IF (scale.EQ.0.d0) GO TO 160
611 c
612  DO 60 k=i,m
613  u(k,i) = u(k,i)/scale
614  s = s + u(k,i)**2
615  60 CONTINUE
616 c
617  f = u(i,i)
618  g = -dsign(dsqrt(s),f)
619  h = f*g - s
620  u(i,i) = f - g
621  IF (i.EQ.n) GO TO 100
622 c
623 c apply left transformations to remaining columns of a.
624 c
625  DO 90 j=l,n
626  s = 0.d0
627 c
628  DO 70 k=i,m
629  s = s + u(k,i)*u(k,j)
630  70 CONTINUE
631 c
632  f = s/h
633 c
634  DO 80 k=i,m
635  u(k,j) = u(k,j) + f*u(k,i)
636  80 CONTINUE
637  90 CONTINUE
638 c
639 c apply left transformations to the columns of b IF irhs .GT. 0
640 c
641  100 IF (irhs.EQ.0) GO TO 140
642  DO 130 j=1,irhs
643  s = 0.d0
644  DO 110 k=i,m
645  s = s + u(k,i)*b(k,j)
646  110 CONTINUE
647  f = s/h
648  DO 120 k=i,m
649  b(k,j) = b(k,j) + f*u(k,i)
650  120 CONTINUE
651  130 CONTINUE
652 c
653 c compute right transformations.
654 c
655  140 DO 150 k=i,m
656  u(k,i) = scale*u(k,i)
657  150 CONTINUE
658 c
659  160 w(i) = scale*g
660  g = 0.d0
661  s = 0.d0
662  scale = 0.d0
663  IF (i.GT.m .OR. i.EQ.n) GO TO 250
664 c
665  DO 170 k=l,n
666  scale = scale + dabs(u(i,k))
667  170 CONTINUE
668 c
669  IF (scale.EQ.0.d0) GO TO 250
670 c
671  DO 180 k=l,n
672  u(i,k) = u(i,k)/scale
673  s = s + u(i,k)**2
674  180 CONTINUE
675 c
676  f = u(i,l)
677  g = -dsign(dsqrt(s),f)
678  h = f*g - s
679  u(i,l) = f - g
680 c
681  DO 190 k=l,n
682  rv1(k) = u(i,k)/h
683  190 CONTINUE
684 c
685  IF (i.EQ.m) GO TO 230
686 c
687  DO 220 j=l,m
688  s = 0.d0
689 c
690  DO 200 k=l,n
691  s = s + u(j,k)*u(i,k)
692  200 CONTINUE
693 c
694  DO 210 k=l,n
695  u(j,k) = u(j,k) + s*rv1(k)
696  210 CONTINUE
697  220 CONTINUE
698 c
699  230 DO 240 k=l,n
700  u(i,k) = scale*u(i,k)
701  240 CONTINUE
702 c
703  250 x = dmax1(x,dabs(w(i))+dabs(rv1(i)))
704  260 CONTINUE
705 c ********** accumulation of right-hand transformations **********
706  IF (.NOT.matv) GO TO 350
707 c ********** for i=n step -1 until 1 DO -- **********
708  DO 340 ii=1,n
709  i = n + 1 - ii
710  IF (i.EQ.n) GO TO 330
711  IF (g.EQ.0.d0) GO TO 310
712 c
713  DO 270 j=l,n
714 c ********** double division avoids possible underflow **********
715  v(j,i) = (u(i,j)/u(i,l))/g
716  270 CONTINUE
717 c
718  DO 300 j=l,n
719  s = 0.d0
720 c
721  DO 280 k=l,n
722  s = s + u(i,k)*v(k,j)
723  280 CONTINUE
724 c
725  DO 290 k=l,n
726  v(k,j) = v(k,j) + s*v(k,i)
727  290 CONTINUE
728  300 CONTINUE
729 c
730  310 DO 320 j=l,n
731  v(i,j) = 0.d0
732  v(j,i) = 0.d0
733  320 CONTINUE
734 c
735  330 v(i,i) = 1.d0
736  g = rv1(i)
737  l = i
738  340 CONTINUE
739 c ********** accumulation of left-hand transformations **********
740  350 IF (.NOT.matu) GO TO 470
741 c **********for i=min(m,n) step -1 until 1 DO -- **********
742  mn = n
743  IF (m.LT.n) mn = m
744 c
745  DO 460 ii=1,mn
746  i = mn + 1 - ii
747  l = i + 1
748  g = w(i)
749  IF (i.EQ.n) GO TO 370
750 c
751  DO 360 j=l,n
752  u(i,j) = 0.d0
753  360 CONTINUE
754 c
755  370 IF (g.EQ.0.d0) GO TO 430
756  IF (i.EQ.mn) GO TO 410
757 c
758  DO 400 j=l,n
759  s = 0.d0
760 c
761  DO 380 k=l,m
762  s = s + u(k,i)*u(k,j)
763  380 CONTINUE
764 c ********** double division avoids possible underflow **********
765  f = (s/u(i,i))/g
766 c
767  DO 390 k=i,m
768  u(k,j) = u(k,j) + f*u(k,i)
769  390 CONTINUE
770  400 CONTINUE
771 c
772  410 DO 420 j=i,m
773  u(j,i) = u(j,i)/g
774  420 CONTINUE
775 c
776  GO TO 450
777 c
778  430 DO 440 j=i,m
779  u(j,i) = 0.d0
780  440 CONTINUE
781 c
782  450 u(i,i) = u(i,i) + 1.d0
783  460 CONTINUE
784 c ********** diagonalization of the bidiagonal form **********
785  470 eps = srelpr(dummy)*x
786 c ********** for k=n step -1 until 1 DO -- **********
787  DO 650 kk=1,n
788  k1 = n - kk
789  k = k1 + 1
790  its = 0
791 c ********** test for splitting.
792 c for l=k step -1 until 1 DO -- **********
793  480 DO 490 ll=1,k
794  l1 = k - ll
795  l = l1 + 1
796  IF (dabs(rv1(l)).LE.eps) GO TO 550
797 c ********** rv1(1) is always zero, so there is no EXIT
798 c through the bottom of the loop **********
799  IF (dabs(w(l1)).LE.eps) GO TO 500
800  490 CONTINUE
801 c ********** cancellation of rv1(l) IF l greater than 1 **********
802  500 c = 0.d0
803  s = 1.d0
804 c
805  DO 540 i=l,k
806  f = s*rv1(i)
807  rv1(i) = c*rv1(i)
808  IF (dabs(f).LE.eps) GO TO 550
809  g = w(i)
810  h = dsqrt(f*f+g*g)
811  w(i) = h
812  c = g/h
813  s = -f/h
814 c
815 c apply left transformations to b IF irhs .GT. 0
816 c
817  IF (irhs.EQ.0) GO TO 520
818  DO 510 j=1,irhs
819  y = b(l1,j)
820  z = b(i,j)
821  b(l1,j) = y*c + z*s
822  b(i,j) = -y*s + z*c
823  510 CONTINUE
824  520 CONTINUE
825 c
826  IF (.NOT.matu) GO TO 540
827 c
828  DO 530 j=1,m
829  y = u(j,l1)
830  z = u(j,i)
831  u(j,l1) = y*c + z*s
832  u(j,i) = -y*s + z*c
833  530 CONTINUE
834 c
835  540 CONTINUE
836 c ********** test for convergence **********
837  550 z = w(k)
838  IF (l.EQ.k) GO TO 630
839 c ********** shift from bottom 2 by 2 minor **********
840  IF (its.EQ.30) GO TO 660
841  its = its + 1
842  x = w(l)
843  y = w(k1)
844  g = rv1(k1)
845  h = rv1(k)
846  f = ((y-z)*(y+z)+(g-h)*(g+h))/(2.d0*h*y)
847  g = dsqrt(f*f+1.0)
848  f = ((x-z)*(x+z)+h*(y/(f+dsign(g,f))-h))/x
849 c ********** next qr transformation **********
850  c = 1.0
851  s = 1.0
852 c
853  DO 620 i1=l,k1
854  i = i1 + 1
855  g = rv1(i)
856  y = w(i)
857  h = s*g
858  g = c*g
859  z = dsqrt(f*f+h*h)
860  rv1(i1) = z
861  c = f/z
862  s = h/z
863  f = x*c + g*s
864  g = -x*s + g*c
865  h = y*s
866  y = y*c
867  IF (.NOT.matv) GO TO 570
868 c
869  DO 560 j=1,n
870  x = v(j,i1)
871  z = v(j,i)
872  v(j,i1) = x*c + z*s
873  v(j,i) = -x*s + z*c
874  560 CONTINUE
875 c
876  570 z = dsqrt(f*f+h*h)
877  w(i1) = z
878 c ********** rotation can be arbitrary IF z is zero **********
879  IF (z.EQ.0.d0) GO TO 580
880  c = f/z
881  s = h/z
882  580 f = c*g + s*y
883  x = -s*g + c*y
884 c
885 c apply left transformations to b IF irhs .GT. 0
886 c
887  IF (irhs.EQ.0) GO TO 600
888  DO 590 j=1,irhs
889  y = b(i1,j)
890  z = b(i,j)
891  b(i1,j) = y*c + z*s
892  b(i,j) = -y*s + z*c
893  590 CONTINUE
894  600 CONTINUE
895 c
896  IF (.NOT.matu) GO TO 620
897 c
898  DO 610 j=1,m
899  y = u(j,i1)
900  z = u(j,i)
901  u(j,i1) = y*c + z*s
902  u(j,i) = -y*s + z*c
903  610 CONTINUE
904 c
905  620 CONTINUE
906 c
907  rv1(l) = 0.d0
908  rv1(k) = f
909  w(k) = x
910  GO TO 480
911 c ********** convergence **********
912  630 IF (z.GE.0.d0) GO TO 650
913 c ********** w(k) is made non-negative **********
914  w(k) = -z
915  IF (.NOT.matv) GO TO 650
916 c
917  DO 640 j=1,n
918  v(j,k) = -v(j,k)
919  640 CONTINUE
920 c
921  650 CONTINUE
922 c
923  GO TO 670
924 c ********** set error -- no convergence to a
925 c singular VALUE after 30 iterations **********
926  660 ierr = k
927  670 RETURN
928 c ********** last card of grsvd **********
real *8 function srelpr(DUMMY)
Definition: hybsvd.f:986
#define min(a, b)
Definition: cascade.c:31
subroutine grsvd(NU, NV, NB, M, N, W, MATU, U, MATV, V, B, IRHS,
Definition: hybsvd.f:456
subroutine elements(inpc, textpart, kon, ipkon, lakon, nkon, ne, ne_, set, istartset, iendset, ialset, nset, nset_, nalset, nalset_, mi, ixfree, iponor, xnor, istep, istat, n, iline, ipol, inl, ipoinp, inp, iaxial, ipoinpc, solid, cfd, network, filab, nlabel, out3d, iuel, nuel_)
Definition: elements.f:24

◆ hybsvd()

subroutine hybsvd ( integer  NA,
integer  NU,
integer  NV,
integer  NZ,
  NB,
integer  M,
integer  N,
real*8, dimension(na,1)  A,
real*8, dimension(1)  W,
logical  MATU,
real*8, dimension(nu,1)  U,
logical  MATV,
real*8, dimension(nv,1)  V,
real*8, dimension(nz,1)  Z,
real*8, dimension(nb,irhs)  B,
integer  IRHS,
integer  IERR,
real*8, dimension(1)  RV1 
)
3  INTEGER na, nu, nv, nz, m, n, irhs, ierr, min0
4  REAL*8 a(na,1), w(1), u(nu,1), v(nv,1), z(nz,1), b(nb,irhs)
5  REAL*8 rv1(1)
6  LOGICAL matu, matv
7 C
8 C THIS ROUTINE IS A MODIFICATION OF THE GOLUB-REINSCH PROCEDURE (1)
9 C T
10 C FOR COMPUTING THE SINGULAR VALUE DECOMPOSITION A = UWV OF A
11 C REAL M BY N RECTANGULAR MATRIX. U IS M BY MIN(M,N) CONTAINING
12 C THE LEFT SINGULAR VECTORS, W IS A MIN(M,N) BY MIN(M,N) DIAGONAL
13 C MATRIX CONTAINING THE SINGULAR VALUES, AND V IS N BY MIN(M,N)
14 C CONTAINING THE RIGHT SINGULAR VECTORS.
15 C
16 C THE ALGORITHM IMPLEMENTED IN THIS
17 C ROUTINE HAS A HYBRID NATURE. WHEN M IS APPROXIMATELY EQUAL TO N,
18 C THE GOLUB-REINSCH ALGORITHM IS USED, BUT WHEN EITHER OF THE RATIOS
19 C M/N OR N/M IS GREATER THAN ABOUT 2,
20 C A MODIFIED VERSION OF THE GOLUB-REINSCH
21 C ALGORITHM IS USED. THIS MODIFIED ALGORITHM FIRST TRANSFORMS A
22 C T
23 C INTO UPPER TRIANGULAR FORM BY HOUSEHOLDER TRANSFORMATIONS L
24 C AND THEN USES THE GOLUB-REINSCH ALGORITHM TO FIND THE SINGULAR
25 C VALUE DECOMPOSITION OF THE RESULTING UPPER TRIANGULAR MATRIX R.
26 C WHEN U IS NEEDED EXPLICITLY IN THE CASE M.GE.N (OR V IN THE CASE
27 C M.LT.N), AN EXTRA ARRAY Z (OF SIZE AT LEAST
28 C MIN(M,N)**2) IS NEEDED, BUT OTHERWISE Z IS NOT REFERENCED
29 C AND NO EXTRA STORAGE IS REQUIRED. THIS HYBRID METHOD
30 C SHOULD BE MORE EFFICIENT THAN THE GOLUB-REINSCH ALGORITHM WHEN
31 C M/N OR N/M IS LARGE. FOR DETAILS, SEE (2).
32 C
33 C WHEN M .GE. N,
34 C HYBSVD CAN ALSO BE USED TO COMPUTE THE MINIMAL LENGTH LEAST
35 C SQUARES SOLUTION TO THE OVERDETERMINED LINEAR SYSTEM A*X=B.
36 C IF M .LT. N (I.E. FOR UNDERDETERMINED SYSTEMS), THE RHS B
37 C IS NOT PROCESSED.
38 C
39 C NOTICE THAT THE SINGULAR VALUE DECOMPOSITION OF A MATRIX
40 C IS UNIQUE ONLY UP TO THE SIGN OF THE CORRESPONDING COLUMNS
41 C OF U AND V.
42 C
43 C THIS ROUTINE HAS BEEN CHECKED BY THE PFORT VERIFIER (3) FOR
44 C ADHERENCE TO A LARGE, CAREFULLY DEFINED, PORTABLE SUBSET OF
45 C AMERICAN NATIONAL STANDARD FORTRAN CALLED PFORT.
46 C
47 C REFERENCES:
48 C
49 C (1) GOLUB,G.H. AND REINSCH,C. (1970) 'SINGULAR VALUE
50 C DECOMPOSITION AND LEAST SQUARES SOLUTIONS,'
51 C NUMER. MATH. 14,403-420, 1970.
52 C
53 C (2) CHAN,T.F. (1982) 'AN IMPROVED ALGORITHM FOR COMPUTING
54 C THE SINGULAR VALUE DECOMPOSITION,' ACM TOMS, VOL.8,
55 C NO. 1, MARCH, 1982.
56 C
57 C (3) RYDER,B.G. (1974) 'THE PFORT VERIFIER,' SOFTWARE -
58 C PRACTICE AND EXPERIENCE, VOL.4, 359-377, 1974.
59 C
60 C ON INPUT:
61 C
62 C NA MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
63 C ARRAY PARAMETER A AS DECLARED IN THE CALLING PROGRAM
64 C DIMENSION STATEMENT. NOTE THAT NA MUST BE AT LEAST
65 C AS LARGE AS M.
66 C
67 C NU MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
68 C ARRAY U AS DECLARED IN THE CALLING PROGRAM DIMENSION
69 C STATEMENT. NU MUST BE AT LEAST AS LARGE AS M.
70 C
71 C NV MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
72 C ARRAY PARAMETER V AS DECLARED IN THE CALLING PROGRAM
73 C DIMENSION STATEMENT. NV MUST BE AT LEAST AS LARGE AS N.
74 C
75 C NZ MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
76 C ARRAY PARAMETER Z AS DECLARED IN THE CALLING PROGRAM
77 C DIMENSION STATEMENT. NOTE THAT NZ MUST BE AT LEAST
78 C AS LARGE AS MIN(M,N).
79 C
80 C NB MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL
81 C ARRAY PARAMETER B AS DECLARED IN THE CALLING PROGRAM
82 C DIMENSION STATEMENT. NB MUST BE AT LEAST AS LARGE AS M.
83 C
84 C M IS THE NUMBER OF ROWS OF A (AND U).
85 C
86 C N IS THE NUMBER OF COLUMNS OF A (AND NUMBER OF ROWS OF V).
87 C
88 C A CONTAINS THE RECTANGULAR INPUT MATRIX TO BE DECOMPOSED.
89 C
90 C B CONTAINS THE IRHS RIGHT-HAND-SIDES OF THE OVERDETERMINED
91 C LINEAR SYSTEM A*X=B. IF IRHS .GT. 0 AND M .GE. N,
92 C THEN ON OUTPUT, THE FIRST N COMPONENTS OF THESE IRHS COLUMNS
93 C T
94 C WILL CONTAIN U B. THUS, TO COMPUTE THE MINIMAL LENGTH LEAST
95 C +
96 C SQUARES SOLUTION, ONE MUST COMPUTE V*W TIMES THE COLUMNS OF
97 C + +
98 C B, WHERE W IS A DIAGONAL MATRIX, W (I)=0 IF W(I) IS
99 C NEGLIGIBLE, OTHERWISE IS 1/W(I). IF IRHS=0 OR M.LT.N,
100 C B IS NOT REFERENCED.
101 C
102 C IRHS IS THE NUMBER OF RIGHT-HAND-SIDES OF THE OVERDETERMINED
103 C SYSTEM A*X=B. IRHS SHOULD BE SET TO ZERO IF ONLY THE SINGULAR
104 C VALUE DECOMPOSITION OF A IS DESIRED.
105 C
106 C MATU SHOULD BE SET TO .TRUE. IF THE U MATRIX IN THE
107 C DECOMPOSITION IS DESIRED, AND TO .FALSE. OTHERWISE.
108 C
109 C MATV SHOULD BE SET TO .TRUE. IF THE V MATRIX IN THE
110 C DECOMPOSITION IS DESIRED, AND TO .FALSE. OTHERWISE.
111 C
112 C WHEN HYBSVD IS USED TO COMPUTE THE MINIMAL LENGTH LEAST
113 C SQUARES SOLUTION TO AN OVERDETERMINED SYSTEM, MATU SHOULD
114 C BE SET TO .FALSE. , AND MATV SHOULD BE SET TO .TRUE. .
115 C
116 C ON OUTPUT:
117 C
118 C A IS UNALTERED (UNLESS OVERWRITTEN BY U OR V).
119 C
120 C W CONTAINS THE (NON-NEGATIVE) SINGULAR VALUES OF A (THE
121 C DIAGONAL ELEMENTS OF W). THEY ARE SORTED IN DESCENDING
122 C ORDER. IF AN ERROR EXIT IS MADE, THE SINGULAR VALUES
123 C SHOULD BE CORRECT AND SORTED FOR INDICES IERR+1,...,MIN(M,N).
124 C
125 C U CONTAINS THE MATRIX U (ORTHOGONAL COLUMN VECTORS) OF THE
126 C DECOMPOSITION IF MATU HAS BEEN SET TO .TRUE. IF MATU IS
127 C FALSE, THEN U IS EITHER USED AS A TEMPORARY STORAGE (IF
128 C M .GE. N) OR NOT REFERENCED (IF M .LT. N).
129 C U MAY COINCIDE WITH A IN THE CALLING SEQUENCE.
130 C IF AN ERROR EXIT IS MADE, THE COLUMNS OF U CORRESPONDING
131 C TO INDICES OF CORRECT SINGULAR VALUES SHOULD BE CORRECT.
132 C
133 C V CONTAINS THE MATRIX V (ORTHOGONAL) OF THE DECOMPOSITION IF
134 C MATV HAS BEEN SET TO .TRUE. IF MATV IS
135 C FALSE, THEN V IS EITHER USED AS A TEMPORARY STORAGE (IF
136 C M .LT. N) OR NOT REFERENCED (IF M .GE. N).
137 C IF M .GE. N, V MAY ALSO COINCIDE WITH A. IF AN ERROR
138 C EXIT IS MADE, THE COLUMNS OF V CORRESPONDING TO INDICES OF
139 C CORRECT SINGULAR VALUES SHOULD BE CORRECT.
140 C
141 C Z CONTAINS THE MATRIX X IN THE SINGULAR VALUE DECOMPOSITION
142 C T
143 C OF R=XSY, IF THE MODIFIED ALGORITHM IS USED. IF THE
144 C GOLUB-REINSCH PROCEDURE IS USED, THEN IT IS NOT REFERENCED.
145 C IF MATU HAS BEEN SET TO .FALSE. IN THE CASE M.GE.N (OR
146 C MATV SET TO .FALSE. IN THE CASE M.LT.N), THEN Z IS NOT
147 C REFERENCED AND NO EXTRA STORAGE IS REQUIRED.
148 C
149 C IERR IS SET TO
150 C ZERO FOR NORMAL RETURN,
151 C K IF THE K-TH SINGULAR VALUE HAS NOT BEEN
152 C DETERMINED AFTER 30 ITERATIONS.
153 C -1 IF IRHS .LT. 0 .
154 C -2 IF M .LT. 1 .OR. N .LT. 1
155 C -3 IF NA .LT. M .OR. NU .LT. M .OR. NB .LT. M.
156 C -4 IF NV .LT. N .
157 C -5 IF NZ .LT. MIN(M,N).
158 C
159 C RV1 IS A TEMPORARY STORAGE ARRAY OF LENGTH AT LEAST MIN(M,N).
160 C
161 C PROGRAMMED BY : TONY CHAN
162 C BOX 2158, YALE STATION,
163 C COMPUTER SCIENCE DEPT, YALE UNIV.,
164 C NEW HAVEN, CT 06520.
165 C LAST MODIFIED : JANUARY, 1982.
166 C
167 C HYBSVD USES THE FOLLOWING FUNCTIONS AND SUBROUTINES.
168 C INTERNAL GRSVD, MGNSVD, SRELPR
169 C FORTRAN MIN0,DABS,DSQRT,DFLOAT,DSIGN,DMAX1
170 C BLAS DSWAP
171 C
172 C -----------------------------------------------------------------
173 C ERROR CHECK.
174 C
175  ierr = 0
176  IF (irhs.GE.0) GO TO 10
177  ierr = -1
178  RETURN
179  10 IF (m.GE.1 .AND. n.GE.1) GO TO 20
180  ierr = -2
181  RETURN
182  20 IF (na.GE.m .AND. nu.GE.m .AND. nb.GE.m) GO TO 30
183  ierr = -3
184  RETURN
185  30 IF (nv.GE.n) GO TO 40
186  ierr = -4
187  RETURN
188  40 IF (nz.GE.min0(m,n)) GO TO 50
189  ierr = -5
190  RETURN
191  50 CONTINUE
192 C
193 C FIRST COPIES A INTO EITHER U OR V ACCORDING TO WHETHER
194 C M .GE. N OR M .LT. N, AND THEN CALLS SUBROUTINE MGNSVD
195 C WHICH ASSUMES THAT NUMBER OF ROWS .GE. NUMBER OF COLUMNS.
196 C
197  IF (m.LT.n) GO TO 80
198 C
199 C M .GE. N CASE.
200 C
201  DO 70 i=1,m
202  DO 60 j=1,n
203  u(i,j) = a(i,j)
204  60 CONTINUE
205  70 CONTINUE
206 C
207  CALL mgnsvd(nu, nv, nz, nb, m, n, w, matu, u, matv, v, z, b,
208  * irhs, ierr, rv1)
209  RETURN
210 C
211  80 CONTINUE
212 C T
213 C M .LT. N CASE. COPIES A INTO V.
214 C
215  DO 100 i=1,m
216  DO 90 j=1,n
217  v(j,i) = a(i,j)
218  90 CONTINUE
219  100 CONTINUE
220  CALL mgnsvd(nv, nu, nz, nb, n, m, w, matv, v, matu, u, z, b, 0,
221  * ierr, rv1)
222  RETURN
subroutine mgnsvd(NU, NV, NZ, NB, M, N, W, MATU, U, MATV, V, Z,
Definition: hybsvd.f:226

◆ mgnsvd()

subroutine mgnsvd ( integer  NU,
integer  NV,
integer  NZ,
  NB,
integer  M,
integer  N,
real*8, dimension(1)  W,
logical  MATU,
real*8, dimension(nu,1)  U,
logical  MATV,
real*8, dimension(nv,1)  V,
real*8, dimension(nz,1)  Z 
)
226  * b, irhs, ierr, rv1)
227 c
228 c the description of SUBROUTINE mgnsvd is almost identical
229 c to that for SUBROUTINE hybsvd above, with the exception
230 c that mgnsvd assumes m .GE. n.
231 c it also assumes that a copy of the matrix a is in the array u.
232 c
233  INTEGER nu, nv, nz, m, n, irhs, ierr, ip1, i, j, k, im1, iback
234  REAL*8 w(1), u(nu,1), v(nv,1), z(nz,1), b(nb,irhs), rv1(1)
235  REAL*8 xovrpt, c, r, g, scale, dsign, dabs, dsqrt, f, s, h
236  REAL*8 dfloat
237  LOGICAL matu, matv
238 c
239 c set VALUE for c. the VALUE for c depends on the relative
240 c efficiency of floating point multiplications, floating point
241 c additions and two-dimensional array indexings on the
242 c computer WHERE this SUBROUTINE is to be run. c should
243 c usually be between 2 and 4. for details on choosing c, see
244 c(2). the algorithm is not sensitive to the VALUE of c
245 c actually used as long as c is between 2 and 4.
246 c
247  c = 4.d0
248 c
249 c determine cross-over point
250 c
251  IF (matu .AND. matv) xovrpt = (c+7.d0/3.d0)/c
252  IF (matu .AND. .NOT.matv) xovrpt = (c+7.d0/3.d0)/c
253  IF (.NOT.matu .AND. matv) xovrpt = 5.d0/3.d0
254  IF (.NOT.matu .AND. .NOT.matv) xovrpt = 5.d0/3.d0
255 c
256 c determine whether to USE golub-reinsch or the modified
257 c algorithm.
258 c
259  r = dfloat(m)/dfloat(n)
260  IF (r.GE.xovrpt) GO TO 10
261 c
262 c USE golub-reinsch procedure
263 c
264  CALL grsvd(nu, nv, nb, m, n, w, matu, u, matv, v, b, irhs, ierr,
265  * rv1)
266  GO TO 330
267 c
268 c USE modified algorithm
269 c
270  10 CONTINUE
271 c
272 c triangularize u by householder transformations, using
273 c w and rv1 as temporary storage.
274 c
275  DO 110 i=1,n
276  g = 0.d0
277  s = 0.d0
278  scale = 0.d0
279 c
280 c perform scaling of columns to avoid unnecssary overflow
281 c or underflow
282 c
283  DO 20 k=i,m
284  scale = scale + dabs(u(k,i))
285  20 CONTINUE
286  IF (scale.EQ.0.d0) GO TO 110
287  DO 30 k=i,m
288  u(k,i) = u(k,i)/scale
289  s = s + u(k,i)*u(k,i)
290  30 CONTINUE
291 c
292 c the vector e of the householder transformation i + ee'/H
293 C WILL BE STORED IN COLUMN I OF U. THE TRANSFORMED ELEMENT
294 C U(I,I) WILL BE STORED IN W(I) AND THE SCALAR H IN
295 C RV1(I).
296 C
297  F = U(I,I)
298  G = -DSIGN(DSQRT(S),F)
299  H = F*G - S
300  U(I,I) = F - G
301  RV1(I) = H
302  W(I) = SCALE*G
303 C
304 .EQ. IF (IN) GO TO 70
305 C
306 C APPLY TRANSFORMATIONS TO REMAINING COLUMNS OF A
307 C
308  IP1 = I + 1
309  DO 60 J=IP1,N
310  S = 0.d0
311  DO 40 K=I,M
312  S = S + U(K,I)*U(K,J)
313  40 CONTINUE
314  F = S/H
315  DO 50 K=I,M
316  U(K,J) = U(K,J) + F*U(K,I)
317  50 CONTINUE
318  60 CONTINUE
319 C
320 .GT.C APPLY TRANSFORMATIONS TO COLUMNS OF B IF IRHS 0
321 C
322 .EQ. 70 IF (IRHS0) GO TO 110
323  DO 100 J=1,IRHS
324  S = 0.d0
325  DO 80 K=I,M
326  S = S + U(K,I)*B(K,J)
327  80 CONTINUE
328  F = S/H
329  DO 90 K=I,M
330  B(K,J) = B(K,J) + F*U(K,I)
331  90 CONTINUE
332  100 CONTINUE
333  110 CONTINUE
334 C
335 C COPY R INTO Z IF MATU = .TRUE.
336 C
337 .NOT. IF (MATU) GO TO 290
338  DO 130 I=1,N
339  DO 120 J=I,N
340  Z(J,I) = 0.d0
341  Z(I,J) = U(I,J)
342  120 CONTINUE
343  Z(I,I) = W(I)
344  130 CONTINUE
345 C
346 C ACCUMULATE HOUSEHOLDER TRANSFORMATIONS IN U
347 C
348  DO 240 IBACK=1,N
349  I = N - IBACK + 1
350  IP1 = I + 1
351  G = W(I)
352  H = RV1(I)
353 .EQ. IF (IN) GO TO 150
354 C
355  DO 140 J=IP1,N
356  U(I,J) = 0.d0
357  140 CONTINUE
358 C
359 .EQ. 150 IF (H0.d0) GO TO 210
360 .EQ. IF (IN) GO TO 190
361 C
362  DO 180 J=IP1,N
363  S = 0.d0
364  DO 160 K=IP1,M
365  S = S + U(K,I)*U(K,J)
366  160 CONTINUE
367  F = S/H
368  DO 170 K=I,M
369  U(K,J) = U(K,J) + F*U(K,I)
370  170 CONTINUE
371  180 CONTINUE
372 C
373  190 S = U(I,I)/H
374  DO 200 J=I,M
375  U(J,I) = U(J,I)*S
376  200 CONTINUE
377  GO TO 230
378 C
379  210 DO 220 J=I,M
380  U(J,I) = 0.d0
381  220 CONTINUE
382  230 U(I,I) = U(I,I) + 1.d0
383  240 CONTINUE
384 C
385 C COMPUTE SVD OF R (WHICH IS STORED IN Z)
386 C
387  CALL GRSVD(NZ, NV, NB, N, N, W, MATU, Z, MATV, V, B, IRHS, IERR,
388  * RV1)
389 C
390 C T
391 C FORM L*X TO OBTAIN U (WHERE R=XWY ). X IS RETURNED IN Z
392 C BY GRSVD. THE MATRIX MULTIPLY IS DONE ONE ROW AT A TIME,
393 C USING RV1 AS SCRATCH SPACE.
394 C
395  DO 280 I=1,M
396  DO 260 J=1,N
397  S = 0.d0
398  DO 250 K=1,N
399  S = S + U(I,K)*Z(K,J)
400  250 CONTINUE
401  RV1(J) = S
402  260 CONTINUE
403  DO 270 J=1,N
404  U(I,J) = RV1(J)
405  270 CONTINUE
406  280 CONTINUE
407  GO TO 330
408 C
409 C FORM R IN U BY ZEROING THE LOWER TRIANGULAR PART OF R IN U
410 C
411 .EQ. 290 IF (N1) GO TO 320
412  DO 310 I=2,N
413  IM1 = I - 1
414  DO 300 J=1,IM1
415  U(I,J) = 0.d0
416  300 CONTINUE
417  U(I,I) = W(I)
418  310 CONTINUE
419  320 U(1,1) = W(1)
420 C
421  CALL GRSVD(NU, NV, NB, N, N, W, MATU, U, MATV, V, B, IRHS, IERR,
422  * RV1)
423  330 CONTINUE
424  IERRP1 = IERR + 1
425 .LT..OR..LE..OR..EQ. IF (IERR0 N1 IERRP1N) RETURN
426 C
427 C SORT SINGULAR VALUES AND EXCHANGE COLUMNS OF U AND V ACCORDINGLY.
428 C SELECTION SORT MINIMIZES SWAPPING OF U AND V.
429 C
430  NM1 = N - 1
431  DO 360 I=IERRP1,NM1
432 C... FIND INDEX OF MAXIMUM SINGULAR VALUE
433  ID = I
434  IP1 = I + 1
435  DO 340 J=IP1,N
436 .GT. IF (W(J)W(ID)) ID = J
437  340 CONTINUE
438 .EQ. IF (IDI) GO TO 360
439 C... SWAP SINGULAR VALUES AND VECTORS
440  T = W(I)
441  W(I) = W(ID)
442  W(ID) = T
443  IF (MATV) CALL DSWAP(N, V(1,I), 1, V(1,ID), 1)
444  IF (MATU) CALL DSWAP(M, U(1,I), 1, U(1,ID), 1)
445 .LT. IF (IRHS1) GO TO 360
446  DO 350 KRHS=1,IRHS
447  T = B(I,KRHS)
448  B(I,KRHS) = B(ID,KRHS)
449  B(ID,KRHS) = T
450  350 CONTINUE
451  360 CONTINUE
452  RETURN
453 C ************** LAST CARD OF HYBSVD *****************
subroutine mgnsvd(NU, NV, NZ, NB, M, N, W, MATU, U, MATV, V, Z,
Definition: hybsvd.f:226
subroutine hybsvd(NA, NU, NV, NZ, NB, M, N, A, W, MATU, U, MATV, V, Z, B, IRHS, IERR, RV1)
Definition: hybsvd.f:3
subroutine grsvd(NU, NV, NB, M, N, W, MATU, U, MATV, V, B, IRHS,
Definition: hybsvd.f:456

◆ srelpr()

real*8 function srelpr ( real*8  DUMMY)
986  REAL*8 dummy
987 C
988 C SRELPR COMPUTES THE RELATIVE PRECISION OF THE FLOATING POINT
989 C ARITHMETIC OF THE MACHINE.
990 C
991 C IF TROUBLE WITH AUTOMATIC COMPUTATION OF THESE QUANTITIES,
992 C THEY CAN BE SET BY DIRECT ASSIGNMENT STATEMENTS.
993 C ASSUME THE COMPUTER HAS
994 C
995 C B = BASE OF ARITHMETIC
996 C T = NUMBER OF BASE B DIGITS
997 C
998 C THEN
999 C
1000 C SRELPR = B**(1-T)
1001 C
1002  REAL*8 s
1003 C
1004  srelpr = 1.d0
1005  10 srelpr = srelpr/2.d0
1006  s = 1.d0 + srelpr
1007  IF (s.GT.1.d0) GO TO 10
1008  srelpr = 2.d0*srelpr
1009  RETURN
real *8 function srelpr(DUMMY)
Definition: hybsvd.f:986
Hosted by OpenAircraft.com, (Michigan UAV, LLC)