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>(
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();
std::pair< box, unsigned int > boxI
bg::model::point< double, 3, bg::cs::cartesian > point
bg::model::box< point > box
#define ASSERTL0(condition, msg)
#define sign(a, b)
return the sign(b)*a
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
SharedMatrix GetVandermonde()
Return the Vandermonde matrix for the nodal distribution.
SharedMatrix GetVandermondeForDeriv(int dir)
Return the Vandermonde matrix of the derivative of the basis functions for the nodal distribution.
Specialisation of the NodalUtil class to support nodal prismatic elements.
Defines a specification for a set of points.
std::shared_ptr< blInfo > blInfoSharedPtr
Represents a point in the domain.
PointsManagerT & PointsManager(void)
static NekDouble ang(NekDouble x, NekDouble y)
@ eNodalPrismElec
3D electrostatically spaced points on a Prism
box GetBox(NodeSharedPtr n, NekDouble ov)
std::shared_ptr< CADSurf > CADSurfSharedPtr
ElementFactory & GetElementFactory()
std::shared_ptr< Element > ElementSharedPtr
bool Infont(NodeSharedPtr n, ElementSharedPtr el)
std::shared_ptr< Node > NodeSharedPtr
InputIterator find(InputIterator first, InputIterator last, InputIterator startingpoint, const EqualityComparable &value)
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.
Basic information about an element.