blktr1.f 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. *DECK BLKTR1
  2. SUBROUTINE BLKTR1 (N, AN, BN, CN, M, AM, BM, CM, IDIMY, Y, B, W1,
  3. + W2, W3, WD, WW, WU, PRDCT, CPRDCT)
  4. C***BEGIN PROLOGUE BLKTR1
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to BLKTRI
  7. C***LIBRARY SLATEC
  8. C***TYPE SINGLE PRECISION (BLKTR1-S, CBLKT1-C)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C BLKTR1 solves the linear system set up by BLKTRI.
  13. C
  14. C B contains the roots of all the B polynomials.
  15. C W1,W2,W3,WD,WW,WU are all working arrays.
  16. C PRDCT is either PRODP or PROD depending on whether the boundary
  17. C conditions in the M direction are periodic or not.
  18. C CPRDCT is either CPRODP or CPROD which are the complex versions
  19. C of PRODP and PROD. These are called in the event that some
  20. C of the roots of the B sub P polynomial are complex.
  21. C
  22. C***SEE ALSO BLKTRI
  23. C***ROUTINES CALLED INDXA, INDXB, INDXC
  24. C***COMMON BLOCKS CBLKT
  25. C***REVISION HISTORY (YYMMDD)
  26. C 801001 DATE WRITTEN
  27. C 891214 Prologue converted to Version 4.0 format. (BAB)
  28. C 900402 Added TYPE section. (WRB)
  29. C***END PROLOGUE BLKTR1
  30. C
  31. DIMENSION AN(*) ,BN(*) ,CN(*) ,AM(*) ,
  32. 1 BM(*) ,CM(*) ,B(*) ,W1(*) ,
  33. 2 W2(*) ,W3(*) ,WD(*) ,WW(*) ,
  34. 3 WU(*) ,Y(IDIMY,*)
  35. COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
  36. 1 NM ,NCMPLX ,IK
  37. C***FIRST EXECUTABLE STATEMENT BLKTR1
  38. KDO = K-1
  39. DO 109 L=1,KDO
  40. IR = L-1
  41. I2 = 2**IR
  42. I1 = I2/2
  43. I3 = I2+I1
  44. I4 = I2+I2
  45. IRM1 = IR-1
  46. CALL INDXB (I2,IR,IM2,NM2)
  47. CALL INDXB (I1,IRM1,IM3,NM3)
  48. CALL INDXB (I3,IRM1,IM1,NM1)
  49. CALL PRDCT (NM2,B(IM2),NM3,B(IM3),NM1,B(IM1),0,DUM,Y(1,I2),W3,
  50. 1 M,AM,BM,CM,WD,WW,WU)
  51. IF = 2**K
  52. DO 108 I=I4,IF,I4
  53. IF (I-NM) 101,101,108
  54. 101 IPI1 = I+I1
  55. IPI2 = I+I2
  56. IPI3 = I+I3
  57. CALL INDXC (I,IR,IDXC,NC)
  58. IF (I-IF) 102,108,108
  59. 102 CALL INDXA (I,IR,IDXA,NA)
  60. CALL INDXB (I-I1,IRM1,IM1,NM1)
  61. CALL INDXB (IPI2,IR,IP2,NP2)
  62. CALL INDXB (IPI1,IRM1,IP1,NP1)
  63. CALL INDXB (IPI3,IRM1,IP3,NP3)
  64. CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W3,W1,M,AM,
  65. 1 BM,CM,WD,WW,WU)
  66. IF (IPI2-NM) 105,105,103
  67. 103 DO 104 J=1,M
  68. W3(J) = 0.
  69. W2(J) = 0.
  70. 104 CONTINUE
  71. GO TO 106
  72. 105 CALL PRDCT (NP2,B(IP2),NP1,B(IP1),NP3,B(IP3),0,DUM,
  73. 1 Y(1,IPI2),W3,M,AM,BM,CM,WD,WW,WU)
  74. CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W3,W2,M,AM,
  75. 1 BM,CM,WD,WW,WU)
  76. 106 DO 107 J=1,M
  77. Y(J,I) = W1(J)+W2(J)+Y(J,I)
  78. 107 CONTINUE
  79. 108 CONTINUE
  80. 109 CONTINUE
  81. IF (NPP) 132,110,132
  82. C
  83. C THE PERIODIC CASE IS TREATED USING THE CAPACITANCE MATRIX METHOD
  84. C
  85. 110 IF = 2**K
  86. I = IF/2
  87. I1 = I/2
  88. CALL INDXB (I-I1,K-2,IM1,NM1)
  89. CALL INDXB (I+I1,K-2,IP1,NP1)
  90. CALL INDXB (I,K-1,IZ,NZ)
  91. CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,Y(1,I),W1,M,AM,
  92. 1 BM,CM,WD,WW,WU)
  93. IZR = I
  94. DO 111 J=1,M
  95. W2(J) = W1(J)
  96. 111 CONTINUE
  97. DO 113 LL=2,K
  98. L = K-LL+1
  99. IR = L-1
  100. I2 = 2**IR
  101. I1 = I2/2
  102. I = I2
  103. CALL INDXC (I,IR,IDXC,NC)
  104. CALL INDXB (I,IR,IZ,NZ)
  105. CALL INDXB (I-I1,IR-1,IM1,NM1)
  106. CALL INDXB (I+I1,IR-1,IP1,NP1)
  107. CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W1,W1,M,AM,BM,
  108. 1 CM,WD,WW,WU)
  109. DO 112 J=1,M
  110. W1(J) = Y(J,I)+W1(J)
  111. 112 CONTINUE
  112. CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W1,W1,M,AM,
  113. 1 BM,CM,WD,WW,WU)
  114. 113 CONTINUE
  115. DO 118 LL=2,K
  116. L = K-LL+1
  117. IR = L-1
  118. I2 = 2**IR
  119. I1 = I2/2
  120. I4 = I2+I2
  121. IFD = IF-I2
  122. DO 117 I=I2,IFD,I4
  123. IF (I-I2-IZR) 117,114,117
  124. 114 IF (I-NM) 115,115,118
  125. 115 CALL INDXA (I,IR,IDXA,NA)
  126. CALL INDXB (I,IR,IZ,NZ)
  127. CALL INDXB (I-I1,IR-1,IM1,NM1)
  128. CALL INDXB (I+I1,IR-1,IP1,NP1)
  129. CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W2,W2,M,AM,
  130. 1 BM,CM,WD,WW,WU)
  131. DO 116 J=1,M
  132. W2(J) = Y(J,I)+W2(J)
  133. 116 CONTINUE
  134. CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W2,W2,M,
  135. 1 AM,BM,CM,WD,WW,WU)
  136. IZR = I
  137. IF (I-NM) 117,119,117
  138. 117 CONTINUE
  139. 118 CONTINUE
  140. 119 DO 120 J=1,M
  141. Y(J,NM+1) = Y(J,NM+1)-CN(NM+1)*W1(J)-AN(NM+1)*W2(J)
  142. 120 CONTINUE
  143. CALL INDXB (IF/2,K-1,IM1,NM1)
  144. CALL INDXB (IF,K-1,IP,NP)
  145. IF (NCMPLX) 121,122,121
  146. 121 CALL CPRDCT (NM+1,B(IP),NM1,B(IM1),0,DUM,0,DUM,Y(1,NM+1),
  147. 1 Y(1,NM+1),M,AM,BM,CM,W1,W3,WW)
  148. GO TO 123
  149. 122 CALL PRDCT (NM+1,B(IP),NM1,B(IM1),0,DUM,0,DUM,Y(1,NM+1),
  150. 1 Y(1,NM+1),M,AM,BM,CM,WD,WW,WU)
  151. 123 DO 124 J=1,M
  152. W1(J) = AN(1)*Y(J,NM+1)
  153. W2(J) = CN(NM)*Y(J,NM+1)
  154. Y(J,1) = Y(J,1)-W1(J)
  155. Y(J,NM) = Y(J,NM)-W2(J)
  156. 124 CONTINUE
  157. DO 126 L=1,KDO
  158. IR = L-1
  159. I2 = 2**IR
  160. I4 = I2+I2
  161. I1 = I2/2
  162. I = I4
  163. CALL INDXA (I,IR,IDXA,NA)
  164. CALL INDXB (I-I2,IR,IM2,NM2)
  165. CALL INDXB (I-I2-I1,IR-1,IM3,NM3)
  166. CALL INDXB (I-I1,IR-1,IM1,NM1)
  167. CALL PRDCT (NM2,B(IM2),NM3,B(IM3),NM1,B(IM1),0,DUM,W1,W1,M,AM,
  168. 1 BM,CM,WD,WW,WU)
  169. CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W1,W1,M,AM,BM,
  170. 1 CM,WD,WW,WU)
  171. DO 125 J=1,M
  172. Y(J,I) = Y(J,I)-W1(J)
  173. 125 CONTINUE
  174. 126 CONTINUE
  175. C
  176. IZR = NM
  177. DO 131 L=1,KDO
  178. IR = L-1
  179. I2 = 2**IR
  180. I1 = I2/2
  181. I3 = I2+I1
  182. I4 = I2+I2
  183. IRM1 = IR-1
  184. DO 130 I=I4,IF,I4
  185. IPI1 = I+I1
  186. IPI2 = I+I2
  187. IPI3 = I+I3
  188. IF (IPI2-IZR) 127,128,127
  189. 127 IF (I-IZR) 130,131,130
  190. 128 CALL INDXC (I,IR,IDXC,NC)
  191. CALL INDXB (IPI2,IR,IP2,NP2)
  192. CALL INDXB (IPI1,IRM1,IP1,NP1)
  193. CALL INDXB (IPI3,IRM1,IP3,NP3)
  194. CALL PRDCT (NP2,B(IP2),NP1,B(IP1),NP3,B(IP3),0,DUM,W2,W2,M,
  195. 1 AM,BM,CM,WD,WW,WU)
  196. CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W2,W2,M,AM,
  197. 1 BM,CM,WD,WW,WU)
  198. DO 129 J=1,M
  199. Y(J,I) = Y(J,I)-W2(J)
  200. 129 CONTINUE
  201. IZR = I
  202. GO TO 131
  203. 130 CONTINUE
  204. 131 CONTINUE
  205. C
  206. C BEGIN BACK SUBSTITUTION PHASE
  207. C
  208. 132 DO 144 LL=1,K
  209. L = K-LL+1
  210. IR = L-1
  211. IRM1 = IR-1
  212. I2 = 2**IR
  213. I1 = I2/2
  214. I4 = I2+I2
  215. IFD = IF-I2
  216. DO 143 I=I2,IFD,I4
  217. IF (I-NM) 133,133,143
  218. 133 IMI1 = I-I1
  219. IMI2 = I-I2
  220. IPI1 = I+I1
  221. IPI2 = I+I2
  222. CALL INDXA (I,IR,IDXA,NA)
  223. CALL INDXC (I,IR,IDXC,NC)
  224. CALL INDXB (I,IR,IZ,NZ)
  225. CALL INDXB (IMI1,IRM1,IM1,NM1)
  226. CALL INDXB (IPI1,IRM1,IP1,NP1)
  227. IF (I-I2) 134,134,136
  228. 134 DO 135 J=1,M
  229. W1(J) = 0.
  230. 135 CONTINUE
  231. GO TO 137
  232. 136 CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),Y(1,IMI2),
  233. 1 W1,M,AM,BM,CM,WD,WW,WU)
  234. 137 IF (IPI2-NM) 140,140,138
  235. 138 DO 139 J=1,M
  236. W2(J) = 0.
  237. 139 CONTINUE
  238. GO TO 141
  239. 140 CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),Y(1,IPI2),
  240. 1 W2,M,AM,BM,CM,WD,WW,WU)
  241. 141 DO 142 J=1,M
  242. W1(J) = Y(J,I)+W1(J)+W2(J)
  243. 142 CONTINUE
  244. CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W1,Y(1,I),
  245. 1 M,AM,BM,CM,WD,WW,WU)
  246. 143 CONTINUE
  247. 144 CONTINUE
  248. RETURN
  249. END