本文整理汇总了C++中MeshImpl::vertices_get_attached_elements方法的典型用法代码示例。如果您正苦于以下问题:C++ MeshImpl::vertices_get_attached_elements方法的具体用法?C++ MeshImpl::vertices_get_attached_elements怎么用?C++ MeshImpl::vertices_get_attached_elements使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MeshImpl
的用法示例。
在下文中一共展示了MeshImpl::vertices_get_attached_elements方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: main
//.........这里部分代码省略.........
EntityTopology type;
mesh.elements_get_topologies( &elem, &type, 1, err );
std::copy( conn.begin() + TopologyInfo::corners(type), conn.end(),
std::back_inserter( higher_order ) );
}
std::sort( higher_order.begin(), higher_order.end() );
higher_order.erase( std::unique( higher_order.begin(), higher_order.end() ),
higher_order.end() );
// build depth map for all vertices
while (!next.empty()) {
curr.swap( next );
next.clear();
while (!curr.empty()) {
Mesh::ElementHandle elem = curr.back();
curr.pop_back();
conn.clear();
mesh.elements_get_attached_vertices( &elem, 1, conn, off, err );
if (err) return 1;
int min = std::numeric_limits<int>::max();
for (size_t i = 0; i < conn.size(); ++i) {
d_iter = depth.find( conn[i] );
if (d_iter != depth.end() && d_iter->second < min)
min = d_iter->second;
}
if (min == std::numeric_limits<int>::max()) {
next.push_back( elem );
continue;
}
for (size_t i = 0; i < conn.size(); ++i) {
d_iter = depth.find( conn[i] );
if (d_iter == depth.end() || d_iter->second > min+1)
depth[conn[i]] = min+1;
}
}
}
// write depth map to tag for debugging purposes
std::vector<int> depth_vals(verts.size());
for (size_t i = 0; i < verts.size(); ++i)
depth_vals[i] = depth[verts[i]];
TagHandle tag = mesh.tag_create( "depth", Mesh::INT, 1, 0, err );
if (err) return 1;
mesh.tag_set_vertex_data( tag, verts.size(), arrptr(verts), arrptr(depth_vals), err );
if (err) return 1;
// set tag specifying slaved vertices
for (size_t i = 0; i < verts.size(); ++i)
if (std::binary_search( higher_order.begin(), higher_order.end(), verts[i] ))
depth_vals[i] = depth[verts[i]] > n;
else
depth_vals[i] = 0;
tag = mesh.tag_create( "slaved", Mesh::INT, 1, 0, err );
if (err) return 1;
mesh.tag_set_vertex_data( tag, verts.size(), arrptr(verts), arrptr(depth_vals), err );
if (err) return 1;
// perturb mid-edge nodes along boundary
std::vector<MsqVertex> coords;
for (size_t i = 0; i < skin.size(); ++i) {
if (!std::binary_search( higher_order.begin(), higher_order.end(), skin[i]))
continue;
curr.clear();
mesh.vertices_get_attached_elements( &skin[i], 1, curr, off, err );
if (err) return 1;
assert(curr.size() == 1);
conn.clear();
mesh.elements_get_attached_vertices( arrptr(curr), 1, conn, off, err );
if (err) return 1;
// estimate element center
coords.resize( conn.size() );
mesh.vertices_get_coordinates( arrptr(conn), arrptr(coords), conn.size(), err );
if (err) return 1;
Vector3D mean(0.0);
for (size_t j = 0; j < coords.size(); ++j)
mean += coords[j];
mean /= coords.size();
size_t idx = std::find( conn.begin(), conn.end(), skin[i] ) - conn.begin();
assert(idx < conn.size());
Vector3D init = coords[idx];
Vector3D pos = (1 - PERTURB_FRACT) * init + PERTURB_FRACT * mean;
mesh.vertex_set_coordinates( skin[i], pos, err );
if (err) return 1;
}
mesh.write_vtk( argv[3], err );
if (err) return 1;
return 0;
}
示例2: test_slaved_common
void SlaveBoundaryVerticesTest::test_slaved_common( unsigned depth, unsigned boundary )
{
MeshImpl mesh;
DomainClassifier domain;
make_mesh( mesh, domain, 2*depth+2 );
MsqPrintError err(std::cerr);
std::vector< std::vector<Mesh::VertexHandle> > depths(depth+1);
std::set<Mesh::VertexHandle> non_slave;
std::set<Mesh::VertexHandle>::iterator p;
// find boundary vertices
std::vector<Mesh::VertexHandle> verts;
mesh.get_all_vertices( verts, err ); ASSERT_NO_ERROR(err);
CPPUNIT_ASSERT(!verts.empty());
if (boundary >= 4) {
std::vector<bool> flags;
mesh.vertices_get_fixed_flag( arrptr(verts), flags, verts.size(), err );
ASSERT_NO_ERROR(err);
for (size_t i = 0; i < verts.size(); ++i)
if (flags[i]) {
depths[0].push_back( verts[i] );
non_slave.insert( verts[i] );
}
}
else {
std::vector<unsigned short> dim(verts.size());
domain.domain_DoF( arrptr(verts), arrptr(dim), verts.size(), err );
ASSERT_NO_ERROR(err);
for (size_t i = 0; i < verts.size(); ++i)
if (dim[i] <= boundary) {
depths[0].push_back( verts[i] );
non_slave.insert( verts[i] );
}
}
// check that our input is usable for this test
CPPUNIT_ASSERT( !verts.empty() );
// find all vertices up to specified depth
for (unsigned d = 0; d < depth; ++d) {
for (size_t i = 0; i < depths[d].size(); ++i) {
std::vector<Mesh::ElementHandle> adj;
std::vector<size_t> junk;
mesh.vertices_get_attached_elements( &depths[d][i], 1, adj, junk, err );
ASSERT_NO_ERROR(err);
for(size_t j = 0; j < adj.size(); ++j) {
junk.clear();
std::vector<Mesh::VertexHandle> conn;
mesh.elements_get_attached_vertices( &adj[j], 1, conn, junk, err );
ASSERT_NO_ERROR(err);
for (size_t k = 0; k < conn.size(); ++k) {
p = non_slave.find(conn[k]);
if (p == non_slave.end()) {
non_slave.insert( p, conn[k] );
depths[d+1].push_back( conn[k] );
}
}
}
}
}
// Check that our input is usable for this test:
// Should have some vertices that are not within the specified depth of
// the boundary.
CPPUNIT_ASSERT( non_slave.size() < verts.size() );
// Now build a map of all higher-order nodes in the mesh
std::set<Mesh::VertexHandle> higher_order;
std::vector<Mesh::ElementHandle> elems;
mesh.get_all_elements( elems, err );
ASSERT_NO_ERROR(err);
CPPUNIT_ASSERT(!elems.empty());
std::vector<EntityTopology> types(elems.size());
mesh.elements_get_topologies( arrptr(elems), arrptr(types), elems.size(), err );
ASSERT_NO_ERROR(err);
for (size_t i = 0; i < elems.size(); ++i) {
std::vector<Mesh::VertexHandle> conn;
std::vector<size_t> junk;
mesh.elements_get_attached_vertices( &elems[i], 1, conn, junk, err );
ASSERT_NO_ERROR(err);
for (size_t j = TopologyInfo::corners( types[i] ); j < conn.size(); ++j)
higher_order.insert( conn[j] );
}
// Check that our input is usable for this test:
// Should have some higher-order vertices
CPPUNIT_ASSERT( !higher_order.empty() );
// Now build a map of all fixed vertices
std::set<Mesh::VertexHandle> fixed_vertices;
std::vector<bool> fixed;
mesh.vertices_get_fixed_flag( arrptr(verts), fixed, verts.size(), err );
ASSERT_NO_ERROR(err);
for (size_t i = 0; i < verts.size(); ++i)
if (fixed[i])
fixed_vertices.insert( verts[i] );
// Now actually run the tool
Settings settings;
//.........这里部分代码省略.........