1*63c07aadSStefano Zampini 2*63c07aadSStefano Zampini #if !defined(_MHYPRE_H) 3*63c07aadSStefano Zampini #define _MHYPRE_H 4*63c07aadSStefano Zampini 5*63c07aadSStefano Zampini #include <HYPRE.h> 6*63c07aadSStefano Zampini #include <_hypre_IJ_mv.h> 7*63c07aadSStefano Zampini #include <HYPRE_IJ_mv.h> 8*63c07aadSStefano Zampini 9*63c07aadSStefano Zampini typedef struct { 10*63c07aadSStefano Zampini HYPRE_IJMatrix ij; 11*63c07aadSStefano Zampini HYPRE_IJVector x; 12*63c07aadSStefano Zampini HYPRE_IJVector b; 13*63c07aadSStefano Zampini MPI_Comm comm; 14*63c07aadSStefano Zampini } Mat_HYPRE; 15*63c07aadSStefano Zampini 16*63c07aadSStefano Zampini PETSC_EXTERN PetscErrorCode VecHYPRE_IJVectorCreate(Vec,HYPRE_IJVector*); 17*63c07aadSStefano Zampini PETSC_EXTERN PetscErrorCode VecHYPRE_IJVectorCopy(Vec,HYPRE_IJVector); 18*63c07aadSStefano Zampini 19*63c07aadSStefano Zampini /* 20*63c07aadSStefano Zampini Replaces the address where the HYPRE vector points to its data with the address of 21*63c07aadSStefano Zampini PETSc's data. Saves the old address so it can be reset when we are finished with it. 22*63c07aadSStefano Zampini Allows users to get the data into a HYPRE vector without the cost of memcopies 23*63c07aadSStefano Zampini */ 24*63c07aadSStefano Zampini #define HYPREReplacePointer(b,newvalue,savedvalue) { \ 25*63c07aadSStefano Zampini hypre_ParVector *par_vector = (hypre_ParVector*)hypre_IJVectorObject(((hypre_IJVector*)b)); \ 26*63c07aadSStefano Zampini hypre_Vector *local_vector = hypre_ParVectorLocalVector(par_vector); \ 27*63c07aadSStefano Zampini savedvalue = local_vector->data; \ 28*63c07aadSStefano Zampini local_vector->data = newvalue; \ 29*63c07aadSStefano Zampini } 30*63c07aadSStefano Zampini 31*63c07aadSStefano Zampini 32*63c07aadSStefano Zampini #endif 33