123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- *DECK BLKTR1
- SUBROUTINE BLKTR1 (N, AN, BN, CN, M, AM, BM, CM, IDIMY, Y, B, W1,
- + W2, W3, WD, WW, WU, PRDCT, CPRDCT)
- C***BEGIN PROLOGUE BLKTR1
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BLKTRI
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (BLKTR1-S, CBLKT1-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C BLKTR1 solves the linear system set up by BLKTRI.
- C
- C B contains the roots of all the B polynomials.
- C W1,W2,W3,WD,WW,WU are all working arrays.
- C PRDCT is either PRODP or PROD depending on whether the boundary
- C conditions in the M direction are periodic or not.
- C CPRDCT is either CPRODP or CPROD which are the complex versions
- C of PRODP and PROD. These are called in the event that some
- C of the roots of the B sub P polynomial are complex.
- C
- C***SEE ALSO BLKTRI
- C***ROUTINES CALLED INDXA, INDXB, INDXC
- C***COMMON BLOCKS CBLKT
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE BLKTR1
- C
- DIMENSION AN(*) ,BN(*) ,CN(*) ,AM(*) ,
- 1 BM(*) ,CM(*) ,B(*) ,W1(*) ,
- 2 W2(*) ,W3(*) ,WD(*) ,WW(*) ,
- 3 WU(*) ,Y(IDIMY,*)
- COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
- 1 NM ,NCMPLX ,IK
- C***FIRST EXECUTABLE STATEMENT BLKTR1
- KDO = K-1
- DO 109 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I3 = I2+I1
- I4 = I2+I2
- IRM1 = IR-1
- CALL INDXB (I2,IR,IM2,NM2)
- CALL INDXB (I1,IRM1,IM3,NM3)
- CALL INDXB (I3,IRM1,IM1,NM1)
- CALL PRDCT (NM2,B(IM2),NM3,B(IM3),NM1,B(IM1),0,DUM,Y(1,I2),W3,
- 1 M,AM,BM,CM,WD,WW,WU)
- IF = 2**K
- DO 108 I=I4,IF,I4
- IF (I-NM) 101,101,108
- 101 IPI1 = I+I1
- IPI2 = I+I2
- IPI3 = I+I3
- CALL INDXC (I,IR,IDXC,NC)
- IF (I-IF) 102,108,108
- 102 CALL INDXA (I,IR,IDXA,NA)
- CALL INDXB (I-I1,IRM1,IM1,NM1)
- CALL INDXB (IPI2,IR,IP2,NP2)
- CALL INDXB (IPI1,IRM1,IP1,NP1)
- CALL INDXB (IPI3,IRM1,IP3,NP3)
- CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W3,W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- IF (IPI2-NM) 105,105,103
- 103 DO 104 J=1,M
- W3(J) = 0.
- W2(J) = 0.
- 104 CONTINUE
- GO TO 106
- 105 CALL PRDCT (NP2,B(IP2),NP1,B(IP1),NP3,B(IP3),0,DUM,
- 1 Y(1,IPI2),W3,M,AM,BM,CM,WD,WW,WU)
- CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W3,W2,M,AM,
- 1 BM,CM,WD,WW,WU)
- 106 DO 107 J=1,M
- Y(J,I) = W1(J)+W2(J)+Y(J,I)
- 107 CONTINUE
- 108 CONTINUE
- 109 CONTINUE
- IF (NPP) 132,110,132
- C
- C THE PERIODIC CASE IS TREATED USING THE CAPACITANCE MATRIX METHOD
- C
- 110 IF = 2**K
- I = IF/2
- I1 = I/2
- CALL INDXB (I-I1,K-2,IM1,NM1)
- CALL INDXB (I+I1,K-2,IP1,NP1)
- CALL INDXB (I,K-1,IZ,NZ)
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,Y(1,I),W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- IZR = I
- DO 111 J=1,M
- W2(J) = W1(J)
- 111 CONTINUE
- DO 113 LL=2,K
- L = K-LL+1
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I = I2
- CALL INDXC (I,IR,IDXC,NC)
- CALL INDXB (I,IR,IZ,NZ)
- CALL INDXB (I-I1,IR-1,IM1,NM1)
- CALL INDXB (I+I1,IR-1,IP1,NP1)
- CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W1,W1,M,AM,BM,
- 1 CM,WD,WW,WU)
- DO 112 J=1,M
- W1(J) = Y(J,I)+W1(J)
- 112 CONTINUE
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W1,W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- 113 CONTINUE
- DO 118 LL=2,K
- L = K-LL+1
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I4 = I2+I2
- IFD = IF-I2
- DO 117 I=I2,IFD,I4
- IF (I-I2-IZR) 117,114,117
- 114 IF (I-NM) 115,115,118
- 115 CALL INDXA (I,IR,IDXA,NA)
- CALL INDXB (I,IR,IZ,NZ)
- CALL INDXB (I-I1,IR-1,IM1,NM1)
- CALL INDXB (I+I1,IR-1,IP1,NP1)
- CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W2,W2,M,AM,
- 1 BM,CM,WD,WW,WU)
- DO 116 J=1,M
- W2(J) = Y(J,I)+W2(J)
- 116 CONTINUE
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W2,W2,M,
- 1 AM,BM,CM,WD,WW,WU)
- IZR = I
- IF (I-NM) 117,119,117
- 117 CONTINUE
- 118 CONTINUE
- 119 DO 120 J=1,M
- Y(J,NM+1) = Y(J,NM+1)-CN(NM+1)*W1(J)-AN(NM+1)*W2(J)
- 120 CONTINUE
- CALL INDXB (IF/2,K-1,IM1,NM1)
- CALL INDXB (IF,K-1,IP,NP)
- IF (NCMPLX) 121,122,121
- 121 CALL CPRDCT (NM+1,B(IP),NM1,B(IM1),0,DUM,0,DUM,Y(1,NM+1),
- 1 Y(1,NM+1),M,AM,BM,CM,W1,W3,WW)
- GO TO 123
- 122 CALL PRDCT (NM+1,B(IP),NM1,B(IM1),0,DUM,0,DUM,Y(1,NM+1),
- 1 Y(1,NM+1),M,AM,BM,CM,WD,WW,WU)
- 123 DO 124 J=1,M
- W1(J) = AN(1)*Y(J,NM+1)
- W2(J) = CN(NM)*Y(J,NM+1)
- Y(J,1) = Y(J,1)-W1(J)
- Y(J,NM) = Y(J,NM)-W2(J)
- 124 CONTINUE
- DO 126 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I4 = I2+I2
- I1 = I2/2
- I = I4
- CALL INDXA (I,IR,IDXA,NA)
- CALL INDXB (I-I2,IR,IM2,NM2)
- CALL INDXB (I-I2-I1,IR-1,IM3,NM3)
- CALL INDXB (I-I1,IR-1,IM1,NM1)
- CALL PRDCT (NM2,B(IM2),NM3,B(IM3),NM1,B(IM1),0,DUM,W1,W1,M,AM,
- 1 BM,CM,WD,WW,WU)
- CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W1,W1,M,AM,BM,
- 1 CM,WD,WW,WU)
- DO 125 J=1,M
- Y(J,I) = Y(J,I)-W1(J)
- 125 CONTINUE
- 126 CONTINUE
- C
- IZR = NM
- DO 131 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I1 = I2/2
- I3 = I2+I1
- I4 = I2+I2
- IRM1 = IR-1
- DO 130 I=I4,IF,I4
- IPI1 = I+I1
- IPI2 = I+I2
- IPI3 = I+I3
- IF (IPI2-IZR) 127,128,127
- 127 IF (I-IZR) 130,131,130
- 128 CALL INDXC (I,IR,IDXC,NC)
- CALL INDXB (IPI2,IR,IP2,NP2)
- CALL INDXB (IPI1,IRM1,IP1,NP1)
- CALL INDXB (IPI3,IRM1,IP3,NP3)
- CALL PRDCT (NP2,B(IP2),NP1,B(IP1),NP3,B(IP3),0,DUM,W2,W2,M,
- 1 AM,BM,CM,WD,WW,WU)
- CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W2,W2,M,AM,
- 1 BM,CM,WD,WW,WU)
- DO 129 J=1,M
- Y(J,I) = Y(J,I)-W2(J)
- 129 CONTINUE
- IZR = I
- GO TO 131
- 130 CONTINUE
- 131 CONTINUE
- C
- C BEGIN BACK SUBSTITUTION PHASE
- C
- 132 DO 144 LL=1,K
- L = K-LL+1
- IR = L-1
- IRM1 = IR-1
- I2 = 2**IR
- I1 = I2/2
- I4 = I2+I2
- IFD = IF-I2
- DO 143 I=I2,IFD,I4
- IF (I-NM) 133,133,143
- 133 IMI1 = I-I1
- IMI2 = I-I2
- IPI1 = I+I1
- IPI2 = I+I2
- CALL INDXA (I,IR,IDXA,NA)
- CALL INDXC (I,IR,IDXC,NC)
- CALL INDXB (I,IR,IZ,NZ)
- CALL INDXB (IMI1,IRM1,IM1,NM1)
- CALL INDXB (IPI1,IRM1,IP1,NP1)
- IF (I-I2) 134,134,136
- 134 DO 135 J=1,M
- W1(J) = 0.
- 135 CONTINUE
- GO TO 137
- 136 CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),Y(1,IMI2),
- 1 W1,M,AM,BM,CM,WD,WW,WU)
- 137 IF (IPI2-NM) 140,140,138
- 138 DO 139 J=1,M
- W2(J) = 0.
- 139 CONTINUE
- GO TO 141
- 140 CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),Y(1,IPI2),
- 1 W2,M,AM,BM,CM,WD,WW,WU)
- 141 DO 142 J=1,M
- W1(J) = Y(J,I)+W1(J)+W2(J)
- 142 CONTINUE
- CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W1,Y(1,I),
- 1 M,AM,BM,CM,WD,WW,WU)
- 143 CONTINUE
- 144 CONTINUE
- RETURN
- END
|