[petsc-users] local dimensions
    Barry Smith 
    bsmith at mcs.anl.gov
       
    Sun Dec 11 18:10:56 CST 2016
    
    
  
> On Dec 11, 2016, at 6:04 PM, Massoud Rezavand <msdrezavand at gmail.com> 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 <jed at jedbrown.org> wrote:
> Massoud Rezavand <msdrezavand at gmail.com> 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
> 
    
    
More information about the petsc-users
mailing list