11 #include "wonton/support/Point.h" 12 #include "wonton/support/Polytope.h" 15 #include "tangram/driver/CellMatPoly.h" 16 #include "tangram/driver/driver.h" 17 #include "tangram/support/MatPoly.h" 18 #include "tangram/reconstruct/cutting_distance_solver.h" 42 template<
class,
int,
class,
class>
43 class InterfaceReconstructor = DummyInterfaceReconstructor,
44 class Matpoly_Splitter = void,
45 class Matpoly_Clipper =
void 51 using InterfaceReconstructorDriver = Tangram::Driver<
52 InterfaceReconstructor, dim, SourceMesh,
53 Matpoly_Splitter, Matpoly_Clipper>;
76 SourceState
const &source_state,
77 TargetMesh
const &target_mesh,
79 std::shared_ptr<InterfaceReconstructorDriver> ir)
80 : source_mesh_(source_mesh),
81 target_mesh_(target_mesh),
82 source_state_(source_state),
84 interface_reconstructor(ir) {}
97 SourceState
const &source_state,
98 TargetMesh
const &target_mesh,
100 : source_mesh_(source_mesh),
101 target_mesh_(target_mesh),
102 source_state_(source_state),
103 num_tols_(num_tols) {}
144 std::vector<double> compute_face_group_moments(
146 int const face_group_id,
147 double const swept_volume)
const {
149 std::cerr <<
"Sorry: current entity type not supported." << std::endl;
150 return std::vector<double>();
163 std::vector<int>
const& stencil)
const {
165 std::cerr <<
"Sorry: current entity type not supported." << std::endl;
166 return std::vector<Weights_t>();
170 SourceMesh
const &source_mesh_;
171 TargetMesh
const &target_mesh_;
172 SourceState
const &source_state_;
173 int material_id_ = -1;
175 bool displacement_check =
false;
177 std::shared_ptr<InterfaceReconstructorDriver> interface_reconstructor;
193 class SourceMesh,
class SourceState,
class TargetMesh,
194 template<
class,
int,
class,
class>
195 class InterfaceReconstructor,
196 class Matpoly_Splitter,
class Matpoly_Clipper
199 SourceMesh, SourceState,
200 TargetMesh, InterfaceReconstructor,
201 Matpoly_Splitter, Matpoly_Clipper> {
205 using InterfaceReconstructor2D = Tangram::Driver<
206 InterfaceReconstructor, 2, SourceMesh,
207 Matpoly_Splitter, Matpoly_Clipper>;
230 SourceState
const &source_state,
231 TargetMesh
const &target_mesh,
233 std::shared_ptr<InterfaceReconstructor2D> ir)
234 : source_mesh_(source_mesh),
235 target_mesh_(target_mesh),
236 source_state_(source_state),
238 interface_reconstructor(ir) {}
251 SourceState
const &source_state,
252 TargetMesh
const &target_mesh,
254 : source_mesh_(source_mesh),
255 target_mesh_(target_mesh),
256 source_state_(source_state),
257 num_tols_(num_tols) {}
296 std::vector<double> compute_moments_divergence_theorem
297 (
std::vector<Wonton::Point<2>>
const& swept_polygon)
const {
299 int const n = swept_polygon.size();
300 constexpr
double const factor[] = { 0.5, 1./6., 1./6. };
302 std::vector<double> moments(3);
304 for (
int i=0; i < n; ++i) {
305 auto const& pi = swept_polygon[i];
306 auto const& pj = swept_polygon[(i + 1) % n];
307 auto const det = (pi[0] * pj[1] - pi[1] * pj[0]);
309 moments[1] += (pi[0] + pj[0]) * det;
310 moments[2] += (pi[1] + pj[1]) * det;
313 for (
int i=0; i < 3; ++i) { moments[i] *= factor[i]; }
324 std::vector<double> compute_source_moments(
int source_id)
const {
325 double const area = source_mesh_.cell_volume(source_id);
327 source_mesh_.cell_centroid(source_id, ¢roid);
328 return std::vector<double>{ area, area * centroid[0], area * centroid[1] };
338 bool centroid_inside_cell(
int cell, std::vector<double>
const& moment)
const {
340 double const cell_area = std::abs(moment[0]);
341 if (cell_area < num_tols_.min_absolute_volume)
344 std::vector<int> edges, dirs, nodes;
345 source_mesh_.cell_get_faces_and_dirs(cell, &edges, &dirs);
346 int const nb_edges = edges.size();
348 Wonton::Point<2> triangle[3];
349 triangle[0] = { moment[1] / cell_area, moment[2] / cell_area };
351 for (
int i = 0; i < nb_edges; ++i) {
352 source_mesh_.face_get_nodes(edges[i], &nodes);
355 source_mesh_.node_get_coordinates(nodes[0], triangle + 1);
356 source_mesh_.node_get_coordinates(nodes[1], triangle + 2);
358 source_mesh_.node_get_coordinates(nodes[1], triangle + 1);
359 source_mesh_.node_get_coordinates(nodes[0], triangle + 2);
363 double const& ax = triangle[0][0];
364 double const& ay = triangle[0][1];
365 double const& bx = triangle[1][0];
366 double const& by = triangle[1][1];
367 double const& cx = triangle[2][0];
368 double const& cy = triangle[2][1];
369 double const det = ax * by - ax * cy
397 std::vector<double> compute_face_group_moments(
399 int const face_group_id,
400 double const swept_volume)
const {
402 std::vector<int> cfaces, cfdirs;
403 source_mesh_.cell_get_faces_and_dirs(cell_id, &cfaces, &cfdirs);
405 int cface_id = std::distance(
406 cfaces.begin(), std::find(cfaces.begin(), cfaces.end(), face_group_id));
409 int nfaces = cfaces.size();
410 assert(cface_id != nfaces);
414 const std::vector<Tangram::IterativeMethodTolerances_t>& ims_tols =
415 interface_reconstructor->iterative_methods_tolerances();
416 double dst_tol = ims_tols[0].arg_eps;
417 double vol_tol = ims_tols[0].fun_eps;
420 Tangram::MatPoly<2> cell_mp;
421 Tangram::cell_get_matpoly(source_mesh_, cell_id, &cell_mp, dst_tol);
422 cell_mp.set_mat_id(0);
424 std::vector<Tangram::MatPoly<2>> face_group_polys;
425 Tangram::Plane_t<2> cutting_plane;
426 cutting_plane.normal =
427 cell_mp.face_normal_and_group(cface_id, face_group_id, &face_group_polys);
430 Tangram::CuttingDistanceSolver<2, Matpoly_Clipper> cds(face_group_polys,
431 cutting_plane.normal, ims_tols[0],
true);
433 cds.set_target_volume(std::fabs(swept_volume));
434 std::vector<double> cds_res = cds();
437 if (cds_res[1] < std::fabs(swept_volume) - vol_tol) {
438 throw std::runtime_error(
"Mesh displacement is too big for the implemented swept-face method");
441 cutting_plane.dist2origin = cds_res[0];
444 Tangram::CellMatPoly<2>
const& cellmatpoly =
445 interface_reconstructor->cell_matpoly_data(cell_id);
446 std::vector<Tangram::MatPoly<2>> group_mat_polys =
447 cellmatpoly.get_face_group_matpolys(face_group_id, material_id_);
450 Matpoly_Clipper clip_matpolys(vol_tol);
451 clip_matpolys.set_matpolys(group_mat_polys,
true);
452 clip_matpolys.set_plane(cutting_plane);
453 std::vector<double> moments = clip_matpolys();
456 if(swept_volume < 0.0)
457 for(
double& moment : moments)
472 std::vector<int>
const& stencil)
const {
474 auto in_stencil = [&](
int cell) ->
bool {
475 return std::find(stencil.begin(), stencil.end(), cell) != stencil.end();
479 int const source_id = target_id;
481 std::vector<Weights_t> swept_moments;
488 int const nb_mats = source_state_.cell_get_num_mats(source_id);
489 std::vector<int> cellmats;
490 source_state_.cell_get_mats(source_id, &cellmats);
495 bool const source_cell_mat =
496 (std::find(cellmats.begin(), cellmats.end(), material_id_) != cellmats.end());
497 bool const single_mat_src_cell = !nb_mats || (material_id_ == -1) ||
498 (nb_mats == 1 && source_cell_mat);
500 if (single_mat_src_cell) {
503 swept_moments.emplace_back(source_id, compute_source_moments(source_id));
506 }
else if (source_cell_mat) {
508 assert(interface_reconstructor !=
nullptr);
512 Tangram::CellMatPoly<2>
const& cellmatpoly =
513 interface_reconstructor->cell_matpoly_data(source_id);
515 swept_moments.emplace_back(source_id, cellmatpoly.material_moments(material_id_));
520 std::vector<int> edges, dirs, nodes;
523 source_mesh_.cell_get_faces_and_dirs(source_id, &edges, &dirs);
524 int const nb_edges = edges.size();
528 std::vector<int> target_edges, target_dirs, target_nodes;
529 target_mesh_.cell_get_faces_and_dirs(target_id, &target_edges, &target_dirs);
530 int const nb_target_edges = target_edges.size();
532 assert(nb_edges == nb_target_edges);
533 for (
int j = 0; j < nb_edges; ++j) {
534 assert(edges[j] == target_edges[j]);
539 for (
int i = 0; i < nb_edges; ++i) {
543 source_mesh_.face_get_nodes(edges[i], &nodes);
547 target_mesh_.face_get_nodes(target_edges[i], &target_nodes);
548 int const nb_source_nodes = nodes.size();
549 int const nb_target_nodes = target_nodes.size();
551 assert(nb_source_nodes == nb_target_nodes);
552 for (
int j = 0; j < nb_target_nodes; ++j) {
553 assert(nodes[j] == target_nodes[j]);
558 std::vector<Wonton::Point<2>> swept_polygon(4);
564 unsigned const j = (dirs[i] > 0 ? 1 : 0);
565 unsigned const k = j ^ 1;
567 source_mesh_.node_get_coordinates(nodes[j], swept_polygon.data());
568 source_mesh_.node_get_coordinates(nodes[k], swept_polygon.data()+1);
569 target_mesh_.node_get_coordinates(nodes[k], swept_polygon.data()+2);
570 target_mesh_.node_get_coordinates(nodes[j], swept_polygon.data()+3);
573 auto moments = compute_moments_divergence_theorem(swept_polygon);
579 if (std::fabs(moments[0]) < num_tols_.min_absolute_volume) {
583 }
else if (moments[0] < 0.0) {
588 if (single_mat_src_cell) {
590 swept_moments.emplace_back(source_id, moments);
592 }
else if (source_cell_mat) {
593 swept_moments.emplace_back(source_id,
594 compute_face_group_moments(source_id, edges[i], moments[0]));
599 int const neigh = source_mesh_.cell_get_face_adj_cell(source_id, edges[i]);
606 if (!in_stencil(neigh)) {
608 throw std::runtime_error(
"invalid stencil for source cell "+
id);
612 if (displacement_check && !centroid_inside_cell(neigh, moments)) {
613 throw std::runtime_error(
"invalid target mesh for swept face");
617 int const adj_cell_nb_mats = source_state_.cell_get_num_mats(neigh);
618 std::vector<int> adj_cellmats;
619 source_state_.cell_get_mats(neigh, &adj_cellmats);
624 bool const adj_cell_mat =
625 (std::find(adj_cellmats.begin(), adj_cellmats.end(), material_id_) != adj_cellmats.end());
626 bool const single_mat_adj_cell = !adj_cell_nb_mats || (material_id_ == -1) ||
627 (adj_cell_nb_mats == 1 && adj_cell_mat);
629 if (single_mat_adj_cell) {
631 swept_moments.emplace_back(neigh, moments);
639 swept_moments.emplace_back(neigh,
640 compute_face_group_moments(neigh, edges[i], moments[0]));
646 return swept_moments;
650 SourceMesh
const &source_mesh_;
651 TargetMesh
const &target_mesh_;
652 SourceState
const &source_state_;
653 int material_id_ = -1;
655 bool displacement_check =
false;
657 std::shared_ptr<InterfaceReconstructor2D> interface_reconstructor;
672 class SourceMesh,
class SourceState,
class TargetMesh,
673 template<
class,
int,
class,
class>
674 class InterfaceReconstructor,
675 class Matpoly_Splitter,
class Matpoly_Clipper
678 SourceMesh, SourceState,
679 TargetMesh, InterfaceReconstructor,
680 Matpoly_Splitter, Matpoly_Clipper> {
684 using InterfaceReconstructor3D = Tangram::Driver<
685 InterfaceReconstructor, 3, SourceMesh,
686 Matpoly_Splitter, Matpoly_Clipper
690 using Polyhedron = Wonton::Polytope<3>;
712 SourceState
const& source_state,
713 TargetMesh
const& target_mesh,
715 std::shared_ptr<InterfaceReconstructor3D> ir)
716 : source_mesh_(source_mesh),
717 target_mesh_(target_mesh),
718 source_state_(source_state),
720 interface_reconstructor(ir) {}
733 SourceState
const& source_state,
734 TargetMesh
const& target_mesh,
736 : source_mesh_(source_mesh),
737 target_mesh_(target_mesh),
738 source_state_(source_state),
739 num_tols_(num_tols) {}
787 std::vector<double> compute_moments
789 std::vector<std::vector<int>>
const& faces)
const {
792 Polyhedron polyhedron(coords, faces);
793 return polyhedron.moments();
802 std::vector<double> compute_source_moments(
int source_id)
const {
805 double const volume = source_mesh_.cell_volume(source_id);
806 source_mesh_.cell_centroid(source_id, ¢roid);
807 return std::vector<double>{volume,
808 centroid[0] * volume,
809 centroid[1] * volume,
810 centroid[2] * volume};
836 bool valid_displacement(
int source_id,
837 std::vector<Weights_t>
const& moments)
const {
839 int const nb_moments = moments.size();
840 assert(nb_moments > 0);
844 assert(moments[0].entityID == source_id);
845 double const source_cell_volume = moments[0].weights[0];
846 double source_swept_volume = 0.;
847 assert(source_cell_volume > num_tols_.min_absolute_volume);
849 for (
int i = 1; i < nb_moments; ++i) {
850 double const swept_volume = std::abs(moments[i].weights[0]);
851 double const entity_volume = source_mesh_.cell_volume(moments[i].entityID);
852 assert(swept_volume > num_tols_.min_absolute_volume);
854 if (swept_volume > entity_volume) {
856 }
else if (moments[i].entityID == source_id) {
858 source_swept_volume += swept_volume;
869 return source_swept_volume <= (1.5 * source_cell_volume) + num_tols_.min_absolute_volume;
892 std::vector<double> compute_face_group_moments(
894 int const face_group_id,
895 double const swept_volume)
const {
897 std::vector<int> cfaces, cfdirs;
898 source_mesh_.cell_get_faces_and_dirs(cell_id, &cfaces, &cfdirs);
900 int cface_id = std::distance(
901 cfaces.begin(), std::find(cfaces.begin(), cfaces.end(), face_group_id));
904 int nfaces = cfaces.size();
905 assert(cface_id != nfaces);
909 const std::vector<Tangram::IterativeMethodTolerances_t>& ims_tols =
910 interface_reconstructor->iterative_methods_tolerances();
911 double dst_tol = ims_tols[0].arg_eps;
912 double vol_tol = ims_tols[0].fun_eps;
915 Tangram::MatPoly<3> cell_mp;
916 Tangram::cell_get_matpoly(source_mesh_, cell_id, &cell_mp, dst_tol);
917 cell_mp.set_mat_id(0);
919 std::vector<Tangram::MatPoly<3>> face_group_polys;
920 Tangram::Plane_t<3> cutting_plane;
921 cutting_plane.normal =
922 cell_mp.face_normal_and_group(cface_id, face_group_id, &face_group_polys);
925 Tangram::CuttingDistanceSolver<3, Matpoly_Clipper> cds(face_group_polys,
926 cutting_plane.normal, ims_tols[0],
true);
928 cds.set_target_volume(std::fabs(swept_volume));
929 std::vector<double> cds_res = cds();
932 if (cds_res[1] < std::fabs(swept_volume) - vol_tol) {
933 throw std::runtime_error(
"Mesh displacement is too big for the implemented swept-face method");
936 cutting_plane.dist2origin = cds_res[0];
939 Tangram::CellMatPoly<3>
const& cellmatpoly =
940 interface_reconstructor->cell_matpoly_data(cell_id);
941 std::vector<Tangram::MatPoly<3>> group_mat_polys =
942 cellmatpoly.get_face_group_matpolys(face_group_id, material_id_);
945 Matpoly_Clipper clip_matpolys(vol_tol);
946 clip_matpolys.set_matpolys(group_mat_polys,
true);
947 clip_matpolys.set_plane(cutting_plane);
948 std::vector<double> moments = clip_matpolys();
950 if(swept_volume < 0.0)
951 for(
double& moment : moments)
979 std::vector<int>
const& stencil)
const {
982 auto in_stencil = [&](
int cell) ->
bool {
983 return std::find(stencil.begin(), stencil.end(), cell) != stencil.end();
987 int const source_id = target_id;
989 std::vector<Weights_t> swept_moments;
992 int const nb_mats = source_state_.cell_get_num_mats(source_id);
993 std::vector<int> cellmats;
994 source_state_.cell_get_mats(source_id, &cellmats);
999 bool const source_cell_mat =
1000 (std::find(cellmats.begin(), cellmats.end(), material_id_) != cellmats.end());
1001 bool const single_mat_src_cell = !nb_mats || (material_id_ == -1) ||
1002 (nb_mats == 1 && source_cell_mat);
1004 if (single_mat_src_cell) {
1007 swept_moments.emplace_back(source_id, compute_source_moments(source_id));
1010 }
else if (source_cell_mat) {
1012 assert(interface_reconstructor !=
nullptr);
1016 Tangram::CellMatPoly<3>
const& cellmatpoly =
1017 interface_reconstructor->cell_matpoly_data(source_id);
1019 swept_moments.emplace_back(source_id, cellmatpoly.material_moments(material_id_));
1022 std::vector<int> faces, dirs, nodes;
1025 source_mesh_.cell_get_faces_and_dirs(source_id, &faces, &dirs);
1026 int const nb_faces = faces.size();
1030 std::vector<int> target_faces, target_dirs, target_nodes;
1031 target_mesh_.cell_get_faces_and_dirs(target_id, &target_faces, &target_dirs);
1032 int const nb_target_faces = target_faces.size();
1034 assert(nb_faces == nb_target_faces);
1035 for (
int j = 0; j < nb_faces; ++j) {
1036 assert(faces[j] == target_faces[j]);
1040 for (
int i = 0; i < nb_faces; ++i) {
1043 source_mesh_.face_get_nodes(faces[i], &nodes);
1045 int const nb_face_nodes = nodes.size();
1046 int const nb_poly_nodes = 2 * nb_face_nodes;
1047 int const nb_poly_faces = nb_poly_nodes + 2;
1051 target_mesh_.face_get_nodes(target_faces[i], &target_nodes);
1052 int const nb_source_nodes = nodes.size();
1053 int const nb_target_nodes = target_nodes.size();
1055 assert(nb_source_nodes == nb_target_nodes);
1056 for (
int j = 0; j < nb_target_nodes; ++j) {
1057 assert(nodes[j] == target_nodes[j]);
1066 std::vector<Wonton::Point<3>> swept_poly_coords(nb_poly_nodes);
1067 std::vector<std::vector<int>> swept_poly_faces(nb_poly_faces);
1092 bool const outward_normal = dirs[i] > 0;
1094 for (
int current = 0; current < nb_face_nodes; ++current) {
1095 int const reverse = (nb_face_nodes - 1) - current;
1096 int const index = (outward_normal ? reverse : current);
1097 int const offset = current + nb_face_nodes;
1098 source_mesh_.node_get_coordinates(nodes[index], swept_poly_coords.data() + current);
1099 target_mesh_.node_get_coordinates(nodes[index], swept_poly_coords.data() + offset);
1108 for (
int current = 0; current < nb_poly_faces; ++current) {
1112 int const size = (current < 2 ? nb_face_nodes : 4);
1113 swept_poly_faces[current].resize(size);
1135 for (
int current = 0; current < nb_face_nodes; ++current) {
1137 swept_poly_faces[0][current] = current;
1138 swept_poly_faces[1][current] = nb_poly_nodes - current - 1;
1141 int const index = current + 2;
1142 swept_poly_faces[index][0] = current;
1143 swept_poly_faces[index][3] = (current + 1) % nb_face_nodes;
1144 swept_poly_faces[index][1] = swept_poly_faces[index][0] + nb_face_nodes;
1145 swept_poly_faces[index][2] = swept_poly_faces[index][3] + nb_face_nodes;
1149 auto moments = compute_moments(swept_poly_coords, swept_poly_faces);
1154 if (std::abs(moments[0]) < num_tols_.min_absolute_volume) {
1158 }
else if (moments[0] < 0.) {
1163 if (single_mat_src_cell) {
1165 swept_moments.emplace_back(source_id, moments);
1167 }
else if (source_cell_mat) {
1168 swept_moments.emplace_back(source_id,
1169 compute_face_group_moments(source_id, faces[i], moments[0]));
1174 int const neigh = source_mesh_.cell_get_face_adj_cell(source_id, faces[i]);
1181 if (!in_stencil(neigh)) {
1183 throw std::runtime_error(
"invalid stencil for source cell" +
id);
1187 int const adj_cell_nb_mats = source_state_.cell_get_num_mats(neigh);
1188 std::vector<int> adj_cellmats;
1189 source_state_.cell_get_mats(neigh, &adj_cellmats);
1194 bool const adj_cell_mat =
1195 (std::find(adj_cellmats.begin(), adj_cellmats.end(), material_id_) != adj_cellmats.end());
1196 bool const single_mat_adj_cell = !adj_cell_nb_mats || (material_id_ == -1) ||
1197 (adj_cell_nb_mats == 1 && adj_cell_mat);
1199 if (single_mat_adj_cell) {
1201 swept_moments.emplace_back(neigh, moments);
1209 swept_moments.emplace_back(neigh,
1210 compute_face_group_moments(neigh, faces[i], moments[0]));
1216 if (!displacement_check || valid_displacement(source_id, swept_moments)) {
1217 return swept_moments;
1219 throw std::runtime_error(
"invalid displacement");
1223 SourceMesh
const& source_mesh_;
1224 TargetMesh
const& target_mesh_;
1225 SourceState
const& source_state_;
1226 int material_id_ = -1;
1228 bool displacement_check =
false;
1230 std::shared_ptr<InterfaceReconstructor3D> interface_reconstructor;
1239 Entity_kind entity_kind,
1240 class SourceMesh,
class SourceState,
class TargetMesh,
1241 template<
class,
int,
class,
class>
1243 class Matpoly_Splitter = void,
class Matpoly_Clipper =
void 1246 SourceMesh, SourceState,
1248 InterfaceReconstructor,
1253 Entity_kind entity_kind,
1254 class SourceMesh,
class SourceState,
class TargetMesh,
1255 template<
class,
int,
class,
class>
1257 class Matpoly_Splitter = void,
class Matpoly_Clipper =
void 1260 SourceMesh, SourceState,
1262 InterfaceReconstructor,
Definition: dummy_interface_reconstructor.h:30
void toggle_displacement_check(bool enable)
Toggle target mesh displacement validity check.
Definition: intersect_swept_face.h:130
std::vector< T > vector
Definition: portage.h:238
void set_material(int m)
Set the material we are operating on.
Definition: intersect_swept_face.h:278
IntersectSweptFace & operator=(IntersectSweptFace const &other)=delete
Assignment operator (disabled).
Intersection and other tolerances to handle tiny values.
Definition: portage.h:152
Wonton::Point< OP::dim > centroid(const typename OP::points_t &apts)
Definition: operator.h:616
void set_material(int m)
Set the material we are operating on.
Definition: intersect_swept_face.h:124
~IntersectSweptFace()=default
Destructor.
IntersectSweptFace(SourceMesh const &source_mesh, SourceState const &source_state, TargetMesh const &target_mesh, NumericTolerances_t num_tols)
Constructor for single material case.
Definition: intersect_swept_face.h:250
void toggle_displacement_check(bool enable)
Toggle target mesh displacement validity check.
Definition: intersect_swept_face.h:383
Kernel to compute interpolation weights for swept-face remap.
Definition: intersect_swept_face.h:47
std::vector< Weights_t > operator()(int target_id, std::vector< int > const &stencil) const
Perform the actual swept faces volumes computation.
Definition: intersect_swept_face.h:162
void set_material(int m)
Set the material we are operating on.
Definition: intersect_swept_face.h:760
void toggle_displacement_check(bool enable)
Toggle target mesh displacement validity check.
Definition: intersect_swept_face.h:878
Definition: coredriver.h:42
IntersectSweptFace(SourceMesh const &source_mesh, SourceState const &source_state, TargetMesh const &target_mesh, NumericTolerances_t num_tols)
Constructor for single material case.
Definition: intersect_swept_face.h:96
std::vector< Weights_t > operator()(int target_id, std::vector< int > const &stencil) const
Perform the actual swept faces computation.
Definition: intersect_swept_face.h:471
std::vector< Weights_t > operator()(int target_id, std::vector< int > const &stencil) const
Perform the actual swept moments computation for the given cell.
Definition: intersect_swept_face.h:978
IntersectSweptFace(SourceMesh const &source_mesh, SourceState const &source_state, TargetMesh const &target_mesh, NumericTolerances_t num_tols)
Constructor for single material case.
Definition: intersect_swept_face.h:732
std::string to_string(Limiter_type limiter_type)
Definition: portage.h:96
IntersectSweptFace()=delete
Default constructor (disabled).