cscale.f 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. *DECK CSCALE
  2. SUBROUTINE CSCALE (A, NRDA, NROW, NCOL, COLS, COLSAV, ROWS,
  3. + ROWSAV, ANORM, SCALES, ISCALE, IC)
  4. C***BEGIN PROLOGUE CSCALE
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to BVSUP
  7. C***LIBRARY SLATEC
  8. C***TYPE SINGLE 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 BVSUP
  15. C***ROUTINES CALLED SDOT
  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 891214 Prologue converted to Version 4.0 format. (BAB)
  21. C 900328 Added TYPE section. (WRB)
  22. C 910722 Updated AUTHOR section. (ALS)
  23. C***END PROLOGUE CSCALE
  24. DIMENSION A(NRDA,*),COLS(*),COLSAV(*),SCALES(*),
  25. 1 ROWS(*),ROWSAV(*)
  26. C
  27. SAVE TEN4, TEN20
  28. DATA TEN4,TEN20/1.E+4,1.E+20/
  29. C
  30. C***FIRST EXECUTABLE STATEMENT CSCALE
  31. IF (ISCALE .NE. (-1)) GO TO 25
  32. C
  33. IF (IC .EQ. 0) GO TO 10
  34. DO 5 K=1,NCOL
  35. 5 COLS(K)=SDOT(NROW,A(1,K),1,A(1,K),1)
  36. C
  37. 10 ASCALE=ANORM/NCOL
  38. DO 20 K=1,NCOL
  39. CS=COLS(K)
  40. IF ((CS .GT. TEN4*ASCALE) .OR. (TEN4*CS .LT. ASCALE)) GO TO 50
  41. IF ((CS .LT. 1./TEN20) .OR. (CS .GT. TEN20)) GO TO 50
  42. 20 CONTINUE
  43. C
  44. 25 DO 30 K=1,NCOL
  45. 30 SCALES(K)=1.
  46. RETURN
  47. C
  48. 50 ALOG2=LOG(2.)
  49. ANORM=0.
  50. DO 100 K=1,NCOL
  51. CS=COLS(K)
  52. IF (CS .NE. 0.) GO TO 60
  53. SCALES(K)=1.
  54. GO TO 100
  55. 60 P=LOG(CS)/ALOG2
  56. IP=-0.5*P
  57. S=2.**IP
  58. SCALES(K)=S
  59. IF (IC .EQ. 1) GO TO 70
  60. COLS(K)=S*S*COLS(K)
  61. ANORM=ANORM+COLS(K)
  62. COLSAV(K)=COLS(K)
  63. 70 DO 80 J=1,NROW
  64. 80 A(J,K)=S*A(J,K)
  65. 100 CONTINUE
  66. C
  67. IF (IC .EQ. 0) RETURN
  68. C
  69. DO 200 K=1,NROW
  70. ROWS(K)=SDOT(NCOL,A(K,1),NRDA,A(K,1),NRDA)
  71. ROWSAV(K)=ROWS(K)
  72. 200 ANORM=ANORM+ROWS(K)
  73. RETURN
  74. END