30 #ifndef OOMPH_MY_ALGEBRAIC_COLLAPSIBLE_CHANNEL_MESH 31 #define OOMPH_MY_ALGEBRAIC_COLLAPSIBLE_CHANNEL_MESH 34 #include "meshes/collapsible_channel_mesh.h" 51 template<
class ELEMENT>
54 public virtual CollapsibleChannelMesh<ELEMENT>
65 const unsigned& ncollapsible,
66 const unsigned& ndown,
69 const double& lcollapsible,
73 TimeStepper* time_stepper_pt=
74 &Mesh::Default_TimeStepper) :
75 CollapsibleChannelMesh<ELEMENT>(nup, ncollapsible, ndown, ny,
76 lup, lcollapsible, ldown, ly,
94 const unsigned& ncollapsible,
95 const unsigned& ndown,
98 const double& lcollapsible,
102 CollapsibleChannelDomain::BLSquashFctPt bl_squash_function_pt,
103 TimeStepper* time_stepper_pt=
104 &Mesh::Default_TimeStepper) :
105 CollapsibleChannelMesh<ELEMENT>(nup, ncollapsible, ndown, ny,
106 lup, lcollapsible, ldown, ly,
111 this->Domain_pt->bl_squash_fct_pt()=bl_squash_function_pt;
114 CollapsibleChannelMesh<ELEMENT>::node_update();
132 std::ostringstream error_message;
134 <<
"It does not make sense to set the bl_squash_fct_pt \n" 135 <<
"outside the constructor as it's only used to set up the \n" 136 <<
"algebraic remesh data when the algebraic mesh is first built. \n";
137 std::string function_name =
138 "MyAlgebraicCollapsibleChannelMesh::bl_squash_fct_pt()\n";
140 throw OomphLibError(error_message.str(),
141 OOMPH_CURRENT_FUNCTION,
142 OOMPH_EXCEPTION_LOCATION);
183 template<
class ELEMENT>
185 public RefineableQuadMesh<ELEMENT>,
199 const unsigned& ncollapsible,
200 const unsigned& ndown,
203 const double& lcollapsible,
207 TimeStepper* time_stepper_pt=
208 &Mesh::Default_TimeStepper) :
209 CollapsibleChannelMesh<ELEMENT>(nup, ncollapsible, ndown, ny,
210 lup, lcollapsible, ldown, ly,
214 lup, lcollapsible, ldown, ly,
219 this->setup_quadtree_forest();
233 const unsigned& ncollapsible,
234 const unsigned& ndown,
237 const double& lcollapsible,
241 CollapsibleChannelDomain::BLSquashFctPt bl_squash_function_pt,
242 TimeStepper* time_stepper_pt=
243 &Mesh::Default_TimeStepper) :
244 CollapsibleChannelMesh<ELEMENT>(nup, ncollapsible, ndown, ny,
245 lup, lcollapsible, ldown, ly,
249 lup, lcollapsible, ldown, ly,
251 bl_squash_function_pt,
255 this->setup_quadtree_forest();
271 template<
class ELEMENT>
276 double l_up=this->domain_pt()->l_up();
277 double l_collapsible=this->domain_pt()->l_collapsible();
280 unsigned nnod=this->nnode();
281 for (
unsigned j=0;j<nnod;j++)
284 AlgebraicNode* nod_pt=node_pt(j);
287 double x=nod_pt->x(0);
288 double y=nod_pt->x(1);
291 if ( (x>=l_up) && (x<=(l_up+l_collapsible)) )
295 Vector<double> zeta(1);
299 Vector<double> r_wall(2);
300 this->Wall_pt->position(zeta,r_wall);
305 if ((std::abs(r_wall[0]-x)>1.0e-15)&&(std::abs(r_wall[1]-y)>1.0e-15))
307 std::ostringstream error_stream;
309 <<
"Wall must be in its undeformed position when\n" 310 <<
"algebraic node update information is set up!\n " 311 <<
"x-discrepancy: " << std::abs(r_wall[0]-x) << std::endl
312 <<
"y-discrepancy: " << std::abs(r_wall[1]-y) << std::endl;
316 OOMPH_CURRENT_FUNCTION,
317 OOMPH_EXCEPTION_LOCATION);
322 Vector<GeomObject*> geom_object_pt(1);
325 geom_object_pt[0]=this->Wall_pt;
328 Vector<double> ref_value(3);
331 ref_value[0]=r_wall[0];
336 ref_value[1]=y/r_wall[1];
339 ref_value[2]=zeta[0];
343 nod_pt->add_node_update_info(
358 template<
class ELEMENT>
360 const unsigned& t, AlgebraicNode*& node_pt)
364 Vector<double> ref_value(node_pt->vector_ref_value());
367 Vector<GeomObject*> geom_object_pt(node_pt->vector_geom_object_pt());
370 double x_bottom=ref_value[0];
375 double fract=ref_value[1];
378 Vector<double> zeta(1);
379 zeta[0]=ref_value[2];
382 GeomObject* wall_pt=geom_object_pt[0];
385 Vector<double> r_wall(2);
386 wall_pt->position(t,zeta,r_wall);
389 node_pt->x(t,0)=x_bottom+fract*(r_wall[0]-x_bottom);
390 node_pt->x(t,1)= fract* r_wall[1];
MyAlgebraicCollapsibleChannelMesh(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...
void update_node_update(AlgebraicNode *&node_pt)
Update the geometric references that are used to update node after mesh adaptation. Empty – no update of node update required.
CollapsibleChannelDomain::BLSquashFctPt & bl_squash_fct_pt()
Function pointer for function that squashes the mesh near the walls. Default trivial mapping (the ide...
void setup_algebraic_node_update()
Function to setup the algebraic node update.
MyRefineableAlgebraicCollapsibleChannelMesh(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 mesh with algebraic node update.
MyAlgebraicCollapsibleChannelMesh(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...
virtual ~MyAlgebraicCollapsibleChannelMesh()
Destructor: empty.
CollapsibleChannelDomain::BLSquashFctPt Dummy_fct_pt
Dummy function pointer.
MyRefineableAlgebraicCollapsibleChannelMesh(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...
void algebraic_node_update(const unsigned &t, AlgebraicNode *&node_pt)
Update nodal position at time level t (t=0: present; t>0: previous)