Copying a MPI vector into a small MPI vector

Barry Smith bsmith at mcs.anl.gov
Wed Dec 6 09:03:23 CST 2006


  This is because the default when you do NOT provide iy (you have PETSC_NULL)
is not what you expect. You need instead to explicitly provide the iy, in this case
since you want to put them in the first slots of w, just pass the wv2w again
as the iy.

  Barry


On Wed, 6 Dec 2006, liu chang wrote:

> Hi, I'm fairly new to PETSc so excuse me if the problem seems obvious.
> 
> I'm trying to copy the first m entries of a MPI vector of size n (m <
> n) into another MPI vector of size m. From the Petsc documentation I
> think I need to use VecScatter, so I wrote the following code
> test.cpp:
> 
> int main(int argc, char *argv[])
> {
>    int info;
>    PetscInitialize(&argc, &argv, PETSC_NULL, PETSC_NULL);
> 
>    Vec w, wv;
>    info = VecCreateMPI(PETSC_COMM_WORLD, PETSC_DECIDE, 100, &w);
> CHKERRQ(info);
>    info = VecCreateMPI(PETSC_COMM_WORLD, PETSC_DECIDE, 110, &wv);
> CHKERRQ(info);
> 
>    IS wv2w;
>    VecScatter s_wv2w;
>    info = ISCreateStride(PETSC_COMM_WORLD, 100, 0, 1, &wv2w); CHKERRQ(info);
>    info = VecScatterCreate(wv, wv2w, w, PETSC_NULL, &s_wv2w); CHKERRQ(info);
> 
>    // actual copying skipped
> 
>    PetscFinalize();
>    return 0;
> }
> 
> The code runs fine on a single process, but when I run it over 2 processes:
> 
> mpirun -np 2 -machinefile ~/machines.LINUX test
> 
> The program crashes on the VecScatterCreate() statement:
> 
> ------------------------------------------------------------------------
> Petsc Release Version 2.3.1, Patch 15, Thu Jul  6 21:32:01 CDT 2006 HG
> revision: dc39078b37aa6becf2c4f8b06facf07566bf5454
> See docs/changes/index.html for recent updates.
> See docs/faq.html for hints about trouble shooting.
> See docs/index.html for manual pages.
> ------------------------------------------------------------------------
> ... Wed Dec  6 14:52:09 2006
> Libraries linked from ...
> Configure run at Sat Jul  8 15:09:13 2006
> Configure options --download-f-blas-lapack=1 --with-mpi-dir=/opt/mpich
> -with-clanguage=C++ --with-shared
> ------------------------------------------------------------------------
> [0]PETSC ERROR: VecScatterCreate() line 1350 in src/vec/vec/utils/vscat.c
> [0]PETSC ERROR: Nonconforming object sizes!
> [0]PETSC ERROR: Local scatter sizes don't match!
> [0]PETSC ERROR: User provided function() line 20 in test.cpp
> ------------------------------------------------------------------------
> Petsc Release Version 2.3.1, Patch 15, Thu Jul  6 21:32:01 CDT 2006 HG
> revision: dc39078b37aa6becf2c4f8b06facf07566bf5454
> See docs/changes/index.html for recent updates.
> See docs/faq.html for hints about trouble shooting.
> See docs/index.html for manual pages.
> ------------------------------------------------------------------------
> ... Wed Dec  6 14:52:39 2006
> Libraries linked from ...
> Configure run at Sat Jul  8 15:09:13 2006
> Configure options --download-f-blas-lapack=1 --with-mpi-dir=/opt/mpich
> -with-clanguage=C++ --with-shared
> ------------------------------------------------------------------------
> [1]PETSC ERROR: VecScatterCreate() line 1350 in src/vec/vec/utils/vscat.c
> [1]PETSC ERROR: Nonconforming object sizes!
> [1]PETSC ERROR: Local scatter sizes don't match!
> [1]PETSC ERROR: User provided function() line 20 in test.cpp
> 
> 
> So the problem is `local scatter sizes don't match'. I guess it's
> because some entries need to be passed from one process to the other
> due to the different layouts of the two vectors. So if VecScatter
> refuses to do it for me, how can it be done? Any help is greatly
> appreciated.
> 
> Liu Chang
> 
> 




More information about the petsc-users mailing list