/* ---------------------------------------------------------------------
*
*  -- PBLAS routine (version 2.0) --
*     University of Tennessee, Knoxville, Oak Ridge National Laboratory,
*     and University of California, Berkeley.
*     March 12, 2002 
*
*  ---------------------------------------------------------------------
*/
/*
*  This file includes PBLAS tools definitions. All PBLAS routines include
*  this file.
*
* ----------------------------------------------------------------------
*  #define macro constants
*  ---------------------------------------------------------------------
*
*  Descriptor entries for type 1
*/
#define    BLOCK_CYCLIC_2D     1

#define    DTYPE1_             0                   /* Descriptor Type */
#define    CTXT1_              1                     /* BLACS context */
#define    M1_                 2             /* Global Number of Rows */
#define    N1_                 3          /* Global Number of Columns */
#define    MB1_                4                 /* Row Blocking Size */
#define    NB1_                5              /* Column Blocking Size */
#define    RSRC1_              6            /* Starting Processor Row */
#define    CSRC1_              7         /* Starting Processor Column */
#define    LLD1_               8           /* Local Leading Dimension */
#define    DLEN1_              9                 /* Descriptor Length */
/*
*  Descriptor entries for type 2
*/
#define    BLOCK_CYCLIC_2D_INB 2

#define    DTYPE_              0                   /* Descriptor Type */
#define    CTXT_               1                     /* BLACS context */
#define    M_                  2             /* Global Number of Rows */
#define    N_                  3          /* Global Number of Columns */
#define    IMB_                4         /* Initial Row Blocking Size */
#define    INB_                5      /* Initial Column Blocking Size */
#define    MB_                 6                 /* Row Blocking Size */
#define    NB_                 7              /* Column Blocking Size */
#define    RSRC_               8              /* Starting Process Row */
#define    CSRC_               9           /* Starting Process Column */
#define    LLD_                10          /* Local Leading Dimension */
#define    DLEN_               11                /* Descriptor Length */

#define    CPACKING            'P'
#define    CUNPACKING          'U'

#define    PACKING             "P"
#define    UNPACKING           "U"

#define    CGENERAL            'G'
/* #define    CSYMM               'S'  */
#define    CHERM               'H'

#define    GENERAL             "G"
#define    SYMM                "S"
#define    HERM                "H"

#define    ONE                 1.0
#define    TWO                 2.0
#define    ZERO                0.0
                            /* Input error checking related constants */
#define    DESCMULT            100
#define    BIGNUM              10000
/*
*  ---------------------------------------------------------------------
*  #define macro functions
*  ---------------------------------------------------------------------
*/
#define    ABS( a_ )           ( ( (a_) <   0  ) ? -(a_) : (a_) )
#define    MIN( a_, b_ )       ( ( (a_) < (b_) ) ?  (a_) : (b_) )
#define    MAX( a_, b_ )       ( ( (a_) > (b_) ) ?  (a_) : (b_) )

#define    FLOOR(a,b) (((a)>0) ? (((a)/(b))) : (-(((-(a))+(b)-1)/(b))))
#define    CEIL(a,b)           ( ( (a)+(b)-1 ) / (b) )
#define    ICEIL(a,b) (((a)>0) ? ((((a)+(b)-1)/(b))) : (-((-(a))/(b))))

#define    Mupcase(C)          (((C)>96 && (C)<123) ? (C) & 0xDF : (C))
#define    Mlowcase(C)         (((C)>64 && (C)< 91) ? (C) | 32   : (C))
/*
*  The following macros perform common modulo operations;  All functions
*  except MPosMod assume arguments are < d (i.e., arguments are themsel-
*  ves within modulo range).
*/
                                                /* increment with mod */
#define    MModInc(I, d)       if(++(I) == (d)) (I) = 0
                                                /* decrement with mod */
#define    MModDec(I, d)       if(--(I) == -1) (I) = (d)-1
                                                   /* positive modulo */
#define    MPosMod(I, d)       ( (I) - ((I)/(d))*(d) )
                                                   /* add two numbers */
#define    MModAdd(I1, I2, d) \
           ( ( (I1) + (I2) < (d) ) ? (I1) + (I2) : (I1) + (I2) - (d) )
                                                        /* add 1 to # */
#define    MModAdd1(I, d) ( ((I) != (d)-1) ? (I) + 1 : 0 )
                                              /* subtract two numbers */
#define    MModSub(I1, I2, d) \
           ( ( (I1) < (I2) ) ? (d) + (I1) - (I2) : (I1) - (I2) )
                                                      /* sub 1 from # */
#define    MModSub1(I, d) ( ((I)!=0) ? (I)-1 : (d)-1 )
/*
*  DNROC computes maximum number of local rows or columns. This macro is
*  only used to compute the time estimates in the Level 3 PBLAS routines.
*/
#define    DNROC( n_, nb_, p_ ) \
           ((double)(((((n_)+(nb_)-1)/(nb_))+(p_)-1)/(p_))*(double)((nb_)))

/*
*  Mptr returns a pointer to a_( i_, j_ ) for readability reasons and
*  also less silly errors ...
*/
#define    Mptr( a_, i_, j_, lda_, siz_ ) \
              ( (a_) + ( ( (i_)+(j_)*(lda_) )*(siz_) ) )
/*
*  Mfirstnb and Mlastnb compute the global size of the first and last
*  block corresponding to the interval i_:i_+n_-1 of global indexes.
*/
#define    Mfirstnb( inbt_, n_, i_, inb_, nb_ ) \
              inbt_ = (inb_) - (i_); \
              if( inbt_ <= 0 ) \
                 inbt_ = ( (-inbt_) / (nb_) + 1 ) * (nb_) + inbt_; \
              inbt_ = MIN( inbt_, (n_) );

#define    Mlastnb( inbt_, n_, i_, inb_, nb_ ) \
              inbt_ = (i_) + (n_) - (inb_); \
              if( inbt_ > 0 ) \
              { \
                 inbt_ = -( ( (nb_)+inbt_-1 )/(nb_)-1 )*(nb_) + inbt_; \
                 inbt_ = MIN( inbt_, (n_) ); \
              } \
              else { inbt_ = (n_); };
/*
*  Does the index interval i_:i_+n_-1 spans more than one process rows
*  or columns ?
*
*  Mspan returns 0 (false) when the data is replicated (srcproc_ < 0) or
*  when there is only one process row or column in the process grid.
*/
#define    Mspan( n_, i_, inb_, nb_, srcproc_, nprocs_ ) \
              ( ( (srcproc_) >= 0 ) && ( ( (nprocs_) > 1 ) && \
              ( ( (i_) < (inb_) ) ? \
                ( (i_) + (n_) > (inb_) ) : \
                ( (i_) + (n_) > (inb_) + \
                  ( ( (i_) - (inb_) ) / (nb_) + 1 ) * (nb_) ) ) ) )
/*
*  Mindxl2g computes the global index ig_ corresponding to the local
*  index il_ in process proc_.
*/
#define    Mindxl2g( ig_, il_, inb_, nb_, proc_, srcproc_, nprocs_ ) \
           { \
              if( ( (srcproc_) >= 0 ) && ( (nprocs_) > 1 ) ) \
              { \
                 if( (proc_) == (srcproc_) ) \
                 { \
                    if( (il_) < (inb_) ) ig_ = (il_); \
                    else                 ig_ = (il_) + \
                       (nb_)*((nprocs_)-1)*( ((il_)-(inb_)) / (nb_) + 1 ); \
                 } \
                 else if( (proc_) < (srcproc_) ) \
                 { \
                    ig_ = (il_) + (inb_) + \
                          (nb_)*(  ((nprocs_)-1)*((il_)/(nb_)) + \
                                   (proc_)-(srcproc_)-1+(nprocs_) ); \
                 } \
                 else \
                 { \
                    ig_ =  (il_) + (inb_) + \
                           (nb_)*( ((nprocs_)-1)*((il_)/(nb_)) + \
                           (proc_)-(srcproc_)-1 ); \
                 } \
              } \
              else \
              { \
                 ig_ = (il_); \
              } \
           }
/*
*  Mindxg2p returns the process coodinate owning the entry globally
*  indexed by ig_.
*/
#define    Mindxg2p( ig_, inb_, nb_, proc_, srcproc_, nprocs_ ) \
           { \
              if( ( (ig_) >= (inb_) ) && ( (srcproc_) >= 0 ) && \
                  ( (nprocs_) > 1 ) ) \
              { \
                 proc_  = (srcproc_) + 1 + ( (ig_)-(inb_) ) / (nb_); \
                 proc_ -= ( proc_ / (nprocs_) ) * (nprocs_); \
              } \
              else \
              { \
                 proc_ = (srcproc_); \
              } \
           }
