On Thu, Aug 25, 2016 at 1:59 PM, Mark Adams <mfad...@lbl.gov> wrote:

> We have the subroutine below that scatters three vectors.  We have used
> this code on many machines and it works fine but on one machine data does
> not get scattered correctly. The first scatter looks OK, but it looks like
> the other two are missing data.
>
> Am I using this correctly?  Should we use VecGetArray in here instead of
> just using the pointer used for construction? Is there a race condition
> here that I'm missing?
>
> Thanks,
> Mark
>
> subroutine scatter_to_xgc(a_ts,a_XX,a_n1,a_apar,a_phi,ierr)
>   use petscts
>   use sml_module,only:sml_mype
>   use xgc_ts_module
>   implicit none
>   type(xgc_ts),intent(in)::a_ts
>   Vec,intent(in)::a_XX
>   real (kind=8),dimension(a_ts%nnode)::a_n1,a_apar,a_phi
>   PetscErrorCode,intent(out)::ierr
>   ! locals
>   PetscInt,parameter::ione=1
>   PetscScalar,dimension(a_ts%nnode)::n1,apar,phi
>   Vec::xxvec(0:2)
>
>   ! scatter solution back - n1
>   n1 = a_n1
>   call VecCreateSeqWithArray(PETSC_COMM_SELF,ione,a_ts%nnode,n1,
> xxvec(0),ierr);CHKERRQ(ierr)
>   call VecScatterBegin(a_ts%from_petsc(0),a_XX,xxvec(0),INSERT_
> VALUES,SCATTER_FORWARD,ierr)
>
>   ! scatter solution back - apar
>   apar = a_apar
>   call VecCreateSeqWithArray(PETSC_COMM_SELF,ione,a_ts%nnode,
> apar,xxvec(1),ierr);CHKERRQ(ierr)
>   call VecScatterBegin(a_ts%from_petsc(1),a_XX,xxvec(1),INSERT_
> VALUES,SCATTER_FORWARD,ierr)
>
>   ! scatter solution back - phi
>   phi = a_phi
>   call VecCreateSeqWithArray(PETSC_COMM_SELF,ione,a_ts%nnode,phi,
> xxvec(2),ierr);CHKERRQ(ierr)
>   call VecScatterBegin(a_ts%from_petsc(2),a_XX,xxvec(2),INSERT_
> VALUES,SCATTER_FORWARD,ierr)
>
>   ! end
>   call VecScatterEnd(  a_ts%from_petsc(0),a_XX,xxvec(0),INSERT_VALUES,
> SCATTER_FORWARD,ierr)
>   a_n1 = n1
>

Why is the line above in here?

   Matt


>   call VecDestroy(xxvec(0),ierr)
>
>   call VecScatterEnd(  a_ts%from_petsc(1),a_XX,xxvec(1),INSERT_VALUES,
> SCATTER_FORWARD,ierr)
>   a_apar = apar
>   call VecDestroy(xxvec(1),ierr)
>
>   call VecScatterEnd(  a_ts%from_petsc(2),a_XX,xxvec(2),INSERT_VALUES,
> SCATTER_FORWARD,ierr)
>   a_phi = phi
>   call VecDestroy(xxvec(2),ierr)
>
>   return
> end subroutine scatter_to_xgc
>



-- 
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