31 #ifndef OOMPH_COLLAPSIBLE_CHANNEL_MESH_HEADER 32 #define OOMPH_COLLAPSIBLE_CHANNEL_MESH_HEADER 35 #include "../generic/refineable_quad_mesh.h" 36 #include "../generic/macro_element.h" 37 #include "../generic/domain.h" 38 #include "../generic/quad_mesh.h" 45 #include "../generic/macro_element_node_update_element.h" 49 #include "../generic/algebraic_elements.h" 69 template <
class ELEMENT>
81 const unsigned& ncollapsible,
82 const unsigned& ndown,
85 const double& lcollapsible,
89 TimeStepper* time_stepper_pt=
90 &Mesh::Default_TimeStepper);
188 template <
class ELEMENT>
191 public RefineableQuadMesh<ELEMENT>
199 const unsigned& ncollapsible,
200 const unsigned& ndown,
203 const double& lcollapsible,
207 TimeStepper* time_stepper_pt=
208 &Mesh::Default_TimeStepper) :
210 lup, lcollapsible, ldown, ly,
215 this->setup_quadtree_forest();
242 template<
class ELEMENT>
244 public virtual MacroElementNodeUpdateMesh,
256 const unsigned& ncollapsible,
257 const unsigned& ndown,
260 const double& lcollapsible,
264 TimeStepper* time_stepper_pt=
265 &Mesh::Default_TimeStepper) :
267 nup, ncollapsible, ndown, ny,
268 lup, lcollapsible, ldown, ly,
273 ELEMENT* el_pt=
new ELEMENT;
274 if (dynamic_cast<MacroElementNodeUpdateElementBase*>(el_pt)==0)
276 std::ostringstream error_message;
278 <<
"Base class for ELEMENT in " 279 <<
"MacroElementNodeUpdateCollapsibleChannelMesh needs" 280 <<
"to be of type MacroElementNodeUpdateElement!\n";
281 error_message <<
"Whereas it is: typeid(el_pt).name()" 282 <<
typeid(el_pt).name()
285 std::string function_name =
286 "MacroElementNodeUpdateCollapsibleChannelMesh::\n";
288 "MacroElementNodeUpdateCollapsibleChannelMesh()";
290 throw OomphLibError(error_message.str(),
291 OOMPH_CURRENT_FUNCTION,
292 OOMPH_EXCEPTION_LOCATION);
300 unsigned n_element = this->nelement();
301 for(
unsigned i=0;i<n_element;i++)
304 ELEMENT *el_pt =
dynamic_cast<ELEMENT*
>(this->element_pt(i));
308 MacroElementNodeUpdateElementBase* m_el_pt=
dynamic_cast< 309 MacroElementNodeUpdateElementBase*
>(el_pt);
312 std::ostringstream error_message;
314 <<
"Failed to upcast to MacroElementNodeUpdateElementBase\n";
316 <<
"Element must be derived from MacroElementNodeUpdateElementBase\n";
317 error_message <<
"but it is of type " <<
typeid(el_pt).name();
319 std::string function_name =
320 "MacroElementNodeUpdateCollapsibleChannelMesh::\n";
322 "MacroElementNodeUpdateCollapsibleChannelMesh()";
324 throw OomphLibError(error_message.str(),
325 OOMPH_CURRENT_FUNCTION,
326 OOMPH_EXCEPTION_LOCATION);
331 Vector<GeomObject*> geom_object_pt(1);
332 geom_object_pt[0] = this->
Wall_pt;
336 el_pt->set_node_update_info(geom_object_pt);
340 Vector<GeomObject*> geom_object_pt(1);
341 geom_object_pt[0] = this->
Wall_pt;
342 MacroElementNodeUpdateMesh::set_geom_object_vector_pt(geom_object_pt);
345 MacroElementNodeUpdateMesh::macro_domain_pt()=this->
domain_pt();
374 template<
class ELEMENT>
377 public virtual RefineableQuadMesh<ELEMENT>
388 const unsigned& ncollapsible,
389 const unsigned& ndown,
392 const double& lcollapsible,
396 TimeStepper* time_stepper_pt=
397 &Mesh::Default_TimeStepper) :
399 nup, ncollapsible, ndown, ny,
400 lup, lcollapsible, ldown, ly,
404 nup, ncollapsible, ndown, ny,
405 lup, lcollapsible, ldown, ly,
411 this->setup_quadtree_forest();
433 template<
class ELEMENT>
448 const unsigned& ncollapsible,
449 const unsigned& ndown,
452 const double& lcollapsible,
456 TimeStepper* time_stepper_pt=
457 &Mesh::Default_TimeStepper) :
459 lup, lcollapsible, ldown, ly,
464 AlgebraicMesh::add_geom_object_list_pt(wall_pt);
467 setup_algebraic_node_update();
481 const unsigned& ncollapsible,
482 const unsigned& ndown,
485 const double& lcollapsible,
490 TimeStepper* time_stepper_pt=
491 &Mesh::Default_TimeStepper) :
493 lup, lcollapsible, ldown, ly,
498 AlgebraicMesh::add_geom_object_list_pt(wall_pt);
507 setup_algebraic_node_update();
520 std::ostringstream error_message;
522 <<
"It does not make sense to set the bl_squash_fct_pt \n" 523 <<
"outside the constructor as it's only used to set up the \n" 524 <<
"algebraic remesh data when the algebraic mesh is first built. \n";
525 std::string function_name =
526 "AlgebraicCollapsibleChannelMesh::bl_squash_fct_pt()\n";
528 throw OomphLibError(error_message.str(),
529 OOMPH_CURRENT_FUNCTION,
530 OOMPH_EXCEPTION_LOCATION);
546 std::ostringstream error_message;
548 <<
"It does not make sense to set the axial_spacing_fct_pt \n" 549 <<
"outside the constructor as it's only used to set up the \n" 550 <<
"algebraic remesh data when the algebraic mesh is first built. \n";
551 std::string function_name =
552 "AlgebraicCollapsibleChannelMesh::axial_spacing_fct_pt()\n";
554 throw OomphLibError(error_message.str(),
555 OOMPH_CURRENT_FUNCTION,
556 OOMPH_EXCEPTION_LOCATION);
565 void algebraic_node_update(
const unsigned& t, AlgebraicNode*& node_pt);
575 void setup_algebraic_node_update();
596 template<
class ELEMENT>
598 public RefineableQuadMesh<ELEMENT>,
611 const unsigned& ncollapsible,
612 const unsigned& ndown,
615 const double& lcollapsible,
619 TimeStepper* time_stepper_pt=
620 &Mesh::Default_TimeStepper) :
622 lup, lcollapsible, ldown, ly,
626 lup, lcollapsible, ldown, ly,
631 this->setup_quadtree_forest();
644 const unsigned& ncollapsible,
645 const unsigned& ndown,
648 const double& lcollapsible,
653 TimeStepper* time_stepper_pt=
654 &Mesh::Default_TimeStepper) :
656 lup, lcollapsible, ldown, ly,
660 lup, lcollapsible, ldown, ly,
662 bl_squash_function_pt,
666 this->setup_quadtree_forest();
671 void update_node_update(AlgebraicNode*& node_pt);
unsigned Ncollapsible
Number of element columns in collapsible part.
virtual ~AlgebraicCollapsibleChannelMesh()
Destructor: empty.
CollapsibleChannelMesh(const unsigned &nup, const unsigned &ncollapsible, const unsigned &ndown, const unsigned &ny, const double &lup, const double &lcollapsible, const double &ldown, const double &ly, GeomObject *wall_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass number of elements in upstream/collapsible/ downstream segment and across the chann...
CollapsibleChannelDomain::BLSquashFctPt bl_squash_fct_pt() const
Function pointer for function that squashes the mesh near the walls. Default trivial mapping (the ide...
MacroElementNodeUpdateCollapsibleChannelMesh(const unsigned &nup, const unsigned &ncollapsible, const unsigned &ndown, const unsigned &ny, const double &lup, const double &lcollapsible, const double &ldown, const double &ly, GeomObject *wall_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass numbers of elements and dimensions of the various parts of the collapsible channel...
CollapsibleChannelDomain::BLSquashFctPt Dummy_fct_pt
Dummy function pointer.
CollapsibleChannelDomain * Domain_pt
Pointer to domain.
CollapsibleChannelDomain::BLSquashFctPt & bl_squash_fct_pt()
Function pointer for function that squashes the mesh near the walls. Default trivial mapping (the ide...
virtual ~MacroElementNodeUpdateCollapsibleChannelMesh()
Destructor: empty.
BLSquashFctPt & bl_squash_fct_pt()
Function pointer for function that squashes the macro elements near wall. Default mapping (identity) ...
void update_node_update(AlgebraicNode *&node_pt)
Update the node-udate data after mesh adaptation. Empty – no update of node update required as this ...
AlgebraicCollapsibleChannelMesh(const unsigned &nup, const unsigned &ncollapsible, const unsigned &ndown, const unsigned &ny, const double &lup, const double &lcollapsible, const double &ldown, const double &ly, GeomObject *wall_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass number of elements in upstream/collapsible/ downstream segment and across the chann...
MacroElementNodeUpdateRefineableCollapsibleChannelMesh(const unsigned &nup, const unsigned &ncollapsible, const unsigned &ndown, const unsigned &ny, const double &lup, const double &lcollapsible, const double &ldown, const double &ly, GeomObject *wall_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass numbers of elements and dimensions of the various parts of the collapsible channel...
~RefineableCollapsibleChannelMesh()
Destructor(empty)
AlgebraicCollapsibleChannelMesh(const unsigned &nup, const unsigned &ncollapsible, const unsigned &ndown, const unsigned &ny, const double &lup, const double &lcollapsible, const double &ldown, const double &ly, GeomObject *wall_pt, CollapsibleChannelDomain::BLSquashFctPt bl_squash_function_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass number of elements in upstream/collapsible/ downstream segment and across the chann...
Collapsible channel domain.
CollapsibleChannelDomain * domain_pt()
Access function to domain.
double(* AxialSpacingFctPt)(const double &xi)
Typedef for function pointer for function that implements axial spacing of macro elements.
unsigned Ny
Number of element rows across channel.
double(* BLSquashFctPt)(const double &s)
Typedef for function pointer for function that squashes the macro elements near the wall to help reso...
virtual CollapsibleChannelDomain::AxialSpacingFctPt & axial_spacing_fct_pt()
Function pointer for function that redistributes the elements in the axial direction. Virtual so we can break it in derived classes (e.g. the Algebraic versions of this mesh where it doesn't make any sense to provide the bl_squash_fct after the mesh has been built).
CollapsibleChannelDomain::BLSquashFctPt & axial_spacing_fct_pt()
Function pointer for function that redistributes nodes axially. Default trivial mapping (the identity...
unsigned Nup
Number of element columns in upstream part.
Basic collapsible channel mesh. The mesh is derived from the SimpleRectangularQuadMesh so it's node a...
RefineableCollapsibleChannelMesh(const unsigned &nup, const unsigned &ncollapsible, const unsigned &ndown, const unsigned &ny, const double &lup, const double &lcollapsible, const double &ldown, const double &ly, GeomObject *wall_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass number of elements, lengths, pointer to geometric object that describes the wall an...
~CollapsibleChannelMesh()
destructor
Collapsible channel mesh with algebraic node update.
AxialSpacingFctPt & axial_spacing_fct_pt()
Function pointer for function that implements axial spacing of macro elements.
RefineableAlgebraicCollapsibleChannelMesh(const unsigned &nup, const unsigned &ncollapsible, const unsigned &ndown, const unsigned &ny, const double &lup, const double &lcollapsible, const double &ldown, const double &ly, GeomObject *wall_pt, CollapsibleChannelDomain::BLSquashFctPt bl_squash_function_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass number of elements in upstream/collapsible/ downstream segment and across the chann...
RefineableAlgebraicCollapsibleChannelMesh(const unsigned &nup, const unsigned &ncollapsible, const unsigned &ndown, const unsigned &ny, const double &lup, const double &lcollapsible, const double &ldown, const double &ly, GeomObject *wall_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass number of elements in upstream/collapsible/ downstream segment and across the chann...
virtual CollapsibleChannelDomain::BLSquashFctPt & bl_squash_fct_pt()
Function pointer for function that squashes the mesh near the walls. Default trivial mapping (the ide...
virtual CollapsibleChannelDomain::AxialSpacingFctPt & axial_spacing_fct_pt() const
Function pointer for function that redistributes the elements in the axial direction. Const version.
unsigned Ndown
Number of element columns in downstream part.
const unsigned & ny() const
Access function for number of elements in y directions.
GeomObject * Wall_pt
Pointer to geometric object that represents the moving wall.
GeomObject *& wall_pt()
Access function to GeomObject representing wall.
virtual ~MacroElementNodeUpdateRefineableCollapsibleChannelMesh()
Destructor: empty.