/*  SubMtx.h  */

#include "../cfiles.h"
#include "../A2.h"
#include "../ZV.h"
#include "../DV.h"
#include "../SPOOLES.h"

/*--------------------------------------------------------------------*/
/*
   ---------------------------------------------------------------
   structure to hold a block of a block matrix.
   e.g., the block partition would be by supernodes.

   type -- type of matrix
      1 -- real
      2 -- complex
   mode -- storage mode of matrix
      0 -- dense stored by rows
      1 -- dense stored by columns
      2 -- sparse stored by rows
      3 -- sparse stored by columns
      4 -- sparse stored by triples
      5 -- sparse stored by dense subrows
      6 -- sparse stored by dense subcolumns
      7 -- diagonal
      8 -- block diagonal symmetric 
           (upper part of each block stored by rows)
      9 -- block diagonal hermitian (complex only)
           (upper part of each block stored by rows)
   rowid    -- block row to which this matrix belongs
   colid    -- block column to which this matrix belongs
   nrow     -- number of rows
   ncol     -- number of columns
   nent     -- number of entries
   entries  -- pointer to the entries
   wrkDV    -- DV object that manages workspace
   next     -- pointer to next SubMtx object in a singly linked list
   
   created -- 98jan29, cca
   -----------------------------------------------------------------
*/
typedef struct _SubMtx   SubMtx ;
struct _SubMtx {
   int      type     ;
   int      mode     ;
   int      rowid    ;
   int      colid    ;
   int      nrow     ;
   int      ncol     ;
   int      nent     ;
   double   *entries ;
   DV       wrkDV    ;
   SubMtx   *next    ;
} ;
/*
   ------------------------
   real/complex type macros
   ------------------------
*/
#define SUBMTX_IS_REAL(chv)    ((chv)->type == SPOOLES_REAL)
#define SUBMTX_IS_COMPLEX(chv) ((chv)->type == SPOOLES_COMPLEX)
/*
   -------------------
   storage mode macros
   -------------------
*/
#define SUBMTX_DENSE_ROWS           0
#define SUBMTX_DENSE_COLUMNS        1
#define SUBMTX_SPARSE_ROWS          2
#define SUBMTX_SPARSE_COLUMNS       3
#define SUBMTX_SPARSE_TRIPLES       4
#define SUBMTX_DENSE_SUBROWS        5
#define SUBMTX_DENSE_SUBCOLUMNS     6
#define SUBMTX_DIAGONAL             7
#define SUBMTX_BLOCK_DIAGONAL_SYM   8
#define SUBMTX_BLOCK_DIAGONAL_HERM  9

#define SUBMTX_IS_DENSE_ROWS(chv) \
   ((chv)->mode == SUBMTX_DENSE_ROWS)
#define SUBMTX_IS_DENSE_COLUMNS(chv) \
   ((chv)->mode == SUBMTX_DENSE_COLUMNS)
#define SUBMTX_IS_SPARSE_ROWS(chv) \
   ((chv)->mode == SUBMTX_SPARSE_ROWS)
#define SUBMTX_IS_SPARSE_COLUMNS(chv) \
   ((chv)->mode == SUBMTX_SPARSE_COLUMNS)
#define SUBMTX_IS_SPARSE_TRIPLES(chv) \
   ((chv)->mode == SUBMTX_SPARSE_TRIPLES)
#define SUBMTX_IS_DENSE_SUBROWS(chv) \
   ((chv)->mode == SUBMTX_DENSE_SUBROWS)
#define SUBMTX_IS_DENSE_SUBCOLUMNS(chv) \
   ((chv)->mode == SUBMTX_DENSE_SUBCOLUMNS)
#define SUBMTX_IS_DIAGONAL(chv) \
   ((chv)->mode == SUBMTX_DIAGONAL)
#define SUBMTX_IS_BLOCK_DIAGONAL_SYM(chv) \
   ((chv)->mode == SUBMTX_BLOCK_DIAGONAL_SYM)
