aboutsummaryrefslogtreecommitdiff
path: root/math/deboor/shiftb.f
blob: 144c60f8aa684db0362cdb2c8d0b28a2e9d72f9f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
subroutine shiftb ( ai, ipivot, nrowi, ncoli, last,
     *			  ai1, nrowi1, ncoli1 )
c  shifts the rows in current block, ai, not used as pivot rows, if
c  any, i.e., rows ipivot(last+1),...,ipivot(nrowi), onto the first
c  mmax = nrow-last rows of the next block, ai1, with column last+j of
c  ai  going to column j , j=1,...,jmax=ncoli-last. the remaining col-
c  umns of these rows of ai1 are zeroed out.
c
c			      picture
c
c	original situation after	 results in a new block i+1
c	last = 2 columns have been	 created and ready to be
c	done in factrb (assuming no	 factored by next factrb call.
c	interchanges of rows)
c		    1
c	       x  x 1x	x  x	       x  x  x	x  x
c		    1
c	       0  x 1x	x  x	       0  x  x	x  x
c  block i	    1			    ---------------
c  nrowi = 4   0  0 1x	x  x	       0  0 1x	x  x  0  01
c  ncoli = 5	    1			    1		  1
c  last = 2    0  0 1x	x  x	       0  0 1x	x  x  0  01
c  -------------------------------	    1		  1   new
c		    1x	x  x  x  x	    1x	x  x  x  x1  block
c		    1			    1		  1   i+1
c  block i+1	    1x	x  x  x  x	    1x	x  x  x  x1
c  nrowi1= 5	    1			    1		  1
c  ncoli1= 5	    1x	x  x  x  x	    1x	x  x  x  x1
c  -------------------------------	    1-------------1
c		    1
c
      integer nrowi, ncoli, nrowi1, ncoli1
      integer ipivot(nrowi),last, ip,j,jmax,jmaxp1,m,mmax
      real ai(nrowi,ncoli),ai1(nrowi1,ncoli1)
      mmax = nrowi - last
      jmax = ncoli - last
      if (mmax .lt. 1 .or. jmax .lt. 1) return
c	       put the remainder of block i into ai1
      do 10 m=1,mmax
	 ip = ipivot(last+m)
	 do 10 j=1,jmax
   10	    ai1(m,j) = ai(ip,last+j)
      if (jmax .eq. ncoli1)		return
c	       zero out the upper right corner of ai1
      jmaxp1 = jmax + 1
      do 20 j=jmaxp1,ncoli1
	 do 20 m=1,mmax
   20	    ai1(m,j) = 0.
					return
      end