MOAB: Mesh Oriented datABase
(version 5.4.1)
|
00001 /* ***************************************************************** 00002 MESQUITE -- The Mesh Quality Improvement Toolkit 00003 00004 Copyright 2004 Sandia Corporation and Argonne National 00005 Laboratory. Under the terms of Contract DE-AC04-94AL85000 00006 with Sandia Corporation, the U.S. Government retains certain 00007 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 This library is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License 00020 (lgpl.txt) along with this library; if not, write to the Free Software 00021 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00022 00023 diachin2@llnl.gov, djmelan@sandia.gov, mbrewer@sandia.gov, 00024 pknupp@sandia.gov, tleurent@mcs.anl.gov, tmunson@mcs.anl.gov, 00025 kraftche@cae.wisc.edu 00026 00027 ***************************************************************** */ 00028 // 00029 // SUMMARY: 00030 // USAGE: 00031 // 00032 // ORIG-DATE: 26-March-08 at 10:26:21 00033 // LAST-MOD: 15-Nov-04 by kraftche@cae.wisc.edu 00034 // 00035 /*! \file ParallelMeshImpl.cpp 00036 00037 \brief This files contains a parallel mesh implementation that can be used 00038 to run mesquite by default. 00039 00040 \author Jason Kraftcheck 00041 \author Martin Isenburg 00042 \date 2008-3-26 00043 */ 00044 00045 #include "ParallelMeshImpl.hpp" 00046 #include "MeshImplData.hpp" 00047 #include "MeshImplTags.hpp" 00048 #include "MsqError.hpp" 00049 #include "MsqDebug.hpp" 00050 00051 namespace MBMesquite 00052 { 00053 00054 ParallelMeshImpl::ParallelMeshImpl( Mesh* p_myMesh, const char* gid_name, const char* pid_name ) 00055 { 00056 MsqError err; 00057 00058 this->myMesh = p_myMesh; 00059 this->helper = 0; 00060 00061 if( gid_name ) 00062 gid_tag = myMesh->tag_get( gid_name, err ); 00063 else 00064 gid_tag = 0; 00065 00066 if( pid_name ) 00067 pid_tag = myMesh->tag_get( pid_name, err ); 00068 else 00069 pid_tag = 0; 00070 } 00071 00072 void ParallelMeshImpl::set_global_id_tag( const char* name, MsqError& err ) 00073 { 00074 gid_tag = myMesh->tag_get( name, err ); 00075 } 00076 00077 void ParallelMeshImpl::set_processor_id_tag( const char* name, MsqError& err ) 00078 { 00079 pid_tag = myMesh->tag_get( name, err ); 00080 } 00081 00082 //**************** Parallel Methods ****************************** 00083 00084 void ParallelMeshImpl::vertices_get_global_id( const VertexHandle vert_array[], 00085 size_t gid[], 00086 size_t num_vtx, 00087 MsqError& err ) 00088 { 00089 if( gid_tag ) 00090 { 00091 myMesh->tag_get_vertex_data( gid_tag, num_vtx, vert_array, gid, err );MSQ_CHKERR( err ); 00092 } 00093 else 00094 { 00095 MSQ_SETERR( err )( "Parallel mesh does not have Global IDs.", MsqError::INVALID_STATE ); 00096 } 00097 } 00098 00099 void ParallelMeshImpl::vertices_set_global_id( const VertexHandle vert_array[], 00100 size_t gid[], 00101 size_t num_vtx, 00102 MsqError& err ) 00103 { 00104 if( gid_tag == 0 ) 00105 { 00106 const char GLOBAL_ID_NAME[] = "GLOBAL_ID"; 00107 00108 int default_gid = -1; 00109 gid_tag = tag_create( GLOBAL_ID_NAME, HANDLE, 1, &default_gid, err ); 00110 // the 'HANDLE' is the type of data to store 00111 // the '1' is for one value per vertex 00112 // NULL for no default value, if you want them all 00113 // initialized to something, pass in a pointer to an int 00114 // with the value. 00115 MSQ_CHKERR( err ); 00116 } 00117 00118 tag_set_vertex_data( gid_tag, num_vtx, vert_array, gid, err );MSQ_CHKERR( err ); 00119 } 00120 00121 void ParallelMeshImpl::vertices_get_processor_id( const VertexHandle vert_array[], 00122 int pid[], 00123 size_t num_vtx, 00124 MsqError& err ) 00125 { 00126 if( pid_tag ) 00127 { 00128 tag_get_vertex_data( pid_tag, num_vtx, vert_array, pid, err );MSQ_CHKERR( err ); 00129 } 00130 else 00131 { 00132 MSQ_SETERR( err )( "Parallel mesh does not have Processor IDs.", MsqError::INVALID_STATE ); 00133 } 00134 } 00135 00136 void ParallelMeshImpl::vertices_set_processor_id( const VertexHandle vert_array[], 00137 int pid[], 00138 size_t num_vtx, 00139 MsqError& err ) 00140 { 00141 if( pid_tag == 0 ) 00142 { 00143 const char PROCESSOR_ID_NAME[] = "PROCESSOR_ID"; 00144 00145 int default_pid = -1; 00146 pid_tag = tag_create( PROCESSOR_ID_NAME, INT, 1, &default_pid, err ); 00147 // the 'INT' is the type of data to store 00148 // the '1' is for one value per vertex 00149 // NULL for no default value, if you want them all 00150 // initialized to something, pass in a pointer to an int 00151 // with the value. 00152 MSQ_CHKERR( err ); 00153 } 00154 00155 tag_set_vertex_data( pid_tag, num_vtx, vert_array, pid, err );MSQ_CHKERR( err ); 00156 } 00157 00158 int ParallelMeshImpl::get_geometric_dimension( MsqError& err ) 00159 { 00160 return myMesh->get_geometric_dimension( err ); 00161 } 00162 00163 void ParallelMeshImpl::get_all_elements( std::vector< ElementHandle >& elems, MsqError& err ) 00164 { 00165 myMesh->get_all_elements( elems, err ); 00166 } 00167 00168 void ParallelMeshImpl::get_all_vertices( std::vector< VertexHandle >& verts, MsqError& err ) 00169 { 00170 myMesh->get_all_vertices( verts, err ); 00171 } 00172 00173 void ParallelMeshImpl::vertices_get_fixed_flag( const VertexHandle vert_array[], 00174 std::vector< bool >& flag_array, 00175 size_t num_vtx, 00176 MsqError& err ) 00177 { 00178 myMesh->vertices_get_fixed_flag( vert_array, flag_array, num_vtx, err ); 00179 } 00180 00181 void ParallelMeshImpl::vertices_get_coordinates( const Mesh::VertexHandle vert_array[], 00182 MsqVertex* coordinates, 00183 size_t num_vtx, 00184 MsqError& err ) 00185 { 00186 myMesh->vertices_get_coordinates( vert_array, coordinates, num_vtx, err ); 00187 } 00188 00189 void ParallelMeshImpl::vertices_get_slaved_flag( const VertexHandle vert_array[], 00190 std::vector< bool >& flag_array, 00191 size_t num_vtx, 00192 MsqError& err ) 00193 { 00194 myMesh->vertices_get_slaved_flag( vert_array, flag_array, num_vtx, err ); 00195 } 00196 00197 void ParallelMeshImpl::vertex_set_coordinates( VertexHandle vertex, const Vector3D& coordinates, MsqError& err ) 00198 { 00199 myMesh->vertex_set_coordinates( vertex, coordinates, err ); 00200 } 00201 00202 void ParallelMeshImpl::vertex_set_byte( VertexHandle vertex, unsigned char byte, MsqError& err ) 00203 { 00204 myMesh->vertex_set_byte( vertex, byte, err ); 00205 } 00206 00207 void ParallelMeshImpl::vertices_set_byte( const VertexHandle* vert_array, 00208 const unsigned char* byte_array, 00209 size_t array_size, 00210 MsqError& err ) 00211 { 00212 myMesh->vertices_set_byte( vert_array, byte_array, array_size, err ); 00213 } 00214 00215 void ParallelMeshImpl::vertex_get_byte( const VertexHandle vertex, unsigned char* byte, MsqError& err ) 00216 { 00217 myMesh->vertex_get_byte( vertex, byte, err ); 00218 } 00219 00220 void ParallelMeshImpl::vertices_get_byte( const VertexHandle* vert_array, 00221 unsigned char* byte_array, 00222 size_t array_size, 00223 MsqError& err ) 00224 { 00225 myMesh->vertices_get_byte( vert_array, byte_array, array_size, err ); 00226 } 00227 00228 void ParallelMeshImpl::vertices_get_attached_elements( const VertexHandle* vertices, 00229 size_t num_vertices, 00230 std::vector< ElementHandle >& elements, 00231 std::vector< size_t >& offsets, 00232 MsqError& err ) 00233 { 00234 myMesh->vertices_get_attached_elements( vertices, num_vertices, elements, offsets, err ); 00235 } 00236 00237 void ParallelMeshImpl::elements_get_attached_vertices( const ElementHandle* elements, 00238 size_t num_elems, 00239 std::vector< VertexHandle >& vertices, 00240 std::vector< size_t >& offsets, 00241 MsqError& err ) 00242 { 00243 myMesh->elements_get_attached_vertices( elements, num_elems, vertices, offsets, err ); 00244 } 00245 00246 void ParallelMeshImpl::elements_get_topologies( const ElementHandle* element_handle_array, 00247 EntityTopology* element_topologies, 00248 size_t num_elements, 00249 MsqError& err ) 00250 { 00251 myMesh->elements_get_topologies( element_handle_array, element_topologies, num_elements, err ); 00252 } 00253 00254 TagHandle ParallelMeshImpl::tag_create( const std::string& name, 00255 TagType type, 00256 unsigned length, 00257 const void* defval, 00258 MsqError& err ) 00259 { 00260 return myMesh->tag_create( name, type, length, defval, err ); 00261 } 00262 00263 void ParallelMeshImpl::tag_delete( TagHandle handle, MsqError& err ) 00264 { 00265 myMesh->tag_delete( handle, err ); 00266 } 00267 00268 TagHandle ParallelMeshImpl::tag_get( const std::string& name, MsqError& err ) 00269 { 00270 return myMesh->tag_get( name, err ); 00271 } 00272 00273 void ParallelMeshImpl::tag_properties( TagHandle handle, 00274 std::string& name, 00275 TagType& type, 00276 unsigned& length, 00277 MsqError& err ) 00278 { 00279 myMesh->tag_properties( handle, name, type, length, err ); 00280 } 00281 00282 void ParallelMeshImpl::tag_set_element_data( TagHandle handle, 00283 size_t num_elems, 00284 const ElementHandle* elem_array, 00285 const void* values, 00286 MsqError& err ) 00287 { 00288 myMesh->tag_set_element_data( handle, num_elems, elem_array, values, err ); 00289 } 00290 00291 void ParallelMeshImpl::tag_get_element_data( TagHandle handle, 00292 size_t num_elems, 00293 const ElementHandle* elem_array, 00294 void* values, 00295 MsqError& err ) 00296 { 00297 myMesh->tag_get_element_data( handle, num_elems, elem_array, values, err ); 00298 } 00299 00300 void ParallelMeshImpl::tag_set_vertex_data( TagHandle handle, 00301 size_t num_verts, 00302 const VertexHandle* vert_array, 00303 const void* values, 00304 MsqError& err ) 00305 { 00306 myMesh->tag_set_vertex_data( handle, num_verts, vert_array, values, err ); 00307 } 00308 00309 void ParallelMeshImpl::tag_get_vertex_data( TagHandle handle, 00310 size_t num_verts, 00311 const VertexHandle* vert_array, 00312 void* values, 00313 MsqError& err ) 00314 { 00315 myMesh->tag_get_vertex_data( handle, num_verts, vert_array, values, err ); 00316 } 00317 00318 void ParallelMeshImpl::release_entity_handles( const EntityHandle* handle_array, size_t num_handles, MsqError& err ) 00319 00320 { 00321 myMesh->release_entity_handles( handle_array, num_handles, err ); 00322 } 00323 00324 void ParallelMeshImpl::release() 00325 { 00326 myMesh->release(); 00327 } 00328 00329 } // namespace MBMesquite