53 Loki::SingleThreaded> Type;
54 return Type::Instance();
80 string fname =
m_config[
"infile"].as<
string>();
84 cerr <<
"Error opening file: " << fname << endl;
94 string fname =
m_config[
"outfile"].as<
string>();
98 cerr <<
"Error opening file: " << fname << endl;
113 vector<ElementSharedPtr> &elmt =
m_mesh->m_element[
m_mesh->m_expDim];
115 m_mesh->m_vertexSet.clear();
117 for (
int i = 0, vid = 0; i < elmt.size(); ++i)
119 for (
int j = 0; j < elmt[i]->GetVertexCount(); ++j)
121 pair<NodeSet::iterator,bool> testIns =
122 m_mesh->m_vertexSet.insert(elmt[i]->GetVertex(j));
126 (*(testIns.first))->m_id = vid++;
130 elmt[i]->SetVertex(j,*testIns.first);
153 if (
m_mesh->m_expDim < 2)
return;
157 vector<ElementSharedPtr> &elmt =
m_mesh->m_element[
m_mesh->m_expDim];
159 m_mesh->m_edgeSet.clear();
162 for (
int i = 0, eid = 0; i < elmt.size(); ++i)
164 for (
int j = 0; j < elmt[i]->GetEdgeCount(); ++j)
166 pair<EdgeSet::iterator,bool> testIns;
168 testIns =
m_mesh->m_edgeSet.insert(ed);
172 (*(testIns.first))->m_id = eid++;
177 elmt[i]->SetEdge(j, e2);
178 if (e2->m_edgeNodes.size() == 0 &&
179 ed->m_edgeNodes.size() > 0)
181 e2->m_curveType = ed->m_curveType;
182 e2->m_edgeNodes = ed->m_edgeNodes;
185 if (e2->m_n1->m_id != ed->m_n1->m_id)
187 reverse(e2->m_edgeNodes.begin(),
188 e2->m_edgeNodes.end());
193 (*(testIns.first))->m_elLink.push_back(
194 pair<ElementSharedPtr,int>(elmt[i],j));
201 for (
int i = 0; i <
m_mesh->m_element[1].size(); ++i)
205 vector<NodeSharedPtr> edgeNodes;
207 new Edge(v0, v1, edgeNodes,
208 m_mesh->m_element[1][i]->GetConf().m_edgeCurveType));
210 if (it ==
m_mesh->m_edgeSet.end())
212 cerr <<
"Cannot find corresponding element edge for "
213 <<
"1D element " << i << endl;
216 m_mesh->m_element[1][i]->SetEdgeLink(*it);
219 ASSERTL0((*it)->m_elLink.size() != 0,
220 "Empty boundary map!");
221 ASSERTL0((*it)->m_elLink.size() == 1,
222 "Too many elements in boundary map!");
223 pair<ElementSharedPtr, int> eMap = (*it)->m_elLink.at(0);
224 eMap.first->SetBoundaryLink(eMap.second, i);
227 if ((*it)->m_edgeNodes.size() > 0)
230 if (edge->GetVertex(0) == (*it)->m_n1)
232 edge->SetVolumeNodes((*it)->m_edgeNodes);
256 if (
m_mesh->m_expDim < 3)
return;
260 vector<ElementSharedPtr> &elmt =
m_mesh->m_element[
m_mesh->m_expDim];
262 m_mesh->m_faceSet.clear();
265 for (
int i = 0, fid = 0; i < elmt.size(); ++i)
267 for (
int j = 0; j < elmt[i]->GetFaceCount(); ++j)
269 pair<FaceSet::iterator,bool> testIns;
270 testIns =
m_mesh->m_faceSet.insert(elmt[i]->GetFace(j));
274 (*(testIns.first))->m_id = fid++;
278 elmt[i]->SetFace(j,*testIns.first);
280 (*(testIns.first))->m_elLink.push_back(
281 pair<ElementSharedPtr,int>(elmt[i],j));
288 for (
int i = 0; i <
m_mesh->m_element[2].size(); ++i)
290 vector<NodeSharedPtr> vertices =
m_mesh->m_element[2][i]->GetVertexList();
291 vector<NodeSharedPtr> faceNodes;
292 vector<EdgeSharedPtr> edgeList =
m_mesh->m_element[2][i]->GetEdgeList();
294 new Face(vertices, faceNodes, edgeList,
295 m_mesh->m_element[2][i]->GetConf().m_faceCurveType));
297 if (it ==
m_mesh->m_faceSet.end())
299 cout <<
"Cannot find corresponding element face for 2D "
300 <<
"element " << i << endl;
303 m_mesh->m_element[2][i]->SetFaceLink(*it);
306 ASSERTL0((*it)->m_elLink.size() != 0,
307 "Empty element link map!");
308 ASSERTL0((*it)->m_elLink.size() == 1,
309 "Too many elements in element link map!");
310 pair<ElementSharedPtr, int> eMap = (*it)->m_elLink.at(0);
311 eMap.first->SetBoundaryLink(eMap.second, i);
326 for (
int i = 0; i <
m_mesh->m_element[
m_mesh->m_expDim].size(); ++i)
343 m_mesh->m_composite.clear();
348 for (
int d = 0; d <=
m_mesh->m_expDim; ++d)
350 vector<ElementSharedPtr> &elmt =
m_mesh->m_element[d];
352 for (
int i = 0; i < elmt.size(); ++i)
355 unsigned int tagid = elmt[i]->GetTagList()[0];
357 it =
m_mesh->m_composite.find(tagid);
359 if (it ==
m_mesh->m_composite.end())
363 pair<CompositeMap::iterator, bool> testIns;
365 tmp->m_tag = elmt[i]->GetTag();
366 if(
m_mesh->m_faceLabels.count(tmp->m_id) != 0)
368 tmp->m_label =
m_mesh->m_faceLabels[tmp->m_id];
371 testIns =
m_mesh->m_composite.insert(
372 pair<unsigned int, CompositeSharedPtr>(tagid,tmp));
376 if (elmt[i]->GetTag() != it->second->m_tag)
378 cout <<
"Different types of elements in same composite!" << endl;
379 cout <<
" -> Composite uses " << it->second->m_tag << endl;
380 cout <<
" -> Element uses " << elmt[i]->GetTag() << endl;
381 cout <<
"Have you specified physical volumes and surfaces?" << endl;
383 it->second->m_items.push_back(elmt[i]);
425 set<int> prismsDone, tetsDone;
429 for (i = 0; i <
m_mesh->m_element[3].size(); ++i)
435 prismsDone.insert(i);
445 for (it =
m_mesh->m_vertexSet.begin(); it !=
m_mesh->m_vertexSet.end(); ++it)
452 int prismTris[2][3] = {{0,1,4}, {3,2,5}};
455 bool warnCurvature =
false;
459 boost::unordered_set<int> facesDone;
463 while (prismsDone.size() > 0)
465 vector<ElementSharedPtr> line;
469 PrismLines(*prismsDone.begin(), perFaces, prismsDone, line);
473 for (i = 0; i < line.size(); ++i)
476 vector<int> tags = line[i]->GetTagList();
477 vector<NodeSharedPtr> nodes = line[i]->GetVertexList();
482 line[i]->GetFace(1), line[i]->GetFace(3)
485 fIt[0] = facesDone.find(f[0]->m_id);
486 fIt[1] = facesDone.find(f[1]->m_id);
490 for (j = 0; j < 2; ++j)
492 pIt = perFaces.find(f[j]->m_id);
494 if (pIt == perFaces.end())
499 fIt2 = facesDone.find(pIt->second.first->m_id);
501 if (fIt[j] == facesDone.end() &&
502 fIt2 != facesDone.end())
508 if (fIt[0] != facesDone.end() &&
509 fIt[1] != facesDone.end())
513 ASSERTL0(
false,
"Renumbering error!");
515 else if (fIt[0] == facesDone.end() &&
516 fIt[1] == facesDone.end())
519 for (j = 0; j < 2; ++j)
521 for (k = 0; k < 3; ++k)
531 facesDone.insert(f[0]->m_id);
532 facesDone.insert(f[1]->m_id);
538 int t = fIt[0] == facesDone.end() ? 0 : 1;
540 ASSERTL1(fIt[o] != facesDone.end(),
"Renumbering error");
546 nodes[prismTris[o][0]]->m_id,
547 nodes[prismTris[o][1]]->m_id,
548 nodes[prismTris[o][2]]->m_id
550 int tmp2[3] = {0,1,2};
552 if (tmp1[0] > tmp1[1])
554 swap(tmp1[0], tmp1[1]);
555 swap(tmp2[0], tmp2[1]);
558 if (tmp1[1] > tmp1[2])
560 swap(tmp1[1], tmp1[2]);
561 swap(tmp2[1], tmp2[2]);
564 if (tmp1[0] > tmp1[2])
566 swap(tmp1[0], tmp1[2]);
567 swap(tmp2[0], tmp2[2]);
571 for (j = 0; j < 3; ++j)
580 facesDone.insert(f[t]->m_id);
583 for (j = 0; j < 6; ++j)
585 ASSERTL1(nodes[j]->m_id != -1,
"Renumbering error");
595 for (j = 0; j < 9; ++j)
598 for (k = 0; k < 9; ++k)
601 if (e1->m_n1 == e2->m_n1 && e1->m_n2 == e2->m_n2)
603 e2->m_edgeNodes = e1->m_edgeNodes;
605 else if (e1->m_n1 == e2->m_n1 && e1->m_n2 == e2->m_n2)
607 e2->m_edgeNodes = e1->m_edgeNodes;
608 std::reverse(e2->m_edgeNodes.begin(),
609 e2->m_edgeNodes.end());
617 for (j = 0; j < 5; ++j)
619 if (line[i]->GetFace(j)->m_faceNodes.size() > 0)
621 warnCurvature =
true;
628 m_mesh->m_element[3][line[i]->GetId()] = el;
634 cerr <<
"[ReorderPrisms] WARNING: Face curvature detected in "
635 <<
"some prisms; this will be ignored in further module "
641 for (pIt = perFaces.begin(); pIt != perFaces.end(); ++pIt)
645 vector<int> perVerts = pIt->second.second;
646 int nVerts = perVerts.size();
649 for (j = 0; j < nVerts; ++j)
654 if (n1->m_id == -1 && n2->m_id == -1)
659 else if (n1->m_id != -1 && n2->m_id != -1)
665 ASSERTL0(
false,
"Periodic face renumbering error");
672 for (it2 = tetsDone.begin(); it2 != tetsDone.end(); ++it2)
675 vector<NodeSharedPtr> nodes = el->GetVertexList();
676 vector<int> tags = el->GetTagList();
678 for (i = 0; i < 4; ++i)
680 if (nodes[i]->m_id == -1)
682 nodes[i]->m_id = nodeId++;
693 for (it =
m_mesh->m_vertexSet.begin(); it !=
m_mesh->m_vertexSet.end(); ++it)
695 if ((*it)->m_id == -1)
697 (*it)->m_id = nodeId++;
708 set<int> &prismsDone,
709 vector<ElementSharedPtr> &line)
715 if (it == prismsDone.end())
721 prismsDone.erase(it);
722 line.push_back(
m_mesh->m_element[3][prism]);
725 for (i = 1; i <= 3; i += 2)
731 it2 = perFaces.find(f->m_id);
733 if (it2 != perFaces.end())
735 int id2 = it2->second.first->m_id;
736 nextId = it2->second.first->m_elLink[0].first->GetId();
739 PrismLines(nextId, perFaces, prismsDone, line);
743 if (f->m_elLink.size() == 1)
748 nextId = f->m_elLink[0].first->GetId();
749 if (nextId ==
m_mesh->m_element[3][prism]->GetId())
751 nextId = f->m_elLink[1].first->GetId();
754 PrismLines(nextId, perFaces, prismsDone, line);
766 cerr <<
"WARNING: Unrecognised config option " << key
767 <<
", proceeding anyway." << endl;
770 it->second.beenSet =
true;
772 if (it->second.isBool)
774 it->second.value =
"1";
778 it->second.value = val;
791 cerr <<
"No configuration options for this module." << endl;
797 cerr << setw(10) << it->first <<
": " << it->second.desc
812 if (!it->second.beenSet)
814 it->second.value = it->second.defValue;
826 cerr <<
"Expansion dimension is " <<
m_mesh->m_expDim << endl;
827 cerr <<
"Space dimension is " <<
m_mesh->m_spaceDim << endl;
828 cerr <<
"Read " <<
m_mesh->m_node.size() <<
" nodes" << endl;
829 cerr <<
"Read " <<
m_mesh->GetNumElements() <<
" "
830 <<
m_mesh->m_expDim <<
"-D elements" << endl;
831 cerr <<
"Read " <<
m_mesh->GetNumBndryElements()
832 <<
" boundary elements" << endl;
LibUtilities::NekFactory< ModuleKey, Module, FieldSharedPtr > ModuleFactory
#define ASSERTL0(condition, msg)
pair< ModuleType, string > ModuleKey
tBaseSharedPtr CreateInstance(tKey idKey BOOST_PP_COMMA_IF(MAX_PARAM) BOOST_PP_ENUM_BINARY_PARAMS(MAX_PARAM, tParam, x))
Create an instance of the class referred to by idKey.
Represents an edge which joins two points.
boost::shared_ptr< Edge > EdgeSharedPtr
Shared pointer to an edge.
map< string, ConfigOption > m_config
List of configuration values.
MeshSharedPtr m_mesh
Mesh object.
boost::shared_ptr< Face > FaceSharedPtr
Shared pointer to a face.
void RegisterConfig(string key, string value)
Register a configuration option with a module.
boost::shared_ptr< Node > NodeSharedPtr
Shared pointer to a Node.
boost::shared_ptr< Composite > CompositeSharedPtr
Shared pointer to a composite.
virtual void ProcessEdges(bool ReprocessEdges=true)
Extract element edges.
boost::shared_ptr< Element > ElementSharedPtr
Shared pointer to an element.
std::ostream & operator<<(std::ostream &os, const BasisKey &rhs)
virtual void ProcessVertices()
Extract element vertices.
virtual void ProcessElements()
Generate element IDs.
OutputModule(FieldSharedPtr p_f)
map< int, pair< FaceSharedPtr, vector< int > > > PerMap
boost::shared_ptr< Mesh > MeshSharedPtr
Shared pointer to a mesh.
void PrismLines(int prism, PerMap &perFaces, set< int > &prismsDone, vector< ElementSharedPtr > &line)
Basic information about an element.
virtual void ProcessComposites()
Generate composites.
boost::shared_ptr< GeometryVector > Composite
void PrintConfig()
Print out all configuration options for a module.
Represents a command-line configuration option.
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs typedef NekMatrix< LhsDataType, StandardMatrixTag >::iterator iterator
virtual void ProcessFaces(bool ReprocessFaces=true)
Extract element faces.
void ReorderPrisms(PerMap &perFaces)
Reorder node IDs so that prisms and tetrahedra are aligned correctly.
std::ofstream m_mshFile
Output stream.
Represents a face comprised of three or more edges.
void OpenStream()
Open a file for output.
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
void SetDefaults()
Sets default configuration options for those which have not been set.
ElementFactory & GetElementFactory()
ModuleFactory & GetModuleFactory()
const char *const ModuleTypeMap[]