hypre/distributed_matrix/distributed_matrix_ISIS.cc
cleary 7ccba6f54e Kludged problems with mixing C and C++ by just copying .cc to .c and
making it C compatible. Must be revisited when we go back to working
with ISIS.
1999-04-02 02:06:55 +00:00

193 lines
4.5 KiB
C++

/* THIS IS A C++ FILE, since it needs to call ISIS++ with objects */
#ifdef ISIS_AVAILABLE
#include "iostream.h"
#include "RowMatrix.h" // ISIS++ header file
#endif
#include "./distributed_matrix.h"
#ifdef ISIS_AVAILABLE
extern "C" {
typedef struct
{
int *ind;
double *val;
}
RowBuf;
#endif
/*--------------------------------------------------------------------------
* hypre_InitializeDistributedMatrixISIS
*--------------------------------------------------------------------------*/
/* matrix must be set before calling this function*/
int
hypre_InitializeDistributedMatrixISIS(hypre_DistributedMatrix *dm)
{
#ifdef ISIS_AVAILABLE
RowMatrix *mat = (RowMatrix *) hypre_DistributedMatrixLocalStorage(dm);
const Map& map = mat->getMap();
int num_rows = mat->getMap().n();
int num_cols = mat->getMap().n();
hypre_DistributedMatrixM(dm) = num_rows;
hypre_DistributedMatrixN(dm) = num_cols;
/* allocate space for row buffers */
RowBuf *rowbuf = new RowBuf;
rowbuf->ind = new int[num_cols];
rowbuf->val = new double[num_cols];
dm->auxiliary_data = (void *) rowbuf;
#endif
return 0;
}
/*--------------------------------------------------------------------------
* hypre_FreeDistributedMatrixISIS
*--------------------------------------------------------------------------*/
int
hypre_FreeDistributedMatrixISIS( hypre_DistributedMatrix *dm)
{
#ifdef ISIS_AVAILABLE
RowBuf *rowbuf = (RowBuf *) dm->auxiliary_data;
delete rowbuf->ind;
delete rowbuf->val;
delete rowbuf;
#endif
return 0;
}
/*--------------------------------------------------------------------------
* hypre_PrintDistributedMatrixISIS
*--------------------------------------------------------------------------*/
int
hypre_PrintDistributedMatrixISIS( hypre_DistributedMatrix *matrix )
{
#ifdef ISIS_AVAILABLE
cout << "hypre_PrintDistributedMatrixISIS not implemented" << endl;
#endif
return -1;
}
/*--------------------------------------------------------------------------
* hypre_GetDistributedMatrixLocalRangeISIS
*--------------------------------------------------------------------------*/
int
hypre_GetDistributedMatrixLocalRangeISIS( hypre_DistributedMatrix *dm,
int *start,
int *end )
{
#ifdef ISIS_AVAILABLE
RowMatrix *mat = (RowMatrix *) hypre_DistributedMatrixLocalStorage(dm);
*start = mat->getMap().startRow() - 1; // convert to 0-based
*end = mat->getMap().endRow(); // endRow actually returns 1 less
cout << "LocalRangeISIS " << *start << " " << *end << endl;
#endif
return 0;
}
/*--------------------------------------------------------------------------
* hypre_GetDistributedMatrixRowISIS
*--------------------------------------------------------------------------*/
/* semantics: buffers returned will be overwritten on next call to
// this get function */
int
hypre_GetDistributedMatrixRowISIS( hypre_DistributedMatrix *dm,
int row,
int *size,
int **col_ind,
double **values )
{
#ifdef ISIS_AVAILABLE
RowMatrix *mat = (RowMatrix *) hypre_DistributedMatrixLocalStorage(dm);
RowBuf *rowbuf;
int i, temp;
rowbuf = (RowBuf *) dm->auxiliary_data;
mat->getRow(row+1, temp, rowbuf->val, rowbuf->ind);
#if 0
// add diagonal element if necessary
{
int *p;
int found = 0;
for (i=0, p=rowbuf->ind; i<temp; i++, p++)
{
if (*p == row+1)
found = 1;
}
if (!found)
{
rowbuf->ind[temp] = row+1;
rowbuf->val[temp] = 1.; // pick a value
temp++;
}
}
#endif
// set pointers to local buffers
if (col_ind != NULL)
{
int *p;
*size = temp;
*col_ind = rowbuf->ind;
// need to convert to 0-based indexing for output
for (i=0, p=*col_ind; i<temp; i++, p++)
(*p)--;
}
if (values != NULL)
{
*values = rowbuf->val;
*size = temp;
}
#endif
return 0;
}
/*--------------------------------------------------------------------------
* hypre_RestoreDistributedMatrixRowISIS
*--------------------------------------------------------------------------*/
int
hypre_RestoreDistributedMatrixRowISIS( hypre_DistributedMatrix *dm,
int row,
int *size,
int **col_ind,
double **values )
{
/* does nothing, since we use local buffers */
return 0;
}
#ifdef ISIS_AVAILABLE
} // extern "C"
#endif