/* DenseMtx */
#include "../cfiles.h"
#include "../Drand.h"
#include "../A2.h"
/*--------------------------------------------------------------------*/
/*
-------------------------------------------------------------------
this object handles a dense real and complex matrix.
type -- type of entries
1 -- real
2 -- complex
rowid -- id for the rows in this matrix
colid -- id for the columns in this matrix
nrow -- # of rows in the matrix
ncol -- # of columns in the matrix
inc1 -- row increment for the entries
inc2 -- column increment for the entries
rowind -- pointer to row indices
colind -- pointer to column indices
entries -- pointer to matrix entries
wrkDV -- DV object to manage workspace
next -- pointer to next DenseMtx object in a singly linked list
-------------------------------------------------------------------
*/
typedef struct _DenseMtx DenseMtx ;
struct _DenseMtx {
int type ;
int rowid ;
int colid ;
int nrow ;
int ncol ;
int inc1 ;
int inc2 ;
int *rowind ;
int *colind ;
double *entries ;
DV wrkDV ;
DenseMtx *next ;
} ;
#define DENSEMTX_IS_REAL(mtx) ((mtx)->type == SPOOLES_REAL)
#define DENSEMTX_IS_COMPLEX(mtx) ((mtx)->type == SPOOLES_COMPLEX)
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in basics.c ----------------------------------------
------------------------------------------------------------------------
*/
/*
-----------------------
simplest constructor
created -- 98may02, cca
-----------------------
*/
DenseMtx *
DenseMtx_new (
void
) ;
/*
-----------------------
set the default fields
created -- 98may02, cca
-----------------------
*/
void
DenseMtx_setDefaultFields (
DenseMtx *mtx
) ;
/*
--------------------------------------------------
clear the data fields, releasing allocated storage
created -- 98may02, cca
--------------------------------------------------
*/
void
DenseMtx_clearData (
DenseMtx *mtx
) ;
/*
------------------------------------------
destructor, free's the object and its data
created -- 98may02, cca
------------------------------------------
*/
void
DenseMtx_free (
DenseMtx *mtx
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in instance.c --------------------------------------
------------------------------------------------------------------------
*/
/*
-------------------------------
return the row id of the object
created -- 98may02, cca
-------------------------------
*/
int
DenseMtx_rowid (
DenseMtx *mtx
) ;
/*
----------------------------------
return the column id of the object
created -- 98may02, cca
----------------------------------
*/
int
DenseMtx_colid (
DenseMtx *mtx
) ;
/*
------------------------------------------
fill *pnrow with nrow and *pncol with ncol
created -- 98may02, cca
------------------------------------------
*/
void
DenseMtx_dimensions (
DenseMtx *mtx,
int *pnrow,
int *pncol
) ;
/*
------------------------
return the row increment
created -- 98may02, cca
------------------------
*/
int
DenseMtx_rowIncrement (
DenseMtx *mtx
) ;
/*
---------------------------
return the column increment
created -- 98may02, cca
---------------------------
*/
int
DenseMtx_columnIncrement (
DenseMtx *mtx
) ;
/*
-------------------------------------------
fill *pnrow with nrow, *prowind with rowind
created -- 98may02, cca
-------------------------------------------
*/
void
DenseMtx_rowIndices (
DenseMtx *mtx,
int *pnrow,
int **prowind
) ;
/*
-------------------------------------------
fill *pncol with ncol, *pcolind with colind
created -- 98may02, cca
-------------------------------------------
*/
void
DenseMtx_columnIndices (
DenseMtx *mtx,
int *pncol,
int **pcolind
) ;
/*
--------------------------------------------
fill *pentries with a pointer to the entries
created -- 98may02, cca
--------------------------------------------
*/
double *
DenseMtx_entries(
DenseMtx *mtx
) ;
/*
---------------------------------
return a pointer to the workspace
created -- 98may02, cca
---------------------------------
*/
void *
DenseMtx_workspace(
DenseMtx *mtx
) ;
/*
------------------------------------------
fill *pValue with the entry in (irow,jcol)
created -- 98jun05, cca
------------------------------------------
*/
void
DenseMtx_realEntry (
DenseMtx *mtx,
int irow,
int jcol,
double *pValue
) ;
/*
----------------------------------------------------
fill *pReal and *pImag with the entry in (irow,jcol)
created -- 98jun05, cca
----------------------------------------------------
*/
void
DenseMtx_complexEntry (
DenseMtx *mtx,
int irow,
int jcol,
double *pReal,
double *pImag
) ;
/*
------------------------------
set entry (irow,jcol) to value
created -- 98jun05, cca
------------------------------
*/
void
DenseMtx_setRealEntry (
DenseMtx *mtx,
int irow,
int jcol,
double value
) ;
/*
------------------------------------
set entry (irow,jcol) to (real,imag)
created -- 98jun05, cca
------------------------------------
*/
void
DenseMtx_setComplexEntry (
DenseMtx *mtx,
int irow,
int jcol,
double real,
double imag
) ;
/*
----------------------------------------------------------
purpose -- fill *prowent with the base address of row irow
return values --
1 -- normal return
-1 -- mtx is NULL
-2 -- invalid type for mtx
-3 -- irow is invalid
-4 -- prowent is NULL
created -- 98nov11, cca
----------------------------------------------------------
*/
int
DenseMtx_row (
DenseMtx *mtx,
int irow,
double **prowent
) ;
/*
-------------------------------------------------------------
purpose -- fill *pcolent with the base address of column jcol
return values --
1 -- normal return
-1 -- mtx is NULL
-2 -- invalid type for mtx
-3 -- jcol is invalid
-4 -- pcolent is NULL
created -- 98nov11, cca
-------------------------------------------------------------
*/
int
DenseMtx_column (
DenseMtx *mtx,
int jcol,
double **pcolent
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in init.c ------------------------------------------
------------------------------------------------------------------------
*/
/*
------------------------------------------------------------
return the number of bytes needed for an object of this size
created -- 98may02, cca
------------------------------------------------------------
*/
int
DenseMtx_nbytesNeeded (
int type,
int nrow,
int ncol
) ;
/*
----------------------------------------------------------------
return the number of bytes in the workspace owned by this object
created -- 98may02, cca
----------------------------------------------------------------
*/
int
DenseMtx_nbytesInWorkspace (
DenseMtx *mtx
) ;
/*
-------------------------------------------------------------
set the number of bytes in the workspace owned by this object
created -- 98may02, cca
-------------------------------------------------------------
*/
void
DenseMtx_setNbytesInWorkspace (
DenseMtx *mtx,
int nbytes
) ;
/*
---------------------------------------
purpose -- set the fields of the object
created -- 98may02, cca
---------------------------------------
*/
void
DenseMtx_setFields (
DenseMtx *mtx,
int type,
int rowid,
int colid,
int nrow,
int ncol,
int inc1,
int inc2
) ;
/*
----------------------------
purpose -- basic initializer
created -- 98may02, cca
----------------------------
*/
void
DenseMtx_init (
DenseMtx *mtx,
int type,
int rowid,
int colid,
int nrow,
int ncol,
int inc1,
int inc2
) ;
/*
---------------------------------------------------------
purpose -- initialize the object from its working storage
used when the object is a MPI message
created -- 98may02, cca
---------------------------------------------------------
*/
void
DenseMtx_initFromBuffer (
DenseMtx *mtx
) ;
/*
------------------------------------
purpose -- initializer with pointers
created -- 98may02, cca
------------------------------------
*/
void
DenseMtx_initWithPointers (
DenseMtx *mtx,
int type,
int rowid,
int colid,
int nrow,
int ncol,
int inc1,
int inc2,
int *rowind,
int *colind,
double *entries
) ;
/*
-----------------------------------
this method initializes a A2 object
to point into the entries
created -- 98may02, cca
-----------------------------------
*/
void
DenseMtx_setA2 (
DenseMtx *mtx,
A2 *a2
) ;
/*
----------------------------------------------------------------
purpose -- initialize as a submatrix of another DenseMtx object.
B = A(firstrow:lastrow, firstcol:lastcol)
note, B only points into the storage of A.
return values --
1 -- normal return
-1 -- B is NULL
-2 -- A is NULL
-3 -- A has invalid type
-4 -- requested rows are invalid
-5 -- requested columns are invalid
created -- 98nov11, cca
----------------------------------------------------------------
*/
int
DenseMtx_initAsSubmatrix (
DenseMtx *B,
DenseMtx *A,
int firstrow,
int lastrow,
int firstcol,
int lastcol
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in IO.c --------------------------------------------
------------------------------------------------------------------------
*/
/*
-----------------------------------------------------------
purpose -- to read in the object from a file
input --
fn -- filename, must be *.densemtxb or *.densemtxf
return value -- 1 if success, 0 if failure
created -- 98aug13
-----------------------------------------------------------
*/
int
DenseMtx_readFromFile (
DenseMtx *mtx,
char *fn
) ;
/*
--------------------------------------------------
purpose -- to read an object from a formatted file
return value -- 1 if success, 0 if failure
created -- 98aug13
--------------------------------------------------
*/
int
DenseMtx_readFromFormattedFile (
DenseMtx *mtx,
FILE *fp
) ;
/*
-----------------------------------------------
purpose -- to read an object from a binary file
return value -- 1 if success, 0 if failure
created -- 98aug13
-----------------------------------------------
*/
int
DenseMtx_readFromBinaryFile (
DenseMtx *mtx,
FILE *fp
) ;
/*
---------------------------------------
purpose -- to write an object to a file
input --
fn -- filename
*.densemtxb -- binary
*.densemtxf -- formatted
anything else -- for human eye
error return --
1 -- normal return
-1 -- mtx is NULL
-2 -- fn is NULL
-3 -- unable to open file
created -- 98aug13
---------------------------------------
*/
int
DenseMtx_writeToFile (
DenseMtx *mtx,
char *fn
) ;
/*
-------------------------------------------------
purpose -- to write an object to a formatted file
return value --
1 -- normal return
-1 -- mtx is NULL
-2 -- fn is NULL
created -- 98aug13
-------------------------------------------------
*/
int
DenseMtx_writeToFormattedFile (
DenseMtx *mtx,
FILE *fp
) ;
/*
--------------------------------------------------------
purpose -- to write an adjacency object to a binary file
return value --
1 -- normal return
-1 -- mtx is NULL
-2 -- fn is NULL
created -- 98aug13
--------------------------------------------------------
*/
int
DenseMtx_writeToBinaryFile (
DenseMtx *mtx,
FILE *fp
) ;
/*
-----------------------------------------------------
purpose -- to write the object's statistics to a file
in human readable form
return value --
1 -- normal return
-1 -- mtx is NULL
-2 -- fp is NULL
created -- 98may02, cca
-----------------------------------------------------
*/
int
DenseMtx_writeStats (
DenseMtx *mtx,
FILE *fp
) ;
/*
----------------------------------------
purpose -- to write the object to a file
in human readable form
return value --
1 -- normal return
-1 -- mtx is NULL
-2 -- fp is NULL
created -- 98may02, cca
----------------------------------------
*/
int
DenseMtx_writeForHumanEye (
DenseMtx *mtx,
FILE *fp
) ;
/*
-----------------------------------------------
purpose -- to write the object to a matlab file
return value --
1 -- normal return
-1 -- mtx is NULL
-2 -- mtx is NULL
-3 -- fp is NULL
created -- 98may02, cca
-----------------------------------------------
*/
int
DenseMtx_writeForMatlab (
DenseMtx *mtx,
char *mtxname,
FILE *fp
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in permute.c ---------------------------------------
------------------------------------------------------------------------
*/
/*
-------------------------------------------
purpose -- to permute the rows of an object
created -- 98may02, cca
-------------------------------------------
*/
void
DenseMtx_permuteRows (
DenseMtx *mtx,
IV *oldToNewIV
) ;
/*
----------------------------------------------
purpose -- to permute the columns of an object
created -- 98may02, cca
----------------------------------------------
*/
void
DenseMtx_permuteColumns (
DenseMtx *mtx,
IV *oldToNewIV
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in util.c ------------------------------------------
------------------------------------------------------------------------
*/
/*
---------------------------------------------------------
sort the rows so the row ids are in ascending order
sort the columns so the column ids are in ascending order
created -- 98may02, cca
---------------------------------------------------------
*/
void
DenseMtx_sort (
DenseMtx *mtx
) ;
/*
-----------------------------------------------
copy row irowA from mtxA into row irowB in mtxB
created -- 98may02, cca
-----------------------------------------------
*/
void
DenseMtx_copyRow (
DenseMtx *mtxB,
int irowB,
DenseMtx *mtxA,
int irowA
) ;
/*
---------------------------------------------------------------
copy row irowA from mtxA into row irowB in mtxB
and copy row index irowB from mtxB into row index irowA of mtxA
created -- 98aug12, cca
---------------------------------------------------------------
*/
void
DenseMtx_copyRowAndIndex (
DenseMtx *mtxB,
int irowB,
DenseMtx *mtxA,
int irowA
) ;
/*
----------------------------------------------
add row irowA from mtxA into row irowB in mtxB
created -- 98aug12, cca
----------------------------------------------
*/
void
DenseMtx_addRow (
DenseMtx *mtxB,
int irowB,
DenseMtx *mtxA,
int irowA
) ;
/*
-----------------------
zero the entries
created -- 98may16, cca
-----------------------
*/
void
DenseMtx_zero (
DenseMtx *mtx
) ;
/*
------------------------
fill with random entries
created -- 98may16, cca
------------------------
*/
void
DenseMtx_fillRandomEntries (
DenseMtx *mtx,
Drand *drand
) ;
/*
-----------------------------------
compute three checksums
sums[0] = sum of row indices
sums[1] = sum of columns indices
sums[2] = sum of entry magnitudes
created -- 98may16, cca
-----------------------------------
*/
void
DenseMtx_checksums (
DenseMtx *mtx,
double sums[]
) ;
/*
-------------------------------------------
return the maximum magnitude of the entries
created -- 98may15, cca
-------------------------------------------
*/
double
DenseMtx_maxabs (
DenseMtx *mtx
) ;
/*
--------------------------------------------
subtract one matrix from another, B := B - A
created -- 98may25, cca
--------------------------------------------
*/
void
DenseMtx_sub (
DenseMtx *mtxB,
DenseMtx *mtxA
) ;
/*
----------------------------------------------------
purpose -- to copy a row of the matrix into a vector
irow -- local row id
vec -- double vector to receive the row entries
created -- 98jul31, cca
----------------------------------------------------
*/
void
DenseMtx_copyRowIntoVector (
DenseMtx *mtx,
int irow,
double *vec
) ;
/*
----------------------------------------------------
purpose -- to copy a row of the matrix into a vector
irow -- local row id
vec -- double vector to supply the row entries
created -- 98jul31, cca
----------------------------------------------------
*/
void
DenseMtx_copyVectorIntoRow (
DenseMtx *mtx,
int irow,
double *vec
) ;
/*
----------------------------------------------------
purpose -- to add a row of the matrix into a vector
irow -- local row id
vec -- double vector to supply the row entries
created -- 98aug12, cca
----------------------------------------------------
*/
void
DenseMtx_addVectorIntoRow (
DenseMtx *mtx,
int irow,
double *vec
) ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------------
----- methods found in scale.c -----------------------------------------
------------------------------------------------------------------------
*/
/*
-----------------------------------------------------
purpose -- to scale a dense matrix object by a scalar
A := alpha * A ;
return values ---
1 -- normal return
-1 -- A is NULL
-2 -- A has invalid type
-3 -- alpha is NULL
created -- 98nov06, cca
-----------------------------------------------------
*/
int
DenseMtx_scale (
DenseMtx *A,
double alpha[]
) ;
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1