41 namespace NekMeshUtils
44 void CurveMesh::ReMesh()
50 for(
int i = 0; i < m_meshedges.size(); i++)
52 m_mesh->m_edgeSet.erase(m_meshedges[i]);
63 m_bounds = m_cadcurve->GetBounds();
64 m_curvelength = m_cadcurve->GetTotLength();
66 int(m_curvelength / m_mesh->m_octree->GetMinDelta()) + 10;
67 ds = m_curvelength / (m_numSamplePoints - 1);
71 for (map<unsigned, NekDouble>::iterator ie = m_endoffset.begin();
72 ie != m_endoffset.end(); ++ie)
74 totalOffset += ie->second;
76 ASSERTL0(m_curvelength > totalOffset,
77 "Boundary layers too thick for adjacent curve");
83 for (
int i = 0; i < m_numSamplePoints - 1; i++)
85 Ae += ds * (1.0 / m_dst[i][0] + 1.0 / m_dst[i + 1][0]) / 2.0;
90 if (Ne + 1 < 2 + m_endoffset.size())
92 Ne = 1 + m_endoffset.size();
94 meshsvalue.resize(Ne + 1);
96 meshsvalue[1] = m_curvelength;
98 if (m_endoffset.count(0))
100 meshsvalue[1] = m_endoffset[0];
102 if (m_endoffset.count(1))
104 meshsvalue[Ne - 1] = m_curvelength - m_endoffset[1];
107 else if(Ne + 1 == 2 && forceThree)
110 meshsvalue.resize(Ne + 1);
112 meshsvalue[1] = m_curvelength/ 2.0;
113 meshsvalue[2] = m_curvelength;
120 meshsvalue.resize(Ne + 1);
122 meshsvalue[Ne] = m_curvelength;
126 if (m_endoffset.count(0))
128 meshsvalue[1] = m_endoffset[0];
130 if (m_endoffset.count(1))
132 meshsvalue[Ne - 1] = m_curvelength - m_endoffset[1];
135 for (
int i = 1 + m_endoffset.count(0); i < Ne - m_endoffset.count(1);
138 int iterationcounter = 0;
146 NekDouble rhs = EvaluateDS(ski) / Ae * (EvaluatePS(ski) - k);
149 if (abs(lastSki - ski) < 1E-8)
154 ASSERTL0(iterationcounter < 1000000,
"iteration failed");
164 vector<CADVertSharedPtr> verts = m_cadcurve->GetVertex();
165 vector<pair<CADSurfSharedPtr, CADOrientation::Orientation> > s =
166 m_cadcurve->GetAdjSurf();
170 n->SetCADCurve(m_cadcurve, t);
172 for (
int j = 0; j < s.size(); j++)
174 if (verts[0]->IsDegen() == s[j].first->GetId())
182 n->SetCADSurf(s[j].first, uv);
184 m_meshpoints.push_back(n);
186 for (
int i = 1; i < meshsvalue.size() - 1; i++)
188 t = m_cadcurve->tAtArcLength(meshsvalue[i]);
189 loc = m_cadcurve->P(t);
191 new Node(m_mesh->m_numNodes++, loc[0], loc[1], loc[2]));
192 n2->SetCADCurve(m_cadcurve, t);
193 for (
int j = 0; j < s.size(); j++)
196 n2->SetCADSurf(s[j].first, uv);
198 m_meshpoints.push_back(n2);
201 n = verts[1]->GetNode();
203 n->SetCADCurve(m_cadcurve, t);
205 for (
int j = 0; j < s.size(); j++)
207 if (verts[1]->IsDegen() == s[j].first->GetId())
215 n->SetCADSurf(s[j].first, uv);
217 m_meshpoints.push_back(n);
219 ASSERTL0(Ne + 1 == m_meshpoints.size(),
220 "incorrect number of points in curve mesh");
223 for (
int i = 0; i < m_meshpoints.size() - 1; i++)
226 new Edge(m_meshpoints[i], m_meshpoints[i + 1]));
227 e->m_parentCAD = m_cadcurve;
228 m_mesh->m_edgeSet.insert(e);
229 m_meshedges.push_back(e);
232 if (m_mesh->m_verbose)
237 cout << scientific <<
"\r\t\tCurve " << m_id << endl
238 <<
"\t\t\tLength: " << m_curvelength << endl
239 <<
"\t\t\tNodes: " << m_meshpoints.size() << endl
240 <<
"\t\t\tSample points: " << m_numSamplePoints << endl
245 void CurveMesh::GetPhiFunction()
247 m_ps.resize(m_numSamplePoints);
248 vector<NekDouble> newPhi;
258 for (
int i = 1; i < m_numSamplePoints; i++)
260 runningInt += (1.0 / m_dst[i - 1][0] + 1.0 / m_dst[i][0]) / 2.0 * ds;
261 newPhi[0] = Ne / Ae * runningInt;
262 newPhi[1] = m_dst[i][1];
272 ASSERTL1(!(s < 0)&& !(s > m_curvelength),
"s out of bounds");
278 else if (s == m_curvelength)
280 return m_dst[m_numSamplePoints - 1][0];
283 for (
int i = 0; i < m_numSamplePoints - 1; i++)
285 if (m_dst[i][1] < s && m_dst[i + 1][1] >= s)
301 ASSERTL0(m * s + c == m * s + c,
"DS");
311 ASSERTL1(!(s < 0) && !(s > m_curvelength),
"s out of bounds");
317 else if (s == m_curvelength)
319 return m_ps[m_numSamplePoints - 1][0];
322 for (
int i = 0; i < m_numSamplePoints - 1; i++)
324 if (m_ps[i][1] < s && m_ps[i + 1][1] >= s)
335 cout << a <<
" " << b << endl;
348 ASSERTL0(m * s + c == m * s + c,
"PS");
353 void CurveMesh::GetSampleFunction()
355 m_dst.resize(m_numSamplePoints);
357 vector<NekDouble> dsti;
360 for (
int i = 0; i < m_numSamplePoints; i++)
363 NekDouble t = m_cadcurve->tAtArcLength(dsti[1]);
370 if (m_endoffset.count(0))
372 if (dsti[1] < m_endoffset[0])
374 dsti[0] = m_endoffset[0];
378 if (m_endoffset.count(1) && !found)
380 if (dsti[1] > m_curvelength - m_endoffset[1])
382 dsti[0] = m_endoffset[1];
389 dsti[0] = m_mesh->m_octree->Query(loc);
401 m_meshpoints.clear();
402 for (
int i = 0; i < m_meshedges.size(); i++)
404 m_mesh->m_edgeSet.erase(m_meshedges[i]);
410 int tid = from->GetId();
412 m_mesh->m_cad->GetPeriodicTranslationVector(tid, m_id);
416 bool reversed = c1->GetOrienationWRT(1) == m_cadcurve->GetOrienationWRT(1);
418 vector<NodeSharedPtr> nodes = from->GetMeshPoints();
420 vector<pair<CADSurfSharedPtr, CADOrientation::Orientation> > surfs =
421 m_cadcurve->GetAdjSurf();
423 for (
int i = 1; i < nodes.size() - 1; i++)
427 new Node(m_mesh->m_numNodes++, loc[0] + T[0], loc[1] + T[1], 0.0));
429 for (
int j = 0; j < surfs.size(); j++)
432 nn->SetCADSurf(surfs[j].first, uv);
436 m_cadcurve->loct(nn->GetLoc(), t);
437 nn->SetCADCurve(m_cadcurve, t);
439 m_meshpoints.push_back(nn);
445 reverse(m_meshpoints.begin(), m_meshpoints.end());
448 vector<CADVertSharedPtr> verts = m_cadcurve->GetVertex();
450 m_meshpoints.insert(m_meshpoints.begin(), verts[0]->GetNode());
451 m_meshpoints.push_back(verts[1]->GetNode());
455 for (
int i = 0; i < m_meshpoints.size() - 1; i++)
458 new Edge(m_meshpoints[i], m_meshpoints[i + 1]));
459 e->m_parentCAD = m_cadcurve;
460 m_mesh->m_edgeSet.insert(e);
461 m_meshedges.push_back(e);
#define ASSERTL0(condition, msg)
Represents an edge which joins two points.
std::shared_ptr< Edge > EdgeSharedPtr
Shared pointer to an edge.
std::shared_ptr< Node > NodeSharedPtr
std::shared_ptr< CADCurve > CADCurveSharedPtr
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs
std::shared_ptr< CurveMesh > CurveMeshSharedPtr
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...