/*
*  Mnumroc computes the # of local indexes np_ residing in the process
*  of coordinate proc_ corresponding to the interval of global indexes
*  i_:i_+n_-1 assuming that the global index 0 resides in  the process
*  srcproc_, and that the indexes are distributed from  srcproc_ using
*  the parameters inb_, nb_ and nprocs_.
*/
#define    Mnumroc( np_, n_, i_, inb_, nb_, proc_, srcproc_, nprocs_ ) \
           { \
              if( ( (srcproc_) >= 0 ) && ( (nprocs_) > 1 ) ) \
              { \
                 int inb__, mydist__, n__, nblk__, quot__, src__; \
                 if( ( inb__ = (inb_) - (i_) ) <= 0 ) \
                 { \
                    src__  = (srcproc_) + ( nblk__ = (-inb__) / (nb_) + 1 ); \
                    src__ -= ( src__ / (nprocs_) ) * (nprocs_); \
                    inb__ += nblk__*(nb_); \
                    if( ( n__ = (n_) - inb__ ) <= 0 ) \
                    { if( (proc_) == src__ ) np_ = (n_); else np_ = 0; } \
                    else \
                    { \
                       if( ( mydist__ = (proc_) - src__ ) < 0 ) \
                          mydist__ += (nprocs_); \
                       nblk__    = n__ / (nb_) + 1; \
                       mydist__ -= nblk__ - \
                          ( quot__ = ( nblk__ / (nprocs_) ) ) * (nprocs_); \
                       if( mydist__ < 0 ) \
                       { \
                          if( (proc_) != src__ ) \
                             np_ = (nb_) + (nb_) * quot__; \
                          else \
                             np_ = inb__ + (nb_) * quot__; \
                       } \
                       else if( mydist__ > 0 ) \
                       { \
                          np_ = (nb_) * quot__; \
                       } \
                       else \
                       { \
                          if( (proc_) != src__ ) \
                             np_ = n__ + (nb_) + (nb_) * ( quot__ - nblk__ ); \
                          else \
                             np_ = (n_) +        (nb_) * ( quot__ - nblk__ ); \
                       } \
                    } \
                 } \
                 else \
                 { \
                    if( ( n__ = (n_) - inb__ ) <= 0 ) \
                    { if( (proc_) == (srcproc_) ) np_ = (n_); else np_ = 0; } \
                    else \
                    { \
                       if( ( mydist__ = (proc_) - (srcproc_) ) < 0 ) \
                          mydist__ += (nprocs_); \
                       nblk__    = n__ / (nb_) + 1; \
                       mydist__ -= nblk__ - \
                          ( quot__ = ( nblk__ / (nprocs_) ) ) * (nprocs_); \
                       if( mydist__ < 0 ) \
                       { \
                          if( (proc_) != (srcproc_) ) \
                             np_ = (nb_) + (nb_) * quot__; \
                          else \
                             np_ = inb__ + (nb_) * quot__; \
                       } \
                       else if( mydist__ > 0 ) \
                       { \
                          np_ = (nb_) * quot__; \
                       } \
                       else \
                       { \
                          if( (proc_) != (srcproc_) ) \
                             np_ = n__ + (nb_) + (nb_) * ( quot__ - nblk__ ); \
                          else \
                             np_ = (n_) +        (nb_) * ( quot__ - nblk__ ); \
                       } \
                    } \
                 } \
              } \
              else \
              { \
                 np_ = (n_); \
              } \
           }

#define    Mnpreroc( np_, n_, i_, inb_, nb_, proc_, srcproc_, nprocs_ ) \
           { \
              if( ( (srcproc_) >= 0 ) && ( (nprocs_) > 1 ) ) \
              { \
                 int inb__, mydist__, n__, nblk__, quot__, rem__, src__; \
                 if( ( inb__ = (inb_) - (i_) ) <= 0 ) \
                 { \
                    src__  = (srcproc_) + ( nblk__ = (-inb__) / (nb_) + 1 ); \
                    src__ -= ( src__ / (nprocs_) ) * (nprocs_); \
                    if( (proc_) != src__ ) \
                    { \
                       inb__ += nblk__*(nb_); \
                       if( ( n__ = (n_) - inb__ ) <= 0 ) { np_ = (n_); } \
                       else \
                       { \
                          if( ( mydist__ = (proc_) - src__ ) < 0 ) \
                             mydist__ += (nprocs_); \
                          nblk__ = n__ / (nb_) + 1; \
                          rem__  = nblk__ - \
                             ( quot__ = ( nblk__ / (nprocs_) ) ) * (nprocs_); \
                          if( mydist__ <= rem__ ) \
                          { \
                             np_ = inb__ - (nb_) + \
                                   ( quot__ + 1 ) * mydist__ * (nb_); \
                          } \
                          else \
                          { \
                             np_ = (n_) + \
                                   ( mydist__ - (nprocs_) ) * quot__ * (nb_); \
                          } \
                       } \
                    } \
                    else \
                    { \
                       np_ = 0; \
                    } \
                 } \
                 else \
                 { \
                    if( (proc_) != (srcproc_) ) \
                    { \
                       if( ( n__ = (n_) - inb__ ) <= 0 ) { np_ = (n_); } \
                       else \
                       { \
                          if( ( mydist__ = (proc_) - (srcproc_) ) < 0 ) \
                             mydist__ += (nprocs_); \
                          nblk__ = n__ / (nb_) + 1; \
                          rem__  = nblk__ - \
                             ( quot__ = ( nblk__ / (nprocs_) ) ) * (nprocs_); \
                          if( mydist__ <= rem__ ) \
                          { \
                             np_ = inb__ - (nb_) + \
                                   ( quot__ + 1 ) * mydist__ * (nb_); \
                          } \
                          else \
                          { \
                             np_ = (n_) + \
                                   ( mydist__ - (nprocs_) ) * quot__ * (nb_); \
                          } \
                       } \
                    } \
                    else \
                    { \
                       np_ = 0; \
                    } \
                 } \
              } \
              else \
              { \
                 np_ = 0; \
              } \
           }

#define    Mnnxtroc( np_, n_, i_, inb_, nb_, proc_, srcproc_, nprocs_ ) \
           { \
              if( ( (srcproc_) >= 0 ) && ( (nprocs_) > 1 ) ) \
              { \
                 int inb__, mydist__, n__, nblk__, quot__, rem__, src__; \
                 if( ( inb__ = (inb_) - (i_) ) <= 0 ) \
                 { \
                    src__  = (srcproc_) + ( nblk__ = (-inb__) / (nb_) + 1 ); \
                    src__ -= ( src__ / (nprocs_) ) * (nprocs_); \
                    inb__ += nblk__*(nb_); \
                    if( ( n__ = (n_) - inb__ ) <= 0 ) { np_ = 0; } \
                    else \
                    { \
                       if( ( mydist__ = (proc_) - src__ ) < 0 ) \
                          mydist__ += (nprocs_); \
                       nblk__ = n__ / (nb_) + 1; \
                       rem__  = nblk__ - \
                             ( quot__ = ( nblk__ / (nprocs_) ) ) * (nprocs_); \
                       if( mydist__ < rem__ ) \
                       { \
                          np_ = n__ - ( quot__ * mydist__ + \
                                        quot__ + mydist__ ) * (nb_); \
                       } \
                       else \
                       { \
                          np_ = ( (nprocs_) - 1 - mydist__ ) * quot__ * (nb_); \
                       } \
                    } \
                 } \
                 else \
                 { \
                    if( ( n__ = (n_) - inb__ ) <= 0 ) { np_ = 0; } \
                    else \
                    { \
                       if( ( mydist__ = (proc_) - (srcproc_) ) < 0 ) \
                          mydist__ += (nprocs_); \
                       nblk__ = n__ / (nb_) + 1; \
                       rem__  = nblk__ - \
                             ( quot__ = ( nblk__ / (nprocs_) ) ) * (nprocs_); \
                       if( mydist__ < rem__ ) \
                       { \
                          np_ = n__ - ( quot__ * mydist__ + \
                                        quot__ + mydist__ ) * (nb_); \
                       } \
                       else \
                       { \
                          np_ = ( (nprocs_) - 1 - mydist__ ) * quot__ * (nb_); \
                       } \
                    } \
                 } \
              } \
              else \
              { np_ = 0; } \
           }


