speli4.f 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. *DECK SPELI4
  2. SUBROUTINE SPELI4 (IORDER, A, B, M, MBDCND, BDA, ALPHA, BDB, BETA,
  3. + C, D, N, NBDCND, BDC, BDD, COFX, AN, BN, CN, DN, UN, ZN, AM,
  4. + BM, CM, DM, UM, ZM, GRHS, USOL, IDMN, W, PERTRB, IERROR)
  5. C***BEGIN PROLOGUE SPELI4
  6. C***SUBSIDIARY
  7. C***PURPOSE Subsidiary to SEPX4
  8. C***LIBRARY SLATEC
  9. C***TYPE SINGLE PRECISION (SPELI4-S)
  10. C***AUTHOR (UNKNOWN)
  11. C***DESCRIPTION
  12. C
  13. C SPELI4 sets up vectors and arrays for input to BLKTRI
  14. C and computes a second order solution in USOL. A return jump to
  15. C SEPX4 occurs if IORDER=2. If IORDER=4 a fourth order
  16. C solution is generated in USOL.
  17. C
  18. C***SEE ALSO SEPX4
  19. C***ROUTINES CALLED CHKSN4, DEFE4, GENBUN, MINSO4, ORTHO4, TRIS4
  20. C***COMMON BLOCKS SPL4
  21. C***REVISION HISTORY (YYMMDD)
  22. C 801001 DATE WRITTEN
  23. C 890531 Changed all specific intrinsics to generic. (WRB)
  24. C 891009 Removed unreferenced variable. (WRB)
  25. C 891214 Prologue converted to Version 4.0 format. (BAB)
  26. C 900402 Added TYPE section. (WRB)
  27. C***END PROLOGUE SPELI4
  28. C
  29. DIMENSION BDA(*) ,BDB(*) ,BDC(*) ,BDD(*) ,
  30. 1 W(*)
  31. DIMENSION GRHS(IDMN,*) ,USOL(IDMN,*)
  32. DIMENSION AN(*) ,BN(*) ,CN(*) ,DN(*) ,
  33. 1 UN(*) ,ZN(*)
  34. DIMENSION AM(*) ,BM(*) ,CM(*) ,DM(*) ,
  35. 1 UM(*) ,ZM(*)
  36. COMMON /SPL4/ KSWX ,KSWY ,K ,L ,
  37. 1 AIT ,BIT ,CIT ,DIT ,
  38. 2 MIT ,NIT ,IS ,MS ,
  39. 3 JS ,NS ,DLX ,DLY ,
  40. 4 TDLX3 ,TDLY3 ,DLX4 ,DLY4
  41. LOGICAL SINGLR
  42. EXTERNAL COFX
  43. C***FIRST EXECUTABLE STATEMENT SPELI4
  44. KSWX = MBDCND+1
  45. KSWY = NBDCND+1
  46. K = M+1
  47. L = N+1
  48. AIT = A
  49. BIT = B
  50. CIT = C
  51. DIT = D
  52. DLY=(DIT-CIT)/N
  53. C
  54. C SET RIGHT HAND SIDE VALUES FROM GRHS IN USOL ON THE INTERIOR
  55. C AND NON-SPECIFIED BOUNDARIES.
  56. C
  57. DO 20 I=2,M
  58. DO 10 J=2,N
  59. USOL(I,J)=DLY**2*GRHS(I,J)
  60. 10 CONTINUE
  61. 20 CONTINUE
  62. IF (KSWX.EQ.2 .OR. KSWX.EQ.3) GO TO 40
  63. DO 30 J=2,N
  64. USOL(1,J)=DLY**2*GRHS(1,J)
  65. 30 CONTINUE
  66. 40 CONTINUE
  67. IF (KSWX.EQ.2 .OR. KSWX.EQ.5) GO TO 60
  68. DO 50 J=2,N
  69. USOL(K,J)=DLY**2*GRHS(K,J)
  70. 50 CONTINUE
  71. 60 CONTINUE
  72. IF (KSWY.EQ.2 .OR. KSWY.EQ.3) GO TO 80
  73. DO 70 I=2,M
  74. USOL(I,1)=DLY**2*GRHS(I,1)
  75. 70 CONTINUE
  76. 80 CONTINUE
  77. IF (KSWY.EQ.2 .OR. KSWY.EQ.5) GO TO 100
  78. DO 90 I=2,M
  79. USOL(I,L)=DLY**2*GRHS(I,L)
  80. 90 CONTINUE
  81. 100 CONTINUE
  82. IF (KSWX.NE.2 .AND. KSWX.NE.3 .AND. KSWY.NE.2 .AND. KSWY.NE.3)
  83. 1USOL(1,1)=DLY**2*GRHS(1,1)
  84. IF (KSWX.NE.2 .AND. KSWX.NE.5 .AND. KSWY.NE.2 .AND. KSWY.NE.3)
  85. 1USOL(K,1)=DLY**2*GRHS(K,1)
  86. IF (KSWX.NE.2 .AND. KSWX.NE.3 .AND. KSWY.NE.2 .AND. KSWY.NE.5)
  87. 1USOL(1,L)=DLY**2*GRHS(1,L)
  88. IF (KSWX.NE.2 .AND. KSWX.NE.5 .AND. KSWY.NE.2 .AND. KSWY.NE.5)
  89. 1USOL(K,L)=DLY**2*GRHS(K,L)
  90. C
  91. C SET SWITCHES FOR PERIODIC OR NON-PERIODIC BOUNDARIES
  92. C
  93. MP=1
  94. IF(KSWX.EQ.1) MP=0
  95. NP=NBDCND
  96. C
  97. C SET DLX,DLY AND SIZE OF BLOCK TRI-DIAGONAL SYSTEM GENERATED
  98. C IN NINT,MINT
  99. C
  100. DLX = (BIT-AIT)/M
  101. MIT = K-1
  102. IF (KSWX .EQ. 2) MIT = K-2
  103. IF (KSWX .EQ. 4) MIT = K
  104. DLY = (DIT-CIT)/N
  105. NIT = L-1
  106. IF (KSWY .EQ. 2) NIT = L-2
  107. IF (KSWY .EQ. 4) NIT = L
  108. TDLX3 = 2.0*DLX**3
  109. DLX4 = DLX**4
  110. TDLY3 = 2.0*DLY**3
  111. DLY4 = DLY**4
  112. C
  113. C SET SUBSCRIPT LIMITS FOR PORTION OF ARRAY TO INPUT TO BLKTRI
  114. C
  115. IS = 1
  116. JS = 1
  117. IF (KSWX.EQ.2 .OR. KSWX.EQ.3) IS = 2
  118. IF (KSWY.EQ.2 .OR. KSWY.EQ.3) JS = 2
  119. NS = NIT+JS-1
  120. MS = MIT+IS-1
  121. C
  122. C SET X - DIRECTION
  123. C
  124. DO 110 I=1,MIT
  125. XI = AIT+(IS+I-2)*DLX
  126. CALL COFX (XI,AI,BI,CI)
  127. AXI = (AI/DLX-0.5*BI)/DLX
  128. BXI = -2.*AI/DLX**2+CI
  129. CXI = (AI/DLX+0.5*BI)/DLX
  130. AM(I)=DLY**2*AXI
  131. BM(I)=DLY**2*BXI
  132. CM(I)=DLY**2*CXI
  133. 110 CONTINUE
  134. C
  135. C SET Y DIRECTION
  136. C
  137. DO 120 J=1,NIT
  138. DYJ=1.0
  139. EYJ=-2.0
  140. FYJ=1.0
  141. AN(J) = DYJ
  142. BN(J) = EYJ
  143. CN(J) = FYJ
  144. 120 CONTINUE
  145. C
  146. C ADJUST EDGES IN X DIRECTION UNLESS PERIODIC
  147. C
  148. AX1 = AM(1)
  149. CXM = CM(MIT)
  150. GO TO (170,130,150,160,140),KSWX
  151. C
  152. C DIRICHLET-DIRICHLET IN X DIRECTION
  153. C
  154. 130 AM(1) = 0.0
  155. CM(MIT) = 0.0
  156. GO TO 170
  157. C
  158. C MIXED-DIRICHLET IN X DIRECTION
  159. C
  160. 140 AM(1) = 0.0
  161. BM(1) = BM(1)+2.*ALPHA*DLX*AX1
  162. CM(1) = CM(1)+AX1
  163. CM(MIT) = 0.0
  164. GO TO 170
  165. C
  166. C DIRICHLET-MIXED IN X DIRECTION
  167. C
  168. 150 AM(1) = 0.0
  169. AM(MIT) = AM(MIT)+CXM
  170. BM(MIT) = BM(MIT)-2.*BETA*DLX*CXM
  171. CM(MIT) = 0.0
  172. GO TO 170
  173. C
  174. C MIXED - MIXED IN X DIRECTION
  175. C
  176. 160 CONTINUE
  177. AM(1) = 0.0
  178. BM(1) = BM(1)+2.*DLX*ALPHA*AX1
  179. CM(1) = CM(1)+AX1
  180. AM(MIT) = AM(MIT)+CXM
  181. BM(MIT) = BM(MIT)-2.*DLX*BETA*CXM
  182. CM(MIT) = 0.0
  183. 170 CONTINUE
  184. C
  185. C ADJUST IN Y DIRECTION UNLESS PERIODIC
  186. C
  187. DY1 = AN(1)
  188. FYN = CN(NIT)
  189. GAMA=0.0
  190. XNU=0.0
  191. GO TO (220,180,200,210,190),KSWY
  192. C
  193. C DIRICHLET-DIRICHLET IN Y DIRECTION
  194. C
  195. 180 CONTINUE
  196. AN(1) = 0.0
  197. CN(NIT) = 0.0
  198. GO TO 220
  199. C
  200. C MIXED-DIRICHLET IN Y DIRECTION
  201. C
  202. 190 CONTINUE
  203. AN(1) = 0.0
  204. BN(1) = BN(1)+2.*DLY*GAMA*DY1
  205. CN(1) = CN(1)+DY1
  206. CN(NIT) = 0.0
  207. GO TO 220
  208. C
  209. C DIRICHLET-MIXED IN Y DIRECTION
  210. C
  211. 200 AN(1) = 0.0
  212. AN(NIT) = AN(NIT)+FYN
  213. BN(NIT) = BN(NIT)-2.*DLY*XNU*FYN
  214. CN(NIT) = 0.0
  215. GO TO 220
  216. C
  217. C MIXED - MIXED DIRECTION IN Y DIRECTION
  218. C
  219. 210 CONTINUE
  220. AN(1) = 0.0
  221. BN(1) = BN(1)+2.*DLY*GAMA*DY1
  222. CN(1) = CN(1)+DY1
  223. AN(NIT) = AN(NIT)+FYN
  224. BN(NIT) = BN(NIT)-2.0*DLY*XNU*FYN
  225. CN(NIT) = 0.0
  226. 220 IF (KSWX .EQ. 1) GO TO 270
  227. C
  228. C ADJUST USOL ALONG X EDGE
  229. C
  230. DO 260 J=JS,NS
  231. IF (KSWX.NE.2 .AND. KSWX.NE.3) GO TO 230
  232. USOL(IS,J) = USOL(IS,J)-AX1*USOL(1,J)
  233. GO TO 240
  234. 230 USOL(IS,J) = USOL(IS,J)+2.0*DLX*AX1*BDA(J)
  235. 240 IF (KSWX.NE.2 .AND. KSWX.NE.5) GO TO 250
  236. USOL(MS,J) = USOL(MS,J)-CXM*USOL(K,J)
  237. GO TO 260
  238. 250 USOL(MS,J) = USOL(MS,J)-2.0*DLX*CXM*BDB(J)
  239. 260 CONTINUE
  240. 270 IF (KSWY .EQ. 1) GO TO 320
  241. C
  242. C ADJUST USOL ALONG Y EDGE
  243. C
  244. DO 310 I=IS,MS
  245. IF (KSWY.NE.2 .AND. KSWY.NE.3) GO TO 280
  246. USOL(I,JS) = USOL(I,JS)-DY1*USOL(I,1)
  247. GO TO 290
  248. 280 USOL(I,JS) = USOL(I,JS)+2.0*DLY*DY1*BDC(I)
  249. 290 IF (KSWY.NE.2 .AND. KSWY.NE.5) GO TO 300
  250. USOL(I,NS) = USOL(I,NS)-FYN*USOL(I,L)
  251. GO TO 310
  252. 300 USOL(I,NS) = USOL(I,NS)-2.0*DLY*FYN*BDD(I)
  253. 310 CONTINUE
  254. 320 CONTINUE
  255. C
  256. C SAVE ADJUSTED EDGES IN GRHS IF IORDER=4
  257. C
  258. IF (IORDER .NE. 4) GO TO 350
  259. DO 330 J=JS,NS
  260. GRHS(IS,J) = USOL(IS,J)
  261. GRHS(MS,J) = USOL(MS,J)
  262. 330 CONTINUE
  263. DO 340 I=IS,MS
  264. GRHS(I,JS) = USOL(I,JS)
  265. GRHS(I,NS) = USOL(I,NS)
  266. 340 CONTINUE
  267. 350 CONTINUE
  268. IORD = IORDER
  269. PERTRB = 0.0
  270. C
  271. C CHECK IF OPERATOR IS SINGULAR
  272. C
  273. CALL CHKSN4(MBDCND,NBDCND,ALPHA,BETA,COFX,SINGLR)
  274. C
  275. C COMPUTE NON-ZERO EIGENVECTOR IN NULL SPACE OF TRANSPOSE
  276. C IF SINGULAR
  277. C
  278. IF (SINGLR) CALL TRIS4 (MIT,AM,BM,CM,DM,UM,ZM)
  279. IF (SINGLR) CALL TRIS4 (NIT,AN,BN,CN,DN,UN,ZN)
  280. C
  281. C ADJUST RIGHT HAND SIDE IF NECESSARY
  282. C
  283. 360 CONTINUE
  284. IF (SINGLR) CALL ORTHO4 (USOL,IDMN,ZN,ZM,PERTRB)
  285. C
  286. C COMPUTE SOLUTION
  287. C
  288. C SAVE ADJUSTED RIGHT HAND SIDE IN GRHS
  289. DO 444 J=JS,NS
  290. DO 444 I=IS,MS
  291. GRHS(I,J)=USOL(I,J)
  292. 444 CONTINUE
  293. CALL GENBUN(NP,NIT,MP,MIT,AM,BM,CM,IDMN,USOL(IS,JS),IEROR,W)
  294. C CHECK IF ERROR DETECTED IN POIS
  295. C THIS CAN ONLY CORRESPOND TO IERROR=12
  296. IF(IEROR.EQ.0) GO TO 224
  297. C SET ERROR FLAG IF IMPROPER COEFFICIENTS INPUT TO POIS
  298. IERROR=12
  299. RETURN
  300. 224 CONTINUE
  301. IF (IERROR .NE. 0) RETURN
  302. C
  303. C SET PERIODIC BOUNDARIES IF NECESSARY
  304. C
  305. IF (KSWX .NE. 1) GO TO 380
  306. DO 370 J=1,L
  307. USOL(K,J) = USOL(1,J)
  308. 370 CONTINUE
  309. 380 IF (KSWY .NE. 1) GO TO 400
  310. DO 390 I=1,K
  311. USOL(I,L) = USOL(I,1)
  312. 390 CONTINUE
  313. 400 CONTINUE
  314. C
  315. C MINIMIZE SOLUTION WITH RESPECT TO WEIGHTED LEAST SQUARES
  316. C NORM IF OPERATOR IS SINGULAR
  317. C
  318. IF (SINGLR) CALL MINSO4 (USOL,IDMN,ZN,ZM,PRTRB)
  319. C
  320. C RETURN IF DEFERRED CORRECTIONS AND A FOURTH ORDER SOLUTION ARE
  321. C NOT FLAGGED
  322. C
  323. IF (IORD .EQ. 2) RETURN
  324. IORD = 2
  325. C
  326. C COMPUTE NEW RIGHT HAND SIDE FOR FOURTH ORDER SOLUTION
  327. C
  328. CALL DEFE4(COFX,IDMN,USOL,GRHS)
  329. GO TO 360
  330. END