52 "Process elements to detect a surface.");
57 "Tag identifying surface to process.");
75 cerr <<
"Surface detection only implemented for 2D meshes" << endl;
80 string surf =
m_config[
"vol"].as<
string>();
83 vector<unsigned int> surfs;
87 sort(surfs.begin(), surfs.end());
93 cout <<
"ProcessDetectSurf: detecting surfaces";
96 cout <<
" for surface" << (surfs.size() == 1 ?
"" :
"s")
97 <<
" " << surf << endl;
101 vector<ElementSharedPtr> &el =
m_mesh->m_element[
m_mesh->m_expDim];
102 map<int, EdgeInfo> edgeCount;
107 for (i = 0; i < el.size(); ++i)
110 if (surfs.size() > 0)
112 vector<int> inter, tags = el[i]->GetTagList();
114 sort(tags.begin(), tags.end());
115 set_intersection(surfs.begin(), surfs.end(),
116 tags .begin(), tags .end(),
117 back_inserter(inter));
120 if (inter.size() != 1)
128 for (j = 0; j < elmt->GetEdgeCount(); ++j)
132 edgeCount[eId].count++;
133 edgeCount[eId].edge = e;
136 doneIds.insert(elmt->GetId());
137 ASSERTL0(idMap.count(elmt->GetId()) == 0,
"Shouldn't happen");
138 idMap[elmt->GetId()] = i;
142 unsigned int maxId = 0;
144 for (cIt =
m_mesh->m_composite.begin(); cIt !=
m_mesh->m_composite.end(); ++cIt)
146 maxId = std::max(cIt->first, maxId);
153 while (doneIds.size() > 0)
156 =
m_mesh->m_element[
m_mesh->m_expDim][idMap[*(doneIds.begin())]];
158 vector<ElementSharedPtr> block;
160 ASSERTL0(block.size() > 0,
"Contiguous block not found");
163 for (i = 0; i < block.size(); ++i)
168 for (j = 0; j < elmt->GetEdgeCount(); ++j)
170 eIt = edgeCount.find(elmt->GetEdge(j)->m_id);
171 ASSERTL0(eIt != edgeCount.end(),
"Couldn't find edge");
172 eIt->second.group = maxId;
179 for (eIt = edgeCount.begin(); eIt != edgeCount.end(); ++eIt)
181 if (eIt->second.count > 1)
186 unsigned int compId = eIt->second.group;
189 if (cIt ==
m_mesh->m_composite.end())
194 cIt =
m_mesh->m_composite.insert(std::make_pair(compId, comp)).first;
199 vector<NodeSharedPtr> nodeList(2);
200 nodeList[0] = eIt->second.edge->m_n1;
201 nodeList[1] = eIt->second.edge->m_n2;
206 elmt->SetEdgeLink(eIt->second.edge);
208 cIt->second->m_items.push_back(elmt);
215 vector<ElementSharedPtr> &block)
217 block.push_back(start);
218 doneIds.erase(start->GetId());
220 vector<EdgeSharedPtr> edges = start->GetEdgeList();
222 for (
int i = 0; i < edges.size(); ++i)
224 for (
int j = 0; j < edges[i]->m_elLink.size(); ++j)
232 if (doneIds.count(elmt->GetId()) == 0)