Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-05 Thread Franck Houssen
Got it, tested it : all is OK ! Thanks guys. 

Franck 

- Mail original -

> De: "Barry F. Smith" 
> À: "Franck Houssen" 
> Cc: "Barry F. Smith" , "Matthew Knepley"
> , "For users of the development version of PETSc"
> 
> Envoyé: Jeudi 4 Janvier 2018 18:10:03
> Objet: Re: [petsc-dev] How do I collect all the values from a sequential
> vector on the zeroth processor into a parallel PETSc vector ?

> Frank,

> This is our bug. I have attached a patch and also fixed it in the PETSc
> repository master branch.

> apply with

> patch -p1 < franck.patch

> if you are using the tarball version of PETSc.

> Barry

> > On Jan 4, 2018, at 2:31 AM, Franck Houssen  wrote:
> >
> > I attached it in the very first mail.
> >
> > Franck
> >
> >>> more vecScatterGatherRoot.cpp
> > // How do I collect all the values from a sequential vector on the zeroth
> > processor into a parallel PETSc vector ?
> > //
> > // ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc -lm;
> > mpirun -n X vecScatterGatherRoot.exe
> >
> > #include "petsc.h"
> >
> > int main(int argc,char **argv) {
> > PetscInitialize(, , NULL, NULL);
> > int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
> > int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );
> >
> > PetscInt globSize = size;
> > Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
> > VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
> > VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
> > VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
> > PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> >
> > // Collect all the values from a parallel PETSc vector into a vector on the
> > zeroth processor.
> >
> > Vec locVec = NULL;
> > if (rank == 0) {
> > PetscInt locSize = globSize;
> > VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
> > }
> > VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
> > VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
> > VecScatterEnd (scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
> >
> > // Modify sequential vector on the zeroth processor.
> >
> > if (rank == 0) {
> > VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> > PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
> > VecScale(locVec, -1.);
> > VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> > PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
> > }
> > MPI_Barrier(MPI_COMM_WORLD);
> >
> > // How do I collect all the values from a sequential vector on the zeroth
> > processor into a parallel PETSc vector ?
> >
> > VecSet(globVec, 0.);
> > VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> > VecScatterEnd (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> > VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
> > PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> >
> > PetscFinalize();
> > }
> >
> >
> > - Mail original -
> >> De: "Barry F. Smith" 
> >> À: "Franck Houssen" 
> >> Cc: "Barry F. Smith" , "Matthew Knepley"
> >> , "For users of the development
> >> version of PETSc" 
> >> Envoyé: Mercredi 3 Janvier 2018 18:20:21
> >> Objet: Re: [petsc-dev] How do I collect all the values from a sequential
> >> vector on the zeroth processor into a
> >> parallel PETSc vector ?
> >>
> >>
> >> Send the complete code as an attachment.
> >>
> >>
> >>> On Jan 3, 2018, at 11:08 AM, Franck Houssen 
> >>> wrote:
> >>>
> >>> - Mail original -
>  De: "Barry F. Smith" 
>  À: "Franck Houssen" 
>  Cc: "Matthew Knepley" , "For users of the development
>  version of PETSc" 
>  Envoyé: Mercredi 3 Janvier 2018 18:01:35
>  Objet: Re: [petsc-dev] How do I collect all the values from a sequential
>  vector on the zeroth processor into a
>  parallel PETSc vector ?
> 
> 
> 
> > On Jan 3, 2018, at 10:59 AM, Franck Houssen 
> > wrote:
> >
> > I need the exact opposite operation of an entry in the FAQ called "How
> > do
> > I
> > collect all the values from a parallel PETSc vector into a vector on
> > the
> > zeroth processor?"
> 
>  You can use VecScatterCreateToZero() then do the scatter with scatter
>  reverse.
> 
> >>>
> >>> That's what I tried but got an error. Did I miss something ?
> >>>
> > tail vecScatterGatherRoot.cpp
> >>>
> >>> // How do I collect all the values from a sequential vector on the zeroth
> >>> processor into a parallel PETSc vector ?
> >>>
> >>> VecSet(globVec, 0.);
> >>> VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> >>> VecScatterEnd (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> >>> VecView(globVec, 

Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-04 Thread Smith, Barry F.

  I just forward it to you there times, if you don't get it then send me an 
alternative email to use. It is a small message and should not get blocked or 
delayed.


> On Jan 4, 2018, at 11:27 AM, Franck Houssen  wrote:
> 
> 
> 
> - Mail original -
>> De: "Barry F. Smith" 
>> À: "Franck Houssen" 
>> Cc: "Barry F. Smith" , "For users of the development 
>> version of PETSc" 
>> Envoyé: Jeudi 4 Janvier 2018 18:13:32
>> Objet: Re: [petsc-dev] How do I collect all the values from a sequential 
>> vector on the zeroth processor into a
>> parallel PETSc vector ?
>> 
>> 
>> 
>>> On Jan 4, 2018, at 11:10 AM, Franck Houssen 
>>> wrote:
>>> 
>>> Do you reproduce the error at your side ? Or is the pattern I use wrong ?
>> 
>>   You should have received an email from me with a patch for PETSc code.
>>   Yes I could reproduce, clearly our bug your code was fine.
> 
> Didn't get the (other) mail yet: guess I'll get it tomorrow. The mail server 
> seems to be messy/capricious... I also noticed some attachments may be "cut" 
> if you open them from your web browser (?!). Anyway...
> OK. bug fixed : good news ! I'm on maint, I guess you pushed on master and I 
> need to apply the patch on maint: no problem.
> 
> Thanks Barry
> 
>> 
>>  Barry
>> 
>>> 
>>> Franck
>>> 
>>> - Mail original -
 De: "Franck Houssen" 
 À: "Barry F. Smith" 
 Cc: "For users of the development version of PETSc"
 
 Envoyé: Jeudi 4 Janvier 2018 09:31:05
 Objet: Re: [petsc-dev] How do I collect all the values from a sequential
 vector on the zeroth processor into a
 parallel PETSc vector ?
 
 I attached it in the very first mail.
 
 Franck
 
>> more vecScatterGatherRoot.cpp
 // How do I collect all the values from a sequential vector on the zeroth
 processor into a parallel PETSc vector ?
 //
 // ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc
 -lm;
 mpirun -n X vecScatterGatherRoot.exe
 
 #include "petsc.h"
 
 int main(int argc,char **argv) {
 PetscInitialize(, , NULL, NULL);
 int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
 int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );
 
 PetscInt globSize = size;
 Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
 VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
 VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
 VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
 PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
 
 // Collect all the values from a parallel PETSc vector into a vector on
 the
 zeroth processor.
 
 Vec locVec = NULL;
 if (rank == 0) {
   PetscInt locSize = globSize;
   VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
 }
 VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
 VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES,
 SCATTER_FORWARD);
 VecScatterEnd  (scatCtx, globVec, locVec, INSERT_VALUES,
 SCATTER_FORWARD);
 
 // Modify sequential vector on the zeroth processor.
 
 if (rank == 0) {
   VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
   PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
   VecScale(locVec, -1.);
   VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
   PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
 }
 MPI_Barrier(MPI_COMM_WORLD);
 
 // How do I collect all the values from a sequential vector on the zeroth
 processor into a parallel PETSc vector ?
 
 VecSet(globVec, 0.);
 VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
 VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
 VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
 PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
 
 PetscFinalize();
 }
 
 
 - Mail original -
> De: "Barry F. Smith" 
> À: "Franck Houssen" 
> Cc: "Barry F. Smith" , "Matthew Knepley"
> , "For users of the development
> version of PETSc" 
> Envoyé: Mercredi 3 Janvier 2018 18:20:21
> Objet: Re: [petsc-dev] How do I collect all the values from a sequential
> vector on the zeroth processor into a
> parallel PETSc vector ?
> 
> 
> Send the complete code as an attachment.
> 
> 
>> On Jan 3, 2018, at 11:08 AM, Franck Houssen 
>> wrote:
>> 
>> - Mail original -
>>> De: "Barry F. Smith" 
>>> À: "Franck Houssen" 
>>> Cc: "Matthew Knepley" , "For users of the
>>> development
>>> 

Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-04 Thread Franck Houssen


- Mail original -
> De: "Barry F. Smith" 
> À: "Franck Houssen" 
> Cc: "Barry F. Smith" , "For users of the development 
> version of PETSc" 
> Envoyé: Jeudi 4 Janvier 2018 18:13:32
> Objet: Re: [petsc-dev] How do I collect all the values from a sequential 
> vector on the zeroth processor into a
> parallel PETSc vector ?
> 
> 
> 
> > On Jan 4, 2018, at 11:10 AM, Franck Houssen 
> > wrote:
> > 
> > Do you reproduce the error at your side ? Or is the pattern I use wrong ?
> 
>You should have received an email from me with a patch for PETSc code.
>Yes I could reproduce, clearly our bug your code was fine.

Didn't get the (other) mail yet: guess I'll get it tomorrow. The mail server 
seems to be messy/capricious... I also noticed some attachments may be "cut" if 
you open them from your web browser (?!). Anyway...
OK. bug fixed : good news ! I'm on maint, I guess you pushed on master and I 
need to apply the patch on maint: no problem.

Thanks Barry

> 
>   Barry
> 
> > 
> > Franck
> > 
> > - Mail original -
> >> De: "Franck Houssen" 
> >> À: "Barry F. Smith" 
> >> Cc: "For users of the development version of PETSc"
> >> 
> >> Envoyé: Jeudi 4 Janvier 2018 09:31:05
> >> Objet: Re: [petsc-dev] How do I collect all the values from a sequential
> >> vector on the zeroth processor into a
> >> parallel PETSc vector ?
> >> 
> >> I attached it in the very first mail.
> >> 
> >> Franck
> >> 
>  more vecScatterGatherRoot.cpp
> >> // How do I collect all the values from a sequential vector on the zeroth
> >> processor into a parallel PETSc vector ?
> >> //
> >> // ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc
> >> -lm;
> >> mpirun -n X vecScatterGatherRoot.exe
> >> 
> >> #include "petsc.h"
> >> 
> >> int main(int argc,char **argv) {
> >>  PetscInitialize(, , NULL, NULL);
> >>  int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
> >>  int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );
> >> 
> >>  PetscInt globSize = size;
> >>  Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
> >>  VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
> >>  VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
> >>  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
> >>  PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> >> 
> >>  // Collect all the values from a parallel PETSc vector into a vector on
> >>  the
> >>  zeroth processor.
> >> 
> >>  Vec locVec = NULL;
> >>  if (rank == 0) {
> >>PetscInt locSize = globSize;
> >>VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
> >>  }
> >>  VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
> >>  VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES,
> >>  SCATTER_FORWARD);
> >>  VecScatterEnd  (scatCtx, globVec, locVec, INSERT_VALUES,
> >>  SCATTER_FORWARD);
> >> 
> >>  // Modify sequential vector on the zeroth processor.
> >> 
> >>  if (rank == 0) {
> >>VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> >>PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
> >>VecScale(locVec, -1.);
> >>VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> >>PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
> >>  }
> >>  MPI_Barrier(MPI_COMM_WORLD);
> >> 
> >>  // How do I collect all the values from a sequential vector on the zeroth
> >>  processor into a parallel PETSc vector ?
> >> 
> >>  VecSet(globVec, 0.);
> >>  VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> >>  VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> >>  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
> >>  PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> >> 
> >>  PetscFinalize();
> >> }
> >> 
> >> 
> >> - Mail original -
> >>> De: "Barry F. Smith" 
> >>> À: "Franck Houssen" 
> >>> Cc: "Barry F. Smith" , "Matthew Knepley"
> >>> , "For users of the development
> >>> version of PETSc" 
> >>> Envoyé: Mercredi 3 Janvier 2018 18:20:21
> >>> Objet: Re: [petsc-dev] How do I collect all the values from a sequential
> >>> vector on the zeroth processor into a
> >>> parallel PETSc vector ?
> >>> 
> >>> 
> >>>  Send the complete code as an attachment.
> >>> 
> >>> 
>  On Jan 3, 2018, at 11:08 AM, Franck Houssen 
>  wrote:
>  
>  - Mail original -
> > De: "Barry F. Smith" 
> > À: "Franck Houssen" 
> > Cc: "Matthew Knepley" , "For users of the
> > development
> > version of PETSc" 
> > Envoyé: Mercredi 3 Janvier 2018 18:01:35
> > Objet: Re: [petsc-dev] How do I collect all the values from a
> > sequential
> > vector on the zeroth processor into a
> > parallel PETSc 

Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-04 Thread Smith, Barry F.


