35 #include <boost/geometry.hpp> 36 #include <boost/geometry/geometries/box.hpp> 37 #include <boost/geometry/geometries/point.hpp> 38 #include <boost/geometry/index/rtree.hpp> 50 namespace bg = boost::geometry;
51 namespace bgi = boost::geometry::index;
53 typedef bg::model::point<double, 3, bg::cs::cartesian>
point;
54 typedef bg::model::box<point>
box;
55 typedef std::pair<box, unsigned int>
boxI;
60 namespace NekMeshUtils
65 NekDouble xmin = numeric_limits<double>::max(),
66 xmax = -1.0 * numeric_limits<double>::max(),
67 ymin = numeric_limits<double>::max(),
68 ymax = -1.0 * numeric_limits<double>::max(),
69 zmin = numeric_limits<double>::max(),
70 zmax = -1.0 * numeric_limits<double>::max();
72 vector<NodeSharedPtr> ns = el->GetVertexList();
73 for (
int i = 0; i < ns.size(); i++)
75 xmin = min(xmin, ns[i]->m_x);
76 xmax = max(xmax, ns[i]->m_x);
77 ymin = min(ymin, ns[i]->m_y);
78 ymax = max(ymax, ns[i]->m_y);
79 zmin = min(zmin, ns[i]->m_z);
80 zmax = max(zmax, ns[i]->m_z);
83 return box(
point(xmin - ov, ymin - ov, zmin - ov),
84 point(xmax + ov, ymax + ov, zmax + ov));
89 NekDouble xmin = numeric_limits<double>::max(),
90 xmax = -1.0 * numeric_limits<double>::max(),
91 ymin = numeric_limits<double>::max(),
92 ymax = -1.0 * numeric_limits<double>::max(),
93 zmin = numeric_limits<double>::max(),
94 zmax = -1.0 * numeric_limits<double>::max();
96 for (
int j = 0; j < els.size(); j++)
98 vector<NodeSharedPtr> ns = els[j]->GetVertexList();
99 for (
int i = 0; i < ns.size(); i++)
101 xmin = min(xmin, ns[i]->m_x);
102 xmax = max(xmax, ns[i]->m_x);
103 ymin = min(ymin, ns[i]->m_y);
104 ymax = max(ymax, ns[i]->m_y);
105 zmin = min(zmin, ns[i]->m_z);
106 zmax = max(zmax, ns[i]->m_z);
110 return box(
point(xmin - ov, ymin - ov, zmin - ov),
111 point(xmax + ov, ymax + ov, zmax + ov));
116 return box(
point(n->m_x - ov, n->m_y - ov, n->m_z - ov),
117 point(n->m_x + ov, n->m_y + ov, n->m_z + ov));
130 map<NodeSharedPtr, blInfoSharedPtr>::iterator bit;
131 for (bit = m_blData.begin(); bit != m_blData.end(); bit++)
133 vector<blInfoSharedPtr> infos = m_nToNInfo[bit->first];
134 for (
int i = 0; i < infos.size(); i++)
136 if (bit->second->bl > infos[i]->bl + 1)
138 cout <<
"non smooth error " << bit->second->bl <<
" " 139 << infos[i]->bl << endl;
144 for (
int i = 0; i < m_mesh->m_element[3].size(); i++)
147 if (!IsPrismValid(el))
149 cout <<
"validity error " << el->GetId() << endl;
158 map<NodeSharedPtr, NodeSharedPtr> BLMesh::GetSymNodes()
160 map<NodeSharedPtr, NodeSharedPtr> ret;
162 map<NodeSharedPtr, blInfoSharedPtr>::iterator bit;
163 for (bit = m_blData.begin(); bit != m_blData.end(); bit++)
165 if (!bit->second->onSym)
172 bit->second->pNode->SetCADSurf(s, uv);
173 ret[bit->first] = bit->second->pNode;
180 vector<NodeSharedPtr> ns1 = el->GetVertexList();
184 V[0] = n->m_x - ns1[0]->m_x;
185 V[1] = n->m_y - ns1[0]->m_y;
186 V[2] = n->m_z - ns1[0]->m_z;
188 NekDouble Vmag = sqrt(V[0] * V[0] + V[1] * V[1] + V[2] * V[2]);
190 NekDouble ang = (N1[0] * V[0] + N1[1] * V[1] + N1[2] * V[2]) / Vmag;
195 void BLMesh::GrowLayers()
197 map<NodeSharedPtr, blInfoSharedPtr>::iterator bit;
210 map<int, vector<ElementSharedPtr>> psElements;
211 for (
int i = 0; i < m_mesh->m_element[2].size(); i++)
214 vector<unsigned int>::iterator f =
215 find(m_blsurfs.begin(), m_blsurfs.end(), el->m_parentCAD->GetId());
217 vector<unsigned int>::iterator s =
find(
218 m_symSurfs.begin(), m_symSurfs.end(), el->m_parentCAD->GetId());
220 if (f == m_blsurfs.end() && s == m_symSurfs.end())
222 psElements[el->m_parentCAD->GetId()].push_back(el);
225 for (
int i = 0; i < m_psuedoSurface.size(); i++)
227 psElements[m_psuedoSurface[i]->m_parentCAD->GetId()].push_back(
231 bgi::rtree<boxI, bgi::quadratic<16>> TopTree;
232 map<int, bgi::rtree<boxI, bgi::quadratic<16>>> SubTrees;
238 for (
int l = 1; l < m_layer; l++)
240 NekDouble delta = (m_layerT[l] - m_layerT[l - 1]);
243 map<int, vector<ElementSharedPtr>>::iterator it;
244 for (it = psElements.begin(); it != psElements.end(); it++)
246 TopTree.insert(make_pair(
GetBox(it->second, m_bl), it->first));
247 vector<boxI> toInsert;
248 for (
int i = 0; i < it->second.size(); i++)
250 toInsert.push_back(make_pair(
GetBox(it->second[i], m_bl), i));
252 SubTrees[it->first].insert(toInsert.begin(), toInsert.end());
255 for (bit = m_blData.begin(); bit != m_blData.end(); bit++)
257 if (bit->second->stopped)
262 vector<boxI> results;
263 TopTree.query(bgi::intersects(
point(bit->second->pNode->m_x,
264 bit->second->pNode->m_y,
265 bit->second->pNode->m_z)),
266 back_inserter(results));
268 for (
int i = 0; i < results.size(); i++)
270 set<int>::iterator f =
271 bit->second->surfs.find(results[i].second);
272 if (f == bit->second->surfs.end())
275 surfs.insert(results[i].second);
279 set<int>::iterator iit;
281 for (iit = surfs.begin(); iit != surfs.end(); iit++)
284 SubTrees[*iit].query(
285 bgi::intersects(
GetBox(bit->second->pNode, m_bl)),
286 back_inserter(results));
287 for (
int i = 0; i < results.size(); i++)
289 if (
Infont(bit->second->pNode,
290 psElements[*iit][results[i].second]))
293 Proximity(bit->second->pNode,
294 psElements[*iit][results[i].second]);
295 if (prox < delta * 2.5)
299 bit->second->stopped =
true;
319 for (bit = m_blData.begin(); bit != m_blData.end(); bit++)
321 if (bit->second->stopped)
327 bool shouldStop =
false;
328 vector<blInfoSharedPtr> ne = m_nToNInfo[bit->first];
329 for (
int i = 0; i < ne.size(); i++)
331 if (ne[i]->bl < bit->second->bl)
339 bit->second->stopped =
true;
343 bit->second->AlignNode(m_layerT[l]);
352 return (a * b > 0.0);
357 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
362 vector<NodeSharedPtr> ns = el->GetVertexList();
365 E0[0] = ns[1]->m_x - ns[0]->m_x;
366 E0[1] = ns[1]->m_y - ns[0]->m_y;
367 E0[2] = ns[1]->m_z - ns[0]->m_z;
369 E1[0] = ns[2]->m_x - ns[0]->m_x;
370 E1[1] = ns[2]->m_y - ns[0]->m_y;
371 E1[2] = ns[2]->m_z - ns[0]->m_z;
385 NekDouble s = b * e - c * d, t = b * d - a * e;
399 t = (e >= 0 ? 0 : (-e >= c ? 1 : -e / c));
405 s = (d >= 0 ? 0 : (-d >= a ? 1 : -d / a));
436 s = (numer >= denom ? 1 : numer / denom);
443 new Node(0, B[0] + s * E0[0] + t * E1[0], B[1] + s * E0[1] + t * E1[1],
444 B[2] + s * E0[2] + t * E1[2]));
446 return n->Distance(point);
451 vector<NodeSharedPtr> ns1 = e1->GetVertexList();
452 vector<NodeSharedPtr> ns2 = e2->GetVertexList();
453 if (ns1[0] == ns2[0] || ns1[0] == ns2[1] || ns1[0] == ns2[2] ||
454 ns1[1] == ns2[0] || ns1[1] == ns2[1] || ns1[1] == ns2[2] ||
455 ns1[2] == ns2[0] || ns1[2] == ns2[1] || ns1[2] == ns2[2])
463 N1[0] = (ns1[1]->m_y - ns1[0]->m_y) * (ns1[2]->m_z - ns1[0]->m_z) -
464 (ns1[2]->m_y - ns1[0]->m_y) * (ns1[1]->m_z - ns1[0]->m_z);
465 N1[1] = -1.0 * ((ns1[1]->m_x - ns1[0]->m_x) * (ns1[2]->m_z - ns1[0]->m_z) -
466 (ns1[2]->m_x - ns1[0]->m_x) * (ns1[1]->m_z - ns1[0]->m_z));
467 N1[2] = (ns1[1]->m_x - ns1[0]->m_x) * (ns1[2]->m_y - ns1[0]->m_y) -
468 (ns1[2]->m_x - ns1[0]->m_x) * (ns1[1]->m_y - ns1[0]->m_y);
470 N2[0] = (ns2[1]->m_y - ns2[0]->m_y) * (ns2[2]->m_z - ns2[0]->m_z) -
471 (ns2[2]->m_y - ns2[0]->m_y) * (ns2[1]->m_z - ns2[0]->m_z);
472 N2[1] = -1.0 * ((ns2[1]->m_x - ns2[0]->m_x) * (ns2[2]->m_z - ns2[0]->m_z) -
473 (ns2[2]->m_x - ns2[0]->m_x) * (ns2[1]->m_z - ns2[0]->m_z));
474 N2[2] = (ns2[1]->m_x - ns2[0]->m_x) * (ns2[2]->m_y - ns2[0]->m_y) -
475 (ns2[2]->m_x - ns2[0]->m_x) * (ns2[1]->m_y - ns2[0]->m_y);
478 (N1[0] * ns1[0]->m_x + N1[1] * ns1[0]->m_y + N1[2] * ns1[0]->m_z);
480 (N2[0] * ns2[0]->m_x + N2[1] * ns2[0]->m_y + N2[2] * ns2[0]->m_z);
485 N2[0] * ns1[0]->m_x + N2[1] * ns1[0]->m_y + N2[2] * ns1[0]->m_z + d2;
487 N2[0] * ns1[1]->m_x + N2[1] * ns1[1]->m_y + N2[2] * ns1[1]->m_z + d2;
489 N2[0] * ns1[2]->m_x + N2[1] * ns1[2]->m_y + N2[2] * ns1[2]->m_z + d2;
492 N1[0] * ns2[0]->m_x + N1[1] * ns2[0]->m_y + N1[2] * ns2[0]->m_z + d1;
494 N1[0] * ns2[1]->m_x + N1[1] * ns2[1]->m_y + N1[2] * ns2[1]->m_z + d1;
496 N1[0] * ns2[2]->m_x + N1[1] * ns2[2]->m_y + N1[2] * ns2[2]->m_z + d1;
498 if (
sign(dv1[0], dv1[1]) &&
sign(dv1[1], dv1[2]))
502 if (
sign(dv2[0], dv2[1]) &&
sign(dv2[1], dv2[2]))
508 D[0] = N1[1] * N2[2] - N1[2] * N2[1];
509 D[1] = -1.0 * (N1[0] * N2[2] - N1[2] * N2[0]);
510 D[2] = N1[0] * N2[1] - N1[0] * N2[1];
512 int base1 = 0, base2 = 0;
513 if (!
sign(dv2[0], dv2[1]) &&
sign(dv2[1], dv2[2]))
517 else if (!
sign(dv2[1], dv2[2]) &&
sign(dv2[2], dv2[0]))
521 else if (!
sign(dv2[2], dv2[0]) &&
sign(dv2[0], dv2[1]))
527 cout <<
"base not set" << endl;
530 if (!
sign(dv1[0], dv1[1]) &&
sign(dv1[1], dv1[2]))
534 else if (!
sign(dv1[1], dv1[2]) &&
sign(dv1[2], dv1[0]))
538 else if (!
sign(dv1[2], dv1[0]) &&
sign(dv1[0], dv1[1]))
544 cout <<
"base not set" << endl;
549 p1[0] = D[0] * ns1[0]->m_x + D[1] * ns1[0]->m_y + D[2] * ns1[0]->m_z;
550 p1[1] = D[0] * ns1[1]->m_x + D[1] * ns1[1]->m_y + D[2] * ns1[1]->m_z;
551 p1[2] = D[0] * ns1[2]->m_x + D[1] * ns1[2]->m_y + D[2] * ns1[2]->m_z;
553 p2[0] = D[0] * ns2[0]->m_x + D[1] * ns2[0]->m_y + D[2] * ns2[0]->m_z;
554 p2[1] = D[0] * ns2[1]->m_x + D[1] * ns2[1]->m_y + D[2] * ns2[1]->m_z;
555 p2[2] = D[0] * ns2[2]->m_x + D[1] * ns2[2]->m_y + D[2] * ns2[2]->m_z;
575 t11 = p1[o1] + (p1[base1] - p1[o1]) * dv1[o1] / (dv1[o1] - dv1[base1]);
576 t12 = p1[o2] + (p1[base1] - p1[o2]) * dv1[o2] / (dv1[o2] - dv1[base1]);
594 t21 = p2[o1] + (p2[base2] - p2[o1]) * dv2[o1] / (dv2[o1] - dv2[base2]);
595 t22 = p2[o2] + (p2[base2] - p2[o2]) * dv2[o2] / (dv2[o2] - dv2[base2]);
612 if (!
sign(t21 - t11, t22 - t11) || !
sign(t21 - t12, t22 - t12))
620 void BLMesh::Shrink()
622 map<NodeSharedPtr, blInfoSharedPtr>::iterator bit;
628 vector<ElementSharedPtr> inv;
629 for (
int i = 0; i < m_mesh->m_element[3].size(); i++)
632 if (!IsPrismValid(el))
638 smsh = (inv.size() > 0);
640 for (
int i = 0; i < inv.size(); i++)
643 vector<blInfoSharedPtr> bls;
644 vector<NodeSharedPtr> ns = t->GetVertexList();
645 for (
int j = 0; j < ns.size(); j++)
647 bls.push_back(m_blData[ns[j]]);
654 for (
int j = 0; j < 3; j++)
656 mx = max(mx, bls[j]->bl);
658 ASSERTL0(mx > 0,
"shrinking to nothing");
659 for (
int j = 0; j < 3; j++)
666 bls[j]->AlignNode(m_layerT[bls[j]->bl]);
668 if (!IsPrismValid(inv[i]))
679 for (bit = m_blData.begin(); bit != m_blData.end(); bit++)
681 vector<blInfoSharedPtr> infos = m_nToNInfo[bit->first];
682 for (
int i = 0; i < infos.size(); i++)
684 if (bit->second->bl > infos[i]->bl + 1)
687 bit->second->AlignNode(m_layerT[bit->second->bl]);
698 NekDouble mn = numeric_limits<double>::max();
699 NekDouble mx = -1.0 * numeric_limits<double>::max();
700 vector<NodeSharedPtr> ns = el->GetVertexList();
702 for (
int j = 0; j < ns.size(); j++)
721 for (
int j = 0; j < 6; j++)
735 dxdz(0, 0) * (dxdz(1, 1) * dxdz(2, 2) - dxdz(2, 1) * dxdz(1, 2)) -
736 dxdz(0, 1) * (dxdz(1, 0) * dxdz(2, 2) - dxdz(2, 0) * dxdz(1, 2)) +
737 dxdz(0, 2) * (dxdz(1, 0) * dxdz(2, 1) - dxdz(2, 0) * dxdz(1, 1));
738 mn = min(mn, jacDet);
739 mx = max(mx, jacDet);
751 void BLMesh::BuildElements()
754 map<CADOrientation::Orientation, vector<int>> baseTri;
755 map<CADOrientation::Orientation, vector<int>> topTri;
785 for (
int i = 0; i < m_mesh->m_element[2].size(); i++)
788 vector<unsigned int>::iterator f =
789 find(m_blsurfs.begin(), m_blsurfs.end(), el->m_parentCAD->GetId());
791 if (f == m_blsurfs.end())
797 vector<NodeSharedPtr> tn(3);
798 vector<NodeSharedPtr> pn(6);
799 vector<NodeSharedPtr> n = el->GetVertexList();
802 for (
int j = 0; j < 3; j++)
804 pn[baseTri[o][j]] = n[j];
805 pn[topTri[o][j]] = m_blData[n[j]]->pNode;
806 tn[j] = m_blData[n[j]]->pNode;
810 tags.push_back(m_id);
815 m_mesh->m_element[3].push_back(E);
820 m_psuedoSurface.push_back(T);
822 T->m_parentCAD = el->m_parentCAD;
828 NekDouble BLMesh::Visability(vector<ElementSharedPtr> tris,
831 NekDouble mn = numeric_limits<double>::max();
833 for (
int i = 0; i < tris.size(); i++)
836 NekDouble dt = tmp[0] * N[0] + tmp[1] * N[1] + tmp[2] * N[2];
845 vector<Array<OneD, NekDouble>> N;
846 for (
int i = 0; i < tris.size(); i++)
848 N.push_back(tris[i]->Normal(
true));
851 vector<NekDouble> w(N.size());
854 for (
int i = 0; i < N.size(); i++)
856 w[i] = 1.0 / N.size();
859 for (
int i = 0; i < N.size(); i++)
861 Np[0] += w[i] * N[i][0];
862 Np[1] += w[i] * N[i][1];
863 Np[2] += w[i] * N[i][2];
865 NekDouble mag = sqrt(Np[0] * Np[0] + Np[1] * Np[1] + Np[2] * Np[2]);
874 vector<NekDouble> a(N.size());
875 while (fabs(dot - 1) > 1e-6)
884 for (
int i = 0; i < N.size(); i++)
887 Np[0] * N[i][0] + Np[1] * N[i][1] + Np[2] * N[i][2];
888 if (fabs(dot2 - 1) < 1e-9)
890 a[i] = dot2 / fabs(dot2) * 1e-9;
901 for (
int i = 0; i < N.size(); i++)
903 w[i] = w[i] * a[i] / aSum;
907 for (
int i = 0; i < N.size(); i++)
913 for (
int i = 0; i < N.size(); i++)
915 NpN[0] += w[i] * N[i][0];
916 NpN[1] += w[i] * N[i][1];
917 NpN[2] += w[i] * N[i][2];
919 mag = sqrt(NpN[0] * NpN[0] + NpN[1] * NpN[1] + NpN[2] * NpN[2]);
924 Np[0] = 0.8 * NpN[0] + (1.0 - 0.8) * Np[0];
925 Np[1] = 0.8 * NpN[1] + (1.0 - 0.8) * Np[1];
926 Np[2] = 0.8 * NpN[2] + (1.0 - 0.8) * Np[2];
927 mag = sqrt(Np[0] * Np[0] + Np[1] * Np[1] + Np[2] * Np[2]);
932 dot = Np[0] * Nplast[0] + Np[1] * Nplast[1] + Np[2] * Nplast[2];
936 cout <<
"run out of iterations" << endl;
947 NekDouble a = 2.0 * (1.0 - m_prog) / (1.0 - pow(m_prog, m_layer + 1));
949 m_layerT[0] = a * m_prog * m_bl;
950 for (
int i = 1; i < m_layer; i++)
952 m_layerT[i] = m_layerT[i - 1] + a * pow(m_prog, i) * m_bl;
955 if (m_mesh->m_verbose)
957 cout <<
"First layer height " << m_layerT[0] << endl;
962 NodeSet::iterator it;
969 for (it = m_mesh->m_vertexSet.begin(); it != m_mesh->m_vertexSet.end();
972 vector<CADSurfSharedPtr> ss = (*it)->GetCADSurfs();
973 vector<unsigned int> surfs;
974 for (
int i = 0; i < ss.size(); i++)
976 surfs.push_back(ss[i]->GetId());
978 sort(surfs.begin(), surfs.end());
979 vector<unsigned int> inter, diff;
981 set_intersection(m_blsurfs.begin(), m_blsurfs.end(), surfs.begin(),
982 surfs.end(), back_inserter(inter));
983 set_symmetric_difference(inter.begin(), inter.end(), surfs.begin(),
984 surfs.end(), back_inserter(diff));
987 if (inter.size() > 0)
992 bln->stopped =
false;
1001 ASSERTL0(diff.size() <= 1,
"not setup for curve bl refinement");
1002 symSurfs.insert(diff[0]);
1003 bln->symsurf = diff[0];
1011 m_blData[(*it)] = bln;
1018 for (
int i = 0; i < m_mesh->m_element[2].size(); i++)
1020 vector<unsigned int>::iterator f =
1021 find(m_blsurfs.begin(), m_blsurfs.end(),
1022 m_mesh->m_element[2][i]->m_parentCAD->GetId());
1024 if (f == m_blsurfs.end())
1030 vector<NodeSharedPtr> ns = m_mesh->m_element[2][i]->GetVertexList();
1031 for (
int j = 0; j < ns.size(); j++)
1033 m_blData[ns[j]]->els.push_back(m_mesh->m_element[2][i]);
1034 m_blData[ns[j]]->surfs.insert(
1035 m_mesh->m_element[2][i]->m_parentCAD->GetId());
1039 map<NodeSharedPtr, blInfoSharedPtr>::iterator bit;
1040 for (bit = m_blData.begin(); bit != m_blData.end(); bit++)
1043 bit->second->N = GetNormal(bit->second->els);
1045 if (Visability(bit->second->els, bit->second->N) < 0.0)
1047 cerr <<
"failed " << bit->first->m_x <<
" " << bit->first->m_y
1048 <<
" " << bit->first->m_z <<
" " 1049 << Visability(bit->second->els, bit->second->N) << endl;
1054 for (
int k = 0; k < 3; k++)
1056 loc[k] += bit->second->N[k] * m_layerT[0];
1059 bit->second->pNode = std::shared_ptr<Node>(
1060 new Node(m_mesh->m_numNodes++, loc[0], loc[1], loc[2]));
1061 bit->second->bl = 0;
1064 m_symSurfs = vector<unsigned int>(symSurfs.begin(), symSurfs.end());
1068 for (bit = m_blData.begin(); bit != m_blData.end(); bit++)
1070 if (!bit->second->onSym)
1077 m_mesh->m_cad->GetSurf(bit->second->symsurf)->locuv(loc);
1080 m_mesh->m_cad->GetSurf(bit->second->symsurf)->P(uv);
1083 N[0] = nl[0] - bit->first->m_x;
1084 N[1] = nl[1] - bit->first->m_y;
1085 N[2] = nl[2] - bit->first->m_z;
1087 NekDouble mag = sqrt(N[0] * N[0] + N[1] * N[1] + N[2] * N[2]);
1093 bit->second->AlignNode(m_layerT[0]);
1098 for (bit = m_blData.begin(); bit != m_blData.end(); bit++)
1101 added.insert(bit->first->m_id);
1102 for (
int i = 0; i < bit->second->els.size(); i++)
1104 vector<NodeSharedPtr> ns = bit->second->els[i]->GetVertexList();
1105 for (
int j = 0; j < ns.size(); j++)
1107 set<int>::iterator t = added.find(ns[j]->m_id);
1108 if (t == added.end())
1110 m_nToNInfo[bit->first].push_back(m_blData[ns[j]]);
1116 for (
int l = 0; l < 10; l++)
1118 for (bit = m_blData.begin(); bit != m_blData.end(); bit++)
1120 if (bit->first->GetNumCADSurf() > 1)
1126 vector<blInfoSharedPtr> data = m_nToNInfo[bit->first];
1128 for (
int i = 0; i < data.size(); i++)
1130 NekDouble d = bit->first->Distance(data[i]->oNode);
1132 sumV[0] += data[i]->N[0] / d;
1133 sumV[1] += data[i]->N[1] / d;
1134 sumV[2] += data[i]->N[2] / d;
1140 sqrt(sumV[0] * sumV[0] + sumV[1] * sumV[1] + sumV[2] * sumV[2]);
1147 N[0] = (1.0 - 0.8) * bit->second->N[0] + 0.8 * sumV[0];
1148 N[1] = (1.0 - 0.8) * bit->second->N[1] + 0.8 * sumV[1];
1149 N[2] = (1.0 - 0.8) * bit->second->N[2] + 0.8 * sumV[2];
1151 mag = sqrt(N[0] * N[0] + N[1] * N[1] + N[2] * N[2]);
1157 bit->second->AlignNode(m_layerT[0]);
1175 ASSERTL0(failed == 0,
"some normals failed to generate");
1186 VandermondeI.Invert();
static NekDouble ang(NekDouble x, NekDouble y)
std::shared_ptr< CADSurf > CADSurfSharedPtr
#define ASSERTL0(condition, msg)
Basic information about an element.
#define sign(a, b)
return the sign(b)*a
ElementFactory & GetElementFactory()
std::shared_ptr< Node > NodeSharedPtr
SharedMatrix GetVandermondeForDeriv(int dir)
Return the Vandermonde matrix of the derivative of the basis functions for the nodal distribution...
bg::model::box< point > box
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
bool Infont(NodeSharedPtr n, ElementSharedPtr el)
std::shared_ptr< blInfo > blInfoSharedPtr
std::shared_ptr< Element > ElementSharedPtr
PointsManagerT & PointsManager(void)
Defines a specification for a set of points.
box GetBox(NodeSharedPtr n, NekDouble ov)
Specialisation of the NodalUtil class to support nodal prismatic elements.
bg::model::point< double, 3, bg::cs::cartesian > point
T Dot(int n, const T *w, const T *x)
vvtvp (vector times vector times vector): z = w*x*y
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
std::pair< box, unsigned int > boxI
SharedMatrix GetVandermonde()
Return the Vandermonde matrix for the nodal distribution.
InputIterator find(InputIterator first, InputIterator last, InputIterator startingpoint, const EqualityComparable &value)
3D electrostatically spaced points on a Prism