Sorry, I forgot to say that my computational domain is decomposed with a parallel library using MPI, and the particles are defined with a distributed vector. So, the entries of the matrix are basically from that distributed vector.
Thanks, Massoud On Mon, Dec 12, 2016 at 1:21 AM, Massoud Rezavand <[email protected]> wrote: > 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 >> > >> >> >
