1*dd5b3ca6SJunchao Zhang #include <../src/vec/is/sf/impls/basic/gatherv/sfgatherv.h> 2*dd5b3ca6SJunchao Zhang 3*dd5b3ca6SJunchao Zhang typedef PetscSFPack_Allgatherv PetscSFPack_Gather; 4*dd5b3ca6SJunchao Zhang #define PetscSFPackGet_Gather PetscSFPackGet_Allgatherv 5*dd5b3ca6SJunchao Zhang 6*dd5b3ca6SJunchao Zhang /* Reuse the type. The difference is some fields (i.e., displs, recvcounts) are not used in Gather, which is not a big deal */ 7*dd5b3ca6SJunchao Zhang typedef PetscSF_Allgatherv PetscSF_Gather; 8*dd5b3ca6SJunchao Zhang 9*dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFBcastAndOpBegin_Gather(PetscSF sf,MPI_Datatype unit,const void *rootdata,void *leafdata,MPI_Op op) 10*dd5b3ca6SJunchao Zhang { 11*dd5b3ca6SJunchao Zhang PetscErrorCode ierr; 12*dd5b3ca6SJunchao Zhang PetscSFPack_Gatherv link; 13*dd5b3ca6SJunchao Zhang PetscMPIInt rank,sendcount; 14*dd5b3ca6SJunchao Zhang MPI_Comm comm; 15*dd5b3ca6SJunchao Zhang void *recvbuf; 16*dd5b3ca6SJunchao Zhang 17*dd5b3ca6SJunchao Zhang PetscFunctionBegin; 18*dd5b3ca6SJunchao Zhang ierr = PetscSFPackGet_Gatherv(sf,unit,rootdata,&link);CHKERRQ(ierr); 19*dd5b3ca6SJunchao Zhang ierr = PetscObjectGetComm((PetscObject)sf,&comm);CHKERRQ(ierr); 20*dd5b3ca6SJunchao Zhang 21*dd5b3ca6SJunchao Zhang if (op == MPIU_REPLACE) { 22*dd5b3ca6SJunchao Zhang recvbuf = leafdata; 23*dd5b3ca6SJunchao Zhang } else { 24*dd5b3ca6SJunchao Zhang ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 25*dd5b3ca6SJunchao Zhang if (!link->leaf && !rank) {ierr = PetscMalloc(sf->nleaves*link->unitbytes,&link->leaf);CHKERRQ(ierr);} 26*dd5b3ca6SJunchao Zhang recvbuf = link->leaf; 27*dd5b3ca6SJunchao Zhang } 28*dd5b3ca6SJunchao Zhang 29*dd5b3ca6SJunchao Zhang ierr = PetscMPIIntCast(sf->nroots,&sendcount);CHKERRQ(ierr); 30*dd5b3ca6SJunchao Zhang ierr = MPIU_Igather(rootdata,sendcount,unit,recvbuf,sendcount,unit,0/*rank 0*/,comm,&link->request);CHKERRQ(ierr); 31*dd5b3ca6SJunchao Zhang PetscFunctionReturn(0); 32*dd5b3ca6SJunchao Zhang } 33*dd5b3ca6SJunchao Zhang 34*dd5b3ca6SJunchao Zhang static PetscErrorCode PetscSFReduceBegin_Gather(PetscSF sf,MPI_Datatype unit,const void *leafdata,void *rootdata,MPI_Op op) 35*dd5b3ca6SJunchao Zhang { 36*dd5b3ca6SJunchao Zhang PetscErrorCode ierr; 37*dd5b3ca6SJunchao Zhang PetscSFPack_Gatherv link; 38*dd5b3ca6SJunchao Zhang PetscMPIInt recvcount; 39*dd5b3ca6SJunchao Zhang MPI_Comm comm; 40*dd5b3ca6SJunchao Zhang void *recvbuf; 41*dd5b3ca6SJunchao Zhang 42*dd5b3ca6SJunchao Zhang PetscFunctionBegin; 43*dd5b3ca6SJunchao Zhang ierr = PetscSFPackGet_Gatherv(sf,unit,leafdata,&link);CHKERRQ(ierr); 44*dd5b3ca6SJunchao Zhang ierr = PetscObjectGetComm((PetscObject)sf,&comm);CHKERRQ(ierr); 45*dd5b3ca6SJunchao Zhang 46*dd5b3ca6SJunchao Zhang if (op == MPIU_REPLACE) { 47*dd5b3ca6SJunchao Zhang recvbuf = rootdata; 48*dd5b3ca6SJunchao Zhang } else { 49*dd5b3ca6SJunchao Zhang if (!link->root) {ierr = PetscMalloc(sf->nroots*link->unitbytes,&link->root);CHKERRQ(ierr);} 50*dd5b3ca6SJunchao Zhang recvbuf = link->root; 51*dd5b3ca6SJunchao Zhang } 52*dd5b3ca6SJunchao Zhang 53*dd5b3ca6SJunchao Zhang ierr = PetscMPIIntCast(sf->nroots,&recvcount);CHKERRQ(ierr); 54*dd5b3ca6SJunchao Zhang ierr = MPIU_Iscatter(leafdata,recvcount,unit,recvbuf,recvcount,unit,0/*rank 0*/,comm,&link->request);CHKERRQ(ierr); 55*dd5b3ca6SJunchao Zhang PetscFunctionReturn(0); 56*dd5b3ca6SJunchao Zhang } 57*dd5b3ca6SJunchao Zhang 58*dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Gather(PetscSF sf) 59*dd5b3ca6SJunchao Zhang { 60*dd5b3ca6SJunchao Zhang PetscErrorCode ierr; 61*dd5b3ca6SJunchao Zhang PetscSF_Gather *dat = (PetscSF_Gather*)sf->data; 62*dd5b3ca6SJunchao Zhang 63*dd5b3ca6SJunchao Zhang PetscFunctionBegin; 64*dd5b3ca6SJunchao Zhang /* Inherit from Allgatherv */ 65*dd5b3ca6SJunchao Zhang sf->ops->Reset = PetscSFReset_Allgatherv; 66*dd5b3ca6SJunchao Zhang sf->ops->Destroy = PetscSFDestroy_Allgatherv; 67*dd5b3ca6SJunchao Zhang sf->ops->GetGraph = PetscSFGetGraph_Allgatherv; 68*dd5b3ca6SJunchao Zhang sf->ops->GetRootRanks = PetscSFGetRootRanks_Allgatherv; 69*dd5b3ca6SJunchao Zhang sf->ops->GetLeafRanks = PetscSFGetLeafRanks_Allgatherv; 70*dd5b3ca6SJunchao Zhang sf->ops->BcastAndOpEnd = PetscSFBcastAndOpEnd_Allgatherv; 71*dd5b3ca6SJunchao Zhang sf->ops->ReduceEnd = PetscSFReduceEnd_Allgatherv; 72*dd5b3ca6SJunchao Zhang sf->ops->FetchAndOpEnd = PetscSFFetchAndOpEnd_Allgatherv; 73*dd5b3ca6SJunchao Zhang sf->ops->CreateLocalSF = PetscSFCreateLocalSF_Allgatherv; 74*dd5b3ca6SJunchao Zhang 75*dd5b3ca6SJunchao Zhang /* Inherit from Gatherv */ 76*dd5b3ca6SJunchao Zhang sf->ops->FetchAndOpBegin = PetscSFFetchAndOpBegin_Gatherv; 77*dd5b3ca6SJunchao Zhang 78*dd5b3ca6SJunchao Zhang /* Gather stuff */ 79*dd5b3ca6SJunchao Zhang sf->ops->BcastAndOpBegin = PetscSFBcastAndOpBegin_Gather; 80*dd5b3ca6SJunchao Zhang sf->ops->ReduceBegin = PetscSFReduceBegin_Gather; 81*dd5b3ca6SJunchao Zhang 82*dd5b3ca6SJunchao Zhang ierr = PetscNewLog(sf,&dat);CHKERRQ(ierr); 83*dd5b3ca6SJunchao Zhang sf->data = (void*)dat; 84*dd5b3ca6SJunchao Zhang PetscFunctionReturn(0); 85*dd5b3ca6SJunchao Zhang } 86*dd5b3ca6SJunchao Zhang 87