poisd2.f 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. *DECK POISD2
  2. SUBROUTINE POISD2 (MR, NR, ISTAG, BA, BB, BC, Q, IDIMQ, B, W, D,
  3. + TCOS, P)
  4. C***BEGIN PROLOGUE POISD2
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to GENBUN
  7. C***LIBRARY SLATEC
  8. C***TYPE SINGLE PRECISION (POISD2-S, CMPOSD-C)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C Subroutine to solve Poisson's equation for Dirichlet boundary
  13. C conditions.
  14. C
  15. C ISTAG = 1 if the last diagonal block is the matrix A.
  16. C ISTAG = 2 if the last diagonal block is the matrix A+I.
  17. C
  18. C***SEE ALSO GENBUN
  19. C***ROUTINES CALLED COSGEN, S1MERG, TRIX
  20. C***REVISION HISTORY (YYMMDD)
  21. C 801001 DATE WRITTEN
  22. C 890531 Changed all specific intrinsics to generic. (WRB)
  23. C 891214 Prologue converted to Version 4.0 format. (BAB)
  24. C 900402 Added TYPE section. (WRB)
  25. C 920130 Modified to use merge routine S1MERG rather than deleted
  26. C routine MERGE. (WRB)
  27. C***END PROLOGUE POISD2
  28. C
  29. DIMENSION Q(IDIMQ,*) ,BA(*) ,BB(*) ,BC(*) ,
  30. 1 TCOS(*) ,B(*) ,D(*) ,W(*) ,
  31. 2 P(*)
  32. C***FIRST EXECUTABLE STATEMENT POISD2
  33. M = MR
  34. N = NR
  35. JSH = 0
  36. FI = 1./ISTAG
  37. IP = -M
  38. IPSTOR = 0
  39. GO TO (101,102),ISTAG
  40. 101 KR = 0
  41. IRREG = 1
  42. IF (N .GT. 1) GO TO 106
  43. TCOS(1) = 0.
  44. GO TO 103
  45. 102 KR = 1
  46. JSTSAV = 1
  47. IRREG = 2
  48. IF (N .GT. 1) GO TO 106
  49. TCOS(1) = -1.
  50. 103 DO 104 I=1,M
  51. B(I) = Q(I,1)
  52. 104 CONTINUE
  53. CALL TRIX (1,0,M,BA,BB,BC,B,TCOS,D,W)
  54. DO 105 I=1,M
  55. Q(I,1) = B(I)
  56. 105 CONTINUE
  57. GO TO 183
  58. 106 LR = 0
  59. DO 107 I=1,M
  60. P(I) = 0.
  61. 107 CONTINUE
  62. NUN = N
  63. JST = 1
  64. JSP = N
  65. C
  66. C IRREG = 1 WHEN NO IRREGULARITIES HAVE OCCURRED, OTHERWISE IT IS 2.
  67. C
  68. 108 L = 2*JST
  69. NODD = 2-2*((NUN+1)/2)+NUN
  70. C
  71. C NODD = 1 WHEN NUN IS ODD, OTHERWISE IT IS 2.
  72. C
  73. GO TO (110,109),NODD
  74. 109 JSP = JSP-L
  75. GO TO 111
  76. 110 JSP = JSP-JST
  77. IF (IRREG .NE. 1) JSP = JSP-L
  78. 111 CONTINUE
  79. C
  80. C REGULAR REDUCTION
  81. C
  82. CALL COSGEN (JST,1,0.5,0.0,TCOS)
  83. IF (L .GT. JSP) GO TO 118
  84. DO 117 J=L,JSP,L
  85. JM1 = J-JSH
  86. JP1 = J+JSH
  87. JM2 = J-JST
  88. JP2 = J+JST
  89. JM3 = JM2-JSH
  90. JP3 = JP2+JSH
  91. IF (JST .NE. 1) GO TO 113
  92. DO 112 I=1,M
  93. B(I) = 2.*Q(I,J)
  94. Q(I,J) = Q(I,JM2)+Q(I,JP2)
  95. 112 CONTINUE
  96. GO TO 115
  97. 113 DO 114 I=1,M
  98. T = Q(I,J)-Q(I,JM1)-Q(I,JP1)+Q(I,JM2)+Q(I,JP2)
  99. B(I) = T+Q(I,J)-Q(I,JM3)-Q(I,JP3)
  100. Q(I,J) = T
  101. 114 CONTINUE
  102. 115 CONTINUE
  103. CALL TRIX (JST,0,M,BA,BB,BC,B,TCOS,D,W)
  104. DO 116 I=1,M
  105. Q(I,J) = Q(I,J)+B(I)
  106. 116 CONTINUE
  107. 117 CONTINUE
  108. C
  109. C REDUCTION FOR LAST UNKNOWN
  110. C
  111. 118 GO TO (119,136),NODD
  112. 119 GO TO (152,120),IRREG
  113. C
  114. C ODD NUMBER OF UNKNOWNS
  115. C
  116. 120 JSP = JSP+L
  117. J = JSP
  118. JM1 = J-JSH
  119. JP1 = J+JSH
  120. JM2 = J-JST
  121. JP2 = J+JST
  122. JM3 = JM2-JSH
  123. GO TO (123,121),ISTAG
  124. 121 CONTINUE
  125. IF (JST .NE. 1) GO TO 123
  126. DO 122 I=1,M
  127. B(I) = Q(I,J)
  128. Q(I,J) = 0.
  129. 122 CONTINUE
  130. GO TO 130
  131. 123 GO TO (124,126),NODDPR
  132. 124 DO 125 I=1,M
  133. IP1 = IP+I
  134. B(I) = .5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))+P(IP1)+Q(I,J)
  135. 125 CONTINUE
  136. GO TO 128
  137. 126 DO 127 I=1,M
  138. B(I) = .5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))+Q(I,JP2)-Q(I,JP1)+Q(I,J)
  139. 127 CONTINUE
  140. 128 DO 129 I=1,M
  141. Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
  142. 129 CONTINUE
  143. 130 CALL TRIX (JST,0,M,BA,BB,BC,B,TCOS,D,W)
  144. IP = IP+M
  145. IPSTOR = MAX(IPSTOR,IP+M)
  146. DO 131 I=1,M
  147. IP1 = IP+I
  148. P(IP1) = Q(I,J)+B(I)
  149. B(I) = Q(I,JP2)+P(IP1)
  150. 131 CONTINUE
  151. IF (LR .NE. 0) GO TO 133
  152. DO 132 I=1,JST
  153. KRPI = KR+I
  154. TCOS(KRPI) = TCOS(I)
  155. 132 CONTINUE
  156. GO TO 134
  157. 133 CONTINUE
  158. CALL COSGEN (LR,JSTSAV,0.,FI,TCOS(JST+1))
  159. CALL S1MERG (TCOS,0,JST,JST,LR,KR)
  160. 134 CONTINUE
  161. CALL COSGEN (KR,JSTSAV,0.0,FI,TCOS)
  162. CALL TRIX (KR,KR,M,BA,BB,BC,B,TCOS,D,W)
  163. DO 135 I=1,M
  164. IP1 = IP+I
  165. Q(I,J) = Q(I,JM2)+B(I)+P(IP1)
  166. 135 CONTINUE
  167. LR = KR
  168. KR = KR+L
  169. GO TO 152
  170. C
  171. C EVEN NUMBER OF UNKNOWNS
  172. C
  173. 136 JSP = JSP+L
  174. J = JSP
  175. JM1 = J-JSH
  176. JP1 = J+JSH
  177. JM2 = J-JST
  178. JP2 = J+JST
  179. JM3 = JM2-JSH
  180. GO TO (137,138),IRREG
  181. 137 CONTINUE
  182. JSTSAV = JST
  183. IDEG = JST
  184. KR = L
  185. GO TO 139
  186. 138 CALL COSGEN (KR,JSTSAV,0.0,FI,TCOS)
  187. CALL COSGEN (LR,JSTSAV,0.0,FI,TCOS(KR+1))
  188. IDEG = KR
  189. KR = KR+JST
  190. 139 IF (JST .NE. 1) GO TO 141
  191. IRREG = 2
  192. DO 140 I=1,M
  193. B(I) = Q(I,J)
  194. Q(I,J) = Q(I,JM2)
  195. 140 CONTINUE
  196. GO TO 150
  197. 141 DO 142 I=1,M
  198. B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
  199. 142 CONTINUE
  200. GO TO (143,145),IRREG
  201. 143 DO 144 I=1,M
  202. Q(I,J) = Q(I,JM2)+.5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
  203. 144 CONTINUE
  204. IRREG = 2
  205. GO TO 150
  206. 145 CONTINUE
  207. GO TO (146,148),NODDPR
  208. 146 DO 147 I=1,M
  209. IP1 = IP+I
  210. Q(I,J) = Q(I,JM2)+P(IP1)
  211. 147 CONTINUE
  212. IP = IP-M
  213. GO TO 150
  214. 148 DO 149 I=1,M
  215. Q(I,J) = Q(I,JM2)+Q(I,J)-Q(I,JM1)
  216. 149 CONTINUE
  217. 150 CALL TRIX (IDEG,LR,M,BA,BB,BC,B,TCOS,D,W)
  218. DO 151 I=1,M
  219. Q(I,J) = Q(I,J)+B(I)
  220. 151 CONTINUE
  221. 152 NUN = NUN/2
  222. NODDPR = NODD
  223. JSH = JST
  224. JST = 2*JST
  225. IF (NUN .GE. 2) GO TO 108
  226. C
  227. C START SOLUTION.
  228. C
  229. J = JSP
  230. DO 153 I=1,M
  231. B(I) = Q(I,J)
  232. 153 CONTINUE
  233. GO TO (154,155),IRREG
  234. 154 CONTINUE
  235. CALL COSGEN (JST,1,0.5,0.0,TCOS)
  236. IDEG = JST
  237. GO TO 156
  238. 155 KR = LR+JST
  239. CALL COSGEN (KR,JSTSAV,0.0,FI,TCOS)
  240. CALL COSGEN (LR,JSTSAV,0.0,FI,TCOS(KR+1))
  241. IDEG = KR
  242. 156 CONTINUE
  243. CALL TRIX (IDEG,LR,M,BA,BB,BC,B,TCOS,D,W)
  244. JM1 = J-JSH
  245. JP1 = J+JSH
  246. GO TO (157,159),IRREG
  247. 157 DO 158 I=1,M
  248. Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
  249. 158 CONTINUE
  250. GO TO 164
  251. 159 GO TO (160,162),NODDPR
  252. 160 DO 161 I=1,M
  253. IP1 = IP+I
  254. Q(I,J) = P(IP1)+B(I)
  255. 161 CONTINUE
  256. IP = IP-M
  257. GO TO 164
  258. 162 DO 163 I=1,M
  259. Q(I,J) = Q(I,J)-Q(I,JM1)+B(I)
  260. 163 CONTINUE
  261. 164 CONTINUE
  262. C
  263. C START BACK SUBSTITUTION.
  264. C
  265. JST = JST/2
  266. JSH = JST/2
  267. NUN = 2*NUN
  268. IF (NUN .GT. N) GO TO 183
  269. DO 182 J=JST,N,L
  270. JM1 = J-JSH
  271. JP1 = J+JSH
  272. JM2 = J-JST
  273. JP2 = J+JST
  274. IF (J .GT. JST) GO TO 166
  275. DO 165 I=1,M
  276. B(I) = Q(I,J)+Q(I,JP2)
  277. 165 CONTINUE
  278. GO TO 170
  279. 166 IF (JP2 .LE. N) GO TO 168
  280. DO 167 I=1,M
  281. B(I) = Q(I,J)+Q(I,JM2)
  282. 167 CONTINUE
  283. IF (JST .LT. JSTSAV) IRREG = 1
  284. GO TO (170,171),IRREG
  285. 168 DO 169 I=1,M
  286. B(I) = Q(I,J)+Q(I,JM2)+Q(I,JP2)
  287. 169 CONTINUE
  288. 170 CONTINUE
  289. CALL COSGEN (JST,1,0.5,0.0,TCOS)
  290. IDEG = JST
  291. JDEG = 0
  292. GO TO 172
  293. 171 IF (J+L .GT. N) LR = LR-JST
  294. KR = JST+LR
  295. CALL COSGEN (KR,JSTSAV,0.0,FI,TCOS)
  296. CALL COSGEN (LR,JSTSAV,0.0,FI,TCOS(KR+1))
  297. IDEG = KR
  298. JDEG = LR
  299. 172 CONTINUE
  300. CALL TRIX (IDEG,JDEG,M,BA,BB,BC,B,TCOS,D,W)
  301. IF (JST .GT. 1) GO TO 174
  302. DO 173 I=1,M
  303. Q(I,J) = B(I)
  304. 173 CONTINUE
  305. GO TO 182
  306. 174 IF (JP2 .GT. N) GO TO 177
  307. 175 DO 176 I=1,M
  308. Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
  309. 176 CONTINUE
  310. GO TO 182
  311. 177 GO TO (175,178),IRREG
  312. 178 IF (J+JSH .GT. N) GO TO 180
  313. DO 179 I=1,M
  314. IP1 = IP+I
  315. Q(I,J) = B(I)+P(IP1)
  316. 179 CONTINUE
  317. IP = IP-M
  318. GO TO 182
  319. 180 DO 181 I=1,M
  320. Q(I,J) = B(I)+Q(I,J)-Q(I,JM1)
  321. 181 CONTINUE
  322. 182 CONTINUE
  323. L = L/2
  324. GO TO 164
  325. 183 CONTINUE
  326. C
  327. C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
  328. C
  329. W(1) = IPSTOR
  330. RETURN
  331. END