dcscal.f 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. *DECK DCSCAL
  2. SUBROUTINE DCSCAL (A, NRDA, NROW, NCOL, COLS, COLSAV, ROWS,
  3. + ROWSAV, ANORM, SCALES, ISCALE, IC)
  4. C***BEGIN PROLOGUE DCSCAL
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DBVSUP and DSUDS
  7. C***LIBRARY SLATEC
  8. C***TYPE DOUBLE PRECISION (CSCALE-S, DCSCAL-D)
  9. C***AUTHOR Watts, H. A., (SNLA)
  10. C***DESCRIPTION
  11. C
  12. C This routine scales the matrix A by columns when needed.
  13. C
  14. C***SEE ALSO DBVSUP, DSUDS
  15. C***ROUTINES CALLED DDOT
  16. C***REVISION HISTORY (YYMMDD)
  17. C 750601 DATE WRITTEN
  18. C 890531 Changed all specific intrinsics to generic. (WRB)
  19. C 890831 Modified array declarations. (WRB)
  20. C 890911 Removed unnecessary intrinsics. (WRB)
  21. C 890911 REVISION DATE from Version 3.2
  22. C 891214 Prologue converted to Version 4.0 format. (BAB)
  23. C 900328 Added TYPE section. (WRB)
  24. C 910722 Updated AUTHOR section. (ALS)
  25. C***END PROLOGUE DCSCAL
  26. DOUBLE PRECISION DDOT
  27. INTEGER IC, IP, ISCALE, J, K, NCOL, NRDA, NROW
  28. DOUBLE PRECISION A(NRDA,*), ALOG2, ANORM, ASCALE, COLS(*),
  29. 1 COLSAV(*), CS, P, ROWS(*), ROWSAV(*), S,
  30. 2 SCALES(*), TEN20, TEN4
  31. C
  32. SAVE TEN4, TEN20
  33. DATA TEN4,TEN20 /1.0D4,1.0D20/
  34. C
  35. C BEGIN BLOCK PERMITTING ...EXITS TO 130
  36. C BEGIN BLOCK PERMITTING ...EXITS TO 60
  37. C***FIRST EXECUTABLE STATEMENT DCSCAL
  38. IF (ISCALE .NE. (-1)) GO TO 40
  39. C
  40. IF (IC .EQ. 0) GO TO 20
  41. DO 10 K = 1, NCOL
  42. COLS(K) = DDOT(NROW,A(1,K),1,A(1,K),1)
  43. 10 CONTINUE
  44. 20 CONTINUE
  45. C
  46. ASCALE = ANORM/NCOL
  47. DO 30 K = 1, NCOL
  48. CS = COLS(K)
  49. C .........EXIT
  50. IF ((CS .GT. TEN4*ASCALE) .OR. (TEN4*CS .LT. ASCALE))
  51. 1 GO TO 60
  52. C .........EXIT
  53. IF ((CS .LT. 1.0D0/TEN20) .OR. (CS .GT. TEN20))
  54. 1 GO TO 60
  55. 30 CONTINUE
  56. 40 CONTINUE
  57. C
  58. DO 50 K = 1, NCOL
  59. SCALES(K) = 1.0D0
  60. 50 CONTINUE
  61. C ......EXIT
  62. GO TO 130
  63. 60 CONTINUE
  64. C
  65. ALOG2 = LOG(2.0D0)
  66. ANORM = 0.0D0
  67. DO 110 K = 1, NCOL
  68. CS = COLS(K)
  69. IF (CS .NE. 0.0D0) GO TO 70
  70. SCALES(K) = 1.0D0
  71. GO TO 100
  72. 70 CONTINUE
  73. P = LOG(CS)/ALOG2
  74. IP = -0.5D0*P
  75. S = 2.0D0**IP
  76. SCALES(K) = S
  77. IF (IC .EQ. 1) GO TO 80
  78. COLS(K) = S*S*COLS(K)
  79. ANORM = ANORM + COLS(K)
  80. COLSAV(K) = COLS(K)
  81. 80 CONTINUE
  82. DO 90 J = 1, NROW
  83. A(J,K) = S*A(J,K)
  84. 90 CONTINUE
  85. 100 CONTINUE
  86. 110 CONTINUE
  87. C
  88. C ...EXIT
  89. IF (IC .EQ. 0) GO TO 130
  90. C
  91. DO 120 K = 1, NROW
  92. ROWS(K) = DDOT(NCOL,A(K,1),NRDA,A(K,1),NRDA)
  93. ROWSAV(K) = ROWS(K)
  94. ANORM = ANORM + ROWS(K)
  95. 120 CONTINUE
  96. 130 CONTINUE
  97. RETURN
  98. END