26#ifndef OOMPH_QUARTER_TUBE_MESH_HEADER
27#define OOMPH_QUARTER_TUBE_MESH_HEADER
30#include "generic/refineable_brick_mesh.h"
31#include "generic/macro_element.h"
32#include "generic/domain.h"
33#include "generic/algebraic_elements.h"
34#include "generic/brick_mesh.h"
35#include "generic/macro_element_node_update_element.h"
62 template<
class ELEMENT>
156 template<
class ELEMENT>
158 public RefineableBrickMesh<ELEMENT>
206 oomph_info <<
"Successfully built octree forest " << std::endl;
228 class MacroElementNodeUpdateNode;
233 template<
class ELEMENT>
235 :
public virtual MacroElementNodeUpdateMesh,
253 : MacroElementNodeUpdateMesh(),
265 <<
"MacroElementNodeUpdateRefineableQuarterTubeMesh needs"
266 <<
"to be of type MacroElementNodeUpdateElement!\n";
271 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh::\n";
273 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh()";
302 "Doesn't make sense to use an MacroElementNodeUpdateMesh with\n";
304 "SolidElements so specifying update_all_solid_nodes=true\n";
308 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh::\n";
315 MacroElementNodeUpdateMesh::node_update();
338 <<
"Failed to upcast to MacroElementNodeUpdateElementBase\n";
340 "MacroElementNodeUpdateElementBase\n";
344 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh::\n";
364 MacroElementNodeUpdateMesh::set_geom_object_vector_pt(
geom_object_pt);
367 MacroElementNodeUpdateMesh::macro_domain_pt() = this->
domain_pt();
429 template<
class ELEMENT>
431 :
public virtual AlgebraicMesh,
463 <<
"AlgebraicRefineableQuarterTubeMesh needs"
464 <<
"to be of type AlgebraicElement!\n";
468 std::string
function_name =
" AlgebraicRefineableQuarterTubeMesh::\n";
479 AlgebraicMesh::add_geom_object_list_pt(
wall_pt);
491 return AlgebraicMesh::self_test();
502 error_message <<
"AxialSpacingFctPt has not been implemented "
503 <<
"for the AlgebraicRefineableQuarterTubeMesh\n";
506 " AlgebraicRefineableQuarterTubeMesh::AxialSpacingFctPt()";
525 "Doesn't make sense to use an AlgebraicMesh with\n";
527 "SolidElements so specifying update_all_solid_nodes=true\n";
530 std::string
function_name =
" AlgebraicRefineableQuarterTubeMesh::";
538 AlgebraicMesh::node_update();
549 unsigned id =
node_pt->node_update_fct_id();
578 std::string
function_name =
" AlgebraicRefineableQuarterTubeMesh::";
593 node_pt->node_update_fct_id(
id);
AlgebraicMesh version of RefineableQuarterTubeMesh.
void node_update_central_region(const unsigned &t, AlgebraicNode *&node_pt)
Algebraic update function for a node that is located in the central region.
unsigned self_test()
Run self-test for algebraic mesh – return 0/1 for OK/failure.
void setup_algebraic_node_update()
Setup algebraic update operation for all nodes.
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.
double Lambda_x
Fractional width of central region.
double Centre_box_size
Size of centre box.
QuarterTubeDomain::AxialSpacingFctPt & axial_spacing_fct_pt()
Broken version of the QuarterTubeDomain function Function is broken because axial spacing isn't imple...
void update_node_update(AlgebraicNode *&node_pt)
Update the node update info for specified algebraic node following any spatial mesh adaptation.
double Lambda_y
Fractional height of central region.
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.
AlgebraicRefineableQuarterTubeMesh(GeomObject *wall_pt, const Vector< double > &xi_lo, const double &fract_mid, const Vector< double > &xi_hi, const unsigned &nlayer, const double centre_box_size=1.0, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass pointer to geometric object, start and end coordinates of the geometric object and ...
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.
void node_update(const bool &update_all_solid_nodes=false)
Resolve mesh update: Update current nodal positions via algebraic node update. [Doesn't make sense to...
void algebraic_node_update(const unsigned &t, AlgebraicNode *&node_pt)
Implement the algebraic node update function for a node at time level t (t=0: present; t>0: previous)...
Collapsible channel mesh with MacroElement-based node update. The collapsible segment is represented ...
MacroElementNodeUpdate version of RefineableQuarterTubeMesh.
MacroElementNodeUpdateRefineableQuarterTubeMesh(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, start and end coordinates on the geometric object and ...
void node_update(const bool &update_all_solid_nodes=false)
Resolve mesh update: Update current nodal positions via sparse MacroElement-based update....
virtual ~MacroElementNodeUpdateRefineableQuarterTubeMesh()
Destructor: empty.
void setup_macro_element_node_update()
Setup all the information that's required for MacroElement-based node update: Tell the elements that ...
Quarter tube as domain. Domain is bounded by curved boundary which is represented by a GeomObject....
BLSquashFctPt & bl_squash_fct_pt()
Function pointer for function that squashes the outer two macro elements towards the wall by mapping ...
AxialSpacingFctPt & axial_spacing_fct_pt()
Function pointer for function that implements axial spacing of macro elements.
double(* BLSquashFctPt)(const double &s)
Typedef for function pointer for function that squashes the outer two macro elements towards the wall...
double(* AxialSpacingFctPt)(const double &xi)
Typedef for function pointer for function that implements axial spacing of macro elements.
3D quarter tube mesh class. The domain is specified by the GeomObject that identifies boundary 3....
GeomObject *& wall_pt()
Access function to GeomObject representing wall.
QuarterTubeDomain * Domain_pt
Pointer to domain.
Vector< double > Xi_lo
Lower limits for the coordinates along the wall.
QuarterTubeDomain * domain_pt() const
Access function to underlying domain.
GeomObject * Wall_pt
Pointer to the geometric object that represents the curved wall.
Vector< double > Xi_hi
Upper limits for the coordinates along the wall.
virtual QuarterTubeDomain::AxialSpacingFctPt & axial_spacing_fct_pt()
Function pointer for function for axial spacing.
QuarterTubeDomain * domain_pt()
Access function to domain.
QuarterTubeDomain::BLSquashFctPt & bl_squash_fct_pt()
Function pointer for function that squashes the outer macro elements towards the wall by mapping the ...
double Fract_mid
Fraction along wall where outer ring is to be divided.
virtual ~QuarterTubeMesh()
Destructor: empty.
Adaptative version of the QuarterTubeMesh base mesh. The domain is specified by the GeomObject that i...
virtual ~RefineableQuarterTubeMesh()
Destructor: empty.
RefineableQuarterTubeMesh(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 for adaptive deformable quarter tube mesh class. The domain is specified by the GeomObjec...