dohtrl.f 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. *DECK DOHTRL
  2. SUBROUTINE DOHTRL (Q, N, NRDA, DIAG, IRANK, DIV, TD)
  3. C***BEGIN PROLOGUE DOHTRL
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to DBVSUP and DSUDS
  6. C***LIBRARY SLATEC
  7. C***TYPE DOUBLE PRECISION (OHTROL-S, DOHTRL-D)
  8. C***AUTHOR Watts, H. A., (SNLA)
  9. C***DESCRIPTION
  10. C
  11. C For a rank deficient problem, additional orthogonal
  12. C HOUSEHOLDER transformations are applied to the left side
  13. C of Q to further reduce the triangular form.
  14. C Thus, after application of the routines DORTHR and DOHTRL
  15. C to the original matrix, the result is a nonsingular
  16. C triangular matrix while the remainder of the matrix
  17. C has been zeroed out.
  18. C
  19. C***SEE ALSO DBVSUP, DSUDS
  20. C***ROUTINES CALLED DDOT
  21. C***REVISION HISTORY (YYMMDD)
  22. C 750601 DATE WRITTEN
  23. C 890531 Changed all specific intrinsics to generic. (WRB)
  24. C 890831 Modified array declarations. (WRB)
  25. C 891214 Prologue converted to Version 4.0 format. (BAB)
  26. C 900328 Added TYPE section. (WRB)
  27. C 910722 Updated AUTHOR section. (ALS)
  28. C***END PROLOGUE DOHTRL
  29. DOUBLE PRECISION DDOT
  30. INTEGER IRANK, IRP, J, K, KIR, KIRM, L, N, NMIR, NRDA
  31. DOUBLE PRECISION DD, DIAG(*), DIAGK, DIV(*), Q(NRDA,*), QS, SIG,
  32. 1 SQD, TD(*), TDV
  33. C***FIRST EXECUTABLE STATEMENT DOHTRL
  34. NMIR = N - IRANK
  35. IRP = IRANK + 1
  36. DO 40 K = 1, IRANK
  37. KIR = IRP - K
  38. DIAGK = DIAG(KIR)
  39. SIG = (DIAGK*DIAGK) + DDOT(NMIR,Q(IRP,KIR),1,Q(IRP,KIR),1)
  40. DD = SIGN(SQRT(SIG),-DIAGK)
  41. DIV(KIR) = DD
  42. TDV = DIAGK - DD
  43. TD(KIR) = TDV
  44. IF (K .EQ. IRANK) GO TO 30
  45. KIRM = KIR - 1
  46. SQD = DD*DIAGK - SIG
  47. DO 20 J = 1, KIRM
  48. QS = ((TDV*Q(KIR,J))
  49. 1 + DDOT(NMIR,Q(IRP,J),1,Q(IRP,KIR),1))/SQD
  50. Q(KIR,J) = Q(KIR,J) + QS*TDV
  51. DO 10 L = IRP, N
  52. Q(L,J) = Q(L,J) + QS*Q(L,KIR)
  53. 10 CONTINUE
  54. 20 CONTINUE
  55. 30 CONTINUE
  56. 40 CONTINUE
  57. RETURN
  58. END