30 #ifndef OOMPH_QUARTER_TUBE_MESH_TEMPLATE_CC 31 #define OOMPH_QUARTER_TUBE_MESH_TEMPLATE_CC 49 template <
class ELEMENT>
51 const Vector<double>& xi_lo,
52 const double& fract_mid,
53 const Vector<double>& xi_hi,
54 const unsigned& nlayer,
55 TimeStepper* time_stepper_pt) :
56 Wall_pt(wall_pt), Xi_lo(xi_lo), Fract_mid(fract_mid), Xi_hi(xi_hi)
60 MeshChecker::assert_geometric_element<QElementGeometricBase,ELEMENT>(3);
69 Boundary_coordinate_exists[3] =
true;
72 unsigned nelem=3*nlayer;
73 Element_pt.resize(nelem);
76 ELEMENT* dummy_el_pt=
new ELEMENT;
79 unsigned n_p = dummy_el_pt->nnode_1d();
85 unsigned nnodes_total=
86 (n_p*n_p+(n_p-1)*n_p+(n_p-1)*(n_p-1))*(1+nlayer*(n_p-1));
87 Node_pt.resize(nnodes_total);
94 Vector<double> zeta(2);
97 for (
unsigned ielem=0;ielem<nelem;ielem++)
101 Element_pt[ielem] =
new ELEMENT;
104 for (
unsigned i2=0;i2<n_p;i2++)
108 for (
unsigned i1=0;i1<n_p;i1++)
112 for (
unsigned i0=0;i0<n_p;i0++)
116 unsigned jnod_local=i0+i1*n_p+i2*n_p*n_p;
119 Node* node_pt=finite_element_pt(ielem)->
120 construct_node(jnod_local,time_stepper_pt);
123 s[0]=-1.0+2.0*double(i0)/double(n_p-1);
124 s[1]=-1.0+2.0*double(i1)/double(n_p-1);
125 s[2]=-1.0+2.0*double(i2)/double(n_p-1);
126 Domain_pt->macro_element_pt(ielem)->macro_map(s,r);
128 node_pt->x(0) = r[0];
129 node_pt->x(1) = r[1];
130 node_pt->x(2) = r[2];
139 unsigned node_count=0;
142 double node_kill_tol=1.0e-12;
148 for (
unsigned ielem=0;ielem<nelem;ielem++)
152 unsigned ilayer=unsigned(ielem/3);
164 for (
unsigned i2=0;i2<n_p;i2++)
168 for (
unsigned i1=0;i1<n_p;i1++)
172 for (
unsigned i0=0;i0<n_p;i0++)
176 unsigned jnod_local=i0+i1*n_p+i2*n_p*n_p;
183 if ((i2==0)&&(ilayer>0))
187 unsigned ielem_neigh=ielem-3;
190 unsigned i0_neigh=i0;
191 unsigned i1_neigh=i1;
192 unsigned i2_neigh=n_p-1;
193 unsigned jnod_local_neigh=i0_neigh+i1_neigh*n_p+i2_neigh*n_p*n_p;
196 for (
unsigned i=0;i<3;i++)
198 double error=std::fabs(
199 finite_element_pt(ielem)->node_pt(jnod_local)->x(i)-
200 finite_element_pt(ielem_neigh)->
201 node_pt(jnod_local_neigh)->x(i));
202 if (error>node_kill_tol)
204 oomph_info <<
"Error in node killing for i " 205 << i <<
" " << error << std::endl;
211 delete finite_element_pt(ielem)->node_pt(jnod_local);
215 finite_element_pt(ielem)->node_pt(jnod_local)=
216 finite_element_pt(ielem_neigh)->node_pt(jnod_local_neigh);
223 Node_pt[node_count]=finite_element_pt(ielem)->node_pt(jnod_local);
228 if ((i2==0)&&(ilayer==0))
230 this->convert_to_boundary_node(Node_pt[node_count]);
231 add_boundary_node(0,Node_pt[node_count]);
235 if ((i2==n_p-1)&&(ilayer==nlayer-1))
237 this->convert_to_boundary_node(Node_pt[node_count]);
238 add_boundary_node(4,Node_pt[node_count]);
244 this->convert_to_boundary_node(Node_pt[node_count]);
245 add_boundary_node(1,Node_pt[node_count]);
251 this->convert_to_boundary_node(Node_pt[node_count]);
252 add_boundary_node(2,Node_pt[node_count]);
273 for (
unsigned i2=0;i2<n_p;i2++)
277 for (
unsigned i1=0;i1<n_p;i1++)
281 for (
unsigned i0=0;i0<n_p;i0++)
285 unsigned jnod_local=i0+i1*n_p+i2*n_p*n_p;
292 if ((i2==0)&&(ilayer>0))
296 unsigned ielem_neigh=ielem-3;
299 unsigned i0_neigh=i0;
300 unsigned i1_neigh=i1;
301 unsigned i2_neigh=n_p-1;
302 unsigned jnod_local_neigh=i0_neigh+i1_neigh*n_p+i2_neigh*n_p*n_p;
306 for (
unsigned i=0;i<3;i++)
308 double error=std::fabs(
309 finite_element_pt(ielem)->node_pt(jnod_local)->x(i)-
310 finite_element_pt(ielem_neigh)->
311 node_pt(jnod_local_neigh)->x(i));
312 if (error>node_kill_tol)
314 oomph_info <<
"Error in node killing for i " 315 << i <<
" " << error << std::endl;
321 delete finite_element_pt(ielem)->node_pt(jnod_local);
325 finite_element_pt(ielem)->node_pt(jnod_local)=
326 finite_element_pt(ielem_neigh)->node_pt(jnod_local_neigh);
338 unsigned ielem_neigh=ielem-1;
341 unsigned i0_neigh=n_p-1;
342 unsigned i1_neigh=i1;
343 unsigned i2_neigh=i2;
344 unsigned jnod_local_neigh=i0_neigh+i1_neigh*n_p+i2_neigh*n_p*n_p;
348 for (
unsigned i=0;i<3;i++)
350 double error=std::fabs(
351 finite_element_pt(ielem)->node_pt(jnod_local)->x(i)-
352 finite_element_pt(ielem_neigh)->
353 node_pt(jnod_local_neigh)->x(i));
354 if (error>node_kill_tol)
356 oomph_info <<
"Error in node killing for i " 357 << i <<
" " << error << std::endl;
363 delete finite_element_pt(ielem)->node_pt(jnod_local);
367 finite_element_pt(ielem)->node_pt(jnod_local)=
368 finite_element_pt(ielem_neigh)->node_pt(jnod_local_neigh);
376 Node_pt[node_count]=finite_element_pt(ielem)->node_pt(jnod_local);
381 if ((i2==0)&&(ilayer==0))
383 this->convert_to_boundary_node(Node_pt[node_count]);
384 add_boundary_node(0,Node_pt[node_count]);
388 if ((i2==n_p-1)&&(ilayer==nlayer-1))
390 this->convert_to_boundary_node(Node_pt[node_count]);
391 add_boundary_node(4,Node_pt[node_count]);
397 this->convert_to_boundary_node(Node_pt[node_count]);
398 add_boundary_node(2,Node_pt[node_count]);
404 this->convert_to_boundary_node(Node_pt[node_count]);
405 add_boundary_node(3,Node_pt[node_count]);
410 (double(ilayer)+double(i2)/double(n_p-1))*
415 double(i1)/double(n_p-1)*0.5*(
Xi_hi[1]-
Xi_lo[1]);
417 Node_pt[node_count]->set_coordinates_on_boundary(3,zeta);
437 for (
unsigned i2=0;i2<n_p;i2++)
441 for (
unsigned i1=0;i1<n_p;i1++)
445 for (
unsigned i0=0;i0<n_p;i0++)
449 unsigned jnod_local=i0+i1*n_p+i2*n_p*n_p;
456 if ((i2==0)&&(ilayer>0))
460 unsigned ielem_neigh=ielem-3;
463 unsigned i0_neigh=i0;
464 unsigned i1_neigh=i1;
465 unsigned i2_neigh=n_p-1;
466 unsigned jnod_local_neigh=i0_neigh+i1_neigh*n_p+i2_neigh*n_p*n_p;
469 for (
unsigned i=0;i<3;i++)
471 double error=std::fabs(
472 finite_element_pt(ielem)->node_pt(jnod_local)->x(i)-
473 finite_element_pt(ielem_neigh)->
474 node_pt(jnod_local_neigh)->x(i));
475 if (error>node_kill_tol)
477 oomph_info <<
"Error in node killing for i " 478 << i <<
" " << error << std::endl;
484 delete finite_element_pt(ielem)->node_pt(jnod_local);
488 finite_element_pt(ielem)->node_pt(jnod_local)=
489 finite_element_pt(ielem_neigh)->node_pt(jnod_local_neigh);
502 unsigned ielem_neigh=ielem-1;
505 unsigned i0_neigh=i1;
506 unsigned i1_neigh=n_p-1;
507 unsigned i2_neigh=i2;
508 unsigned jnod_local_neigh=i0_neigh+i1_neigh*n_p+i2_neigh*n_p*n_p;
511 for (
unsigned i=0;i<3;i++)
513 double error=std::fabs(
514 finite_element_pt(ielem)->node_pt(jnod_local)->x(i)-
515 finite_element_pt(ielem_neigh)->
516 node_pt(jnod_local_neigh)->x(i));
517 if (error>node_kill_tol)
519 oomph_info <<
"Error in node killing for i " 520 << i <<
" " << error << std::endl;
526 delete finite_element_pt(ielem)->node_pt(jnod_local);
530 finite_element_pt(ielem)->node_pt(jnod_local)=
531 finite_element_pt(ielem_neigh)->node_pt(jnod_local_neigh);
537 if ((i1==0)&&(i0!=n_p-1))
541 unsigned ielem_neigh=ielem-2;
544 unsigned i0_neigh=i0;
545 unsigned i1_neigh=n_p-1;
546 unsigned i2_neigh=i2;
547 unsigned jnod_local_neigh=i0_neigh+i1_neigh*n_p+i2_neigh*n_p*n_p;
550 for (
unsigned i=0;i<3;i++)
552 double error=std::fabs(
553 finite_element_pt(ielem)->node_pt(jnod_local)->x(i)-
554 finite_element_pt(ielem_neigh)->
555 node_pt(jnod_local_neigh)->x(i));
556 if (error>node_kill_tol)
558 oomph_info <<
"Error in node killing for i " 559 << i <<
" " << error << std::endl;
565 delete finite_element_pt(ielem)->node_pt(jnod_local);
569 finite_element_pt(ielem)->node_pt(jnod_local)=
570 finite_element_pt(ielem_neigh)->node_pt(jnod_local_neigh);
577 Node_pt[node_count]=finite_element_pt(ielem)->
583 if ((i2==0)&&(ilayer==0))
585 this->convert_to_boundary_node(Node_pt[node_count]);
586 add_boundary_node(0,Node_pt[node_count]);
590 if ((i2==n_p-1)&&(ilayer==nlayer-1))
592 this->convert_to_boundary_node(Node_pt[node_count]);
593 add_boundary_node(4,Node_pt[node_count]);
599 this->convert_to_boundary_node(Node_pt[node_count]);
600 add_boundary_node(1,Node_pt[node_count]);
607 this->convert_to_boundary_node(Node_pt[node_count]);
608 add_boundary_node(3,Node_pt[node_count]);
613 (double(ilayer)+double(i2)/double(n_p-1))*
618 double(i0)/double(n_p-1)*0.5*(
Xi_hi[1]-
Xi_lo[1]);
620 Node_pt[node_count]->set_coordinates_on_boundary(3,zeta);
641 std::ostringstream error_stream;
642 error_stream <<
"Error in killing nodes\n" 643 <<
"The most probable cause is that the domain is not\n" 644 <<
"compatible with the mesh.\n" 645 <<
"For the QuarterTubeMesh, the domain must be\n" 646 <<
"topologically consistent with a quarter tube with a\n" 647 <<
"non-curved centreline.\n";
648 throw OomphLibError(error_stream.str(),
649 OOMPH_CURRENT_FUNCTION,
650 OOMPH_EXCEPTION_LOCATION);
654 setup_boundary_element_info();
689 template <
class ELEMENT>
696 AlgebraicElementBase* algebraic_element_pt=
697 dynamic_cast<AlgebraicElementBase*
>(Mesh::element_pt(0));
699 if (algebraic_element_pt==0)
701 std::ostringstream error_message;
703 "Element in AlgebraicRefineableQuarterTubeMesh must be\n ";
704 error_message <<
"derived from AlgebraicElementBase\n";
705 error_message<<
"but it is of type: " 706 <<
typeid(Mesh::element_pt(0)).name() << std::endl;
707 std::string function_name =
708 "AlgebraicRefineableQuarterTubeMesh::";
709 function_name +=
"setup_algebraic_node_update()";
710 throw OomphLibError(error_message.str(),
711 OOMPH_CURRENT_FUNCTION,
712 OOMPH_EXCEPTION_LOCATION);
717 unsigned nnodes_3d = Mesh::finite_element_pt(0)->nnode();
720 unsigned nnodes_1d = Mesh::finite_element_pt(0)->nnode_1d();
721 unsigned nnodes_2d = nnodes_1d*nnodes_1d;
725 unsigned tl_node = nnodes_2d-nnodes_1d;
726 unsigned br_node = nnodes_1d-1;
730 double x_c_element= Mesh::finite_element_pt(1)->node_pt(tl_node)->x(0);
731 double y_c_element= Mesh::finite_element_pt(1)->node_pt(tl_node)->x(1);
735 double x_wall= Mesh::finite_element_pt(1)->node_pt(br_node)->x(0);
739 double y_wall= Mesh::finite_element_pt(2)->node_pt(tl_node)->x(1);
742 Lambda_x = Centre_box_size*x_c_element/x_wall;
743 Lambda_y = Centre_box_size*y_c_element/y_wall;
746 unsigned nelements = Mesh::nelement();
749 for (
unsigned e=0; e<nelements; e++)
752 FiniteElement* el_pt=Mesh::finite_element_pt(e);
755 unsigned region_id = e%3;
759 unsigned nstart=nnodes_2d;
766 for (
unsigned n=nstart; n<nnodes_3d; n++)
774 double z = el_pt->node_pt(n)->x(2);
778 Vector<double> xi(2);
781 GeomObject* obj_br_pt;
782 Vector<double> s_br(2);
783 this->
Wall_pt->locate_zeta(xi,obj_br_pt,s_br);
788 GeomObject* obj_tl_pt;
789 Vector<double> s_tl(2);
790 this->
Wall_pt->locate_zeta(xi,obj_tl_pt,s_tl);
797 double x=el_pt->node_pt(n)->x(0);
798 double y=el_pt->node_pt(n)->x(1);
801 Vector<GeomObject*> geom_object_pt(2);
804 geom_object_pt[0] = obj_br_pt;
807 geom_object_pt[1] = obj_tl_pt;
810 Vector<double> ref_value(7);
813 ref_value[0]=x/x_c_element;
816 ref_value[1]=y/y_c_element;
827 ref_value[3]=s_br[0];
828 ref_value[4]=s_br[1];
832 ref_value[5]=s_tl[0];
833 ref_value[6]=s_tl[1];
836 static_cast<AlgebraicNode*
>(el_pt->node_pt(n))->
837 add_node_update_info(
846 else if (region_id==1)
849 double fract = 1.0/double(nnodes_1d-1);
852 double rho_0 = fract * double(n%nnodes_1d);
855 double rho_1 = fract * double((n/nnodes_1d)%nnodes_1d);
865 GeomObject* obj_wall_pt;
866 Vector<double> s_wall(2);
867 this->
Wall_pt->locate_zeta(xi,obj_wall_pt,s_wall);
870 Vector<GeomObject*> geom_object_pt(3);
873 geom_object_pt[0] = obj_br_pt;
876 geom_object_pt[1] = obj_tl_pt;
879 geom_object_pt[2] = obj_wall_pt;
882 Vector<double> ref_value(9);
895 ref_value[3]=s_br[0];
896 ref_value[4]=s_br[1];
900 ref_value[5]=s_tl[0];
901 ref_value[6]=s_tl[1];
905 ref_value[7]=s_wall[0];
906 ref_value[8]=s_wall[1];
909 static_cast<AlgebraicNode*
>(el_pt->node_pt(n))->
910 add_node_update_info(
919 else if (region_id==2)
922 double fract = 1.0/double(nnodes_1d-1);
925 double rho_0 = fract * double(n%nnodes_1d);
928 double rho_1 = fract * double((n/nnodes_1d)%nnodes_1d);
938 GeomObject* obj_wall_pt;
939 Vector<double> s_wall(2);
940 this->
Wall_pt->locate_zeta(xi,obj_wall_pt,s_wall);
943 Vector<GeomObject*> geom_object_pt(3);
946 geom_object_pt[0] = obj_br_pt;
949 geom_object_pt[1] = obj_tl_pt;
952 geom_object_pt[2] = obj_wall_pt;
955 Vector<double> ref_value(9);
968 ref_value[3]=s_br[0];
969 ref_value[4]=s_br[1];
973 ref_value[5]=s_tl[0];
974 ref_value[6]=s_tl[1];
978 ref_value[7]=s_wall[0];
979 ref_value[8]=s_wall[1];
982 static_cast<AlgebraicNode*
>(el_pt->node_pt(n))->
983 add_node_update_info(
998 template <
class ELEMENT>
1017 if (t>node_pt->position_time_stepper_pt()->nprev_values())
1019 std::string error_message =
1020 "Trying to update the nodal position at a time level\n";
1021 error_message +=
"beyond the number of previous values in the nodes'\n";
1022 error_message +=
"position timestepper. This seems highly suspect!\n";
1023 error_message +=
"If you're sure the code behaves correctly\n";
1024 error_message +=
"in your application, remove this warning \n";
1025 error_message +=
"or recompile with PARNOID switched off.\n";
1027 std::string function_name =
1028 "AlgebraicRefineableQuarterTubeMesh::";
1029 function_name +=
"node_update_central_region()",
1030 throw OomphLibError(error_message,
1031 OOMPH_CURRENT_FUNCTION,
1032 OOMPH_EXCEPTION_LOCATION);
1037 Vector<double> ref_value(node_pt->vector_ref_value(Central_region));
1040 Vector<GeomObject*> geom_object_pt(node_pt->
1041 vector_geom_object_pt(Central_region));
1044 double rho_x=ref_value[0];
1047 double rho_y=ref_value[1];
1052 GeomObject* obj_br_pt = geom_object_pt[0];
1055 Vector<double> s_br(2);
1056 s_br[0]=ref_value[3];
1057 s_br[1]=ref_value[4];
1060 unsigned n_dim = obj_br_pt->ndim();
1061 Vector<double> r_br(n_dim);
1062 obj_br_pt->position(t,s_br,r_br);
1067 GeomObject* obj_tl_pt=geom_object_pt[1];
1070 Vector<double> s_tl(2);
1071 s_tl[0]=ref_value[5];
1072 s_tl[1]=ref_value[6];
1075 Vector<double> r_tl(n_dim);
1076 obj_tl_pt->position(t,s_tl,r_tl);
1079 node_pt->x(t,0)=r_br[0]*Lambda_x*rho_x;
1080 node_pt->x(t,1)=r_tl[1]*Lambda_y*rho_y;
1081 node_pt->x(t,2)=(r_br[2]+r_tl[2])*0.5;
1089 template <
class ELEMENT>
1108 if (t>node_pt->position_time_stepper_pt()->nprev_values())
1110 std::string error_message =
1111 "Trying to update the nodal position at a time level";
1112 error_message +=
"beyond the number of previous values in the nodes'";
1113 error_message +=
"position timestepper. This seems highly suspect!";
1114 error_message +=
"If you're sure the code behaves correctly";
1115 error_message +=
"in your application, remove this warning ";
1116 error_message +=
"or recompile with PARNOID switched off.";
1118 std::string function_name =
1119 "AlgebraicRefineableQuarterTubeSectorMesh::";
1120 function_name +=
"node_update_lower_right_region()",
1121 throw OomphLibError(error_message,
1122 OOMPH_CURRENT_FUNCTION,
1123 OOMPH_EXCEPTION_LOCATION);
1128 Vector<double> ref_value(node_pt->vector_ref_value(Lower_right_region));
1133 geom_object_pt(node_pt->vector_geom_object_pt(Lower_right_region));
1136 double rho_0=ref_value[0];
1142 double rho_1=ref_value[1];
1147 GeomObject* obj_br_pt=geom_object_pt[0];
1150 Vector<double> s_br(2);
1151 s_br[0]=ref_value[3];
1152 s_br[1]=ref_value[4];
1155 unsigned n_dim=obj_br_pt->ndim();
1158 Vector<double> r_br(n_dim);
1159 obj_br_pt->position(t,s_br,r_br);
1164 GeomObject* obj_tl_pt=geom_object_pt[1];
1167 Vector<double> s_tl(2);
1168 s_tl[0]=ref_value[5];
1169 s_tl[1]=ref_value[6];
1171 Vector<double> r_tl(n_dim);
1172 obj_tl_pt->position(t,s_tl,r_tl);
1177 GeomObject* obj_wall_pt=geom_object_pt[2];
1180 Vector<double> s_wall(2);
1181 s_wall[0]=ref_value[7];
1182 s_wall[1]=ref_value[8];
1184 Vector<double> r_wall(n_dim);
1185 obj_wall_pt->position(t,s_wall,r_wall);
1188 Vector<double> r_corner(n_dim);
1189 r_corner[0]=Lambda_x*r_br[0];
1190 r_corner[1]=Lambda_y*r_tl[1];
1191 r_corner[2]=(r_br[2]+r_tl[2])*0.5;
1194 Vector<double> r_left(n_dim);
1195 r_left[0]=r_corner[0];
1196 r_left[1]=rho_1*r_corner[1];
1197 r_left[2]=r_corner[2];
1200 node_pt->x(t,0)=r_left[0]+rho_0*(r_wall[0]-r_left[0]);
1201 node_pt->x(t,1)=r_left[1]+rho_0*(r_wall[1]-r_left[1]);
1202 node_pt->x(t,2)=r_left[2]+rho_0*(r_wall[2]-r_left[2]);
1209 template <
class ELEMENT>
1228 if (t>node_pt->position_time_stepper_pt()->nprev_values())
1230 std::string error_message =
1231 "Trying to update the nodal position at a time level";
1232 error_message +=
"beyond the number of previous values in the nodes'";
1233 error_message +=
"position timestepper. This seems highly suspect!";
1234 error_message +=
"If you're sure the code behaves correctly";
1235 error_message +=
"in your application, remove this warning ";
1236 error_message +=
"or recompile with PARNOID switched off.";
1238 std::string function_name =
1239 "AlgebraicRefineableQuarterTubeMesh::";
1240 function_name +=
"node_update_upper_left_region()";
1242 throw OomphLibError(error_message,
1243 OOMPH_CURRENT_FUNCTION,
1244 OOMPH_EXCEPTION_LOCATION);
1249 Vector<double> ref_value(node_pt->vector_ref_value(Upper_left_region));
1254 geom_object_pt(node_pt->vector_geom_object_pt(Upper_left_region));
1257 double rho_0=ref_value[0];
1260 double rho_1=ref_value[1];
1268 GeomObject* obj_br_pt=geom_object_pt[0];
1271 unsigned n_dim=obj_br_pt->ndim();
1274 Vector<double> s_br(2);
1275 s_br[0]=ref_value[3];
1276 s_br[1]=ref_value[4];
1279 Vector<double> r_br(n_dim);
1280 obj_br_pt->position(t,s_br,r_br);
1285 GeomObject* obj_tl_pt=node_pt->geom_object_pt(1);
1288 Vector<double> s_tl(2);
1289 s_tl[0]=ref_value[5];
1290 s_tl[1]=ref_value[6];
1292 Vector<double> r_tl(n_dim);
1293 obj_tl_pt->position(t,s_tl,r_tl);
1298 GeomObject* obj_wall_pt=node_pt->geom_object_pt(2);
1301 Vector<double> s_wall(2);
1302 s_wall[0]=ref_value[7];
1303 s_wall[1]=ref_value[8];
1305 Vector<double> r_wall(n_dim);
1306 obj_wall_pt->position(t,s_wall,r_wall);
1309 Vector<double> r_corner(n_dim);
1310 r_corner[0]=Lambda_x*r_br[0];
1311 r_corner[1]=Lambda_y*r_tl[1];
1312 r_corner[2]=(r_br[2]+r_tl[2])*0.5;
1315 Vector<double> r_top(n_dim);
1316 r_top[0]=rho_0*r_corner[0];
1317 r_top[1]=r_corner[1];
1318 r_top[2]=r_corner[2];
1321 node_pt->x(t,0)=r_top[0]+rho_1*(r_wall[0]-r_top[0]);
1322 node_pt->x(t,1)=r_top[1]+rho_1*(r_wall[1]-r_top[1]);
1323 node_pt->x(t,2)=r_top[2]+rho_1*(r_wall[2]-r_top[2]);
1332 template <
class ELEMENT>
1337 Vector<double> ref_value(node_pt->vector_ref_value(region_id));
1340 Vector<GeomObject*> geom_object_pt(node_pt->vector_geom_object_pt(region_id));
1343 node_pt->kill_node_update_info(region_id);
1357 double z = ref_value[2];
1363 Vector<double> xi(2);
1368 GeomObject* obj_br_pt;
1369 Vector<double> s_br(2);
1370 this->
Wall_pt->locate_zeta(xi,obj_br_pt,s_br);
1373 geom_object_pt[0] = obj_br_pt;
1376 ref_value[3]=s_br[0];
1377 ref_value[4]=s_br[1];
1387 GeomObject* obj_tl_pt;
1388 Vector<double> s_tl(2);
1389 this->
Wall_pt->locate_zeta(xi,obj_tl_pt,s_tl);
1392 geom_object_pt[1] = obj_tl_pt;
1395 ref_value[5]=s_tl[0];
1396 ref_value[6]=s_tl[1];
1398 if (region_id!=Central_region)
1404 if (region_id==Lower_right_region)
1407 double rho_1=ref_value[1];
1410 xi[1]=xi_lo+rho_1*fract_mid*(xi_hi-xi_lo);
1415 double rho_0=ref_value[0];
1418 xi[1]=xi_hi-rho_0*(1.0-fract_mid)*(xi_hi-xi_lo);
1424 GeomObject* obj_wall_pt;
1425 Vector<double> s_wall(2);
1426 this->
Wall_pt->locate_zeta(xi,obj_wall_pt,s_wall);
1429 geom_object_pt[2] = obj_wall_pt;
1432 ref_value[7]=s_wall[0];
1433 ref_value[8]=s_wall[1];
1437 node_pt->add_node_update_info(
void node_update_lower_right_region(const unsigned &t, AlgebraicNode *&node_pt)
Algebraic update function for a node that is located in the lower-right region.
QuarterTubeMesh(GeomObject *wall_pt, const Vector< double > &xi_lo, const double &fract_mid, const Vector< double > &xi_hi, const unsigned &nlayer, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass pointer to geometric object that specifies the wall, start and end coordinates on t...
void update_node_update_in_region(AlgebraicNode *&node_pt, int ®ion_id)
Update algebraic node update function for nodes in the region defined by region_id.
Vector< double > Xi_hi
Upper limits for the coordinates along the wall.
Vector< double > Xi_lo
Lower limits for the coordinates along the wall.
3D quarter tube mesh class. The domain is specified by the GeomObject that identifies boundary 3...
void node_update_central_region(const unsigned &t, AlgebraicNode *&node_pt)
Algebraic update function for a node that is located in the central region.
GeomObject * Wall_pt
Pointer to the geometric object that represents the curved wall.
Quarter tube as domain. Domain is bounded by curved boundary which is represented by a GeomObject...
double s_squashed(const double &s)
Function that squashes the outer two macro elements towards the wall by mapping the input value of th...
void node_update_upper_left_region(const unsigned &t, AlgebraicNode *&node_pt)
Algebraic update function for a node that is located in the upper-left region.
QuarterTubeDomain * Domain_pt
Pointer to domain.
void setup_algebraic_node_update()
Setup algebraic update operation for all nodes.