29 const Matcher & matcher,
30 const std::vector<std::pair<std::size_t,std::size_t> > & ownedToMapped,
const std::string type_)
54 std::pair<RCP<std::vector<std::size_t> >,
56 std::vector<std::size_t> & sideIds = *idsAndCoords.first;
57 std::vector<Tuple<double,3> > & sideCoords = *idsAndCoords.second;
62 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > > locallyMatchedIds;
67 }
catch(std::logic_error & e) {
68 locallyMatchedIds = Teuchos::rcp(
new std::vector<std::pair<std::size_t,std::size_t> >);
71 Teuchos::FancyOStream out(Teuchos::rcpFromRef(std::cout));
72 out.setShowProcRank(
true);
73 out.setOutputToRootOnly(-1);
75 out <<
"Not all sides matched expect failure: \n" << e.what() << std::endl;
88 std::map<std::size_t,std::vector<std::size_t> > reverseMap;
89 for(std::size_t i=0;i<ownedToMapped.size();i++)
90 reverseMap[ownedToMapped[i].second].push_back(ownedToMapped[i].first);
92 Teuchos::RCP<std::vector<std::size_t> > locallyRequiredIds =
getLocalSideIds(mesh,left,type_);
93 std::vector<std::size_t> saved_locallyRequiredIds = *locallyRequiredIds;
96 std::vector<std::pair<std::size_t,std::size_t> > unusedOwnedToMapped;
99 for(std::size_t i=0;i<ownedToMapped.size();i++) {
100 std::size_t owned = ownedToMapped[i].first;
101 std::size_t mapped = ownedToMapped[i].second;
103 std::vector<std::size_t>::iterator itr
104 = std::find(locallyRequiredIds->begin(),locallyRequiredIds->end(),owned);
108 if(itr!=locallyRequiredIds->end())
111 unusedOwnedToMapped.push_back(ownedToMapped[i]);
115 std::vector<std::size_t> unique_locallyRequiredIds;
117 std::set<std::size_t> s;
118 s.insert(locallyRequiredIds->begin(),locallyRequiredIds->end());
119 unique_locallyRequiredIds.insert(unique_locallyRequiredIds.begin(),s.begin(),s.end());
123 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > > globallyMatchedIds
124 =
getGlobalPairing(unique_locallyRequiredIds,*locallyMatchedIds,mesh,failure);
133 std::set<std::pair<std::size_t,std::size_t> > gmi_set;
134 gmi_set.insert(globallyMatchedIds->begin(),globallyMatchedIds->end());
138 for(std::size_t i=0;i<globallyMatchedIds->size();i++) {
139 std::pair<std::size_t,std::size_t> pair = (*globallyMatchedIds)[i];
140 const std::vector<std::size_t> & others = reverseMap[pair.first];
144 for(std::size_t j=0;j<others.size();j++)
145 gmi_set.insert(std::make_pair(others[j],pair.second));
148 if(std::find(saved_locallyRequiredIds.begin(),
149 saved_locallyRequiredIds.end(),
150 pair.first)==saved_locallyRequiredIds.end()) {
156 globallyMatchedIds->clear();
157 globallyMatchedIds->insert(globallyMatchedIds->begin(),gmi_set.begin(),gmi_set.end());
162 globallyMatchedIds->insert(globallyMatchedIds->end(),unusedOwnedToMapped.begin(),unusedOwnedToMapped.end());
164 return globallyMatchedIds;
171 const Matcher & matcher,
const std::string type_)
188 using Teuchos::Tuple;
195 std::pair<RCP<std::vector<std::size_t> >,
197 std::vector<std::size_t> & sideIds = *idsAndCoords.first;
198 std::vector<Tuple<double,3> > & sideCoords = *idsAndCoords.second;
203 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > > locallyMatchedIds;
205 bool failure =
false;
208 }
catch(std::logic_error & e) {
209 locallyMatchedIds = Teuchos::rcp(
new std::vector<std::pair<std::size_t,std::size_t> >);
212 Teuchos::FancyOStream out(Teuchos::rcpFromRef(std::cout));
213 out.setShowProcRank(
true);
214 out.setOutputToRootOnly(-1);
216 out <<
"Not all sides matched expect failure: \n" << e.what() << std::endl;
225 Teuchos::RCP<std::vector<std::size_t> > locallyRequiredIds =
getLocalSideIds(mesh,left,type_);
226 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > > globallyMatchedIds
232 return globallyMatchedIds;
238 const std::vector<Teuchos::Tuple<double,3> > & side_coords,
240 const std::string & sideName,
const Matcher & matcher, std::string type_)
243 using Teuchos::Tuple;
245 RCP<std::vector<std::pair<std::size_t,std::size_t> > >
result
246 = Teuchos::rcp(
new std::vector<std::pair<std::size_t,std::size_t> >);
251 std::pair<Teuchos::RCP<std::vector<std::size_t> >,
252 Teuchos::RCP<std::vector<Teuchos::Tuple<double,3> > > > sidePair =
255 std::vector<std::size_t> & local_side_ids = *sidePair.first;
256 std::vector<Teuchos::Tuple<double,3> > & local_side_coords = *sidePair.second;
258 bool checkProb =
false;
259 std::vector<bool> side_flags(side_ids.size(),
false);
264 for(std::size_t localNode=0;localNode<local_side_ids.size();localNode++) {
265 std::size_t local_gid = local_side_ids[localNode];
266 const Tuple<double,3> & local_coord = local_side_coords[localNode];
269 for(std::size_t globalNode=0;globalNode<side_ids.size();globalNode++) {
270 std::size_t global_gid = side_ids[globalNode];
271 const Tuple<double,3> & global_coord = side_coords[globalNode];
273 if(matcher(global_coord,local_coord)) {
274 if(side_flags[globalNode])
277 result->push_back(std::make_pair(global_gid,local_gid));
278 side_flags[globalNode] =
true;
286 TEUCHOS_TEST_FOR_EXCEPTION(checkProb,std::logic_error,
287 "getLocallyMatchedSideIds: checkProb failed");
289 TEUCHOS_TEST_FOR_EXCEPTION(local_side_ids.size()!=
result->size(),std::logic_error,
290 "getLocallyMatchedSideIds: not all local side ids are satisfied!");