123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542 |
- *DECK POSTG2
- SUBROUTINE POSTG2 (NPEROD, N, M, A, BB, C, IDIMQ, Q, B, B2, B3, W,
- + W2, W3, D, TCOS, P)
- C***BEGIN PROLOGUE POSTG2
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to POISTG
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (POSTG2-S)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C Subroutine to solve Poisson's equation on a staggered grid.
- C
- C***SEE ALSO POISTG
- C***ROUTINES CALLED COSGEN, S1MERG, TRI3, TRIX
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C 920130 Modified to use merge routine S1MERG rather than deleted
- C routine MERGE. (WRB)
- C***END PROLOGUE POSTG2
- C
- DIMENSION A(*) ,BB(*) ,C(*) ,Q(IDIMQ,*) ,
- 1 B(*) ,B2(*) ,B3(*) ,W(*) ,
- 2 W2(*) ,W3(*) ,D(*) ,TCOS(*) ,
- 3 K(4) ,P(*)
- EQUIVALENCE (K(1),K1) ,(K(2),K2) ,(K(3),K3) ,(K(4),K4)
- C***FIRST EXECUTABLE STATEMENT POSTG2
- NP = NPEROD
- FNUM = 0.5*(NP/3)
- FNUM2 = 0.5*(NP/2)
- MR = M
- IP = -MR
- IPSTOR = 0
- I2R = 1
- JR = 2
- NR = N
- NLAST = N
- KR = 1
- LR = 0
- IF (NR .LE. 3) GO TO 142
- 101 CONTINUE
- JR = 2*I2R
- NROD = 1
- IF ((NR/2)*2 .EQ. NR) NROD = 0
- JSTART = 1
- JSTOP = NLAST-JR
- IF (NROD .EQ. 0) JSTOP = JSTOP-I2R
- I2RBY2 = I2R/2
- IF (JSTOP .GE. JSTART) GO TO 102
- J = JR
- GO TO 115
- 102 CONTINUE
- C
- C REGULAR REDUCTION.
- C
- IJUMP = 1
- DO 114 J=JSTART,JSTOP,JR
- JP1 = J+I2RBY2
- JP2 = J+I2R
- JP3 = JP2+I2RBY2
- JM1 = J-I2RBY2
- JM2 = J-I2R
- JM3 = JM2-I2RBY2
- IF (J .NE. 1) GO TO 106
- CALL COSGEN (I2R,1,FNUM,0.5,TCOS)
- IF (I2R .NE. 1) GO TO 104
- DO 103 I=1,MR
- B(I) = Q(I,1)
- Q(I,1) = Q(I,2)
- 103 CONTINUE
- GO TO 112
- 104 DO 105 I=1,MR
- B(I) = Q(I,1)+0.5*(Q(I,JP2)-Q(I,JP1)-Q(I,JP3))
- Q(I,1) = Q(I,JP2)+Q(I,1)-Q(I,JP1)
- 105 CONTINUE
- GO TO 112
- 106 CONTINUE
- GO TO (107,108),IJUMP
- 107 CONTINUE
- IJUMP = 2
- CALL COSGEN (I2R,1,0.5,0.0,TCOS)
- 108 CONTINUE
- IF (I2R .NE. 1) GO TO 110
- DO 109 I=1,MR
- B(I) = 2.*Q(I,J)
- Q(I,J) = Q(I,JM2)+Q(I,JP2)
- 109 CONTINUE
- GO TO 112
- 110 DO 111 I=1,MR
- FI = Q(I,J)
- Q(I,J) = Q(I,J)-Q(I,JM1)-Q(I,JP1)+Q(I,JM2)+Q(I,JP2)
- B(I) = FI+Q(I,J)-Q(I,JM3)-Q(I,JP3)
- 111 CONTINUE
- 112 CONTINUE
- CALL TRIX (I2R,0,MR,A,BB,C,B,TCOS,D,W)
- DO 113 I=1,MR
- Q(I,J) = Q(I,J)+B(I)
- 113 CONTINUE
- C
- C END OF REDUCTION FOR REGULAR UNKNOWNS.
- C
- 114 CONTINUE
- C
- C BEGIN SPECIAL REDUCTION FOR LAST UNKNOWN.
- C
- J = JSTOP+JR
- 115 NLAST = J
- JM1 = J-I2RBY2
- JM2 = J-I2R
- JM3 = JM2-I2RBY2
- IF (NROD .EQ. 0) GO TO 125
- C
- C ODD NUMBER OF UNKNOWNS
- C
- IF (I2R .NE. 1) GO TO 117
- DO 116 I=1,MR
- B(I) = Q(I,J)
- Q(I,J) = Q(I,JM2)
- 116 CONTINUE
- GO TO 123
- 117 DO 118 I=1,MR
- B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
- 118 CONTINUE
- IF (NRODPR .NE. 0) GO TO 120
- DO 119 I=1,MR
- II = IP+I
- Q(I,J) = Q(I,JM2)+P(II)
- 119 CONTINUE
- IP = IP-MR
- GO TO 122
- 120 CONTINUE
- DO 121 I=1,MR
- Q(I,J) = Q(I,J)-Q(I,JM1)+Q(I,JM2)
- 121 CONTINUE
- 122 IF (LR .EQ. 0) GO TO 123
- CALL COSGEN (LR,1,FNUM2,0.5,TCOS(KR+1))
- 123 CONTINUE
- CALL COSGEN (KR,1,FNUM2,0.5,TCOS)
- CALL TRIX (KR,LR,MR,A,BB,C,B,TCOS,D,W)
- DO 124 I=1,MR
- Q(I,J) = Q(I,J)+B(I)
- 124 CONTINUE
- KR = KR+I2R
- GO TO 141
- 125 CONTINUE
- C
- C EVEN NUMBER OF UNKNOWNS
- C
- JP1 = J+I2RBY2
- JP2 = J+I2R
- IF (I2R .NE. 1) GO TO 129
- DO 126 I=1,MR
- B(I) = Q(I,J)
- 126 CONTINUE
- TCOS(1) = 0.
- CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
- IP = 0
- IPSTOR = MR
- DO 127 I=1,MR
- P(I) = B(I)
- B(I) = B(I)+Q(I,N)
- 127 CONTINUE
- TCOS(1) = -1.+2*(NP/2)
- TCOS(2) = 0.
- CALL TRIX (1,1,MR,A,BB,C,B,TCOS,D,W)
- DO 128 I=1,MR
- Q(I,J) = Q(I,JM2)+P(I)+B(I)
- 128 CONTINUE
- GO TO 140
- 129 CONTINUE
- DO 130 I=1,MR
- B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
- 130 CONTINUE
- IF (NRODPR .NE. 0) GO TO 132
- DO 131 I=1,MR
- II = IP+I
- B(I) = B(I)+P(II)
- 131 CONTINUE
- GO TO 134
- 132 CONTINUE
- DO 133 I=1,MR
- B(I) = B(I)+Q(I,JP2)-Q(I,JP1)
- 133 CONTINUE
- 134 CONTINUE
- CALL COSGEN (I2R,1,0.5,0.0,TCOS)
- CALL TRIX (I2R,0,MR,A,BB,C,B,TCOS,D,W)
- IP = IP+MR
- IPSTOR = MAX(IPSTOR,IP+MR)
- DO 135 I=1,MR
- II = IP+I
- P(II) = B(I)+.5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
- B(I) = P(II)+Q(I,JP2)
- 135 CONTINUE
- IF (LR .EQ. 0) GO TO 136
- CALL COSGEN (LR,1,FNUM2,0.5,TCOS(I2R+1))
- CALL S1MERG (TCOS,0,I2R,I2R,LR,KR)
- GO TO 138
- 136 DO 137 I=1,I2R
- II = KR+I
- TCOS(II) = TCOS(I)
- 137 CONTINUE
- 138 CALL COSGEN (KR,1,FNUM2,0.5,TCOS)
- CALL TRIX (KR,KR,MR,A,BB,C,B,TCOS,D,W)
- DO 139 I=1,MR
- II = IP+I
- Q(I,J) = Q(I,JM2)+P(II)+B(I)
- 139 CONTINUE
- 140 CONTINUE
- LR = KR
- KR = KR+JR
- 141 CONTINUE
- NR = (NLAST-1)/JR+1
- IF (NR .LE. 3) GO TO 142
- I2R = JR
- NRODPR = NROD
- GO TO 101
- 142 CONTINUE
- C
- C BEGIN SOLUTION
- C
- J = 1+JR
- JM1 = J-I2R
- JP1 = J+I2R
- JM2 = NLAST-I2R
- IF (NR .EQ. 2) GO TO 180
- IF (LR .NE. 0) GO TO 167
- IF (N .NE. 3) GO TO 156
- C
- C CASE N = 3.
- C
- GO TO (143,148,143),NP
- 143 DO 144 I=1,MR
- B(I) = Q(I,2)
- B2(I) = Q(I,1)+Q(I,3)
- B3(I) = 0.
- 144 CONTINUE
- GO TO (146,146,145),NP
- 145 TCOS(1) = -1.
- TCOS(2) = 1.
- K1 = 1
- GO TO 147
- 146 TCOS(1) = -2.
- TCOS(2) = 1.
- TCOS(3) = -1.
- K1 = 2
- 147 K2 = 1
- K3 = 0
- K4 = 0
- GO TO 150
- 148 DO 149 I=1,MR
- B(I) = Q(I,2)
- B2(I) = Q(I,3)
- B3(I) = Q(I,1)
- 149 CONTINUE
- CALL COSGEN (3,1,0.5,0.0,TCOS)
- TCOS(4) = -1.
- TCOS(5) = 1.
- TCOS(6) = -1.
- TCOS(7) = 1.
- K1 = 3
- K2 = 2
- K3 = 1
- K4 = 1
- 150 CALL TRI3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
- DO 151 I=1,MR
- B(I) = B(I)+B2(I)+B3(I)
- 151 CONTINUE
- GO TO (153,153,152),NP
- 152 TCOS(1) = 2.
- CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
- 153 DO 154 I=1,MR
- Q(I,2) = B(I)
- B(I) = Q(I,1)+B(I)
- 154 CONTINUE
- TCOS(1) = -1.+4.*FNUM
- CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
- DO 155 I=1,MR
- Q(I,1) = B(I)
- 155 CONTINUE
- JR = 1
- I2R = 0
- GO TO 188
- C
- C CASE N = 2**P+1
- C
- 156 CONTINUE
- DO 157 I=1,MR
- B(I) = Q(I,J)+Q(I,1)-Q(I,JM1)+Q(I,NLAST)-Q(I,JM2)
- 157 CONTINUE
- GO TO (158,160,158),NP
- 158 DO 159 I=1,MR
- B2(I) = Q(I,1)+Q(I,NLAST)+Q(I,J)-Q(I,JM1)-Q(I,JP1)
- B3(I) = 0.
- 159 CONTINUE
- K1 = NLAST-1
- K2 = NLAST+JR-1
- CALL COSGEN (JR-1,1,0.0,1.0,TCOS(NLAST))
- TCOS(K2) = 2*NP-4
- CALL COSGEN (JR,1,0.5-FNUM,0.5,TCOS(K2+1))
- K3 = (3-NP)/2
- CALL S1MERG (TCOS,K1,JR-K3,K2-K3,JR+K3,0)
- K1 = K1-1+K3
- CALL COSGEN (JR,1,FNUM,0.5,TCOS(K1+1))
- K2 = JR
- K3 = 0
- K4 = 0
- GO TO 162
- 160 DO 161 I=1,MR
- FI = (Q(I,J)-Q(I,JM1)-Q(I,JP1))/2.
- B2(I) = Q(I,1)+FI
- B3(I) = Q(I,NLAST)+FI
- 161 CONTINUE
- K1 = NLAST+JR-1
- K2 = K1+JR-1
- CALL COSGEN (JR-1,1,0.0,1.0,TCOS(K1+1))
- CALL COSGEN (NLAST,1,0.5,0.0,TCOS(K2+1))
- CALL S1MERG (TCOS,K1,JR-1,K2,NLAST,0)
- K3 = K1+NLAST-1
- K4 = K3+JR
- CALL COSGEN (JR,1,0.5,0.5,TCOS(K3+1))
- CALL COSGEN (JR,1,0.0,0.5,TCOS(K4+1))
- CALL S1MERG (TCOS,K3,JR,K4,JR,K1)
- K2 = NLAST-1
- K3 = JR
- K4 = JR
- 162 CALL TRI3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
- DO 163 I=1,MR
- B(I) = B(I)+B2(I)+B3(I)
- 163 CONTINUE
- IF (NP .NE. 3) GO TO 164
- TCOS(1) = 2.
- CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
- 164 DO 165 I=1,MR
- Q(I,J) = B(I)+.5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
- B(I) = Q(I,J)+Q(I,1)
- 165 CONTINUE
- CALL COSGEN (JR,1,FNUM,0.5,TCOS)
- CALL TRIX (JR,0,MR,A,BB,C,B,TCOS,D,W)
- DO 166 I=1,MR
- Q(I,1) = Q(I,1)-Q(I,JM1)+B(I)
- 166 CONTINUE
- GO TO 188
- C
- C CASE OF GENERAL N WITH NR = 3 .
- C
- 167 CONTINUE
- DO 168 I=1,MR
- B(I) = Q(I,1)-Q(I,JM1)+Q(I,J)
- 168 CONTINUE
- IF (NROD .NE. 0) GO TO 170
- DO 169 I=1,MR
- II = IP+I
- B(I) = B(I)+P(II)
- 169 CONTINUE
- GO TO 172
- 170 DO 171 I=1,MR
- B(I) = B(I)+Q(I,NLAST)-Q(I,JM2)
- 171 CONTINUE
- 172 CONTINUE
- DO 173 I=1,MR
- T = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
- Q(I,J) = T
- B2(I) = Q(I,NLAST)+T
- B3(I) = Q(I,1)+T
- 173 CONTINUE
- K1 = KR+2*JR
- CALL COSGEN (JR-1,1,0.0,1.0,TCOS(K1+1))
- K2 = K1+JR
- TCOS(K2) = 2*NP-4
- K4 = (NP-1)*(3-NP)
- K3 = K2+1-K4
- CALL COSGEN (KR+JR+K4,1,K4/2.,1.-K4,TCOS(K3))
- K4 = 1-NP/3
- CALL S1MERG (TCOS,K1,JR-K4,K2-K4,KR+JR+K4,0)
- IF (NP .EQ. 3) K1 = K1-1
- K2 = KR+JR
- K4 = K1+K2
- CALL COSGEN (KR,1,FNUM2,0.5,TCOS(K4+1))
- K3 = K4+KR
- CALL COSGEN (JR,1,FNUM,0.5,TCOS(K3+1))
- CALL S1MERG (TCOS,K4,KR,K3,JR,K1)
- K4 = K3+JR
- CALL COSGEN (LR,1,FNUM2,0.5,TCOS(K4+1))
- CALL S1MERG (TCOS,K3,JR,K4,LR,K1+K2)
- CALL COSGEN (KR,1,FNUM2,0.5,TCOS(K3+1))
- K3 = KR
- K4 = KR
- CALL TRI3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
- DO 174 I=1,MR
- B(I) = B(I)+B2(I)+B3(I)
- 174 CONTINUE
- IF (NP .NE. 3) GO TO 175
- TCOS(1) = 2.
- CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
- 175 DO 176 I=1,MR
- Q(I,J) = Q(I,J)+B(I)
- B(I) = Q(I,1)+Q(I,J)
- 176 CONTINUE
- CALL COSGEN (JR,1,FNUM,0.5,TCOS)
- CALL TRIX (JR,0,MR,A,BB,C,B,TCOS,D,W)
- IF (JR .NE. 1) GO TO 178
- DO 177 I=1,MR
- Q(I,1) = B(I)
- 177 CONTINUE
- GO TO 188
- 178 CONTINUE
- DO 179 I=1,MR
- Q(I,1) = Q(I,1)-Q(I,JM1)+B(I)
- 179 CONTINUE
- GO TO 188
- 180 CONTINUE
- C
- C CASE OF GENERAL N AND NR = 2 .
- C
- DO 181 I=1,MR
- II = IP+I
- B3(I) = 0.
- B(I) = Q(I,1)+P(II)
- Q(I,1) = Q(I,1)-Q(I,JM1)
- B2(I) = Q(I,1)+Q(I,NLAST)
- 181 CONTINUE
- K1 = KR+JR
- K2 = K1+JR
- CALL COSGEN (JR-1,1,0.0,1.0,TCOS(K1+1))
- GO TO (182,183,182),NP
- 182 TCOS(K2) = 2*NP-4
- CALL COSGEN (KR,1,0.0,1.0,TCOS(K2+1))
- GO TO 184
- 183 CALL COSGEN (KR+1,1,0.5,0.0,TCOS(K2))
- 184 K4 = 1-NP/3
- CALL S1MERG (TCOS,K1,JR-K4,K2-K4,KR+K4,0)
- IF (NP .EQ. 3) K1 = K1-1
- K2 = KR
- CALL COSGEN (KR,1,FNUM2,0.5,TCOS(K1+1))
- K4 = K1+KR
- CALL COSGEN (LR,1,FNUM2,0.5,TCOS(K4+1))
- K3 = LR
- K4 = 0
- CALL TRI3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
- DO 185 I=1,MR
- B(I) = B(I)+B2(I)
- 185 CONTINUE
- IF (NP .NE. 3) GO TO 186
- TCOS(1) = 2.
- CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
- 186 DO 187 I=1,MR
- Q(I,1) = Q(I,1)+B(I)
- 187 CONTINUE
- 188 CONTINUE
- C
- C START BACK SUBSTITUTION.
- C
- J = NLAST-JR
- DO 189 I=1,MR
- B(I) = Q(I,NLAST)+Q(I,J)
- 189 CONTINUE
- JM2 = NLAST-I2R
- IF (JR .NE. 1) GO TO 191
- DO 190 I=1,MR
- Q(I,NLAST) = 0.
- 190 CONTINUE
- GO TO 195
- 191 CONTINUE
- IF (NROD .NE. 0) GO TO 193
- DO 192 I=1,MR
- II = IP+I
- Q(I,NLAST) = P(II)
- 192 CONTINUE
- IP = IP-MR
- GO TO 195
- 193 DO 194 I=1,MR
- Q(I,NLAST) = Q(I,NLAST)-Q(I,JM2)
- 194 CONTINUE
- 195 CONTINUE
- CALL COSGEN (KR,1,FNUM2,0.5,TCOS)
- CALL COSGEN (LR,1,FNUM2,0.5,TCOS(KR+1))
- CALL TRIX (KR,LR,MR,A,BB,C,B,TCOS,D,W)
- DO 196 I=1,MR
- Q(I,NLAST) = Q(I,NLAST)+B(I)
- 196 CONTINUE
- NLASTP = NLAST
- 197 CONTINUE
- JSTEP = JR
- JR = I2R
- I2R = I2R/2
- IF (JR .EQ. 0) GO TO 210
- JSTART = 1+JR
- KR = KR-JR
- IF (NLAST+JR .GT. N) GO TO 198
- KR = KR-JR
- NLAST = NLAST+JR
- JSTOP = NLAST-JSTEP
- GO TO 199
- 198 CONTINUE
- JSTOP = NLAST-JR
- 199 CONTINUE
- LR = KR-JR
- CALL COSGEN (JR,1,0.5,0.0,TCOS)
- DO 209 J=JSTART,JSTOP,JSTEP
- JM2 = J-JR
- JP2 = J+JR
- IF (J .NE. JR) GO TO 201
- DO 200 I=1,MR
- B(I) = Q(I,J)+Q(I,JP2)
- 200 CONTINUE
- GO TO 203
- 201 CONTINUE
- DO 202 I=1,MR
- B(I) = Q(I,J)+Q(I,JM2)+Q(I,JP2)
- 202 CONTINUE
- 203 CONTINUE
- IF (JR .NE. 1) GO TO 205
- DO 204 I=1,MR
- Q(I,J) = 0.
- 204 CONTINUE
- GO TO 207
- 205 CONTINUE
- JM1 = J-I2R
- JP1 = J+I2R
- DO 206 I=1,MR
- Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
- 206 CONTINUE
- 207 CONTINUE
- CALL TRIX (JR,0,MR,A,BB,C,B,TCOS,D,W)
- DO 208 I=1,MR
- Q(I,J) = Q(I,J)+B(I)
- 208 CONTINUE
- 209 CONTINUE
- NROD = 1
- IF (NLAST+I2R .LE. N) NROD = 0
- IF (NLASTP .NE. NLAST) GO TO 188
- GO TO 197
- 210 CONTINUE
- C
- C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
- C
- W(1) = IPSTOR
- RETURN
- END
|