Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #ifndef SPECTRALMESHTOOL_HPP 00002 #define SPECTRALMESHTOOL_HPP 00003 00004 #include "moab/Interface.hpp" // needs to be here to support inline query_interface 00005 #include "moab/Error.hpp" // needs to be here to support inline query_interface 00006 #include <vector> 00007 00008 namespace moab 00009 { 00010 00011 /** \class SpectralMeshTool 00012 * \brief Class with convenience functions for handling spectral mesh 00013 * Class with convenience functions for handling spectral meshes. See description of spectral 00014 * mesh handling in doc/metadata_info.doc and in the MOAB user's guide. 00015 * 00016 * There are two primary representations of spectral meshes: 00017 * a) coarse elements: with SPECTRAL_VERTICES lexicographically-ordered array of fine vertices 00018 * on each element, and tags on vertices or on elements (with _LEX suffix) 00019 * b) fine elements: as linear elements made from fine vertices, with tags on vertices 00020 * 00021 */ 00022 class SpectralMeshTool 00023 { 00024 public: 00025 /** \brief Constructor 00026 * \param impl MOAB Interface instance 00027 * \param order Spectral order, defaults to 0 00028 */ 00029 SpectralMeshTool( Interface* impl, int order = 0 ); 00030 00031 /** \brief Destructor 00032 */ 00033 ~SpectralMeshTool(); 00034 00035 /** \brief Return tag used to store lexicographically-ordered vertex array 00036 * NOTE: If creating this tag with this call, this SpectralMeshTool instance must already have 00037 * a non-zero spectral order value set on it; the size of the spectral vertices tag depends on 00038 * this order. \param sv_tag Spectral vertices tag \param create_if_missing If true, will create 00039 * this tag if it doesn't exist already 00040 */ 00041 Tag spectral_vertices_tag( const bool create_if_missing = false ); 00042 00043 /** \brief Return tag used to store spectral order 00044 * \param so_tag Spectral order tag 00045 * \param create_if_missing If true, will create this tag if it doesn't exist already 00046 */ 00047 Tag spectral_order_tag( const bool create_if_missing = false ); 00048 00049 /** \brief Convert representation from coarse to fine 00050 * Each element in set, or in interface if set is not input, is converted to fine elements, 00051 * using vertices in SPECTRAL_VERTICES tagged array \param spectral_set Set containing spectral 00052 * elements 00053 */ 00054 ErrorCode convert_to_fine( EntityHandle spectral_set ); 00055 00056 /** \brief Convert representation from fine to coarse 00057 * Each element in set, or in interface if set is not input, is converted to coarse elements, 00058 * with fine vertices put into SPECTRAL_VERTICES tagged array. NOTE: This function assumes that 00059 * each order^d (fine) elements comprise each coarse element, and are in order of fine elements 00060 * in each coarse element. If order is input as 0, looks for a SPECTRAL_ORDER tag on the mesh. 00061 * \param order Order of the spectral mesh 00062 * \param spectral_set Set containing spectral elements 00063 */ 00064 ErrorCode convert_to_coarse( int order = 0, EntityHandle spectral_set = 0 ); 00065 00066 /** \brief Create coarse spectral elements from fine elements pointed to by conn 00067 * This function creates the coarse elements by taking conn (assumed to be in FE ordering) 00068 * and picking out the corner vertices to make coarse connectivity, and the other vertices 00069 * (along with corners) to make SPECTRAL_VERTICES array pointed to by each entity. 00070 * \param conn Connectivity of fine (linear) elements, in FE ordering 00071 * \param verts_per_e Vertices per entity 00072 * \param num_fine_elems Number of fine elements represented by conn 00073 * \param spectral_set Set to which coarse elements should be added, if any 00074 * \param start_idx Starting index in conn (for parallel support) 00075 * \param local_gids If non-null, will insert all fine vertices into this range 00076 */ 00077 template < class T > 00078 ErrorCode create_spectral_elems( const T* conn, 00079 int num_fine_elems, 00080 int dim, 00081 Range& output_range, 00082 int start_idx = 0, 00083 Range* local_gids = NULL ); 00084 00085 /** \brief Set spectral order for this instance 00086 * \param order Order set on this instance 00087 */ 00088 void spectral_order( int order ) 00089 { 00090 spectralOrder = order; 00091 spectralOrderp1 = order + 1; 00092 } 00093 00094 /** \brief Get spectral order for this instance 00095 * \return order Order set on this instance 00096 */ 00097 int spectral_order() 00098 { 00099 return spectralOrder; 00100 } 00101 /* 00102 struct ConnMap 00103 { 00104 const short a[16]; 00105 }; 00106 */ 00107 static const short int permute_array[]; 00108 00109 static const short int lin_permute_array[]; 00110 00111 private: 00112 //! the MB instance that this works with 00113 Interface* mbImpl; 00114 00115 //! error object for this tool 00116 Error* mError; 00117 00118 //! SPECTRAL_VERTICES tag 00119 Tag svTag; 00120 00121 //! SPECTRAL_ORDER tag 00122 Tag soTag; 00123 00124 //! order of the spectral mesh being accessed 00125 int spectralOrder; 00126 00127 //! order of the spectral mesh being accessed plus one 00128 int spectralOrderp1; 00129 }; 00130 00131 inline SpectralMeshTool::SpectralMeshTool( Interface* impl, int order ) 00132 : mbImpl( impl ), svTag( 0 ), soTag( 0 ), spectralOrder( order ), spectralOrderp1( order + 1 ) 00133 { 00134 impl->query_interface( mError ); 00135 } 00136 00137 inline SpectralMeshTool::~SpectralMeshTool() {} 00138 00139 } // namespace moab 00140 00141 #endif