#define    Minfog2l( i_, j_, desc_, nr_, nc_, r_, c_, ii_, jj_, pr_, pc_ ) \
           { \
              int quot__, i__, imb__, inb__, j__, mb__, mydist__, \
                  nb__, nblk__, src__; \
              imb__ = desc_[IMB_]; mb__ = desc_[MB_]; pr_ = desc_[RSRC_]; \
              if( ( pr_ >= 0 ) && ( nr_ > 1 ) ) \
              { \
                 if( ( i__ = (i_) - imb__ ) < 0 ) \
                 { ii_ = ( r_ == pr_ ? (i_) : 0 ); } \
                 else \
                 { \
                    src__     = pr_; \
                    pr_      += ( nblk__ = i__ / mb__ + 1 ); \
                    pr_      -= ( pr_ / nr_ ) * nr_; \
                    if( ( mydist__ = r_ - src__ ) < 0 ) mydist__ += nr_; \
                    if( mydist__ >= nblk__ - ( quot__ = nblk__ / nr_ ) * nr_ ) \
                    { \
                       if( r_ != src__ ) ii_ =  mb__; \
                       else              ii_ = imb__; \
                       if( r_ != pr_ ) \
                          ii_ += ( quot__ - 1 ) * mb__; \
                       else \
                          ii_ += i__ + ( quot__ - nblk__ ) * mb__; \
                    } \
                    else \
                    { \
                       if( r_ != src__ ) ii_ =  mb__ + quot__ * mb__; \
                       else              ii_ = imb__ + quot__ * mb__; \
                    } \
                 } \
              } \
              else \
              { \
                 ii_ = (i_); \
              } \
              inb__ = desc_[INB_]; nb__ = desc_[NB_]; pc_ = desc_[CSRC_]; \
              if( ( pc_ >= 0 ) && ( nc_ > 1 ) ) \
              { \
                 if( ( j__ = (j_) - inb__ ) < 0 ) \
                 { jj_ = ( c_ == pc_ ? (j_) : 0 ); } \
                 else \
                 { \
                    src__     = pc_; \
                    pc_      += ( nblk__ = j__ / nb__ + 1 ); \
                    pc_      -= ( pc_ / nc_ ) * nc_; \
                    if( ( mydist__ = c_ - src__ ) < 0 ) mydist__ += nc_; \
                    if( mydist__ >= nblk__ - ( quot__ = nblk__ / nc_ ) * nc_ ) \
                    { \
                       if( c_ != src__ ) jj_ =  nb__; \
                       else              jj_ = inb__; \
                       if( c_ != pc_ ) \
                          jj_ += ( quot__ - 1 ) * nb__; \
                       else \
                          jj_ += j__ + ( quot__ - nblk__ ) * nb__; \
                    } \
                    else \
                    { \
                       if( c_ != src__ ) jj_ =  nb__ + quot__ * nb__; \
                       else              jj_ = inb__ + quot__ * nb__; \
                    } \
                 } \
              } \
              else \
              { \
                 jj_ = (j_); \
              } \
           }

/*
*  The following macros initialize or translate descriptors.
*/
#define    MDescSet( desc, m, n, imb, inb, mb, nb, rsrc, csrc, ictxt, lld ) \
           { \
              (desc)[DTYPE_] = BLOCK_CYCLIC_2D_INB; \
              (desc)[CTXT_ ] = (ictxt); \
              (desc)[M_    ] = (m);     \
              (desc)[N_    ] = (n);     \
              (desc)[IMB_  ] = (imb);   \
              (desc)[INB_  ] = (inb);   \
              (desc)[MB_   ] = (mb);    \
              (desc)[NB_   ] = (nb);    \
              (desc)[RSRC_ ] = (rsrc);  \
              (desc)[CSRC_ ] = (csrc);  \
              (desc)[LLD_  ] = (lld);   \
           }

#define    MDescCopy(DescIn, DescOut) \
           { \
              (DescOut)[DTYPE_] = (DescIn)[DTYPE_];    \
              (DescOut)[M_    ] = (DescIn)[M_    ];    \
              (DescOut)[N_    ] = (DescIn)[N_    ];    \
              (DescOut)[IMB_  ] = (DescIn)[IMB_  ];    \
              (DescOut)[INB_  ] = (DescIn)[INB_  ];    \
              (DescOut)[MB_   ] = (DescIn)[MB_   ];    \
              (DescOut)[NB_   ] = (DescIn)[NB_   ];    \
              (DescOut)[RSRC_ ] = (DescIn)[RSRC_ ];    \
              (DescOut)[CSRC_ ] = (DescIn)[CSRC_ ];    \
              (DescOut)[CTXT_ ] = (DescIn)[CTXT_ ];    \
              (DescOut)[LLD_  ] = (DescIn)[LLD_  ];    \
           }

#define    MDescTrans(DescIn, DescOut) \
           { \
              if ( (DescIn)[DTYPE_] == BLOCK_CYCLIC_2D ) \
              { \
                 (DescOut)[DTYPE_] = BLOCK_CYCLIC_2D_INB; \
                 (DescOut)[M_    ] = (DescIn)[M1_    ];   \
                 (DescOut)[N_    ] = (DescIn)[N1_    ];   \
                 (DescOut)[IMB_  ] = (DescIn)[MB1_   ];   \
                 (DescOut)[INB_  ] = (DescIn)[NB1_   ];   \
                 (DescOut)[MB_   ] = (DescIn)[MB1_   ];   \
                 (DescOut)[NB_   ] = (DescIn)[NB1_   ];   \
                 (DescOut)[RSRC_ ] = (DescIn)[RSRC1_ ];   \
                 (DescOut)[CSRC_ ] = (DescIn)[CSRC1_ ];   \
                 (DescOut)[CTXT_ ] = (DescIn)[CTXT1_ ];   \
                 (DescOut)[LLD_  ] = (DescIn)[LLD1_  ];   \
              } \
              else if ( (DescIn)[DTYPE_] == BLOCK_CYCLIC_2D_INB ) \
              { \
                 (DescOut)[DTYPE_] = BLOCK_CYCLIC_2D_INB; \
                 (DescOut)[M_    ] = (DescIn)[M_    ];    \
                 (DescOut)[N_    ] = (DescIn)[N_    ];    \
                 (DescOut)[IMB_  ] = (DescIn)[IMB_  ];    \
                 (DescOut)[INB_  ] = (DescIn)[INB_  ];    \
                 (DescOut)[MB_   ] = (DescIn)[MB_   ];    \
                 (DescOut)[NB_   ] = (DescIn)[NB_   ];    \
                 (DescOut)[RSRC_ ] = (DescIn)[RSRC_ ];    \
                 (DescOut)[CSRC_ ] = (DescIn)[CSRC_ ];    \
                 (DescOut)[CTXT_ ] = (DescIn)[CTXT_ ];    \
                 (DescOut)[LLD_  ] = (DescIn)[LLD_  ];    \
              } \
              else \
              { \
                 (DescOut)[DTYPE_] = (DescIn)[0]; \
                 (DescOut)[CTXT_ ] = (DescIn)[1]; \
                 (DescOut)[M_    ] = 0;           \
                 (DescOut)[N_    ] = 0;           \
                 (DescOut)[IMB_  ] = 1;           \
                 (DescOut)[INB_  ] = 1;           \
                 (DescOut)[MB_   ] = 1;           \
                 (DescOut)[NB_   ] = 1;           \
                 (DescOut)[RSRC_ ] = 0;           \
                 (DescOut)[CSRC_ ] = 0;           \
                 (DescOut)[LLD_  ] = 1;           \
              } \
           }

#define    MIndxTrans( I, J, i, j ) \
           { \
              i = *I - 1; \
              j = *J - 1; \
           }

#if( _F2C_CALL_ == _F2C_ADD_ )
/*
*  These defines  set  up  the  naming scheme required to have a FORTRAN
*  routine called by a C routine. No redefinition is necessary  to  have
*  the following FORTRAN to C interface:
*
*           FORTRAN DECLARATION            C CALL
*           SUBROUTINE PDFOO(...)          pdfoo_(...)
*
*  This is the PBLAS default.
*/

#endif

