|
|
1.1 ! root 1: subroutine bnds(n, ml, m, g, nb, b) ! 2: integer m, n, nb ! 3: integer ml ! 4: real g(n, m), b(n, nb) ! 5: common /cstak/ ds ! 6: double precision ds(500) ! 7: integer istkgt, nerror, max0, iint, nerr, il ! 8: integer is(1000) ! 9: real rs(1000), ws(500) ! 10: logical ls(1000) ! 11: complex cs(500) ! 12: equivalence (ds(1), cs(1), ws(1), rs(1), is(1), ls(1)) ! 13: c to solve a*x = b, where a is a banded matrix, using gaussian ! 14: c elimination with partial pivoting. ! 15: c mnemonic - double precision band solution of a system of ! 16: c linear algebraic equations. ! 17: c input - ! 18: c n - the order of the system. ! 19: c ml - the number of nonzero elements of a on and below the diagonal. ! 20: c m - the total number of nonzero elements in each row of a. ! 21: c g - the matrix a, with g(i,j) = a(i,i+j-ml). ! 22: c nb - the number of right-hand-sides b. ! 23: c b - the right-hand-sides. ! 24: c output - ! 25: c g - has been clobbered. ! 26: c b - the solution vectors, x. ! 27: c scratch space allocated - n*( (ml-1)*mu + 1 ) words. ! 28: c error states - ! 29: c 1 - n.lt.1. ! 30: c 2 - ml.lt.1. ! 31: c 3 - ml.gt.m. ! 32: c 4 - nb.lt.1. ! 33: c 5 - singular matrix. (recoverable) ! 34: c check the input for errors. ! 35: if (n .lt. 1) call seterr(14h bnds - n.lt.1, 14, 1, 2) ! 36: if (ml .lt. 1) call seterr(15h bnds - ml.lt.1, 16, 2, 2) ! 37: if (ml .gt. m) call seterr(15h bnds - ml.gt.m, 15, 3, 2) ! 38: if (nb .lt. 1) call seterr(15h bnds - nb.lt.1, 15, 4, 2) ! 39: call enter(1) ! 40: il = istkgt(max0(n*(ml-1), 1), 3) ! 41: iint = istkgt(n, 2) ! 42: call bndlu(n, ml, m, g, ws(il), is(iint)) ! 43: if (nerror(nerr) .ne. 0) goto 1 ! 44: call bndfb(n, ml, m, ws(il), g, is(iint), nb, b) ! 45: goto 2 ! 46: 1 call erroff ! 47: call seterr(23h bnds - singular matrix, 23, 5, 1) ! 48: 2 call leave ! 49: return ! 50: end ! 51: subroutine bndlu(n, ml, m, g, l, int) ! 52: integer m, n, ml ! 53: integer int(n) ! 54: real g(n, m), l(n, ml) ! 55: integer min0, i, j, k, m1, m2 ! 56: integer ll ! 57: real abs, eps, x, norm, amax1, r1mach ! 58: logical sing ! 59: integer temp, temp1 ! 60: c to obtain the lu decomposition of a banded matrix, ! 61: c using gaussian elimination with partial pivoting. ! 62: c mnemonic - double precision band lu decomposition. ! 63: c input - ! 64: c n - the order of the matrix. ! 65: c ml - the number of nonzero elements of a on and below the diagonal. ! 66: c m - the number of nonzero elements in each row of a. ! 67: c g - the matrix a, with g(i,j) = a(i,i+j-ml). ! 68: c output - ! 69: c l - the lower triangular banded factor of a. ! 70: c g - the upper triangular banded factor of a. ! 71: c int - the row pivoting used. ! 72: c scratch storage allocated - none. ! 73: c error states - ! 74: c 1 - n.lt.1. ! 75: c 2 - ml.lt.1. ! 76: c 3 - m.lt.ml. ! 77: c 4 - singular matrix. (recoverable) ! 78: c l(n,ml-1). ! 79: c check the input for errors. ! 80: if (n .lt. 1) call seterr(15h bndlu - n.lt.1, 15, 1, 2) ! 81: if (ml .lt. 1) call seterr(16h bndlu - ml.lt.1, 16, 2, 2) ! 82: if (m .lt. ml) call seterr(16h bndlu - m.lt.ml, 16, 3, 2) ! 83: c protect against an existing error state. ! 84: call entsrc(i, 0) ! 85: sing = .false. ! 86: eps = r1mach(4) ! 87: m1 = ml-1 ! 88: m2 = m-ml ! 89: ll = m1 ! 90: i = 1 ! 91: goto 2 ! 92: 1 i = i+1 ! 93: 2 if (i .gt. min0(m1, n)) goto 5 ! 94: c set to 0 those elements ! 95: c of g which are undefined. ! 96: temp = ml+1-i ! 97: do 3 j = temp, m ! 98: temp1 = j-ll ! 99: g(i, temp1) = g(i, j) ! 100: 3 continue ! 101: ll = ll-1 ! 102: temp = m-ll ! 103: do 4 j = temp, m ! 104: g(i, j) = 0.0e0 ! 105: 4 continue ! 106: goto 1 ! 107: 5 i = 1 ! 108: goto 7 ! 109: 6 i = i+1 ! 110: 7 if (i .gt. min0(m2, n)) goto 9 ! 111: c zero out lower rhs wart. ! 112: temp = ml+i ! 113: do 8 j = temp, m ! 114: temp1 = n+1-i ! 115: g(temp1, j) = 0.0e0 ! 116: 8 continue ! 117: goto 6 ! 118: c get || a || sub infinity. ! 119: 9 norm = 0.0e0 ! 120: do 11 i = 1, n ! 121: int(i) = i ! 122: x = 0.0e0 ! 123: do 10 j = 1, m ! 124: x = x+abs(g(i, j)) ! 125: 10 continue ! 126: norm = amax1(norm, x) ! 127: 11 continue ! 128: do 20 k = 1, n ! 129: x = g(k, 1) ! 130: i = k ! 131: ll = min0(m1+k, n) ! 132: if (k .ge. ll) goto 14 ! 133: temp = k+1 ! 134: do 13 j = temp, ll ! 135: c get the pivot row. ! 136: if (abs(g(j, 1)) .le. abs(x)) goto 12 ! 137: x = g(j, 1) ! 138: i = j ! 139: 12 continue ! 140: 13 continue ! 141: 14 int(k) = i ! 142: if (x .ne. 0.0e0) goto 15 ! 143: sing = .true. ! 144: g(k, 1) = norm*eps ! 145: 15 if (ml .eq. 1 .or. k .eq. n) goto 20 ! 146: if (i .eq. k) goto 17 ! 147: do 16 j = 1, m ! 148: c need to interchange the rows. ! 149: x = g(k, j) ! 150: g(k, j) = g(i, j) ! 151: g(i, j) = x ! 152: 16 continue ! 153: 17 if (k .ge. ll) goto 20 ! 154: temp = k+1 ! 155: do 19 i = temp, ll ! 156: x = g(i, 1)/g(k, 1) ! 157: temp1 = i-k ! 158: l(k, temp1) = x ! 159: do 18 j = 2, m ! 160: g(i, j-1) = g(i, j)-x*g(k, j) ! 161: 18 continue ! 162: g(i, m) = 0.0e0 ! 163: 19 continue ! 164: 20 continue ! 165: if (sing) call seterr(24h bndlu - singular matrix, 24, 4, 1) ! 166: return ! 167: end ! 168: subroutine bndfb(n, ml, m, l, u, int, nb, b) ! 169: integer m, n, nb, ml ! 170: integer int(n) ! 171: real l(n, ml), u(n, m), b(n, nb) ! 172: integer nerror, nerr ! 173: c to solve l*u*x = b, where l and u result from a call to bnds. ! 174: c mnemonic - double precision band forward elimination and ! 175: c back-solve. ! 176: c input - ! 177: c n - the order of the system. ! 178: c ml - the number of nonzero entries of l on and below ! 179: c the diagonal. ! 180: c m - the number of nonzero elements of u on and above ! 181: c the diagonal. ! 182: c l - the lower triangular banded factor. ! 183: c u - the upper triangular banded factor. ! 184: c int - the ordering of the rows of the system, due to pivoting. ! 185: c nb - the number of right-hand-sides. ! 186: c b - the right-hand-sides. ! 187: c output - ! 188: c b - the solution vectors. ! 189: c scratch space allocated - none. ! 190: c error states - ! 191: c 1 - n.lt.1. ! 192: c 2 - ml.lt.1. ! 193: c 3 - m.lt.ml. ! 194: c 4 - nb.lt.1. ! 195: c l(n,ml-1). ! 196: c check the input for errors. ! 197: if (n .lt. 1) call seterr(15h bndfb - n.lt.1, 15, 1, 2) ! 198: if (ml .lt. 1) call seterr(16h bndfb - ml.lt.1, 16, 2, 2) ! 199: if (m .lt. ml) call seterr(16h bndfb - m.lt.ml, 16, 3, 2) ! 200: if (nb .lt. 1) call seterr(16h bndfb - nb.lt.1, 16, 4, 2) ! 201: c protect against an existing error state. ! 202: call entsrc(nerr, 0) ! 203: call bndfe(n, ml, l, int, nb, b) ! 204: c do the forward-elimination. ! 205: call bndbs(n, m, u, nb, b) ! 206: c do the back-substitution. ! 207: return ! 208: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.