Annotation of 41BSD/cmd/efl/efltest/Band.e, revision 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.