26 #ifndef OOMPH_QUARTER_CIRCLE_SECTOR_MESH_TEMPLATE_CC
27 #define OOMPH_QUARTER_CIRCLE_SECTOR_MESH_TEMPLATE_CC
43 template<
class ELEMENT>
47 const double& fract_mid,
49 TimeStepper* time_stepper_pt)
50 : Wall_pt(wall_pt), Xi_lo(xi_lo), Fract_mid(fract_mid), Xi_hi(xi_hi)
53 MeshChecker::assert_geometric_element<QElementGeometricBase, ELEMENT>(2);
62 Boundary_coordinate_exists[1] =
true;
68 Element_pt[0] =
new ELEMENT;
71 unsigned n_p =
dynamic_cast<ELEMENT*
>(finite_element_pt(0))->nnode_1d();
74 Node_pt.resize(n_p * n_p + (n_p - 1) * n_p + (n_p - 1) * (n_p - 1));
81 Vector<double> zeta(1);
88 unsigned long node_count = 0;
102 Node_pt[node_count] =
103 finite_element_pt(0)->construct_boundary_node(0, time_stepper_pt);
106 finite_element_pt(0)->node_pt(0) = Node_pt[node_count];
111 Domain_pt->macro_element_pt(0)->macro_map(s, r);
112 Node_pt[node_count]->x(0) = r[0];
113 Node_pt[node_count]->x(1) = r[1];
116 add_boundary_node(0, Node_pt[node_count]);
117 add_boundary_node(2, Node_pt[node_count]);
124 for (
unsigned l1 = 1; l1 < n_p; l1++)
127 unsigned jnod_local = l1;
130 Node_pt[node_count] = finite_element_pt(0)->construct_boundary_node(
131 jnod_local, time_stepper_pt);
134 finite_element_pt(0)->node_pt(jnod_local) = Node_pt[node_count];
137 s[0] = -1.0 + 2.0 * double(l1) / double(n_p - 1);
139 Domain_pt->macro_element_pt(0)->macro_map(s, r);
140 Node_pt[node_count]->x(0) = r[0];
141 Node_pt[node_count]->x(1) = r[1];
144 add_boundary_node(0, Node_pt[node_count]);
153 for (
unsigned l2 = 1; l2 < n_p; l2++)
159 unsigned jnod_local = n_p * l2;
162 Node_pt[node_count] = finite_element_pt(0)->construct_boundary_node(
163 jnod_local, time_stepper_pt);
166 finite_element_pt(0)->node_pt(jnod_local) = Node_pt[node_count];
171 s[1] = -1.0 + 2.0 * double(l2) / double(n_p - 1);
173 Domain_pt->macro_element_pt(0)->macro_map(s, r);
174 Node_pt[node_count]->x(0) = r[0];
175 Node_pt[node_count]->x(1) = r[1];
178 add_boundary_node(2, Node_pt[node_count]);
187 for (
unsigned l1 = 1; l1 < n_p; l1++)
190 unsigned jnod_local = l1 + n_p * l2;
193 Node_pt[node_count] =
194 finite_element_pt(0)->construct_node(jnod_local, time_stepper_pt);
197 finite_element_pt(0)->node_pt(jnod_local) = Node_pt[node_count];
200 s[0] = -1.0 + 2.0 * double(l1) / double(n_p - 1);
201 s[1] = -1.0 + 2.0 * double(l2) / double(n_p - 1);
202 Domain_pt->macro_element_pt(0)->macro_map(s, r);
203 Node_pt[node_count]->x(0) = r[0];
204 Node_pt[node_count]->x(1) = r[1];
214 Element_pt[1] =
new ELEMENT;
218 for (
unsigned l2 = 0; l2 < n_p; l2++)
221 unsigned jnod_local_old = (n_p - 1) + l2 * n_p;
224 finite_element_pt(1)->node_pt(l2 * n_p) =
225 finite_element_pt(0)->node_pt(jnod_local_old);
230 for (
unsigned l1 = 1; l1 < n_p - 1; l1++)
236 unsigned jnod_local = l1;
239 Node_pt[node_count] = finite_element_pt(1)->construct_boundary_node(
240 jnod_local, time_stepper_pt);
243 finite_element_pt(1)->node_pt(jnod_local) = Node_pt[node_count];
246 s[0] = -1.0 + 2.0 * double(l1) / double(n_p - 1);
248 Domain_pt->macro_element_pt(1)->macro_map(s, r);
249 Node_pt[node_count]->x(0) = r[0];
250 Node_pt[node_count]->x(1) = r[1];
253 add_boundary_node(0, Node_pt[node_count]);
260 for (
unsigned l2 = 1; l2 < n_p; l2++)
263 unsigned jnod_local = l1 + l2 * n_p;
266 Node_pt[node_count] =
267 finite_element_pt(1)->construct_node(jnod_local, time_stepper_pt);
270 finite_element_pt(1)->node_pt(jnod_local) = Node_pt[node_count];
273 s[0] = -1.0 + 2.0 * double(l1) / double(n_p - 1);
274 s[1] = -1.0 + 2.0 * double(l2) / double(n_p - 1);
275 Domain_pt->macro_element_pt(1)->macro_map(s, r);
276 Node_pt[node_count]->x(0) = r[0];
277 Node_pt[node_count]->x(1) = r[1];
291 unsigned jnod_local = n_p - 1;
294 Node_pt[node_count] = finite_element_pt(1)->construct_boundary_node(
295 jnod_local, time_stepper_pt);
298 finite_element_pt(1)->node_pt(jnod_local) = Node_pt[node_count];
303 Domain_pt->macro_element_pt(1)->macro_map(s, r);
304 Node_pt[node_count]->x(0) = r[0];
305 Node_pt[node_count]->x(1) = r[1];
308 add_boundary_node(0, Node_pt[node_count]);
309 add_boundary_node(1, Node_pt[node_count]);
313 Node_pt[node_count]->set_coordinates_on_boundary(1, zeta);
320 for (
unsigned l2 = 1; l2 < n_p; l2++)
323 unsigned jnod_local = (n_p - 1) + l2 * n_p;
326 Node_pt[node_count] = finite_element_pt(1)->construct_boundary_node(
327 jnod_local, time_stepper_pt);
330 finite_element_pt(1)->node_pt(jnod_local) = Node_pt[node_count];
334 s[1] = -1.0 + 2.0 * double(l2) / double(n_p - 1);
335 Domain_pt->macro_element_pt(1)->macro_map(s, r);
336 Node_pt[node_count]->x(0) = r[0];
337 Node_pt[node_count]->x(1) = r[1];
340 add_boundary_node(1, Node_pt[node_count]);
344 Node_pt[node_count]->set_coordinates_on_boundary(1, zeta);
355 Element_pt[2] =
new ELEMENT;
359 for (
unsigned l1 = 0; l1 < n_p; l1++)
362 unsigned jnod_local_old = n_p * (n_p - 1) + l1;
365 unsigned jnod_local = l1;
368 finite_element_pt(2)->node_pt(jnod_local) =
369 finite_element_pt(0)->node_pt(jnod_local_old);
377 for (
unsigned l2 = 1; l2 < n_p; l2++)
380 unsigned jnod_local_old = n_p * (n_p - 1) + l2;
383 unsigned jnod_local = (n_p - 1) + l2 * n_p;
386 finite_element_pt(2)->node_pt(jnod_local) =
387 finite_element_pt(1)->node_pt(jnod_local_old);
393 for (
unsigned l2 = 1; l2 < n_p - 1; l2++)
399 unsigned jnod_local = n_p * l2;
402 Node_pt[node_count] = finite_element_pt(2)->construct_boundary_node(
403 jnod_local, time_stepper_pt);
406 finite_element_pt(2)->node_pt(jnod_local) = Node_pt[node_count];
410 s[1] = -1.0 + 2.0 * double(l2) / double(n_p - 1);
412 Domain_pt->macro_element_pt(2)->macro_map(s, r);
413 Node_pt[node_count]->x(0) = r[0];
414 Node_pt[node_count]->x(1) = r[1];
417 add_boundary_node(2, Node_pt[node_count]);
425 for (
unsigned l1 = 1; l1 < n_p - 1; l1++)
428 unsigned jnod_local = l1 + n_p * l2;
431 Node_pt[node_count] =
432 finite_element_pt(2)->construct_node(jnod_local, time_stepper_pt);
435 finite_element_pt(2)->node_pt(jnod_local) = Node_pt[node_count];
438 s[0] = -1.0 + 2.0 * double(l1) / double(n_p - 1);
439 s[1] = -1.0 + 2.0 * double(l2) / double(n_p - 1);
440 Domain_pt->macro_element_pt(2)->macro_map(s, r);
441 Node_pt[node_count]->x(0) = r[0];
442 Node_pt[node_count]->x(1) = r[1];
454 jnod_local = n_p * (n_p - 1);
457 Node_pt[node_count] = finite_element_pt(2)->construct_boundary_node(
458 jnod_local, time_stepper_pt);
461 finite_element_pt(2)->node_pt(jnod_local) = Node_pt[node_count];
466 Domain_pt->macro_element_pt(2)->macro_map(s, r);
467 Node_pt[node_count]->x(0) = r[0];
468 Node_pt[node_count]->x(1) = r[1];
471 add_boundary_node(1, Node_pt[node_count]);
472 add_boundary_node(2, Node_pt[node_count]);
476 Node_pt[node_count]->set_coordinates_on_boundary(1, zeta);
484 for (
unsigned l1 = 1; l1 < n_p - 1; l1++)
487 unsigned jnod_local = n_p * (n_p - 1) + l1;
490 Node_pt[node_count] = finite_element_pt(2)->construct_boundary_node(
491 jnod_local, time_stepper_pt);
494 finite_element_pt(2)->node_pt(jnod_local) = Node_pt[node_count];
497 s[0] = -1.0 + 2.0 * double(l1) / double(n_p - 1);
499 Domain_pt->macro_element_pt(2)->macro_map(s, r);
500 Node_pt[node_count]->x(0) = r[0];
501 Node_pt[node_count]->x(1) = r[1];
504 add_boundary_node(1, Node_pt[node_count]);
509 Node_pt[node_count]->set_coordinates_on_boundary(1, zeta);
517 unsigned n_element = this->nelement();
518 for (
unsigned e = 0; e < n_element; e++)
521 ELEMENT* el_pt =
dynamic_cast<ELEMENT*
>(this->element_pt(e));
524 el_pt->set_macro_elem_pt(this->
Domain_pt->macro_element_pt(e));
528 setup_boundary_element_info();
555 template<
class ELEMENT>
557 ELEMENT>::setup_algebraic_node_update()
561 AlgebraicElementBase* central_box_pt =
562 dynamic_cast<AlgebraicElementBase*
>(Mesh::element_pt(0));
564 if (central_box_pt == 0)
566 std::ostringstream error_message;
568 <<
"Element in AlgebraicRefineableQuarterCircleSectorMesh must be\n ";
569 error_message <<
"derived from AlgebraicElementBase\n";
570 error_message <<
"but it is of type: "
571 <<
typeid(Mesh::element_pt(0)).name() << std::endl;
572 std::string function_name =
573 "AlgebraicRefineableQuarterCircleSectorMesh::";
574 function_name +=
"setup_algebraic_node_update()";
576 error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
581 unsigned nnodes = Mesh::finite_element_pt(0)->nnode();
584 double x_box = Mesh::finite_element_pt(0)->node_pt(nnodes - 1)->x(0);
585 double y_box = Mesh::finite_element_pt(0)->node_pt(nnodes - 1)->x(1);
588 Vector<double> r_br(2);
589 Vector<double> xi(1);
594 Lambda_x = x_box / r_br[0];
597 GeomObject* obj_br_pt;
598 Vector<double> s_br(1);
599 this->Wall_pt->locate_zeta(xi, obj_br_pt, s_br);
601 obj_br_pt->position(s_br, r_br);
604 Vector<double> r_tl(2);
609 Lambda_y = y_box / r_tl[1];
612 GeomObject* obj_tl_pt;
613 Vector<double> s_tl(1);
614 this->Wall_pt->locate_zeta(xi, obj_tl_pt, s_tl);
621 FiniteElement* el_pt = Mesh::finite_element_pt(ielem);
625 for (
unsigned jnod = 0; jnod < nnodes; jnod++)
628 double x = Mesh::finite_element_pt(ielem)->node_pt(jnod)->x(0);
629 double y = Mesh::finite_element_pt(ielem)->node_pt(jnod)->x(1);
632 Vector<GeomObject*> geom_object_pt(2);
635 Vector<double> ref_value(4);
638 ref_value[0] = x / x_box;
641 ref_value[1] = y / y_box;
644 geom_object_pt[0] = obj_br_pt;
649 ref_value[2] = s_br[0];
653 geom_object_pt[1] = obj_tl_pt;
658 ref_value[3] = s_tl[0];
661 dynamic_cast<AlgebraicNode*
>(el_pt->node_pt(jnod))
662 ->add_node_update_info(Central_box,
673 FiniteElement* el_pt = Mesh::finite_element_pt(ielem);
680 dynamic_cast<ELEMENT*
>(Mesh::finite_element_pt(ielem))->nnode_1d();
681 for (
unsigned i0 = 0; i0 < nnod_lin; i0++)
684 double rho_0 = double(i0) / double(nnod_lin - 1);
686 for (
unsigned i1 = 0; i1 < nnod_lin; i1++)
689 double rho_1 = double(i1) / double(nnod_lin - 1);
692 unsigned jnod = i0 + i1 * nnod_lin;
695 Vector<GeomObject*> geom_object_pt(3);
698 Vector<double> ref_value(5);
701 ref_value[0] = rho_0;
704 ref_value[1] = rho_1;
707 geom_object_pt[0] = obj_br_pt;
713 ref_value[2] = s_br[0];
716 geom_object_pt[1] = obj_tl_pt;
722 ref_value[3] = s_tl[0];
725 Vector<double> xi_wall(1);
733 GeomObject* obj_wall_pt;
734 Vector<double> s_wall(1);
735 this->Wall_pt->locate_zeta(xi_wall, obj_wall_pt, s_wall);
738 geom_object_pt[2] = obj_wall_pt;
744 ref_value[4] = s_wall[0];
747 dynamic_cast<AlgebraicNode*
>(el_pt->node_pt(jnod))
748 ->add_node_update_info(Lower_right_box,
761 FiniteElement* el_pt = Mesh::finite_element_pt(ielem);
765 dynamic_cast<ELEMENT*
>(Mesh::finite_element_pt(ielem))->nnode_1d();
767 for (
unsigned i0 = 0; i0 < nnod_lin; i0++)
770 double rho_0 = double(i0) / double(nnod_lin - 1);
772 for (
unsigned i1 = 0; i1 < nnod_lin; i1++)
775 double rho_1 = double(i1) / double(nnod_lin - 1);
778 unsigned jnod = i0 + i1 * nnod_lin;
781 Vector<GeomObject*> geom_object_pt(3);
784 Vector<double> ref_value(5);
787 ref_value[0] = rho_0;
790 ref_value[1] = rho_1;
793 geom_object_pt[0] = obj_br_pt;
799 ref_value[2] = s_br[0];
802 geom_object_pt[1] = obj_tl_pt;
808 ref_value[3] = s_tl[0];
811 Vector<double> xi_wall(1);
820 GeomObject* obj_wall_pt;
821 Vector<double> s_wall(1);
822 this->Wall_pt->locate_zeta(xi_wall, obj_wall_pt, s_wall);
825 geom_object_pt[2] = obj_wall_pt;
831 ref_value[4] = s_wall[0];
834 dynamic_cast<AlgebraicNode*
>(el_pt->node_pt(jnod))
835 ->add_node_update_info(Upper_left_box,
849 template<
class ELEMENT>
851 ELEMENT>::node_update_in_central_box(
const unsigned& t,
852 AlgebraicNode*& node_pt)
868 if (t > node_pt->position_time_stepper_pt()->nprev_values())
870 std::string error_message =
871 "Trying to update the nodal position at a time level\n";
872 error_message +=
"beyond the number of previous values in the nodes'\n";
873 error_message +=
"position timestepper. This seems highly suspect!\n";
874 error_message +=
"If you're sure the code behaves correctly\n";
875 error_message +=
"in your application, remove this warning \n";
876 error_message +=
"or recompile with PARNOID switched off.\n";
878 std::string function_name =
879 "AlgebraicRefineableQuarterCircleSectorMesh::";
880 function_name +=
"node_update_in_central_box()",
882 error_message, OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
887 Vector<double> ref_value(node_pt->vector_ref_value(Central_box));
890 Vector<GeomObject*> geom_object_pt(
891 node_pt->vector_geom_object_pt(Central_box));
894 double rho_x = ref_value[0];
897 double rho_y = ref_value[1];
903 GeomObject* obj_br_pt = geom_object_pt[0];
906 unsigned n_dim = obj_br_pt->ndim();
909 Vector<double> s_br(1);
910 s_br[0] = ref_value[2];
913 Vector<double> r_br(n_dim);
914 obj_br_pt->position(t, s_br, r_br);
919 GeomObject* obj_tl_pt = geom_object_pt[1];
922 Vector<double> s_tl(1);
923 s_tl[0] = ref_value[3];
925 Vector<double> r_tl(n_dim);
926 obj_tl_pt->position(t, s_tl, r_tl);
929 node_pt->x(t, 0) = r_br[0] * Lambda_x * rho_x;
930 node_pt->x(t, 1) = r_tl[1] * Lambda_y * rho_y;
938 template<
class ELEMENT>
940 ELEMENT>::node_update_in_lower_right_box(
const unsigned& t,
941 AlgebraicNode*& node_pt)
957 if (t > node_pt->position_time_stepper_pt()->nprev_values())
959 std::string error_message =
960 "Trying to update the nodal position at a time level";
961 error_message +=
"beyond the number of previous values in the nodes'";
962 error_message +=
"position timestepper. This seems highly suspect!";
963 error_message +=
"If you're sure the code behaves correctly";
964 error_message +=
"in your application, remove this warning ";
965 error_message +=
"or recompile with PARNOID switched off.";
967 std::string function_name =
968 "AlgebraicRefineableQuarterCircleSectorMesh::";
969 function_name +=
"node_update_in_lower_right_box()",
971 error_message, OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
976 Vector<double> ref_value(node_pt->vector_ref_value(Lower_right_box));
979 Vector<GeomObject*> geom_object_pt(
980 node_pt->vector_geom_object_pt(Lower_right_box));
983 double rho_0 = ref_value[0];
986 double rho_1 = ref_value[1];
991 GeomObject* obj_br_pt = geom_object_pt[0];
994 unsigned n_dim = obj_br_pt->ndim();
997 Vector<double> s_br(1);
998 s_br[0] = ref_value[2];
1001 Vector<double> r_br(n_dim);
1002 obj_br_pt->position(t, s_br, r_br);
1007 GeomObject* obj_tl_pt = geom_object_pt[1];
1010 Vector<double> s_tl(1);
1011 s_tl[0] = ref_value[3];
1013 Vector<double> r_tl(n_dim);
1014 obj_tl_pt->position(t, s_tl, r_tl);
1017 Vector<double> r_box(n_dim);
1018 r_box[0] = Lambda_x * r_br[0];
1019 r_box[1] = Lambda_y * r_tl[1];
1022 Vector<double> r_left(n_dim);
1023 r_left[0] = Lambda_x * r_br[0] + rho_1 * (r_box[0] - Lambda_x * r_br[0]);
1024 r_left[1] = Lambda_x * r_br[1] + rho_1 * (r_box[1] - Lambda_x * r_br[1]);
1029 GeomObject* obj_wall_pt = geom_object_pt[2];
1032 Vector<double> s_wall(1);
1033 s_wall[0] = ref_value[4];
1035 Vector<double> r_wall(n_dim);
1036 obj_wall_pt->position(t, s_wall, r_wall);
1039 node_pt->x(t, 0) = r_left[0] + rho_0 * (r_wall[0] - r_left[0]);
1040 node_pt->x(t, 1) = r_left[1] + rho_0 * (r_wall[1] - r_left[1]);
1046 template<
class ELEMENT>
1048 ELEMENT>::node_update_in_upper_left_box(
const unsigned& t,
1049 AlgebraicNode*& node_pt)
1065 if (t > node_pt->position_time_stepper_pt()->nprev_values())
1067 std::string error_message =
1068 "Trying to update the nodal position at a time level";
1069 error_message +=
"beyond the number of previous values in the nodes'";
1070 error_message +=
"position timestepper. This seems highly suspect!";
1071 error_message +=
"If you're sure the code behaves correctly";
1072 error_message +=
"in your application, remove this warning ";
1073 error_message +=
"or recompile with PARNOID switched off.";
1075 std::string function_name =
1076 "AlgebraicRefineableQuarterCircleSectorMesh::";
1077 function_name +=
"node_update_in_upper_left_box()";
1079 throw OomphLibError(
1080 error_message, OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
1085 Vector<double> ref_value(node_pt->vector_ref_value(Upper_left_box));
1088 Vector<GeomObject*> geom_object_pt(
1089 node_pt->vector_geom_object_pt(Upper_left_box));
1092 double rho_0 = ref_value[0];
1095 double rho_1 = ref_value[1];
1100 GeomObject* obj_br_pt = geom_object_pt[0];
1103 unsigned n_dim = obj_br_pt->ndim();
1106 Vector<double> s_br(1);
1107 s_br[0] = ref_value[2];
1110 Vector<double> r_br(n_dim);
1111 obj_br_pt->position(t, s_br, r_br);
1116 GeomObject* obj_tl_pt = node_pt->geom_object_pt(1);
1119 Vector<double> s_tl(1);
1120 s_tl[0] = node_pt->ref_value(3);
1122 Vector<double> r_tl(n_dim);
1123 obj_tl_pt->position(t, s_tl, r_tl);
1126 Vector<double> r_box(n_dim);
1127 r_box[0] = Lambda_x * r_br[0];
1128 r_box[1] = Lambda_y * r_tl[1];
1131 Vector<double> r_top(n_dim);
1132 r_top[0] = Lambda_y * r_tl[0] + rho_0 * (r_box[0] - Lambda_y * r_tl[0]);
1133 r_top[1] = Lambda_y * r_tl[1] + rho_0 * (r_box[1] - Lambda_y * r_tl[1]);
1138 GeomObject* obj_wall_pt = node_pt->geom_object_pt(2);
1141 Vector<double> s_wall(1);
1142 s_wall[0] = node_pt->ref_value(4);
1144 Vector<double> r_wall(n_dim);
1145 obj_wall_pt->position(t, s_wall, r_wall);
1149 node_pt->x(t, 0) = r_top[0] + rho_1 * (r_wall[0] - r_top[0]);
1150 node_pt->x(t, 1) = r_top[1] + rho_1 * (r_wall[1] - r_top[1]);
1157 template<
class ELEMENT>
1159 ELEMENT>::update_node_update_in_lower_right_box(AlgebraicNode*& node_pt)
1162 Vector<double> ref_value(node_pt->vector_ref_value(Lower_right_box));
1165 Vector<GeomObject*> geom_object_pt(
1166 node_pt->vector_geom_object_pt(Lower_right_box));
1170 node_pt->kill_node_update_info(Lower_right_box);
1182 double rho_1 = ref_value[1];
1189 Vector<double> xi(1);
1193 GeomObject* obj_br_pt;
1194 Vector<double> s_br(1);
1195 this->Wall_pt->locate_zeta(xi, obj_br_pt, s_br);
1198 geom_object_pt[0] = obj_br_pt;
1203 ref_value[2] = s_br[0];
1213 GeomObject* obj_tl_pt;
1214 Vector<double> s_tl(1);
1215 this->Wall_pt->locate_zeta(xi, obj_tl_pt, s_tl);
1218 geom_object_pt[1] = obj_tl_pt;
1223 ref_value[3] = s_tl[0];
1230 Vector<double> xi_wall(1);
1231 xi_wall[0] = xi_lo + rho_1 * fract_mid * (xi_hi - xi_lo);
1235 GeomObject* obj_wall_pt;
1236 Vector<double> s_wall(1);
1237 this->Wall_pt->locate_zeta(xi_wall, obj_wall_pt, s_wall);
1240 geom_object_pt[2] = obj_wall_pt;
1245 ref_value[4] = s_wall[0];
1248 node_pt->add_node_update_info(Lower_right_box,
1257 template<
class ELEMENT>
1259 ELEMENT>::update_node_update_in_upper_left_box(AlgebraicNode*& node_pt)
1262 Vector<double> ref_value(node_pt->vector_ref_value(Upper_left_box));
1265 Vector<GeomObject*> geom_object_pt(
1266 node_pt->vector_geom_object_pt(Upper_left_box));
1269 node_pt->kill_node_update_info(Upper_left_box);
1281 double rho_0 = ref_value[0];
1287 Vector<double> xi(1);
1291 GeomObject* obj_br_pt;
1292 Vector<double> s_br(1);
1293 this->Wall_pt->locate_zeta(xi, obj_br_pt, s_br);
1296 geom_object_pt[0] = obj_br_pt;
1301 ref_value[2] = s_br[0];
1310 GeomObject* obj_tl_pt;
1311 Vector<double> s_tl(1);
1312 this->Wall_pt->locate_zeta(xi, obj_tl_pt, s_tl);
1315 geom_object_pt[1] = obj_tl_pt;
1320 ref_value[3] = s_tl[0];
1327 Vector<double> xi_wall(1);
1328 xi_wall[0] = xi_hi + rho_0 * (1.0 - fract_mid) * (xi_lo - xi_hi);
1331 GeomObject* obj_wall_pt;
1332 Vector<double> s_wall(1);
1333 this->Wall_pt->locate_zeta(xi_wall, obj_wall_pt, s_wall);
1336 geom_object_pt[2] = obj_wall_pt;
1341 ref_value[4] = s_wall[0];
1344 node_pt->add_node_update_info(Upper_left_box,
Algebraic version of RefineableQuarterCircleSectorMesh.
Circular sector as domain. Domain is bounded by curved boundary which is represented by a GeomObject....
2D quarter ring mesh class. The domain is specified by the GeomObject that identifies boundary 1.
GeomObject *& wall_pt()
Access function to GeomObject representing wall.
double Fract_mid
Fraction along wall where outer ring is to be divided.
double Xi_hi
Upper limit for the (1D) coordinates along the wall.
QuarterCircleSectorMesh(GeomObject *wall_pt, const double &xi_lo, const double &fract_mid, const double &xi_hi, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass pointer to geometric object that specifies the wall, start and end coordinates on t...
QuarterCircleSectorDomain * Domain_pt
Pointer to Domain.
double Xi_lo
Lower limit for the (1D) coordinates along the wall.
////////////////////////////////////////////////////////////////////// //////////////////////////////...