本文整理汇总了C++中stk::mesh::Entity::entity_rank方法的典型用法代码示例。如果您正苦于以下问题:C++ Entity::entity_rank方法的具体用法?C++ Entity::entity_rank怎么用?C++ Entity::entity_rank使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类stk::mesh::Entity
的用法示例。
在下文中一共展示了Entity::entity_rank方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: assert
//----------------------------------------------------------------------------
//
// Random fracture criterion function.
//
bool
RandomCriterion::computeFractureCriterion(stk::mesh::Entity& entity, double p) {
// Fracture only defined on the boundary of the elements
stk::mesh::EntityRank rank = entity.entity_rank();
assert(rank == num_dim_ - 1);
stk::mesh::PairIterRelation neighbor_elems =
entity.relations(element_rank_);
// Need an element on each side
if(neighbor_elems.size() != 2)
return false;
bool is_open = false;
// All we need to do is generate a number between 0 and 1
double random = 0.5 + 0.5 * Teuchos::ScalarTraits<double>::random();
if(random < p) {
is_open = true;
}
return is_open;
}
示例2: if
//----------------------------------------------------------------------------
//
// Stress fracture criterion function.
//
bool
StressFracture::computeFractureCriterion(stk::mesh::Entity entity, double p) {
// Fracture only defined on the boundary of the elements
stk::mesh::EntityRank rank = entity.entity_rank();
assert(rank == num_dim_ - 1);
stk::mesh::PairIterRelation neighbor_elems =
entity.relations(element_rank_);
// Need an element on each side of the edge
if(neighbor_elems.size() != 2)
return false;
// Note that these are element GIDs
stk::mesh::EntityId elem_0_Id =
neighbor_elems[0].entity()->identifier();
stk::mesh::EntityId elem_1_Id =
neighbor_elems[1].entity()->identifier();
Albany::WsLIDList& elemGIDws = stk_.getElemGIDws();
// Have two elements, one on each size of the edge (or
// face). Check and see if the stresses are such that we want to
// split the mesh here.
//
// Initial hack - GAH: if the average stress between two elements
// is above the input value "Fracture Stress", split them at the
// edge
bool is_open = false;
// Check criterion
// If average between cells is above crit, split
// if (0.5 * (avg_stresses[elemGIDws[elem_0_Id].ws][elemGIDws[elem_0_Id].LID] +
// avg_stresses[elemGIDws[elem_1_Id].ws][elemGIDws[elem_1_Id].LID]) >= crit_stress){
// If stress difference across face it above crit, split
// if (fabs(avg_stresses[elemGIDws[elem_0_Id].ws][elemGIDws[elem_0_Id].LID] -
// avg_stresses[elemGIDws[elem_1_Id].ws][elemGIDws[elem_1_Id].LID]) >= crit_stress){
// Just split the doggone elements already!!!
if(p == 5) {
if((elem_0_Id - 1 == 35 && elem_1_Id - 1 == 140) ||
(elem_1_Id - 1 == 35 && elem_0_Id - 1 == 140)) {
is_open = true;
std::cout << "Splitting elements " << elem_0_Id - 1 << " and " << elem_1_Id - 1 << std::endl;
//std::cout << avg_stresses[elemGIDws[elem_0_Id].ws][elemGIDws[elem_0_Id].LID] << " " <<
// avg_stresses[elemGIDws[elem_1_Id].ws][elemGIDws[elem_1_Id].LID] << std::endl;
}
}
else if(p == 10) {
if((elem_0_Id - 1 == 42 && elem_1_Id - 1 == 147) ||
(elem_1_Id - 1 == 42 && elem_0_Id - 1 == 147)) {
is_open = true;
std::cout << "Splitting elements " << elem_0_Id - 1 << " and " << elem_1_Id - 1 << std::endl;
}
}
else if(p == 15) {
if((elem_0_Id - 1 == 49 && elem_1_Id - 1 == 154) ||
(elem_1_Id - 1 == 49 && elem_0_Id - 1 == 154)) {
is_open = true;
std::cout << "Splitting elements " << elem_0_Id - 1 << " and " << elem_1_Id - 1 << std::endl;
}
}
return is_open;
}
示例3: runtime_error
unsigned
Albany::STKDiscretization::determine_local_side_id( const stk::mesh::Entity & elem , stk::mesh::Entity & side ) {
using namespace stk;
const CellTopologyData * const elem_top = mesh::fem::get_cell_topology( elem ).getCellTopologyData();
const mesh::PairIterRelation elem_nodes = elem.relations( mesh::fem::FEMMetaData::NODE_RANK );
const mesh::PairIterRelation side_nodes = side.relations( mesh::fem::FEMMetaData::NODE_RANK );
int side_id = -1 ;
if(elem_nodes.size() == 0 || side_nodes.size() == 0){ // Node relations are not present, look at elem->face
int elem_rank = elem.entity_rank();
const mesh::PairIterRelation elem_sides = elem.relations( elem_rank - 1);
for ( unsigned i = 0 ; i < elem_sides.size() ; ++i ) {
const stk::mesh::Entity & elem_side = *elem_sides[i].entity();
if(elem_side.identifier() == side.identifier()){ // Found the local side in the element
side_id = static_cast<int>(i);
return side_id;
}
}
if ( side_id < 0 ) {
std::ostringstream msg ;
msg << "determine_local_side_id( " ;
msg << elem_top->name ;
msg << " , Element[ " ;
msg << elem.identifier();
msg << " ]{" ;
for ( unsigned i = 0 ; i < elem_sides.size() ; ++i ) {
msg << " " << elem_sides[i].entity()->identifier();
}
msg << " } , Side[ " ;
msg << side.identifier();
msg << " ] ) FAILED" ;
throw std::runtime_error( msg.str() );
}
}
else { // Conventional elem->node - side->node connectivity present
for ( unsigned i = 0 ; side_id == -1 && i < elem_top->side_count ; ++i ) {
const CellTopologyData & side_top = * elem_top->side[i].topology ;
const unsigned * side_map = elem_top->side[i].node ;
if ( side_nodes.size() == side_top.node_count ) {
side_id = i ;
for ( unsigned j = 0 ;
side_id == static_cast<int>(i) && j < side_top.node_count ; ++j ) {
mesh::Entity * const elem_node = elem_nodes[ side_map[j] ].entity();
bool found = false ;
for ( unsigned k = 0 ; ! found && k < side_top.node_count ; ++k ) {
found = elem_node == side_nodes[k].entity();
}
if ( ! found ) { side_id = -1 ; }
}
}
}
if ( side_id < 0 ) {
std::ostringstream msg ;
msg << "determine_local_side_id( " ;
msg << elem_top->name ;
msg << " , Element[ " ;
msg << elem.identifier();
msg << " ]{" ;
for ( unsigned i = 0 ; i < elem_nodes.size() ; ++i ) {
msg << " " << elem_nodes[i].entity()->identifier();
}
msg << " } , Side[ " ;
msg << side.identifier();
msg << " ]{" ;
for ( unsigned i = 0 ; i < side_nodes.size() ; ++i ) {
msg << " " << side_nodes[i].entity()->identifier();
}
msg << " } ) FAILED" ;
throw std::runtime_error( msg.str() );
}
}
return static_cast<unsigned>(side_id) ;
}