MOAB: Mesh Oriented datABase  (version 5.4.1)
ParallelMeshImpl.cpp
Go to the documentation of this file.
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     [email protected], [email protected], [email protected],
00024     [email protected], [email protected], [email protected],
00025     [email protected]
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 [email protected]
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines