[petsc-users] Testing MatGetSubMatrices
Bikash Kanungo
bikash at umich.edu
Tue Oct 20 12:52:42 CDT 2015
Thanks for the suggestion Matthew. The issue was that MatDenseGetArray
stores the value in a compressed column format rather than a row format. So
while setting the values into XTemp I must carefully swap between row and
column indices.
Regards,
Bikash
On Tue, Oct 20, 2015 at 11:58 AM, Matthew Knepley <knepley at gmail.com> wrote:
> 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
>
--
Bikash S. Kanungo
PhD Student
Computational Materials Physics Group
Mechanical Engineering
University of Michigan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20151020/d6a43187/attachment.html>
More information about the petsc-users
mailing list