Annotation of researchv10no/cmd/view2d/num/sqrdc.f, revision 1.1

1.1     ! root        1:       subroutine sqrdc(x,ldx,n,p,qraux,jpvt,work,job)
        !             2:       integer ldx,n,p,job
        !             3:       integer jpvt(1)
        !             4:       real x(ldx,1),qraux(1),work(1)
        !             5: c
        !             6: c     sqrdc uses householder transformations to compute the qr
        !             7: c     factorization of an n by p matrix x.  column pivoting
        !             8: c     based on the 2-norms of the reduced columns may be
        !             9: c     performed at the users option.
        !            10: c
        !            11: c     on entry
        !            12: c
        !            13: c        x       real(ldx,p), where ldx .ge. n.
        !            14: c                x contains the matrix whose decomposition is to be
        !            15: c                computed.
        !            16: c
        !            17: c        ldx     integer.
        !            18: c                ldx is the leading dimension of the array x.
        !            19: c
        !            20: c        n       integer.
        !            21: c                n is the number of rows of the matrix x.
        !            22: c
        !            23: c        p       integer.
        !            24: c                p is the number of columns of the matrix x.
        !            25: c
        !            26: c        jpvt    integer(p).
        !            27: c                jpvt contains integers that control the selection
        !            28: c                of the pivot columns.  the k-th column x(k) of x
        !            29: c                is placed in one of three classes according to the
        !            30: c                value of jpvt(k).
        !            31: c
        !            32: c                   if jpvt(k) .gt. 0, then x(k) is an initial
        !            33: c                                      column.
        !            34: c
        !            35: c                   if jpvt(k) .eq. 0, then x(k) is a free column.
        !            36: c
        !            37: c                   if jpvt(k) .lt. 0, then x(k) is a final column.
        !            38: c
        !            39: c                before the decomposition is computed, initial columns
        !            40: c                are moved to the beginning of the array x and final
        !            41: c                columns to the end.  both initial and final columns
        !            42: c                are frozen in place during the computation and only
        !            43: c                free columns are moved.  at the k-th stage of the
        !            44: c                reduction, if x(k) is occupied by a free column
        !            45: c                it is interchanged with the free column of largest
        !            46: c                reduced norm.  jpvt is not referenced if
        !            47: c                job .eq. 0.
        !            48: c
        !            49: c        work    real(p).
        !            50: c                work is a work array.  work is not referenced if
        !            51: c                job .eq. 0.
        !            52: c
        !            53: c        job     integer.
        !            54: c                job is an integer that initiates column pivoting.
        !            55: c                if job .eq. 0, no pivoting is done.
        !            56: c                if job .ne. 0, pivoting is done.
        !            57: c
        !            58: c     on return
        !            59: c
        !            60: c        x       x contains in its upper triangle the upper
        !            61: c                triangular matrix r of the qr factorization.
        !            62: c                below its diagonal x contains information from
        !            63: c                which the orthogonal part of the decomposition
        !            64: c                can be recovered.  note that if pivoting has
        !            65: c                been requested, the decomposition is not that
        !            66: c                of the original matrix x but that of x
        !            67: c                with its columns permuted as described by jpvt.
        !            68: c
        !            69: c        qraux   real(p).
        !            70: c                qraux contains further information required to recover
        !            71: c                the orthogonal part of the decomposition.
        !            72: c
        !            73: c        jpvt    jpvt(k) contains the index of the column of the
        !            74: c                original matrix that has been interchanged into
        !            75: c                the k-th column, if pivoting was requested.
        !            76: c
        !            77: c     linpack. this version dated 08/14/78 .
        !            78: c     g.w. stewart, university of maryland, argonne national lab.
        !            79: c
        !            80: c     sqrdc uses the following functions and subprograms.
        !            81: c
        !            82: c     blas saxpy,sdot,sscal,sswap,snrm2
        !            83: c     fortran abs,amax1,min0,sqrt
        !            84: c
        !            85: c     internal variables
        !            86: c
        !            87:       integer j,jp,l,lp1,lup,maxj,pl,pu
        !            88:       real maxnrm,snrm2,tt
        !            89:       real sdot,nrmxl,t
        !            90:       logical negj,swapj
        !            91: c
        !            92: c
        !            93:       pl = 1
        !            94:       pu = 0
        !            95:       if (job .eq. 0) go to 60
        !            96: c
        !            97: c        pivoting has been requested.  rearrange the columns
        !            98: c        according to jpvt.
        !            99: c
        !           100:          do 20 j = 1, p
        !           101:             swapj = jpvt(j) .gt. 0
        !           102:             negj = jpvt(j) .lt. 0
        !           103:             jpvt(j) = j
        !           104:             if (negj) jpvt(j) = -j
        !           105:             if (.not.swapj) go to 10
        !           106:                if (j .ne. pl) call sswap(n,x(1,pl),1,x(1,j),1)
        !           107:                jpvt(j) = jpvt(pl)
        !           108:                jpvt(pl) = j
        !           109:                pl = pl + 1
        !           110:    10       continue
        !           111:    20    continue
        !           112:          pu = p
        !           113:          do 50 jj = 1, p
        !           114:             j = p - jj + 1
        !           115:             if (jpvt(j) .ge. 0) go to 40
        !           116:                jpvt(j) = -jpvt(j)
        !           117:                if (j .eq. pu) go to 30
        !           118:                   call sswap(n,x(1,pu),1,x(1,j),1)
        !           119:                   jp = jpvt(pu)
        !           120:                   jpvt(pu) = jpvt(j)
        !           121:                   jpvt(j) = jp
        !           122:    30          continue
        !           123:                pu = pu - 1
        !           124:    40       continue
        !           125:    50    continue
        !           126:    60 continue
        !           127: c
        !           128: c     compute the norms of the free columns.
        !           129: c
        !           130:       if (pu .lt. pl) go to 80
        !           131:       do 70 j = pl, pu
        !           132:          qraux(j) = snrm2(n,x(1,j),1)
        !           133:          work(j) = qraux(j)
        !           134:    70 continue
        !           135:    80 continue
        !           136: c
        !           137: c     perform the householder reduction of x.
        !           138: c
        !           139:       lup = min0(n,p)
        !           140:       do 200 l = 1, lup
        !           141:          if (l .lt. pl .or. l .ge. pu) go to 120
        !           142: c
        !           143: c           locate the column of largest norm and bring it
        !           144: c           into the pivot position.
        !           145: c
        !           146:             maxnrm = 0.0e0
        !           147:             maxj = l
        !           148:             do 100 j = l, pu
        !           149:                if (qraux(j) .le. maxnrm) go to 90
        !           150:                   maxnrm = qraux(j)
        !           151:                   maxj = j
        !           152:    90          continue
        !           153:   100       continue
        !           154:             if (maxj .eq. l) go to 110
        !           155:                call sswap(n,x(1,l),1,x(1,maxj),1)
        !           156:                qraux(maxj) = qraux(l)
        !           157:                work(maxj) = work(l)
        !           158:                jp = jpvt(maxj)
        !           159:                jpvt(maxj) = jpvt(l)
        !           160:                jpvt(l) = jp
        !           161:   110       continue
        !           162:   120    continue
        !           163:          qraux(l) = 0.0e0
        !           164:          if (l .eq. n) go to 190
        !           165: c
        !           166: c           compute the householder transformation for column l.
        !           167: c
        !           168:             nrmxl = snrm2(n-l+1,x(l,l),1)
        !           169:             if (nrmxl .eq. 0.0e0) go to 180
        !           170:                if (x(l,l) .ne. 0.0e0) nrmxl = sign(nrmxl,x(l,l))
        !           171:                call sscal(n-l+1,1.0e0/nrmxl,x(l,l),1)
        !           172:                x(l,l) = 1.0e0 + x(l,l)
        !           173: c
        !           174: c              apply the transformation to the remaining columns,
        !           175: c              updating the norms.
        !           176: c
        !           177:                lp1 = l + 1
        !           178:                if (p .lt. lp1) go to 170
        !           179:                do 160 j = lp1, p
        !           180:                   t = -sdot(n-l+1,x(l,l),1,x(l,j),1)/x(l,l)
        !           181:                   call saxpy(n-l+1,t,x(l,l),1,x(l,j),1)
        !           182:                   if (j .lt. pl .or. j .gt. pu) go to 150
        !           183:                   if (qraux(j) .eq. 0.0e0) go to 150
        !           184:                      tt = 1.0e0 - (abs(x(l,j))/qraux(j))**2
        !           185:                      tt = amax1(tt,0.0e0)
        !           186:                      t = tt
        !           187:                      tt = 1.0e0 + 0.05e0*tt*(qraux(j)/work(j))**2
        !           188:                      if (tt .eq. 1.0e0) go to 130
        !           189:                         qraux(j) = qraux(j)*sqrt(t)
        !           190:                      go to 140
        !           191:   130                continue
        !           192:                         qraux(j) = snrm2(n-l,x(l+1,j),1)
        !           193:                         work(j) = qraux(j)
        !           194:   140                continue
        !           195:   150             continue
        !           196:   160          continue
        !           197:   170          continue
        !           198: c
        !           199: c              save the transformation.
        !           200: c
        !           201:                qraux(l) = x(l,l)
        !           202:                x(l,l) = -nrmxl
        !           203:   180       continue
        !           204:   190    continue
        !           205:   200 continue
        !           206:       return
        !           207:       end

unix.superglobalmegacorp.com

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