Actual source code: mhyp.c

  1: #define PETSCMAT_DLL

  3: /*
  4:     Creates hypre ijvector from PETSc vector
  5: */

 7:  #include src/mat/matimpl.h
  9: #include "HYPRE.h"
 10: #include "IJ_mv.h"

 13: PetscErrorCode MatHYPRE_IJMatrixCreate(Mat v,HYPRE_IJMatrix *ij)
 14: {
 16:   int rstart,rend,cstart,cend;
 17: 
 19:   MatGetOwnershipRange(v,&rstart,&rend);
 20:   cstart = v->cmap.rstart;
 21:   cend   = v->cmap.rend;
 22:   HYPRE_IJMatrixCreate(v->comm,rstart,rend-1,cstart,cend-1,ij);
 23:   HYPRE_IJMatrixSetObjectType(*ij,HYPRE_PARCSR);
 24:   return(0);
 25: }

 27: /*
 28:       Currently this only works with the MPIAIJ PETSc matrices to make
 29: the conversion efficient
 30: */
 31: /* #include "src/mat/impls/aij/mpi/mpiaij.h" */
 32: /*  Mat_MPIAIJ  *aij = (Mat_MPIAIJ *)v->data; */

 34: PetscErrorCode MatHYPRE_IJMatrixCopy(Mat v,HYPRE_IJMatrix ij)
 35: {
 36:   PetscErrorCode    ierr;
 37:   int               i,rstart,rend,ncols;
 38:   const PetscScalar *values;
 39:   const int         *cols;

 42:   HYPRE_IJMatrixInitialize(ij);
 43:   MatGetOwnershipRange(v,&rstart,&rend);
 44:   for (i=rstart; i<rend; i++) {
 45:     MatGetRow(v,i,&ncols,&cols,&values);
 46:     HYPRE_IJMatrixSetValues(ij,1,&ncols,&i,cols,values);
 47:     MatRestoreRow(v,i,&ncols,&cols,&values);
 48:   }
 49:   HYPRE_IJMatrixAssemble(ij);
 50:   return(0);
 51: }