163c07aadSStefano Zampini 263c07aadSStefano Zampini #if !defined(_MHYPRE_H) 363c07aadSStefano Zampini #define _MHYPRE_H 463c07aadSStefano Zampini 563c07aadSStefano Zampini #include <HYPRE.h> 663c07aadSStefano Zampini #include <_hypre_IJ_mv.h> 763c07aadSStefano Zampini #include <HYPRE_IJ_mv.h> 863c07aadSStefano Zampini 963c07aadSStefano Zampini typedef struct { 1063c07aadSStefano Zampini HYPRE_IJMatrix ij; 1163c07aadSStefano Zampini HYPRE_IJVector x; 1263c07aadSStefano Zampini HYPRE_IJVector b; 1363c07aadSStefano Zampini MPI_Comm comm; 14*978814f1SStefano Zampini PetscBool inner_free; 1563c07aadSStefano Zampini } Mat_HYPRE; 1663c07aadSStefano Zampini 1763c07aadSStefano Zampini PETSC_EXTERN PetscErrorCode VecHYPRE_IJVectorCreate(Vec,HYPRE_IJVector*); 1863c07aadSStefano Zampini PETSC_EXTERN PetscErrorCode VecHYPRE_IJVectorCopy(Vec,HYPRE_IJVector); 1963c07aadSStefano Zampini 2063c07aadSStefano Zampini /* 2163c07aadSStefano Zampini Replaces the address where the HYPRE vector points to its data with the address of 2263c07aadSStefano Zampini PETSc's data. Saves the old address so it can be reset when we are finished with it. 2363c07aadSStefano Zampini Allows users to get the data into a HYPRE vector without the cost of memcopies 2463c07aadSStefano Zampini */ 2563c07aadSStefano Zampini #define HYPREReplacePointer(b,newvalue,savedvalue) { \ 2663c07aadSStefano Zampini hypre_ParVector *par_vector = (hypre_ParVector*)hypre_IJVectorObject(((hypre_IJVector*)b)); \ 2763c07aadSStefano Zampini hypre_Vector *local_vector = hypre_ParVectorLocalVector(par_vector); \ 2863c07aadSStefano Zampini savedvalue = local_vector->data; \ 2963c07aadSStefano Zampini local_vector->data = newvalue; \ 3063c07aadSStefano Zampini } 3163c07aadSStefano Zampini 3263c07aadSStefano Zampini 3363c07aadSStefano Zampini #endif 34