xref: /petsc/src/mat/impls/hypre/mhypre.h (revision 63c07aad33d943fe85193412d077a1746a7c55aa)
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