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.