![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /** \file SharedSetData.cpp
00002 * \author Jason Kraftcheck
00003 * \date 2011-06-23
00004 */
00005
00006 #include "moab/Interface.hpp"
00007 #include "SharedSetData.hpp"
00008 #include
00009 #include
00010 #include
00011
00012 namespace moab
00013 {
00014
00015 SharedSetData::SharedSetData( Interface& moab, int pcID, unsigned rank ) : mb( moab ), sharedSetTag( 0 )
00016 {
00017 SharedSetTagData zero;
00018
00019 // Zero out any padding bytes in SharedSetTagData (used for memory alignment)
00020 // Otherwise, memcmp could lead to unexpected false negatives for comparison
00021 memset( &zero, 0, sizeof( SharedSetTagData ) );
00022
00023 zero.ownerRank = rank;
00024 zero.ownerHandle = 0;
00025 zero.sharingProcs = NULL;
00026 // band-aid: make sure the tag is unique, to not interfere with different pcID
00027 // maybe a better solution is needed
00028 // pcID can be at most 64, it ranges from 0 to 63; problems appear at migrate mesh
00029 std::ostringstream sharedTagUniqueName;
00030 sharedTagUniqueName << "__sharedSetTag" << pcID;
00031 ErrorCode rval = mb.tag_get_handle( sharedTagUniqueName.str().c_str(), sizeof( SharedSetTagData ), MB_TYPE_OPAQUE,
00032 sharedSetTag, MB_TAG_CREAT | MB_TAG_SPARSE, &zero );
00033 assert( MB_SUCCESS == rval );
00034 if( MB_SUCCESS != rval )
00035 {
00036 fprintf( stderr, "Aborted from the constructor of SharedSetData.\n" );
00037 abort();
00038 }
00039 }
00040
00041 SharedSetData::~SharedSetData()
00042 {
00043 mb.tag_delete( sharedSetTag );
00044 }
00045
00046 ErrorCode SharedSetData::get_owning_procs( std::vector< unsigned >& ranks_out ) const
00047 {
00048 ranks_out.clear();
00049 ranks_out.reserve( handleMap.size() );
00050 for( RHMap::const_iterator i = handleMap.begin(); i != handleMap.end(); ++i )
00051 ranks_out.push_back( i->first );
00052 return MB_SUCCESS;
00053 }
00054
00055 ErrorCode SharedSetData::get_sharing_procs( EntityHandle entity_set, std::vector< unsigned >& ranks_out ) const
00056 {
00057 ErrorCode rval;
00058 SharedSetTagData data;
00059 rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
00060 if( MB_SUCCESS != rval ) return rval;
00061
00062 ranks_out.clear();
00063 if( data.sharingProcs ) ranks_out = *data.sharingProcs;
00064 return MB_SUCCESS;
00065 }
00066
00067 ErrorCode SharedSetData::get_shared_sets( Range& sets_out ) const
00068 {
00069 // sets_out.clear();
00070 // return mb.get_entities_by_type_and_tag( 0, MBENTITYSET, &sharedSetTag, 1, 0, sets_out );
00071
00072 sets_out.clear();
00073 for( RHMap::const_iterator i = handleMap.begin(); i != handleMap.end(); ++i )
00074 append_local_handles( i->second, sets_out );
00075 return MB_SUCCESS;
00076 }
00077
00078 ErrorCode SharedSetData::get_shared_sets( unsigned rank, Range& sets_out ) const
00079 {
00080 sets_out.clear();
00081 // if (rank == myRank) {
00082 // return mb.get_entities_by_type_and_tag( 0, MBENTITYSET,
00083 // }
00084 // else {
00085 RHMap::const_iterator i = handleMap.find( rank );
00086 if( i != handleMap.end() ) append_local_handles( i->second, sets_out );
00087 return MB_SUCCESS;
00088 // }
00089 }
00090
00091 ErrorCode SharedSetData::get_owner( EntityHandle entity_set, unsigned& rank_out, EntityHandle& remote_handle_out ) const
00092 {
00093 ErrorCode rval;
00094 SharedSetTagData data;
00095 rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
00096 if( MB_SUCCESS != rval ) return rval;
00097
00098 if( !data.ownerHandle )
00099 { // not shared
00100 assert( !data.sharingProcs ); // really not shared
00101 data.ownerHandle = entity_set;
00102 }
00103
00104 rank_out = data.ownerRank;
00105 remote_handle_out = data.ownerHandle;
00106 return MB_SUCCESS;
00107 }
00108
00109 ErrorCode SharedSetData::get_local_handle( unsigned owner_rank,
00110 EntityHandle remote_handle,
00111 EntityHandle& local_handle ) const
00112 {
00113 RHMap::const_iterator i = handleMap.find( owner_rank );
00114 assert( i != handleMap.end() );
00115 if( i == handleMap.end() )
00116 {
00117 local_handle = ~(EntityHandle)0;
00118 return MB_FAILURE;
00119 }
00120
00121 if( !i->second.find( remote_handle, local_handle ) )
00122 {
00123 assert( false );
00124 local_handle = ~(EntityHandle)0;
00125 return MB_FAILURE;
00126 }
00127
00128 return MB_SUCCESS;
00129 }
00130
00131 ErrorCode SharedSetData::set_owner( EntityHandle set, unsigned owner_rank, EntityHandle owner_handle )
00132 {
00133 ErrorCode rval;
00134 SharedSetTagData data;
00135 rval = mb.tag_get_data( sharedSetTag, &set, 1, &data );
00136 if( MB_SUCCESS != rval ) return rval;
00137
00138 if( data.ownerHandle )
00139 {
00140 RHMap::iterator i = handleMap.find( data.ownerRank );
00141 if( i != handleMap.end() )
00142 {
00143 i->second.erase( data.ownerHandle, 1 );
00144 }
00145 }
00146
00147 data.ownerRank = owner_rank;
00148 data.ownerHandle = owner_handle;
00149 rval = mb.tag_set_data( sharedSetTag, &set, 1, &data );
00150 if( MB_SUCCESS != rval ) return rval;
00151
00152 if( !handleMap[owner_rank].insert( owner_handle, set, 1 ).second )
00153 {
00154 assert( false );
00155 return MB_FAILURE;
00156 }
00157
00158 return MB_SUCCESS;
00159 }
00160
00161 ErrorCode SharedSetData::set_sharing_procs( EntityHandle entity_set, std::vector< unsigned >& ranks )
00162 {
00163 std::sort( ranks.begin(), ranks.end() );
00164 RProcMap::iterator it = procListMap.insert( ranks ).first;
00165
00166 ErrorCode rval;
00167 SharedSetTagData data;
00168 rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
00169 if( MB_SUCCESS != rval ) return rval;
00170
00171 data.sharingProcs = &*it;
00172 rval = mb.tag_set_data( sharedSetTag, &entity_set, 1, &data );
00173 if( MB_SUCCESS != rval ) return rval;
00174
00175 return MB_SUCCESS;
00176 }
00177
00178 void SharedSetData::append_local_handles( const ProcHandleMapType& map, Range& range )
00179 {
00180 Range::iterator hint = range.begin();
00181 for( ProcHandleMapType::const_iterator i = map.begin(); i != map.end(); ++i )
00182 hint = range.insert( hint, i->value, i->value + i->count - 1 );
00183 }
00184
00185 } // namespace moab