The following example code illustrates the basic usage of the
IJ
interface for building vectors:
TheMPI_Comm comm; HYPRE_IJVector ij_vector; HYPRE_ParVector par_vector; int jlower, jupper; int nvalues; int *indices; double *values; HYPRE_IJVectorCreate(comm, jlower, jupper, &ij_vector); HYPRE_IJVectorSetObjectType(ij_vector, HYPRE_PARCSR); HYPRE_IJVectorInitialize(ij_vector); /* set vector values */ HYPRE_IJVectorSetValues(ij_vector, nvalues, indices, values); ... HYPRE_IJVectorAssemble(ij_vector); HYPRE_IJVectorGetObject(ij_vector, (void **) &par_vector);
Create()
routine creates an empty vector object that lives
on the comm
communicator. This is a collective call, with each
process passing its own index extents, jlower
and
jupper
. The names of these extent parameters begin with a
j
because we typically think of matrix-vector multiplies as
the fundamental operation involving both matrices and vectors. For
matrix-vector multiplies, the vector partitioning should match the
column partitioning of the matrix (which also uses the j
notation). For linear system solves, these extents will typically
match the row partitioning of the matrix as well.
The SetObjectType()
routine sets the underlying vector storage
type to HYPRE_PARCSR
(this is the only storage type currently
supported). The Initialize()
routine indicates that the vector
coefficients (or values) are ready to be set. This routine may or may
not involve the allocation of memory for the coefficient data,
depending on the implementation.
The SetValues()
routine sets the vector values
for some
number (nvalues
) of indices
. Each process should set
only those vector values that it ``owns'' in the data distribution.
The Assemble()
routine is a trivial collective call, and
finalizes the vector assembly, making the vector ``ready to use''.
The GetObject()
routine retrieves the built vector object so
that it can be passed on to HYPRE solvers that use the
ParVector
internal storage format.
Vector values can be modified in much the same way as with matrices by
first re-initializing the vector with the Initialize()
routine.