dqform.f 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. *DECK DQFORM
  2. SUBROUTINE DQFORM (M, N, Q, LDQ, WA)
  3. C***BEGIN PROLOGUE DQFORM
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to DNSQ and DNSQE
  6. C***LIBRARY SLATEC
  7. C***TYPE DOUBLE PRECISION (QFORM-S, DQFORM-D)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C This subroutine proceeds from the computed QR factorization of
  12. C an M by N matrix A to accumulate the M by M orthogonal matrix
  13. C Q from its factored form.
  14. C
  15. C The subroutine statement is
  16. C
  17. C SUBROUTINE DQFORM(M,N,Q,LDQ,WA)
  18. C
  19. C where
  20. C
  21. C M is a positive integer input variable set to the number
  22. C of rows of A and the order of Q.
  23. C
  24. C N is a positive integer input variable set to the number
  25. C of columns of A.
  26. C
  27. C Q is an M by M array. On input the full lower trapezoid in
  28. C the first MIN(M,N) columns of Q contains the factored form.
  29. C On output Q has been accumulated into a square matrix.
  30. C
  31. C LDQ is a positive integer input variable not less than M
  32. C which specifies the leading dimension of the array Q.
  33. C
  34. C WA is a work array of length M.
  35. C
  36. C***SEE ALSO DNSQ, DNSQE
  37. C***ROUTINES CALLED (NONE)
  38. C***REVISION HISTORY (YYMMDD)
  39. C 800301 DATE WRITTEN
  40. C 890531 Changed all specific intrinsics to generic. (WRB)
  41. C 890831 Modified array declarations. (WRB)
  42. C 891214 Prologue converted to Version 4.0 format. (BAB)
  43. C 900326 Removed duplicate information from DESCRIPTION section.
  44. C (WRB)
  45. C 900328 Added TYPE section. (WRB)
  46. C***END PROLOGUE DQFORM
  47. INTEGER I, J, JM1, K, L, LDQ, M, MINMN, N, NP1
  48. DOUBLE PRECISION ONE, Q(LDQ,*), SUM, TEMP, WA(*), ZERO
  49. SAVE ONE, ZERO
  50. DATA ONE,ZERO /1.0D0,0.0D0/
  51. C
  52. C ZERO OUT UPPER TRIANGLE OF Q IN THE FIRST MIN(M,N) COLUMNS.
  53. C
  54. C***FIRST EXECUTABLE STATEMENT DQFORM
  55. MINMN = MIN(M,N)
  56. IF (MINMN .LT. 2) GO TO 30
  57. DO 20 J = 2, MINMN
  58. JM1 = J - 1
  59. DO 10 I = 1, JM1
  60. Q(I,J) = ZERO
  61. 10 CONTINUE
  62. 20 CONTINUE
  63. 30 CONTINUE
  64. C
  65. C INITIALIZE REMAINING COLUMNS TO THOSE OF THE IDENTITY MATRIX.
  66. C
  67. NP1 = N + 1
  68. IF (M .LT. NP1) GO TO 60
  69. DO 50 J = NP1, M
  70. DO 40 I = 1, M
  71. Q(I,J) = ZERO
  72. 40 CONTINUE
  73. Q(J,J) = ONE
  74. 50 CONTINUE
  75. 60 CONTINUE
  76. C
  77. C ACCUMULATE Q FROM ITS FACTORED FORM.
  78. C
  79. DO 120 L = 1, MINMN
  80. K = MINMN - L + 1
  81. DO 70 I = K, M
  82. WA(I) = Q(I,K)
  83. Q(I,K) = ZERO
  84. 70 CONTINUE
  85. Q(K,K) = ONE
  86. IF (WA(K) .EQ. ZERO) GO TO 110
  87. DO 100 J = K, M
  88. SUM = ZERO
  89. DO 80 I = K, M
  90. SUM = SUM + Q(I,J)*WA(I)
  91. 80 CONTINUE
  92. TEMP = SUM/WA(K)
  93. DO 90 I = K, M
  94. Q(I,J) = Q(I,J) - TEMP*WA(I)
  95. 90 CONTINUE
  96. 100 CONTINUE
  97. 110 CONTINUE
  98. 120 CONTINUE
  99. RETURN
  100. C
  101. C LAST CARD OF SUBROUTINE DQFORM.
  102. C
  103. END