Branch data Line data Source code
1 : : /** \file SharedSetData.cpp
2 : : * \author Jason Kraftcheck
3 : : * \date 2011-06-23
4 : : */
5 : :
6 : : #include "moab/Interface.hpp"
7 : : #include "SharedSetData.hpp"
8 : : #include <assert.h>
9 : : #include <stdio.h>
10 : : #include <stdlib.h>
11 : :
12 : : namespace moab
13 : : {
14 : :
15 [ + - ][ + - ]: 90 : SharedSetData::SharedSetData( Interface& moab, int pcID, unsigned rank ) : mb( moab ), sharedSetTag( 0 )
16 : : {
17 : : SharedSetTagData zero;
18 : :
19 : : // Zero out any padding bytes in SharedSetTagData (used for memory alignment)
20 : : // Otherwise, memcmp could lead to unexpected false negatives for comparison
21 : 45 : memset( &zero, 0, sizeof( SharedSetTagData ) );
22 : :
23 : 45 : zero.ownerRank = rank;
24 : 45 : zero.ownerHandle = 0;
25 : 45 : zero.sharingProcs = NULL;
26 : : // band-aid: make sure the tag is unique, to not interfere with different pcID
27 : : // maybe a better solution is needed
28 : : // pcID can be at most 64, it ranges from 0 to 63; problems appear at migrate mesh
29 [ + - ]: 45 : std::ostringstream sharedTagUniqueName;
30 [ + - ][ + - ]: 45 : sharedTagUniqueName << "__sharedSetTag" << pcID;
31 : : ErrorCode rval = mb.tag_get_handle( sharedTagUniqueName.str().c_str(), sizeof( SharedSetTagData ), MB_TYPE_OPAQUE,
32 [ + - ][ + - ]: 45 : sharedSetTag, MB_TAG_CREAT | MB_TAG_SPARSE, &zero );
33 [ - + ]: 45 : assert( MB_SUCCESS == rval );
34 [ - + ]: 45 : if( MB_SUCCESS != rval )
35 : : {
36 [ # # ]: 0 : fprintf( stderr, "Aborted from the constructor of SharedSetData.\n" );
37 : 0 : abort();
38 : 45 : }
39 : 45 : }
40 : :
41 : 84 : SharedSetData::~SharedSetData()
42 : : {
43 : 42 : mb.tag_delete( sharedSetTag );
44 : 42 : }
45 : :
46 : 0 : ErrorCode SharedSetData::get_owning_procs( std::vector< unsigned >& ranks_out ) const
47 : : {
48 : 0 : ranks_out.clear();
49 : 0 : ranks_out.reserve( handleMap.size() );
50 [ # # ][ # # ]: 0 : for( RHMap::const_iterator i = handleMap.begin(); i != handleMap.end(); ++i )
[ # # ]
51 [ # # ][ # # ]: 0 : ranks_out.push_back( i->first );
52 : 0 : return MB_SUCCESS;
53 : : }
54 : :
55 : 0 : ErrorCode SharedSetData::get_sharing_procs( EntityHandle entity_set, std::vector< unsigned >& ranks_out ) const
56 : : {
57 : : ErrorCode rval;
58 : : SharedSetTagData data;
59 [ # # ]: 0 : rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
60 [ # # ]: 0 : if( MB_SUCCESS != rval ) return rval;
61 : :
62 : 0 : ranks_out.clear();
63 [ # # ][ # # ]: 0 : if( data.sharingProcs ) ranks_out = *data.sharingProcs;
64 : 0 : return MB_SUCCESS;
65 : : }
66 : :
67 : 0 : ErrorCode SharedSetData::get_shared_sets( Range& sets_out ) const
68 : : {
69 : : // sets_out.clear();
70 : : // return mb.get_entities_by_type_and_tag( 0, MBENTITYSET, &sharedSetTag, 1, 0, sets_out );
71 : :
72 : 0 : sets_out.clear();
73 [ # # ][ # # ]: 0 : for( RHMap::const_iterator i = handleMap.begin(); i != handleMap.end(); ++i )
[ # # ]
74 [ # # ][ # # ]: 0 : append_local_handles( i->second, sets_out );
75 : 0 : return MB_SUCCESS;
76 : : }
77 : :
78 : 0 : ErrorCode SharedSetData::get_shared_sets( unsigned rank, Range& sets_out ) const
79 : : {
80 [ # # ]: 0 : sets_out.clear();
81 : : // if (rank == myRank) {
82 : : // return mb.get_entities_by_type_and_tag( 0, MBENTITYSET,
83 : : // }
84 : : // else {
85 [ # # ]: 0 : RHMap::const_iterator i = handleMap.find( rank );
86 [ # # ][ # # ]: 0 : if( i != handleMap.end() ) append_local_handles( i->second, sets_out );
[ # # ][ # # ]
87 : 0 : return MB_SUCCESS;
88 : : // }
89 : : }
90 : :
91 : 0 : ErrorCode SharedSetData::get_owner( EntityHandle entity_set, unsigned& rank_out, EntityHandle& remote_handle_out ) const
92 : : {
93 : : ErrorCode rval;
94 : : SharedSetTagData data;
95 [ # # ]: 0 : rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
96 [ # # ]: 0 : if( MB_SUCCESS != rval ) return rval;
97 : :
98 [ # # ]: 0 : if( !data.ownerHandle )
99 : : { // not shared
100 [ # # ]: 0 : assert( !data.sharingProcs ); // really not shared
101 : 0 : data.ownerHandle = entity_set;
102 : : }
103 : :
104 : 0 : rank_out = data.ownerRank;
105 : 0 : remote_handle_out = data.ownerHandle;
106 : 0 : return MB_SUCCESS;
107 : : }
108 : :
109 : 0 : ErrorCode SharedSetData::get_local_handle( unsigned owner_rank, EntityHandle remote_handle,
110 : : EntityHandle& local_handle ) const
111 : : {
112 [ # # ]: 0 : RHMap::const_iterator i = handleMap.find( owner_rank );
113 [ # # ][ # # ]: 0 : assert( i != handleMap.end() );
114 [ # # ][ # # ]: 0 : if( i == handleMap.end() )
115 : : {
116 : 0 : local_handle = ~(EntityHandle)0;
117 : 0 : return MB_FAILURE;
118 : : }
119 : :
120 [ # # ][ # # ]: 0 : if( !i->second.find( remote_handle, local_handle ) )
[ # # ]
121 : : {
122 : 0 : assert( false );
123 : : local_handle = ~(EntityHandle)0;
124 : : return MB_FAILURE;
125 : : }
126 : :
127 : 0 : return MB_SUCCESS;
128 : : }
129 : :
130 : 0 : ErrorCode SharedSetData::set_owner( EntityHandle set, unsigned owner_rank, EntityHandle owner_handle )
131 : : {
132 : : ErrorCode rval;
133 : : SharedSetTagData data;
134 [ # # ]: 0 : rval = mb.tag_get_data( sharedSetTag, &set, 1, &data );
135 [ # # ]: 0 : if( MB_SUCCESS != rval ) return rval;
136 : :
137 [ # # ]: 0 : if( data.ownerHandle )
138 : : {
139 [ # # ]: 0 : RHMap::iterator i = handleMap.find( data.ownerRank );
140 [ # # ][ # # ]: 0 : if( i != handleMap.end() ) { i->second.erase( data.ownerHandle, 1 ); }
[ # # ][ # # ]
141 : : }
142 : :
143 : 0 : data.ownerRank = owner_rank;
144 : 0 : data.ownerHandle = owner_handle;
145 [ # # ]: 0 : rval = mb.tag_set_data( sharedSetTag, &set, 1, &data );
146 [ # # ]: 0 : if( MB_SUCCESS != rval ) return rval;
147 : :
148 [ # # ][ # # ]: 0 : if( !handleMap[owner_rank].insert( owner_handle, set, 1 ).second )
[ # # ]
149 : : {
150 : 0 : assert( false );
151 : : return MB_FAILURE;
152 : : }
153 : :
154 : 0 : return MB_SUCCESS;
155 : : }
156 : :
157 : 0 : ErrorCode SharedSetData::set_sharing_procs( EntityHandle entity_set, std::vector< unsigned >& ranks )
158 : : {
159 [ # # ]: 0 : std::sort( ranks.begin(), ranks.end() );
160 [ # # ]: 0 : RProcMap::iterator it = procListMap.insert( ranks ).first;
161 : :
162 : : ErrorCode rval;
163 : : SharedSetTagData data;
164 [ # # ]: 0 : rval = mb.tag_get_data( sharedSetTag, &entity_set, 1, &data );
165 [ # # ]: 0 : if( MB_SUCCESS != rval ) return rval;
166 : :
167 [ # # ]: 0 : data.sharingProcs = &*it;
168 [ # # ]: 0 : rval = mb.tag_set_data( sharedSetTag, &entity_set, 1, &data );
169 [ # # ]: 0 : if( MB_SUCCESS != rval ) return rval;
170 : :
171 : 0 : return MB_SUCCESS;
172 : : }
173 : :
174 : 0 : void SharedSetData::append_local_handles( const ProcHandleMapType& map, Range& range )
175 : : {
176 [ # # ]: 0 : Range::iterator hint = range.begin();
177 [ # # ][ # # ]: 0 : for( ProcHandleMapType::const_iterator i = map.begin(); i != map.end(); ++i )
[ # # ][ # # ]
[ # # ]
178 [ # # ][ # # ]: 0 : hint = range.insert( hint, i->value, i->value + i->count - 1 );
[ # # ][ # # ]
179 : 0 : }
180 : :
181 [ + - ][ + - ]: 228 : } // namespace moab
|