Annotation of 40BSD/cmd/efl/efltest/Band.e, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.