#if( _F2C_CALL_ == _F2C_F77ISF2C )
/*
*  These defines  set  up  the  naming scheme required to have a FORTRAN
*  routine called by a C routine for systems where  the FORTRAN compiler
*  is actually f2c (a FORTRAN to C conversion utility).
*
*           FORTRAN DECLARATION            C CALL
*           SUBROUTINE PDFOO(...)          pdfoo__(...)
*/

#endif

#if( _F2C_CALL_ == _F2C_UPCASE )
/*
*  These defines  set  up  the  naming scheme required to have a FORTRAN
*  routine called by a C routine with the following  FORTRAN to C inter-
*  face:
*
*           FORTRAN DECLARATION            C CALL
*           SUBROUTINE PDFOO(...)          PDFOO(...)
*/
#define    immadd_             IMMADD
#define    smmadd_             SMMADD
#define    dmmadd_             DMMADD
#define    cmmadd_             CMMADD
#define    zmmadd_             ZMMADD

#define    immtadd_            IMMTADD
#define    smmtadd_            SMMTADD
#define    dmmtadd_            DMMTADD
#define    cmmtadd_            CMMTADD
#define    zmmtadd_            ZMMTADD

#define    smmcadd_            SMMCADD
#define    dmmcadd_            DMMCADD
#define    cmmcadd_            CMMCADD
#define    zmmcadd_            ZMMCADD

#define    smmtcadd_           SMMTCADD
#define    dmmtcadd_           DMMTCADD
#define    cmmtcadd_           CMMTCADD
#define    zmmtcadd_           ZMMTCADD

#define    immdda_             IMMDDA
#define    smmdda_             SMMDDA
#define    dmmdda_             DMMDDA
#define    cmmdda_             CMMDDA
#define    zmmdda_             ZMMDDA

#define    smmddac_            SMMDDAC
#define    dmmddac_            DMMDDAC
#define    cmmddac_            CMMDDAC
#define    zmmddac_            ZMMDDAC

#define    immddat_            IMMDDAT
#define    smmddat_            SMMDDAT
#define    dmmddat_            DMMDDAT
#define    cmmddat_            CMMDDAT
#define    zmmddat_            ZMMDDAT

#define    smmddact_           SMMDDACT
#define    dmmddact_           DMMDDACT
#define    cmmddact_           CMMDDACT
#define    zmmddact_           ZMMDDACT

#define    sasqrtb_            SASQRTB
#define    dasqrtb_            DASQRTB

#define    sset_               SSET
#define    dset_               DSET
#define    cset_               CSET
#define    zset_               ZSET

#define    svasum_             SVASUM
#define    dvasum_             DVASUM
#define    scvasum_            SCVASUM
#define    dzvasum_            DZVASUM

#define    sascal_             SASCAL
#define    dascal_             DASCAL

#define    scshft_             SCSHFT
#define    dcshft_             DCSHFT
#define    ccshft_             CCSHFT
#define    zcshft_             ZCSHFT

#define    srshft_             SRSHFT
#define    drshft_             DRSHFT
#define    crshft_             CRSHFT
#define    zrshft_             ZRSHFT

#define    svvdot_             SVVDOT
#define    dvvdot_             DVVDOT
#define    cvvdotc_            CVVDOTC
#define    cvvdotu_            CVVDOTU
#define    zvvdotc_            ZVVDOTC
#define    zvvdotu_            ZVVDOTU

#define    stzpad_             STZPAD
#define    dtzpad_             DTZPAD
#define    ctzpad_             CTZPAD
#define    ztzpad_             ZTZPAD

#define    stzpadcpy_          STZPADCPY
#define    dtzpadcpy_          DTZPADCPY
#define    ctzpadcpy_          CTZPADCPY
#define    ztzpadcpy_          ZTZPADCPY

#define    stzscal_            STZSCAL
#define    dtzscal_            DTZSCAL
#define    ctzscal_            CTZSCAL
#define    ztzscal_            ZTZSCAL

#define    chescal_            CHESCAL
#define    zhescal_            ZHESCAL

#define    ctzcnjg_            CTZCNJG
#define    ztzcnjg_            ZTZCNJG

#define    sagemv_             SAGEMV
#define    dagemv_             DAGEMV
#define    cagemv_             CAGEMV
#define    zagemv_             ZAGEMV

#define    sasymv_             SASYMV
#define    dasymv_             DASYMV
#define    casymv_             CASYMV
#define    zasymv_             ZASYMV
#define    cahemv_             CAHEMV
#define    zahemv_             ZAHEMV

#define    satrmv_             SATRMV
#define    datrmv_             DATRMV
#define    catrmv_             CATRMV
#define    zatrmv_             ZATRMV

#define    csymv_              CSYMV
#define    zsymv_              ZSYMV

#define    csyr_               CSYR
#define    zsyr_               ZSYR

#define    csyr2_              CSYR2
#define    zsyr2_              ZSYR2

#endif

#if( _F2C_CALL_ == _F2C_NOCHANGE )
/*
*  These defines  set  up  the  naming scheme required to have a FORTRAN
*  routine called by a C routine with the following  FORTRAN to C inter-
*  face:
*
*           FORTRAN DECLARATION            C CALL
*           SUBROUTINE PDFOO(...)          pdfoo(...)
*/
#define    immadd_             immadd
#define    smmadd_             smmadd
#define    dmmadd_             dmmadd
#define    cmmadd_             cmmadd
#define    zmmadd_             zmmadd

#define    immtadd_            immtadd
#define    smmtadd_            smmtadd
#define    dmmtadd_            dmmtadd
#define    cmmtadd_            cmmtadd
#define    zmmtadd_            zmmtadd

#define    smmcadd_            smmcadd
#define    dmmcadd_            dmmcadd
#define    cmmcadd_            cmmcadd
#define    zmmcadd_            zmmcadd

#define    smmtcadd_           smmtcadd
#define    dmmtcadd_           dmmtcadd
#define    cmmtcadd_           cmmtcadd
#define    zmmtcadd_           zmmtcadd

#define    immdda_             immdda
#define    smmdda_             smmdda
#define    dmmdda_             dmmdda
#define    cmmdda_             cmmdda
#define    zmmdda_             zmmdda

#define    smmddac_            smmddac
#define    dmmddac_            dmmddac
#define    cmmddac_            cmmddac
#define    zmmddac_            zmmddac

#define    immddat_            immddat
#define    smmddat_            smmddat
#define    dmmddat_            dmmddat
#define    cmmddat_            cmmddat
#define    zmmddat_            zmmddat

#define    smmddact_           smmddact
#define    dmmddact_           dmmddact
#define    cmmddact_           cmmddact
#define    zmmddact_           zmmddact

#define    sasqrtb_            sasqrtb
#define    dasqrtb_            dasqrtb

#define    sset_               sset
#define    dset_               dset
#define    cset_               cset
#define    zset_               zset

#define    svasum_             svasum
#define    dvasum_             dvasum
#define    scvasum_            scvasum
#define    dzvasum_            dzvasum

#define    sascal_             sascal
#define    dascal_             dascal

#define    scshft_             scshft
#define    dcshft_             dcshft
#define    ccshft_             ccshft
#define    zcshft_             zcshft

#define    srshft_             srshft
#define    drshft_             drshft
#define    crshft_             crshft
#define    zrshft_             zrshft

#define    svvdot_             svvdot
#define    dvvdot_             dvvdot
#define    cvvdotc_            cvvdotc
#define    cvvdotu_            cvvdotu
#define    zvvdotc_            zvvdotc
#define    zvvdotu_            zvvdotu

#define    stzpad_             stzpad
#define    dtzpad_             dtzpad
#define    ctzpad_             ctzpad
#define    ztzpad_             ztzpad

#define    stzpadcpy_          stzpadcpy
#define    dtzpadcpy_          dtzpadcpy
#define    ctzpadcpy_          ctzpadcpy
#define    ztzpadcpy_          ztzpadcpy

#define    stzscal_            stzscal
#define    dtzscal_            dtzscal
#define    ctzscal_            ctzscal
#define    ztzscal_            ztzscal

#define    chescal_            chescal
#define    zhescal_            zhescal

#define    ctzcnjg_            ctzcnjg
#define    ztzcnjg_            ztzcnjg

#define    sagemv_             sagemv
#define    dagemv_             dagemv
#define    cagemv_             cagemv
#define    zagemv_             zagemv

#define    sasymv_             sasymv
#define    dasymv_             dasymv
#define    casymv_             casymv
#define    zasymv_             zasymv
#define    cahemv_             cahemv
#define    zahemv_             zahemv

