26 Eigen::RowVector2d quad_local_node_coordinates(
int local_index)
28 assert(local_index >= 0 && local_index < 4);
31 return Eigen::RowVector2d(p(local_index, 0), p(local_index, 1));
34 Eigen::RowVector2d tri_local_node_coordinates(
int local_index)
38 return Eigen::RowVector2d(p(local_index, 0), p(local_index, 1));
41 Eigen::RowVector3d linear_tet_local_node_coordinates(
int local_index)
45 return Eigen::RowVector3d(p(local_index, 0), p(local_index, 1), p(local_index, 2));
48 Eigen::RowVector3d linear_hex_local_node_coordinates(
int local_index)
52 return Eigen::RowVector3d(p(local_index, 0), p(local_index, 1), p(local_index, 2));
55 Eigen::RowVector3d linear_prism_local_node_coordinates(
int local_index)
59 return Eigen::RowVector3d(p(local_index, 0), p(local_index, 1), p(local_index, 2));
62 Eigen::RowVector3d linear_pyramid_local_node_coordinates(
int local_index)
66 return Eigen::RowVector3d(p(local_index, 0), p(local_index, 1), p(local_index, 2));
69 Eigen::Matrix2d quad_local_node_coordinates_from_edge(
int le)
71 Eigen::Matrix2d res(2, 2);
72 res.row(0) = quad_local_node_coordinates(le);
73 res.row(1) = quad_local_node_coordinates((le + 1) % 4);
78 Eigen::Matrix2d tri_local_node_coordinates_from_edge(
int le)
80 Eigen::Matrix2d res(2, 2);
81 res.row(0) = tri_local_node_coordinates(le);
82 res.row(1) = tri_local_node_coordinates((le + 1) % 3);
90 Eigen::Matrix2d res(2, 2);
91 res.row(0) = quad_local_node_coordinates(le);
92 res.row(1) = quad_local_node_coordinates((le + 1) % 4);
99 Eigen::Matrix2d res(2, 2);
100 res.row(0) = tri_local_node_coordinates(le);
101 res.row(1) = tri_local_node_coordinates((le + 1) % 3);
108 Eigen::Matrix<int, 4, 3> fv;
109 fv.row(0) << 0, 1, 2;
110 fv.row(1) << 0, 1, 3;
111 fv.row(2) << 1, 2, 3;
112 fv.row(3) << 2, 0, 3;
114 Eigen::MatrixXd res(3, 3);
115 for (
int i = 0; i < 3; ++i)
116 res.row(i) = linear_tet_local_node_coordinates(fv(lf, i));
123 Eigen::Matrix<int, 6, 4> fv;
124 fv.row(0) << 0, 3, 7, 4;
125 fv.row(1) << 1, 2, 6, 5;
126 fv.row(2) << 0, 1, 5, 4;
127 fv.row(3) << 3, 2, 6, 7;
128 fv.row(4) << 0, 1, 2, 3;
129 fv.row(5) << 4, 5, 6, 7;
131 Eigen::MatrixXd res(4, 3);
132 for (
int i = 0; i < 4; ++i)
133 res.row(i) = linear_hex_local_node_coordinates(fv(lf, i));
140 Eigen::Matrix<int, 5, 4> fv;
141 fv.row(0) << 0, 1, 2, -1;
142 fv.row(1) << 3, 4, 5, -1;
144 fv.row(2) << 0, 1, 4, 3;
145 fv.row(3) << 1, 2, 5, 4;
146 fv.row(4) << 2, 0, 3, 5;
148 const int nv = lf < 2 ? 3 : 4;
149 Eigen::MatrixXd res(nv, 3);
150 for (
int i = 0; i < nv; ++i)
151 res.row(i) = linear_prism_local_node_coordinates(fv(lf, i));
158 Eigen::Matrix<int, 5, 4> fv;
159 fv.row(0) << 0, 3, 2, 1;
160 fv.row(1) << 0, 1, 4, -1;
161 fv.row(2) << 1, 2, 4, -1;
162 fv.row(3) << 2, 3, 4, -1;
163 fv.row(4) << 3, 0, 4, -1;
165 const int nv = (lf == 0) ? 4 : 3;
166 Eigen::MatrixXd res(nv, 3);
167 for (
int i = 0; i < nv; ++i)
168 res.row(i) = linear_pyramid_local_node_coordinates(fv(lf, i));
175 auto endpoints = quad_local_node_coordinates_from_edge(index);
181 points.resize(quad.
points.rows(), endpoints.cols());
182 uv.resize(quad.
points.rows(), 2);
184 uv.col(0) = (1.0 - quad.
points.array());
185 uv.col(1) = quad.
points.array();
187 for (
int c = 0; c < 2; ++c)
189 points.col(c) = (1.0 - quad.
points.array()) * endpoints(0, c) + quad.
points.array() * endpoints(1, c);
198 auto endpoints = tri_local_node_coordinates_from_edge(index);
204 points.resize(quad.
points.rows(), endpoints.cols());
205 uv.resize(quad.
points.rows(), 2);
207 uv.col(0) = (1.0 - quad.
points.array());
208 uv.col(1) = quad.
points.array();
210 for (
int c = 0; c < 2; ++c)
212 points.col(c) = (1.0 - quad.
points.array()) * endpoints(0, c) + quad.
points.array() * endpoints(1, c);
221 auto endpoints = hex_local_node_coordinates_from_face(index);
227 const int n_pts = quad.
points.rows();
228 points.resize(n_pts, endpoints.cols());
230 uv.resize(quad.
points.rows(), 4);
231 uv.col(0) = quad.
points.col(0);
232 uv.col(1) = 1 - uv.col(0).array();
233 uv.col(2) = quad.
points.col(1);
234 uv.col(3) = 1 - uv.col(2).array();
236 for (
int i = 0; i < n_pts; ++i)
238 const double b1 = quad.
points(i, 0);
239 const double b2 = 1 - b1;
241 const double b3 = quad.
points(i, 1);
242 const double b4 = 1 - b3;
244 for (
int c = 0; c < 3; ++c)
246 points(i, c) = b3 * (b1 * endpoints(0, c) + b2 * endpoints(1, c)) + b4 * (b1 * endpoints(3, c) + b2 * endpoints(2, c));
256 auto endpoints = tet_local_node_coordinates_from_face(index);
261 const int n_pts = quad.
points.rows();
262 points.resize(n_pts, endpoints.cols());
264 uv.resize(quad.
points.rows(), 3);
265 uv.col(0) = quad.
points.col(0);
266 uv.col(1) = quad.
points.col(1);
267 uv.col(2) = 1 - uv.col(0).array() - uv.col(1).array();
269 for (
int i = 0; i < n_pts; ++i)
271 const double b1 = quad.
points(i, 0);
272 const double b3 = quad.
points(i, 1);
273 const double b2 = 1 - b1 - b3;
275 for (
int c = 0; c < 3; ++c)
277 points(i, c) = b1 * endpoints(0, c) + b2 * endpoints(1, c) + b3 * endpoints(2, c);
288 auto endpoints = prism_local_node_coordinates_from_face(index);
296 const int n_pts = quad.
points.rows();
297 points.resize(n_pts, endpoints.cols());
299 uv.resize(quad.
points.rows(), 3);
300 uv.col(0) = quad.
points.col(0);
301 uv.col(1) = quad.
points.col(1);
302 uv.col(2) = 1 - uv.col(0).array() - uv.col(1).array();
304 for (
int i = 0; i < n_pts; ++i)
306 const double b1 = quad.
points(i, 0);
307 const double b3 = quad.
points(i, 1);
308 const double b2 = 1 - b1 - b3;
310 for (
int c = 0; c < 3; ++c)
312 points(i, c) = b1 * endpoints(0, c) + b2 * endpoints(1, c) + b3 * endpoints(2, c);
326 const int n_pts = quad.
points.rows();
327 points.resize(n_pts, endpoints.cols());
329 uv.resize(quad.
points.rows(), 4);
330 uv.col(0) = quad.
points.col(0);
331 uv.col(1) = 1 - uv.col(0).array();
332 uv.col(2) = quad.
points.col(1);
333 uv.col(3) = 1 - uv.col(2).array();
335 for (
int i = 0; i < n_pts; ++i)
337 const double b1 = quad.
points(i, 0);
338 const double b2 = 1 - b1;
340 const double b3 = quad.
points(i, 1);
341 const double b4 = 1 - b3;
343 for (
int c = 0; c < 3; ++c)
345 points(i, c) = b3 * (b1 * endpoints(0, c) + b2 * endpoints(1, c)) + b4 * (b1 * endpoints(3, c) + b2 * endpoints(2, c));
356 auto endpoints = pyramid_local_node_coordinates_from_face(index);
364 const int n_pts = quad.
points.rows();
365 points.resize(n_pts, endpoints.cols());
367 uv.resize(quad.
points.rows(), 3);
368 uv.col(0) = quad.
points.col(0);
369 uv.col(1) = quad.
points.col(1);
370 uv.col(2) = 1 - uv.col(0).array() - uv.col(1).array();
372 for (
int i = 0; i < n_pts; ++i)
374 const double b1 = quad.
points(i, 0);
375 const double b3 = quad.
points(i, 1);
376 const double b2 = 1 - b1 - b3;
378 for (
int c = 0; c < 3; ++c)
380 points(i, c) = b1 * endpoints(0, c) + b2 * endpoints(1, c) + b3 * endpoints(2, c);
394 const int n_pts = quad.
points.rows();
395 points.resize(n_pts, endpoints.cols());
397 uv.resize(quad.
points.rows(), 4);
398 uv.col(0) = quad.
points.col(0);
399 uv.col(1) = 1 - uv.col(0).array();
400 uv.col(2) = quad.
points.col(1);
401 uv.col(3) = 1 - uv.col(2).array();
403 for (
int i = 0; i < n_pts; ++i)
405 const double b1 = quad.
points(i, 0);
406 const double b2 = 1 - b1;
408 const double b3 = quad.
points(i, 1);
409 const double b4 = 1 - b3;
411 for (
int c = 0; c < 3; ++c)
413 points(i, c) = b3 * (b1 * endpoints(0, c) + b2 * endpoints(1, c)) + b4 * (b1 * endpoints(3, c) + b2 * endpoints(2, c));
424 auto endpoints = quad_local_node_coordinates_from_edge(index);
425 const Eigen::VectorXd t = Eigen::VectorXd::LinSpaced(n_samples, 0, 1);
426 samples.resize(n_samples, endpoints.cols());
428 uv.resize(n_samples, 2);
430 uv.col(0) = (1.0 - t.array());
431 uv.col(1) = t.array();
433 for (
int c = 0; c < 2; ++c)
435 samples.col(c) = (1.0 - t.array()).matrix() * endpoints(0, c) + t * endpoints(1, c);
441 auto endpoints = tri_local_node_coordinates_from_edge(index);
442 const Eigen::VectorXd t = Eigen::VectorXd::LinSpaced(n_samples, 0, 1);
443 samples.resize(n_samples, endpoints.cols());
445 uv.resize(n_samples, 2);
447 uv.col(0) = (1.0 - t.array());
448 uv.col(1) = t.array();
450 for (
int c = 0; c < 2; ++c)
452 samples.col(c) = (1.0 - t.array()).matrix() * endpoints(0, c) + t * endpoints(1, c);
458 auto endpoints = hex_local_node_coordinates_from_face(index);
459 const Eigen::VectorXd t = Eigen::VectorXd::LinSpaced(n_samples, 0, 1);
460 samples.resize(n_samples * n_samples, endpoints.cols());
461 Eigen::MatrixXd left(n_samples, endpoints.cols());
462 Eigen::MatrixXd right(n_samples, endpoints.cols());
464 uv.resize(n_samples * n_samples, endpoints.cols());
467 for (
int c = 0; c < 3; ++c)
469 left.col(c) = (1.0 - t.array()).matrix() * endpoints(0, c) + t * endpoints(1, c);
470 right.col(c) = (1.0 - t.array()).matrix() * endpoints(3, c) + t * endpoints(2, c);
472 for (
int c = 0; c < 3; ++c)
474 Eigen::MatrixXd
x = (1.0 - t.array()).matrix() * left.col(c).transpose() + t * right.col(c).transpose();
475 assert(
x.size() == n_samples * n_samples);
477 samples.col(c) = Eigen::Map<const Eigen::VectorXd>(
x.data(),
x.size());
483 auto endpoints = tet_local_node_coordinates_from_face(index);
484 const Eigen::VectorXd t = Eigen::VectorXd::LinSpaced(n_samples, 0, 1);
485 samples.resize(n_samples * n_samples, endpoints.cols());
487 uv.resize(n_samples * n_samples, 3);
490 for (
int u = 0; u < n_samples; ++u)
492 for (
int v = 0; v < n_samples; ++v)
497 uv(counter, 0) = t(u);
498 uv(counter, 1) = t(v);
499 uv(counter, 2) = 1 - t(u) - t(v);
501 for (
int c = 0; c < 3; ++c)
503 samples(counter, c) = t(u) * endpoints(0, c) + t(v) * endpoints(1, c) + (1 - t(u) - t(v)) * endpoints(2, c);
508 samples.conservativeResize(counter, 3);
509 uv.conservativeResize(counter, 3);
514 auto endpoints = prism_local_node_coordinates_from_face(index);
518 const Eigen::VectorXd t = Eigen::VectorXd::LinSpaced(n_samples, 0, 1);
519 samples.resize(n_samples * n_samples, endpoints.cols());
521 uv.resize(n_samples * n_samples, 3);
524 for (
int u = 0; u < n_samples; ++u)
526 for (
int v = 0; v < n_samples; ++v)
531 uv(counter, 0) = t(u);
532 uv(counter, 1) = t(v);
533 uv(counter, 2) = 1 - t(u) - t(v);
535 for (
int c = 0; c < 3; ++c)
537 samples(counter, c) = t(u) * endpoints(0, c) + t(v) * endpoints(1, c) + (1 - t(u) - t(v)) * endpoints(2, c);
542 samples.conservativeResize(counter, 3);
543 uv.conservativeResize(counter, 3);
547 const Eigen::VectorXd t = Eigen::VectorXd::LinSpaced(n_samples, 0, 1);
548 samples.resize(n_samples * n_samples, endpoints.cols());
549 Eigen::MatrixXd left(n_samples, endpoints.cols());
550 Eigen::MatrixXd right(n_samples, endpoints.cols());
552 uv.resize(n_samples * n_samples, endpoints.cols());
555 for (
int c = 0; c < 3; ++c)
557 left.col(c) = (1.0 - t.array()).matrix() * endpoints(0, c) + t * endpoints(1, c);
558 right.col(c) = (1.0 - t.array()).matrix() * endpoints(3, c) + t * endpoints(2, c);
560 for (
int c = 0; c < 3; ++c)
562 Eigen::MatrixXd
x = (1.0 - t.array()).matrix() * left.col(c).transpose() + t * right.col(c).transpose();
563 assert(
x.size() == n_samples * n_samples);
565 samples.col(c) = Eigen::Map<const Eigen::VectorXd>(
x.data(),
x.size());
572 auto endpoints = pyramid_local_node_coordinates_from_face(index);
576 const Eigen::VectorXd t = Eigen::VectorXd::LinSpaced(n_samples, 0, 1);
577 samples.resize(n_samples * n_samples, endpoints.cols());
579 uv.resize(n_samples * n_samples, 3);
582 for (
int u = 0; u < n_samples; ++u)
584 for (
int v = 0; v < n_samples; ++v)
589 uv(counter, 0) = t(u);
590 uv(counter, 1) = t(v);
591 uv(counter, 2) = 1 - t(u) - t(v);
593 for (
int c = 0; c < 3; ++c)
595 samples(counter, c) = t(u) * endpoints(0, c) + t(v) * endpoints(1, c) + (1 - t(u) - t(v)) * endpoints(2, c);
600 samples.conservativeResize(counter, 3);
601 uv.conservativeResize(counter, 3);
605 const Eigen::VectorXd t = Eigen::VectorXd::LinSpaced(n_samples, 0, 1);
606 samples.resize(n_samples * n_samples, endpoints.cols());
607 Eigen::MatrixXd left(n_samples, endpoints.cols());
608 Eigen::MatrixXd right(n_samples, endpoints.cols());
610 uv.resize(n_samples * n_samples, endpoints.cols());
613 for (
int c = 0; c < 3; ++c)
615 left.col(c) = (1.0 - t.array()).matrix() * endpoints(0, c) + t * endpoints(1, c);
616 right.col(c) = (1.0 - t.array()).matrix() * endpoints(3, c) + t * endpoints(2, c);
618 for (
int c = 0; c < 3; ++c)
620 Eigen::MatrixXd
x = (1.0 - t.array()).matrix() * left.col(c).transpose() + t * right.col(c).transpose();
621 assert(
x.size() == n_samples * n_samples);
623 samples.col(c) = Eigen::Map<const Eigen::VectorXd>(
x.data(),
x.size());
650 auto p0 = mesh2d.
point(index.vertex);
652 const Eigen::VectorXd t = Eigen::VectorXd::LinSpaced(n_samples, 0, 1);
653 samples.resize(n_samples, p0.cols());
655 uv.resize(n_samples, 2);
657 uv.col(0) = (1.0 - t.array());
658 uv.col(1) = t.array();
660 for (
int c = 0; c < 2; ++c)
662 samples.col(c) = (1.0 - t.array()) * p0(c) + t.array() * p1(c);
688 auto p0 = mesh2d.
point(index.vertex);
694 points.resize(quad.
points.rows(), p0.cols());
695 uv.resize(quad.
points.rows(), 2);
697 uv.col(0) = (1.0 - quad.
points.array());
698 uv.col(1) = quad.
points.array();
700 for (
int c = 0; c < 2; ++c)
702 points.col(c) = (1.0 - quad.
points.array()) * p0(c) + quad.
points.array() * p1(c);
711 auto endpoints = quad_local_node_coordinates_from_edge(index);
712 const Eigen::MatrixXd e = endpoints.row(0) - endpoints.row(1);
721 auto endpoints = tri_local_node_coordinates_from_edge(index);
722 const Eigen::MatrixXd e = endpoints.row(0) - endpoints.row(1);
731 auto endpoints = hex_local_node_coordinates_from_face(index);
732 const Eigen::RowVector3d e1 = endpoints.row(0) - endpoints.row(1);
733 const Eigen::RowVector3d e2 = endpoints.row(0) - endpoints.row(2);
734 normal = e1.cross(e2);
737 if (index == 0 || index == 3 || index == 4)
743 auto endpoints = tet_local_node_coordinates_from_face(index);
744 const Eigen::RowVector3d e1 = endpoints.row(0) - endpoints.row(1);
745 const Eigen::RowVector3d e2 = endpoints.row(0) - endpoints.row(2);
746 normal = e1.cross(e2);
755 auto endpoints = prism_local_node_coordinates_from_face(index);
756 const Eigen::RowVector3d e1 = endpoints.row(0) - endpoints.row(1);
757 const Eigen::RowVector3d e2 = endpoints.row(0) - endpoints.row(2);
758 normal = e1.cross(e2);
767 auto endpoints = pyramid_local_node_coordinates_from_face(index);
768 const Eigen::RowVector3d e1 = endpoints.row(0) - endpoints.row(1);
769 const Eigen::RowVector3d e2 = endpoints.row(0) - endpoints.row(2);
770 normal = e1.cross(e2);
799 auto p0 = mesh2d.
point(index.vertex);
801 const Eigen::MatrixXd e = p0 - p1;
812 normals.resize(0, 0);
814 global_primitive_ids.resize(0);
816 for (
int i = 0; i < local_boundary.
size(); ++i)
819 Eigen::MatrixXd tmp_p, tmp_uv, tmp_n;
820 Eigen::VectorXd tmp_w;
821 switch (local_boundary.
type())
823 case BoundaryType::TRI_LINE:
824 quadrature_for_tri_edge(local_boundary[i], order[0], gid, mesh, tmp_uv, tmp_p, tmp_w);
825 normal_for_tri_edge(local_boundary[i], tmp_n);
827 case BoundaryType::QUAD_LINE:
828 quadrature_for_quad_edge(local_boundary[i], order[0], gid, mesh, tmp_uv, tmp_p, tmp_w);
829 normal_for_quad_edge(local_boundary[i], tmp_n);
831 case BoundaryType::QUAD:
832 quadrature_for_quad_face(local_boundary[i], order[0], gid, mesh, tmp_uv, tmp_p, tmp_w);
833 normal_for_quad_face(local_boundary[i], tmp_n);
835 case BoundaryType::TRI:
836 quadrature_for_tri_face(local_boundary[i], order[0], gid, mesh, tmp_uv, tmp_p, tmp_w);
837 normal_for_tri_face(local_boundary[i], tmp_n);
839 case BoundaryType::PRISM:
840 quadrature_for_prism_face(local_boundary[i], order[0], order[1], gid, mesh, tmp_uv, tmp_p, tmp_w);
841 normal_for_prism_face(local_boundary[i], tmp_n);
843 case BoundaryType::PYRAMID:
844 quadrature_for_pyramid_face(local_boundary[i], order[0], gid, mesh, tmp_uv, tmp_p, tmp_w);
845 normal_for_pyramid_face(local_boundary[i], tmp_n);
847 case BoundaryType::POLYGON:
851 case BoundaryType::INVALID:
858 uv.conservativeResize(uv.rows() + tmp_uv.rows(), tmp_uv.cols());
859 uv.bottomRows(tmp_uv.rows()) = tmp_uv;
861 points.conservativeResize(points.rows() + tmp_p.rows(), tmp_p.cols());
862 points.bottomRows(tmp_p.rows()) = tmp_p;
864 normals.conservativeResize(normals.rows() + tmp_p.rows(), tmp_p.cols());
865 for (
int k = normals.rows() - tmp_p.rows(); k < normals.rows(); ++k)
866 normals.row(k) = tmp_n;
868 weights.conservativeResize(weights.rows() + tmp_w.rows(), tmp_w.cols());
869 weights.bottomRows(tmp_w.rows()) = tmp_w;
871 global_primitive_ids.conservativeResize(global_primitive_ids.rows() + tmp_p.rows());
872 global_primitive_ids.bottomRows(tmp_p.rows()).setConstant(gid);
875 assert(uv.rows() == global_primitive_ids.size());
876 assert(points.rows() == global_primitive_ids.size());
877 assert(normals.rows() == global_primitive_ids.size());
878 assert(weights.size() == global_primitive_ids.size());
886 samples.resize(0, 0);
887 global_primitive_ids.resize(0);
889 for (
int i = 0; i < local_boundary.
size(); ++i)
891 Eigen::MatrixXd tmp, tmp_uv;
892 switch (local_boundary.
type())
894 case BoundaryType::TRI_LINE:
895 sample_parametric_tri_edge(local_boundary[i], n_samples, tmp_uv, tmp);
897 case BoundaryType::QUAD_LINE:
898 sample_parametric_quad_edge(local_boundary[i], n_samples, tmp_uv, tmp);
900 case BoundaryType::QUAD:
901 sample_parametric_quad_face(local_boundary[i], n_samples, tmp_uv, tmp);
903 case BoundaryType::TRI:
904 sample_parametric_tri_face(local_boundary[i], n_samples, tmp_uv, tmp);
906 case BoundaryType::PRISM:
907 sample_parametric_prism_face(local_boundary[i], n_samples, tmp_uv, tmp);
909 case BoundaryType::PYRAMID:
910 sample_parametric_pyramid_face(local_boundary[i], n_samples, tmp_uv, tmp);
912 case BoundaryType::POLYGON:
915 case BoundaryType::INVALID:
922 uv.conservativeResize(uv.rows() + tmp_uv.rows(), tmp_uv.cols());
923 uv.bottomRows(tmp_uv.rows()) = tmp_uv;
925 samples.conservativeResize(samples.rows() + tmp.rows(), tmp.cols());
926 samples.bottomRows(tmp.rows()) = tmp;
928 global_primitive_ids.conservativeResize(global_primitive_ids.rows() + tmp.rows());
929 global_primitive_ids.bottomRows(tmp.rows()).setConstant(local_boundary.
global_primitive_id(i));
932 assert(uv.rows() == global_primitive_ids.size());
933 assert(samples.rows() == global_primitive_ids.size());
940 assert(local_boundary.
size() > i);
947 Eigen::MatrixXd normal;
948 switch (local_boundary.
type())
950 case BoundaryType::TRI_LINE:
951 quadrature_for_tri_edge(local_boundary[i], order[0], gid, mesh, uv, points, weights);
952 normal_for_tri_edge(local_boundary[i], normal);
954 case BoundaryType::QUAD_LINE:
955 quadrature_for_quad_edge(local_boundary[i], order[0], gid, mesh, uv, points, weights);
956 normal_for_quad_edge(local_boundary[i], normal);
958 case BoundaryType::QUAD:
959 quadrature_for_quad_face(local_boundary[i], order[0], gid, mesh, uv, points, weights);
960 normal_for_quad_face(local_boundary[i], normal);
962 case BoundaryType::TRI:
963 quadrature_for_tri_face(local_boundary[i], order[0], gid, mesh, uv, points, weights);
964 normal_for_tri_face(local_boundary[i], normal);
966 case BoundaryType::PRISM:
967 quadrature_for_prism_face(local_boundary[i], order[0], order[1], gid, mesh, uv, points, weights);
968 normal_for_prism_face(local_boundary[i], normal);
970 case BoundaryType::PYRAMID:
971 quadrature_for_pyramid_face(local_boundary[i], order[0], gid, mesh, uv, points, weights);
972 normal_for_pyramid_face(local_boundary[i], normal);
974 case BoundaryType::POLYGON:
975 quadrature_for_polygon_edge(local_boundary.
element_id(), gid, order[0], mesh, uv, points, weights);
976 normal_for_polygon_edge(local_boundary.
element_id(), gid, mesh, normal);
978 case BoundaryType::INVALID:
985 normals.resize(points.rows(), normal.size());
986 for (
int k = 0; k < normals.rows(); ++k)
987 normals.row(k) = normal;
Navigation::Index switch_edge(Navigation::Index idx) const override
int n_face_vertices(const int f_id) const override
number of vertices of a face
Navigation::Index get_index_from_face(int f, int lv=0) const override
virtual RowVectorNd point(const int global_index) const override
point coordinates
Boundary primitive IDs for a single element.
int element_id() const
Get the element's ID.
int size() const
Number of boundary primitives for the element.
int global_primitive_id(const int index) const
Get the i-th boundary primitive's global ID.
BoundaryType type() const
Get the type of boundary for the element.
Navigation::Index next_around_face(Navigation::Index idx) const
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
virtual double edge_length(const int gid) const
edge length
virtual double tri_area(const int gid) const
area of a tri face of a tet mesh
virtual double quad_area(const int gid) const
area of a quad face of an hex mesh
virtual bool is_volume() const =0
checks if mesh is volume
void get_quadrature(const int order, Quadrature &quad)
void get_quadrature(const int order, Quadrature &quad)
void get_quadrature(const int order, Quadrature &quad)
static void quadrature_for_polygon_edge(int face_id, int edge_id, int order, const mesh::Mesh &mesh, Eigen::MatrixXd &uv, Eigen::MatrixXd &points, Eigen::VectorXd &weights)
static Eigen::MatrixXd prism_local_node_coordinates_from_face(int lf)
static void quadrature_for_quad_face(int index, int order, const int gid, const mesh::Mesh &mesh, Eigen::MatrixXd &uv, Eigen::MatrixXd &points, Eigen::VectorXd &weights)
static bool sample_boundary(const mesh::LocalBoundary &local_boundary, const int n_samples, const mesh::Mesh &mesh, const bool skip_computation, Eigen::MatrixXd &uv, Eigen::MatrixXd &samples, Eigen::VectorXi &global_primitive_ids)
static void sample_parametric_prism_face(int index, int n_samples, Eigen::MatrixXd &uv, Eigen::MatrixXd &samples)
static Eigen::MatrixXd pyramid_local_node_coordinates_from_face(int lf)
static void quadrature_for_quad_edge(int index, int order, const int gid, const mesh::Mesh &mesh, Eigen::MatrixXd &uv, Eigen::MatrixXd &points, Eigen::VectorXd &weights)
static void normal_for_quad_edge(int index, Eigen::MatrixXd &normal)
static void normal_for_tri_edge(int index, Eigen::MatrixXd &normal)
static void quadrature_for_tri_face(int index, int order, const int gid, const mesh::Mesh &mesh, Eigen::MatrixXd &uv, Eigen::MatrixXd &points, Eigen::VectorXd &weights)
static void normal_for_quad_face(int index, Eigen::MatrixXd &normal)
static void sample_parametric_pyramid_face(int index, int n_samples, Eigen::MatrixXd &uv, Eigen::MatrixXd &samples)
static void sample_parametric_tri_face(int index, int n_samples, Eigen::MatrixXd &uv, Eigen::MatrixXd &samples)
static bool boundary_quadrature(const mesh::LocalBoundary &local_boundary, const QuadratureOrders &order, const mesh::Mesh &mesh, const bool skip_computation, Eigen::MatrixXd &uv, Eigen::MatrixXd &points, Eigen::MatrixXd &normals, Eigen::VectorXd &weights, Eigen::VectorXi &global_primitive_ids)
static Eigen::MatrixXd hex_local_node_coordinates_from_face(int lf)
static void normal_for_prism_face(int index, Eigen::MatrixXd &normal)
static void normal_for_tri_face(int index, Eigen::MatrixXd &normal)
static void sample_parametric_quad_face(int index, int n_samples, Eigen::MatrixXd &uv, Eigen::MatrixXd &samples)
static void quadrature_for_prism_face(int index, int orderp, int orderq, const int gid, const mesh::Mesh &mesh, Eigen::MatrixXd &uv, Eigen::MatrixXd &points, Eigen::VectorXd &weights)
static void normal_for_polygon_edge(int face_id, int edge_id, const mesh::Mesh &mesh, Eigen::MatrixXd &normal)
static void normal_for_pyramid_face(int index, Eigen::MatrixXd &normal)
static Eigen::MatrixXd tet_local_node_coordinates_from_face(int lf)
static void sample_parametric_quad_edge(int index, int n_samples, Eigen::MatrixXd &uv, Eigen::MatrixXd &samples)
static void sample_polygon_edge(int face_id, int edge_id, int n_samples, const mesh::Mesh &mesh, Eigen::MatrixXd &uv, Eigen::MatrixXd &samples)
static void quadrature_for_tri_edge(int index, int order, const int gid, const mesh::Mesh &mesh, Eigen::MatrixXd &uv, Eigen::MatrixXd &points, Eigen::VectorXd &weights)
static void sample_parametric_tri_edge(int index, int n_samples, Eigen::MatrixXd &uv, Eigen::MatrixXd &samples)
static Eigen::Matrix2d quad_local_node_coordinates_from_edge(int le)
static Eigen::Matrix2d tri_local_node_coordinates_from_edge(int le)
static void quadrature_for_pyramid_face(int index, int orderp, const int gid, const mesh::Mesh &mesh, Eigen::MatrixXd &uv, Eigen::MatrixXd &points, Eigen::VectorXd &weights)
void q_nodes_2d(const int q, Eigen::MatrixXd &val)
void pyramid_nodes_3d(const int pyramid, Eigen::MatrixXd &val)
void prism_nodes_3d(const int p, const int q, Eigen::MatrixXd &val)
void p_nodes_2d(const int p, Eigen::MatrixXd &val)
void p_nodes_3d(const int p, Eigen::MatrixXd &val)
void q_nodes_3d(const int q, Eigen::MatrixXd &val)
std::array< int, 2 > QuadratureOrders