/*  makeStaircase.c  */

#include "../A2.h"

/*--------------------------------------------------------------------*/
/*
   -----------------------------------------------------------------
   purpose -- to permute the rows so the matrix is in staircase form

   created -- 98may25, cca
   -----------------------------------------------------------------
*/
void
A2_makeStaircase (
   A2   *mtxA
) {
double   imag, real, value ;
int      irow, jcol, ncol, nrow ;
int      *firstnonzero ;
/*
   --------------
   check the data
   --------------
*/
if ( mtxA == NULL ) {
   fprintf(stderr, "\n fatal error in A2_staircase(%p)"
           "\n bad input\n", mtxA) ;
   exit(-1) ;
}
nrow = A2_nrow(mtxA) ;
ncol = A2_ncol(mtxA) ;
/*
   ---------------------------------------------
   fill firstnonzero[irow] with the first column 
   that contains a nonzero entry in this row.
   ---------------------------------------------
*/
firstnonzero = IVinit(nrow, -1) ;
for ( irow = 0 ; irow < nrow ; irow++ ) {
   for ( jcol = 0 ; jcol < ncol ; jcol++ ) {
      if ( A2_IS_REAL(mtxA) ) {
         A2_realEntry(mtxA, irow, jcol, &value) ;
         if ( value != 0.0 ) {
            break ;
         }
      } else if ( A2_IS_COMPLEX(mtxA) ) {
         A2_complexEntry(mtxA, irow, jcol, &real, &imag) ;
         if ( real != 0.0 || imag != 0.0 ) {
            break ;
         }
      }
   }
   firstnonzero[irow] = jcol ;
}
/*
   ---------------------------------------------------
   sort the rows in the order of their leading nonzero
   ---------------------------------------------------
*/
A2_sortRowsUp(mtxA, nrow, firstnonzero) ;
/*
   ------------------------
   free the working storage
   ------------------------
*/
IVfree(firstnonzero) ;

return ; }

/*--------------------------------------------------------------------*/


syntax highlighted by Code2HTML, v. 0.9.1