> On Jan 4, 2018, at 11:10 AM, Franck Houssen  wrote:
> 
> Do you reproduce the error at your side ? Or is the pattern I use wrong ? 

   You should have received an email from me with a patch for PETSc code.  Yes 
I could reproduce, clearly our bug your code was fine.

  Barry

> 
> Franck
> 
> - Mail original -
>> De: "Franck Houssen" 
>> À: "Barry F. Smith" 
>> Cc: "For users of the development version of PETSc" 
>> Envoyé: Jeudi 4 Janvier 2018 09:31:05
>> Objet: Re: [petsc-dev] How do I collect all the values from a sequential 
>> vector on the zeroth processor into a
>> parallel PETSc vector ?
>> 
>> I attached it in the very first mail.
>> 
>> Franck
>> 
 more vecScatterGatherRoot.cpp
>> // How do I collect all the values from a sequential vector on the zeroth
>> processor into a parallel PETSc vector ?
>> //
>> // ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc -lm;
>> mpirun -n X vecScatterGatherRoot.exe
>> 
>> #include "petsc.h"
>> 
>> int main(int argc,char **argv) {
>>  PetscInitialize(, , NULL, NULL);
>>  int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
>>  int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );
>> 
>>  PetscInt globSize = size;
>>  Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
>>  VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
>>  VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
>>  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
>>  PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
>> 
>>  // Collect all the values from a parallel PETSc vector into a vector on the
>>  zeroth processor.
>> 
>>  Vec locVec = NULL;
>>  if (rank == 0) {
>>PetscInt locSize = globSize;
>>VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
>>  }
>>  VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
>>  VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
>>  VecScatterEnd  (scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
>> 
>>  // Modify sequential vector on the zeroth processor.
>> 
>>  if (rank == 0) {
>>VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
>>PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
>>VecScale(locVec, -1.);
>>VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
>>PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
>>  }
>>  MPI_Barrier(MPI_COMM_WORLD);
>> 
>>  // How do I collect all the values from a sequential vector on the zeroth
>>  processor into a parallel PETSc vector ?
>> 
>>  VecSet(globVec, 0.);
>>  VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>>  VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>>  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
>>  PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
>> 
>>  PetscFinalize();
>> }
>> 
>> 
>> - Mail original -
>>> De: "Barry F. Smith" 
>>> À: "Franck Houssen" 
>>> Cc: "Barry F. Smith" , "Matthew Knepley"
>>> , "For users of the development
>>> version of PETSc" 
>>> Envoyé: Mercredi 3 Janvier 2018 18:20:21
>>> Objet: Re: [petsc-dev] How do I collect all the values from a sequential
>>> vector on the zeroth processor into a
>>> parallel PETSc vector ?
>>> 
>>> 
>>>  Send the complete code as an attachment.
>>> 
>>> 
 On Jan 3, 2018, at 11:08 AM, Franck Houssen 
 wrote:
 
 - Mail original -
