cmposd.f 8.0 KB

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