35 #include <boost/algorithm/string.hpp> 51 ProcessOptiExtract::create,
52 "Pulls out blobs for linear elastic solver.");
57 ConfigOption(
false,
"-1",
"Name of mesh file to be combined.");
68 cout <<
"ProcessOptiExtract: ... " << endl;
71 string ins =
m_config[
"insert"].as<
string>();
73 bool extract = boost::iequals(ins,
"-1");
77 vector<ElementSharedPtr> el =
m_mesh->m_element[
m_mesh->m_expDim];
82 vector<ElementSharedPtr> invalid;
85 for (
int i = 0; i < el.size(); ++i)
89 el[i]->GetGeom(
m_mesh->m_spaceDim);
98 invalid.push_back(el[i]);
102 std::unordered_set<int> inmesh;
103 vector<ElementSharedPtr> totest;
105 for (
int i = 0; i < invalid.size(); i++)
107 auto t = inmesh.insert(invalid[i]->GetId());
110 m_mesh->m_element[
m_mesh->m_expDim].push_back(invalid[i]);
113 vector<FaceSharedPtr> f = invalid[i]->GetFaceList();
114 for (
int j = 0; j < f.size(); j++)
116 for (
int k = 0; k < f[j]->m_elLink.size(); k++)
118 if (f[j]->m_elLink[k].first->GetId() == invalid[i]->GetId())
123 t = inmesh.insert(f[j]->m_elLink[k].first->GetId());
127 f[j]->m_elLink[k].first);
128 totest.push_back(f[j]->m_elLink[k].first);
134 for (
int i = 0; i < 12; i++)
136 vector<ElementSharedPtr> tmp = totest;
138 for (
int j = 0; j < tmp.size(); j++)
140 vector<FaceSharedPtr> f = tmp[j]->GetFaceList();
141 for (
int k = 0; k < f.size(); k++)
143 for (
int l = 0; l < f[k]->m_elLink.size(); l++)
145 if (f[k]->m_elLink[l].first->GetId() == tmp[j]->GetId())
150 auto t = inmesh.insert(f[k]->m_elLink[l].first->GetId());
154 f[k]->m_elLink[l].first);
155 totest.push_back(f[k]->m_elLink[l].first);
163 m_mesh->m_vertexSet.clear();
164 m_mesh->m_edgeSet.clear();
165 m_mesh->m_faceSet.clear();
171 cout << el.size() <<
" elements in blobs" << endl;
174 m_mesh->m_faceSet.clear();
177 for (
int i = 0; i < el.size(); ++i)
179 for (
int j = 0; j < el[i]->GetFaceCount(); ++j)
181 auto testIns =
m_mesh->m_faceSet.insert(el[i]->GetFace(j));
186 ->m_elLink.push_back(
187 pair<ElementSharedPtr, int>(el[i], j));
191 el[i]->SetFace(j, *testIns.first);
194 ->m_elLink.push_back(
195 pair<ElementSharedPtr, int>(el[i], j));
201 for (
int i = 0; i < el.size(); i++)
203 vector<FaceSharedPtr> f = el[i]->GetFaceList();
204 for (
int j = 0; j < f.size(); j++)
206 if (f[j]->m_elLink.size() == 1)
224 for (
int i = 0; i < el.size(); ++i)
226 for (
int j = 0; j < el[i]->GetVertexCount(); ++j)
228 auto testIns =
m_mesh->m_vertexSet.insert(el[i]->GetVertex(j));
232 el[i]->SetVertex(j, *testIns.first);
237 for (
int i = 0; i < el.size(); ++i)
239 for (
int j = 0; j < el[i]->GetEdgeCount(); ++j)
242 auto testIns =
m_mesh->m_edgeSet.insert(ed);
247 ed2->m_elLink.push_back(
248 pair<ElementSharedPtr, int>(el[i], j));
253 el[i]->SetEdge(j, e2);
254 if (e2->m_edgeNodes.size() == 0 &&
255 ed->m_edgeNodes.size() > 0)
257 e2->m_curveType = ed->m_curveType;
258 e2->m_edgeNodes = ed->m_edgeNodes;
261 if (e2->m_n1->m_id != ed->m_n1->m_id)
263 reverse(e2->m_edgeNodes.begin(),
264 e2->m_edgeNodes.end());
269 e2->m_elLink.push_back(
270 pair<ElementSharedPtr, int>(el[i], j));
274 for (
int i = 0; i < el.size(); ++i)
276 for (
int j = 0; j < el[i]->GetFaceCount(); ++j)
278 auto testIns =
m_mesh->m_faceSet.insert(el[i]->GetFace(j));
283 ->m_elLink.push_back(
284 pair<ElementSharedPtr, int>(el[i], j));
288 el[i]->SetFace(j, *testIns.first);
291 ->m_elLink.push_back(
292 pair<ElementSharedPtr, int>(el[i], j));
306 mod->RegisterConfig(
"infile", ins);
311 map<int, NodeSharedPtr> nmap;
313 for (
auto &node : inp_mesh->m_vertexSet)
315 nmap[node->m_id] = node;
319 for (
auto &node :
m_mesh->m_vertexSet)
321 if (nmap.count(node->m_id) == 1)
323 auto s = nmap.find(node->m_id);
331 for (
auto &eit : inp_mesh->m_edgeSet)
333 auto et =
m_mesh->m_edgeSet.find(eit);
334 if (et !=
m_mesh->m_edgeSet.end())
336 (*et)->m_edgeNodes = eit->m_edgeNodes;
337 (*et)->m_curveType = eit->m_curveType;
341 for (
auto &fit : inp_mesh->m_faceSet)
343 auto ft =
m_mesh->m_faceSet.find(fit);
344 if (ft !=
m_mesh->m_faceSet.end())
346 (*ft)->m_faceNodes = fit->m_faceNodes;
347 (*ft)->m_curveType = fit->m_curveType;
Basic information about an element.
std::shared_ptr< GeomFactors > GeomFactorsSharedPtr
Pointer to a GeomFactors object.
std::shared_ptr< Module > ModuleSharedPtr
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< Node > NodeSharedPtr
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
std::pair< ModuleType, std::string > ModuleKey
virtual NEKMESHUTILS_EXPORT void ProcessFaces(bool ReprocessFaces=true)
Extract element faces.
std::shared_ptr< Element > ElementSharedPtr
Represents a command-line configuration option.
std::shared_ptr< Geometry > GeometrySharedPtr
std::map< std::string, ConfigOption > m_config
List of configuration values.
virtual NEKMESHUTILS_EXPORT void ClearElementLinks()
def extract(self, check_equality=False)
Abstract base class for processing modules.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
std::pair< ModuleType, std::string > ModuleKey
virtual NEKMESHUTILS_EXPORT void ProcessComposites()
Generate composites.
ModuleFactory & GetModuleFactory()