> De: "Barry F. Smith" 
> À: "Franck Houssen" 
> Cc: "Matthew Knepley" , "For users of the development
> version of PETSc" 
> Envoyé: Mercredi 3 Janvier 2018 18:01:35
> Objet: Re: [petsc-dev] How do I collect all the values from a sequential
> vector on the zeroth processor into a
> parallel PETSc vector ?
> 
> 
> 
>> On Jan 3, 2018, at 10:59 AM, Franck Houssen 
>> wrote:
>> 
>> I need the exact opposite operation of an entry in the FAQ called "How
>> do
>> I
>> collect all the values from a parallel PETSc vector into a vector on
>> the
>> zeroth processor?"
> 
> You can use VecScatterCreateToZero() then do the scatter with scatter
> reverse.
> 
 
 That's what I tried but got an error. Did I miss something ?
 
>> tail vecScatterGatherRoot.cpp
 
 // How do I collect all the values from a sequential vector on the
 zeroth
 processor into a parallel PETSc vector ?
 
 VecSet(globVec, 0.);
 VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
 VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
 VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
 PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
 
 PetscFinalize();
 }
 
>> mpirun -n 2 

Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-04 Thread Smith, Barry F.

  Frank,

   This is our bug. I have attached a patch and also fixed it in the PETSc 
repository master branch.

  apply with

patch -p1 < franck.patch

if you are using the tarball version of PETSc.


   Barry


> On Jan 4, 2018, at 2:31 AM, Franck Houssen  wrote:
>
> I attached it in the very first mail.
>
> Franck
>
>>> more vecScatterGatherRoot.cpp
> // How do I collect all the values from a sequential vector on the zeroth 
> processor into a parallel PETSc vector ?
> //
> // ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc -lm; 
> mpirun -n X vecScatterGatherRoot.exe
>
> #include "petsc.h"
>
> int main(int argc,char **argv) {
>  PetscInitialize(, , NULL, NULL);
>  int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
>  int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );
>
>  PetscInt globSize = size;
>  Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
>  VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
>  VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
>  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); 
> PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
>
>  // Collect all the values from a parallel PETSc vector into a vector on the 
> zeroth processor.
>
>  Vec locVec = NULL;
>  if (rank == 0) {
>PetscInt locSize = globSize;
>VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
>  }
>  VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
>  VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
>  VecScatterEnd  (scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
>
>  // Modify sequential vector on the zeroth processor.
>
>  if (rank == 0) {
>VecView(locVec, PETSC_VIEWER_STDOUT_SELF); 
> PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
>VecScale(locVec, -1.);
>VecView(locVec, PETSC_VIEWER_STDOUT_SELF); 
> PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
>  }
>  MPI_Barrier(MPI_COMM_WORLD);
>
>  // How do I collect all the values from a sequential vector on the zeroth 
> processor into a parallel PETSc vector ?
>
>  VecSet(globVec, 0.);
>  VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>  VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); 
> PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
>
>  PetscFinalize();
> }
>
>
> - Mail original -
>> De: "Barry F. Smith" 
>> À: "Franck Houssen" 
>> Cc: "Barry F. Smith" , "Matthew Knepley" 
>> , "For users of the development
>> version of PETSc" 
>> Envoyé: Mercredi 3 Janvier 2018 18:20:21
>> Objet: Re: [petsc-dev] How do I collect all the values from a sequential 
>> vector on the zeroth processor into a
>> parallel PETSc vector ?
>>
>>
>>  Send the complete code as an attachment.
>>
>>
>>> On Jan 3, 2018, at 11:08 AM, Franck Houssen 
>>> wrote:
>>>
>>> - Mail original -
 De: "Barry F. Smith" 
 À: "Franck Houssen" 
 Cc: "Matthew Knepley" , "For users of the development
 version of PETSc" 
 Envoyé: Mercredi 3 Janvier 2018 18:01:35
 Objet: Re: [petsc-dev] How do I collect all the values from a sequential
 vector on the zeroth processor into a
 parallel PETSc vector ?



> On Jan 3, 2018, at 10:59 AM, Franck Houssen 
> wrote:
>
> I need the exact opposite operation of an entry in the FAQ called "How do
> I
> collect all the values from a parallel PETSc vector into a vector on the
> zeroth processor?"

 You can use VecScatterCreateToZero() then do the scatter with scatter
 reverse.

