91int main(
int argc,
char *argv[])
97 "Usage: ./MoveMeshToCriticalLayer meshfile streakfile outfile\n");
112 TiXmlDocument &meshdoc = vSession->GetDocument();
113 TiXmlHandle docHandle(&meshdoc);
114 TiXmlElement *doc = docHandle.FirstChildElement(
"NEKTAR")
115 .FirstChildElement(
"GEOMETRY")
121 vector<int> InterfaceVerts;
128 string fieldfile(argv[argc - 2]);
135 dverty(mesh->GetNvertices(), 0.0);
137 vSession->LoadParameter(
"MoveMeshMaxIterations", maxiter, 100);
145 if (vSession->DefinesSolverInfo(
"EnforceRotationalSymmetry"))
158 std::string outfile(argv[argc - 1]);
159 meshdoc.SaveFile(outfile);
164 vector<int> &InterfaceVerts)
167 composite = mesh->GetComposite(compositeID);
168 int compsize = composite->m_geomVec.size();
169 map<int, int> vertmap;
171 for (
int i = 0; i < compsize; ++i)
173 if (vertmap.count(composite->m_geomVec[i]->GetVid(0)) == 0)
175 InterfaceVerts.push_back(composite->m_geomVec[i]->GetVid(0));
176 vertmap[composite->m_geomVec[i]->GetVid(0)] = 1;
179 if (vertmap.count(composite->m_geomVec[i]->GetVid(1)) == 0)
181 InterfaceVerts.push_back(composite->m_geomVec[i]->GetVid(1));
182 vertmap[composite->m_geomVec[i]->GetVid(1)] = 1;
225 vector<int> &InterfaceVerts,
232 int nverts = mesh->GetNvertices();
248 vid1 = seg->GetVid(1);
253 kspring = 1.0 / v0->
dist(*v1);
255 Verts[vid0].kspring.push_back(kspring);
256 Verts[vid0].springVid.push_back(vid1);
257 Verts[vid1].kspring.push_back(kspring);
258 Verts[vid1].springVid.push_back(vid0);
262 for (i = 0; i < nverts; ++i)
265 for (j = 0; j < Verts[i].kspring.size(); ++j)
267 invktot += Verts[i].kspring[j];
269 invktot = 1.0 / invktot;
270 for (j = 0; j < Verts[i].kspring.size(); ++j)
272 Verts[i].kspring[j] *= invktot;
283 for (i = 0; i < InterfaceVerts.size(); ++i)
285 Verts[InterfaceVerts[i]].solve =
eNoSolve;
286 mesh->GetPointGeom(InterfaceVerts[i])->GetCoords(x, y, z);
288 for (j = 0; j < xstreak.size() - 1; ++j)
290 if ((x >= xstreak[j]) && (x <= xstreak[j + 1]))
297 "Did not find x location along critical layer");
299 k = (j == 0) ? 1 : j;
303 (x - xstreak[k]) * (x - xstreak[k + 1]) /
304 ((xstreak[k - 1] - xstreak[k]) * (xstreak[k - 1] - xstreak[k + 1]));
305 h1 = (x - xstreak[k - 1]) * (x - xstreak[k + 1]) /
306 ((xstreak[k] - xstreak[k - 1]) * (xstreak[k] - xstreak[k + 1]));
308 (x - xstreak[k - 1]) * (x - xstreak[k]) /
309 ((xstreak[k + 1] - xstreak[k - 1]) * (xstreak[k + 1] - xstreak[k]));
311 dvertx[InterfaceVerts[i]] =
312 (xstreak[k - 1] * h0 + xstreak[k] * h1 + xstreak[k + 1] * h2) - x;
313 dverty[InterfaceVerts[i]] =
314 (ystreak[k - 1] * h0 + ystreak[k] * h1 + ystreak[k + 1] * h2) - y;
320 for (i = 0; i < 4; ++i)
322 vid0 = quad->GetVid(i);
324 switch (Verts[vid0].solve)
328 mesh->GetPointGeom(vid0)->GetCoords(x, y, z);
331 mesh->GetPointGeom(InterfaceVerts[0])
332 ->GetCoords(x1, y1, z1);
333 for (j = 0; j < InterfaceVerts.size() - 1; ++j)
335 mesh->GetPointGeom(InterfaceVerts[j + 1])
336 ->GetCoords(x2, y2, z2);
337 if ((x >= x1) && (x < x2))
347 (x2 - x) / (x2 - x1) * dvertx[InterfaceVerts[j]] +
348 (x - x1) / (x2 - x1) * dvertx[InterfaceVerts[j + 1]];
350 (x2 - x) / (x2 - x1) * dverty[InterfaceVerts[j]] +
351 (x - x1) / (x2 - x1) * dverty[InterfaceVerts[j + 1]];
356 mesh->GetPointGeom(vid0)->GetCoords(x, y, z);
357 mesh->GetPointGeom(InterfaceVerts[0])
358 ->GetCoords(x1, y1, z1);
360 if (fabs(x - x1) < 1e-6)
362 dverty[vid0] = dverty[InterfaceVerts[0]];
367 dverty[InterfaceVerts[InterfaceVerts.size() - 1]];
379 bool ContinueToIterate =
true;
382 NekDouble dsum, dx, dy, sum, prev_sum = 0.0;
386 while (ContinueToIterate)
393 fac = (cnt < blend) ? 1.0 / (blend + 1.0) * (cnt + 1) : 1.0;
395 for (i = 0; i < nverts; ++i)
403 for (j = 0; j < Verts[i].kspring.size(); ++j)
405 dx += fac * Verts[i].kspring[j] *
406 dvertx[Verts[i].springVid[j]];
412 for (j = 0; j < Verts[i].kspring.size(); ++j)
414 dy += fac * Verts[i].kspring[j] *
415 dverty[Verts[i].springVid[j]];
419 dsum = (dx * dx + dy * dy);
440 cerr <<
"Iteration " << cnt <<
" : " << chg << endl;
442 if ((chg < tol) && (cnt > blend))
444 ContinueToIterate =
false;
447 else if (cnt > blend)
449 ContinueToIterate =
false;
454 ContinueToIterate =
false;
464 TiXmlElement *field = doc->FirstChildElement(
"COMPOSITE");
465 ASSERTL0(field,
"Unable to find COMPOSITE tag in file.");
469 TiXmlElement *composite = field->FirstChildElement(
"C");
474 int err = composite->QueryIntAttribute(
"ID", &indx);
475 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read attribute ID.");
477 TiXmlNode *compositeChild = composite->FirstChild();
482 while (compositeChild &&
483 compositeChild->Type() != TiXmlNode::TINYXML_TEXT)
485 compositeChild = compositeChild->NextSibling();
488 ASSERTL0(compositeChild,
"Unable to read composite definition body.");
489 std::string compositeStr = compositeChild->ToText()->ValueStr();
492 std::istringstream compositeDataStrm(compositeStr.c_str());
496 std::string compositeElementStr;
497 compositeDataStrm >> compositeElementStr;
499 std::istringstream tokenStream(compositeElementStr);
505 std::string::size_type indxBeg =
506 compositeElementStr.find_first_of(
'[') + 1;
507 std::string::size_type indxEnd =
508 compositeElementStr.find_last_of(
']') - 1;
511 (std::string(
"Error reading index definition:") +
515 std::string indxStr =
516 compositeElementStr.substr(indxBeg, indxEnd - indxBeg + 1);
517 std::vector<unsigned int> seqVector;
521 ASSERTL0(err, (std::string(
"Error reading composite elements: ") +
529 int seqlen = seqVector.size();
533 for (
int i = 0; i < seqlen; ++i)
535 auto seg = mesh->GetSegGeom(seqVector[i]);
536 seg->GetVertex(0)->GetCoords(x0, y0, z0);
537 seg->GetVertex(1)->GetCoords(x1, y1, z1);
538 vid0 = seg->GetVid(0);
539 vid1 = seg->GetVid(1);
541 if (fabs(x0 - x1) < 1e-8)
544 if (Verts[vid0].solve ==
eSolveX)
553 if (Verts[vid1].solve ==
eSolveX)
563 if (fabs(y0 - y1) < 1e-8)
566 if (Verts[vid0].solve ==
eSolveY)
575 if (Verts[vid1].solve ==
eSolveY)
595 (std::string(
"Unrecognized composite token: ") +
604 (std::string(
"Unable to read COMPOSITE data for composite: ") +
610 composite = composite->NextSiblingElement(
"C");
618 TiXmlElement *element = doc->FirstChildElement(
"VERTEX");
619 ASSERTL0(element,
"Unable to find mesh VERTEX tag in file.");
621 TiXmlElement *vertex = element->FirstChildElement(
"V");
626 vector<NekDouble> xpts, ypts, zpts;
631 TiXmlAttribute *vertexAttr = vertex->FirstAttribute();
632 std::string attrName(vertexAttr->Name());
635 (std::string(
"Unknown attribute name: ") + attrName).c_str());
637 err = vertexAttr->QueryIntValue(&indx);
638 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read attribute ID.");
641 std::string vertexBodyStr;
643 TiXmlNode *vertexBody = vertex->FirstChild();
648 if (vertexBody->Type() == TiXmlNode::TINYXML_TEXT)
650 vertexBodyStr += vertexBody->ToText()->Value();
651 vertexBodyStr +=
" ";
654 vertexBody = vertexBody->NextSibling();
658 "Vertex definitions must contain vertex data.");
661 std::istringstream vertexDataStrm(vertexBodyStr.c_str());
665 while (!vertexDataStrm.fail())
667 vertexDataStrm >> xval >> yval >> zval;
670 xval += dvertx[indx];
671 yval += dverty[indx];
674 s << scientific << setprecision(8) << xval <<
" " << yval <<
" "
677 vertex->ReplaceChild(vertex->FirstChild(), TiXmlText(s.str()));
681 ASSERTL0(
false,
"Unable to read VERTEX data.");
683 vertex = vertex->NextSiblingElement(
"V");
692 int nverts = mesh->GetNvertices();
696 for (i = 0; i < nverts; ++i)
698 mesh->GetPointGeom(i)->GetCoords(xval, yval, zval);
699 x[i] = xval + dvertx[i];
700 y[i] = yval + dverty[i];
707 for (i = 0; i < nverts; ++i)
713 for (j = 0; j < nverts; ++j)
716 (x[j] - xrot) * (x[j] - xrot) + (y[j] - yrot) * (y[j] - yrot);
726 for (i = 0; i < nverts; ++i)
728 mesh->GetPointGeom(i)->GetCoords(xval, yval, zval);
730 xrot = 0.5 * (-x[index[i]] + xmax + x[i]);
731 yrot = 0.5 * (-y[index[i]] + y[i]);
733 dvertx[i] = xrot - xval;
734 dverty[i] = yrot - yval;
void GetNewVertexLocation(TiXmlElement *doc, SpatialDomains::MeshGraphSharedPtr &mesh, vector< int > &InterfaceVerts, Array< OneD, NekDouble > &xstreak, Array< OneD, NekDouble > &ystreak, Array< OneD, NekDouble > &vertx, Array< OneD, NekDouble > &verty, int maxiter)
int GetVid(int i) const
Returns global id of vertex i of this object.
PointGeom * GetVertex(int i) const
Returns vertex i of this object.
static MeshGraphSharedPtr Read(const LibUtilities::SessionReaderSharedPtr pSession, LibUtilities::DomainRangeShPtr rng=LibUtilities::NullDomainRangeShPtr, bool fillGraph=true, SpatialDomains::MeshGraphSharedPtr partitionedGraph=nullptr)
NekDouble dist(PointGeom &a)
return distance between this and input a
void Import(const std::string &infilename, std::vector< FieldDefinitionsSharedPtr > &fielddefs, std::vector< std::vector< NekDouble > > &fielddata, FieldMetaDataMap &fieldinfomap, const Array< OneD, int > &ElementIDs)
This function allows for data to be imported from an FLD file when a session and/or communicator is n...
std::shared_ptr< Composite > CompositeSharedPtr
std::shared_ptr< MeshGraph > MeshGraphSharedPtr