31 #ifndef OOMPH_HERMITE_QUAD_MESH_TEMPLATE_CC 32 #define OOMPH_HERMITE_QUAD_MESH_TEMPLATE_CC 37 #include <oomph-lib-config.h> 53 template<
class ELEMENT>
55 const unsigned& node_num_y,
61 generalised_macro_element_position_of_node(node_num_x,node_num_y,m_gen);
65 node_macro_position[0] = m_gen(0,0);
66 node_macro_position[1] = m_gen(0,1);
70 Domain_pt->macro_element_pt(0)->macro_map(node_macro_position,x_node);
74 Domain_pt->macro_element_pt(0)->
75 assemble_macro_to_eulerian_jacobian(node_macro_position,jacobian_MX);
80 Domain_pt->macro_element_pt(0)->
81 assemble_macro_to_eulerian_jacobian2(node_macro_position,jacobian2_MX);
84 node_pt->
x_gen(0,0) = x_node[0];
86 node_pt->
x_gen(0,1) = x_node[1];
90 for (
unsigned i = 0;
i < 2;
i++)
92 for (
unsigned j = 0; j < 2; j++)
94 node_pt->
x_gen(j+1,
i) = m_gen(j+1,0)*jacobian_MX(0,
i)
95 + m_gen(j+1,1)*jacobian_MX(1,
i);
104 for (
unsigned i = 0;
i < 2;
i++)
106 node_pt->
x_gen(3,
i) = m_gen(3,0)*jacobian_MX(0,
i)
107 + m_gen(3,1)*jacobian_MX(1,
i)
108 + m_gen(1,0)*(m_gen(2,0)*jacobian2_MX(0,
i) +
109 m_gen(2,1)*jacobian2_MX(2,
i))
110 + m_gen(1,1)*(m_gen(2,0)*jacobian2_MX(2,
i) +
111 m_gen(2,1)*jacobian2_MX(1,
i));
123 template<
class ELEMENT>
126 const unsigned& node_num_y,
132 generalised_macro_element_position_of_node(node_num_x,node_num_y,m_gen);
136 node_macro_position[0] = m_gen(0,0);
137 node_macro_position[1] = m_gen(0,1);
141 Domain_pt->macro_element_pt(0)->macro_map(node_macro_position,x_node);
145 Domain_pt->macro_element_pt(0)->
146 assemble_macro_to_eulerian_jacobian(node_macro_position,jacobian_MX);
150 Domain_pt->macro_element_pt(0)->
151 assemble_macro_to_eulerian_jacobian2(node_macro_position,jacobian2_MX);
154 node_pt->x_gen(0,0) = x_node[0];
156 node_pt->x_gen(0,1) = x_node[1];
160 for (
unsigned i = 0;
i < 2;
i++)
162 for (
unsigned j = 0; j < 2; j++)
164 node_pt->x_gen(j+1,
i) = m_gen(j+1,0)*jacobian_MX(0,
i)
165 + m_gen(j+1,1)*jacobian_MX(1,
i);
174 for (
unsigned i = 0;
i < 2;
i++)
176 node_pt->x_gen(3,
i) = m_gen(3,0)*jacobian_MX(0,
i)
177 + m_gen(3,1)*jacobian_MX(1,
i)
178 + m_gen(1,0)*(m_gen(2,0)*jacobian2_MX(0,
i) +
179 m_gen(2,1)*jacobian2_MX(2,
i))
180 + m_gen(1,1)*(m_gen(2,0)*jacobian2_MX(2,
i) +
181 m_gen(2,1)*jacobian2_MX(1,
i));
187 for (
unsigned b = 0; b < 4; b++)
192 boundary_macro_position[0] = m_gen(0,b%2);
193 boundary_macro_position[1] = m_gen(1+b%2,b%2);
208 template<
class ELEMENT>
210 (
const unsigned& node_num_x,
const unsigned& node_num_y,
215 macro_coordinate_position(node_num_x,node_num_y,s_macro_N);
218 m_gen(0,0) = s_macro_N[0];
219 m_gen(0,1) = s_macro_N[1];
229 macro_coordinate_position(node_num_x+1,node_num_y,s_macro_R);
232 m_gen(1,0) = 0.5*(s_macro_R[0]-s_macro_N[0]);
235 m_gen(1,1) = 0.5*(s_macro_R[1]-s_macro_N[1]);
245 macro_coordinate_position(node_num_x+1,node_num_y+1,s_macro_UR);
249 macro_coordinate_position(node_num_x,node_num_y+1,s_macro_U);
252 m_gen(3,0) = 0.5 * (0.5*(s_macro_UR[0] - s_macro_U[0]) - m_gen(1,0));
255 m_gen(3,1) = 0.5 * (0.5*(s_macro_UR[1] - s_macro_U[1]) - m_gen(1,1));
259 else if (node_num_y == Nelement[1])
264 macro_coordinate_position(node_num_x+1,node_num_y-1,s_macro_DR);
268 macro_coordinate_position(node_num_x,node_num_y-1,s_macro_D);
271 m_gen(3,0) = 0.5 * (m_gen(1,0) - 0.5*(s_macro_DR[0]-s_macro_D[0]));
274 m_gen(3,1) = 0.5 * (m_gen(1,1) - 0.5*(s_macro_DR[1]-s_macro_D[1]));
283 macro_coordinate_position(node_num_x+1,node_num_y-1,s_macro_DR);
287 macro_coordinate_position(node_num_x,node_num_y-1,s_macro_D);
291 macro_coordinate_position(node_num_x+1,node_num_y+1,s_macro_UR);
295 macro_coordinate_position(node_num_x,node_num_y+1,s_macro_U);
298 m_gen(3,0) = 0.5*std::min(m_gen(1,0)-0.5*(s_macro_DR[0]-s_macro_D[0]),
299 0.5*(s_macro_UR[0]-s_macro_U[0])-m_gen(1,0));
302 m_gen(3,1) = 0.5*std::min(m_gen(1,1)-0.5*(s_macro_DR[1]-s_macro_D[1]),
303 0.5*(s_macro_UR[1]-s_macro_U[1])-m_gen(1,1));
308 else if (node_num_x == Nelement[0])
315 macro_coordinate_position(node_num_x-1,node_num_y,s_macro_L);
318 m_gen(1,0) = 0.5*(s_macro_N[0]-s_macro_L[0]);
321 m_gen(1,1) = 0.5*(s_macro_N[1]-s_macro_L[1]);
331 macro_coordinate_position(node_num_x-1,node_num_y+1,s_macro_UL);
335 macro_coordinate_position(node_num_x,node_num_y+1,s_macro_U);
338 m_gen(3,0) = 0.5 * (0.5*(s_macro_U[0] - s_macro_UL[0]) - m_gen(1,0));
341 m_gen(3,1) = 0.5 * (0.5*(s_macro_U[1] - s_macro_UL[1]) - m_gen(1,1));
345 else if (node_num_y == Nelement[1])
350 macro_coordinate_position(node_num_x-1,node_num_y-1,s_macro_DL);
354 macro_coordinate_position(node_num_x,node_num_y-1,s_macro_D);
357 m_gen(3,0) = 0.5 * (m_gen(1,0) - 0.5*(s_macro_D[0]-s_macro_DL[0]));
360 m_gen(3,1) = 0.5 * (m_gen(1,1) - 0.5*(s_macro_D[1]-s_macro_DL[1]));
370 macro_coordinate_position(node_num_x-1,node_num_y-1,s_macro_DL);
374 macro_coordinate_position(node_num_x,node_num_y-1,s_macro_D);
378 macro_coordinate_position(node_num_x-1,node_num_y+1,s_macro_UL);
382 macro_coordinate_position(node_num_x,node_num_y+1,s_macro_U);
385 m_gen(3,0) = 0.5*std::min(m_gen(1,0)-0.5*(s_macro_D[0]-s_macro_DL[0]),
386 0.5*(s_macro_U[0]-s_macro_UL[0])-m_gen(1,0));
389 m_gen(3,1) = 0.5*std::min(m_gen(1,1)-0.5*(s_macro_D[1]-s_macro_DL[1]),
390 0.5*(s_macro_U[1]-s_macro_UL[1])-m_gen(1,1));
398 macro_coordinate_position(node_num_x-1,node_num_y,s_macro_L);
402 macro_coordinate_position(node_num_x+1,node_num_y,s_macro_R);
405 m_gen(1,0) = 0.5*std::min(s_macro_N[0]-s_macro_L[0],
406 s_macro_R[0]-s_macro_N[0]);
410 node_space[0] = s_macro_N[1]-s_macro_L[1];
411 node_space[1] = s_macro_R[1]-s_macro_N[1];
413 if (node_space[0] > 0 && node_space[1] > 0)
414 m_gen(1,1) = 0.5 * std::min(node_space[0],node_space[1]);
415 else if (node_space[0] < 0 && node_space[1] < 0)
416 m_gen(1,1) = 0.5 * std::max(node_space[0],node_space[1]);
429 macro_coordinate_position(node_num_x,node_num_y+1,s_macro_U);
432 m_gen(2,0) = 0.5*(s_macro_U[0]-s_macro_N[0]);
435 m_gen(2,1) = 0.5*(s_macro_U[1]-s_macro_N[1]);
438 if (node_num_x > 0 && node_num_x < Nelement[0])
445 macro_coordinate_position(node_num_x-1,node_num_y+1,s_macro_UL);
449 macro_coordinate_position(node_num_x-1,node_num_y,s_macro_L);
453 macro_coordinate_position(node_num_x+1,node_num_y,s_macro_R);
457 macro_coordinate_position(node_num_x+1,node_num_y+1,s_macro_UR);
460 m_gen(3,0) = 0.5*std::min(m_gen(2,0)-0.5*(s_macro_UL[0]-s_macro_L[0]),
461 0.5*(s_macro_UR[0]-s_macro_R[0])-m_gen(2,0));
464 m_gen(3,1) = 0.5*std::min(m_gen(2,1)-0.5*(s_macro_UL[1]-s_macro_L[1]),
465 0.5*(s_macro_UR[1]-s_macro_R[1])-m_gen(2,1));
471 else if (node_num_y == Nelement[1])
478 macro_coordinate_position(node_num_x,node_num_y-1,s_macro_D);
481 m_gen(2,0) = 0.5*(s_macro_N[0]-s_macro_D[0]);
484 m_gen(2,1) = 0.5*(s_macro_N[1]-s_macro_D[1]);
487 if (node_num_x > 0 && node_num_x < Nelement[0])
494 macro_coordinate_position(node_num_x-1,node_num_y-1,s_macro_DL);
498 macro_coordinate_position(node_num_x-1,node_num_y,s_macro_L);
502 macro_coordinate_position(node_num_x+1,node_num_y,s_macro_R);
506 macro_coordinate_position(node_num_x+1,node_num_y-1,s_macro_DR);
509 m_gen(3,0) = 0.5*std::min(m_gen(2,0)-0.5*(s_macro_L[0]-s_macro_DL[0]),
510 0.5*(s_macro_R[0]-s_macro_DR[0])-m_gen(2,0));
513 m_gen(3,1) = 0.5*std::min(m_gen(2,1)-0.5*(s_macro_L[1]-s_macro_DL[1]),
514 0.5*(s_macro_R[1]-s_macro_DR[1])-m_gen(2,1));
522 macro_coordinate_position(node_num_x,node_num_y+1,s_macro_U);
526 macro_coordinate_position(node_num_x,node_num_y-1,s_macro_D);
530 node_space[0] = s_macro_N[0]-s_macro_D[0];
531 node_space[1] = s_macro_U[0]-s_macro_N[0];
533 if (node_space[0] > 0 && node_space[1] > 0)
534 m_gen(2,0) = 0.5 * std::min(node_space[0],node_space[1]);
535 else if (node_space[0] < 0 && node_space[1] < 0)
536 m_gen(2,0) = 0.5 * std::max(node_space[0],node_space[1]);
541 m_gen(2,1) = 0.5*std::min(s_macro_N[1]-s_macro_D[1],
542 s_macro_U[1]-s_macro_N[1]);
545 if (node_num_x > 0 && node_num_x < Nelement[0])
550 macro_coordinate_position(node_num_x-1,node_num_y,s_macro_L);
554 macro_coordinate_position(node_num_x-1,node_num_y+1,s_macro_UL);
558 macro_coordinate_position(node_num_x+1,node_num_y+1,s_macro_UR);
562 macro_coordinate_position(node_num_x+1,node_num_y,s_macro_R);
566 macro_coordinate_position(node_num_x+1,node_num_y-1,s_macro_DR);
570 macro_coordinate_position(node_num_x-1,node_num_y-1,s_macro_DL);
574 node_space[0] = m_gen(1,0) - 0.5*std::min(s_macro_D[0]-s_macro_DL[0],
575 s_macro_DR[0]-s_macro_D[0]);
576 node_space[1] = 0.5*std::min(s_macro_U[0]-s_macro_UL[0],
577 s_macro_UR[0]-s_macro_U[0]) - m_gen(1,0);
579 if (node_space[0] > 0 && node_space[1] > 0)
580 m_gen(3,0) = 0.5 * std::min(node_space[0],node_space[1]);
581 else if (node_space[0] < 0 && node_space[1] < 0)
582 m_gen(3,0) = 0.5 * std::max(node_space[0],node_space[1]);
587 node_space[0] = m_gen(2,1) - 0.5*std::min(s_macro_L[0]-s_macro_DL[0],
588 s_macro_UL[0]-s_macro_L[0]);
589 node_space[1] = 0.5*std::min(s_macro_R[0]-s_macro_DR[0],
590 s_macro_UR[0]-s_macro_R[0]) - m_gen(2,1);
592 if (node_space[0] > 0 && node_space[1] > 0)
593 m_gen(3,1) = 0.5 * std::min(node_space[0],node_space[1]);
594 else if (node_space[0] < 0 && node_space[1] < 0)
595 m_gen(3,1) = 0.5 * std::max(node_space[0],node_space[1]);
606 template<
class ELEMENT>
610 MeshChecker::assert_geometric_element<QHermiteElementBase,ELEMENT>(2);
616 Element_pt.resize(Nelement[0]*Nelement[1]);
619 Element_pt[0] =
new ELEMENT;
620 finite_element_pt(0)->set_macro_elem_pt(Domain_pt->macro_element_pt(0));
623 Node_pt.resize((1 + Nelement[0])*(1 + Nelement[1]));
626 unsigned long node_count=0;
648 Node_pt[node_count] =
649 finite_element_pt(0)->construct_boundary_node(0,time_stepper_pt);
652 add_boundary_node(0,Node_pt[node_count]);
653 add_boundary_node(3,Node_pt[node_count]);
656 set_position_of_boundary_node
665 Node_pt[node_count] =
666 finite_element_pt(0)->construct_boundary_node(1,time_stepper_pt);
669 add_boundary_node(0,Node_pt[node_count]);
673 {add_boundary_node(1,Node_pt[node_count]);}
676 set_position_of_boundary_node
685 Node_pt[node_count] =
686 finite_element_pt(0)->construct_boundary_node(2,time_stepper_pt);
689 add_boundary_node(3,Node_pt[node_count]);
693 {add_boundary_node(2,Node_pt[node_count]);}
696 set_position_of_boundary_node
705 Node_pt[node_count] =
706 finite_element_pt(0)->construct_node(3,time_stepper_pt);
710 {add_boundary_node(1,Node_pt[node_count]);}
713 {add_boundary_node(2,Node_pt[node_count]);}
716 if (Nelement[0]==1 || Nelement[1]==1)
719 set_position_of_boundary_node
725 set_position_of_node(1,1,Node_pt[node_count]);
739 for(
unsigned j=1;j<(Nelement[0]-1);j++)
742 Element_pt[j] =
new ELEMENT;
743 finite_element_pt(j)->set_macro_elem_pt(Domain_pt->macro_element_pt(0));
749 finite_element_pt(j)->node_pt(0) =
750 finite_element_pt(j-1)->node_pt(1);
755 Node_pt[node_count] =
756 finite_element_pt(j)->construct_boundary_node(1,time_stepper_pt);
759 add_boundary_node(0,Node_pt[node_count]);
762 set_position_of_boundary_node
771 finite_element_pt(j)->node_pt(2) =
772 finite_element_pt(j-1)->node_pt(3);
777 Node_pt[node_count] =
778 finite_element_pt(j)->construct_node(3,time_stepper_pt);
782 {add_boundary_node(2,Node_pt[node_count]);}
786 set_position_of_boundary_node
789 set_position_of_node(j+1,1,Node_pt[node_count]);
803 Element_pt[Nelement[0]-1] =
new ELEMENT;
804 finite_element_pt(Nelement[0]-1)->
805 set_macro_elem_pt(Domain_pt->macro_element_pt(0));
810 finite_element_pt(Nelement[0]-1)->node_pt(0) =
811 finite_element_pt(Nelement[0]-2)->node_pt(1);
820 finite_element_pt(Nelement[0]-1)->node_pt(1) =
821 finite_element_pt(0)->node_pt(0);
827 Node_pt[node_count] =
828 finite_element_pt(Nelement[0]-1)->
829 construct_boundary_node(1,time_stepper_pt);
833 add_boundary_node(0,Node_pt[node_count]);
834 add_boundary_node(1,Node_pt[node_count]);
837 set_position_of_boundary_node
849 finite_element_pt(Nelement[0]-1)->node_pt(2) =
850 finite_element_pt(Nelement[0]-2)->node_pt(3);
854 {add_boundary_node(2,Node_pt[node_count]);}
858 set_position_of_boundary_node
861 (finite_element_pt(Nelement[0]-2)->node_pt(3)));
870 finite_element_pt(Nelement[0]-1)->node_pt(3) =
871 finite_element_pt(0)->node_pt(2);
877 Node_pt[node_count] = finite_element_pt(Nelement[0]-1)->
878 construct_boundary_node(3,time_stepper_pt);
883 {add_boundary_node(2,Node_pt[node_count]);}
886 add_boundary_node(1,Node_pt[node_count]);
889 set_position_of_boundary_node
906 for(
unsigned i=1;
i<(Nelement[1]-1);
i++)
915 Element_pt[Nelement[0]*
i] =
new ELEMENT;
916 finite_element_pt(Nelement[0]*
i)
917 ->set_macro_elem_pt(Domain_pt->macro_element_pt(0));
920 for(
unsigned l=0;l<2;l++)
922 finite_element_pt(Nelement[0]*i)->node_pt(l) =
923 finite_element_pt(Nelement[0]*(i-1))->node_pt(2 + l);
929 Node_pt[node_count] = finite_element_pt(Nelement[0]*i)->
930 construct_boundary_node(2,time_stepper_pt);
933 add_boundary_node(3,Node_pt[node_count]);
936 set_position_of_boundary_node
947 Node_pt[node_count] = finite_element_pt(Nelement[0]*i)->
948 construct_boundary_node(3,time_stepper_pt);
952 Node_pt[node_count] =
953 finite_element_pt(Nelement[0]*i)->
954 construct_node(3,time_stepper_pt);
960 {add_boundary_node(1,Node_pt[node_count]);}
964 set_position_of_boundary_node
967 set_position_of_node(1,i+1,Node_pt[node_count]);
977 for(
unsigned j=1;j<(Nelement[0]-1);j++)
980 Element_pt[Nelement[0]*i+j] =
new ELEMENT;
981 finite_element_pt(Nelement[0]*i+j)->
982 set_macro_elem_pt(Domain_pt->macro_element_pt(0));
987 for(
unsigned l=0;l<2;l++)
989 finite_element_pt(Nelement[0]*i+j)->node_pt(l) =
990 finite_element_pt(Nelement[0]*(i-1)+j)->node_pt(2 + l);
996 finite_element_pt(Nelement[0]*i+j)->node_pt(2) =
997 finite_element_pt(Nelement[0]*i+(j-1))->node_pt(3);
1002 Node_pt[node_count] =
1003 finite_element_pt(Nelement[0]*i+j)->
1004 construct_node(3,time_stepper_pt);
1007 set_position_of_node(j+1,i+1,Node_pt[node_count]);
1022 Element_pt[Nelement[0]*i+Nelement[0]-1] =
new ELEMENT;
1023 finite_element_pt(Nelement[0]*i+Nelement[0]-1)->
1024 set_macro_elem_pt(Domain_pt->macro_element_pt(0));
1029 for(
unsigned l=0;l<2;l++)
1031 finite_element_pt(Nelement[0]*i+Nelement[0]-1)->node_pt(l) =
1032 finite_element_pt(Nelement[0]*(i-1)
1033 +Nelement[0]-1)->node_pt(2 + l);
1039 finite_element_pt(Nelement[0]*i+Nelement[0]-1)->node_pt(2) =
1040 finite_element_pt(Nelement[0]*i+Nelement[0]-2)->node_pt(3);
1049 finite_element_pt(Nelement[0]*i+Nelement[0]-1)->node_pt(3) =
1050 finite_element_pt(Nelement[0]*i)->node_pt(2);
1055 Node_pt[node_count] =
1056 finite_element_pt(Nelement[0]*i+Nelement[0]-1)->
1057 construct_boundary_node(3,time_stepper_pt);
1061 add_boundary_node(1,Node_pt[node_count]);
1064 set_position_of_boundary_node
1087 Element_pt[Nelement[0]*(Nelement[1]-1)] =
new ELEMENT;
1088 finite_element_pt(Nelement[0]*(Nelement[1]-1))->
1089 set_macro_elem_pt(Domain_pt->macro_element_pt(0));
1094 for(
unsigned l=0;l<2;l++)
1096 finite_element_pt(Nelement[0]*(Nelement[1]-1))->node_pt(l)
1097 = finite_element_pt(Nelement[0]*(Nelement[1]-2))->node_pt(2 + l);
1103 Node_pt[node_count] = finite_element_pt(Nelement[0]*(Nelement[1]-1))->
1104 construct_boundary_node(2,time_stepper_pt);
1107 add_boundary_node(2,Node_pt[node_count]);
1108 add_boundary_node(3,Node_pt[node_count]);
1111 set_position_of_boundary_node
1120 Node_pt[node_count] =
1121 finite_element_pt(Nelement[0]*(Nelement[1]-1))->
1122 construct_boundary_node(3,time_stepper_pt);
1125 add_boundary_node(2,Node_pt[node_count]);
1128 set_position_of_boundary_node
1140 for(
unsigned j=1;j<(Nelement[0]-1);j++)
1144 Element_pt[Nelement[0]*(Nelement[1]-1)+j] =
new ELEMENT;
1145 finite_element_pt(Nelement[0]*(Nelement[1]-1)+j)->
1146 set_macro_elem_pt(Domain_pt->macro_element_pt(0));
1151 for(
unsigned l=0;l<2;l++)
1153 finite_element_pt(Nelement[0]*(Nelement[1]-1)+j)->node_pt(l) =
1154 finite_element_pt(Nelement[0]*(Nelement[1]-2)+j)->node_pt(2 + l);
1160 finite_element_pt(Nelement[0]*(Nelement[1]-1)+j)->node_pt(2)
1161 = finite_element_pt(Nelement[0]*(Nelement[1]-1)+(j-1))->node_pt(3);
1166 Node_pt[node_count] =
1167 finite_element_pt(Nelement[0]*(Nelement[1]-1)+j)->
1168 construct_boundary_node(3,time_stepper_pt);
1171 add_boundary_node(2,Node_pt[node_count]);
1174 set_position_of_boundary_node
1192 Element_pt[Nelement[0]*(Nelement[1]-1)+Nelement[0]-1] =
new ELEMENT;
1193 finite_element_pt(Nelement[0]*(Nelement[1]-1)+Nelement[0]-1)->
1194 set_macro_elem_pt(Domain_pt->macro_element_pt(0));
1199 for(
unsigned l=0;l<2;l++)
1201 finite_element_pt(Nelement[0]*(Nelement[1]-1)+Nelement[0]-1)->
1202 node_pt(l) = finite_element_pt(Nelement[0]*(Nelement[1]-2)+
1203 Nelement[0]-1)->node_pt(2 + l);
1209 finite_element_pt(Nelement[0]*(Nelement[1]-1)+Nelement[0]-1)
1210 ->node_pt(2) = finite_element_pt(Nelement[0]*(Nelement[1]-1)+
1211 Nelement[0]-2)->node_pt(3);
1220 finite_element_pt(Nelement[0]*(Nelement[1]-1)
1221 +Nelement[0]-1)->node_pt(3) =
1222 finite_element_pt(Nelement[0]*(Nelement[1]-1))->node_pt(2);
1227 Node_pt[node_count] = finite_element_pt(Nelement[0]*(Nelement[1]-1)+
1229 construct_boundary_node(3,time_stepper_pt);
1233 add_boundary_node(1,Node_pt[node_count]);
1234 add_boundary_node(2,Node_pt[node_count]);
1237 set_position_of_boundary_node
1238 (Nelement[0],Nelement[1],
1247 setup_boundary_element_info();
1261 template <
class ELEMENT>
1267 if (outfile) doc=
true;
1270 unsigned nbound=nboundary();
1273 Boundary_element_pt.clear();
1274 Face_index_at_boundary.clear();
1275 Boundary_element_pt.resize(nbound);
1276 Face_index_at_boundary.resize(nbound);
1280 vector_of_boundary_element_pt.resize(nbound);
1284 boundary_identifier;
1289 unsigned nel=nelement();
1290 for (
unsigned e=0;
e<nel;
e++)
1295 if (doc) outfile <<
"Element: " <<
e <<
" " << fe_pt << std::endl;
1298 if (fe_pt->
dim()==2)
1302 unsigned nnode_1d=fe_pt->
nnode_1d();
1305 for (
unsigned i0=0;i0<nnode_1d;i0++)
1307 for (
unsigned i1=0;i1<nnode_1d;i1++)
1310 unsigned j=i0+i1*nnode_1d;
1314 std::set<unsigned>* boundaries_pt=0;
1318 if (boundaries_pt!=0)
1322 for (std::set<unsigned>::iterator it=boundaries_pt->begin();
1323 it != boundaries_pt->end();++it)
1328 unsigned temp_size = vector_of_boundary_element_pt[*it].size();
1329 bool temp_flag =
true;
1330 for (
unsigned temp_i = 0; temp_i < temp_size; temp_i++)
1332 if (vector_of_boundary_element_pt[*it][temp_i] == fe_pt)
1336 vector_of_boundary_element_pt[*it].push_back(fe_pt);
1347 if (boundary_identifier(*it,fe_pt)==0)
1353 if (((i0==0)||(i0==nnode_1d-1))&&((i1==0)||(i1==nnode_1d-1)))
1356 (*boundary_identifier(*it,fe_pt)).
1357 push_back(1*(2*i0/(nnode_1d-1)-1));
1360 (*boundary_identifier(*it,fe_pt)).
1361 push_back(2*(2*i1/(nnode_1d-1)-1));
1393 for (
unsigned i=0;
i<nbound;
i++)
1396 unsigned nel=vector_of_boundary_element_pt[
i].size();
1399 Face_index_at_boundary[
i].resize(nel);
1405 for (IT it=vector_of_boundary_element_pt[
i].begin();
1406 it!=vector_of_boundary_element_pt[
i].end();
1413 std::map<int,unsigned> count;
1416 for (
unsigned ii=0;ii<2;ii++)
1419 for (
int sign=-1;sign<3;sign+=2)
1421 count[(ii+1)*sign]=0;
1426 unsigned n_indicators=(*boundary_identifier(
i,fe_pt)).size();
1427 for (
unsigned j=0;j<n_indicators;j++)
1429 count[(*boundary_identifier(
i,fe_pt))[j] ]++;
1431 delete boundary_identifier(
i,fe_pt);
1442 for (
unsigned ii=0;ii<2;ii++)
1445 for (
int sign=-1;sign<3;sign+=2)
1447 if (count[(ii+1)*sign]==2)
1453 "Trouble: Multiple boundary identifiers!\n";
1455 "Elements should only have at most 2 corner ";
1457 "nodes on any one boundary.\n";
1461 OOMPH_CURRENT_FUNCTION,
1462 OOMPH_EXCEPTION_LOCATION);
1465 indicator=(ii+1)*sign;
1474 Boundary_element_pt[
i].push_back(fe_pt);
1484 Face_index_at_boundary[
i][e_count]= -2;
1490 Face_index_at_boundary[
i][e_count] = -1;
1497 Face_index_at_boundary[
i][e_count] = 1;
1503 Face_index_at_boundary[
i][e_count] = 2;
1509 OOMPH_CURRENT_FUNCTION,
1510 OOMPH_EXCEPTION_LOCATION);
1527 for (
unsigned i=0;
i<nbound;
i++)
1529 unsigned nel=Boundary_element_pt[
i].size();
1530 outfile <<
"Boundary: " <<
i 1531 <<
" is adjacent to " << nel
1532 <<
" elements" << std::endl;
1535 for (
unsigned e=0;
e<nel;
e++)
1538 outfile <<
"Boundary element:" << fe_pt
1539 <<
" Face index of element along boundary is " 1540 << Face_index_at_boundary[
i][
e] << std::endl;
1547 Lookup_for_elements_next_boundary_is_setup=
true;
void set_position_of_node(const unsigned &node_num_x, const unsigned &node_num_y, Node *node_pt)
sets the generalised position of the node (i.e. - x_i, dx_i/ds_0, dx_i/ds_1 & d2x_i/ds_0ds_1 for i = ...
bool is_on_boundary() const
Test whether the node lies on a boundary Final overload.
virtual void build_mesh(TimeStepper *time_stepper_pt)
Generic mesh construction function to build the mesh.
A general Finite Element class.
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
virtual void get_boundaries_pt(std::set< unsigned > *&boundaries_pt)
Return a pointer to set of mesh boundaries that this node occupies; this will be overloaded by Bounda...
virtual void setup_boundary_element_info()
void set_position_of_boundary_node(const unsigned &node_num_x, const unsigned &node_num_y, BoundaryNode< Node > *node_pt)
sets the generalised position of the node (i.e. - x_i, dx_i/ds_0, dx_i/ds_1 & d2x_i/ds_0ds_1 for i = ...
A template Class for BoundaryNodes; that is Nodes that MAY live on the boundary of a Mesh...
void set_coordinates_on_boundary(const unsigned &b, const Vector< double > &boundary_zeta)
Set the vector of coordinates on mesh boundary b Final overload.
double & x_gen(const unsigned &k, const unsigned &i)
Reference to the generalised position x(k,i).
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
unsigned dim() const
Return the spatial dimension of the element, i.e. the number of local coordinates required to paramet...
virtual unsigned nnode_1d() const
Return the number of nodes along one edge of the element Default is to return zero — must be overloa...
std::string string(const unsigned &i)
Return the i-th string or "" if the relevant string hasn't been defined.
void generalised_macro_element_position_of_node(const unsigned &node_num_x, const unsigned &node_num_y, DenseMatrix< double > &m_gen)
computes the generalised position of the node at position (node_num_x, node_num_y) in the macro eleme...
Base class for time-stepping schemes. Timestepper provides an approximation of the temporal derivativ...