poisn2.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. *DECK POISN2
  2. SUBROUTINE POISN2 (M, N, ISTAG, MIXBND, A, BB, C, Q, IDIMQ, B, B2,
  3. + B3, W, W2, W3, D, TCOS, P)
  4. C***BEGIN PROLOGUE POISN2
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to GENBUN
  7. C***LIBRARY SLATEC
  8. C***TYPE SINGLE PRECISION (POISN2-S, CMPOSN-C)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C Subroutine to solve Poisson's equation with Neumann boundary
  13. C conditions.
  14. C
  15. C ISTAG = 1 if the last diagonal block is A.
  16. C ISTAG = 2 if the last diagonal block is A-I.
  17. C MIXBND = 1 if have Neumann boundary conditions at both boundaries.
  18. C MIXBND = 2 if have Neumann boundary conditions at bottom and
  19. C Dirichlet condition at top. (for this case, must have ISTAG = 1.)
  20. C
  21. C***SEE ALSO GENBUN
  22. C***ROUTINES CALLED COSGEN, S1MERG, TRI3, TRIX
  23. C***REVISION HISTORY (YYMMDD)
  24. C 801001 DATE WRITTEN
  25. C 890531 Changed all specific intrinsics to generic. (WRB)
  26. C 891214 Prologue converted to Version 4.0 format. (BAB)
  27. C 900402 Added TYPE section. (WRB)
  28. C 920130 Modified to use merge routine S1MERG rather than deleted
  29. C routine MERGE. (WRB)
  30. C***END PROLOGUE POISN2
  31. C
  32. DIMENSION A(*) ,BB(*) ,C(*) ,Q(IDIMQ,*) ,
  33. 1 B(*) ,B2(*) ,B3(*) ,W(*) ,
  34. 2 W2(*) ,W3(*) ,D(*) ,TCOS(*) ,
  35. 3 K(4) ,P(*)
  36. EQUIVALENCE (K(1),K1) ,(K(2),K2) ,(K(3),K3) ,(K(4),K4)
  37. C***FIRST EXECUTABLE STATEMENT POISN2
  38. FISTAG = 3-ISTAG
  39. FNUM = 1./ISTAG
  40. FDEN = 0.5*(ISTAG-1)
  41. MR = M
  42. IP = -MR
  43. IPSTOR = 0
  44. I2R = 1
  45. JR = 2
  46. NR = N
  47. NLAST = N
  48. KR = 1
  49. LR = 0
  50. GO TO (101,103),ISTAG
  51. 101 CONTINUE
  52. DO 102 I=1,MR
  53. Q(I,N) = .5*Q(I,N)
  54. 102 CONTINUE
  55. GO TO (103,104),MIXBND
  56. 103 IF (N .LE. 3) GO TO 155
  57. 104 CONTINUE
  58. JR = 2*I2R
  59. NROD = 1
  60. IF ((NR/2)*2 .EQ. NR) NROD = 0
  61. GO TO (105,106),MIXBND
  62. 105 JSTART = 1
  63. GO TO 107
  64. 106 JSTART = JR
  65. NROD = 1-NROD
  66. 107 CONTINUE
  67. JSTOP = NLAST-JR
  68. IF (NROD .EQ. 0) JSTOP = JSTOP-I2R
  69. CALL COSGEN (I2R,1,0.5,0.0,TCOS)
  70. I2RBY2 = I2R/2
  71. IF (JSTOP .GE. JSTART) GO TO 108
  72. J = JR
  73. GO TO 116
  74. 108 CONTINUE
  75. C
  76. C REGULAR REDUCTION.
  77. C
  78. DO 115 J=JSTART,JSTOP,JR
  79. JP1 = J+I2RBY2
  80. JP2 = J+I2R
  81. JP3 = JP2+I2RBY2
  82. JM1 = J-I2RBY2
  83. JM2 = J-I2R
  84. JM3 = JM2-I2RBY2
  85. IF (J .NE. 1) GO TO 109
  86. JM1 = JP1
  87. JM2 = JP2
  88. JM3 = JP3
  89. 109 CONTINUE
  90. IF (I2R .NE. 1) GO TO 111
  91. IF (J .EQ. 1) JM2 = JP2
  92. DO 110 I=1,MR
  93. B(I) = 2.*Q(I,J)
  94. Q(I,J) = Q(I,JM2)+Q(I,JP2)
  95. 110 CONTINUE
  96. GO TO 113
  97. 111 CONTINUE
  98. DO 112 I=1,MR
  99. FI = Q(I,J)
  100. Q(I,J) = Q(I,J)-Q(I,JM1)-Q(I,JP1)+Q(I,JM2)+Q(I,JP2)
  101. B(I) = FI+Q(I,J)-Q(I,JM3)-Q(I,JP3)
  102. 112 CONTINUE
  103. 113 CONTINUE
  104. CALL TRIX (I2R,0,MR,A,BB,C,B,TCOS,D,W)
  105. DO 114 I=1,MR
  106. Q(I,J) = Q(I,J)+B(I)
  107. 114 CONTINUE
  108. C
  109. C END OF REDUCTION FOR REGULAR UNKNOWNS.
  110. C
  111. 115 CONTINUE
  112. C
  113. C BEGIN SPECIAL REDUCTION FOR LAST UNKNOWN.
  114. C
  115. J = JSTOP+JR
  116. 116 NLAST = J
  117. JM1 = J-I2RBY2
  118. JM2 = J-I2R
  119. JM3 = JM2-I2RBY2
  120. IF (NROD .EQ. 0) GO TO 128
  121. C
  122. C ODD NUMBER OF UNKNOWNS
  123. C
  124. IF (I2R .NE. 1) GO TO 118
  125. DO 117 I=1,MR
  126. B(I) = FISTAG*Q(I,J)
  127. Q(I,J) = Q(I,JM2)
  128. 117 CONTINUE
  129. GO TO 126
  130. 118 DO 119 I=1,MR
  131. B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
  132. 119 CONTINUE
  133. IF (NRODPR .NE. 0) GO TO 121
  134. DO 120 I=1,MR
  135. II = IP+I
  136. Q(I,J) = Q(I,JM2)+P(II)
  137. 120 CONTINUE
  138. IP = IP-MR
  139. GO TO 123
  140. 121 CONTINUE
  141. DO 122 I=1,MR
  142. Q(I,J) = Q(I,J)-Q(I,JM1)+Q(I,JM2)
  143. 122 CONTINUE
  144. 123 IF (LR .EQ. 0) GO TO 124
  145. CALL COSGEN (LR,1,0.5,FDEN,TCOS(KR+1))
  146. GO TO 126
  147. 124 CONTINUE
  148. DO 125 I=1,MR
  149. B(I) = FISTAG*B(I)
  150. 125 CONTINUE
  151. 126 CONTINUE
  152. CALL COSGEN (KR,1,0.5,FDEN,TCOS)
  153. CALL TRIX (KR,LR,MR,A,BB,C,B,TCOS,D,W)
  154. DO 127 I=1,MR
  155. Q(I,J) = Q(I,J)+B(I)
  156. 127 CONTINUE
  157. KR = KR+I2R
  158. GO TO 151
  159. 128 CONTINUE
  160. C
  161. C EVEN NUMBER OF UNKNOWNS
  162. C
  163. JP1 = J+I2RBY2
  164. JP2 = J+I2R
  165. IF (I2R .NE. 1) GO TO 135
  166. DO 129 I=1,MR
  167. B(I) = Q(I,J)
  168. 129 CONTINUE
  169. CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
  170. IP = 0
  171. IPSTOR = MR
  172. GO TO (133,130),ISTAG
  173. 130 DO 131 I=1,MR
  174. P(I) = B(I)
  175. B(I) = B(I)+Q(I,N)
  176. 131 CONTINUE
  177. TCOS(1) = 1.
  178. TCOS(2) = 0.
  179. CALL TRIX (1,1,MR,A,BB,C,B,TCOS,D,W)
  180. DO 132 I=1,MR
  181. Q(I,J) = Q(I,JM2)+P(I)+B(I)
  182. 132 CONTINUE
  183. GO TO 150
  184. 133 CONTINUE
  185. DO 134 I=1,MR
  186. P(I) = B(I)
  187. Q(I,J) = Q(I,JM2)+2.*Q(I,JP2)+3.*B(I)
  188. 134 CONTINUE
  189. GO TO 150
  190. 135 CONTINUE
  191. DO 136 I=1,MR
  192. B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
  193. 136 CONTINUE
  194. IF (NRODPR .NE. 0) GO TO 138
  195. DO 137 I=1,MR
  196. II = IP+I
  197. B(I) = B(I)+P(II)
  198. 137 CONTINUE
  199. GO TO 140
  200. 138 CONTINUE
  201. DO 139 I=1,MR
  202. B(I) = B(I)+Q(I,JP2)-Q(I,JP1)
  203. 139 CONTINUE
  204. 140 CONTINUE
  205. CALL TRIX (I2R,0,MR,A,BB,C,B,TCOS,D,W)
  206. IP = IP+MR
  207. IPSTOR = MAX(IPSTOR,IP+MR)
  208. DO 141 I=1,MR
  209. II = IP+I
  210. P(II) = B(I)+.5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
  211. B(I) = P(II)+Q(I,JP2)
  212. 141 CONTINUE
  213. IF (LR .EQ. 0) GO TO 142
  214. CALL COSGEN (LR,1,0.5,FDEN,TCOS(I2R+1))
  215. CALL S1MERG (TCOS,0,I2R,I2R,LR,KR)
  216. GO TO 144
  217. 142 DO 143 I=1,I2R
  218. II = KR+I
  219. TCOS(II) = TCOS(I)
  220. 143 CONTINUE
  221. 144 CALL COSGEN (KR,1,0.5,FDEN,TCOS)
  222. IF (LR .NE. 0) GO TO 145
  223. GO TO (146,145),ISTAG
  224. 145 CONTINUE
  225. CALL TRIX (KR,KR,MR,A,BB,C,B,TCOS,D,W)
  226. GO TO 148
  227. 146 CONTINUE
  228. DO 147 I=1,MR
  229. B(I) = FISTAG*B(I)
  230. 147 CONTINUE
  231. 148 CONTINUE
  232. DO 149 I=1,MR
  233. II = IP+I
  234. Q(I,J) = Q(I,JM2)+P(II)+B(I)
  235. 149 CONTINUE
  236. 150 CONTINUE
  237. LR = KR
  238. KR = KR+JR
  239. 151 CONTINUE
  240. GO TO (152,153),MIXBND
  241. 152 NR = (NLAST-1)/JR+1
  242. IF (NR .LE. 3) GO TO 155
  243. GO TO 154
  244. 153 NR = NLAST/JR
  245. IF (NR .LE. 1) GO TO 192
  246. 154 I2R = JR
  247. NRODPR = NROD
  248. GO TO 104
  249. 155 CONTINUE
  250. C
  251. C BEGIN SOLUTION
  252. C
  253. J = 1+JR
  254. JM1 = J-I2R
  255. JP1 = J+I2R
  256. JM2 = NLAST-I2R
  257. IF (NR .EQ. 2) GO TO 184
  258. IF (LR .NE. 0) GO TO 170
  259. IF (N .NE. 3) GO TO 161
  260. C
  261. C CASE N = 3.
  262. C
  263. GO TO (156,168),ISTAG
  264. 156 CONTINUE
  265. DO 157 I=1,MR
  266. B(I) = Q(I,2)
  267. 157 CONTINUE
  268. TCOS(1) = 0.
  269. CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
  270. DO 158 I=1,MR
  271. Q(I,2) = B(I)
  272. B(I) = 4.*B(I)+Q(I,1)+2.*Q(I,3)
  273. 158 CONTINUE
  274. TCOS(1) = -2.
  275. TCOS(2) = 2.
  276. I1 = 2
  277. I2 = 0
  278. CALL TRIX (I1,I2,MR,A,BB,C,B,TCOS,D,W)
  279. DO 159 I=1,MR
  280. Q(I,2) = Q(I,2)+B(I)
  281. B(I) = Q(I,1)+2.*Q(I,2)
  282. 159 CONTINUE
  283. TCOS(1) = 0.
  284. CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
  285. DO 160 I=1,MR
  286. Q(I,1) = B(I)
  287. 160 CONTINUE
  288. JR = 1
  289. I2R = 0
  290. GO TO 194
  291. C
  292. C CASE N = 2**P+1
  293. C
  294. 161 CONTINUE
  295. GO TO (162,170),ISTAG
  296. 162 CONTINUE
  297. DO 163 I=1,MR
  298. B(I) = Q(I,J)+.5*Q(I,1)-Q(I,JM1)+Q(I,NLAST)-Q(I,JM2)
  299. 163 CONTINUE
  300. CALL COSGEN (JR,1,0.5,0.0,TCOS)
  301. CALL TRIX (JR,0,MR,A,BB,C,B,TCOS,D,W)
  302. DO 164 I=1,MR
  303. Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
  304. B(I) = Q(I,1)+2.*Q(I,NLAST)+4.*Q(I,J)
  305. 164 CONTINUE
  306. JR2 = 2*JR
  307. CALL COSGEN (JR,1,0.0,0.0,TCOS)
  308. DO 165 I=1,JR
  309. I1 = JR+I
  310. I2 = JR+1-I
  311. TCOS(I1) = -TCOS(I2)
  312. 165 CONTINUE
  313. CALL TRIX (JR2,0,MR,A,BB,C,B,TCOS,D,W)
  314. DO 166 I=1,MR
  315. Q(I,J) = Q(I,J)+B(I)
  316. B(I) = Q(I,1)+2.*Q(I,J)
  317. 166 CONTINUE
  318. CALL COSGEN (JR,1,0.5,0.0,TCOS)
  319. CALL TRIX (JR,0,MR,A,BB,C,B,TCOS,D,W)
  320. DO 167 I=1,MR
  321. Q(I,1) = .5*Q(I,1)-Q(I,JM1)+B(I)
  322. 167 CONTINUE
  323. GO TO 194
  324. C
  325. C CASE OF GENERAL N WITH NR = 3 .
  326. C
  327. 168 DO 169 I=1,MR
  328. B(I) = Q(I,2)
  329. Q(I,2) = 0.
  330. B2(I) = Q(I,3)
  331. B3(I) = Q(I,1)
  332. 169 CONTINUE
  333. JR = 1
  334. I2R = 0
  335. J = 2
  336. GO TO 177
  337. 170 CONTINUE
  338. DO 171 I=1,MR
  339. B(I) = .5*Q(I,1)-Q(I,JM1)+Q(I,J)
  340. 171 CONTINUE
  341. IF (NROD .NE. 0) GO TO 173
  342. DO 172 I=1,MR
  343. II = IP+I
  344. B(I) = B(I)+P(II)
  345. 172 CONTINUE
  346. GO TO 175
  347. 173 DO 174 I=1,MR
  348. B(I) = B(I)+Q(I,NLAST)-Q(I,JM2)
  349. 174 CONTINUE
  350. 175 CONTINUE
  351. DO 176 I=1,MR
  352. T = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
  353. Q(I,J) = T
  354. B2(I) = Q(I,NLAST)+T
  355. B3(I) = Q(I,1)+2.*T
  356. 176 CONTINUE
  357. 177 CONTINUE
  358. K1 = KR+2*JR-1
  359. K2 = KR+JR
  360. TCOS(K1+1) = -2.
  361. K4 = K1+3-ISTAG
  362. CALL COSGEN (K2+ISTAG-2,1,0.0,FNUM,TCOS(K4))
  363. K4 = K1+K2+1
  364. CALL COSGEN (JR-1,1,0.0,1.0,TCOS(K4))
  365. CALL S1MERG (TCOS,K1,K2,K1+K2,JR-1,0)
  366. K3 = K1+K2+LR
  367. CALL COSGEN (JR,1,0.5,0.0,TCOS(K3+1))
  368. K4 = K3+JR+1
  369. CALL COSGEN (KR,1,0.5,FDEN,TCOS(K4))
  370. CALL S1MERG (TCOS,K3,JR,K3+JR,KR,K1)
  371. IF (LR .EQ. 0) GO TO 178
  372. CALL COSGEN (LR,1,0.5,FDEN,TCOS(K4))
  373. CALL S1MERG (TCOS,K3,JR,K3+JR,LR,K3-LR)
  374. CALL COSGEN (KR,1,0.5,FDEN,TCOS(K4))
  375. 178 K3 = KR
  376. K4 = KR
  377. CALL TRI3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
  378. DO 179 I=1,MR
  379. B(I) = B(I)+B2(I)+B3(I)
  380. 179 CONTINUE
  381. TCOS(1) = 2.
  382. CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
  383. DO 180 I=1,MR
  384. Q(I,J) = Q(I,J)+B(I)
  385. B(I) = Q(I,1)+2.*Q(I,J)
  386. 180 CONTINUE
  387. CALL COSGEN (JR,1,0.5,0.0,TCOS)
  388. CALL TRIX (JR,0,MR,A,BB,C,B,TCOS,D,W)
  389. IF (JR .NE. 1) GO TO 182
  390. DO 181 I=1,MR
  391. Q(I,1) = B(I)
  392. 181 CONTINUE
  393. GO TO 194
  394. 182 CONTINUE
  395. DO 183 I=1,MR
  396. Q(I,1) = .5*Q(I,1)-Q(I,JM1)+B(I)
  397. 183 CONTINUE
  398. GO TO 194
  399. 184 CONTINUE
  400. IF (N .NE. 2) GO TO 188
  401. C
  402. C CASE N = 2
  403. C
  404. DO 185 I=1,MR
  405. B(I) = Q(I,1)
  406. 185 CONTINUE
  407. TCOS(1) = 0.
  408. CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
  409. DO 186 I=1,MR
  410. Q(I,1) = B(I)
  411. B(I) = 2.*(Q(I,2)+B(I))*FISTAG
  412. 186 CONTINUE
  413. TCOS(1) = -FISTAG
  414. TCOS(2) = 2.
  415. CALL TRIX (2,0,MR,A,BB,C,B,TCOS,D,W)
  416. DO 187 I=1,MR
  417. Q(I,1) = Q(I,1)+B(I)
  418. 187 CONTINUE
  419. JR = 1
  420. I2R = 0
  421. GO TO 194
  422. 188 CONTINUE
  423. C
  424. C CASE OF GENERAL N AND NR = 2 .
  425. C
  426. DO 189 I=1,MR
  427. II = IP+I
  428. B3(I) = 0.
  429. B(I) = Q(I,1)+2.*P(II)
  430. Q(I,1) = .5*Q(I,1)-Q(I,JM1)
  431. B2(I) = 2.*(Q(I,1)+Q(I,NLAST))
  432. 189 CONTINUE
  433. K1 = KR+JR-1
  434. TCOS(K1+1) = -2.
  435. K4 = K1+3-ISTAG
  436. CALL COSGEN (KR+ISTAG-2,1,0.0,FNUM,TCOS(K4))
  437. K4 = K1+KR+1
  438. CALL COSGEN (JR-1,1,0.0,1.0,TCOS(K4))
  439. CALL S1MERG (TCOS,K1,KR,K1+KR,JR-1,0)
  440. CALL COSGEN (KR,1,0.5,FDEN,TCOS(K1+1))
  441. K2 = KR
  442. K4 = K1+K2+1
  443. CALL COSGEN (LR,1,0.5,FDEN,TCOS(K4))
  444. K3 = LR
  445. K4 = 0
  446. CALL TRI3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
  447. DO 190 I=1,MR
  448. B(I) = B(I)+B2(I)
  449. 190 CONTINUE
  450. TCOS(1) = 2.
  451. CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
  452. DO 191 I=1,MR
  453. Q(I,1) = Q(I,1)+B(I)
  454. 191 CONTINUE
  455. GO TO 194
  456. 192 DO 193 I=1,MR
  457. B(I) = Q(I,NLAST)
  458. 193 CONTINUE
  459. GO TO 196
  460. 194 CONTINUE
  461. C
  462. C START BACK SUBSTITUTION.
  463. C
  464. J = NLAST-JR
  465. DO 195 I=1,MR
  466. B(I) = Q(I,NLAST)+Q(I,J)
  467. 195 CONTINUE
  468. 196 JM2 = NLAST-I2R
  469. IF (JR .NE. 1) GO TO 198
  470. DO 197 I=1,MR
  471. Q(I,NLAST) = 0.
  472. 197 CONTINUE
  473. GO TO 202
  474. 198 CONTINUE
  475. IF (NROD .NE. 0) GO TO 200
  476. DO 199 I=1,MR
  477. II = IP+I
  478. Q(I,NLAST) = P(II)
  479. 199 CONTINUE
  480. IP = IP-MR
  481. GO TO 202
  482. 200 DO 201 I=1,MR
  483. Q(I,NLAST) = Q(I,NLAST)-Q(I,JM2)
  484. 201 CONTINUE
  485. 202 CONTINUE
  486. CALL COSGEN (KR,1,0.5,FDEN,TCOS)
  487. CALL COSGEN (LR,1,0.5,FDEN,TCOS(KR+1))
  488. IF (LR .NE. 0) GO TO 204
  489. DO 203 I=1,MR
  490. B(I) = FISTAG*B(I)
  491. 203 CONTINUE
  492. 204 CONTINUE
  493. CALL TRIX (KR,LR,MR,A,BB,C,B,TCOS,D,W)
  494. DO 205 I=1,MR
  495. Q(I,NLAST) = Q(I,NLAST)+B(I)
  496. 205 CONTINUE
  497. NLASTP = NLAST
  498. 206 CONTINUE
  499. JSTEP = JR
  500. JR = I2R
  501. I2R = I2R/2
  502. IF (JR .EQ. 0) GO TO 222
  503. GO TO (207,208),MIXBND
  504. 207 JSTART = 1+JR
  505. GO TO 209
  506. 208 JSTART = JR
  507. 209 CONTINUE
  508. KR = KR-JR
  509. IF (NLAST+JR .GT. N) GO TO 210
  510. KR = KR-JR
  511. NLAST = NLAST+JR
  512. JSTOP = NLAST-JSTEP
  513. GO TO 211
  514. 210 CONTINUE
  515. JSTOP = NLAST-JR
  516. 211 CONTINUE
  517. LR = KR-JR
  518. CALL COSGEN (JR,1,0.5,0.0,TCOS)
  519. DO 221 J=JSTART,JSTOP,JSTEP
  520. JM2 = J-JR
  521. JP2 = J+JR
  522. IF (J .NE. JR) GO TO 213
  523. DO 212 I=1,MR
  524. B(I) = Q(I,J)+Q(I,JP2)
  525. 212 CONTINUE
  526. GO TO 215
  527. 213 CONTINUE
  528. DO 214 I=1,MR
  529. B(I) = Q(I,J)+Q(I,JM2)+Q(I,JP2)
  530. 214 CONTINUE
  531. 215 CONTINUE
  532. IF (JR .NE. 1) GO TO 217
  533. DO 216 I=1,MR
  534. Q(I,J) = 0.
  535. 216 CONTINUE
  536. GO TO 219
  537. 217 CONTINUE
  538. JM1 = J-I2R
  539. JP1 = J+I2R
  540. DO 218 I=1,MR
  541. Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
  542. 218 CONTINUE
  543. 219 CONTINUE
  544. CALL TRIX (JR,0,MR,A,BB,C,B,TCOS,D,W)
  545. DO 220 I=1,MR
  546. Q(I,J) = Q(I,J)+B(I)
  547. 220 CONTINUE
  548. 221 CONTINUE
  549. NROD = 1
  550. IF (NLAST+I2R .LE. N) NROD = 0
  551. IF (NLASTP .NE. NLAST) GO TO 194
  552. GO TO 206
  553. 222 CONTINUE
  554. C
  555. C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
  556. C
  557. W(1) = IPSTOR
  558. RETURN
  559. END