#define    satrmv_             satrmv
#define    datrmv_             datrmv
#define    catrmv_             catrmv
#define    zatrmv_             zatrmv

#define    csymv_              csymv
#define    zsymv_              zsymv

#define    csyr_               csyr
#define    zsyr_               zsyr

#define    csyr2_              csyr2
#define    zsyr2_              zsyr2

#endif
/*
*  ---------------------------------------------------------------------
*  Function prototypes
*  ---------------------------------------------------------------------
*/
#ifdef __STDC__

F_VOID_FCT     immadd_         ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     smmadd_         ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     dmmadd_         ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     cmmadd_         ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     zmmadd_         ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );

F_VOID_FCT     smmcadd_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     dmmcadd_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     cmmcadd_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     zmmcadd_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );

F_VOID_FCT     immtadd_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     smmtadd_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     dmmtadd_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     cmmtadd_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     zmmtadd_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );

F_VOID_FCT     smmtcadd_       ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     dmmtcadd_       ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     cmmtcadd_       ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     zmmtcadd_       ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );

F_VOID_FCT     immdda_         ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     smmdda_         ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     dmmdda_         ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     cmmdda_         ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     zmmdda_         ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );

F_VOID_FCT     smmddac_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     dmmddac_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     cmmddac_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     zmmddac_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );

F_VOID_FCT     immddat_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     smmddat_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     dmmddat_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     cmmddat_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     zmmddat_        ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );

F_VOID_FCT     smmddact_       ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     dmmddact_       ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     cmmddact_       ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     zmmddact_       ( int *,     int *,     char *,
                                 char *,    int *,     char *,
                                 char *,    int * );

F_VOID_FCT     sasqrtb_        ( float *,   float *,   float * );
F_VOID_FCT     dasqrtb_        ( double *,  double *,  double * );

F_VOID_FCT     sset_           ( int *,     char *,    char *,
                                 int * );
F_VOID_FCT     dset_           ( int *,     char *,    char *,
                                 int * );
F_VOID_FCT     cset_           ( int *,     char *,    char *,
                                 int * );
F_VOID_FCT     zset_           ( int *,     char *,    char *,
                                 int * );

F_VOID_FCT     svasum_         ( int *,     char *,    char *,
                                 int * );
F_VOID_FCT     dvasum_         ( int *,     char *,    char *,
                                 int * );
F_VOID_FCT     scvasum_        ( int *,     char *,    char *,
                                 int * );
F_VOID_FCT     dzvasum_        ( int *,     char *,    char *,
                                 int * );

F_VOID_FCT     sascal_         ( int *,     char *,    char *,
                                 int * );
F_VOID_FCT     dascal_         ( int *,     char *,    char *,
                                 int * );

F_VOID_FCT     scshft_         ( int *,     int *,     int *,
                                 char *,    int * );
F_VOID_FCT     dcshft_         ( int *,     int *,     int *,
                                 char *,    int * );
F_VOID_FCT     ccshft_         ( int *,     int *,     int *,
                                 char *,    int * );
F_VOID_FCT     zcshft_         ( int *,     int *,     int *,
                                 char *,    int * );

F_VOID_FCT     srshft_         ( int *,     int *,     int *,
                                 char *,    int * );
F_VOID_FCT     drshft_         ( int *,     int *,     int *,
                                 char *,    int * );
F_VOID_FCT     crshft_         ( int *,     int *,     int *,
                                 char *,    int * );
F_VOID_FCT     zrshft_         ( int *,     int *,     int *,
                                 char *,    int * );

F_VOID_FCT     svvdot_         ( int *,     char *,    char *,
                                 int *,     char *,    int * );
F_VOID_FCT     dvvdot_         ( int *,     char *,    char *,
                                 int *,     char *,    int * );
F_VOID_FCT     cvvdotu_        ( int *,     char *,    char *,
                                 int *,     char *,    int * );
F_VOID_FCT     cvvdotc_        ( int *,     char *,    char *,
                                 int *,     char *,    int * );
F_VOID_FCT     zvvdotu_        ( int *,     char *,    char *,
                                 int *,     char *,    int * );
F_VOID_FCT     zvvdotc_        ( int *,     char *,    char *,
                                 int *,     char *,    int * );

F_VOID_FCT     stzpad_         ( F_CHAR_T,  F_CHAR_T,  int *,
                                 int *,     int *,     char *,
                                 char *,    char *,    int * );
F_VOID_FCT     dtzpad_         ( F_CHAR_T,  F_CHAR_T,  int *,
                                 int *,     int *,     char *,
                                 char *,    char *,    int * );
F_VOID_FCT     ctzpad_         ( F_CHAR_T,  F_CHAR_T,  int *,
                                 int *,     int *,     char *,
                                 char *,    char *,    int * );
F_VOID_FCT     ztzpad_         ( F_CHAR_T,  F_CHAR_T,  int *,
                                 int *,     int *,     char *,
                                 char *,    char *,    int * );

F_VOID_FCT     stzpadcpy_      ( F_CHAR_T,  F_CHAR_T,  int *,
                                 int *,     int *,     char *,
                                 int *,     char *,    int * );
F_VOID_FCT     dtzpadcpy_      ( F_CHAR_T,  F_CHAR_T,  int *,
                                 int *,     int *,     char *,
                                 int *,     char *,    int * );
F_VOID_FCT     ctzpadcpy_      ( F_CHAR_T,  F_CHAR_T,  int *,
                                 int *,     int *,     char *,
                                 int *,     char *,    int * );
F_VOID_FCT     ztzpadcpy_      ( F_CHAR_T,  F_CHAR_T,  int *,
                                 int *,     int *,     char *,
                                 int *,     char *,    int * );

F_VOID_FCT     stzscal_        ( F_CHAR_T,  int *,     int *,
                                 int *,     char *,    char *,
                                 int * );
F_VOID_FCT     dtzscal_        ( F_CHAR_T,  int *,     int *,
                                 int *,     char *,    char *,
                                 int * );
F_VOID_FCT     ctzscal_        ( F_CHAR_T,  int *,     int *,
                                 int *,     char *,    char *,
                                 int * );
F_VOID_FCT     ztzscal_        ( F_CHAR_T,  int *,     int *,
                                 int *,     char *,    char *,
                                 int * );

F_VOID_FCT     chescal_        ( F_CHAR_T,  int *,     int *,
                                 int *,     char *,    char *,
                                 int * );
F_VOID_FCT     zhescal_        ( F_CHAR_T,  int *,     int *,
                                 int *,     char *,    char *,
                                 int * );

F_VOID_FCT     ctzcnjg_        ( F_CHAR_T,  int *,     int *,
                                 int *,     char *,    char *,
                                 int * );
F_VOID_FCT     ztzcnjg_        ( F_CHAR_T,  int *,     int *,
                                 int *,     char *,    char *,
                                 int * );

F_VOID_FCT     sagemv_         ( F_CHAR_T,  int *,     int *,
                                 char *,    char *,    int *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     dagemv_         ( F_CHAR_T,  int *,     int *,
                                 char *,    char *,    int *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     cagemv_         ( F_CHAR_T,  int *,     int *,
                                 char *,    char *,    int *,
                                 char *,    int *,     char *,
                                 char *,    int * );
F_VOID_FCT     zagemv_         ( F_CHAR_T,  int *,     int *,
                                 char *,    char *,    int *,
                                 char *,    int *,     char *,
                                 char *,    int * );

F_VOID_FCT     sasymv_         ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int *,     char *,    char *,
                                 int * );
F_VOID_FCT     dasymv_         ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int *,     char *,    char *,
                                 int * );
F_VOID_FCT     casymv_         ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int *,     char *,    char *,
                                 int * );
F_VOID_FCT     zasymv_         ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int *,     char *,    char *,
                                 int * );
F_VOID_FCT     cahemv_         ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int *,     char *,    char *,
                                 int * );
F_VOID_FCT     zahemv_         ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int *,     char *,    char *,
                                 int * );

F_VOID_FCT     satrmv_         ( F_CHAR_T,  F_CHAR_T,  F_CHAR_T,
                                 int *,     char *,    char *,
                                 int *,     char *,    int *,
                                 char *,    char *,    int * );
F_VOID_FCT     datrmv_         ( F_CHAR_T,  F_CHAR_T,  F_CHAR_T,
                                 int *,     char *,    char *,
                                 int *,     char *,    int *,
                                 char *,    char *,    int * );