>>>
>>> That's what I tried but got an error. Did I miss something ?
>>>
> tail vecScatterGatherRoot.cpp
>>>
>>> // How do I collect all the values from a sequential vector on the zeroth
>>> processor into a parallel PETSc vector ?
>>>
>>> VecSet(globVec, 0.);
>>> VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>>> VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>>> VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
>>> PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
>>>
>>> PetscFinalize();
>>> }
>>>
> mpirun -n 2 ./vecScatterGatherRoot.exe
>>> Vec Object: 2 MPI processes
>>> type: mpi
>>> Process [0]
>>> 1.
>>> Process [1]
>>> 2.
>>> Vec Object: 1 MPI processes
>>> type: seq
>>> 1.
>>> 2.
>>> Vec Object: 1 MPI processes
>>> type: seq
>>> -1.
>>> -2.
>>> ...
>>> [1]PETSC ERROR: [1] VecScatterBegin_MPI_ToOne line 161
>>> /home/fghoussen/Documents/INRIA/petsc/src/vec/vec/utils/vscat.c
>>> [1]PETSC ERROR: [1] VecScatterBegin line 1698
>>> /home/fghoussen/Documents/INRIA/petsc/src/vec/vec/utils/vscat.c
>>> [1]PETSC ERROR: - Error Message
>>> 

Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-04 Thread Franck Houssen
Do you reproduce the error at your side ? Or is the pattern I use wrong ? 

Franck

- Mail original -
> De: "Franck Houssen" 
> À: "Barry F. Smith" 
> Cc: "For users of the development version of PETSc" 
> Envoyé: Jeudi 4 Janvier 2018 09:31:05
> Objet: Re: [petsc-dev] How do I collect all the values from a sequential 
> vector on the zeroth processor into a
> parallel PETSc vector ?
> 
> I attached it in the very first mail.
> 
> Franck
> 
> >> more vecScatterGatherRoot.cpp
> // How do I collect all the values from a sequential vector on the zeroth
> processor into a parallel PETSc vector ?
> //
> // ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc -lm;
> mpirun -n X vecScatterGatherRoot.exe
> 
> #include "petsc.h"
> 
> int main(int argc,char **argv) {
>   PetscInitialize(, , NULL, NULL);
>   int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
>   int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );
> 
>   PetscInt globSize = size;
>   Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
>   VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
>   VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
>   VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
>   PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> 
>   // Collect all the values from a parallel PETSc vector into a vector on the
>   zeroth processor.
> 
>   Vec locVec = NULL;
>   if (rank == 0) {
> PetscInt locSize = globSize;
> VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
>   }
>   VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
>   VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
>   VecScatterEnd  (scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
> 
>   // Modify sequential vector on the zeroth processor.
> 
>   if (rank == 0) {
> VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
> VecScale(locVec, -1.);
> VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
>   }
>   MPI_Barrier(MPI_COMM_WORLD);
> 
>   // How do I collect all the values from a sequential vector on the zeroth
>   processor into a parallel PETSc vector ?
> 
>   VecSet(globVec, 0.);
>   VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>   VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>   VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
>   PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> 
>   PetscFinalize();
> }
> 
> 
> - Mail original -
> > De: "Barry F. Smith" 
> > À: "Franck Houssen" 
> > Cc: "Barry F. Smith" , "Matthew Knepley"
> > , "For users of the development
> > version of PETSc" 
> > Envoyé: Mercredi 3 Janvier 2018 18:20:21
> > Objet: Re: [petsc-dev] How do I collect all the values from a sequential
> > vector on the zeroth processor into a
> > parallel PETSc vector ?
> > 
> > 
> >   Send the complete code as an attachment.
> > 
> > 
> > > On Jan 3, 2018, at 11:08 AM, Franck Houssen 
> > > wrote:
> > > 
> > > - Mail original -
> > >> De: "Barry F. Smith" 
> > >> À: "Franck Houssen" 
> > >> Cc: "Matthew Knepley" , "For users of the development
> > >> version of PETSc" 
> > >> Envoyé: Mercredi 3 Janvier 2018 18:01:35
> > >> Objet: Re: [petsc-dev] How do I collect all the values from a sequential
> > >> vector on the zeroth processor into a
> > >> parallel PETSc vector ?
> > >> 
> > >> 
> > >> 
> > >>> On Jan 3, 2018, at 10:59 AM, Franck Houssen 
> > >>> wrote:
> > >>> 
> > >>> I need the exact opposite operation of an entry in the FAQ called "How
> > >>> do
> > >>> I
> > >>> collect all the values from a parallel PETSc vector into a vector on
> > >>> the
> > >>> zeroth processor?"
> > >> 
> > >>  You can use VecScatterCreateToZero() then do the scatter with scatter
> > >>  reverse.
> > >> 
> > > 
> > > That's what I tried but got an error. Did I miss something ?
> > > 
> > >>> tail vecScatterGatherRoot.cpp
> > > 
> > >  // How do I collect all the values from a sequential vector on the
> > >  zeroth
> > >  processor into a parallel PETSc vector ?
> > > 
> > >  VecSet(globVec, 0.);
> > >  VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> > >  VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> > >  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
> > >  PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> > > 
> > >  PetscFinalize();
> > > }
> > > 
> > >>> mpirun -n 2 ./vecScatterGatherRoot.exe
> > > Vec Object: 2 MPI processes
> > >  type: mpi
> > > Process [0]
> > > 1.
> > > Process [1]
> > > 2.
> > > Vec Object: 1 MPI processes
> > >  type: seq
> > > 1.
> > > 2.
> > > Vec Object: 

Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-04 Thread Franck Houssen
I attached it in the very first mail.

Franck

>> more vecScatterGatherRoot.cpp 
// How do I collect all the values from a sequential vector on the zeroth 
processor into a parallel PETSc vector ?
//
// ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc -lm; 
mpirun -n X vecScatterGatherRoot.exe

#include "petsc.h"

int main(int argc,char **argv) {
  PetscInitialize(, , NULL, NULL);
  int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
  int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );

  PetscInt globSize = size;
  Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
  VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
  VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); 
PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);

  // Collect all the values from a parallel PETSc vector into a vector on the 
zeroth processor.

  Vec locVec = NULL;
  if (rank == 0) {
PetscInt locSize = globSize;
VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
  }
  VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
  VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
  VecScatterEnd  (scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);

  // Modify sequential vector on the zeroth processor.

  if (rank == 0) {
VecView(locVec, PETSC_VIEWER_STDOUT_SELF); 
PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
VecScale(locVec, -1.);
VecView(locVec, PETSC_VIEWER_STDOUT_SELF); 
PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
  }
  MPI_Barrier(MPI_COMM_WORLD);

  // How do I collect all the values from a sequential vector on the zeroth 
processor into a parallel PETSc vector ?

  VecSet(globVec, 0.);
  VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
  VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); 
PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);

  PetscFinalize();
}


- Mail original -
> De: "Barry F. Smith" 
> À: "Franck Houssen" 
> Cc: "Barry F. Smith" , "Matthew Knepley" 
> , "For users of the development
> version of PETSc" 
> Envoyé: Mercredi 3 Janvier 2018 18:20:21
> Objet: Re: [petsc-dev] How do I collect all the values from a sequential 
> vector on the zeroth processor into a
> parallel PETSc vector ?
> 
> 
>   Send the complete code as an attachment.
> 
> 
> > On Jan 3, 2018, at 11:08 AM, Franck Houssen 
> > wrote:
> > 
> > - Mail original -
> >> De: "Barry F. Smith" 
> >> À: "Franck Houssen" 
> >> Cc: "Matthew Knepley" , "For users of the development
> >> version of PETSc" 
> >> Envoyé: Mercredi 3 Janvier 2018 18:01:35
> >> Objet: Re: [petsc-dev] How do I collect all the values from a sequential
> >> vector on the zeroth processor into a
> >> parallel PETSc vector ?
> >> 
> >> 
> >> 
> >>> On Jan 3, 2018, at 10:59 AM, Franck Houssen 
> >>> wrote:
> >>> 
> >>> I need the exact opposite operation of an entry in the FAQ called "How do
> >>> I
> >>> collect all the values from a parallel PETSc vector into a vector on the
> >>> zeroth processor?"
> >> 
> >>  You can use VecScatterCreateToZero() then do the scatter with scatter
> >>  reverse.
> >> 
> > 
> > That's what I tried but got an error. Did I miss something ?
> > 
> >>> tail vecScatterGatherRoot.cpp
> > 
> >  // How do I collect all the values from a sequential vector on the zeroth
> >  processor into a parallel PETSc vector ?
> > 
> >  VecSet(globVec, 0.);
> >  VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> >  VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> >  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
> >  PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> > 
> >  PetscFinalize();
> > }
> > 
> >>> mpirun -n 2 ./vecScatterGatherRoot.exe
> > Vec Object: 2 MPI processes
> >  type: mpi
> > Process [0]
> > 1.
> > Process [1]
> > 2.
> > Vec Object: 1 MPI processes
> >  type: seq
> > 1.
> > 2.
> > Vec Object: 1 MPI processes
> >  type: seq
> > -1.
> > -2.
> > ...
> > [1]PETSC ERROR: [1] VecScatterBegin_MPI_ToOne line 161
> > /home/fghoussen/Documents/INRIA/petsc/src/vec/vec/utils/vscat.c
> > [1]PETSC ERROR: [1] VecScatterBegin line 1698
> > /home/fghoussen/Documents/INRIA/petsc/src/vec/vec/utils/vscat.c
> > [1]PETSC ERROR: - Error Message
> > --
> > [1]PETSC ERROR: Signal received
> > [1]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html for
> > trouble shooting.
> > 
> > 
> >>> 
> >>> Shall I use VecScatterCreateToZero "backward", or, use VecScatterCreate
> >>> instead ? If yes, how ? (my understanding is that VecScatterCreate can
> >>> take only 

Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-03 Thread Smith, Barry F.

  Send the complete code as an attachment.


> On Jan 3, 2018, at 11:08 AM, Franck Houssen  wrote:
> 
> - Mail original -
>> De: "Barry F. Smith" 
>> À: "Franck Houssen" 
>> Cc: "Matthew Knepley" , "For users of the development 
>> version of PETSc" 
>> Envoyé: Mercredi 3 Janvier 2018 18:01:35
>> Objet: Re: [petsc-dev] How do I collect all the values from a sequential 
>> vector on the zeroth processor into a
>> parallel PETSc vector ?
>> 
>> 
>> 
>>> On Jan 3, 2018, at 10:59 AM, Franck Houssen 
>>> wrote:
>>> 
>>> I need the exact opposite operation of an entry in the FAQ called "How do I
>>> collect all the values from a parallel PETSc vector into a vector on the
>>> zeroth processor?"
>> 
>>  You can use VecScatterCreateToZero() then do the scatter with scatter
>>  reverse.
>> 
> 
> That's what I tried but got an error. Did I miss something ?
> 
>>> tail vecScatterGatherRoot.cpp 
> 
>  // How do I collect all the values from a sequential vector on the zeroth 
> processor into a parallel PETSc vector ?
> 
>  VecSet(globVec, 0.);
>  VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>  VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); 
> PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> 
>  PetscFinalize();
> }
> 
>>> mpirun -n 2 ./vecScatterGatherRoot.exe 
> Vec Object: 2 MPI processes
>  type: mpi
> Process [0]
> 1.
> Process [1]
> 2.
> Vec Object: 1 MPI processes
>  type: seq
> 1.
> 2.
> Vec Object: 1 MPI processes
>  type: seq
> -1.
> -2.
> ...
> [1]PETSC ERROR: [1] VecScatterBegin_MPI_ToOne line 161 
> /home/fghoussen/Documents/INRIA/petsc/src/vec/vec/utils/vscat.c
> [1]PETSC ERROR: [1] VecScatterBegin line 1698 
> /home/fghoussen/Documents/INRIA/petsc/src/vec/vec/utils/vscat.c
> [1]PETSC ERROR: - Error Message 
> --
> [1]PETSC ERROR: Signal received
> [1]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html for 
> trouble shooting.
> 
> 
>>> 
>>> Shall I use VecScatterCreateToZero "backward", or, use VecScatterCreate
>>> instead ? If yes, how ? (my understanding is that VecScatterCreate can
>>> take only parallel vector as input)
>> 
>>   This understanding is completely incorrect.
>> 
>>  Barry
>> 
>> 
>>> Not sure how to do this.
>>> 
>>> Its not clear what you want. Do you want a seq vector duplicated on all
>>> procs?
>>> 
>>> No. The seq vec should "live" only on the master proc. This seq master vec
>>> should be "converted" into a parallel vector. Not sure how to do that
>>> 
>>> Do you want it split up? The short
>>> answer is, use the appropriate scatter.
>>> 
>>>   Matt
>>> 
>>> Franck
>>> 
>>> In this example, the final VecView of the parallel globVec vector should be
>>> [-1., -2.]
>>> 
> mpirun -n 2 ./vecScatterGatherRoot.exe
>>> Vec Object: 2 MPI processes
>>>  type: mpi
>>> Process [0]
>>> 1.
>>> Process [1]
>>> 2.
>>> Vec Object: 1 MPI processes
>>>  type: seq
>>> 1.
>>> 2.
>>> Vec Object: 1 MPI processes
>>>  type: seq
>>> -1.
>>> -2.
>>> [1]PETSC ERROR:
>>> 
>>> [1]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation,
>>> probably memory access out of range
>>> 
> more vecScatterGatherRoot.cpp
>>> // How do I collect all the values from a sequential vector on the zeroth
>>> processor into a parallel PETSc vector ?
>>> //
>>> // ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc -lm;
>>> mpirun -n X vecScatterGatherRoot.exe
>>> 
>>> #include "petsc.h"
>>> 
>>> int main(int argc,char **argv) {
>>>  PetscInitialize(, , NULL, NULL);
>>>  int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
>>>  int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );
>>> 
>>>  PetscInt globSize = size;
>>>  Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
>>>  VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
>>>  VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
>>>  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
>>>  PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
>>> 
>>>  // Collect all the values from a parallel PETSc vector into a vector on
>>>  the zeroth processor.
>>> 
>>>  Vec locVec = NULL;
>>>  if (rank == 0) {
>>>PetscInt locSize = globSize;
>>>VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
>>>  }
>>>  VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
>>>  VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES,
>>>  SCATTER_FORWARD);
>>>  VecScatterEnd  (scatCtx, globVec, locVec, INSERT_VALUES,
>>>  SCATTER_FORWARD);
>>> 
>>>  // Modify sequential vector on the zeroth processor.
>>> 
>>>  if (rank == 0) {
>>>VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
>>>PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
>>>

Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-03 Thread Franck Houssen
- Mail original -
> De: "Barry F. Smith" 
> À: "Franck Houssen" 
> Cc: "Matthew Knepley" , "For users of the development 
> version of PETSc" 
> Envoyé: Mercredi 3 Janvier 2018 18:01:35
> Objet: Re: [petsc-dev] How do I collect all the values from a sequential 
> vector on the zeroth processor into a
> parallel PETSc vector ?
> 
> 
> 
> > On Jan 3, 2018, at 10:59 AM, Franck Houssen 
> > wrote:
> > 
> > I need the exact opposite operation of an entry in the FAQ called "How do I
> > collect all the values from a parallel PETSc vector into a vector on the
> > zeroth processor?"
> 
>   You can use VecScatterCreateToZero() then do the scatter with scatter
>   reverse.
> 

That's what I tried but got an error. Did I miss something ?

>> tail vecScatterGatherRoot.cpp 

  // How do I collect all the values from a sequential vector on the zeroth 
processor into a parallel PETSc vector ?

  VecSet(globVec, 0.);
  VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
  VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); 
PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);

  PetscFinalize();
}

>> mpirun -n 2 ./vecScatterGatherRoot.exe 
Vec Object: 2 MPI processes
  type: mpi
Process [0]
1.
Process [1]
2.
Vec Object: 1 MPI processes
  type: seq
1.
2.
Vec Object: 1 MPI processes
  type: seq
-1.
-2.
...
[1]PETSC ERROR: [1] VecScatterBegin_MPI_ToOne line 161 
/home/fghoussen/Documents/INRIA/petsc/src/vec/vec/utils/vscat.c
[1]PETSC ERROR: [1] VecScatterBegin line 1698 
/home/fghoussen/Documents/INRIA/petsc/src/vec/vec/utils/vscat.c
[1]PETSC ERROR: - Error Message 
--
[1]PETSC ERROR: Signal received
[1]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html for 
trouble shooting.


> > 
> > Shall I use VecScatterCreateToZero "backward", or, use VecScatterCreate
> > instead ? If yes, how ? (my understanding is that VecScatterCreate can
> > take only parallel vector as input)
> 
>This understanding is completely incorrect.
> 
>   Barry
> 
> 
> > Not sure how to do this.
> > 
> > Its not clear what you want. Do you want a seq vector duplicated on all
> > procs?
> > 
> > No. The seq vec should "live" only on the master proc. This seq master vec
> > should be "converted" into a parallel vector. Not sure how to do that
> > 
> > Do you want it split up? The short
> > answer is, use the appropriate scatter.
> > 
> >Matt
> > 
> > Franck
> > 
> > In this example, the final VecView of the parallel globVec vector should be
> > [-1., -2.]
> > 
> > >> mpirun -n 2 ./vecScatterGatherRoot.exe
> > Vec Object: 2 MPI processes
> >   type: mpi
> > Process [0]
> > 1.
> > Process [1]
> > 2.
> > Vec Object: 1 MPI processes
> >   type: seq
> > 1.
> > 2.
> > Vec Object: 1 MPI processes
> >   type: seq
> > -1.
> > -2.
> > [1]PETSC ERROR:
> > 
> > [1]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation,
> > probably memory access out of range
> > 
> > >> more vecScatterGatherRoot.cpp
> > // How do I collect all the values from a sequential vector on the zeroth
> > processor into a parallel PETSc vector ?
> > //
> > // ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc -lm;
> > mpirun -n X vecScatterGatherRoot.exe
> > 
> > #include "petsc.h"
> > 
> > int main(int argc,char **argv) {
> >   PetscInitialize(, , NULL, NULL);
> >   int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
> >   int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );
> > 
> >   PetscInt globSize = size;
> >   Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
> >   VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
> >   VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
> >   VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
> >   PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> > 
> >   // Collect all the values from a parallel PETSc vector into a vector on
> >   the zeroth processor.
> > 
> >   Vec locVec = NULL;
> >   if (rank == 0) {
> > PetscInt locSize = globSize;
> > VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
> >   }
> >   VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
> >   VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES,
> >   SCATTER_FORWARD);
> >   VecScatterEnd  (scatCtx, globVec, locVec, INSERT_VALUES,
> >   SCATTER_FORWARD);
> > 
> >   // Modify sequential vector on the zeroth processor.
> > 
> >   if (rank == 0) {
> > VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> > PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
> > VecScale(locVec, -1.);
> > VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> > PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
> >   }
> >   MPI_Barrier(MPI_COMM_WORLD);
> > 
> >   // How do I 

Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-03 Thread Smith, Barry F.


> On Jan 3, 2018, at 10:59 AM, Franck Houssen  wrote:
> 
> I need the exact opposite operation of an entry in the FAQ called "How do I 
> collect all the values from a parallel PETSc vector into a vector on the 
> zeroth processor?"

  You can use VecScatterCreateToZero() then do the scatter with scatter reverse.

> 
> Shall I use VecScatterCreateToZero "backward", or, use VecScatterCreate 
> instead ? If yes, how ? (my understanding is that VecScatterCreate can take 
> only parallel vector as input)

   This understanding is completely incorrect.

  Barry


