Annotation of researchv10no/cmd/view2d/num/sqrsl.f, revision 1.1.1.1

1.1       root        1:       subroutine sqrsl(x,ldx,n,k,qraux,y,qy,qty,b,rsd,xb,job,info)
                      2:       integer ldx,n,k,job,info
                      3:       real x(ldx,1),qraux(1),y(1),qy(1),qty(1),b(1),rsd(1),xb(1)
                      4: c
                      5: c     sqrsl applies the output of sqrdc to compute coordinate
                      6: c     transformations, projections, and least squares solutions.
                      7: c     for k .le. min(n,p), let xk be the matrix
                      8: c
                      9: c            xk = (x(jpvt(1)),x(jpvt(2)), ... ,x(jpvt(k)))
                     10: c
                     11: c     formed from columnns jpvt(1), ... ,jpvt(k) of the original
                     12: c     n x p matrix x that was input to sqrdc (if no pivoting was
                     13: c     done, xk consists of the first k columns of x in their
                     14: c     original order).  sqrdc produces a factored orthogonal matrix q
                     15: c     and an upper triangular matrix r such that
                     16: c
                     17: c              xk = q * (r)
                     18: c                       (0)
                     19: c
                     20: c     this information is contained in coded form in the arrays
                     21: c     x and qraux.
                     22: c
                     23: c     on entry
                     24: c
                     25: c        x      real(ldx,p).
                     26: c               x contains the output of sqrdc.
                     27: c
                     28: c        ldx    integer.
                     29: c               ldx is the leading dimension of the array x.
                     30: c
                     31: c        n      integer.
                     32: c               n is the number of rows of the matrix xk.  it must
                     33: c               have the same value as n in sqrdc.
                     34: c
                     35: c        k      integer.
                     36: c               k is the number of columns of the matrix xk.  k
                     37: c               must nnot be greater than min(n,p), where p is the
                     38: c               same as in the calling sequence to sqrdc.
                     39: c
                     40: c        qraux  real(p).
                     41: c               qraux contains the auxiliary output from sqrdc.
                     42: c
                     43: c        y      real(n)
                     44: c               y contains an n-vector that is to be manipulated
                     45: c               by sqrsl.
                     46: c
                     47: c        job    integer.
                     48: c               job specifies what is to be computed.  job has
                     49: c               the decimal expansion abcde, with the following
                     50: c               meaning.
                     51: c
                     52: c                    if a.ne.0, compute qy.
                     53: c                    if b,c,d, or e .ne. 0, compute qty.
                     54: c                    if c.ne.0, compute b.
                     55: c                    if d.ne.0, compute rsd.
                     56: c                    if e.ne.0, compute xb.
                     57: c
                     58: c               note that a request to compute b, rsd, or xb
                     59: c               automatically triggers the computation of qty, for
                     60: c               which an array must be provided in the calling
                     61: c               sequence.
                     62: c
                     63: c     on return
                     64: c
                     65: c        qy     real(n).
                     66: c               qy conntains q*y, if its computation has been
                     67: c               requested.
                     68: c
                     69: c        qty    real(n).
                     70: c               qty contains trans(q)*y, if its computation has
                     71: c               been requested.  here trans(q) is the
                     72: c               transpose of the matrix q.
                     73: c
                     74: c        b      real(k)
                     75: c               b contains the solution of the least squares problem
                     76: c
                     77: c                    minimize norm2(y - xk*b),
                     78: c
                     79: c               if its computation has been requested.  (note that
                     80: c               if pivoting was requested in sqrdc, the j-th
                     81: c               component of b will be associated with column jpvt(j)
                     82: c               of the original matrix x that was input into sqrdc.)
                     83: c
                     84: c        rsd    real(n).
                     85: c               rsd contains the least squares residual y - xk*b,
                     86: c               if its computation has been requested.  rsd is
                     87: c               also the orthogonal projection of y onto the
                     88: c               orthogonal complement of the column space of xk.
                     89: c
                     90: c        xb     real(n).
                     91: c               xb contains the least squares approximation xk*b,
                     92: c               if its computation has been requested.  xb is also
                     93: c               the orthogonal projection of y onto the column space
                     94: c               of x.
                     95: c
                     96: c        info   integer.
                     97: c               info is zero unless the computation of b has
                     98: c               been requested and r is exactly singular.  in
                     99: c               this case, info is the index of the first zero
                    100: c               diagonal element of r and b is left unaltered.
                    101: c
                    102: c     the parameters qy, qty, b, rsd, and xb are not referenced
                    103: c     if their computation is not requested and in this case
                    104: c     can be replaced by dummy variables in the calling program.
                    105: c     to save storage, the user may in some cases use the same
                    106: c     array for different parameters in the calling sequence.  a
                    107: c     frequently occuring example is when one wishes to compute
                    108: c     any of b, rsd, or xb and does not need y or qty.  in this
                    109: c     case one may identify y, qty, and one of b, rsd, or xb, while
                    110: c     providing separate arrays for anything else that is to be
                    111: c     computed.  thus the calling sequence
                    112: c
                    113: c          call sqrsl(x,ldx,n,k,qraux,y,dum,y,b,y,dum,110,info)
                    114: c
                    115: c     will result in the computation of b and rsd, with rsd
                    116: c     overwriting y.  more generally, each item in the following
                    117: c     list contains groups of permissible identifications for
                    118: c     a single callinng sequence.
                    119: c
                    120: c          1. (y,qty,b) (rsd) (xb) (qy)
                    121: c
                    122: c          2. (y,qty,rsd) (b) (xb) (qy)
                    123: c
                    124: c          3. (y,qty,xb) (b) (rsd) (qy)
                    125: c
                    126: c          4. (y,qy) (qty,b) (rsd) (xb)
                    127: c
                    128: c          5. (y,qy) (qty,rsd) (b) (xb)
                    129: c
                    130: c          6. (y,qy) (qty,xb) (b) (rsd)
                    131: c
                    132: c     in any group the value returned in the array allocated to
                    133: c     the group corresponds to the last member of the group.
                    134: c
                    135: c     linpack. this version dated 08/14/78 .
                    136: c     g.w. stewart, university of maryland, argonne national lab.
                    137: c
                    138: c     sqrsl uses the following functions and subprograms.
                    139: c
                    140: c     blas saxpy,scopy,sdot
                    141: c     fortran abs,min0,mod
                    142: c
                    143: c     internal variables
                    144: c
                    145:       integer i,j,jj,ju,kp1
                    146:       real sdot,t,temp
                    147:       logical cb,cqy,cqty,cr,cxb
                    148: c
                    149: c
                    150: c     set info flag.
                    151: c
                    152:       info = 0
                    153: c
                    154: c     determine what is to be computed.
                    155: c
                    156:       cqy = job/10000 .ne. 0
                    157:       cqty = mod(job,10000) .ne. 0
                    158:       cb = mod(job,1000)/100 .ne. 0
                    159:       cr = mod(job,100)/10 .ne. 0
                    160:       cxb = mod(job,10) .ne. 0
                    161:       ju = min0(k,n-1)
                    162: c
                    163: c     special action when n=1.
                    164: c
                    165:       if (ju .ne. 0) go to 40
                    166:          if (cqy) qy(1) = y(1)
                    167:          if (cqty) qty(1) = y(1)
                    168:          if (cxb) xb(1) = y(1)
                    169:          if (.not.cb) go to 30
                    170:             if (x(1,1) .ne. 0.0e0) go to 10
                    171:                info = 1
                    172:             go to 20
                    173:    10       continue
                    174:                b(1) = y(1)/x(1,1)
                    175:    20       continue
                    176:    30    continue
                    177:          if (cr) rsd(1) = 0.0e0
                    178:       go to 250
                    179:    40 continue
                    180: c
                    181: c        set up to compute qy or qty.
                    182: c
                    183:          if (cqy) call scopy(n,y,1,qy,1)
                    184:          if (cqty) call scopy(n,y,1,qty,1)
                    185:          if (.not.cqy) go to 70
                    186: c
                    187: c           compute qy.
                    188: c
                    189:             do 60 jj = 1, ju
                    190:                j = ju - jj + 1
                    191:                if (qraux(j) .eq. 0.0e0) go to 50
                    192:                   temp = x(j,j)
                    193:                   x(j,j) = qraux(j)
                    194:                   t = -sdot(n-j+1,x(j,j),1,qy(j),1)/x(j,j)
                    195:                   call saxpy(n-j+1,t,x(j,j),1,qy(j),1)
                    196:                   x(j,j) = temp
                    197:    50          continue
                    198:    60       continue
                    199:    70    continue
                    200:          if (.not.cqty) go to 100
                    201: c
                    202: c           compute trans(q)*y.
                    203: c
                    204:             do 90 j = 1, ju
                    205:                if (qraux(j) .eq. 0.0e0) go to 80
                    206:                   temp = x(j,j)
                    207:                   x(j,j) = qraux(j)
                    208:                   t = -sdot(n-j+1,x(j,j),1,qty(j),1)/x(j,j)
                    209:                   call saxpy(n-j+1,t,x(j,j),1,qty(j),1)
                    210:                   x(j,j) = temp
                    211:    80          continue
                    212:    90       continue
                    213:   100    continue
                    214: c
                    215: c        set up to compute b, rsd, or xb.
                    216: c
                    217:          if (cb) call scopy(k,qty,1,b,1)
                    218:          kp1 = k + 1
                    219:          if (cxb) call scopy(k,qty,1,xb,1)
                    220:          if (cr .and. k .lt. n) call scopy(n-k,qty(kp1),1,rsd(kp1),1)
                    221:          if (.not.cxb .or. kp1 .gt. n) go to 120
                    222:             do 110 i = kp1, n
                    223:                xb(i) = 0.0e0
                    224:   110       continue
                    225:   120    continue
                    226:          if (.not.cr) go to 140
                    227:             do 130 i = 1, k
                    228:                rsd(i) = 0.0e0
                    229:   130       continue
                    230:   140    continue
                    231:          if (.not.cb) go to 190
                    232: c
                    233: c           compute b.
                    234: c
                    235:             do 170 jj = 1, k
                    236:                j = k - jj + 1
                    237:                if (x(j,j) .ne. 0.0e0) go to 150
                    238:                   info = j
                    239: c           ......exit
                    240:                   go to 180
                    241:   150          continue
                    242:                b(j) = b(j)/x(j,j)
                    243:                if (j .eq. 1) go to 160
                    244:                   t = -b(j)
                    245:                   call saxpy(j-1,t,x(1,j),1,b,1)
                    246:   160          continue
                    247:   170       continue
                    248:   180       continue
                    249:   190    continue
                    250:          if (.not.cr .and. .not.cxb) go to 240
                    251: c
                    252: c           compute rsd or xb as required.
                    253: c
                    254:             do 230 jj = 1, ju
                    255:                j = ju - jj + 1
                    256:                if (qraux(j) .eq. 0.0e0) go to 220
                    257:                   temp = x(j,j)
                    258:                   x(j,j) = qraux(j)
                    259:                   if (.not.cr) go to 200
                    260:                      t = -sdot(n-j+1,x(j,j),1,rsd(j),1)/x(j,j)
                    261:                      call saxpy(n-j+1,t,x(j,j),1,rsd(j),1)
                    262:   200             continue
                    263:                   if (.not.cxb) go to 210
                    264:                      t = -sdot(n-j+1,x(j,j),1,xb(j),1)/x(j,j)
                    265:                      call saxpy(n-j+1,t,x(j,j),1,xb(j),1)
                    266:   210             continue
                    267:                   x(j,j) = temp
                    268:   220          continue
                    269:   230       continue
                    270:   240    continue
                    271:   250 continue
                    272:       return
                    273:       end

unix.superglobalmegacorp.com

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