23 plucker_coordinates_abscissa_ =
nullptr;
24 plucker_coordinates_triangle_.resize(3,
nullptr);
25 plucker_products_.resize(3,
nullptr);
36 plucker_coordinates_abscissa_ =
new Plucker(*abscissa.
node(0),
37 *abscissa.
node(1),
true);
38 scale_line_=plucker_coordinates_abscissa_->scale();
40 plucker_coordinates_triangle_.resize(3);
41 plucker_products_.resize(3);
42 scale_triangle_=std::numeric_limits<double>::max();
43 for(
unsigned int side = 0; side < 3; side++){
47 scale_triangle_ = std::min( scale_triangle_, plucker_coordinates_triangle_[side]->scale());
50 plucker_products_[side] =
new double((*plucker_coordinates_abscissa_)*(*plucker_coordinates_triangle_[side]));
56 if(plucker_coordinates_abscissa_ !=
nullptr)
57 delete plucker_coordinates_abscissa_;
59 for(
unsigned int side = 0; side < RefElement<2>::n_sides; side++){
60 if(plucker_products_[side] !=
nullptr)
61 delete plucker_products_[side];
62 if(plucker_coordinates_triangle_[side] !=
nullptr)
63 delete plucker_coordinates_triangle_[side];
70 for(
unsigned int side = 0; side < RefElement<2>::n_sides; side++)
72 plucker_products_[side] =
nullptr;
73 plucker_coordinates_triangle_[side] =
nullptr;
75 plucker_coordinates_abscissa_ =
nullptr;
81 plucker_coordinates_abscissa_->compute();
82 scale_line_=plucker_coordinates_abscissa_->scale();
87 scale_triangle_=std::numeric_limits<double>::max();
89 for(
unsigned int side = 0; side < RefElement<2>::n_sides; side++){
90 plucker_coordinates_triangle_[side]->compute();
91 scale_triangle_ = std::min( scale_triangle_, plucker_coordinates_triangle_[side]->scale());
93 ASSERT_DBG(plucker_products_[side]).error(
"Undefined plucker product.");
95 *plucker_products_[side] = (*plucker_coordinates_abscissa_)*(*plucker_coordinates_triangle_[side]);
108 int sign = (t < tol ? -2 : (t > 1+tol ? +2 : 0) );
109 if (std::abs(t) <= tol){
113 else if (std::abs(1-t) <= tol){
142 (local[0])(local[1])(local[2]);
146 arma::vec3 local_triangle({local[2],local[1],local[0]});
152 arma::vec3 u = plucker_coordinates_abscissa_->get_u_vector();
157 if(fabs((
double)u[1]) > fabs(max)){ max = u[1]; i = 1;}
158 if(fabs((
double)u[2]) > fabs(max)){ max = u[2]; i = 2;}
161 double isect_coord_i =
167 double t = (-plucker_coordinates_abscissa_->point(0)[i] + isect_coord_i)/max;
169 arma::vec2 local_abscissa = {1-t, t};
188 compute_plucker_products();
197 signed_plucker_product(1),
198 signed_plucker_product(2)};
199 double w_sum = w[0] + w[1] + w[2];
201 unsigned int n_positive = 0;
202 unsigned int n_negative = 0;
203 unsigned int zero_idx_sum =0;
208 double scaled_epsilon =
geometry_epsilon*scale_line_*scale_triangle_*scale_triangle_;
209 if(std::fabs(w_sum) > scaled_epsilon) {
211 for (
unsigned int i=0; i < 3; i++) {
226 for (
unsigned int i=0; i < 3; i++) {
228 if (w[i] > scaled_epsilon || w[i] < -scaled_epsilon) n_negative++;
240 if (n_positive > 0) {
242 compute_plucker(IP, w);
244 unsigned int non_zero_idx=0;
245 if (n_positive == 2) {
249 non_zero_idx = (zero_idx_sum + 1) % 3;
251 else if (n_positive == 1) {
255 non_zero_idx = 3-zero_idx_sum;
283 int sign = check_abscissa_topology(IP);
285 if(std::abs(sign) > 1)
return 0;
293 return compute_final_in_plane(IP12s);
321 arma::vec3 A = plucker_coordinates_abscissa_->point(0);
323 arma::vec3 U = plucker_coordinates_abscissa_->get_u_vector();
327 arma::vec3 V = plucker_coordinates_triangle_[side]->get_u_vector();
345 unsigned int max_index = 0;
346 double maximum = fabs(Det[0]);
347 if(fabs((
double)Det[1]) > maximum){
348 maximum = fabs(Det[1]);
351 if(fabs((
double)Det[2]) > maximum){
352 maximum = fabs(Det[2]);
366 unsigned int i = (max_index+1)%3,
369 double DetX = -K[i]*V[j] + K[j]*V[i];
370 double DetY = -K[i]*U[j] + K[j]*U[i];
372 double s = DetX/Det[max_index];
373 double t = DetY/Det[max_index];
384 if(t >= -tol && t <= 1+tol){
393 arma::vec2 local_abscissa({1-s, s});
414 for(
unsigned int i = 0; i < 3;i++){
416 if(IP12s.size() == 2)
break;
419 if (compute_degenerate(i,IP))
421 uint s = check_abscissa_topology(IP);
430 if(IP12s.size() == 0)
return IP12s.size();
433 if(IP12s.size() == 1){
434 if(std::abs(sign[0]) > 1) IP12s.pop_back();
447 if (sign[0] == sign[1] && std::abs(sign[0]) > 1) {
453 if(IP12s[0].local_bcoords_A()[1] > IP12s[1].local_bcoords_A()[1]){
459 const int ip_sign[] = {-2, +2};
460 for(
unsigned int ip=0; ip<2; ip++) {
462 if (sign[ip] == ip_sign[ip]) {
464 correct_triangle_ip_topology(
double(ip), ip, IP12s);
465 IP12s[ip].set_topology_A(ip, 0);
470 if(IP12s[0].topology_equal(IP12s[1])){
482 ips[0].local_bcoords_B(), ips[1].local_bcoords_B(),
483 ips[0].local_bcoords_A()[1], ips[1].local_bcoords_A()[1], t);
484 arma::vec2 local_abscissa({1 - t, t});
485 ips[ip].set_coordinates(local_abscissa, local_tria);
490 std::pair<unsigned int, unsigned int> zeros =
503 default: ips[ip].set_topology_B(0,2);
514 os <<
"\tPluckerCoordinates Abscissa[0]";
515 if(plucker_coordinates_abscissa_ ==
nullptr){
516 os <<
"NULL" << endl;
518 os << plucker_coordinates_abscissa_;
520 for(
unsigned int i = 0; i < 3;i++){
521 os <<
"\tPluckerCoordinates Triangle[" << i <<
"]";
522 if(plucker_coordinates_triangle_[i] ==
nullptr){
523 os <<
"NULL" << endl;
525 os << plucker_coordinates_triangle_[i];
551 for(
unsigned int side = 0; side < RefElement<2>::n_sides; side++){
560 for(
unsigned int p = 0; p < 3*RefElement<2>::n_sides; p++){
568 for(
unsigned int side = 0; side < 2*RefElement<2>::n_sides; side++)
569 CI12[side].clear_all();
572 for(
unsigned int side = 0; side < 2*RefElement<2>::n_sides; side++){
573 if(plucker_coordinates_[side] !=
nullptr)
574 delete plucker_coordinates_[side];
577 for(
unsigned int p = 0; p < 3*RefElement<2>::n_sides; p++){
578 if(plucker_products_[p] !=
nullptr)
579 delete plucker_products_[p];
586 for(
unsigned int side = 0; side < 2*RefElement<2>::n_sides; side++)
588 plucker_coordinates_[side] =
nullptr;
590 for(
unsigned int p = 0; p < 3*RefElement<2>::n_sides; p++){
591 plucker_products_[p] =
nullptr;
598 for(
unsigned int i = 0; i < RefElement<2>::n_sides; i++){
600 for(
unsigned int j = 0; j < RefElement<2>::n_sides; j++)
601 CI12[i].set_pc_triangle(plucker_coordinates_[3+j], j);
603 CI12[i].set_pc_abscissa(plucker_coordinates_[i]);
606 for(
unsigned int j = 0; j < RefElement<2>::n_sides; j++)
612 for(
unsigned int j = 0; j < RefElement<2>::n_sides; j++)
615 CI12[i].set_plucker_product(get_plucker_product(i,j),j);
631 unsigned int ip_coutner = 0;
634 for(
unsigned int i = 0; i < 2*RefElement<2>::n_sides && ip_coutner < 2; i++){
635 if(!CI12[i].is_computed())
638 if(CI12[i].compute_final(IP12s) == 0)
continue;
640 unsigned int triangle_side = i%3;
644 IPAux22 IP22(IP.switch_objects(), triangle_side);
650 if( IP22.
dim_A() == 0 )
657 for(
unsigned int s=0; s < RefElement<2>::n_sides_per_node; s++)
660 if( IP22.
dim_B() == 0 )
664 for(
unsigned int s=0; s < RefElement<2>::n_sides_per_node; s++)
667 else if( IP22.
dim_B() == 1 )
671 CI12[3 + IP22.
idx_B()].set_computed();
674 else if( IP22.
dim_B() == 0 )
682 for(
unsigned int s=0; s < RefElement<2>::n_sides_per_node; s++)
687 IP22s.push_back(IP22);
725 for(
unsigned int i = 0; i < RefElement<2>::n_lines; i++){
726 os <<
"\tPluckerCoordinates Triangle A[" << i <<
"]";
727 if(plucker_coordinates_[i] ==
nullptr){
728 os <<
"NULL" << endl;
730 os << plucker_coordinates_[i];
733 for(
unsigned int i = 0; i < RefElement<2>::n_lines; i++){
734 os <<
"\tPluckerCoordinates Triangle B[" << i <<
"]";
736 os <<
"NULL" << endl;
738 os << plucker_coordinates_[RefElement<2>::n_lines + i];
744 os <<
"ComputeIntersection<2,2> Plucker Coordinates Tree:" << endl;
745 print_plucker_coordinates(os);
746 for(
unsigned int i = 0; i < 6;i++){
747 os <<
"ComputeIntersection<1,2>["<< i <<
"] Plucker Coordinates:" << endl;
748 CI12[i].print_plucker_coordinates(os);
758 plucker_coordinates_abscissa_ =
nullptr;
759 plucker_coordinates_tetrahedron.resize(6,
nullptr);
760 plucker_products_.resize(6,
nullptr);
770 "Tetrahedron element (%d) has wrong numbering or is degenerated (negative Jacobian).");
773 plucker_coordinates_abscissa_ =
new Plucker(*abscissa.
node(0), *abscissa.
node(1));
774 plucker_coordinates_tetrahedron.resize(6);
775 plucker_products_.resize(6);
777 for(
unsigned int line = 0; line < RefElement<3>::n_lines; line++){
788 for(
unsigned int side = 0; side < RefElement<3>::n_sides; side++)
789 CI12[side].clear_all();
792 if(plucker_coordinates_abscissa_ !=
nullptr)
793 delete plucker_coordinates_abscissa_;
795 for(
unsigned int line = 0; line < RefElement<3>::n_lines; line++){
796 if(plucker_products_[line] !=
nullptr)
797 delete plucker_products_[line];
798 if(plucker_coordinates_tetrahedron[line] !=
nullptr)
799 delete plucker_coordinates_tetrahedron[line];
806 for(
unsigned int side = 0; side < RefElement<3>::n_lines; side++)
808 plucker_products_[side] =
nullptr;
809 plucker_coordinates_tetrahedron[side] =
nullptr;
811 plucker_coordinates_abscissa_ =
nullptr;
817 for(
unsigned int side = 0; side < RefElement<3>::n_sides; side++){
818 for(
unsigned int line = 0; line < RefElement<3>::n_lines_per_side; line++){
819 CI12[side].set_pc_triangle(plucker_coordinates_tetrahedron[
822 CI12[side].set_plucker_product(
826 CI12[side].set_pc_abscissa(plucker_coordinates_abscissa_);
844 for(
unsigned int face = 0; face < RefElement<3>::n_sides && IP13s.size() < 2; face++){
846 if (CI12[face].is_computed())
continue;
854 position_on_abscissa.push_back(CI12[face].check_abscissa_topology(IP12));
856 IPAux IP13(IP12, face);
858 IP13s.push_back(IP13);
861 if(IP13.
dim_B() == 0)
865 CI12[node_face].set_computed();
867 else if(IP13.
dim_B() == 1)
870 CI12[edge_face].set_computed();
874 if (IP13s.size() == 0)
return IP13s.size();
877 if(IP13s.size() == 1){
878 if(std::abs(position_on_abscissa[0]) > 1) IP13s.pop_back();
886 if (position_on_abscissa[0] == position_on_abscissa[1] && std::abs(position_on_abscissa[0]) > 1) {
892 if(IP13s[0].local_bcoords_A()[1] > IP13s[1].local_bcoords_A()[1]){
894 std::swap(position_on_abscissa[0], position_on_abscissa[1]);
898 const int ip_sign[] = {-2, +2};
899 for(
unsigned int ip=0; ip<2; ip++) {
901 if (position_on_abscissa[ip] == ip_sign[ip]) {
902 position_on_abscissa[ip] /=2;
903 correct_tetrahedron_ip_topology(
double(ip), ip, IP13s);
904 IP13s[ip].set_topology_A(ip, 0);
909 if(IP13s[0].topology_equal(IP13s[1])){
920 ips[0].local_bcoords_B(), ips[1].local_bcoords_B(),
921 ips[0].local_bcoords_A()[1], ips[1].local_bcoords_A()[1], t);
922 arma::vec2 local_abscissa({1 - t, t});
923 ips[ip].set_coordinates(local_abscissa, local_tetra);
928 unsigned int zeros = 0;
929 unsigned int n_zeros = 0;
930 for(
char i=0; i < 4; i++){
933 zeros = zeros | (1 << i);
947 default: ips[ip].set_topology_B(0,3);
960 os <<
"\tPluckerCoordinates Abscissa[0]";
961 if(plucker_coordinates_abscissa_ ==
nullptr){
962 os <<
"NULL" << endl;
964 os << plucker_coordinates_abscissa_;
967 for(
unsigned int i = 0; i < 6;i++){
968 os <<
"\tPluckerCoordinates Tetrahedron[" << i <<
"]";
969 if(plucker_coordinates_tetrahedron[i] ==
nullptr){
970 os <<
"NULL" << endl;
972 os << plucker_coordinates_tetrahedron[i];
978 os <<
"ComputeIntersection<1,3> Plucker Coordinates Tree:" << endl;
979 print_plucker_coordinates(os);
980 for(
unsigned int i = 0; i < 4;i++){
981 os <<
"ComputeIntersection<1,2>["<< i <<
"] Plucker Coordinates:" << endl;
982 CI12[i].print_plucker_coordinates(os);
993 s3_dim_starts({0, 4, 10, 14}),
994 s2_dim_starts({15, 18, 21}),
995 object_next(22, no_idx),
996 on_faces(_on_faces())
999 plucker_coordinates_triangle_.resize(3,
nullptr);
1000 plucker_coordinates_tetrahedron.resize(6,
nullptr);
1001 plucker_products_.resize(3*6,
nullptr);
1011 (tetrahedron.
sign())(tetrahedron.
jacobian_S3()).add_value(tetrahedron.
index(),
"element index").error(
1012 "Tetrahedron element (%d) has wrong numbering or is degenerated (negative Jacobian).");
1015 plucker_coordinates_triangle_.resize(3);
1016 plucker_coordinates_tetrahedron.resize(6);
1019 for(
unsigned int i = 0; i < RefElement<3>::n_lines; i++){
1024 for(
unsigned int i = 0; i < RefElement<2>::n_lines;i++){
1033 plucker_products_.resize(np,
nullptr);
1034 for(
unsigned int line = 0; line < np; line++){
1043 for(
unsigned int triangle_side = 0; triangle_side < RefElement<2>::n_sides; triangle_side++)
1044 CI13[triangle_side].clear_all();
1046 for(
unsigned int line = 0; line < RefElement<3>::n_lines; line++)
1047 CI12[line].clear_all();
1051 for(
unsigned int line = 0; line < np; line++){
1052 if(plucker_products_[line] !=
nullptr)
1053 delete plucker_products_[line];
1056 for(
unsigned int i = 0; i < RefElement<3>::n_lines;i++){
1057 if(plucker_coordinates_tetrahedron[i] !=
nullptr)
1058 delete plucker_coordinates_tetrahedron[i];
1060 for(
unsigned int i = 0; i < RefElement<2>::n_sides;i++){
1061 if(plucker_coordinates_triangle_[i] !=
nullptr)
1062 delete plucker_coordinates_triangle_[i];
1071 for(
unsigned int triangle_side = 0; triangle_side < RefElement<2>::n_sides; triangle_side++){
1072 for(
unsigned int line = 0; line < RefElement<3>::n_lines; line++){
1073 CI13[triangle_side].set_plucker_product(
1076 CI12[line].set_plucker_product(
1080 CI13[triangle_side].set_pc_tetrahedron(plucker_coordinates_tetrahedron[line],line);
1081 CI12[line].set_pc_triangle(plucker_coordinates_triangle_[triangle_side],triangle_side);
1083 CI13[triangle_side].set_pc_abscissa(plucker_coordinates_triangle_[triangle_side]);
1084 CI13[triangle_side].init();
1088 for(
unsigned int line = 0; line < RefElement<3>::n_lines; line++)
1089 CI12[line].set_pc_abscissa(plucker_coordinates_tetrahedron[line]);
1097 unsigned int ip = object_next[i_obj];
1098 if (ip == no_idx)
return false;
1100 return IP_next[ip] == i_obj;
1108 if (have_backlink(obj_after_ip)) {
1113 unsigned int ip = object_next[obj_after_ip];
1115 (mesh_->element_accessor(intersection_->component_ele_idx()).idx())
1116 (mesh_->element_accessor(intersection_->bulk_ele_idx()).idx())
1121 (object_next[obj_after_ip]);
1124 object_next[obj_before_ip] = ip_idx;
1125 IP_next.push_back( obj_after_ip);
1126 if (object_next[obj_after_ip] == no_idx) {
1127 object_next[obj_after_ip] = ip_idx;
1135 S3_inverted = mesh_->element_accessor(intersection.
bulk_ele_idx()).inverted();
1136 intersection_= &intersection;
1143 std::fill(object_next.begin(), object_next.end(), no_idx);
1146 std::array<bool, 6> edge_touch={
false,
false,
false,
false,
false,
false};
1147 unsigned int object_before_ip, object_after_ip;
1166 for(
unsigned int _i_side = 0; _i_side < RefElement<2>::n_lines; _i_side++) {
1167 unsigned int i_side = cycle_sides[_i_side];
1169 CI13[ i_side ].compute(IP13s);
1171 if (IP13s.size() == 0)
continue;
1172 for(
unsigned int _ip=0; _ip < IP13s.size(); _ip++) {
1176 unsigned int ip = (side_cycle_orientation[_i_side] + _ip) % IP13s.size();
1187 unsigned int tetra_object = s3_dim_starts[IP23.
dim_B()] + IP23.
idx_B();
1188 unsigned int side_object = s2_dim_starts[1] + i_side;
1190 object_before_ip = tetra_object;
1191 object_after_ip = side_object;
1199 object_before_ip = s2_dim_starts[0] + IP23.
idx_A();
1203 if (IP13s.size() == 1 ) {
1204 if (IP23.
dim_B() == 0) {
1207 if (IP23.
dim_A() == 0) {
1208 object_before_ip = tetra_object;
1209 object_after_ip = s2_dim_starts[0]+IP23.
idx_A();
1219 edge_touch[IP23.
idx_B()]=
true;
1220 std::swap(object_before_ip, object_after_ip);
1224 unsigned int ip_idx = add_ip(IP23);
1228 set_links(object_before_ip, ip_idx, object_after_ip);
1248 for(
unsigned int tetra_edge = 0; tetra_edge < 6; tetra_edge++) {
1250 CI12[tetra_edge].compute(IP12);
1254 IP12s_.push_back(IP12);
1258 for(
unsigned int tetra_edge = 0; tetra_edge < 6;tetra_edge++) {
1259 if (! processed_edge[tetra_edge]) {
1261 IPAux12 &IP12 = IP12s_[tetra_edge];
1264 int sign = CI12[tetra_edge].check_abscissa_topology(IP12);
1266 if(std::abs(sign) > 1)
continue;
1268 IPAux23 IP23(IP12s_[tetra_edge].switch_objects(), tetra_edge);
1274 unsigned int ip_idx = add_ip(IP23);
1277 if ( edge_dim == 0) {
1278 face_pair = vertex_faces(i_edge);
1281 processed_edge[ie] = 1;
1284 face_pair = edge_faces(i_edge);
1290 unsigned int s3_object = s3_dim_starts[edge_dim] + i_edge;
1293 if (IP23.
dim_A() < 2
1294 && (! edge_touch[i_edge])
1295 && object_next[s3_object] != no_idx) {
1297 if ( have_backlink(s3_object) ) {
1298 set_links(s3_object, ip_idx, face_pair[1]);
1300 set_links(face_pair[0], ip_idx, s3_object);
1305 set_links(face_pair[0], ip_idx, face_pair[1]);
1307 if ( have_backlink(s3_object) ) {
1308 object_next[s3_object]=ip_idx;
1318 if (IP23_list.size() == 0)
return;
1324 for(
auto obj : IP_next) {
1326 unsigned int ip = object_next[obj];
1327 if (ip < IP_next.size()) have_predecessor[ip]=1;
1329 unsigned int ip_init=0;
1330 for(
unsigned int i=0; i< IP23_list.size(); i++)
if (! have_predecessor[i]) ip_init=i;
1333 arma::uvec::fixed<RefElement<3>::n_sides> ips_face_counter;
1334 ips_face_counter.zeros();
1337 unsigned int ip=ip_init;
1339 intersection.
points().push_back(IP23_list[ip]);
1344 unsigned int object = IP_next[ip];
1347 ip = object_next[object];
1348 object_next[object]=no_idx;
1349 if ((ip == no_idx))
break;
1352 if ( ! IP23_list[ip].topology_equal(intersection.
points().back()) ) {
1355 intersection.
points().push_back(IP);
1357 ips_face_counter += on_faces[IP.
dim_B()][IP.
idx_B()];
1361 if (intersection.
points().size() == 1)
return;
1363 if (IP23_list[ip_init].topology_equal(intersection.
points().back()) )
1364 intersection.
points().pop_back();
1366 if (intersection.
points().size() > 2){
1367 for(
uint i=0; i< ips_face_counter.n_elem; i++){
1368 if(ips_face_counter(i) >= intersection.
points().size()){
1380 unsigned int ip_ori = (
unsigned int)(IP12s_[i_edge].result());
1387 return { s3_dim_starts[2] + line_faces[1-ip_ori], s3_dim_starts[2] + line_faces[ip_ori] };
1394 std::array<unsigned int, 3> n_ori, sum_idx;
1397 for(
unsigned int ie=0; ie <3; ie++) {
1398 unsigned int edge_ip_ori = (
unsigned int)(IP12s_[ vtx_edges[ie]].result());
1401 edge_ip_ori = (edge_ip_ori +1)%2;
1403 if (edge_ip_ori == 3) edge_ip_ori=2;
1404 n_ori[edge_ip_ori]++;
1405 sum_idx[edge_ip_ori]+=ie;
1412 if ( n_degen == 2 ) {
1416 unsigned int i_edge = 3 - sum_degen;
1417 FacePair pair = edge_faces(vtx_edges[i_edge]);
1420 if (pair[0] == s3_dim_starts[2] + vtx_faces[(i_edge+1)%3])
1421 return { s3_dim_starts[1] + (i_edge+2)%3, s3_dim_starts[1] + (i_edge+1)%3 };
1423 return { s3_dim_starts[1] + (i_edge+1)%3, s3_dim_starts[1] + (i_edge+2)%3 };
1425 }
else if (n_degen == 1) {
1427 unsigned int i_edge = sum_degen;
1429 if ( n_positive == 1) {
1432 FacePair pair = edge_faces(vtx_edges[(i_edge+1)%3]);
1437 if (pair[0] == s3_dim_starts[2] + face)
1438 return { s3_dim_starts[2] + face, s3_dim_starts[1] + vtx_edges[i_edge]};
1440 return { s3_dim_starts[1] + vtx_edges[i_edge], s3_dim_starts[2] + face };
1445 ASSERT_DBG(n_positive == 0 || n_positive== 2);
1446 return { s3_dim_starts[0]+i_vertex, s3_dim_starts[1] + vtx_edges[i_edge]};
1454 if (n_positive == 1) {
1456 return edge_faces(vtx_edges[i_edge]);
1457 }
else if (n_negative == 1) {
1459 return edge_faces(vtx_edges[i_edge]);
1462 ASSERT_DBG( n_positive == 0 || n_positive == 3);
1463 return { s3_dim_starts[0]+i_vertex, s3_dim_starts[0]+i_vertex};
1474 arma::uvec::fixed<RefElement<3>::n_sides> v; v.zeros();
1477 for(
uint i=0; i<RefElement<3>::n_nodes; i++) {
1479 for(
uint j=0; j<RefElement<3>::n_sides_per_node; j++)
1480 on_faces[0][i](faces[j]) = 1;
1484 for(
uint i=0; i<RefElement<3>::n_lines; i++) {
1486 for(
uint j=0; j<RefElement<3>::n_sides_per_line; j++)
1487 on_faces[1][i](faces[j]) = 1;
1491 for(
uint i=0; i<RefElement<3>::n_sides; i++) {
1492 on_faces[2][i](i) = 1;
1507 for(
unsigned int i = 0; i < 3;i++){
1508 os <<
"\tPluckerCoordinates Triangle[" << i <<
"]";
1509 if(plucker_coordinates_triangle_[i] ==
nullptr){
1510 os <<
"NULL" << endl;
1512 os << plucker_coordinates_triangle_[i];
1515 for(
unsigned int i = 0; i < 6;i++){
1516 os <<
"\tPluckerCoordinates Tetrahedron[" << i <<
"]";
1517 if(plucker_coordinates_tetrahedron[i] ==
nullptr){
1518 os <<
"NULL" << endl;
1520 os << plucker_coordinates_tetrahedron[i];
1526 os <<
"ComputeIntersection<2,3> Plucker Coordinates Tree:" << endl;
1527 print_plucker_coordinates(os);
1528 for(
unsigned int i = 0; i < 6;i++){
1529 os <<
"ComputeIntersection<1,2>["<< i <<
"] Plucker Coordinates:" << endl;
1530 CI12[i].print_plucker_coordinates(os);
1532 for(
unsigned int i = 0; i < 3;i++){
1533 CI13[i].print_plucker_coordinates_tree(os);