#include "pdsp_defs.h"

void
pxgstrf_pruneL(
	       const int  jcol,      /* current column */
	       const int  *perm_r,   /* row pivotings */
	       const int  pivrow,    /* pivot row of column jcol */
	       const int  nseg,      /* number of U-segments */
	       const int  *segrep,   /* in */
	       const int  *repfnz,   /* in */
	       int        *xprune,   /* modified */
	       int        *ispruned, /* modified */
	       GlobalLU_t *Glu /* modified - global LU data structures */
	       )
{
/*
 * -- SuperLU MT routine (version 1.0) --
 * Univ. of California Berkeley, Xerox Palo Alto Research Center,
 * and Lawrence Berkeley National Lab.
 * August 15, 1997
 *
 * Purpose
 * =======
 *   Reduces the L-structure of those supernodes whose L-structure
 *   contains the current pivot row "pivrow".
 *
 */
    register int jsupno, irep, isupno, irep1, kmin, kmax, krow;
    register int i, ktemp;
    register int do_prune; /* logical variable */
    int        *xsup, *xsup_end, *supno;
    int        *lsub, *xlsub, *xlsub_end;

    xsup       = Glu->xsup;
    xsup_end   = Glu->xsup_end;
    supno      = Glu->supno;
    lsub       = Glu->lsub;
    xlsub      = Glu->xlsub;
    xlsub_end  = Glu->xlsub_end;
    
    /*
     * For each supernode-rep irep in U[*,j]
     */
    jsupno = supno[jcol];
    for (i = 0; i < nseg; i++) {

	irep = segrep[i];
	irep1 = irep + 1;

	/* Don't prune with a zero U-segment */
 	if ( repfnz[irep] == EMPTY ) continue;

     	/* If a supernode overlaps with the next panel, then the U-segment 
   	 * is fragmented into two parts - irep and irep1. We should let
	 * pruning occur at the rep-column in irep1's supernode. 
	 */
	isupno = supno[irep];
	if ( isupno == supno[irep1] ) continue;	/* Don't prune */

	/*
	 * If it is not pruned & it has a nonz in row L[pivrow,i]
	 */
	do_prune = FALSE;
	if ( isupno != jsupno ) {
	    if ( ! ispruned[irep] ) {
		kmin = SINGLETON( isupno ) ? xlsub_end[irep] : xlsub[irep];
		kmax = xprune[irep] - 1;
		for (krow = kmin; krow <= kmax; krow++) 
		    if ( lsub[krow] == pivrow ) {
			do_prune = TRUE;
			break;
		    }
	    }
	    
    	    if ( do_prune ) {

	     	/* Do a quicksort-type partition */
	        while ( kmin <= kmax ) {
	    	    if ( perm_r[lsub[kmax]] == EMPTY ) 
			kmax--;
		    else if ( perm_r[lsub[kmin]] != EMPTY )
			kmin++;
		    else { /* kmin below pivrow, and kmax above pivrow: 
		            * 	interchange the two subscripts
			    */
		        ktemp = lsub[kmin];
		        lsub[kmin] = lsub[kmax];
		        lsub[kmax] = ktemp;
		        kmin++;
		        kmax--;
		    }
	        } /* while */

	        xprune[irep] = kmin;	/* Pruning */
		ispruned[irep] = 1;

#ifdef CHK_PRUNE
if (irep >= LOCOL && irep >= HICOL && jcol >= LOCOL && jcol <= HICOL)	
    printf("pxgstrf_pruneL() for irep %d using col %d: xprune %d - %d\n", 
	   irep, jcol, xlsub[irep], kmin);
#endif
	    } /* if do_prune */

	} /* if */

    } /* for each U-segment... */
}
