void setSubPatterns( std::vector<UniformRefinerPatternBase *>& bp, percept::PerceptMesh& eMesh ) { EXCEPTWATCH; #if EDGE_QU4_QU9_1_BREAKER bp = std::vector<UniformRefinerPatternBase *>(3u, 0); #else bp = std::vector<UniformRefinerPatternBase *>(1u, 0); #endif if (eMesh.get_spatial_dim() == 3) { bp[0] = this; #if EDGE_QU4_QU9_1_BREAKER bp[1] = m_face_breaker; bp[2] = m_edge_breaker; #endif } else if (eMesh.get_spatial_dim() != 3) { // FIXME std::cout << "ERROR" ; throw std::runtime_error("ERROR in shell quad class"); } }
void setSubPatterns( std::vector<UniformRefinerPatternBase *>& bp, percept::PerceptMesh& eMesh ) { EXCEPTWATCH; #if EDGE_BREAKER_T6_T6 bp = std::vector<UniformRefinerPatternBase *>(2u, 0); #else bp = std::vector<UniformRefinerPatternBase *>(1u, 0); #endif if (eMesh.get_spatial_dim() == 2) { bp[0] = this; #if EDGE_BREAKER_T6_T6 bp[1] = m_edge_breaker; #endif } else if (eMesh.get_spatial_dim() == 3) { // FIXME // std::cout << "ERROR" ; // exit(1); } }
// UniformRefinerPattern(percept::PerceptMesh& eMesh, std::string fromTopoPartName="block_1", std::string toTopoPartName="block_quad_4") // { // setNeededParts(eMesh, fromTopoPartName, toTopoPartName); // } UniformRefinerPattern(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : URP<shards::Quadrilateral<4>, shards::Quadrilateral<4> >(eMesh) { m_primaryEntityRank = eMesh.face_rank(); if (m_eMesh.get_spatial_dim() == 2) m_primaryEntityRank = eMesh.element_rank(); setNeededParts(eMesh, block_names, true); }
BlockNamesType RefinerUtil::correctBlockNamesForPartPartConsistency(percept::PerceptMesh& eMesh, BlockNamesType& blocks) { if (EXTRA_PRINT_UR_GETBLOCKS) std::cout << "RefinerUtil::correctBlockNamesForPartPartConsistency..." << std::endl; if (blocks[eMesh.element_rank()].size() == 0) return blocks; stk_classic::mesh::EntityRank subDimRank = (eMesh.get_spatial_dim() == 3 ? eMesh.face_rank() : eMesh.edge_rank()); mesh::PartVector all_parts = eMesh.get_fem_meta_data()->get_parts(); for (mesh::PartVector::iterator i_part = all_parts.begin(); i_part != all_parts.end(); ++i_part) { mesh::Part * part = *i_part ; for (mesh::PartVector::iterator i_surfacePart = all_parts.begin(); i_surfacePart != all_parts.end(); ++i_surfacePart) { mesh::Part * surfacePart = *i_surfacePart ; if ( stk_classic::mesh::is_auto_declared_part(*surfacePart) ) continue; const CellTopologyData * part_cell_topo_data = stk_classic::percept::PerceptMesh::get_cell_topology(*surfacePart); CellTopology surf_topo(part_cell_topo_data); //if (EXTRA_PRINT_UR_GETBLOCKS) std::cout << "tmp srk surfacePart= " << surfacePart->name() << " topo= " << (part_cell_topo_data?surf_topo.getName() : "NULL") << std::endl; if (part_cell_topo_data && part->primary_entity_rank() == eMesh.element_rank() && surfacePart->primary_entity_rank() == subDimRank) { std::string partNamePlus = "+" + part->name(); std::vector<std::string>::iterator partInBlocks = std::find(blocks[eMesh.element_rank()].begin(), blocks[eMesh.element_rank()].end(), partNamePlus); // if this part is not in the blocks list, skip it if (partInBlocks == blocks[eMesh.element_rank()].end()) { //if (EXTRA_PRINT_UR_GETBLOCKS) std::cout << "tmp srk skipping part= " << partNamePlus << std::endl; continue; } std::string surfacePartNamePlus = "+" + surfacePart->name(); std::vector<std::string>::iterator surfacePartInBlocks = std::find(blocks[subDimRank].begin(), blocks[subDimRank].end(), surfacePartNamePlus); // if this surface is already in the list, skip it if (surfacePartInBlocks != blocks[subDimRank].end()) { //if (EXTRA_PRINT_UR_GETBLOCKS) std::cout << "tmp srk skipping surf= " << surfacePartNamePlus << std::endl; continue; } bool isBoundarySurface= eMesh.isBoundarySurface(*part, *surfacePart); if (EXTRA_PRINT_UR_GETBLOCKS) std::cout << "tmp srk isBoundarySurface for part/surf= " << part->name() << " / " << surfacePart->name() << " = " << isBoundarySurface << std::endl; if (isBoundarySurface) { if (EXTRA_PRINT_UR_GETBLOCKS) std::cout << "tmp part [" << part->name() << "] shares sideset [" << surfacePart->name() << "]" << std::endl; blocks[subDimRank].push_back(std::string("+"+surfacePart->name())); } else { //std::cout << "tmp part [" << part->name() << "] doesn't shares sideset [" << surfacePart->name() << "]" << std::endl; } } } } if (0) std::cout << "tmp RefinerUtil::correctBlockNamesForPartPartConsistency: blocks = " << blocks << std::endl; return blocks; }
UniformRefinerPattern(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : URP<shards::Pyramid<5>, shards::Tetrahedron<4> >(eMesh) { m_primaryEntityRank = eMesh.element_rank(); Elem::StdMeshObjTopologies::bootstrap(); }
UniformRefinerPattern(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : URP<shards::Quadrilateral<4>, shards::Quadrilateral<4> >(eMesh) { m_primaryEntityRank = eMesh.face_rank(); if (m_eMesh.get_spatial_dim() == 2) m_primaryEntityRank = eMesh.element_rank(); setNeededParts(eMesh, block_names, true); Elem::StdMeshObjTopologies::bootstrap(); #if EDGE_BREAKER_Q4_Q4_4_S if (m_eMesh.get_spatial_dim() == 2) m_edge_breaker = new UniformRefinerPattern<shards::Line<2>, shards::Line<2>, 2, SierraPort > (eMesh, block_names) ; else m_edge_breaker = 0; #endif }
UniformRefinerPattern(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : URP<shards::ShellLine<3>, shards::ShellLine<3> >(eMesh) { m_primaryEntityRank = m_eMesh.edge_rank(); if (m_eMesh.get_spatial_dim() == 1) m_primaryEntityRank = eMesh.element_rank(); setNeededParts(eMesh, block_names, true); }
void setSubPatterns( std::vector<UniformRefinerPatternBase *>& bp, percept::PerceptMesh& eMesh ) { EXCEPTWATCH; bp = std::vector<UniformRefinerPatternBase *>(2u, 0); if (eMesh.get_spatial_dim() == 2) { bp[0] = this; #if EDGE_BREAKER_Q4_Q8_1 bp[1] = m_edge_breaker; #endif } else if (eMesh.get_spatial_dim() == 3) { } }
URP_Heterogeneous_Enrich_3D(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : m_eMesh(eMesh) { m_primaryEntityRank = eMesh.element_rank(); Elem::StdMeshObjTopologies::bootstrap(); // list all types of known break patterns to be used here m_bp.resize(0); int spatialDim = eMesh.get_spatial_dim(); // refine // put them in reverse topological rank order if (spatialDim != 3) { throw std::runtime_error("URP_Heterogeneous_Enrich_3D is only for 3D meshes"); } // // refine // m_bp.push_back( new UniformRefinerPattern<shards::Hexahedron<8>, shards::Hexahedron<8>, 8, SierraPort > (eMesh, block_names) ); // m_bp.push_back( new UniformRefinerPattern<shards::Wedge<6>, shards::Wedge<6>, 8, SierraPort > (eMesh, block_names) ); // m_bp.push_back( new UniformRefinerPattern<shards::Tetrahedron<4>, shards::Tetrahedron<4>, 8, SierraPort > (eMesh, block_names) ); // enrich m_bp.push_back ( new UniformRefinerPattern< shards::Wedge<6>, shards::Wedge<15>, 1, SierraPort > (eMesh, block_names) ); m_bp.push_back ( new UniformRefinerPattern<shards::Tetrahedron<4>, shards::Tetrahedron<10>, 1, SierraPort > (eMesh, block_names) ); m_bp.push_back ( new UniformRefinerPattern<shards::Hexahedron<8>, shards::Hexahedron<27>, 1, SierraPort > (eMesh, block_names) ); m_bp.push_back ( new UniformRefinerPattern< shards::Pyramid<5>, shards::Pyramid<13>, 1, SierraPort > (eMesh, block_names) ); //m_bp.push_back( new UniformRefinerPattern<shards::ShellQuadrilateral<4>, shards::ShellQuadrilateral<9>, 1, SierraPort > (eMesh, block_names) ); //m_bp.push_back( new UniformRefinerPattern<shards::ShellTriangle<3>, shards::ShellTriangle<3>, 4, SierraPort > (eMesh, block_names) ); #if FACE_BREAKER_HETERO_ENRICH_3D m_bp.push_back( new UniformRefinerPattern<shards::Quadrilateral<4>, shards::Quadrilateral<4>, 4, SierraPort > (eMesh, block_names) ); m_bp.push_back( new UniformRefinerPattern<shards::Triangle<3>, shards::Triangle<3>, 4, SierraPort > (eMesh, block_names) ); #endif }
UniformRefinerPattern(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : URP<shards::Beam<2>, shards::Beam<2> >(eMesh) { // m_primaryEntityRank = m_eMesh.edge_rank(); // if (m_eMesh.get_spatial_dim() == 1) m_primaryEntityRank = eMesh.element_rank(); setNeededParts(eMesh, block_names, true); Elem::StdMeshObjTopologies::bootstrap(); }
void setSubPatterns( std::vector<UniformRefinerPatternBase *>& bp, percept::PerceptMesh& eMesh ) { EXCEPTWATCH; bp.resize(0); if (eMesh.get_spatial_dim() == 3) { bp.push_back(this); #if EDGE_TR6_TR6_4_BREAKER bp.push_back( m_face_breaker); bp.push_back( m_edge_breaker); #endif } else if (eMesh.get_spatial_dim() != 3) { // FIXME std::cout << "ERROR" ; throw std::runtime_error("ERROR in shell quad class"); } }
//UniformRefinerPattern(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : URP<shards::Pyramid<5>, shards::Pyramid<5> >(eMesh), m_eMesh(eMesh) UniformRefinerPattern(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : m_eMesh(eMesh) { m_primaryEntityRank = eMesh.element_rank(); Elem::StdMeshObjTopologies::bootstrap(); // list all types of known break patterns to be used here m_bp.resize(0); m_bp.push_back(new UniformRefinerPattern<shards::Pyramid<5>, shards::Pyramid<5>, 6, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Pyramid<5>, shards::Tetrahedron<4>, 4, SierraPort > (eMesh, block_names)); bool sameTopology = false; //setNeededParts(eMesh, block_names, sameTopology); m_bp[0]->setNeededParts(eMesh, block_names, sameTopology); // force a new part for pyramids if (DEBUG_Pyramid5_Pyramid5_10) { std::cout << "tmp Pyramid5_Pyramid5_10 printParts m_bp[0]= " ; printParts(m_bp[0]); } m_bp[1]->setNeededParts(eMesh, block_names, sameTopology); if (DEBUG_Pyramid5_Pyramid5_10) { std::cout << "tmp Pyramid5_Pyramid5_10 printParts m_bp[1]= " ; printParts(m_bp[1]); } for (int ibp=0; ibp < 2; ibp++) { stk_classic::mesh::PartVector& fromParts = m_bp[ibp]->getFromParts(); for (unsigned ii=0; ii < fromParts.size(); ii++) { if (std::find(getFromParts().begin(), getFromParts().end(), fromParts[ii]) == getFromParts().end()) { getFromParts().push_back(fromParts[ii]); } } stk_classic::mesh::PartVector& toParts = m_bp[ibp]->getToParts(); for (unsigned ii=0; ii < toParts.size(); ii++) { if (std::find(getToParts().begin(), getToParts().end(), toParts[ii]) == getToParts().end()) { getToParts().push_back(toParts[ii]); } } } if (DEBUG_Pyramid5_Pyramid5_10) { std::cout << "tmp Pyramid5_Pyramid5_10 printParts this= " ; printParts(this); } m_face_breaker = new UniformRefinerPattern<shards::Quadrilateral<4>, shards::Quadrilateral<4>, 4, SierraPort > (eMesh, block_names) ; m_face_breaker_tri = new UniformRefinerPattern<shards::Triangle<3>, shards::Triangle<3>, 4, SierraPort > (eMesh, block_names); }
UniformRefinerPattern(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : URP<shards::Tetrahedron<4> , shards::Tetrahedron<10> >(eMesh) { m_primaryEntityRank = eMesh.element_rank(); setNeededParts(eMesh, block_names, false); Elem::StdMeshObjTopologies::bootstrap(); #if FACE_BREAKER_TET4_TET10_1 m_subDim_breaker = new UniformRefinerPattern<shards::Triangle<3>, shards::Triangle<6>, 1, SierraPort > (eMesh, block_names) ; #endif }
UniformRefinerPattern(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : URP<shards::Pyramid<5> , shards::Pyramid<13> >(eMesh) { m_primaryEntityRank = eMesh.element_rank(); setNeededParts(eMesh, block_names, false); Elem::StdMeshObjTopologies::bootstrap(); #if FACE_BREAKER_P5_P13_1 m_subDim_breaker = new UniformRefinerPattern<shards::Triangle<3>, shards::Triangle<6>, 1, SierraPort > (eMesh, block_names) ; m_subDim_breaker_quad = new UniformRefinerPattern<shards::Quadrilateral<4>, shards::Quadrilateral<9>, 1, SierraPort > (eMesh, block_names); #endif }
UniformRefinerPattern(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : URP<shards::Wedge<6>, shards::Wedge<6> >(eMesh) { m_primaryEntityRank = eMesh.element_rank(); setNeededParts(eMesh, block_names, true); Elem::StdMeshObjTopologies::bootstrap(); #if FACE_BREAKER_W6_W6_8 m_face_breaker = new UniformRefinerPattern<shards::Quadrilateral<4>, shards::Quadrilateral<4>, 4, SierraPort > (eMesh, block_names) ; m_face_breaker_tri = new UniformRefinerPattern<shards::Triangle<3>, shards::Triangle<3>, 4, SierraPort > (eMesh, block_names); #endif }
UniformRefinerPattern(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : URP<shards::ShellTriangle<6>, shards::ShellTriangle<6> >(eMesh) { if (m_eMesh.get_spatial_dim() != 3) { throw std::runtime_error("can't refine shell elements in 2D"); } m_primaryEntityRank = eMesh.element_rank(); setNeededParts(eMesh, block_names, true); Elem::StdMeshObjTopologies::bootstrap(); #if EDGE_TR6_TR6_4_BREAKER //m_edge_breaker = Teuchos::rcp( new UniformRefinerPattern<shards::Line<2>, shards::Line<2>, 2, SierraPort > (eMesh, block_names) ); if (m_eMesh.get_spatial_dim() == 3) { m_edge_breaker = new UniformRefinerPattern<shards::ShellLine<3>, shards::ShellLine<3>, 2, SierraPort > (eMesh, block_names) ; m_face_breaker = new UniformRefinerPattern<shards::Triangle<6>, shards::Triangle<6>, 4, SierraPort > (eMesh, block_names) ; } #endif }
void createNewElements(percept::PerceptMesh& eMesh, NodeRegistry& nodeRegistry, stk_classic::mesh::Entity& element, NewSubEntityNodesType& new_sub_entity_nodes, vector<stk_classic::mesh::Entity *>::iterator& element_pool, stk_classic::mesh::FieldBase *proc_rank_field=0) { const CellTopologyData * const cell_topo_data = stk_classic::percept::PerceptMesh::get_cell_topology(element); typedef boost::tuple<stk_classic::mesh::EntityId, stk_classic::mesh::EntityId, stk_classic::mesh::EntityId> tri_tuple_type; static vector<tri_tuple_type> elems(6); CellTopology cell_topo(cell_topo_data); const stk_classic::mesh::PairIterRelation elem_nodes = element.relations(stk_classic::mesh::fem::FEMMetaData::NODE_RANK); //stk_classic::mesh::Part & active = mesh->ActivePart(); //stk_classic::mesh::Part & quad4 = mesh->QuadPart(); std::vector<stk_classic::mesh::Part*> add_parts; std::vector<stk_classic::mesh::Part*> remove_parts; //add_parts.push_back( &active ); //FIXME //add_parts.push_back( const_cast<mesh::Part*>( eMesh.getPart(m_toTopoPartName) )); add_parts = m_toParts; /** \node[above] at (p4.side 1){2}; \node[left] at (p4.side 2){3}; \node[below] at (p4.side 3){0}; \node[right] at (p4.side 4){1}; */ double tmp_x[3]; for (int iedge = 0; iedge < 4; iedge++) { double * mp = midPoint(EDGE_COORD(iedge,0), EDGE_COORD(iedge,1), eMesh.get_spatial_dim(), tmp_x); if (!EDGE_N(iedge)) { std::cout << "P[" << eMesh.get_rank() << " nid ## = 0 << " << std::endl; } eMesh.createOrGetNode(EDGE_N(iedge), mp); } elems[0] = tri_tuple_type(VERT_N(0), EDGE_N(0), EDGE_N(3)); elems[1] = tri_tuple_type(VERT_N(1), EDGE_N(1), EDGE_N(0)); elems[2] = tri_tuple_type(EDGE_N(0), EDGE_N(1), EDGE_N(3)); elems[3] = tri_tuple_type(VERT_N(2), EDGE_N(2), EDGE_N(1)); elems[4] = tri_tuple_type(VERT_N(3), EDGE_N(3), EDGE_N(2)); elems[5] = tri_tuple_type(EDGE_N(2), EDGE_N(3), EDGE_N(1)); // write a diagram of the refinement pattern as a vtk file, or a latex/tikz/pgf file #define WRITE_DIAGRAM 0 #if WRITE_DIAGRAM #endif for (unsigned ielem=0; ielem < elems.size(); ielem++) { //stk_classic::mesh::Entity& newElement = eMesh.get_bulk_data()->declare_entity(Element, *element_id_pool, eMesh.getPart(interface_table::shards_Triangle_3) ); //stk_classic::mesh::Entity& newElement = eMesh.get_bulk_data()->declare_entity(Element, *element_id_pool, eMesh.getPart(interface_table::shards_Triangle_3) ); stk_classic::mesh::Entity& newElement = *(*element_pool); if (proc_rank_field) { double *fdata = stk_classic::mesh::field_data( *static_cast<const ScalarFieldType *>(proc_rank_field) , newElement ); //fdata[0] = double(m_eMesh.get_rank()); fdata[0] = double(newElement.owner_rank()); } //eMesh.get_bulk_data()->change_entity_parts( newElement, add_parts, remove_parts ); change_entity_parts(eMesh, element, newElement); { if (!elems[ielem].get<0>()) { std::cout << "P[" << eMesh.get_rank() << " nid = 0 << " << std::endl; exit(1); } } eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<0>()), 0); eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<1>()), 1); eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<2>()), 2); set_parent_child_relations(eMesh, element, newElement, ielem); element_pool++; } }
URP_Heterogeneous_3D(percept::PerceptMesh& eMesh, BlockNamesType block_names = BlockNamesType()) : m_eMesh(eMesh) { m_primaryEntityRank = eMesh.element_rank(); //!setNeededParts(eMesh, block_names, true); Elem::StdMeshObjTopologies::bootstrap(); // list all types of known break patterns to be used here m_bp.resize(0); int spatialDim = eMesh.get_spatial_dim(); // refine // put them in reverse topological rank order if (spatialDim == 3) { m_bp.push_back(new UniformRefinerPattern<shards::Tetrahedron<4>, shards::Tetrahedron<4>, 8, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Hexahedron<8>, shards::Hexahedron<8>, 8, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Wedge<6>, shards::Wedge<6>, 8, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Pyramid<5>, shards::Pyramid<5>, 10, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Hexahedron<27>, shards::Hexahedron<27>, 8, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Hexahedron<20>, shards::Hexahedron<20>, 8, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Tetrahedron<10>, shards::Tetrahedron<10>, 8, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Wedge<15>, shards::Wedge<15>, 8, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::ShellQuadrilateral<4>, shards::ShellQuadrilateral<4>, 4, SierraPort > (eMesh, block_names) ); m_bp.push_back(new UniformRefinerPattern<shards::ShellTriangle<3>, shards::ShellTriangle<3>, 4, SierraPort > (eMesh, block_names) ); m_bp.push_back(new UniformRefinerPattern<shards::ShellTriangle<6>, shards::ShellTriangle<6>, 4, SierraPort > (eMesh, block_names) ); m_bp.push_back(new UniformRefinerPattern<shards::ShellQuadrilateral<8>, shards::ShellQuadrilateral<8>, 4, SierraPort > (eMesh, block_names)); // tmp FIXME #define ENABLE_DEBUG_BEAM_ELEMENTS_IN_2D 1 #if !ENABLE_DEBUG_BEAM_ELEMENTS_IN_2D m_bp.push_back(new UniformRefinerPattern<shards::Beam<2>, shards::Beam<2>, 2, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Beam<3>, shards::Beam<3>, 2, SierraPort > (eMesh, block_names)); #endif } #if ENABLE_DEBUG_BEAM_ELEMENTS_IN_2D m_bp.push_back(new UniformRefinerPattern<shards::Beam<2>, shards::Beam<2>, 2, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Beam<3>, shards::Beam<3>, 2, SierraPort > (eMesh, block_names)); #endif m_bp.push_back(new UniformRefinerPattern<shards::Quadrilateral<4>, shards::Quadrilateral<4>, 4, SierraPort > (eMesh, block_names) ); m_bp.push_back(new UniformRefinerPattern<shards::Triangle<3>, shards::Triangle<3>, 4, SierraPort > (eMesh, block_names) ); m_bp.push_back(new UniformRefinerPattern<shards::Triangle<6>, shards::Triangle<6>, 4, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Quadrilateral<9>, shards::Quadrilateral<9>, 4, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Quadrilateral<8>, shards::Quadrilateral<8>, 4, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Line<2>, shards::Line<2>, 2, SierraPort > (eMesh, block_names)); m_bp.push_back(new UniformRefinerPattern<shards::Line<3>, shards::Line<3>, 2, SierraPort > (eMesh, block_names)); #if 0 m_bp.push_back(new UniformRefinerPattern<shards::ShellLine<2>, shards::ShellLine<2>, 2, SierraPort > (eMesh, block_names)); #endif }
void createNewElements(percept::PerceptMesh& eMesh, NodeRegistry& nodeRegistry, stk::mesh::Entity& element, NewSubEntityNodesType& new_sub_entity_nodes, vector<stk::mesh::Entity *>::iterator& element_pool, stk::mesh::FieldBase *proc_rank_field=0) { const CellTopologyData * const cell_topo_data = stk::percept::PerceptMesh::get_cell_topology(element); typedef boost::tuple<stk::mesh::EntityId, stk::mesh::EntityId> line_tuple_type; static vector<line_tuple_type> elems(2); CellTopology cell_topo(cell_topo_data); const stk::mesh::PairIterRelation elem_nodes = element.relations(stk::mesh::fem::FEMMetaData::NODE_RANK); std::vector<stk::mesh::Part*> add_parts; std::vector<stk::mesh::Part*> remove_parts; add_parts = m_toParts; unsigned num_nodes_on_edge = new_sub_entity_nodes[m_eMesh.edge_rank()][0].size(); if (!num_nodes_on_edge) return; double coord_x[3]; for (int iedge = 0; iedge < 1; iedge++) { //double * mp = midPoint(EDGE_COORD(iedge,0), EDGE_COORD(iedge,1), eMesh.get_spatial_dim(), coord_x); //double * mp = midPoint(FACE_COORD(iedge,0), FACE_COORD(iedge,1), eMesh.get_spatial_dim(), coord_x); double * mp = midPoint(VERT_COORD(0), VERT_COORD(1), eMesh.get_spatial_dim(), coord_x); if (!EDGE_N(iedge)) { std::cout << "P[" << eMesh.get_rank() << " nid ## = 0 " << std::endl; } eMesh.createOrGetNode(EDGE_N(iedge), mp); } // FIXME nodeRegistry.makeCentroidCoords(*const_cast<stk::mesh::Entity *>(&element), m_primaryEntityRank, 0u); nodeRegistry.addToExistingParts(*const_cast<stk::mesh::Entity *>(&element), m_primaryEntityRank, 0u); nodeRegistry.interpolateFields(*const_cast<stk::mesh::Entity *>(&element), m_primaryEntityRank, 0u); Elem::CellTopology elem_celltopo = Elem::getCellTopology< FromTopology >(); const Elem::RefinementTopology* ref_topo_p = Elem::getRefinementTopology(elem_celltopo); const Elem::RefinementTopology& ref_topo = *ref_topo_p; #ifndef NDEBUG unsigned num_child = ref_topo.num_child(); VERIFY_OP(num_child, == , 2, "createNewElements num_child problem"); bool homogeneous_child = ref_topo.homogeneous_child(); VERIFY_OP(homogeneous_child, ==, true, "createNewElements homogeneous_child"); #endif // new_sub_entity_nodes[i][j] //const UInt * const * child_nodes() const { //const UInt * child_node_0 = ref_topo.child_node(0); typedef Elem::StdMeshObjTopologies::RefTopoX RefTopoX; RefTopoX& l2 = Elem::StdMeshObjTopologies::RefinementTopologyExtra< FromTopology > ::refinement_topology; #define CENTROID_N NN(m_primaryEntityRank,0) for (unsigned iChild = 0; iChild < 2; iChild++) { unsigned EN[2]; for (unsigned jNode = 0; jNode < 2; jNode++) { unsigned childNodeIdx = ref_topo.child_node(iChild)[jNode]; #ifndef NDEBUG unsigned childNodeIdxCheck = l2[childNodeIdx].ordinal_of_node; VERIFY_OP(childNodeIdx, ==, childNodeIdxCheck, "childNodeIdxCheck"); #endif unsigned inode=0; if (l2[childNodeIdx].rank_of_subcell == 0) inode = VERT_N(l2[childNodeIdx].ordinal_of_subcell); else if (l2[childNodeIdx].rank_of_subcell == 1) inode = EDGE_N(l2[childNodeIdx].ordinal_of_subcell); // else if (l2[childNodeIdx].rank_of_subcell == 2) // inode = CENTROID_N; EN[jNode] = inode; } elems[iChild] = line_tuple_type(EN[0], EN[1]); } #undef CENTROID_N for (unsigned ielem=0; ielem < elems.size(); ielem++) { stk::mesh::Entity& newElement = *(*element_pool); #if 0 if (proc_rank_field && proc_rank_field->rank() == m_eMesh.edge_rank()) //&& m_eMesh.get_spatial_dim()==1) { double *fdata = stk::mesh::field_data( *static_cast<const ScalarFieldType *>(proc_rank_field) , newElement ); //fdata[0] = double(m_eMesh.get_rank()); fdata[0] = double(newElement.owner_rank()); } #endif stk::mesh::FieldBase * proc_rank_field_edge = m_eMesh.get_field("proc_rank_edge"); if (proc_rank_field_edge) { double *fdata = stk::mesh::field_data( *static_cast<const ScalarFieldType *>(proc_rank_field_edge) , newElement ); fdata[0] = double(newElement.owner_rank()); //fdata[0] = 1234.56; if (0) std::cout << "P[" << m_eMesh.get_rank() << "] tmp set proc_rank_field_edge to value = " << newElement.owner_rank() << " for side element = " << newElement.identifier() << std::endl; } //eMesh.get_bulk_data()->change_entity_parts( newElement, add_parts, remove_parts ); change_entity_parts(eMesh, element, newElement); { if (!elems[ielem].get<0>()) { std::cout << "P[" << eMesh.get_rank() << " nid = 0 " << std::endl; exit(1); } } eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<0>()), 0); eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<1>()), 1); set_parent_child_relations(eMesh, element, newElement, ielem); element_pool++; } }
void Colorer:: color(percept::PerceptMesh& eMesh, unsigned * elementType, stk_classic::mesh::PartVector* fromParts, stk_classic::mesh::FieldBase *element_color_field) { const unsigned MAX_COLORS=1000; vector< ColorerNodeSetType > node_colors(MAX_COLORS+1); ColorerElementSetType all_elements; mesh::Selector selector(eMesh.get_fem_meta_data()->universal_part()); if (fromParts) { if (0) { std::cout << "tmp Colorer::color fromParts= " << *fromParts << std::endl; std::cout << "tmp Colorer::color elementType= " << *elementType << std::endl; for (unsigned i_part = 0; i_part < fromParts->size(); i_part++) { std::cout << "tmp Colorer::color i_part = " << i_part << " fromParts= " << (*fromParts)[i_part]->name() << std::endl; } } selector = mesh::selectUnion(*fromParts); } stk_classic::mesh::BulkData& bulkData = *eMesh.get_bulk_data(); unsigned ncolor = 0; int nelem = 0; unsigned num_max_colors = MAX_COLORS; if (m_noColoring) num_max_colors = 1; m_element_colors = vector< ColorerSetType > (num_max_colors+1); for (unsigned icolor = 0; icolor < num_max_colors; icolor++) { int num_colored_this_pass = 0; for (unsigned irank = 0; irank < m_entityRanks.size(); irank++) { const vector<stk_classic::mesh::Bucket*> & buckets = bulkData.buckets( m_entityRanks[irank] ); for ( vector<stk_classic::mesh::Bucket*>::const_iterator k = buckets.begin() ; k != buckets.end() ; ++k ) { if (selector(**k)) { stk_classic::mesh::Bucket & bucket = **k ; bool doThisBucket = true; const CellTopologyData * const bucket_cell_topo_data = stk_classic::percept::PerceptMesh::get_cell_topology(bucket); shards::CellTopology topo(bucket_cell_topo_data); if (elementType && (topo.getKey() != *elementType)) { doThisBucket = false; } if (0 && doThisBucket) { std::cout << "tmp color = " << icolor << " bucket topo name= " << topo.getName() << " key= " << topo.getKey() << " elementType= " << (elementType? *elementType : 0) << " doThisBucket= " << doThisBucket << std::endl; } if (doThisBucket) { const unsigned num_elements_in_bucket = bucket.size(); nelem += num_elements_in_bucket; for (unsigned iElement = 0; iElement < num_elements_in_bucket; iElement++) { stk_classic::mesh::Entity& element = bucket[iElement]; if (0) std::cout << "tmp color = " << icolor << " bucket topo name= " << topo.getName() << " key= " << topo.getKey() << " elementId = " << element.identifier() << " element = " << element << std::endl; stk_classic::mesh::EntityId elem_id = element.identifier(); if (!m_noColoring && contains(all_elements, elem_id)) continue; bool none_in_this_color = true; static std::vector<stk_classic::mesh::EntityId> node_ids(100); unsigned num_node = 0; if (!m_noColoring) { const stk_classic::mesh::PairIterRelation elem_nodes = element.relations( stk_classic::mesh::fem::FEMMetaData::NODE_RANK ); num_node = elem_nodes.size(); node_ids.reserve(num_node); for (unsigned inode=0; inode < num_node; inode++) { stk_classic::mesh::Entity & node = *elem_nodes[ inode ].entity(); stk_classic::mesh::EntityId nid = node.identifier(); node_ids[inode] = nid; if (contains(node_colors[icolor], nid)) { none_in_this_color = false; break; } } } if (none_in_this_color) { ++num_colored_this_pass; if (element_color_field) { double *fdata = stk_classic::mesh::field_data( *static_cast<const percept::ScalarFieldType *>(element_color_field) , element ); fdata[0] = double(icolor); } #if STK_ADAPT_COLORER_SET_TYPE_USE_VECTOR m_element_colors[icolor].push_back(&element); #else m_element_colors[icolor].insert(&element); #endif if (!m_noColoring) { all_elements.insert(elem_id); for (unsigned inode=0; inode < num_node; inode++) { node_colors[icolor].insert(node_ids[inode]); } } } } // elements in bucket } // doThisBucket } // selection } // buckets } // irank if (0 == num_colored_this_pass) { break; } ++ncolor; if (ncolor == num_max_colors-1) { throw std::runtime_error("broken algorithm in mesh colorer"); } } // icolor //std::cout << "tmp ncolor = " << ncolor << " nelem= " << nelem << std::endl; m_element_colors.resize(ncolor); }
void createNewElements(percept::PerceptMesh& eMesh, NodeRegistry& nodeRegistry, stk_classic::mesh::Entity& element, NewSubEntityNodesType& new_sub_entity_nodes, vector<stk_classic::mesh::Entity *>::iterator& element_pool, stk_classic::mesh::FieldBase *proc_rank_field=0) { const CellTopologyData * const cell_topo_data = stk_classic::percept::PerceptMesh::get_cell_topology(element); typedef boost::tuple<stk_classic::mesh::EntityId, stk_classic::mesh::EntityId, stk_classic::mesh::EntityId> tri_tuple_type; static vector<tri_tuple_type> elems(4); CellTopology cell_topo(cell_topo_data); const stk_classic::mesh::PairIterRelation elem_nodes = element.relations(stk_classic::mesh::fem::FEMMetaData::NODE_RANK); //stk_classic::mesh::Part & active = mesh->ActivePart(); //stk_classic::mesh::Part & quad4 = mesh->QuadPart(); std::vector<stk_classic::mesh::Part*> add_parts; std::vector<stk_classic::mesh::Part*> remove_parts; add_parts = m_toParts; //std::cout << "P["<< m_eMesh.get_rank() << "] add_parts = " << add_parts << std::endl; stk_classic::mesh::EntityRank my_rank = m_primaryEntityRank; nodeRegistry.makeCentroidCoords(*const_cast<stk_classic::mesh::Entity *>(&element), my_rank, 0u); nodeRegistry.addToExistingParts(*const_cast<stk_classic::mesh::Entity *>(&element), my_rank, 0u); nodeRegistry.interpolateFields(*const_cast<stk_classic::mesh::Entity *>(&element), my_rank, 0u); #define CENTROID_N NN(m_primaryEntityRank, 0) elems[0] = tri_tuple_type(VERT_N(0), VERT_N(1), CENTROID_N); elems[1] = tri_tuple_type(VERT_N(1), VERT_N(2), CENTROID_N); elems[2] = tri_tuple_type(VERT_N(2), VERT_N(3), CENTROID_N); elems[3] = tri_tuple_type(VERT_N(3), VERT_N(0), CENTROID_N); #undef CENTROID_N // write a diagram of the refinement pattern as a vtk file, or a latex/tikz/pgf file #define WRITE_DIAGRAM 0 #if WRITE_DIAGRAM /** \node[above] at (p4.side 1){2}; \node[left] at (p4.side 2){3}; \node[below] at (p4.side 3){0}; \node[right] at (p4.side 4){1}; */ #endif for (unsigned ielem=0; ielem < elems.size(); ielem++) { stk_classic::mesh::Entity& newElement = *(*element_pool); //std::cout << "P["<< m_eMesh.get_rank() << "] urp tmp 3 " << proc_rank_field << std::endl; if (proc_rank_field && element.entity_rank() == m_eMesh.element_rank()) { double *fdata = stk_classic::mesh::field_data( *static_cast<const ScalarFieldType *>(proc_rank_field) , newElement ); fdata[0] = double(newElement.owner_rank()); } //std::cout << "P["<< m_eMesh.get_rank() << "] urp tmp 4 " << std::endl; change_entity_parts(eMesh, element, newElement); //std::cout << "P["<< m_eMesh.get_rank() << "] urp tmp 5 " << std::endl; { if (!elems[ielem].get<0>()) { std::cout << "P[" << eMesh.get_rank() << " nid = 0 << " << std::endl; exit(1); } } //std::cout << "P["<< m_eMesh.get_rank() << "] urp tmp 6 " << std::endl; eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<0>()), 0); eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<1>()), 1); eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<2>()), 2); //std::cout << "P["<< m_eMesh.get_rank() << "] urp tmp 7 " << std::endl; set_parent_child_relations(eMesh, element, newElement, ielem); element_pool++; } }
void createNewElements(percept::PerceptMesh& eMesh, NodeRegistry& nodeRegistry, stk::mesh::Entity& element, NewSubEntityNodesType& new_sub_entity_nodes, vector<stk::mesh::Entity *>::iterator& element_pool, stk::mesh::FieldBase *proc_rank_field=0) { const CellTopologyData * const cell_topo_data = stk::percept::PerceptMesh::get_cell_topology(element); typedef boost::tuple<stk::mesh::EntityId, stk::mesh::EntityId, stk::mesh::EntityId, stk::mesh::EntityId> quad_tuple_type; static vector<quad_tuple_type> elems(4); CellTopology cell_topo(cell_topo_data); const stk::mesh::PairIterRelation elem_nodes = element.relations(stk::mesh::fem::FEMMetaData::NODE_RANK); //stk::mesh::Part & active = mesh->ActivePart(); //stk::mesh::Part & quad4 = mesh->QuadPart(); std::vector<stk::mesh::Part*> add_parts; std::vector<stk::mesh::Part*> remove_parts; //add_parts.push_back( &active ); //FIXME //add_parts.push_back( const_cast<mesh::Part*>( eMesh.getPart(m_toTopoPartName) )); add_parts = m_toParts; double tmp_x[3]; for (int iedge = 0; iedge < 4; iedge++) { double * mp = midPoint(EDGE_COORD(iedge,0), EDGE_COORD(iedge,1), eMesh.get_spatial_dim(), tmp_x); if (!EDGE_N(iedge)) { std::cout << "P[" << eMesh.get_rank() << " nid ## = 0 << " << std::endl; } eMesh.createOrGetNode(EDGE_N(iedge), mp); } nodeRegistry.makeCentroidCoords(*const_cast<stk::mesh::Entity *>(&element), m_eMesh.element_rank(), 0u); // new_sub_entity_nodes[i][j] #define CENTROID_N NN(m_primaryEntityRank,0) elems[0] = quad_tuple_type(VERT_N(0), EDGE_N(0), CENTROID_N, EDGE_N(3)); elems[1] = quad_tuple_type(VERT_N(1), EDGE_N(1), CENTROID_N, EDGE_N(0)); elems[2] = quad_tuple_type(VERT_N(2), EDGE_N(2), CENTROID_N, EDGE_N(1)); elems[3] = quad_tuple_type(VERT_N(3), EDGE_N(3), CENTROID_N, EDGE_N(2)); #undef CENTROID_N // write a diagram of the refinement pattern as a vtk file, or a latex/tikz/pgf file #define WRITE_DIAGRAM 0 #if WRITE_DIAGRAM #endif for (unsigned ielem=0; ielem < elems.size(); ielem++) { stk::mesh::Entity& newElement = *(*element_pool); if (proc_rank_field) { double *fdata = stk::mesh::field_data( *static_cast<const ScalarFieldType *>(proc_rank_field) , newElement ); //fdata[0] = double(m_eMesh.get_rank()); fdata[0] = double(newElement.owner_rank()); } eMesh.get_bulk_data()->change_entity_parts( newElement, add_parts, remove_parts ); { if (!elems[ielem].get<0>()) { std::cout << "P[" << eMesh.get_rank() << " nid = 0 << " << std::endl; exit(1); } } eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<0>()), 0); eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<1>()), 1); eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<2>()), 2); eMesh.get_bulk_data()->declare_relation(newElement, eMesh.createOrGetNode(elems[ielem].get<3>()), 3); set_parent_child_relations(eMesh, element, newElement, ielem); element_pool++; } }