50 ProcessExtractSurf::create,
51 "Process elements to extract a specified surface(s) or composites(s).");
56 false,
"NotSet",
"Tag identifying surface/composite to process.");
58 ConfigOption(
false,
"-1",
"Tag to detect on boundary composites");
68 string surf =
m_config[
"surf"].as<
string>();
69 bool detectbnd =
m_config[
"detectbnd"].beenSet;
72 vector<unsigned int> surfs;
74 "Failed to interp surf string. Have you specified this string?");
75 sort(surfs.begin(), surfs.end());
80 cout <<
"ProcessExtractSurf: extracting surface" 81 << (surfs.size() > 1 ?
"s" :
"") <<
" " << surf << endl;
85 vector<ElementSharedPtr> el =
m_mesh->m_element[
m_mesh->m_expDim - 1];
92 m_mesh->m_vertexSet.clear();
98 for (i = 0; i < el.size(); ++i)
100 vector<EdgeSharedPtr> edges = el[i]->GetEdgeList();
101 for (j = 0; j < edges.size(); ++j)
103 edges[j]->m_elLink.clear();
109 for (j = 0; j < f->m_edgeList.size(); ++j)
111 f->m_edgeList[j]->m_elLink.clear();
117 std::unordered_set<int> keptIds;
122 for (i = 0; i < el.size(); ++i)
125 vector<int> inter, tags = el[i]->GetTagList();
127 sort(tags.begin(), tags.end());
128 set_intersection(surfs.begin(),
132 back_inserter(inter));
135 if (inter.size() != 1)
142 vector<NodeSharedPtr> verts = elmt->GetVertexList();
143 vector<EdgeSharedPtr> edges = elmt->GetEdgeList();
146 for (j = 0; j < verts.size(); ++j)
148 m_mesh->m_vertexSet.insert(verts[j]);
159 elmt->SetId(e->m_id);
163 for (j = 0; j < f->m_vertexList.size(); j++)
165 elmt->SetVertex(j, f->m_vertexList[j]);
168 for (j = 0; j < edges.size(); ++j)
170 m_mesh->m_edgeSet.insert(f->m_edgeList[j]);
171 elmt->SetEdge(j, f->m_edgeList[j]);
172 f->m_edgeList[j]->m_elLink.push_back(std::make_pair(elmt, j));
176 auto edit = bndEdgeSet.find(f->m_edgeList[j]);
177 if (edit != bndEdgeSet.end())
180 bndEdgeSet.erase(edit);
184 bndEdgeSet.insert(f->m_edgeList[j]);
187 elmt->SetVolumeNodes(f->m_faceNodes);
188 elmt->SetId(f->m_id);
189 elmt->SetCurveType(f->m_curveType);
193 for (j = 0; j < edges.size(); ++j)
195 m_mesh->m_edgeSet.insert(edges[j]);
202 keptIds.insert(elmt->GetId());
205 m_mesh->m_element[
m_mesh->m_expDim - 1].push_back(elmt);
216 m_mesh->m_composite.clear();
223 if (it.second->m_items[0]->GetDim() !=
m_mesh->m_expDim)
228 vector<ElementSharedPtr> el = it.second->m_items;
229 it.second->m_items.clear();
231 for (i = 0; i < el.size(); ++i)
233 if (keptIds.count(el[i]->GetId()) > 0)
235 it.second->m_items.push_back(el[i]);
239 if (it.second->m_items.size() == 0)
244 m_mesh->m_composite.insert(it);
248 maxId = (std::max)(maxId, (
int)it.second->m_id) + 1;
251 tmp =
m_mesh->m_composite;
252 m_mesh->m_composite.clear();
259 vector<ElementSharedPtr> el = c->m_items;
262 string initialTag = el[0]->GetTag();
263 c->m_items.resize(1);
264 c->m_tag = initialTag;
268 map<string, CompositeSharedPtr> newComps;
269 newComps[initialTag] = c;
273 for (i = 1; i < el.size(); ++i)
278 string tag = el[i]->GetTag();
279 auto it2 = newComps.find(tag);
280 if (it2 == newComps.end())
283 newComp->m_id = maxId++;
284 newComp->m_tag = tag;
285 newComp->m_items.push_back(el[i]);
286 newComps[tag] = newComp;
290 it2->second->m_items.push_back(el[i]);
295 if (
m_mesh->m_verbose && newComps.size() > 1)
297 cout <<
"- Mapping composite " << it.first <<
" ->";
302 for (
auto &it2 : newComps)
304 if (
m_mesh->m_verbose && newComps.size() > 1)
306 cout << (i > 0 ?
", " :
" ") << it2.second->m_id <<
"(" 307 << it2.second->m_tag <<
")";
309 m_mesh->m_composite[it2.second->m_id] = it2.second;
313 if (
m_mesh->m_verbose && newComps.size() > 1)
327 if (
m_mesh->m_expDim != 2)
329 cerr <<
"Surface boundary detection only implemented for 2D meshes" 334 map<int, EdgeSet> surfBndEdgeSet;
335 map<int, string> surfLabels;
338 for (i = 0; i < el.size(); ++i)
341 vector<int> inter, tags = el[i]->GetTagList();
343 ASSERTL0(tags.size() == 1,
"Not sure what mutliple tags implies");
345 sort(tags.begin(), tags.end());
346 set_intersection(surfs.begin(),
350 back_inserter(inter));
353 if (inter.size() == 1)
361 if (
m_mesh->m_faceLabels.count(surf))
363 surfLabels[surf] =
m_mesh->m_faceLabels[surf];
368 vector<EdgeSharedPtr> edges = elmt->GetEdgeList();
373 for (j = 0; j < edges.size(); ++j)
377 if (surfBndEdgeSet.count(surf))
379 auto edit = surfBndEdgeSet[surf].find(f->m_edgeList[j]);
380 if (edit != surfBndEdgeSet[surf].end())
383 surfBndEdgeSet[surf].erase(edit);
387 surfBndEdgeSet[surf].insert(f->m_edgeList[j]);
393 surfBndEdgeSet[surf] = newEdgeSet;
394 surfBndEdgeSet[surf].insert(f->m_edgeList[j]);
400 m_mesh->m_faceLabels.clear();
403 for (
auto &esetit : surfBndEdgeSet)
406 newComp->m_id = maxId;
407 newComp->m_tag =
"E";
409 if (surfLabels.count(esetit.first))
411 newComp->m_label = surfLabels[esetit.first];
414 for (
auto &edit : esetit.second)
416 auto locit = bndEdgeSet.find(edit);
417 if (locit != bndEdgeSet.end())
423 tags.push_back(maxId);
426 vector<NodeSharedPtr> nodeList;
427 nodeList.push_back((*locit)->m_n1);
428 nodeList.push_back((*locit)->m_n2);
432 elType, conf, nodeList, tags);
433 E->SetId((*locit)->m_id);
434 m_mesh->m_element[E->GetDim()].push_back(E);
435 newComp->m_items.push_back(E);
439 if (newComp->m_items.size())
441 m_mesh->m_composite[maxId++] = newComp;
#define ASSERTL0(condition, msg)
Basic information about an element.
std::unordered_set< EdgeSharedPtr, EdgeHash > EdgeSet
std::map< unsigned int, CompositeSharedPtr > CompositeMap
Container of composites; key is the composite id, value is the composite.
MeshSharedPtr m_mesh
Mesh object.
std::shared_ptr< Edge > EdgeSharedPtr
Shared pointer to an edge.
std::shared_ptr< Mesh > MeshSharedPtr
Shared pointer to a mesh.
ElementFactory & GetElementFactory()
std::shared_ptr< Face > FaceSharedPtr
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
A composite is a collection of elements.
std::pair< ModuleType, std::string > ModuleKey
std::shared_ptr< Element > ElementSharedPtr
Represents a command-line configuration option.
std::map< std::string, ConfigOption > m_config
List of configuration values.
Abstract base class for processing modules.
std::shared_ptr< Composite > CompositeSharedPtr
Shared pointer to a composite.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
std::pair< ModuleType, std::string > ModuleKey
ModuleFactory & GetModuleFactory()
static bool GenerateSeqVector(const std::string &str, std::vector< unsigned int > &out)
Takes a comma-separated compressed string and converts it to entries in a vector. ...