[petsc-users] Testing MatGetSubMatrices
Matthew Knepley
knepley at gmail.com
Tue Oct 20 10:58:46 CDT 2015
On Tue, Oct 20, 2015 at 10:53 AM, Bikash Kanungo <bikash at umich.edu> wrote:
> Hi,
>
> I was trying to perform a simple test on MatGetSubMatrices. I have an
> MPIDENSE matrix X which has been populated and assembled and another matrix
> XTemp of the same type and size. Since X is MPIDENSE in order to extract a
> sub-matrix from it, the IS must be sorted. This can be done easily through
> ISSort. Once the sub-matrix is obtained, I'm trying to set the values in
> XTemp by using the sorted IS as the global indices and the sub-matrix as
> the values to be set. Once XTemp is set and assembled, I evaluate XTemp - X
> and see if the norm of the resultant matrix is zero or not. The norm turned
> out to be as high as 1.0e6.
>
Make the problem very small (10 rows maybe) and starting printing things
out.
Matt
>
> I'm providing a simplified version of the code that performs the above
> test. Kindly let me know if I have done any mistake is designing the test.
>
>
> //
> // Given an initialized and assembled MPIDENSE Mat X and
> // an uninitialized MPIDENSE Mat XTemp of the same size as that of X
> //
> IS * ISRowIds, * ISColIds;
> PetscMalloc(1*sizeof(IS), &ISRowIds);
> PetscMalloc(1*sizeof(IS), &ISColIds);
>
> //
> // globalRowIds and globalColIds are STL vectors containing
> // the global node ids for which the sub-matrix from X need
> // to be extracted
> //
> const PetscInt * rowIdsPtr = globalRowIds.data();
> const PetscInt * colIdsPtr = globalColIds.data();
>
> ISCreateGeneral(PETSC_COMM_WORLD, globalRowIds.size(), rowIdsPtr,
> PETSC_COPY_VALUES, &ISRowIds[0]);
> ISCreateGeneral(PETSC_COMM_WORLD, globalColIds.size(), colIdsPtr,
> PETSC_COPY_VALUES, &ISColIds[0]);
> ISSort(ISRowIds[0]);
> ISSort(ISColIds[0]);
>
> Mat * subMat;
> MatGetSubMatrices(X, 1, ISRowIds, ISColIds, MAT_INITIAL_MATRIX,
> &subMat);
>
> PetscScalar * subMatValues;
> MatDenseGetArray(*subMat, &subMatValues);
>
> const PetscInt * rowIndicesSorted, * colIndicesSorted;
> ISGetIndices(ISRowIds[0], &rowIndicesSorted);
> ISGetIndices(ISColIds[0], &colIndicesSorted);
>
> MatSetValues(XTemp,
> globalRowIds.size(),
> rowIndicesSorted,
> globalColIds.size(),
> colIndicesSorted,
> subMatValues,
> INSERT_VALUES);
>
> //
> // commencing assembly
> //
> MatAssemblyBegin(XTemp,
> MAT_FINAL_ASSEMBLY);
>
> //
> // concluding assembly
> //
> MatAssemblyEnd(XTemp,
> MAT_FINAL_ASSEMBLY);
>
> MatAXPY(XTemp, -1.0, X, DIFFERENT_NONZERO_PATTERN);
> double diffNorm;
> MatNorm(XTemp, NORM_1, &diffNorm);
>
>
>
> Thanks,
> Bikash
> --
> Bikash S. Kanungo
> PhD Student
> Computational Materials Physics Group
> Mechanical Engineering
> University of Michigan
>
>
--
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20151020/4831e582/attachment.html>
More information about the petsc-users
mailing list