27 #define moab_hypre_assert( a, b ) \
30 #define moab_hypre_assert_t( a, b ) \
34 std::cout << "HYPRE Error: " << b << std::endl; \
41 initialized =
size = gsize = rstart = rend = 0;
48 : rstart( p_irstart ), rend( p_irend ), pcomm( p_comm )
50 HYPRE_IJVectorCreate( pcomm->comm(), rstart, rend, &x );
51 HYPRE_IJVectorSetObjectType( x, HYPRE_PARCSR );
52 HYPRE_IJVectorInitialize( x );
53 HYPRE_IJVectorAssemble( x );
54 HYPRE_IJVectorGetObject( x, (
void**)&x_par );
61 HypreParVector::HypreParVector(
const HypreParVector& y )
68 HYPRE_IJVectorCreate( pcomm->comm(), y.rstart, y.rend, &x );
69 HYPRE_IJVectorSetObjectType( x, HYPRE_PARCSR );
70 HYPRE_IJVectorInitialize( x );
71 HYPRE_IJVectorAssemble( x );
72 HYPRE_IJVectorGetObject( x, (
void**)&x_par );
73 HYPRE_Complex* array = NULL;
74 HYPRE_IJVectorGetValues( y.x, y.size, NULL, array );
75 HYPRE_IJVectorSetValues( x,
size, NULL, array );
81 HypreParVector::HypreParVector( HypreParMatrix& A,
int tr )
83 pcomm = A.GetParallelCommunicator();
93 HYPRE_IJVectorCreate( pcomm->comm(), part[0], part[1], &x );
94 HYPRE_IJVectorSetObjectType( x, HYPRE_PARCSR );
95 HYPRE_IJVectorInitialize( x );
96 HYPRE_IJVectorAssemble( x );
97 HYPRE_IJVectorGetObject( x, (
void**)&x_par );
109 size = rstart - rend;
114 HypreParVector::operator HYPRE_IJVector()
const
120 HypreParVector::operator HYPRE_ParVector()
const
126 HypreParVector& HypreParVector::operator=(
double d )
128 hypre_ParVectorSetConstantValues( x_par, d );
132 HypreParVector& HypreParVector::operator=(
const HypreParVector& y )
136 if( this->GlobalSize() != y.GlobalSize() )
138 MB_SET_ERR_RET_VAL(
"HypreParVector::operator failed. Incompatible vector sizes", *
this );
149 HYPRE_IJVectorDestroy( x );
155 initialized = y.initialized;
159 HYPRE_Int HypreParVector::resize( HYPRE_Int , HYPRE_Int p_irstart, HYPRE_Int p_irend )
161 if( initialized || x != NULL )
MB_SET_ERR_RET_VAL(
"Vector is already initialized and partitioned", -1 );
163 HYPRE_IJVectorCreate( this->pcomm->comm(), p_irstart, p_irend, &x );
164 HYPRE_IJVectorSetObjectType( x, HYPRE_PARCSR );
165 HYPRE_IJVectorInitialize( x );
166 HYPRE_IJVectorAssemble( x );
167 HYPRE_IJVectorGetObject( x, (
void**)&x_par );
170 size = rstart - rend;
176 HYPRE_Int HypreParVector::SetData( HYPRE_Complex* p_data, HYPRE_Int* p_col )
178 return HYPRE_IJVectorSetValues( x,
size, p_col, p_data );
181 HYPRE_Int HypreParVector::AddData( HYPRE_Complex* p_data, HYPRE_Int* p_col )
183 return HYPRE_IJVectorAddToValues( x,
size, p_col, p_data );
186 HYPRE_Int HypreParVector::GetValues(
const int ndata,
const HYPRE_Int* indices, HYPRE_Complex*
const _data )
const
188 return HYPRE_IJVectorGetValues( x, ndata, indices, _data );
191 HYPRE_Int HypreParVector::SetValues(
const int ndata,
const HYPRE_Int* indices,
const HYPRE_Complex*
const _data )
193 return HYPRE_IJVectorSetValues( x, ndata, indices, _data );
196 HYPRE_Int HypreParVector::AddValues(
const int ndata,
const HYPRE_Int* indices,
const HYPRE_Complex*
const _data )
198 return HYPRE_IJVectorAddToValues( x, ndata, indices, _data );
201 HYPRE_Int HypreParVector::GetValue( HYPRE_Int index, HYPRE_Complex*
const _data )
const
203 return HYPRE_IJVectorGetValues( x, 1, &index, _data );
206 HYPRE_Int HypreParVector::SetValue(
const HYPRE_Int index,
const HYPRE_Complex _data )
208 return HYPRE_IJVectorSetValues( x, 1, &index, &_data );
211 HYPRE_Int HypreParVector::AddValue(
const HYPRE_Int index,
const HYPRE_Complex _data )
213 return HYPRE_IJVectorAddToValues( x, 1, &index, &_data );
216 HYPRE_Int HypreParVector::FinalizeAssembly()
218 return HYPRE_IJVectorAssemble( x );
221 HYPRE_Int HypreParVector::verbosity(
const HYPRE_Int level )
223 return HYPRE_IJVectorSetPrintLevel( x, level );
226 void HypreParVector::Print(
const char* fname )
const
228 HYPRE_IJVectorPrint( x, fname );
231 HypreParVector::~HypreParVector()
235 HYPRE_IJVectorDestroy( x );
239 double HypreParVector::InnerProduct( HypreParVector& x, HypreParVector& y )
241 return hypre_ParVectorInnerProd( x.x_par, y.x_par );