F_VOID_FCT     catrmv_         ( F_CHAR_T,  F_CHAR_T,  F_CHAR_T,
                                 int *,     char *,    char *,
                                 int *,     char *,    int *,
                                 char *,    char *,    int * );
F_VOID_FCT     zatrmv_         ( F_CHAR_T,  F_CHAR_T,  F_CHAR_T,
                                 int *,     char *,    char *,
                                 int *,     char *,    int *,
                                 char *,    char *,    int * );

F_VOID_FCT     csymv_          ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int *,     char *,    char *,
                                 int * );
F_VOID_FCT     zsymv_          ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int *,     char *,    char *,
                                 int * );

F_VOID_FCT     csyr_           ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int * );
F_VOID_FCT     zsyr_           ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int * );

F_VOID_FCT     csyr2_          ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int *,     char *,    int * );
F_VOID_FCT     zsyr2_          ( F_CHAR_T,  int *,     char *,
                                 char *,    int *,     char *,
                                 int *,     char *,    int * );

void           PB_Ctzsyr       ( PBTYP_T *, char *,    int,
                                 int,       int,       int,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int );
void           PB_Ctzher       ( PBTYP_T *, char *,    int,
                                 int,       int,       int,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int );
void           PB_Ctzsyr2      ( PBTYP_T *, char *,    int,
                                 int,       int,       int,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int,       char *,    int,
                                 char *,    int );
void           PB_Ctzher2      ( PBTYP_T *, char *,    int,
                                 int,       int,       int,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int,       char *,    int,
                                 char *,    int );
void           PB_Ctztrmv      ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       int,       int,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int );
void           PB_Ctzatrmv     ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       int,       int,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int );
void           PB_Ctzsymv      ( PBTYP_T *, char *,    char *,
                                 int,       int,       int,
                                 int,       char *,    char *,
                                 int,       char *,    int,
                                 char *,    int,       char *,
                                 int,       char *,    int );
void           PB_Ctzhemv      ( PBTYP_T *, char *,    char *,
                                 int,       int,       int,
                                 int,       char *,    char *,
                                 int,       char *,    int,
                                 char *,    int,       char *,
                                 int,       char *,    int );
void           PB_Ctzasymv     ( PBTYP_T *, char *,    char *,
                                 int,       int,       int,
                                 int,       char *,    char *,
                                 int,       char *,    int,
                                 char *,    int,       char *,
                                 int,       char *,    int );
void           PB_Ctzahemv     ( PBTYP_T *, char *,    char *,
                                 int,       int,       int,
                                 int,       char *,    char *,
                                 int,       char *,    int,
                                 char *,    int,       char *,
                                 int,       char *,    int );

void           PB_Ctzsyrk      ( PBTYP_T *, char *,    int,
                                 int,       int,       int,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int );
void           PB_Ctzherk      ( PBTYP_T *, char *,    int,
                                 int,       int,       int,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int );
void           PB_Ctzsyr2k     ( PBTYP_T *, char *,    int,
                                 int,       int,       int,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int,       char *,    int,
                                 char *,    int );
void           PB_Ctzher2k     ( PBTYP_T *, char *,    int,
                                 int,       int,       int,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int,       char *,    int,
                                 char *,    int );
void           PB_Ctztrmm      ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       int,       int,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int );
void           PB_Ctzsymm      ( PBTYP_T *, char *,    char *,
                                 int,       int,       int,
                                 int,       char *,    char *,
                                 int,       char *,    int,
                                 char *,    int,       char *,
                                 int,       char *,    int );
void           PB_Ctzhemm      ( PBTYP_T *, char *,    char *,
                                 int,       int,       int,
                                 int,       char *,    char *,
                                 int,       char *,    int,
                                 char *,    int,       char *,
                                 int,       char *,    int );

void           PB_CpswapNN     ( PBTYP_T *, int,       char *,
                                 int,       int,       int *,
                                 int,       char *,    int,
                                 int,       int *,     int );
void           PB_CpswapND     ( PBTYP_T *, int,       char *,
                                 int,       int,       int *,
                                 int,       char *,    int,
                                 int,       int *,     int );
void           PB_Cpdot11      ( PBTYP_T *, int,       char *,
                                 char *,    int,       int,
                                 int *,     int,       char *,
                                 int,       int,       int *,
                                 int,       VVDOT_T );
void           PB_CpdotNN      ( PBTYP_T *, int,       char *,
                                 char *,    int,       int,
                                 int *,     int,       char *,
                                 int,       int,       int *,
                                 int,       VVDOT_T );
void           PB_CpdotND      ( PBTYP_T *, int,       char *,
                                 char *,    int,       int,
                                 int *,     int,       char *,
                                 int,       int,       int *,
                                 int,       VVDOT_T );
void           PB_CpaxpbyNN    ( PBTYP_T *, char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    char *,    char *,
                                 int,       int,       int *,
                                 char * );
void           PB_CpaxpbyND    ( PBTYP_T *, char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    char *,    char *,
                                 int,       int,       int *,
                                 char * );
void           PB_CpaxpbyDN    ( PBTYP_T *, char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    char *,    char *,
                                 int,       int,       int *,
                                 char * );
void           PB_Cpaxpby      ( PBTYP_T *, char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    char *,    char *,
                                 int,       int,       int *,
                                 char * );

void           PB_Cpsyr        ( PBTYP_T *, char *,    int,
                                 int,       char *,    char *,
                                 int,       char *,    int,
                                 char *,    int,       int,
                                 int *,     TZSYR_T );
void           PB_Cpsyr2       ( PBTYP_T *, char *,    int,
                                 int,       char *,    char *,
                                 int,       char *,    int,
                                 char *,    int,       char *,
                                 int,       char *,    int,
                                 int,       int *,     TZSYR2_T );
void           PB_Cptrm        ( PBTYP_T *, PBTYP_T *, char *,
                                 char *,    char *,    char *,
                                 int,       int,       char *,
                                 char *,    int,       int,
                                 int *,     char *,    int,
                                 char *,    int,       TZTRM_T );
void           PB_Cpsym        ( PBTYP_T *, PBTYP_T *, char *,
                                 char *,    int,       int,
                                 char *,    char *,    int,
                                 int,       int *,     char *,
                                 int,       char *,    int,
                                 char *,    int,       char *,
                                 int,       TZSYM_T );
void           PB_Cpgeadd      ( PBTYP_T *, char *,    char *,
                                 char *,    int,       int,
                                 char *,    char *,    int,
                                 int,       int *,     char *,
                                 char *,    int,       int,
                                 int * );
void           PB_Cptradd      ( PBTYP_T *, char *,    char *,
                                 char *,    int,       int,
                                 char *,    char *,    int,
                                 int,       int *,     char *,
                                 char *,    int,       int,
                                 int * );
void           PB_Cptran       ( PBTYP_T *, char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    char *,    int,
                                 int,       int * );
void           PB_Cptrsv       ( PBTYP_T *, int,       char *,
                                 char *,    char *,    int,
                                 char *,    int,       int,
                                 int *,     char *,    int,
                                 char *,    int );
void           PB_Cptrsm       ( PBTYP_T *, int,       char *,
                                 char *,    char *,    char *,
                                 int,       int,       char *,
                                 char *,    int,       int,
                                 int *,     char *,    int,
                                 char *,    int );

void           PB_CpgemmAB     ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       int,       char *,
                                 char *,    int,       int,
                                 int *,     char *,    int,
                                 int,       int *,     char *,
                                 char *,    int,       int,
                                 int * );
void           PB_CpgemmAC     ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       int,       char *,
                                 char *,    int,       int,
                                 int *,     char *,    int,
                                 int,       int *,     char *,
                                 char *,    int,       int,
                                 int * );
void           PB_CpgemmBC     ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       int,       char *,
                                 char *,    int,       int,
                                 int *,     char *,    int,
                                 int,       int *,     char *,
                                 char *,    int,       int,
                                 int * );
void           PB_CpsymmAB     ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    int,       int,
                                 int *,     char *,    char *,
                                 int,       int,       int * );
void           PB_CpsymmBC     ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    int,       int,
                                 int *,     char *,    char *,
                                 int,       int,       int * );
void           PB_CpsyrkA      ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    char *,    int,
                                 int,       int * );
void           PB_CpsyrkAC     ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    char *,    int,
                                 int,       int * );
void           PB_Cpsyr2kA     ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    int,       int,
                                 int *,     char *,    char *,
                                 int,       int,       int * );
