num_iter = 0 2000 continue do i= 1,n iwork(i,1) = 0 iwork(i,2) = 0 enddo border = block_ptr(nblocks+1) do i = border, n iwork(i,1) = 0 ii = col_perm(i) do jj = col_ptr(ii),col_ptr(ii+1)-1 j = abs(row_perm(iwork(row_ind(jj),8))) if (j.gt.iwork(i,1).and.j.lt.border) iwork(i,1) = j enddo k = i-1 do while (k.ge.border .and. iwork(k,1).lt.iwork(k+1,1)) temp = col_perm(k+1) col_perm(k+1) = col_perm(k) col_perm(k) = temp temp = iwork(k+1,1) iwork(k+1,1) = iwork(k,1) iwork(k,1) = temp k = k - 1 enddo enddo jj = 1 border = block_ptr(nblocks+1) do while (jj.le.n .and. border.le.n) j = col_perm(jj) do ii = col_ptr(j), col_ptr(j+1)-1 i = row_perm(iwork(row_ind(ii),8)) if (i.ge.block_ptr(nblocks+1) .and. i.le.n) then row_perm(iwork(row_ind(ii),8)) = -border iwork(border, 2) = jj border = border + 1 endif enddo jj = jj + 1 enddo border = block_ptr(nblocks+1) if (num_iter .ge. 1) goto 3000 num_new = 0 border = block_ptr(nblocks+1) point = 1 do i1 = 1, border-1 10 col = n get = .false. do while (.not. get .and. iwork(col,1).lt.i1 1 .and. col .ge.border) if (iwork(col,1).lt.0) goto 40 j = col_perm(col) ii = col_ptr(j) do while(ii .lt. col_ptr(j+1)) i = abs(row_perm(iwork(row_ind(ii),8))) if ( i.ge.border.and. i.le.n .and. 1 iwork(i,2).ge.i1-1.and.iwork(i,2).ne.0) then get = .true. row = i ii = col_ptr(j+1) endif ii = ii + 1 enddo if (get) goto 100 40 col = col -1 enddo 100 continue if(get) then iwork(row,2) = 0 iwork(col,1) = -1 iwork(point,3) = col_perm(col) iwork(row,4) = point point = point + 1 num_new = num_new+1 j0 = col_perm(col) do j1 = col_ptr(j0),col_ptr(j0+1)-1 j2 = abs(row_perm(iwork(row_ind(j1),8))) if (i1.le.iwork(j2,2).and.j2.ge.border 1 .and. j2.ne.row) 1 iwork(j2,2) = max(1,i1-1) enddo goto 10 else iwork(point,3) = col_perm(i1) iwork(i1,4) = point iwork(i1,2) = 0 point = point + 1 endif enddo new_border = point point = new_border nn = 0 do i = 1,n if (abs(row_perm(i)).ge.border .and. abs(row_perm(i)) 1 .le.n .and. iwork(abs(row_perm(i)),2).eq.0) then nn = nn+1 endif enddo point = 1 do i = 1,nblocks j = block_ptr(i) do while (iwork(point,3).ne.col_perm(j)) point= point + 1 enddo block_ptr(i) = point enddo block_ptr(nblocks+1) = new_border point = new_border do i = border,n if(iwork(i,1) .ge. 0) then iwork(point,3) = col_perm(i) point = point + 1 endif enddo if (point .ne. n+1) then iflag = 10 goto 1000 endif do i = 1, point-1 col_perm(i) = iwork(i,3) enddo point = new_border nn = 0 do i = 1,n if (abs(row_perm(i)).ge.border .and. abs(row_perm(i)) 1 .le.n .and. iwork(abs(row_perm(i)),2).ne.0) then iwork(abs(row_perm(i)),4) = point point = point + 1 elseif (abs(row_perm(i)).ge.border .and. abs(row_perm(i)) 1 .le.n .and. iwork(abs(row_perm(i)),2).eq.0) then nn = nn+1 endif enddo if (point .ne. n+1) then iflag = 11 goto 1000 endif do i = 1,n row_perm(i) = iwork(abs(row_perm(i)),4) enddo if (num_new .ne. 0 ) then num_iter = num_iter +1 goto 2000 endif 3000 point = 1 do col = 1,n iwork(col,1) = point j = col_perm(col) do i = col_ptr(j), col_ptr(j+1)-1 dwork(point) = value(i) new_row_ind(point) = abs(row_perm(iwork(row_ind(i),8))) point = point + 1 enddo enddo if (point-1 .eq.nz) then do i = 1, n col_ptr(i) = iwork(i,1) enddo do i = 1, nz row_ind(i) = new_row_ind(i) value(i) = dwork(i) enddo col_ptr(n+1) = nz+1 else iflag = 1 endif 1000 continue return end