spelip.f 8.6 KB

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