void           PB_Cpsyr2kAC    ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    int,       int,
                                 int *,     char *,    char *,
                                 int,       int,       int * );
void           PB_CptrmmAB     ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    char *,
                                 int,       int,       char *,
                                 char *,    int,       int,
                                 int *,     char *,    int,
                                 int,       int * );
void           PB_CptrmmB      ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    char *,
                                 int,       int,       char *,
                                 char *,    int,       int,
                                 int *,     char *,    int,
                                 int,       int * );
void           PB_CptrsmAB     ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    char *,
                                 int,       int,       char *,
                                 char *,    int,       int,
                                 int *,     char *,    int,
                                 int,       int * );
void           PB_CptrsmAB0    ( PBTYP_T *, char *,    char *,
                                 char *,    int,       int,
                                 char *,    char *,    int,
                                 int,       int *,     char *,
                                 int,       int,       int *,
                                 char * *,  int *,     int * );
void           PB_CptrsmAB1    ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    int,
                                 int,       char *,    char *,
                                 int,       int,       int *,
                                 char *,    int,       int,
                                 int *,     char *,    int * );
void           PB_CptrsmB      ( PBTYP_T *, char *,    char *,
                                 char *,    char *,    char *,
                                 int,       int,       char *,
                                 char *,    int,       int,
                                 int *,     char *,    int,
                                 int,       int * );
#else

F_VOID_FCT     immadd_         ();
F_VOID_FCT     smmadd_         ();
F_VOID_FCT     dmmadd_         ();
F_VOID_FCT     cmmadd_         ();
F_VOID_FCT     zmmadd_         ();

F_VOID_FCT     smmcadd_        ();
F_VOID_FCT     dmmcadd_        ();
F_VOID_FCT     cmmcadd_        ();
F_VOID_FCT     zmmcadd_        ();

F_VOID_FCT     immtadd_        ();
F_VOID_FCT     smmtadd_        ();
F_VOID_FCT     dmmtadd_        ();
F_VOID_FCT     cmmtadd_        ();
F_VOID_FCT     zmmtadd_        ();

F_VOID_FCT     smmtcadd_       ();
F_VOID_FCT     dmmtcadd_       ();
F_VOID_FCT     cmmtcadd_       ();
F_VOID_FCT     zmmtcadd_       ();

F_VOID_FCT     immdda_         ();
F_VOID_FCT     smmdda_         ();
F_VOID_FCT     dmmdda_         ();
F_VOID_FCT     cmmdda_         ();
F_VOID_FCT     zmmdda_         ();

F_VOID_FCT     smmddac_        ();
F_VOID_FCT     dmmddac_        ();
F_VOID_FCT     cmmddac_        ();
F_VOID_FCT     zmmddac_        ();

F_VOID_FCT     immddat_        ();
F_VOID_FCT     smmddat_        ();
F_VOID_FCT     dmmddat_        ();
F_VOID_FCT     cmmddat_        ();
F_VOID_FCT     zmmddat_        ();

F_VOID_FCT     smmddact_       ();
F_VOID_FCT     dmmddact_       ();
F_VOID_FCT     cmmddact_       ();
F_VOID_FCT     zmmddact_       ();

F_VOID_FCT     sasqrtb_        ();
F_VOID_FCT     dasqrtb_        ();

F_VOID_FCT     sset_           ();
F_VOID_FCT     dset_           ();
F_VOID_FCT     cset_           ();
F_VOID_FCT     zset_           ();

F_VOID_FCT     svasum_         ();
F_VOID_FCT     dvasum_         ();
F_VOID_FCT     scvasum_        ();
F_VOID_FCT     dzvasum_        ();

F_VOID_FCT     sascal_         ();
F_VOID_FCT     dascal_         ();

F_VOID_FCT     scshft_         ();
F_VOID_FCT     dcshft_         ();
F_VOID_FCT     ccshft_         ();
F_VOID_FCT     zcshft_         ();

F_VOID_FCT     srshft_         ();
F_VOID_FCT     drshft_         ();
F_VOID_FCT     crshft_         ();
F_VOID_FCT     zrshft_         ();

F_VOID_FCT     svvdot_         ();
F_VOID_FCT     dvvdot_         ();
F_VOID_FCT     cvvdotc_        ();
F_VOID_FCT     cvvdotu_        ();
F_VOID_FCT     zvvdotc_        ();
F_VOID_FCT     zvvdotu_        ();

F_VOID_FCT     stzpad_         ();
F_VOID_FCT     dtzpad_         ();
F_VOID_FCT     ctzpad_         ();
F_VOID_FCT     ztzpad_         ();

F_VOID_FCT     stzpadcpy_      ();
F_VOID_FCT     dtzpadcpy_      ();
F_VOID_FCT     ctzpadcpy_      ();
F_VOID_FCT     ztzpadcpy_      ();

F_VOID_FCT     stzscal_        ();
F_VOID_FCT     dtzscal_        ();
F_VOID_FCT     ctzscal_        ();
F_VOID_FCT     ztzscal_        ();

F_VOID_FCT     chescal_        ();
F_VOID_FCT     zhescal_        ();

F_VOID_FCT     ctzcnjg_        ();
F_VOID_FCT     ztzcnjg_        ();

F_VOID_FCT     sagemv_         ();
F_VOID_FCT     dagemv_         ();
F_VOID_FCT     cagemv_         ();
F_VOID_FCT     zagemv_         ();

F_VOID_FCT     sasymv_         ();
F_VOID_FCT     dasymv_         ();
F_VOID_FCT     casymv_         ();
F_VOID_FCT     zasymv_         ();
F_VOID_FCT     cahemv_         ();
F_VOID_FCT     zahemv_         ();

F_VOID_FCT     satrmv_         ();
F_VOID_FCT     datrmv_         ();
F_VOID_FCT     catrmv_         ();
F_VOID_FCT     zatrmv_         ();

F_VOID_FCT     csymv_          ();
F_VOID_FCT     zsymv_          ();

F_VOID_FCT     csyr_           ();
F_VOID_FCT     zsyr_           ();

F_VOID_FCT     csyr2_          ();
F_VOID_FCT     zsyr2_          ();

void           PB_Ctzsyr       ();
void           PB_Ctzher       ();
void           PB_Ctzsyr2      ();
void           PB_Ctzher2      ();
void           PB_Ctztrmv      ();
void           PB_Ctzatrmv     ();
void           PB_Ctzsymv      ();
void           PB_Ctzhemv      ();
void           PB_Ctzasymv     ();
void           PB_Ctzahemv     ();
void           PB_Ctzsyrk      ();
void           PB_Ctzherk      ();
void           PB_Ctzsyr2k     ();
void           PB_Ctzher2k     ();
void           PB_Ctztrmm      ();
void           PB_Ctzsymm      ();
void           PB_Ctzhemm      ();

void           PB_CpswapNN     ();
void           PB_CpswapND     ();
void           PB_Cpdot11      ();
void           PB_CpdotNN      ();
void           PB_CpdotND      ();
void           PB_CpaxpbyNN    ();
void           PB_CpaxpbyND    ();
void           PB_CpaxpbyDN    ();
void           PB_Cpaxpby      ();

void           PB_Cpsyr        ();
void           PB_Cpsyr2       ();
void           PB_Cptrm        ();
void           PB_Cpsym        ();
void           PB_Cpgeadd      ();
void           PB_Cptradd      ();
void           PB_Cptran       ();
void           PB_Cptrsv       ();
void           PB_Cptrsm       ();

void           PB_CpgemmAB     ();
void           PB_CpgemmAC     ();
void           PB_CpgemmBC     ();
void           PB_CpsymmAB     ();
void           PB_CpsymmBC     ();
void           PB_CpsyrkA      ();
void           PB_CpsyrkAC     ();
void           PB_Cpsyr2kA     ();
void           PB_Cpsyr2kAC    ();
void           PB_CptrmmAB     ();
void           PB_CptrmmB      ();
void           PB_CptrsmAB     ();
void           PB_CptrsmAB0    ();
void           PB_CptrsmAB1    ();
void           PB_CptrsmB      ();

#endif
                                                             /* TOOLS */
#ifdef __STDC__

int            PB_Cgcd         ( int,       int );
int            PB_Clcm         ( int,       int );

void           PB_Cdescset     ( int *,     int,       int,
                                 int,       int,       int,
                                 int,       int,       int,
                                 int,       int );
