本文整理汇总了C++中Attr::GetBlock方法的典型用法代码示例。如果您正苦于以下问题:C++ Attr::GetBlock方法的具体用法?C++ Attr::GetBlock怎么用?C++ Attr::GetBlock使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Attr
的用法示例。
在下文中一共展示了Attr::GetBlock方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: sync
void static sync(CommRel &comm) {
Trace __trace("sync(CommRel &comm)");
UInt csize = Par::Size();
SparseMsg msg;
// Sizing loop
std::vector<UInt> send_sizes_all(csize, 0);
std::vector<UInt> to_proc;
std::vector<UInt> to_sizes;
CommRel::MapType::iterator di = comm.domain_begin(), de = comm.domain_end();
for (; di != de; ++di) {
UInt proc = di->processor;
std::vector<UInt>::iterator lb =
std::lower_bound(to_proc.begin(), to_proc.end(), proc);
if (lb == to_proc.end() || *lb != proc)
to_proc.insert(lb, proc);
// Attr
send_sizes_all[proc] += SparsePack<Attr>::size();
} //sizes
UInt nsend = to_proc.size();
msg.setPattern(nsend, nsend == 0 ? NULL : &to_proc[0]);
to_sizes.resize(nsend, 0);
for (UInt i = 0; i < nsend; i++)
to_sizes[i] = send_sizes_all[to_proc[i]];
msg.setSizes(nsend == 0 ? NULL : &to_sizes[0]);
// Pack loop
di = comm.domain_begin();
for (; di != de; ++di) {
UInt proc = di->processor;
MeshObj &obj = *di->obj;
SparseMsg::buffer &b = *msg.getSendBuffer(proc);
// Attr
SparsePack<Attr>(b, GetAttr(obj));
}
if (!msg.filled())
Throw() << "Message not full in sync attr!";
msg.communicate();
// Create an object to context map so that objects are
// only updated in the mesh onces.
typedef std::map<MeshObj*, Context> Obj_To_Ctxt_Type;
Obj_To_Ctxt_Type obj_to_ctxt;
// Unpack
di = comm.domain_begin();
for (; di != de; ++di) {
MeshObj &obj = *di->obj;
UInt proc = di->processor;
SparseMsg::buffer &b = *msg.getRecvBuffer(proc);
Attr a;
SparseUnpack<Attr>(b, a);
// Now the kernel. Or all attributes except the shared ones
// (ownership, etc...)
const Attr &oa = GetAttr(obj);
// For sanity:
ThrowRequire(a.GetType() == oa.GetType());
ThrowRequire(a.GetBlock() == oa.GetBlock());
// Now merge the contexts
Context c = a.GetContext();
const Context &oc = oa.GetContext();
Context nc(oc);
// More sanity checks
//ThrowRequire(c.is_set(Attr::ACTIVE_ID) == oc.is_set(Attr::ACTIVE_ID));
if (!(c.is_set(Attr::ACTIVE_ID) == oc.is_set(Attr::ACTIVE_ID))) {
Par::Out() << "Error, ACTIVE_ID incongruence, obj:" << obj;
Par::Out() << "Incoming ctxt:" << c << std::endl;
Throw();
}
ThrowRequire(c.is_set(Attr::SHARED_ID) && oc.is_set(Attr::SHARED_ID));
ThrowRequire(c.is_set(Attr::GENESIS_ID) == oc.is_set(Attr::GENESIS_ID));
// Both can't claim to own object
//ThrowRequire(!(c.is_set(Attr::OWNED_ID) && oc.is_set(Attr::OWNED_ID)));
if ((c.is_set(Attr::OWNED_ID) && oc.is_set(Attr::OWNED_ID))) {
Par::Out() << "Error, OWNED_ID incongruence, obj:" << obj;
Par::Out() << "Incoming attr:" << a << std::endl;
Par::Out() << "From processor:" << proc << std::endl;
Throw();
}
// Clear the bits not to merge
//.........这里部分代码省略.........