Thanks, as I already discussed with you, the matrix is coming from SPH discretization, which is not fixed on a grid and is changing over time.
On Mon, Dec 12, 2016 at 1:10 AM, Barry Smith <[email protected]> wrote: > > > On Dec 11, 2016, at 6:04 PM, Massoud Rezavand <[email protected]> > wrote: > > > > Thank you very much, > > > > So, if I am using PetscSplitOwnership() and then MatGetOwnershipRange() > to be prepared for preallocation, then MatSetSizes(A, local_size, > local_size, N, N) should be called with the calculated local_size from > PetscSplitOwnership() ? > > Confusion from the two responses. You cannot use MatGetOwnershipRange() > for preallocation. > > Without preallocation: > > > > PetscInt local_size = PETSC_DECIDE; > > > > > > MatSetSizes(A, local_size, local_size, N, N); > > MatGetOwnershipRanges(...) > > With preallocation: > > > > > > > > > 2) > > > > > > PetscInt local_size = PETSC_DECIDE; > > > > > > PetscSplitOwnership(PETSC_COMM_WORLD, &local_size, &N); > > > > > > MPI_Scan(&local_size, &end_row, 1, MPIU_INT, MPI_SUM, > PETSC_COMM_WORLD); > > > begin_row = end_row - local_size; > > MatMPIAIJSetPreallocation(.....). > > > But note that normally if the matrix comes from a discretization on a grid > you would not use either approach above. The parallel layout of the grid > would determine the local sizes and you won't not obtain them with > PetscSplitOwnership() or local_size = PETSC_DECIDE; > > Where is your matrix coming from? > > Barry > > > > > > > > > > > > > > > Thanks, > > Massoud > > > > > > On Mon, Dec 12, 2016 at 12:35 AM, Jed Brown <[email protected]> wrote: > > Massoud Rezavand <[email protected]> writes: > > > > > Dear PETSc team, > > > > > > What is the difference between the following two methods to get the > local > > > dimensions of a square matrix A? If they do the same, which one is > > > recommended? Should I use MPI_Scan after both? > > > > I would typically use 1 because it's fewer calls and automatically uses > > the correct communicator. You can use MatGetOwnershipRange() instead of > > manually using MPI_Scan. > > > > > 1) > > > > > > PetscInt local_size = PETSC_DECIDE; > > > > > > MatSetSizes(A, local_size, local_size, N, N); > > > > > > > > > 2) > > > > > > PetscInt local_size = PETSC_DECIDE; > > > > > > PetscSplitOwnership(PETSC_COMM_WORLD, &local_size, &N); > > > > > > MPI_Scan(&local_size, &end_row, 1, MPIU_INT, MPI_SUM, > PETSC_COMM_WORLD); > > > begin_row = end_row - local_size; > > > > > > > > > Thanks in advance, > > > Massoud > > > >