> Not sure how to do this.
> 
> Its not clear what you want. Do you want a seq vector duplicated on all procs?
> 
> No. The seq vec should "live" only on the master proc. This seq master vec 
> should be "converted" into a parallel vector. Not sure how to do that
> 
> Do you want it split up? The short
> answer is, use the appropriate scatter.
> 
>Matt
> 
> Franck
> 
> In this example, the final VecView of the parallel globVec vector should be 
> [-1., -2.]
> 
> >> mpirun -n 2 ./vecScatterGatherRoot.exe 
> Vec Object: 2 MPI processes
>   type: mpi
> Process [0]
> 1.
> Process [1]
> 2.
> Vec Object: 1 MPI processes
>   type: seq
> 1.
> 2.
> Vec Object: 1 MPI processes
>   type: seq
> -1.
> -2.
> [1]PETSC ERROR: 
> 
> [1]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation, 
> probably memory access out of range
> 
> >> more vecScatterGatherRoot.cpp 
> // How do I collect all the values from a sequential vector on the zeroth 
> processor into a parallel PETSc vector ?
> //
> // ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc -lm; 
> mpirun -n X vecScatterGatherRoot.exe
> 
> #include "petsc.h"
> 
> int main(int argc,char **argv) {
>   PetscInitialize(, , NULL, NULL);
>   int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
>   int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );
> 
>   PetscInt globSize = size;
>   Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
>   VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
>   VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
>   VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); 
> PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> 
>   // Collect all the values from a parallel PETSc vector into a vector on the 
> zeroth processor.
> 
>   Vec locVec = NULL;
>   if (rank == 0) {
> PetscInt locSize = globSize;
> VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
>   }
>   VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
>   VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
>   VecScatterEnd  (scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
> 
>   // Modify sequential vector on the zeroth processor.
> 
>   if (rank == 0) {
> VecView(locVec, PETSC_VIEWER_STDOUT_SELF); 
> PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
> VecScale(locVec, -1.);
> VecView(locVec, PETSC_VIEWER_STDOUT_SELF); 
> PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
>   }
>   MPI_Barrier(MPI_COMM_WORLD);
> 
>   // How do I collect all the values from a sequential vector on the zeroth 
> processor into a parallel PETSc vector ?
> 
>   VecSet(globVec, 0.);
>   VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>   VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>   VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); 
> PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> 
>   PetscFinalize();
> }
> 
> 
> 
> 
> -- 
> What most experimenters take for granted before they begin their experiments 
> is infinitely more interesting than any results to which their experiments 
> lead.
> -- Norbert Wiener
> 
> https://www.cse.buffalo.edu/~knepley/
> 



Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-03 Thread Franck Houssen
I need the exact opposite operation of an entry in the FAQ called " How do I 
collect all the values from a parallel PETSc vector into a vector on the zeroth 
processor?" 

- Mail original -

> De: "Matthew Knepley" 
> À: "Franck Houssen" 
> Cc: "For users of the development version of PETSc" 
> Envoyé: Mercredi 3 Janvier 2018 17:51:02
> Objet: Re: [petsc-dev] How do I collect all the values from a sequential
> vector on the zeroth processor into a parallel PETSc vector ?

> On Wed, Jan 3, 2018 at 11:47 AM, Franck Houssen < franck.hous...@inria.fr >
> wrote:

> > How do I collect all the values from a sequential vector on the zeroth
> > processor into a parallel PETSc vector ?
> 
> > Shall I use VecScatterCreateToZero "backward", or, use VecScatterCreate
> > instead ? If yes, how ? (my understanding is that VecScatterCreate can take
> > only parallel vector as input)
> 
> > Not sure how to do this.
> 

> Its not clear what you want. Do you want a seq vector duplicated on all
> procs?

No. The seq vec should "live" only on the master proc. This seq master vec 
should be "converted" into a parallel vector. Not sure how to do that 

> Do you want it split up? The short
> answer is, use the appropriate scatter.

> Matt

> > Franck
> 

> > In this example, the final VecView of the parallel globVec vector should be
> > [-1., -2.]
> 

> > >> mpirun -n 2 ./vecScatterGatherRoot.exe
> 
> > Vec Object: 2 MPI processes
> 
> > type: mpi
> 
> > Process [0]
> 
> > 1.
> 
> > Process [1]
> 
> > 2.
> 
> > Vec Object: 1 MPI processes
> 
> > type: seq
> 
> > 1.
> 
> > 2.
> 
> > Vec Object: 1 MPI processes
> 
> > type: seq
> 
> > -1.
> 
> > -2.
> 
> > [1]PETSC ERROR:
> > 
> 
> > [1]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation,
> > probably memory access out of range
> 

> > >> more vecScatterGatherRoot.cpp
> 
> > // How do I collect all the values from a sequential vector on the zeroth
> > processor into a parallel PETSc vector ?
> 
> > //
> 
> > // ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc -lm;
> > mpirun -n X vecScatterGatherRoot.exe
> 

> > #include "petsc.h"
> 

> > int main(int argc,char **argv) {
> 
> > PetscInitialize(, , NULL, NULL);
> 
> > int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
> 
> > int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );
> 

> > PetscInt globSize = size;
> 
> > Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
> 
> > VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
> 
> > VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
> 
> > VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
> > PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> 

> > // Collect all the values from a parallel PETSc vector into a vector on the
> > zeroth processor.
> 

