51 map<int, int> &fullVerts);
53void ExpandEdges(TiXmlElement *mesh, map<int, int> &newVerts,
54 map<int, int> jointEdges, map<int, int> &newEdges);
56void ExpandElmts(TiXmlElement *mesh, map<int, int> &newEdges,
int &nOrigElmts);
61int main(
int argc,
char *argv[])
67 fprintf(stderr,
"Usage: ./ExpandMeshByRotation meshfile outfile\n");
74 LibUtilities::SessionReader::CreateInstance(argc - 1, argv);
79 string meshfile(argv[argc - 2]);
81 SpatialDomains::MeshGraph::Read(vSession);
83 composite = graphShPt->GetComposite(300);
84 std::map<int, int> jointEdges, jointVerts, newVerts, newEdges;
85 int compsize = composite->m_geomVec.size();
86 for (i = 0; i < compsize; ++i)
89 std::dynamic_pointer_cast<SpatialDomains::Geometry1D>(
90 composite->m_geomVec[i]);
92 std::dynamic_pointer_cast<SpatialDomains::Geometry1D>(
93 composite->m_geomVec[compsize - 1 - i]);
94 jointEdges[tmp1->GetGlobalID()] = tmp2->GetGlobalID();
95 jointVerts[tmp1->GetVid(0)] = tmp2->GetVid(1);
96 jointVerts[tmp1->GetVid(1)] = tmp2->GetVid(0);
100 TiXmlDocument &meshdoc = vSession->GetDocument();
102 TiXmlHandle docHandle(&meshdoc);
103 TiXmlElement *mesh = docHandle.FirstChildElement(
"NEKTAR")
104 .FirstChildElement(
"GEOMETRY")
118 meshdoc.SaveFile(argv[argc - 1]);
122 map<int, int> &newVerts)
125 TiXmlElement *element = mesh->FirstChildElement(
"VERTEX");
126 ASSERTL0(element,
"Unable to find mesh VERTEX tag in file.");
128 TiXmlElement *vertex = element->FirstChildElement(
"V");
131 int nextVertexNumber = -1;
134 vector<NekDouble> xpts, ypts, zpts;
142 TiXmlAttribute *vertexAttr = vertex->FirstAttribute();
143 std::string attrName(vertexAttr->Name());
146 (std::string(
"Unknown attribute name: ") + attrName).c_str());
148 err = vertexAttr->QueryIntValue(&indx);
149 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read attribute ID.");
152 std::string vertexBodyStr;
154 TiXmlNode *vertexBody = vertex->FirstChild();
159 if (vertexBody->Type() == TiXmlNode::TINYXML_TEXT)
161 vertexBodyStr += vertexBody->ToText()->Value();
162 vertexBodyStr +=
" ";
165 vertexBody = vertexBody->NextSibling();
169 "Vertex definitions must contain vertex data.");
172 std::istringstream vertexDataStrm(vertexBodyStr.c_str());
176 while (!vertexDataStrm.fail())
178 vertexDataStrm >> xval >> yval >> zval;
180 xpts.push_back(xval);
181 ypts.push_back(yval + yoffset);
182 zpts.push_back(zval);
186 ASSERTL0(
false,
"Unable to read VERTEX data.");
188 vertex = vertex->NextSiblingElement(
"V");
192 int npts = xpts.size();
197 for (
int i = 0; i < npts; ++i)
199 if (jointVerts.count(i) == 0)
202 xval = xmax - xpts[i];
204 s << scientific << setprecision(8) << xval <<
" " << yval <<
" "
206 TiXmlElement *v =
new TiXmlElement(
"V");
207 v->SetAttribute(
"ID", cnt1);
208 v->LinkEndChild(
new TiXmlText(s.str()));
209 element->LinkEndChild(v);
210 newVerts[cnt++] = cnt1++;
214 newVerts[cnt++] = jointVerts[i];
220 map<int, int> jointEdges, map<int, int> &newEdges)
223 TiXmlElement *field = mesh->FirstChildElement(
"EDGE");
225 ASSERTL0(field,
"Unable to find EDGE tag in file.");
230 TiXmlElement *edge = field->FirstChildElement(
"E");
240 int nextEdgeNumber = -1;
242 map<int, int> edgeVert0, edgeVert1;
247 int err = edge->QueryIntAttribute(
"ID", &indx);
248 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read edge attribute ID.");
250 TiXmlNode *child = edge->FirstChild();
252 if (child->Type() == TiXmlNode::TINYXML_TEXT)
254 edgeStr += child->ToText()->ValueStr();
258 int vertex1, vertex2;
259 std::istringstream edgeDataStrm(edgeStr.c_str());
263 while (!edgeDataStrm.fail())
265 edgeDataStrm >> vertex1 >> vertex2;
267 edgeVert0[indx] = vertex1;
268 edgeVert1[indx] = vertex2;
274 (std::string(
"Unable to read edge data: ") + edgeStr).c_str());
276 edge = edge->NextSiblingElement(
"E");
279 int nedges = edgeVert0.size();
282 int norigverts = newVerts.size();
284 for (
int i = 0; i < nedges; ++i)
286 if (jointEdges.count(i) == 0)
290 s << setw(5) << newVerts[edgeVert0[i] + norigverts] <<
" "
291 << newVerts[edgeVert1[i] + norigverts] <<
" ";
292 TiXmlElement *e =
new TiXmlElement(
"E");
293 e->SetAttribute(
"ID", cnt1);
294 e->LinkEndChild(
new TiXmlText(s.str()));
295 field->LinkEndChild(e);
296 newEdges[cnt++] = cnt1++;
300 newEdges[cnt++] = jointEdges[i];
305void ExpandElmts(TiXmlElement *mesh, map<int, int> &newEdges,
int &nelmts)
308 TiXmlElement *field = mesh->FirstChildElement(
"ELEMENT");
310 ASSERTL0(field,
"Unable to find ELEMENT tag in file.");
312 int nextElementNumber = -1;
317 TiXmlElement *element = field->FirstChildElement();
319 map<int, vector<int>> ElmtEdges;
323 std::string elementType(element->ValueStr());
326 elementType ==
"Q" || elementType ==
"T",
327 (std::string(
"Unknown 2D element type: ") + elementType).c_str());
334 int err = element->QueryIntAttribute(
"ID", &indx);
335 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read element attribute ID.");
338 TiXmlNode *elementChild = element->FirstChild();
339 std::string elementStr;
342 if (elementChild->Type() == TiXmlNode::TINYXML_TEXT)
344 elementStr += elementChild->ToText()->ValueStr();
346 elementChild = elementChild->NextSibling();
350 "Unable to read element description body.");
353 if (elementType ==
"T")
356 int edge1, edge2, edge3;
357 std::istringstream elementDataStrm(elementStr.c_str());
361 elementDataStrm >> edge1;
362 elementDataStrm >> edge2;
363 elementDataStrm >> edge3;
366 !elementDataStrm.fail(),
367 (std::string(
"Unable to read element data for TRIANGLE: ") +
372 edges.push_back(edge1);
373 edges.push_back(edge2);
374 edges.push_back(edge3);
376 ElmtEdges[indx] = edges;
382 (std::string(
"Unable to read element data for TRIANGLE: ") +
387 else if (elementType ==
"Q")
390 int edge1, edge2, edge3, edge4;
391 std::istringstream elementDataStrm(elementStr.c_str());
395 elementDataStrm >> edge1;
396 elementDataStrm >> edge2;
397 elementDataStrm >> edge3;
398 elementDataStrm >> edge4;
401 !elementDataStrm.fail(),
402 (std::string(
"Unable to read element data for QUAD: ") +
407 edges.push_back(edge1);
408 edges.push_back(edge2);
409 edges.push_back(edge3);
410 edges.push_back(edge4);
412 ElmtEdges[indx] = edges;
418 (std::string(
"Unable to read element data for QUAD: ") +
425 element = element->NextSiblingElement();
428 nelmts = ElmtEdges.size();
429 int nedges = newEdges.size();
431 for (
int i = 0; i < ElmtEdges.size(); ++i)
435 for (
int j = 0; j < ElmtEdges[i].size(); ++j)
437 s << setw(10) << newEdges[ElmtEdges[i][j] + nedges];
441 switch (ElmtEdges[i].size())
444 f =
new TiXmlElement(
"T");
447 f =
new TiXmlElement(
"Q");
452 f->SetAttribute(
"ID", i + nelmts);
453 f->LinkEndChild(
new TiXmlText(s.str()));
454 field->LinkEndChild(f);
466 st <<
" " << tag <<
"[" << vId;
468 for (
auto it = ids.begin() + 1; it != ids.end(); ++it)
475 if (prevId > -1 && vId == prevId + 1)
479 if (*it == ids.back())
504 TiXmlElement *field = mesh->FirstChildElement(
"COMPOSITE");
505 ASSERTL0(field,
"Unable to find COMPOSITE tag in file.");
507 int nextCompositeNumber = -1;
511 TiXmlElement *composite = field->FirstChildElement(
"C");
515 nextCompositeNumber++;
518 int err = composite->QueryIntAttribute(
"ID", &indx);
519 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read attribute ID.");
521 TiXmlNode *compositeChild = composite->FirstChild();
526 while (compositeChild &&
527 compositeChild->Type() != TiXmlNode::TINYXML_TEXT)
529 compositeChild = compositeChild->NextSibling();
532 ASSERTL0(compositeChild,
"Unable to read composite definition body.");
533 std::string compositeStr = compositeChild->ToText()->ValueStr();
536 std::istringstream compositeDataStrm(compositeStr.c_str());
541 std::string compositeElementStr;
542 compositeDataStrm >> compositeElementStr;
544 std::istringstream tokenStream(compositeElementStr);
550 std::string::size_type indxBeg =
551 compositeElementStr.find_first_of(
'[') + 1;
552 std::string::size_type indxEnd =
553 compositeElementStr.find_last_of(
']') - 1;
556 (std::string(
"Error reading index definition:") +
560 std::string indxStr =
561 compositeElementStr.substr(indxBeg, indxEnd - indxBeg + 1);
562 std::vector<unsigned int> seqVector;
564 bool err = ParseUtils::GenerateSeqVector(indxStr, seqVector);
566 ASSERTL0(err, (std::string(
"Error reading composite elements: ") +
574 int seqlen = seqVector.size();
575 int nedges = newEdges.size();
577 map<unsigned int, unsigned int> seqMap;
579 for (
int i = 0; i < seqlen;
582 seqMap[seqVector[i]] = 1;
586 for (
int i = 0; i < seqlen; ++i)
588 if (seqMap.count(newEdges[seqVector[i] + nedges]) == 0)
591 newEdges[seqVector[i] + nedges]);
600 int seqlen = seqVector.size();
602 for (
int i = 0; i < seqlen; ++i)
604 seqVector.push_back(seqVector[i] + nOrigElmts);
611 (std::string(
"Unrecognized composite token: ") +
618 composite->ReplaceChild(compositeChild,
625 (std::string(
"Unable to read COMPOSITE data for composite: ") +
631 composite = composite->NextSiblingElement(
"C");
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
void ExpandVertices(TiXmlElement *mesh, map< int, int > jointVerts, map< int, int > &fullVerts)
int main(int argc, char *argv[])
void ExpandComposites(TiXmlElement *mesh, map< int, int > fullEdges, int nOrigElmts)
void ExpandElmts(TiXmlElement *mesh, map< int, int > &newEdges, int &nOrigElmts)
void ExpandEdges(TiXmlElement *mesh, map< int, int > &newVerts, map< int, int > jointEdges, map< int, int > &newEdges)
string GetXmlString(char tag, vector< unsigned int > &ids)
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Composite > CompositeSharedPtr
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::shared_ptr< Geometry1D > Geometry1DSharedPtr
The above copyright notice and this permission notice shall be included.
T Vmax(int n, const T *x, const int incx)
Return the maximum element in x – called vmax to avoid conflict with max.