#define SUBMTX_IS_BLOCK_DIAGONAL_HERM(chv) \
   ((chv)->mode == SUBMTX_BLOCK_DIAGONAL_HERM)
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in basics.c ----------------------------------------
------------------------------------------------------------------------
*/
/*
   -----------------------
   simplest constructor
 
   created -- 98may01, cca
   -----------------------
*/
SubMtx *
SubMtx_new ( 
   void 
) ;
/*
   -----------------------
   set the default fields
 
   created -- 98may01, cca
   -----------------------
*/
void
SubMtx_setDefaultFields (
   SubMtx   *mtx
) ;
/*
   --------------------------------------------------
   clear the data fields, releasing allocated storage
 
   created -- 98may01, cca
   --------------------------------------------------
*/
void
SubMtx_clearData (
   SubMtx   *mtx
) ;
/*
   ------------------------------------------
   destructor, free's the object and its data
 
   created -- 98may01, cca
   ------------------------------------------
*/
void
SubMtx_free (
   SubMtx   *mtx
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in instance.c --------------------------------------
------------------------------------------------------------------------
*/
/*
   ------------------------------------------
   purpose -- fill *prowid with the row id
              and  *pcolid with the column id
 
   created -- 98may01, cca
   ------------------------------------------
*/
void
SubMtx_ids (
   SubMtx   *mtx,
   int      *prowid,
   int      *pcolid
) ;
/*
   -------------------------------------
   purpose -- set the row and column ids
 
   created -- 98may01, cca
   -------------------------------------
*/
void
SubMtx_setIds (
   SubMtx   *mtx,
   int      rowid,
   int      colid
) ;
/*
   ---------------------------------------------------
   purpose -- fill *pnrow with the # of rows
              and  *pncol with the # of columns
              and  *pnent with the # of matrix entries
 
   created -- 98may01, cca
   ---------------------------------------------------
*/
void
SubMtx_dimensions (
   SubMtx   *mtx,
   int      *pnrow,
   int      *pncol,
   int      *pnent
) ;
/*
   ------------------------------------------------------------
   purpose --
     fill *pnrow with the number of rows
     if prowind != NULL then
        fill *prowind with the base location of the row indices
     endif
 
   created -- 98may01, cca
   ------------------------------------------------------------
*/
void
SubMtx_rowIndices (
   SubMtx   *mtx,
   int      *pnrow,
   int      **prowind
) ;
/*
   ---------------------------------------------------------------
   purpose --
     fill *pncol with the number of column
     if pcolind != NULL then
        fill *prowind with the base location of the column indices
     endif
 
   created -- 98may01, cca
   ---------------------------------------------------------------
*/
void
SubMtx_columnIndices (
   SubMtx   *mtx,
   int      *pncol,
   int      **pcolind
) ;
/*
   ---------------------------------
   purpose -- for dense storage
     *pnrow    with mtx->nrow
     *pncol    with mtx->ncol
     *pinc1    with row increment
     *pinc2    with column increment
     *pentries with mtx->entries
 
   created -- 98may01, cca
   ---------------------------------
*/
void
SubMtx_denseInfo (
   SubMtx     *mtx,
   int        *pnrow,
   int        *pncol,
   int        *pinc1,
   int        *pinc2,
   double     **pentries
) ;
/*
   ---------------------------------------------
   purpose -- for sparse rows, fill
     *pnrow    with # of rows
     *pnent    with # of indices
     *psizes   with sizes[] of rows
     *pindices with indices[] for column indices
     *pentries with entries[] for matrix entries
 
   created -- 98may01, cca
   ---------------------------------------------
*/
void
SubMtx_sparseRowsInfo (
   SubMtx     *mtx,
   int        *pnrow,
   int        *pnent,
   int        **psizes,
   int        **pindices,
   double     **pentries
) ;
/*
   ----------------------------------------------
   purpose -- for sparse columns, fill
     *pncol    with # of columns
     *pnent    with # of matrix entries
     *psizes   with sizes[ncol], column sizes
     *pindices with indices[nent], matrix row ids
     *pentries with entries[nent], matrix entries
 
   created -- 98may01, cca
   ----------------------------------------------
*/
void
SubMtx_sparseColumnsInfo (
   SubMtx     *mtx,
   int        *pncol,
   int        *pnent,
   int        **psizes,
   int        **pindices,
   double     **pentries
) ;
/*
   ----------------------------------------------------
   purpose -- for sparse triples, fill
     *pnent    with # of matrix entries
     *prowids  with rowids[nent], row ids of entries
     *prowids  with colids[nent], column ids of entries
     *pentries with entries[nent], matrix entries
 
   created -- 98may01, cca
   ----------------------------------------------------
*/
void
SubMtx_sparseTriplesInfo (
   SubMtx     *mtx,
   int        *pnent,
   int        **prowids,
   int        **pcolids,
   double     **pentries
) ;
/*
   -----------------------------------------------------------
   purpose -- for dense subrows, fill
     *pnrow      with # of rows
     *pnent      with # of matrix entries
     *pfirstlocs with firstlocs[nrow], column of first nonzero
     *psizes     with sizes[nrow], number of nonzero columns
     *pentries   with entries[nent], matrix entries
 
   created -- 98may01, cca
   -----------------------------------------------------------
*/
void
SubMtx_denseSubrowsInfo (
   SubMtx     *mtx,
   int        *pnrow,
   int        *pnent,
   int        **pfirstlocs,
   int        **psizes,
   double     **pentries
) ;
/*
   -----------------------------------------------------------
   purpose -- for dense subcolumns, fill
     *pncol      with # of columns
     *pnent      with # of matrix entries
     *pfirstlocs with firstlocs[ncol], row of first nonzero
     *psizes     with sizes[ncol], number of nonzero rows
     *pentries   with entries[nent], matrix entries
 
   created -- 98may01, cca
   -----------------------------------------------------------
*/
void
SubMtx_denseSubcolumnsInfo (
   SubMtx   *mtx,
   int      *pncol,
   int      *pnent,
   int      **pfirstlocs,
   int      **psizes,
   double   **pentries
) ;
/*
   ------------------------------------------------
   purpose -- for a diagonal matrix, fill
     *pncol      with # of columns
     *pentries   with entries[nent], matrix entries
 
   created -- 98may01, cca
   ------------------------------------------------
*/
void
SubMtx_diagonalInfo (
   SubMtx   *mtx,
   int      *pncol,
   double   **pentries
) ;
/*
   ------------------------------------------------------
   purpose -- for a block diagonal symmetric matrix, fill
     *pncol        with # of columns
     *pnent        with # of entries
     *ppivotsizes  with pivotsizes[ncol]
     *pentries     with entries[nent], matrix entries
 
   created -- 98may01, cca
   ------------------------------------------------------
*/
void
SubMtx_blockDiagonalInfo (
   SubMtx   *mtx,
   int      *pncol,
   int      *pnent,
   int      **ppivotsizes,
   double   **pentries
) ;
/*
   -------------------------------------------------------
   purpose -- to find matrix entry (irow,jcol) if present.
 
   return value --
     if entry (irow,jcol) is not present then
        *pValue is 0.0
        return value is -1
     else entry (irow,jcol) is present then
        *pValue is the matrix entry
        return value is offset into entries array
     endif
 
   created -- 98may01, cca
   -------------------------------------------------------
*/
int
SubMtx_realEntry (
   SubMtx   *mtx,
   int      irow,
   int      jcol,
   double   *pValue
) ;
/*
   -------------------------------------------------------
   purpose -- to find matrix entry (irow,jcol) if present.
 
   return value --
     if entry (irow,jcol) is not present then
        *pReal and *pImag are 0.0
        return value is -1
     else entry (irow,jcol) is present then
        (*pReal,*pImag) is the matrix entry
        return value is offset into entries array
     endif
 
   created -- 98may01, cca
   -------------------------------------------------------
*/
int
SubMtx_complexEntry (
   SubMtx   *mtx,
   int      irow,
   int      jcol,
   double   *pReal,
   double   *pImag
) ;
/*
   -------------------------------------------------
   purpose -- to return a pointer to the location of
               matrix entry (irow,jcol) if present.
 
   if entry (irow,jcol) is not present then
      *ppValue is NULL
   else entry (irow,jcol) is present then
      *ppValue is the location of the matrix entry
   endif
 
   created -- 98may01, cca
   -------------------------------------------------
*/
void
SubMtx_locationOfRealEntry (
   SubMtx   *mtx,
   int      irow,
   int      jcol,
   double   **ppValue
) ;
/*
   --------------------------------------------------------
   purpose -- to return a pointer to the location of
               matrix entry (irow,jcol) if present.
 
   if entry (irow,jcol) is not present then
      (*ppReal,*ppImag) is (NULL,NULL)
   else entry (irow,jcol) is present then
      (*ppReal,*ppImag) is the location of the matrix entry
   endif
 
   created -- 98may01, cca
   --------------------------------------------------------
*/
void
SubMtx_locationOfComplexEntry (
   SubMtx   *mtx,
   int      irow,
   int      jcol,
   double   **ppReal,
   double   **ppImag
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in init.c ------------------------------------------
------------------------------------------------------------------------
*/
/*
   ------------------------------------------------------------
   return the number of bytes needed for an object of this size
 
   created -- 98may01, cca
   ------------------------------------------------------------
*/
int
SubMtx_nbytesNeeded (
   int   type,
   int   mode,
   int   nrow,
   int   ncol,
   int   nent
) ;
/*
   ------------------------------------
   return the number of bytes in use in
   the workspace owned by this object
 
   created -- 98may01, cca
   ------------------------------------
*/
int
SubMtx_nbytesInUse (
   SubMtx   *mtx
) ;
/*
   ------------------------------------------------------
   return a pointer to the workspace owned by this object
 
   created -- 98may01, cca
   ------------------------------------------------------
*/
void *
SubMtx_workspace (
   SubMtx   *mtx
) ;
/*
   ----------------------------------------------------------------
  return the number of bytes in the workspace owned by this object
 
   created -- 98may01, cca
   ----------------------------------------------------------------
*/
int
SubMtx_nbytesInWorkspace (
   SubMtx   *mtx
) ;
/*
   -------------------------------------------------------------
   set the number of bytes in the workspace owned by this object
 
   created -- 98may01, cca
   -------------------------------------------------------------
*/
void
SubMtx_setNbytesInWorkspace (
   SubMtx   *mtx,
   int      nbytes
) ;
/*
   ---------------------------------------
   purpose -- set the fields of the object
 
   created -- 98may01, cca
   ---------------------------------------
*/
void
SubMtx_setFields (
   SubMtx   *mtx,
   int      type,
   int      mode,
   int      rowid,
   int      colid,
   int      nrow,
   int      ncol,
   int      nent
) ;
/*
   ----------------------------
   purpose -- basic initializer
 
   created -- 98may01, cca
   ----------------------------
*/
void
SubMtx_init (
   SubMtx   *mtx,
   int      type,
   int      mode,
   int      rowid,
   int      colid,
   int      nrow,
   int      ncol,
   int      nent
) ;
/*
   ---------------------------------------------------------
   purpose -- initialize the object from its working storage
              used when the object is a MPI message
 
   created -- 98may01, cca
   ---------------------------------------------------------
*/
void
SubMtx_initFromBuffer (
   SubMtx   *mtx
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in initRandom.c ------------------------------------
------------------------------------------------------------------------
*/
/*
   ------------------------------------------------
   purpose -- to initialize a matrix object with 
      random entries and possibly random structure.
 
   created -- 98feb16, cca
   ------------------------------------------------
*/
void
SubMtx_initRandom (
   SubMtx   *mtx,
   int      type,
   int      mode,
   int      rowid,
   int      colid,
   int      nrow,
   int      ncol,
   int      nent,
   int      seed
) ;
/*
   ------------------------------------------------
   purpose -- to initialize a matrix object with
      random entries in the upper triangle
 
   strict = 1 --> strict upper triangle
 
   created -- 98feb16, cca
   ------------------------------------------------
*/
void
SubMtx_initRandomUpperTriangle (
   SubMtx   *mtx,
   int      type,
   int      mode,
   int      rowid,
   int      colid,
   int      nrow,
   int      ncol,
   int      nent,
   int      seed,
   int      strict
) ;
/*
   ------------------------------------------------
   purpose -- to initialize a matrix object with
      random entries in the lower triangle
 
   strict = 1 --> strict lower triangle
 
   created -- 98feb16, cca
   ------------------------------------------------
*/
void
SubMtx_initRandomLowerTriangle (
   SubMtx   *mtx,
   int      type,
   int      mode,
   int      rowid,
   int      colid,
   int      nrow,
   int      ncol,
   int      nent,
   int      seed,
   int      strict
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in scalevec.c --------------------------------------
------------------------------------------------------------------------
*/
/*
   -----------------------------------
   purpose -- compute [y0] := A * [x0]
 
   created -- 98apr17, cca
   -----------------------------------
*/
void
SubMtx_scale1vec (
   SubMtx   *mtxA,
   double   y0[],
   double   x0[]
) ;
/*
   -------------------------------------
   purpose -- compute [y0 y1] := [x0 x1]
 
   created -- 98apr17, cca
   -------------------------------------
*/
void
SubMtx_scale2vec (
   SubMtx     *mtxA,
   double   y0[],
   double   y1[],
   double   x0[],
   double   x1[]
) ;
/*
   -----------------------------------------------
   purpose -- compute [y0 y1 y2] := A * [x0 x1 x2]
 
   created -- 98apr17, cca
   -----------------------------------------------
*/
void
SubMtx_scale3vec (
   SubMtx     *mtxA,
   double   y0[],
   double   y1[],
   double   y2[],
   double   x0[],
   double   x1[],
   double   x2[]
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in solve.c -----------------------------------------
------------------------------------------------------------------------
*/
/*
   -----------------------------------------------------------------
   purpose -- solve A X = B, 
      where 
        (1) X overwrites B
        (2) A must be lower or upper triangular, 
            diagonal or block diagonal
        (3) if A is strict lower or upper triangular,
            then we solve (I + A) X = B
        (4) columns(A) = rows(X)
        (5) rows(A)    = rows(B)
        (6) B has type SUBMTX_DENSE_COLUMNS
        (7) if A is SUBMTX_DENSE_SUBROWS or SUBMTX_SPARSE_ROWS
            then A must be strict lower triangular
        (8) if A is SUBMTX_DENSE_SUBCOLUMNS or SUBMTX_SPARSE_COLUMNS
            then A must be strict upper triangular
        (9) A can be SUBMTX_DIAGONAL, SUBMTX_BLOCK_DIAGONAL_SYM
            or SUBMTX_BLOCK_DIAGONAL_HERM
 
   created -- 98may01, cca
   -----------------------------------------------------------------
*/
void
SubMtx_solve (
   SubMtx   *mtxA,
   SubMtx   *mtxB
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in solveT.c ----------------------------------------
------------------------------------------------------------------------
*/
/*
   -----------------------------------------------------------------
   purpose -- solve (A^T + I) X = B, 
      where 
        (1) X overwrites B
        (2) A must be strict lower or upper triangular
        (3) columns(A) = rows(X)
        (4) rows(A)    = rows(B)
        (5) B has type SUBMTX_DENSE_COLUMNS
        (6) if A is SUBMTX_DENSE_SUBROWS or SUBMTX_SPARSE_ROWS
            then A must be strict lower triangular
        (7) if A is SUBMTX_DENSE_SUBCOLUMNS or SUBMTX_SPARSE_COLUMNS
            then A must be strict upper triangular
 
   created -- 98may01, cca
   -----------------------------------------------------------------
*/
void
SubMtx_solveT (
   SubMtx   *mtxA,
   SubMtx   *mtxB
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in solveH.c ----------------------------------------
------------------------------------------------------------------------
*/
/*
   -------------------------------------------------------------
   purpose -- solve (A^H + I) X = B,
      where
        (1) X overwrites B
        (2) A must be strict lower or upper triangular
        (2) A, B and X are complex
        (4) columns(A) = rows(X)
        (5) rows(A)    = rows(B)
        (6) B has mode SUBMTX_DENSE_COLUMNS
        (7) if A is SUBMTX_DENSE_SUBROWS or SUBMTX_SPARSE_ROWS
            then A must be strict lower triangular
        (8) if A is SUBMTX_DENSE_SUBCOLUMNS or SUBMTX_SPARSE_COLUMNS
            then A must be strict upper triangular
 
   created -- 98may01, cca
   -------------------------------------------------------------
*/
void
SubMtx_solveH (
   SubMtx   *mtxA,
   SubMtx   *mtxB
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in solveupd.c --------------------------------------
------------------------------------------------------------------------
*/
/*
   ----------------------------------------------------
   purpose -- perform the matrix-matrix multiply 
      Y := Y - A * X used in the forward and backsolves
      where
        (1) rows(A) \subseteq rows(Y)
        (2) rows(A) are local w.r.t. rows(Y)
        (3) cols(A) \subseteq rows(X)
        (4) cols(A) are local w.r.t. rows(X)
        (5) cols(Y) = cols(X)
        (6) Y and X have mode SUBMTX_DENSE_COLUMNS
 
   created -- 98may02, cca
   ----------------------------------------------------
*/
void
SubMtx_solveupd (
   SubMtx   *mtxY,
   SubMtx   *mtxA,
   SubMtx   *mtxX
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in solveupdT.c -------------------------------------
------------------------------------------------------------------------
*/
/*
   ------------------------------------------------------
   purpose -- perform the matrix-matrix multiply 
      Y := Y - A^T * X used in the forward and backsolves
      where
        (1) rows(A) \subseteq rows(Y)
        (2) rows(A) are local w.r.t. rows(Y)
        (3) cols(A) \subseteq rows(X)
        (4) cols(A) are local w.r.t. rows(X)
        (5) cols(Y) = cols(X)
        (6) Y and X have type SUBMTX_DENSE_COLUMNS
 
   created -- 98may02, cca
   -----------------------------------------------------
*/
void
SubMtx_solveupdT (
   SubMtx     *mtxY,
   SubMtx     *mtxA,
   SubMtx     *mtxX
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in solveupdH.c -------------------------------------
------------------------------------------------------------------------
*/
/*
   ------------------------------------------------------
   purpose -- perform the matrix-matrix multiply 
      Y := Y - A^H * X used in the forward and backsolves
      where
        (1) rows(A) \subseteq rows(Y)
        (2) rows(A) are local w.r.t. rows(Y)
        (3) cols(A) \subseteq rows(X)
        (4) cols(A) are local w.r.t. rows(X)
        (5) cols(Y) = cols(X)
        (6) Y and X have type SUBMTX_DENSE_COLUMNS
 
   created -- 98may02, cca
   -----------------------------------------------------
*/
void
SubMtx_solveupdH (
   SubMtx     *mtxY,
   SubMtx     *mtxA,
   SubMtx     *mtxX
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in sort.c ------------------------------------------
------------------------------------------------------------------------
*/
/*
   -----------------------------------------------------------
   purpose -- sort the rows of the matrix into ascending order
 
   created -- 98mar02, cca
   -----------------------------------------------------------
*/
void
SubMtx_sortRowsUp (
   SubMtx   *mtx
) ;
/*
   --------------------------------------------------------------
   purpose -- sort the columns of the matrix into ascending order
 
   created -- 98mar02, cca
   --------------------------------------------------------------
*/
void
SubMtx_sortColumnsUp (
   SubMtx   *mtx
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in util.c ------------------------------------------
------------------------------------------------------------------------
*/
/*
   -----------------------------------------
   purpose -- to fill rowDV with the entries
              in row irow of the matrix
 
   created -- 98may01, cca
   -----------------------------------------
*/
void
SubMtx_fillRowDV (
   SubMtx   *mtx,
   int      irow,
   DV       *rowDV
) ;
/*
   -----------------------------------------
   purpose -- to fill rowZV with the entries
              in row irow of the matrix
 
   created -- 98may01, cca
   -----------------------------------------
*/
void
SubMtx_fillRowZV (
   SubMtx   *mtx,
   int      irow,
   ZV       *rowZV
) ;
/*
   -----------------------------------------
   purpose -- to fill colDV with the entries
              in column icol of the matrix
 
   created -- 98may01, cca
   -----------------------------------------
*/
void
SubMtx_fillColumnDV (
   SubMtx   *mtx,
   int      icol,
   DV       *colDV
) ;
/*
   -----------------------------------------
   purpose -- to fill colZV with the entries
              in column icol of the matrix
 
   created -- 98may01, cca
   -----------------------------------------
*/
void
SubMtx_fillColumnZV (
   SubMtx   *mtx,
   int      icol,
   ZV       *colZV
) ;
/*
   ------------------------------------------------------
   purpose -- return the magnitude of the largest element
 
   created -- 98may01, cca
   ------------------------------------------------------
*/
double
SubMtx_maxabs (
   SubMtx   *mtx
) ;
/*
   -----------------------------------------
   purpose -- zero the entries in the matrix
 
   created -- 98may04, cca
   -----------------------------------------
*/
void
SubMtx_zero (
   SubMtx   *mtx
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in IO.c --------------------------------------------
------------------------------------------------------------------------
*/
/*
   --------------------------------------------------
   purpose -- to read in an SubMtx object from a file
 
   input --
 
      fn -- filename, must be *.submtxb or *.submtxf
 
   return value -- 1 if success, 0 if failure
 
   created -- 98feb15, cca
   --------------------------------------------------
*/
int
SubMtx_readFromFile (
   SubMtx   *mtx,
   char     *fn
) ;
/*
   -------------------------------------------------------
   purpose -- to read an SubMtx object from a formatted file
 
   return value -- 1 if success, 0 if failure
 
   created -- 96jun23, cca
   -------------------------------------------------------
*/
int
SubMtx_readFromFormattedFile (
   SubMtx    *mtx,
   FILE   *fp
) ;
/*
   ------------------------------------------------------
   purpose -- to read an SubMtx object from a binary file
 
   return value -- 1 if success, 0 if failure
 
   created -- 96jun23, cca
   ------------------------------------------------------
*/
int
SubMtx_readFromBinaryFile (
   SubMtx   *mtx,
   FILE     *fp
) ;
/*
   ----------------------------------------------
   purpose -- to write an SubMtx object to a file
 
   input --
 
      fn -- filename
        *.submtxb -- binary
        *.submtxf -- formatted
        anything else -- for human eye
 
   return value -- 1 if success, 0 otherwise
 
   created -- 96jun23, cca
   ----------------------------------------------
*/
int
SubMtx_writeToFile (
   SubMtx   *mtx,
   char     *fn
) ;
/*
   --------------------------------------------------------
   purpose -- to write an SubMtx object to a formatted file
 
   return value -- 1 if success, 0 otherwise
 
   created -- 96jun23, cca
   --------------------------------------------------------
*/
int
SubMtx_writeToFormattedFile (
   SubMtx   *mtx,
   FILE     *fp
) ;
/*
   -----------------------------------------------------
   purpose -- to write an SubMtx object to a binary file
 
   return value -- 1 if success, 0 otherwise
 
   created -- 96jun23, cca
   -----------------------------------------------------
*/
int
SubMtx_writeToBinaryFile (
   SubMtx   *mtx,
   FILE     *fp
) ;
/*
   -------------------------------------------------------
   purpose -- write a SubMtx object in human readable form
 
   created -- 98feb07, cca
   -------------------------------------------------------
*/
int
SubMtx_writeForHumanEye (
   SubMtx   *mtx,
   FILE     *fp
) ;
/*
   -------------------------------------------------------------------
   purpose -- write the header and scalar quantities for a SubMtx object
 
   created -- 98feb07, cca
   -------------------------------------------------------------------
*/
int
SubMtx_writeStats (
   SubMtx   *mtx,
   FILE   *fp
) ;
/*
   --------------------------------------------------
   purpose -- write the matrix entries out for matlab
 
   created -- 98feb07, cca
   --------------------------------------------------
*/
void
SubMtx_writeForMatlab (
   SubMtx   *mtx,
   char   *mtxname,
   FILE   *fp
) ;
/*--------------------------------------------------------------------*/


syntax highlighted by Code2HTML, v. 0.9.1