50 void ExpandVertices(TiXmlElement* mesh, map<int,int> jointVerts, map<int,int> &fullVerts);
52 void ExpandEdges(TiXmlElement* mesh, map<int,int> &newVerts,
53 map<int,int> jointEdges, map<int,int> &newEdges);
55 void ExpandElmts(TiXmlElement* mesh, map<int,int> &newEdges,
int &nOrigElmts);
57 void ExpandComposites(TiXmlElement* mesh, map<int,int> fullEdges,
int nOrigElmts);
59 int main(
int argc,
char *argv[])
65 fprintf(stderr,
"Usage: ./ExpandMeshByRotation meshfile outfile\n");
72 = LibUtilities::SessionReader::CreateInstance(argc-1, argv);
77 string meshfile(argv[argc-2]);
80 composite = graphShPt->GetComposite(300);
81 std::map<int,int> jointEdges, jointVerts, newVerts, newEdges;
82 int compsize = composite->m_geomVec.size();
83 for(i = 0; i < compsize; ++i)
87 jointEdges[tmp1->GetGlobalID()] = tmp2->GetGlobalID();
88 jointVerts[tmp1->GetVid(0)] = tmp2->GetVid(1);
89 jointVerts[tmp1->GetVid(1)] = tmp2->GetVid(0);
94 TiXmlDocument& meshdoc = vSession->GetDocument();
96 TiXmlHandle docHandle(&meshdoc);
97 TiXmlElement* mesh = docHandle.FirstChildElement(
"NEKTAR").FirstChildElement(
"GEOMETRY").Element();
110 meshdoc.SaveFile(argv[argc-1]);
114 void ExpandVertices(TiXmlElement* mesh, map<int,int> jointVerts, map<int,int> &newVerts)
117 TiXmlElement* element = mesh->FirstChildElement(
"VERTEX");
118 ASSERTL0(element,
"Unable to find mesh VERTEX tag in file.");
120 TiXmlElement *vertex = element->FirstChildElement(
"V");
123 int nextVertexNumber = -1;
126 vector<NekDouble> xpts,ypts,zpts;
134 TiXmlAttribute *vertexAttr = vertex->FirstAttribute();
135 std::string attrName(vertexAttr->Name());
137 ASSERTL0(attrName ==
"ID", (std::string(
"Unknown attribute name: ") + attrName).c_str());
139 err = vertexAttr->QueryIntValue(&indx);
140 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read attribute ID.");
143 std::string vertexBodyStr;
145 TiXmlNode *vertexBody = vertex->FirstChild();
150 if (vertexBody->Type() == TiXmlNode::TINYXML_TEXT)
152 vertexBodyStr += vertexBody->ToText()->Value();
153 vertexBodyStr +=
" ";
156 vertexBody = vertexBody->NextSibling();
159 ASSERTL0(!vertexBodyStr.empty(),
"Vertex definitions must contain vertex data.");
162 std::istringstream vertexDataStrm(vertexBodyStr.c_str());
166 while(!vertexDataStrm.fail())
168 vertexDataStrm >> xval >> yval >> zval;
170 xpts.push_back(xval);
171 ypts.push_back(yval +yoffset);
172 zpts.push_back(zval);
176 ASSERTL0(
false,
"Unable to read VERTEX data.");
178 vertex = vertex->NextSiblingElement(
"V");
182 int npts = xpts.size();
187 for(
int i = 0; i < npts; ++i)
189 if(jointVerts.count(i) == 0)
192 xval = xmax - xpts[i];
194 s << scientific << setprecision(8)
195 << xval <<
" " << yval <<
" " << zpts[i];
196 TiXmlElement * v =
new TiXmlElement(
"V" );
197 v->SetAttribute(
"ID",cnt1);
198 v->LinkEndChild(
new TiXmlText(s.str()));
199 element->LinkEndChild(v);
200 newVerts[cnt++] = cnt1++;
204 newVerts[cnt++] = jointVerts[i];
209 void ExpandEdges(TiXmlElement* mesh, map<int,int> &newVerts, map<int,int> jointEdges, map<int,int> &newEdges)
212 TiXmlElement* field = mesh->FirstChildElement(
"EDGE");
214 ASSERTL0(field,
"Unable to find EDGE tag in file.");
219 TiXmlElement *edge = field->FirstChildElement(
"E");
229 int nextEdgeNumber = -1;
231 map<int,int> edgeVert0,edgeVert1;
236 int err = edge->QueryIntAttribute(
"ID",&indx);
237 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read edge attribute ID.");
239 TiXmlNode *child = edge->FirstChild();
241 if (child->Type() == TiXmlNode::TINYXML_TEXT)
243 edgeStr += child->ToText()->ValueStr();
247 int vertex1, vertex2;
248 std::istringstream edgeDataStrm(edgeStr.c_str());
252 while (!edgeDataStrm.fail())
254 edgeDataStrm >> vertex1 >> vertex2;
256 edgeVert0[indx] = vertex1;
257 edgeVert1[indx] = vertex2;
261 NEKERROR(ErrorUtil::efatal, (std::string(
"Unable to read edge data: ") + edgeStr).c_str());
263 edge = edge->NextSiblingElement(
"E");
266 int nedges = edgeVert0.size();
269 int norigverts = newVerts.size();
271 for(
int i = 0; i < nedges; ++i)
273 if(jointEdges.count(i) == 0)
277 s << setw(5) << newVerts[edgeVert0[i]+norigverts] <<
" " 278 << newVerts[edgeVert1[i]+norigverts] <<
" ";
279 TiXmlElement * e =
new TiXmlElement(
"E" );
280 e->SetAttribute(
"ID",cnt1);
281 e->LinkEndChild(
new TiXmlText(s.str()) );
282 field->LinkEndChild(e);
283 newEdges[cnt++] = cnt1++;
287 newEdges[cnt++] = jointEdges[i];
292 void ExpandElmts(TiXmlElement* mesh, map<int,int> &newEdges,
int &nelmts)
295 TiXmlElement* field = mesh->FirstChildElement(
"ELEMENT");
297 ASSERTL0(field,
"Unable to find ELEMENT tag in file.");
299 int nextElementNumber = -1;
304 TiXmlElement *element = field->FirstChildElement();
306 map<int,vector<int> > ElmtEdges;
310 std::string elementType(element->ValueStr());
312 ASSERTL0(elementType ==
"Q" || elementType ==
"T",
313 (std::string(
"Unknown 2D element type: ") + elementType).c_str());
320 int err = element->QueryIntAttribute(
"ID", &indx);
321 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read element attribute ID.");
324 TiXmlNode* elementChild = element->FirstChild();
325 std::string elementStr;
328 if (elementChild->Type() == TiXmlNode::TINYXML_TEXT)
330 elementStr += elementChild->ToText()->ValueStr();
332 elementChild = elementChild->NextSibling();
335 ASSERTL0(!elementStr.empty(),
"Unable to read element description body.");
338 if (elementType ==
"T")
341 int edge1, edge2, edge3;
342 std::istringstream elementDataStrm(elementStr.c_str());
346 elementDataStrm >> edge1;
347 elementDataStrm >> edge2;
348 elementDataStrm >> edge3;
350 ASSERTL0(!elementDataStrm.fail(), (std::string(
"Unable to read element data for TRIANGLE: ") + elementStr).c_str());
353 edges.push_back(edge1);
354 edges.push_back(edge2);
355 edges.push_back(edge3);
357 ElmtEdges[indx] = edges;
361 NEKERROR(ErrorUtil::efatal, (std::string(
"Unable to read element data for TRIANGLE: ") + elementStr).c_str());
364 else if (elementType ==
"Q")
367 int edge1, edge2, edge3, edge4;
368 std::istringstream elementDataStrm(elementStr.c_str());
372 elementDataStrm >> edge1;
373 elementDataStrm >> edge2;
374 elementDataStrm >> edge3;
375 elementDataStrm >> edge4;
377 ASSERTL0(!elementDataStrm.fail(), (std::string(
"Unable to read element data for QUAD: ") + elementStr).c_str());
380 edges.push_back(edge1);
381 edges.push_back(edge2);
382 edges.push_back(edge3);
383 edges.push_back(edge4);
385 ElmtEdges[indx] = edges;
390 NEKERROR(ErrorUtil::efatal,(std::string(
"Unable to read element data for QUAD: ") + elementStr).c_str());
395 element = element->NextSiblingElement();
398 nelmts = ElmtEdges.size();
399 int nedges = newEdges.size();
401 for(
int i = 0; i < ElmtEdges.size(); ++i)
405 for(
int j = 0; j < ElmtEdges[i].size() ; ++j)
407 s << setw(10) << newEdges[ElmtEdges[i][j]+nedges];
411 switch(ElmtEdges[i].size())
414 f =
new TiXmlElement(
"T");
417 f =
new TiXmlElement(
"Q");
422 f->SetAttribute(
"ID", i+nelmts);
423 f->LinkEndChild(
new TiXmlText(s.str()));
424 field->LinkEndChild(f);
436 st <<
" " << tag <<
"[" << vId;
438 for (
auto it = ids.begin()+1; it != ids.end(); ++it){
444 if (prevId > -1 && vId == prevId + 1)
448 if (*it == ids.back())
473 TiXmlElement* field = mesh->FirstChildElement(
"COMPOSITE");
474 ASSERTL0(field,
"Unable to find COMPOSITE tag in file.");
476 int nextCompositeNumber = -1;
480 TiXmlElement *composite = field->FirstChildElement(
"C");
484 nextCompositeNumber++;
487 int err = composite->QueryIntAttribute(
"ID", &indx);
488 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read attribute ID.");
490 TiXmlNode* compositeChild = composite->FirstChild();
495 while(compositeChild && compositeChild->Type() != TiXmlNode::TINYXML_TEXT)
497 compositeChild = compositeChild->NextSibling();
500 ASSERTL0(compositeChild,
"Unable to read composite definition body.");
501 std::string compositeStr = compositeChild->ToText()->ValueStr();
504 std::istringstream compositeDataStrm(compositeStr.c_str());
510 std::string compositeElementStr;
511 compositeDataStrm >> compositeElementStr;
513 std::istringstream tokenStream(compositeElementStr);
519 std::string::size_type indxBeg = compositeElementStr.find_first_of(
'[') + 1;
520 std::string::size_type indxEnd = compositeElementStr.find_last_of(
']') - 1;
522 ASSERTL0(indxBeg <= indxEnd, (std::string(
"Error reading index definition:") + compositeElementStr).c_str());
524 std::string indxStr = compositeElementStr.substr(indxBeg, indxEnd - indxBeg + 1);
525 std::vector<unsigned int> seqVector;
527 bool err = ParseUtils::GenerateSeqVector(indxStr, seqVector);
529 ASSERTL0(err, (std::string(
"Error reading composite elements: ") + indxStr).c_str());
535 int seqlen = seqVector.size();
536 int nedges = newEdges.size();
538 map<unsigned int, unsigned int> seqMap;
540 for(
int i =0; i < seqlen; ++i)
542 seqMap[seqVector[i]] = 1;
546 for(
int i =0; i < seqlen; ++i)
548 if(seqMap.count(newEdges[seqVector[i]+nedges]) == 0)
550 seqVector.push_back(newEdges[seqVector[i]+nedges]);
558 int seqlen = seqVector.size();
560 for(
int i = 0; i < seqlen; ++i)
562 seqVector.push_back(seqVector[i]+nOrigElmts);
568 NEKERROR(ErrorUtil::efatal, (std::string(
"Unrecognized composite token: ") + compositeElementStr).c_str());
574 composite->ReplaceChild(compositeChild, TiXmlText(
GetXmlString(type,seqVector)));
581 (std::string(
"Unable to read COMPOSITE data for composite: ") + compositeStr).c_str());
585 composite = composite->NextSiblingElement(
"C");
#define ASSERTL0(condition, msg)
void ExpandElmts(TiXmlElement *mesh, map< int, int > &newEdges, int &nOrigElmts)
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
T Vmax(int n, const T *x, const int incx)
Return the maximum element in x – called vmax to avoid conflict with max.
std::shared_ptr< Composite > CompositeSharedPtr
int main(int argc, char *argv[])
string GetXmlString(char tag, vector< unsigned int > &ids)
void ExpandComposites(TiXmlElement *mesh, map< int, int > fullEdges, int nOrigElmts)
void ExpandVertices(TiXmlElement *mesh, map< int, int > jointVerts, map< int, int > &fullVerts)
void ExpandEdges(TiXmlElement *mesh, map< int, int > &newVerts, map< int, int > jointEdges, map< int, int > &newEdges)
std::shared_ptr< Geometry1D > Geometry1DSharedPtr
std::shared_ptr< SessionReader > SessionReaderSharedPtr