> > Vec locVec = NULL;
> 
> > if (rank == 0) {
> 
> > PetscInt locSize = globSize;
> 
> > VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
> 
> > }
> 
> > VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
> 
> > VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
> 
> > VecScatterEnd (scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
> 

> > // Modify sequential vector on the zeroth processor.
> 

> > if (rank == 0) {
> 
> > VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> > PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
> 
> > VecScale(locVec, -1.);
> 
> > VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> > PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
> 
> > }
> 
> > MPI_Barrier(MPI_COMM_WORLD);
> 

> > // How do I collect all the values from a sequential vector on the zeroth
> > processor into a parallel PETSc vector ?
> 

> > VecSet(globVec, 0.);
> 
> > VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> 
> > VecScatterEnd (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
> 
> > VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
> > PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
> 

> > PetscFinalize();
> 
> > }
> 

> --
> What most experimenters take for granted before they begin their experiments
> is infinitely more interesting than any results to which their experiments
> lead.
> -- Norbert Wiener

> https://www.cse.buffalo.edu/~knepley/


Re: [petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-03 Thread Matthew Knepley
On Wed, Jan 3, 2018 at 11:47 AM, Franck Houssen 
wrote:

> How do I collect all the values from a sequential vector on the zeroth
> processor into a parallel PETSc vector ?
> Shall I use VecScatterCreateToZero "backward", or, use VecScatterCreate
> instead ? If yes, how ? (my understanding is that VecScatterCreate can take
> only parallel vector as input)
> Not sure how to do this.
>

Its not clear what you want. Do you want a seq vector duplicated on all
procs? Do you want it split up? The short
answer is, use the appropriate scatter.

   Matt


>
> Franck
>
> In this example, the final VecView of the parallel globVec vector should
> be [-1., -2.]
>
> >> mpirun -n 2 ./vecScatterGatherRoot.exe
> Vec Object: 2 MPI processes
>   type: mpi
> Process [0]
> 1.
> Process [1]
> 2.
> Vec Object: 1 MPI processes
>   type: seq
> 1.
> 2.
> Vec Object: 1 MPI processes
>   type: seq
> -1.
> -2.
> [1]PETSC ERROR: --
> --
> [1]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation,
> probably memory access out of range
>
> >> more vecScatterGatherRoot.cpp
> // How do I collect all the values from a sequential vector on the zeroth
> processor into a parallel PETSc vector ?
> //
> // ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc
> -lm; mpirun -n X vecScatterGatherRoot.exe
>
> #include "petsc.h"
>
> int main(int argc,char **argv) {
>   PetscInitialize(, , NULL, NULL);
>   int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
>   int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );
>
>   PetscInt globSize = size;
>   Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
>   VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
>   VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
>   VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
> PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
>
>   // Collect all the values from a parallel PETSc vector into a vector on
> the zeroth processor.
>
>   Vec locVec = NULL;
>   if (rank == 0) {
> PetscInt locSize = globSize;
> VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
>   }
>   VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
>   VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES,
> SCATTER_FORWARD);
>   VecScatterEnd  (scatCtx, globVec, locVec, INSERT_VALUES,
> SCATTER_FORWARD);
>
>   // Modify sequential vector on the zeroth processor.
>
>   if (rank == 0) {
> VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
> VecScale(locVec, -1.);
> VecView(locVec, PETSC_VIEWER_STDOUT_SELF);
> PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
>   }
>   MPI_Barrier(MPI_COMM_WORLD);
>
>   // How do I collect all the values from a sequential vector on the
> zeroth processor into a parallel PETSc vector ?
>
>   VecSet(globVec, 0.);
>   VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>   VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
>   VecView(globVec, PETSC_VIEWER_STDOUT_WORLD);
> PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);
>
>   PetscFinalize();
> }
>
>


-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener

https://www.cse.buffalo.edu/~knepley/ 


[petsc-dev] How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

2018-01-03 Thread Franck Houssen
How do I collect all the values from a sequential vector on the zeroth 
processor into a parallel PETSc vector ? 
Shall I use VecScatterCreateToZero "backward", or, use VecScatterCreate instead 
? If yes, how ? (my understanding is that VecScatterCreate can take only 
parallel vector as input) 
Not sure how to do this. 

Franck 

In this example, the final VecView of the parallel globVec vector should be 
[-1., -2.] 

>> mpirun -n 2 ./vecScatterGatherRoot.exe 
Vec Object: 2 MPI processes 
type: mpi 
Process [0] 
1. 
Process [1] 
2. 
Vec Object: 1 MPI processes 
type: seq 
1. 
2. 
Vec Object: 1 MPI processes 
type: seq 
-1. 
-2. 
[1]PETSC ERROR: 
 
[1]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation, probably 
memory access out of range 

>> more vecScatterGatherRoot.cpp 
// How do I collect all the values from a sequential vector on the zeroth 
processor into a parallel PETSc vector ? 
// 
// ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc -lm; 
mpirun -n X vecScatterGatherRoot.exe 

#include "petsc.h" 

int main(int argc,char **argv) { 
PetscInitialize(, , NULL, NULL); 
int size = 0; MPI_Comm_size(MPI_COMM_WORLD, ); 
int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, ); 

PetscInt globSize = size; 
Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, ); 
VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES); 
VecAssemblyBegin(globVec); VecAssemblyEnd(globVec); 
VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); 
PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD); 

// Collect all the values from a parallel PETSc vector into a vector on the 
zeroth processor. 

Vec locVec = NULL; 
if (rank == 0) { 
PetscInt locSize = globSize; 
VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.); 
} 
VecScatter scatCtx; VecScatterCreateToZero(globVec, , ); 
VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD); 
VecScatterEnd (scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD); 

// Modify sequential vector on the zeroth processor. 

if (rank == 0) { 
VecView(locVec, PETSC_VIEWER_STDOUT_SELF); 
PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF); 
VecScale(locVec, -1.); 
VecView(locVec, PETSC_VIEWER_STDOUT_SELF); 
PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF); 
} 
MPI_Barrier(MPI_COMM_WORLD); 

// How do I collect all the values from a sequential vector on the zeroth 
processor into a parallel PETSc vector ? 

VecSet(globVec, 0.); 
VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE); 
VecScatterEnd (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE); 
VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); 
PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD); 

PetscFinalize(); 
} 

// How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?
//
// ~> g++ -o vecScatterGatherRoot.exe vecScatterGatherRoot.cpp -lpetsc -lm; mpirun -n X vecScatterGatherRoot.exe

#include "petsc.h"

int main(int argc,char **argv) {
  PetscInitialize(, , NULL, NULL);
  int size = 0; MPI_Comm_size(MPI_COMM_WORLD, );
  int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD, );

  PetscInt globSize = size;
  Vec globVec; VecCreateMPI(PETSC_COMM_WORLD, 1, globSize, );
  VecSetValue(globVec, rank, (PetscScalar) (1.+rank), INSERT_VALUES);
  VecAssemblyBegin(globVec); VecAssemblyEnd(globVec);
  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);

  // Collect all the values from a parallel PETSc vector into a vector on the zeroth processor.

  Vec locVec = NULL;
  if (rank == 0) {
PetscInt locSize = globSize;
VecCreateSeq(PETSC_COMM_SELF, locSize, ); VecSet(locVec, -1.);
  }
  VecScatter scatCtx; VecScatterCreateToZero(globVec, , );
  VecScatterBegin(scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);
  VecScatterEnd  (scatCtx, globVec, locVec, INSERT_VALUES, SCATTER_FORWARD);

  // Modify sequential vector on the zeroth processor.

  if (rank == 0) {
VecView(locVec, PETSC_VIEWER_STDOUT_SELF); PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
VecScale(locVec, -1.);
VecView(locVec, PETSC_VIEWER_STDOUT_SELF); PetscViewerFlush(PETSC_VIEWER_STDOUT_SELF);
  }
  MPI_Barrier(MPI_COMM_WORLD);

  // How do I collect all the values from a sequential vector on the zeroth processor into a parallel PETSc vector ?

  VecSet(globVec, 0.);
  VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
  VecScatterEnd  (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE);
  VecView(globVec, PETSC_VIEWER_STDOUT_WORLD); PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);

  PetscFinalize();
}