/* ---------------------------------------------------------------------
*
*  -- PBLAS auxiliary routine (version 2.0) --
*     University of Tennessee, Knoxville, Oak Ridge National Laboratory,
*     and University of California, Berkeley.
*     April 1, 1998
*
*  ---------------------------------------------------------------------
*/
/*
*  Include files
*/
#include "../pblas.h"
#include "../PBpblas.h"
#include "../PBtools.h"
#include "../PBblacs.h"
#include "../PBblas.h"

#ifdef __STDC__
Int PB_Clastnb( Int N, Int I, Int INB, Int NB )
#else
Int PB_Clastnb( N, I, INB, NB )
/*
*  .. Scalar Arguments ..
*/
   Int            I, INB, N, NB;
#endif
{
/*
*  Purpose
*  =======
*
*  PB_Clastnb  returns  the global number of matrix rows or columns of the
*  last block, if N rows or columns are given out starting from the glo-
*  bal index I. Note that if N is equal 0, this routine returns 0.
*
*  Arguments
*  =========
*
*  N       (global input) INTEGER
*          On entry, N  specifies the number of rows/columns being dealt
*          out. N must be at least zero.
*
*  I       (global input) INTEGER
*          On entry, I  specifies the global index of the matrix  entry.
*          I must be at least zero.
*
*  INB     (global input) INTEGER
*          On entry,  INB  specifies  the size of the first block of the
*          global matrix distribution. INB must be at least one.
*
*  NB      (global input) INTEGER
*          On entry, NB specifies the size of the blocks used to  parti-
*          tion the matrix. NB must be at least one.
*
*  -- Written on April 1, 1998 by
*     Antoine Petitet, University of Tennessee, Knoxville 37996, USA.
*
*  ---------------------------------------------------------------------
*/
/*
*  .. Local Scalars ..
*/
   Int            lnbt;
/* ..
*  .. Executable Statements ..
*
*/
   if( ( lnbt = I + N - INB ) > 0 )
   {
      lnbt = lnbt - NB * ( ( NB + lnbt - 1 ) / NB - 1 );
      return( MIN( lnbt, N ) );
   }
   else
   {
      return( N );
   }
/*
*  End of PB_Clastnb
*/
}
