[petsc-users] Understanding preallocation for MPI
Florian Lindner
mailinglists at xgm.de
Mon Jul 10 03:22:50 CDT 2017
Hey,
one more question about preallocation:
I can determine if a column index is diagonal or off-diagonal using that code
if (col >= col_range_start and col < col_range_end)
d_nnz[relative_row]++;
else
o_nnz[relative_row]++;
My code, however uses index sets from which a ISlocalToGlobalMapping created:
// Creates a mapping from permutation and use that for the cols
ierr = ISCreateGeneral(PETSC_COMM_WORLD, local_cols, permutation.data(), PETSC_COPY_VALUES, &ISlocal); CHKERRV(ierr);
ierr = ISSetPermutation(ISlocal); CHKERRV(ierr);
ierr = ISAllGather(ISlocal, &ISglobal); CHKERRV(ierr); // Gather the IS from all processors
ierr = ISLocalToGlobalMappingCreateIS(ISglobal, &ISmapping); CHKERRV(ierr); // Make it a mapping
// Create an identity mapping and use that for the rows of A.
ierr = ISCreateStride(PETSC_COMM_WORLD, local_rows, row_range_start, 1, &ISidentity); CHKERRV(ierr);
ierr = ISSetIdentity(ISidentity); CHKERRV(ierr);
ierr = ISAllGather(ISidentity, &ISidentityGlobal); CHKERRV(ierr);
ierr = ISLocalToGlobalMappingCreateIS(ISidentityGlobal, &ISidentityMapping); CHKERRV(ierr);
ierr = MatSetLocalToGlobalMapping(A, ISidentityMapping, ISmapping); CHKERRV(ierr);
since SetPreallocation routines define the diagonal / off-diagonal blocks from the petsc ordering, I have to translate
the col to a petsc_col.
What is the best / fastest way to do that?
Is that the way to go?
PetscInt mapSize;
ISLocalToGlobalMappingGetSize(ISmapping, &mapSize);
const PetscInt *mapIndizes;
ISLocalToGlobalMappingGetIndices(ISmapping, &mapIndizes);
Thanks,
Florian
Am 07.07.2017 um 17:31 schrieb Florian Lindner:
> Hello,
>
> I'm having some struggle understanding the preallocation for MPIAIJ matrices, especially when a value is in off-diagonal
> vs. diagonal block.
>
> The small example program is at https://pastebin.com/67dXnGm3
>
> In general it should be parallel, but right now I just run it in serial.
>
> According to my understanding of
>
> http://www.mcs.anl.gov/petsc/petsc-3.7/docs/manualpages/Mat/MatMPIAIJSetPreallocation.html
>
> a entry is in the diagonal submatrix, if its row is in the OwnershipRange and its column is in OwnershipRangeColumn.
> That also means that in a serial run, there is only a diagonal submatrix.
>
> However, having MAT_NEW_NONZERO_ALLOCATION_ERR set, I get an error when
>
> Inserting 6 elements in row 2, though I have exactly
>
> 2 o_nnz = 0, d_nnz = 6 (means 6 elements allocated in the diagonal submatrix of row 2)
>
> Error is:
>
> [0]PETSC ERROR: Argument out of range
> [0]PETSC ERROR: New nonzero at (2,5) caused a malloc
> Use MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE) to turn off this check
>
>
> What is wrong with my understanding?
>
> Thanks,
> Florian
>
More information about the petsc-users
mailing list