67 vector<int> &InterfaceVerts);
75 vector<int> &InterfaceVerts,
93 int main(
int argc,
char *argv[])
97 fprintf(stderr,
"Usage: ./MoveMeshToCriticalLayer meshfile streakfile outfile\n");
105 = LibUtilities::SessionReader::CreateInstance(2, argv);
107 SpatialDomains::MeshGraph::Read(vSession);
112 TiXmlDocument& meshdoc = vSession->GetDocument();
113 TiXmlHandle docHandle(&meshdoc);
114 TiXmlElement* doc = docHandle.FirstChildElement(
"NEKTAR").FirstChildElement(
"GEOMETRY").Element();
119 vector<int> InterfaceVerts;
126 string fieldfile(argv[argc-2]);
134 vSession->LoadParameter(
"MoveMeshMaxIterations",maxiter,100);
141 if(vSession->DefinesSolverInfo(
"EnforceRotationalSymmetry"))
154 std::string outfile(argv[argc-1]);
155 meshdoc.SaveFile(outfile);
162 composite = mesh->GetComposite(compositeID);
163 int compsize = composite->m_geomVec.size();
164 map<int,int> vertmap;
166 for(
int i = 0; i < compsize; ++i)
168 if(vertmap.count(composite->m_geomVec[i]->GetVid(0)) == 0)
170 InterfaceVerts.push_back(composite->m_geomVec[i]->GetVid(0));
171 vertmap[composite->m_geomVec[i]->GetVid(0)] = 1;
174 if(vertmap.count(composite->m_geomVec[i]->GetVid(1)) == 0)
176 InterfaceVerts.push_back(composite->m_geomVec[i]->GetVid(1));
177 vertmap[composite->m_geomVec[i]->GetVid(1)] = 1;
196 vector<LibUtilities::FieldDefinitionsSharedPtr> fielddef;
197 vector<vector<NekDouble> > fielddata;
203 string streak_field(
"w");
204 for(
unsigned int i = 0; i < fielddata.size(); ++i)
206 streak->ExtractDataToCoeffs(fielddef [i],
209 streak->UpdateCoeffs());
215 cerr <<
"Extracting Critical Layer ";
222 vector<int> &InterfaceVerts,
230 int nverts = mesh->GetNvertices();
245 for(
auto &segIter : meshedges)
247 vid0 = (segIter.second)->GetVid(0);
248 vid1 = (segIter.second)->GetVid(1);
250 v0 = (segIter.second)->GetVertex(0);
251 v1 = (segIter.second)->GetVertex(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);
263 for(i = 0; i < nverts; ++i)
266 for(j = 0; j < Verts[i].kspring.size(); ++j)
268 invktot += Verts[i].kspring[j];
270 invktot = 1.0/invktot;
271 for(j = 0; j < Verts[i].kspring.size(); ++j)
273 Verts[i].kspring[j] *= invktot;
285 for(i = 0; i < InterfaceVerts.size(); ++i)
287 Verts[InterfaceVerts[i]].solve =
eNoSolve;
288 mesh->GetVertex(InterfaceVerts[i])->GetCoords(x,y,z);
290 for(j = 0; j < xstreak.size()-1; ++j)
292 if((x >= xstreak[j])&&(x <= xstreak[j+1]))
298 ASSERTL0(j != xstreak.size(),
"Did not find x location along critical layer");
303 h0 = (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]));
307 h2 = (x-xstreak[k-1])*(x-xstreak[k])/
308 ((xstreak[k+1]-xstreak[k-1])*(xstreak[k+1]-xstreak[k]));
310 dvertx[InterfaceVerts[i]] = (xstreak[k-1]*h0 + xstreak[k]*h1 + xstreak[k+1]*h2) - x;
311 dverty[InterfaceVerts[i]] = (ystreak[k-1]*h0 + ystreak[k]*h1 + ystreak[k+1]*h2) - y;
316 for(
auto &quadIter : quadgeom)
318 for(i = 0; i < 4; ++i)
320 vid0 = (quadIter.second)->GetVid(i);
322 switch(Verts[vid0].solve)
326 mesh->GetVertex(vid0)->GetCoords(x,y,z);
329 mesh->GetVertex(InterfaceVerts[0])->GetCoords(x1,y1,z1);
330 for(j = 0; j < InterfaceVerts.size()-1; ++j)
332 mesh->GetVertex(InterfaceVerts[j+1])->GetCoords(x2,y2,z2);
333 if((x >= x1)&&(x < x2))
342 dvertx[vid0] = (x2-x)/(x2-x1)*dvertx[InterfaceVerts[j]]+
343 (x-x1)/(x2-x1)*dvertx[InterfaceVerts[j+1]];
344 dverty[vid0] = (x2-x)/(x2-x1)*dverty[InterfaceVerts[j]]+
345 (x-x1)/(x2-x1)*dverty[InterfaceVerts[j+1]];
350 mesh->GetVertex(vid0)->GetCoords(x,y,z);
351 mesh->GetVertex(InterfaceVerts[0])->GetCoords(x1,y1,z1);
353 if(fabs(x-x1) < 1e-6)
355 dverty[vid0] = dverty[InterfaceVerts[0]];
359 dverty[vid0] = dverty[InterfaceVerts[InterfaceVerts.size()-1]];
375 bool ContinueToIterate =
true;
382 while (ContinueToIterate)
389 fac = (cnt < blend)? 1.0/(blend+1.0)*(cnt+1): 1.0;
391 for(i = 0; i < nverts; ++i)
399 for(j = 0; j < Verts[i].kspring.size(); ++j)
401 dx += fac*Verts[i].kspring[j]*dvertx[Verts[i].springVid[j]];
407 for(j = 0; j < Verts[i].kspring.size(); ++j)
409 dy += fac*Verts[i].kspring[j]*dverty[Verts[i].springVid[j]];
413 dsum = (dx*dx + dy*dy);
434 cerr <<
"Iteration " << cnt <<
" : " << chg << endl;
436 if((chg < tol)&&(cnt > blend))
438 ContinueToIterate =
false;
444 ContinueToIterate =
false;
450 ContinueToIterate =
false;
461 TiXmlElement* field = doc->FirstChildElement(
"COMPOSITE");
462 ASSERTL0(field,
"Unable to find COMPOSITE tag in file.");
464 int nextCompositeNumber = -1;
468 TiXmlElement *composite = field->FirstChildElement(
"C");
472 nextCompositeNumber++;
475 int err = composite->QueryIntAttribute(
"ID", &indx);
476 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read attribute ID.");
478 TiXmlNode* compositeChild = composite->FirstChild();
483 while(compositeChild && 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 = compositeElementStr.find_first_of(
'[') + 1;
506 std::string::size_type indxEnd = compositeElementStr.find_last_of(
']') - 1;
508 ASSERTL0(indxBeg <= indxEnd, (std::string(
"Error reading index definition:") + compositeElementStr).c_str());
510 std::string indxStr = compositeElementStr.substr(indxBeg, indxEnd - indxBeg + 1);
511 std::vector<unsigned int> seqVector;
513 bool err = ParseUtils::GenerateSeqVector(indxStr, seqVector);
515 ASSERTL0(err, (std::string(
"Error reading composite elements: ") + indxStr).c_str());
521 int seqlen = seqVector.size();
525 for(
int i = 0; i < seqlen; ++i)
527 meshedges[seqVector[i]]->GetVertex(0)->GetCoords(x0,y0,z0);
528 meshedges[seqVector[i]]->GetVertex(1)->GetCoords(x1,y1,z1);
529 vid0 = meshedges[seqVector[i]]->GetVid(0);
530 vid1 = meshedges[seqVector[i]]->GetVid(1);
532 if(fabs(x0-x1) < 1e-8)
535 if(Verts[vid0].solve ==
eSolveX)
544 if(Verts[vid1].solve ==
eSolveX)
554 if(fabs(y0-y1) < 1e-8)
557 if(Verts[vid0].solve ==
eSolveY)
566 if(Verts[vid1].solve ==
eSolveY)
585 NEKERROR(ErrorUtil::efatal, (std::string(
"Unrecognized composite token: ") + compositeElementStr).c_str());
592 (std::string(
"Unable to read COMPOSITE data for composite: ") + compositeStr).c_str());
596 composite = composite->NextSiblingElement(
"C");
606 TiXmlElement* element = doc->FirstChildElement(
"VERTEX");
607 ASSERTL0(element,
"Unable to find mesh VERTEX tag in file.");
609 TiXmlElement *vertex = element->FirstChildElement(
"V");
612 int nextVertexNumber = -1;
615 vector<NekDouble> xpts,ypts,zpts;
622 TiXmlAttribute *vertexAttr = vertex->FirstAttribute();
623 std::string attrName(vertexAttr->Name());
625 ASSERTL0(attrName ==
"ID", (std::string(
"Unknown attribute name: ") + attrName).c_str());
627 err = vertexAttr->QueryIntValue(&indx);
628 ASSERTL0(err == TIXML_SUCCESS,
"Unable to read attribute ID.");
631 std::string vertexBodyStr;
633 TiXmlNode *vertexBody = vertex->FirstChild();
638 if (vertexBody->Type() == TiXmlNode::TINYXML_TEXT)
640 vertexBodyStr += vertexBody->ToText()->Value();
641 vertexBodyStr +=
" ";
644 vertexBody = vertexBody->NextSibling();
647 ASSERTL0(!vertexBodyStr.empty(),
"Vertex definitions must contain vertex data.");
650 std::istringstream vertexDataStrm(vertexBodyStr.c_str());
654 while(!vertexDataStrm.fail())
656 vertexDataStrm >> xval >> yval >> zval;
659 xval += dvertx[indx];
660 yval += dverty[indx];
663 s << scientific << setprecision(8)
664 << xval <<
" " << yval <<
" " << zval;
666 vertex->ReplaceChild(vertex->FirstChild(), TiXmlText(s.str()));
670 ASSERTL0(
false,
"Unable to read VERTEX data.");
672 vertex = vertex->NextSiblingElement(
"V");
682 int nverts = mesh->GetNvertices();
686 for(i = 0; i < nverts; ++i)
688 mesh->GetVertex(i)->GetCoords(xval,yval,zval);
689 x[i] = xval + dvertx[i];
690 y[i] = yval + dverty[i];
697 for(i = 0; i < nverts; ++i)
703 for(j = 0; j < nverts; ++j)
705 dist2 = (x[j]-xrot)*(x[j]-xrot) + (y[j]-yrot)*(y[j]-yrot);
715 for(i = 0; i < nverts; ++i)
717 mesh->GetVertex(i)->GetCoords(xval,yval,zval);
719 xrot = 0.5*(-x[index[i]] + xmax + x[i]);
720 yrot = 0.5*(-y[index[i]] + y[i]);
722 dvertx[i] = xrot - xval;
723 dverty[i] = yrot - yval;
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
int main(int argc, char *argv[])
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)
void TurnOffEdges(TiXmlElement *doc, SpatialDomains::SegGeomMap &meshedges, Array< OneD, MoveVerts > &verts)
void EnforceRotationalSymmetry(SpatialDomains::MeshGraphSharedPtr &mesh, Array< OneD, NekDouble > &dvertx, Array< OneD, NekDouble > &dverty)
void RedefineVertices(TiXmlElement *doc, Array< OneD, NekDouble > &dvertx, Array< OneD, NekDouble > &dverty)
void GetInterfaceVerts(const int compositeID, SpatialDomains::MeshGraphSharedPtr &mesh, vector< int > &InterfaceVerts)
void GetStreakLocation(LibUtilities::SessionReaderSharedPtr &vSession, SpatialDomains::MeshGraphSharedPtr &mesh, string &fieldfile, Array< OneD, NekDouble > &xc, Array< OneD, NekDouble > &yc)
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
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< SessionReader > SessionReaderSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::map< int, QuadGeomSharedPtr > QuadGeomMap
std::map< int, SegGeomSharedPtr > SegGeomMap
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::shared_ptr< PointGeom > PointGeomSharedPtr
std::shared_ptr< Composite > CompositeSharedPtr
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.
scalarT< T > sqrt(scalarT< T > in)
vector< NekDouble > kspring