added hypre_ParaSailsBuildIJMatrix
This commit is contained in:
parent
855000c729
commit
8d029da379
@ -19,6 +19,11 @@
|
|||||||
#include "Matrix.h"
|
#include "Matrix.h"
|
||||||
#include "ParaSails.h"
|
#include "ParaSails.h"
|
||||||
|
|
||||||
|
/* these includes required for hypre_ParaSailsIJMatrix */
|
||||||
|
#include "../../IJ_mv/HYPRE_IJ_mv.h"
|
||||||
|
#include "../../HYPRE.h"
|
||||||
|
#include "../../utilities/utilities.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
MPI_Comm comm;
|
MPI_Comm comm;
|
||||||
@ -313,3 +318,72 @@ int hypre_ParaSailsApplyTrans(hypre_ParaSails obj, double *u, double *v)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------
|
||||||
|
* hypre_ParaSailsIJMatrix - Return the IJ matrix which is the sparse
|
||||||
|
* approximate inverse (or its factor). This matrix is a copy of the
|
||||||
|
* matrix that is in ParaSails Matrix format.
|
||||||
|
*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
int
|
||||||
|
hypre_ParaSailsBuildIJMatrix(hypre_ParaSails obj, HYPRE_IJMatrix *pij_A)
|
||||||
|
{
|
||||||
|
hypre_ParaSails_struct *internal = (hypre_ParaSails_struct *) obj;
|
||||||
|
ParaSails *ps = internal->ps;
|
||||||
|
Matrix *mat = internal->ps->M;
|
||||||
|
|
||||||
|
int *diag_sizes, *offdiag_sizes, local_row, i, j;
|
||||||
|
int size;
|
||||||
|
int *col_inds;
|
||||||
|
double *values;
|
||||||
|
int ierr = 0;
|
||||||
|
|
||||||
|
ierr += HYPRE_IJMatrixCreate( ps->comm, ps->beg_row, ps->end_row,
|
||||||
|
ps->beg_row, ps->end_row,
|
||||||
|
pij_A );
|
||||||
|
|
||||||
|
ierr += HYPRE_IJMatrixSetObjectType( *pij_A, HYPRE_PARCSR );
|
||||||
|
|
||||||
|
diag_sizes = hypre_CTAlloc(int, ps->end_row - ps->beg_row + 1);
|
||||||
|
offdiag_sizes = hypre_CTAlloc(int, ps->end_row - ps->beg_row + 1);
|
||||||
|
local_row = 0;
|
||||||
|
for (i=ps->beg_row; i<= ps->end_row; i++)
|
||||||
|
{
|
||||||
|
MatrixGetRow(mat, local_row, &size, &col_inds, &values);
|
||||||
|
NumberingLocalToGlobal(ps->numb, size, col_inds, col_inds);
|
||||||
|
|
||||||
|
for (j=0; j < size; j++)
|
||||||
|
{
|
||||||
|
if (col_inds[j] < ps->beg_row || col_inds[j] > ps->end_row)
|
||||||
|
offdiag_sizes[local_row]++;
|
||||||
|
else
|
||||||
|
diag_sizes[local_row]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
local_row++;
|
||||||
|
}
|
||||||
|
ierr += HYPRE_IJMatrixSetDiagOffdSizes( *pij_A,
|
||||||
|
(const int *) diag_sizes,
|
||||||
|
(const int *) offdiag_sizes );
|
||||||
|
hypre_TFree(diag_sizes);
|
||||||
|
hypre_TFree(offdiag_sizes);
|
||||||
|
|
||||||
|
ierr = HYPRE_IJMatrixInitialize( *pij_A );
|
||||||
|
|
||||||
|
local_row = 0;
|
||||||
|
for (i=ps->beg_row; i<= ps->end_row; i++)
|
||||||
|
{
|
||||||
|
MatrixGetRow(mat, local_row, &size, &col_inds, &values);
|
||||||
|
|
||||||
|
ierr += HYPRE_IJMatrixSetValues( *pij_A, 1, &size, &i,
|
||||||
|
(const int *) col_inds,
|
||||||
|
(const double *) values );
|
||||||
|
|
||||||
|
NumberingGlobalToLocal(ps->numb, size, col_inds, col_inds);
|
||||||
|
|
||||||
|
local_row++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ierr += HYPRE_IJMatrixAssemble( *pij_A );
|
||||||
|
|
||||||
|
return ierr;
|
||||||
|
}
|
||||||
|
|||||||
@ -13,6 +13,7 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "HYPRE_distributed_matrix_protos.h"
|
#include "HYPRE_distributed_matrix_protos.h"
|
||||||
|
#include "../../IJ_mv/HYPRE_IJ_mv.h"
|
||||||
|
|
||||||
typedef void *hypre_ParaSails;
|
typedef void *hypre_ParaSails;
|
||||||
|
|
||||||
@ -29,3 +30,5 @@ int hypre_ParaSailsSetupValues(hypre_ParaSails obj,
|
|||||||
int logging);
|
int logging);
|
||||||
int hypre_ParaSailsApply(hypre_ParaSails ps, double *u, double *v);
|
int hypre_ParaSailsApply(hypre_ParaSails ps, double *u, double *v);
|
||||||
int hypre_ParaSailsApplyTrans(hypre_ParaSails ps, double *u, double *v);
|
int hypre_ParaSailsApplyTrans(hypre_ParaSails ps, double *u, double *v);
|
||||||
|
int hypre_ParaSailsBuildIJMatrix(hypre_ParaSails obj, HYPRE_IJMatrix *pij_A);
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user