dcsol.F 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. SUBROUTINE DCSOL (N, M, AR, AI, KA, BR, BI, KB, IPVT)
  2. C-----------------------------------------------------------------------
  3. C SOLUTION OF THE SYSTEM OF M EQUATIONS A*X = B USING THE
  4. C DECOMPOSITION OBTAINED BY DCFACT. THIS ROUTINE CANNOT BE
  5. C USED WHEN DCFACT TERMINATES WITH NONZERO IERR.
  6. C-----------------------------------------------------------------------
  7. C
  8. C INPUT ...
  9. C
  10. C AR AND AI CONTAIN THE LU DECOMPOSITION OF THE MATRIX
  11. C OBTAINED BY DCFACT.
  12. C
  13. C KA = DECLARED ROW DIMENSION OF THE ARRAYS AR AND AI
  14. C
  15. C N = ORDER OF THE MATRIX
  16. C
  17. C BR AND BI ARE THE REAL AND IMAGINARY PARTS OF THE
  18. C RIGHT HAND SIDE MATRIX.
  19. C
  20. C KB = DECLARED ROW DIMENSION OF THE ARRAYS BR AND BI
  21. C
  22. C M = NUMBER OF COLUMNS OF B
  23. C
  24. C IPVT = PIVOT VECTOR OBTAINED FROM DCFACT
  25. C
  26. C OUTPUT ...
  27. C
  28. C BR AND BI CONTAIN THE REAL AND IMAGINARY PARTS OF THE
  29. C SOLUTION X.
  30. C
  31. C-----------------------------------------------------------------------
  32. DOUBLE PRECISION AR(KA,N), AI(KA,N), BR(KB,M), BI(KB,M)
  33. INTEGER IPVT(N)
  34. DOUBLE PRECISION PR, PI, TR, TI
  35. C
  36. C FORWARD ELIMINATION
  37. C
  38. IF (N .EQ. 1) GO TO 50
  39. NM1 = N - 1
  40. DO 20 K = 1, NM1
  41. KP1 = K + 1
  42. L = IPVT(K)
  43. DO 11 J = 1,M
  44. TR = BR(L,J)
  45. BR(L,J) = BR(K,J)
  46. BR(K,J) = TR
  47. TI = BI(L,J)
  48. BI(L,J) = BI(K,J)
  49. BI(K,J) = TI
  50. IF (DABS(TR) + DABS(TI) .EQ. 0.D0) GO TO 11
  51. DO 10 I = KP1, N
  52. BR(I,J) = BR(I,J) - AR(I,K)*TR + AI(I,K)*TI
  53. BI(I,J) = BI(I,J) - AR(I,K)*TI - AI(I,K)*TR
  54. 10 CONTINUE
  55. 11 CONTINUE
  56. 20 CONTINUE
  57. C
  58. C BACKWARD ELIMINATION
  59. C FOR THE LAST N - 1 VARIABLES
  60. C
  61. DO 40 L = 1,NM1
  62. KM1 = N - L
  63. K = KM1 + 1
  64. CALL CDIVID (1.D0, 0.D0, AR(K,K), AI(K,K), PR, PI)
  65. DO 31 J = 1,M
  66. TR = BR(K,J)
  67. TI = BI(K,J)
  68. BR(K,J) = TR*PR - TI*PI
  69. BI(K,J) = TR*PI + TI*PR
  70. TR = BR(K,J)
  71. TI = BI(K,J)
  72. DO 30 I = 1, KM1
  73. BR(I,J) = BR(I,J) - AR(I,K)*TR + AI(I,K)*TI
  74. BI(I,J) = BI(I,J) - AR(I,K)*TI - AI(I,K)*TR
  75. 30 CONTINUE
  76. 31 CONTINUE
  77. 40 CONTINUE
  78. C
  79. 50 CALL CDIVID (1.D0, 0.D0, AR(1,1), AI(1,1), PR, PI)
  80. DO 60 J = 1,M
  81. TR = BR(1,J)
  82. TI = BI(1,J)
  83. BR(1,J) = TR*PR - TI*PI
  84. BI(1,J) = TR*PI + TI*PR
  85. 60 CONTINUE
  86. RETURN
  87. END