47 std::vector<std::vector<EntityHandle>> sbuffer(m_field.
get_comm_size());
49 Range::iterator eit = ents.begin();
50 for (; eit != ents.end(); eit++) {
52 auto meit = ref_ents_ptr->get<Ent_mi_tag>().find(*eit);
53 if (meit == ref_ents_ptr->get<Ent_mi_tag>().end()) {
56 "rank %d entity %lu not exist on database, local entity can not "
57 "be found for this owner",
61 unsigned char pstatus = (*meit)->getPStatus();
67 MOFEM_LOG(
"SYNC", Sev::noisy) <<
"pstatus " << std::bitset<8>(pstatus);
71 proc < MAX_SHARING_PROCS && -1 != (*meit)->getSharingProcsPtr()[proc];
73 if ((*meit)->getSharingProcsPtr()[proc] == -1)
75 "sharing processor not set");
77 if ((*meit)->getSharingProcsPtr()[proc] == m_field.
get_comm_rank())
81 (*meit)->getSharingHandlersPtr()[proc];
82 sbuffer[(*meit)->getSharingProcsPtr()[proc]].push_back(
83 handle_on_sharing_proc);
85 MOFEM_LOG_C(
"SYNC", Sev::noisy,
"send %lu (%lu) to %d at %d\n",
86 (*meit)->getEnt(), handle_on_sharing_proc,
87 (*meit)->getSharingProcsPtr()[proc],
90 if (!(pstatus & PSTATUS_MULTISHARED))
96 std::vector<int> sbuffer_lengths(
98 const size_t block_size =
sizeof(
EntityHandle) /
sizeof(
int);
101 if (!sbuffer[proc].empty()) {
103 sbuffer_lengths[proc] = sbuffer[proc].size() * block_size;
108 sbuffer_lengths[proc] = 0;
120 CHKERR PetscGatherNumberOfMessages(comm, NULL, &sbuffer_lengths[0], &nrecvs);
126 CHKERR PetscGatherMessageLengths(comm, nsends, nrecvs, &sbuffer_lengths[0],
134 CHKERR PetscCommGetNewTag(comm, &tag);
139 MPI_Request *r_waits;
143 CHKERR PetscPostIrecvInt(comm, tag, nrecvs, onodes, olengths, &rbuf,
146 MPI_Request *s_waits;
147 CHKERR PetscMalloc1(nsends, &s_waits);
150 for (
int proc = 0, kk = 0; proc < m_field.
get_comm_size(); proc++) {
151 if (!sbuffer_lengths[proc])
153 CHKERR MPI_Isend(&(sbuffer[proc])[0],
154 sbuffer_lengths[proc],
156 tag, comm, s_waits + kk);
162 CHKERR MPI_Waitall(nrecvs, r_waits, &status[0]);
166 CHKERR MPI_Waitall(nsends, s_waits, &status[0]);
169 MOFEM_LOG_C(
"SYNC", Sev::verbose,
"Rank %d nb. before ents %u\n",
174 for (
int kk = 0; kk < nrecvs; kk++) {
176 int len = olengths[kk];
177 int *data_from_proc = rbuf[kk];
179 for (
int ee = 0; ee < len; ee += block_size) {
183 auto meit = ref_ents_ptr->get<Ent_mi_tag>().find(ent);
184 if (meit == ref_ents_ptr->get<Ent_mi_tag>().end())
186 "rank %d entity %lu not exist on database, local entity can "
187 "not be found for this owner",
191 MOFEM_LOG_C(
"SYNC", Sev::verbose,
"received %ul (%ul) from %d at %d\n",
192 (*meit)->getEnt(), ent, onodes[kk],
195 ents.insert((*meit)->getEnt());
200 PetscSynchronizedPrintf(m_field.
get_comm(),
"Rank %d nb. after ents %u\n",
204 CHKERR PetscFree(s_waits);
205 CHKERR PetscFree(rbuf[0]);
207 CHKERR PetscFree(r_waits);
209 CHKERR PetscFree(olengths);
210 CHKERR PetscCommDestroy(&comm);
#define MOFEM_LOG_C(channel, severity, format,...)
@ MOFEM_DATA_INCONSISTENCY
virtual const RefEntity_multiIndex * get_ref_ents() const =0
Get the ref ents object.