Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /** 00002 * MOAB, a Mesh-Oriented datABase, is a software component for creating, 00003 * storing and accessing finite element mesh data. 00004 * 00005 * Copyright 2004 Sandia Corporation. Under the terms of Contract 00006 * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 00007 * retains certain rights in this software. 00008 * 00009 * This library is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU Lesser General Public 00011 * License as published by the Free Software Foundation; either 00012 * version 2.1 of the License, or (at your option) any later version. 00013 * 00014 */ 00015 00016 #ifndef MOAB_HIGHER_ORDER_FACTORY_HPP 00017 #define MOAB_HIGHER_ORDER_FACTORY_HPP 00018 00019 #ifndef IS_BUILDING_MB 00020 #error "HigherOrderFactory.hpp isn't supposed to be included into an application" 00021 #endif 00022 00023 #include "moab/Interface.hpp" 00024 00025 namespace moab 00026 { 00027 00028 class ElementSequence; 00029 class Core; 00030 00031 /** \class HigherOrderFactory 00032 * \brief Functions for converting to/from higher-order elements 00033 * \authors Clinton Stimpson 00034 * \date 11/25/02 00035 * \brief 00036 * 00037 */ 00038 class HigherOrderFactory 00039 { 00040 public: 00041 HigherOrderFactory( Core*, Interface::HONodeAddedRemoved* function_object ); 00042 ~HigherOrderFactory(); 00043 00044 ErrorCode convert( const EntityHandle meshset, 00045 const bool mid_edge_nodes, 00046 const bool mid_face_nodes, 00047 const bool mid_volume_nodes ); 00048 00049 ErrorCode convert( const Range& entities, 00050 const bool mid_edge_nodes, 00051 const bool mid_face_nodes, 00052 const bool mid_volume_nodes ); 00053 00054 unsigned char mNodeMap[MBMAXTYPE][8][8]; 00055 00056 private: 00057 // static bool mMapInitialized; 00058 void initialize_map(); 00059 00060 Core* mMB; 00061 Interface::HONodeAddedRemoved* mHONodeAddedRemoved; 00062 00063 ErrorCode convert_sequence( ElementSequence* sequence, 00064 EntityHandle sequence_subset_start, 00065 EntityHandle sequence_subset_end, 00066 bool mid_edge_nodes, 00067 bool mid_face_nodes, 00068 bool mid_volume_nodes ); 00069 ErrorCode add_mid_edge_nodes( ElementSequence* ); 00070 ErrorCode add_mid_face_nodes( ElementSequence* ); 00071 ErrorCode add_mid_volume_nodes( ElementSequence* ); 00072 00073 //! returns the handle of the first center node found between the two corner nodes. 00074 //! returns zero if none found 00075 //! entities that share those two corner nodes and have space allocated for mid-edge nodes are 00076 //! returned in a vector 00077 EntityHandle center_node_exist( EntityHandle corner1, 00078 EntityHandle corner2, 00079 std::vector< EntityHandle >& adj_entities ); 00080 00081 //! returns the handle of the first center node found between the 3-4 corner nodes. 00082 //! set the last node to zero if you want only 3 nodes 00083 //! returns zero if none found 00084 //! entities that share those corner nodes and have space allocated for mid face nodes are 00085 //! returned in a vector 00086 EntityHandle center_node_exist( EntityHandle corners[4], std::vector< EntityHandle >& adj_entities ); 00087 00088 //! adds a center node to element between corner nodes, returns success 00089 bool add_center_node( EntityType type, 00090 EntityHandle* element_conn, 00091 int conn_size, 00092 EntityHandle corner_node1, 00093 EntityHandle corner_node2, 00094 EntityHandle center_node ); 00095 00096 ErrorCode copy_corner_nodes( ElementSequence* src, ElementSequence* dst ); 00097 ErrorCode copy_mid_edge_nodes( ElementSequence* src, ElementSequence* dst ); 00098 ErrorCode copy_mid_face_nodes( ElementSequence* src, ElementSequence* dst ); 00099 ErrorCode copy_mid_volume_nodes( ElementSequence* src, ElementSequence* dst ); 00100 ErrorCode copy_nodes( ElementSequence* src, 00101 ElementSequence* dst, 00102 unsigned nodes_per_elem_to_copy, 00103 unsigned src_conn_offset, 00104 unsigned dst_conn_offset ); 00105 00106 ErrorCode zero_mid_edge_nodes( ElementSequence* dst ); 00107 ErrorCode zero_mid_face_nodes( ElementSequence* dst ); 00108 ErrorCode zero_mid_volume_nodes( ElementSequence* dst ); 00109 ErrorCode zero_nodes( ElementSequence* dst, unsigned nodes_per_elem_to_zero, unsigned dst_conn_offset ); 00110 00111 ErrorCode remove_mid_edge_nodes( ElementSequence* seq, EntityHandle start, EntityHandle stop, Tag deletable_ndoes ); 00112 ErrorCode remove_mid_face_nodes( ElementSequence* seq, EntityHandle start, EntityHandle stop, Tag deletable_ndoes ); 00113 ErrorCode remove_mid_volume_nodes( ElementSequence* seq, 00114 EntityHandle start, 00115 EntityHandle stop, 00116 Tag deletable_ndoes ); 00117 ErrorCode remove_ho_nodes( ElementSequence* sequence, 00118 EntityHandle subset_start_handle, 00119 EntityHandle subset_end_handle, 00120 int nodes_per_elem_to_remove, 00121 int elem_conn_offset_to_remove, 00122 Tag deletable_nodes ); 00123 bool tag_for_deletion( EntityHandle element_with_node, 00124 int node_index_in_elem_connectivity, 00125 ElementSequence* sequence ); 00126 }; 00127 00128 } // namespace moab 00129 00130 #endif