void           PB_Cdescribe    ( int,       int,       int,
                                 int,       int *,     int,
                                 int,       int,       int,
                                 int *,     int *,     int *,
                                 int *,     int *,     int *,
                                 int *,     int *,     int *,
                                 int * );
void           PB_CargFtoC     ( int,       int,       int *,
                                 int *,     int *,     int * );
int            PB_Cfirstnb     ( int,       int,       int,
                                 int );
int            PB_Clastnb      ( int,       int,       int,
                                 int );
int            PB_Cspan        ( int,       int,       int,
                                 int,       int,       int );

void           PB_Cainfog2l    ( int,       int,       int,
                                 int,       int *,     int,
                                 int,       int,       int,
                                 int *,     int *,     int *,
                                 int *,     int *,     int *,
                                 int *,     int *,     int *,
                                 int * );
void           PB_Cinfog2l     ( int,       int,       int *,
                                 int,       int,       int,
                                 int,       int *,     int *,
                                 int *,     int * );
int            PB_Cg2lrem      ( int,       int,       int,
                                 int,       int,       int );
int            PB_Cindxg2p     ( int,       int,       int,
                                 int,       int,       int );
int            PB_Cnumroc      ( int,       int,       int,
                                 int,       int,       int,
                                 int );
int            PB_Cnpreroc     ( int,       int,       int,
                                 int,       int,       int,
                                 int );
int            PB_Cnnxtroc     ( int,       int,       int,
                                 int,       int,       int,
                                 int );

void           PB_Cconjg       ( PBTYP_T *, char *,    char * );


void           PB_Cwarn        ( int,       int,       char *,
                                 char *,    ... );
void           PB_Cabort       ( int,       char *,    int );
void           PB_Cchkmat      ( int,       char *,    char *,
                                 int,       int,       int,
                                 int,       int,       int,
                                 int *,     int,       int * );
void           PB_Cchkvec      ( int,       char *,    char *,
                                 int,       int,       int,
                                 int,       int *,     int,
                                 int,       int * );

char *         PB_Cmalloc      ( int );
char *         PB_Cgetbuf      ( char *,    int );

PBTYP_T *      PB_Citypeset    ( void );
PBTYP_T *      PB_Cstypeset    ( void );
PBTYP_T *      PB_Cdtypeset    ( void );
PBTYP_T *      PB_Cctypeset    ( void );
PBTYP_T *      PB_Cztypeset    ( void );

int            pilaenv_        ( int *,     F_CHAR_T );
char *         PB_Ctop         ( int *,     char *,    char *,
                                 char * );

void           PB_CVMinit      ( PB_VM_T *, int,       int,
                                 int,       int,       int,
                                 int,       int,       int,
                                 int,       int,       int,
                                 int );
int            PB_CVMnpq       ( PB_VM_T * );
void           PB_CVMcontig    ( PB_VM_T *, int *,     int *,
                                 int *,     int * );
int            PB_CVMloc       ( PBTYP_T *, PB_VM_T *, char *,
                                 char *,    char *,    char *,
                                 int,       int,       char *,
                                 char *,    int,       char *,
                                 char *,    int );
int            PB_CVMswp       ( PBTYP_T *, PB_VM_T *, char *,
                                 char *,    char *,    int,
                                 char *,    int,       char *,
                                 int );
int            PB_CVMpack      ( PBTYP_T *, PB_VM_T *, char *,
                                 char *,    char *,    char *,
                                 int,       int,       char *,
                                 char *,    int,       char *,
                                 char *,    int );
void           PB_CVMupdate    ( PB_VM_T *, int,       int *,
                                 int * );

void           PB_Cbinfo       ( int,       int,       int,
                                 int,       int,       int,
                                 int,       int,       int,
                                 int *,     int *,     int *,
                                 int *,     int *,     int *,
                                 int *,     int *,     int *,
                                 int *,     int * );

void           PB_Cplaprnt     ( PBTYP_T *, int,       int,
                                 char *,    int,       int,
                                 int *,     int,       int,
                                 char * );
void           PB_Cplaprn2     ( PBTYP_T *, int,       int,
                                 char *,    int,       int,
                                 int *,     int,       int,
                                 char *,    int,       int );
void           PB_Cprnt        ( char,      int,       int,
                                 int,       char *,    int,
                                 int,       char * );

void           PB_Cplapad      ( PBTYP_T *, char *,    char *,
                                 int,       int,       char *,
                                 char *,    char *,    int,
                                 int,       int * );
void           PB_Cplapd2      ( PBTYP_T *, char *,    char *,
                                 int,       int,       char *,
                                 char *,    char *,    int,
                                 int,       int * );
void           PB_Cplascal     ( PBTYP_T *, char *,    char *,
                                 int,       int,       char *,
                                 char *,    int,       int,
                                 int * );
void           PB_Cplasca2     ( PBTYP_T *, char *,    char *,
                                 int,       int,       char *,
                                 char *,    int,       int,
                                 int * );
void           PB_Cplacnjg     ( PBTYP_T *, int,       int,
                                 char *,    char *,    int,
                                 int,       int * );

void           PB_CInV         ( PBTYP_T *, char *,    char *,
                                 int,       int,       int *,
                                 int,       char *,    int,
                                 int,       int *,     char *,
                                 char * *,  int *,     int * );
void           PB_CInV2        ( PBTYP_T *, char *,    char *,
                                 int,       int,       int *,
                                 int,       char *,    int,
                                 int,       int *,     char *,
                                 char *,    int,       int * );
void           PB_CInOutV      ( PBTYP_T *, char *,    int,
                                 int,       int *,     int,
                                 char *,    char *,    int,
                                 int,       int *,     char *,
                                 char * *,  char * *,  int *,
                                 int *,     int *,     int * );
void           PB_CInOutV2     ( PBTYP_T *, char *,    char *,
                                 int,       int,       int,
                                 int *,     int,       char *,
                                 int,       int,       int *,
                                 char *,    char * *,  int *,
                                 int *,     int *,     int * );
void           PB_COutV        ( PBTYP_T *, char *,    char *,
                                 int,       int,       int *,
                                 int,       char * *,  int *,
                                 int *,     int * );
void           PB_CGatherV     ( PBTYP_T *, char *,    char *,
                                 int,       int,       char *,
                                 int,       int,       int *,
                                 char *,    char * *,  int *,
                                 int * );
void           PB_CScatterV    ( PBTYP_T *, char *,    int,
                                 int,       char *,    int,
                                 int,       int *,     char *,
                                 char *,    char *,    int,
                                 int,       int *,     char * );
#else

int            PB_Cgcd         ();
int            PB_Clcm         ();

void           PB_Cdescset     ();
void           PB_Cdescribe    ();
void           PB_CargFtoC     ();
int            PB_Cfirstnb     ();
int            PB_Clastnb      ();
int            PB_Cspan        ();

void           PB_Cainfog2l    ();
void           PB_Cinfog2l     ();
int            PB_Cg2lrem      ();
int            PB_Cindxg2p     ();
int            PB_Cnumroc      ();
int            PB_Cnpreroc     ();
int            PB_Cnnxtroc     ();

void           PB_Cconjg       ();

void           PB_Cwarn        ();
void           PB_Cabort       ();
void           PB_Cchkmat      ();
void           PB_Cchkvec      ();

char *         PB_Cmalloc      ();
char *         PB_Cgetbuf      ();

PBTYP_T *      PB_Citypeset    ();
PBTYP_T *      PB_Cstypeset    ();
PBTYP_T *      PB_Cdtypeset    ();
PBTYP_T *      PB_Cctypeset    ();
PBTYP_T *      PB_Cztypeset    ();

int            pilaenv_        ();
char *         PB_Ctop         ();

void           PB_CVMinit      ();
int            PB_CVMnpq       ();
void           PB_CVMcontig    ();
int            PB_CVMloc       ();
int            PB_CVMswp       ();
int            PB_CVMpack      ();
void           PB_CVMupdate    ();

void           PB_Cbinfo       ();

void           PB_Cplaprnt     ();
void           PB_Cplaprn2     ();
void           PB_Cprnt        ();

void           PB_Cplapad      ();
void           PB_Cplapd2      ();
void           PB_Cplascal     ();
void           PB_Cplasca2     ();
void           PB_Cplacnjg     ();

void           PB_CInV         ();
void           PB_CInV2        ();
void           PB_CInOutV      ();
void           PB_CInOutV2     ();
void           PB_COutV        ();
void           PB_CGatherV     ();
void           PB_CScatterV    ();

#endif