> On Jan 5, 2017, at 6:21 PM, Manuel Valera <[email protected]> wrote:
> 
> Hello Devs is me again,
> 
> I'm trying to distribute a vector to all called processes, the vector would 
> be originally in root as a sequential vector and i would like to scatter it, 
> what would the best call to do this ?
> 
> I already know how to gather a distributed vector to root with 
> VecScatterCreateToZero, this would be the inverse operation, 

   Use the same VecScatter object but with SCATTER_REVERSE, not you need to 
reverse the two vector arguments as well.


> i'm currently trying with VecScatterCreate() and as of now im doing the 
> following:
> 
> 
> if(rank==0)then
> 
> 
>      call VecCreate(PETSC_COMM_SELF,bp0,ierr); CHKERRQ(ierr) !if i use WORLD 
>                                                              !freezes in 
> SetSizes
>      call VecSetSizes(bp0,PETSC_DECIDE,nbdp,ierr); CHKERRQ(ierr)
>      call VecSetType(bp0,VECSEQ,ierr)
>      call VecSetFromOptions(bp0,ierr); CHKERRQ(ierr)
> 
> 
>      call VecSetValues(bp0,nbdp,ind,Rhs,INSERT_VALUES,ierr)
> 
>      !call VecSet(bp0,5.0D0,ierr); CHKERRQ(ierr)
> 
> 
>      call VecView(bp0,PETSC_VIEWER_STDOUT_WORLD,ierr)
> 
>      call VecAssemblyBegin(bp0,ierr) ; call VecAssemblyEnd(bp0,ierr) !rhs
> 
>      do i=0,nbdp-1,1
>         ind(i+1) = i
>      enddo
> 
>      call 
> ISCreateGeneral(PETSC_COMM_SELF,nbdp,ind,PETSC_COPY_VALUES,locis,ierr)
> 
>     !call VecScatterCreate(bp0,PETSC_NULL_OBJECT,bp2,is,ctr,ierr) !if i use 
> SELF 
>                                                                   !freezes 
> here.
> 
>      call VecScatterCreate(bp0,locis,bp2,PETSC_NULL_OBJECT,ctr,ierr)
> 
> endif
> 
> bp2 being the receptor MPI vector to scatter to
> 
> But it freezes in VecScatterCreate when trying to use more than one 
> processor, what would be a better approach ?
> 
> 
> Thanks once again,
> 
> Manuel
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> On Wed, Jan 4, 2017 at 3:30 PM, Manuel Valera <[email protected]> wrote:
> Thanks i had no idea how to debug and read those logs, that solved this issue 
> at least (i was sending a message from root to everyone else, but trying to 
> catch from everyone else including root)
> 
> Until next time, many thanks,
> 
> Manuel
> 
> On Wed, Jan 4, 2017 at 3:23 PM, Matthew Knepley <[email protected]> wrote:
> On Wed, Jan 4, 2017 at 5:21 PM, Manuel Valera <[email protected]> wrote:
> I did a PetscBarrier just before calling the vicariate routine and im pretty 
> sure im calling it from every processor, code looks like this:
> 
> From the gdb trace.
> 
>   Proc 0: Is in some MPI routine you call yourself, line 113
> 
>   Proc 1: Is in VecCreate(), line 130
> 
> You need to fix your communication code.
> 
>    Matt
>  
> call PetscBarrier(PETSC_NULL_OBJECT,ierr)
> 
> print*,'entering POInit from',rank
> !call exit()
> 
> call PetscObjsInit()
> 
> 
> And output gives:
> 
>  entering POInit from           0
>  entering POInit from           1
>  entering POInit from           2
>  entering POInit from           3
> 
> 
> Still hangs in the same way,
> 
> Thanks,
> 
> Manuel
> 
>  
> 
> On Wed, Jan 4, 2017 at 2:55 PM, Manuel Valera <[email protected]> wrote:
> Thanks for the answers ! 
> 
> heres the screenshot of what i got from bt in gdb (great hint in how to debug 
> in petsc, didn't know that)
> 
> I don't really know what to look at here, 
> 
> Thanks,
> 
> Manuel
> 
> On Wed, Jan 4, 2017 at 2:39 PM, Dave May <[email protected]> wrote:
> Are you certain ALL ranks in PETSC_COMM_WORLD call these function(s). These 
> functions cannot be inside if statements like
> if (rank == 0){
>   VecCreateMPI(...)
> }
> 
> 
> On Wed, 4 Jan 2017 at 23:34, Manuel Valera <[email protected]> wrote:
> Thanks Dave for the quick answer, appreciate it,
> 
> I just tried that and it didn't make a difference, any other suggestions ?
> 
> Thanks,
> Manuel
> 
> On Wed, Jan 4, 2017 at 2:29 PM, Dave May <[email protected]> wrote:
> You need to swap the order of your function calls.
> Call VecSetSizes() before VecSetType()
> 
> Thanks,
>   Dave
> 
> 
> On Wed, 4 Jan 2017 at 23:21, Manuel Valera <[email protected]> wrote:
> Hello all, happy new year,
> 
> I'm working on parallelizing my code, it worked and provided some results 
> when i just called more than one processor, but created artifacts because i 
> didn't need one image of the whole program in each processor, conflicting 
> with each other. 
> 
> Since the pressure solver is the main part i need in parallel im chosing mpi 
> to run everything in root processor until its time to solve for pressure, at 
> this point im trying to create a distributed vector using either 
> 
>      call VecCreateMPI(PETSC_COMM_WORLD,PETSC_DECIDE,nbdp,xp,ierr)
> or
>      call VecCreate(PETSC_COMM_WORLD,xp,ierr); CHKERRQ(ierr)
>      call VecSetType(xp,VECMPI,ierr)  
>      call VecSetSizes(xp,PETSC_DECIDE,nbdp,ierr); CHKERRQ(ierr)
> 
> 
> In both cases program hangs at this point, something it never happened on the 
> naive way i described before. I've made sure the global size, nbdp, is the 
> same in every processor. What can be wrong?
> 
> Thanks for your kind help,
> 
> Manuel.
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> -- 
> 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
> 
> 

Reply via email to