collapsible_channel_mesh.template.h
Go to the documentation of this file.
1 // LIC// ====================================================================
2 // LIC// This file forms part of oomph-lib, the object-oriented,
3 // LIC// multi-physics finite-element library, available
4 // LIC// at http://www.oomph-lib.org.
5 // LIC//
6 // LIC// Copyright (C) 2006-2022 Matthias Heil and Andrew Hazel
7 // LIC//
8 // LIC// This library is free software; you can redistribute it and/or
9 // LIC// modify it under the terms of the GNU Lesser General Public
10 // LIC// License as published by the Free Software Foundation; either
11 // LIC// version 2.1 of the License, or (at your option) any later version.
12 // LIC//
13 // LIC// This library is distributed in the hope that it will be useful,
14 // LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // LIC// Lesser General Public License for more details.
17 // LIC//
18 // LIC// You should have received a copy of the GNU Lesser General Public
19 // LIC// License along with this library; if not, write to the Free Software
20 // LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 // LIC// 02110-1301 USA.
22 // LIC//
23 // LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
24 // LIC//
25 // LIC//====================================================================
26 // Include guards
27 #ifndef OOMPH_COLLAPSIBLE_CHANNEL_MESH_HEADER
28 #define OOMPH_COLLAPSIBLE_CHANNEL_MESH_HEADER
29 
30 // Generic includes
31 #include "../generic/refineable_quad_mesh.h"
32 #include "../generic/macro_element.h"
33 #include "../generic/domain.h"
34 #include "../generic/quad_mesh.h"
35 
36 // Mesh is based on simple_rectangular_quadmesh
39 
40 // Include *.template.cc to allow building the templated member functions
41 #include "../generic/macro_element_node_update_element.h"
42 
43 // We need to include the templated sources for algebraic meshes
44 // to allow the build of all templates.
45 #include "../generic/algebraic_elements.h"
46 
47 // Include the headers file for collapsible channel
49 
50 namespace oomph
51 {
52  //========================================================================
62  //========================================================================
63  template<class ELEMENT>
65  {
66  public:
73  const unsigned& nup,
74  const unsigned& ncollapsible,
75  const unsigned& ndown,
76  const unsigned& ny,
77  const double& lup,
78  const double& lcollapsible,
79  const double& ldown,
80  const double& ly,
82  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper);
83 
86  {
87  delete Domain_pt;
88  }
89 
92  {
93  return Wall_pt;
94  }
95 
98  {
99  return Domain_pt;
100  }
101 
110  {
111  return Domain_pt->bl_squash_fct_pt();
112  }
113 
114 
120  {
121  return Domain_pt->bl_squash_fct_pt();
122  }
123 
124 
131  {
133  }
134 
135 
139  const
140  {
142  }
143 
144 
145  protected:
148 
150  unsigned Nup;
151 
153  unsigned Ncollapsible;
154 
156  unsigned Ndown;
157 
159  unsigned Ny;
160 
163  };
164 
165 
169 
170 
171  //===================================================================
181  //====================================================================
182  template<class ELEMENT>
184  : public virtual CollapsibleChannelMesh<ELEMENT>,
185  public RefineableQuadMesh<ELEMENT>
186  {
187  public:
191  const unsigned& nup,
192  const unsigned& ncollapsible,
193  const unsigned& ndown,
194  const unsigned& ny,
195  const double& lup,
196  const double& lcollapsible,
197  const double& ldown,
198  const double& ly,
200  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
201  : CollapsibleChannelMesh<ELEMENT>(nup,
202  ncollapsible,
203  ndown,
204  ny,
205  lup,
206  lcollapsible,
207  ldown,
208  ly,
209  wall_pt,
210  time_stepper_pt)
211  {
212  // Build quadtree forest
213  this->setup_quadtree_forest();
214  }
215 
216 
219  };
220 
221 
225 
226 
227  //=====start_of_mesh=======================================================
236  //========================================================================
237  template<class ELEMENT>
239  : public virtual MacroElementNodeUpdateMesh,
240  public virtual CollapsibleChannelMesh<ELEMENT>
241  {
242  public:
248  const unsigned& nup,
249  const unsigned& ncollapsible,
250  const unsigned& ndown,
251  const unsigned& ny,
252  const double& lup,
253  const double& lcollapsible,
254  const double& ldown,
255  const double& ly,
257  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
258  : CollapsibleChannelMesh<ELEMENT>(nup,
259  ncollapsible,
260  ndown,
261  ny,
262  lup,
263  lcollapsible,
264  ldown,
265  ly,
266  wall_pt,
267  time_stepper_pt)
268  {
269 #ifdef PARANOID
270  ELEMENT* el_pt = new ELEMENT;
271  if (dynamic_cast<MacroElementNodeUpdateElementBase*>(el_pt) == 0)
272  {
273  std::ostringstream error_message;
274  error_message << "Base class for ELEMENT in "
275  << "MacroElementNodeUpdateCollapsibleChannelMesh needs"
276  << "to be of type MacroElementNodeUpdateElement!\n";
277  error_message << "Whereas it is: typeid(el_pt).name()"
278  << typeid(el_pt).name() << std::endl;
279 
280  std::string function_name =
281  "MacroElementNodeUpdateCollapsibleChannelMesh::\n";
282  function_name += "MacroElementNodeUpdateCollapsibleChannelMesh()";
283 
284  throw OomphLibError(error_message.str(),
287  }
288  delete el_pt;
289 #endif
290 
291  // Setup all the information that's required for MacroElement-based
292  // node update: Tell the elements that their geometry depends on the
293  // wall geometric object
294  unsigned n_element = this->nelement();
295  for (unsigned i = 0; i < n_element; i++)
296  {
297  // Upcast from FiniteElement to the present element
298  ELEMENT* el_pt = dynamic_cast<ELEMENT*>(this->element_pt(i));
299 
300 #ifdef PARANOID
301  // Check if cast is successful
303  dynamic_cast<MacroElementNodeUpdateElementBase*>(el_pt);
304  if (m_el_pt == 0)
305  {
306  std::ostringstream error_message;
307  error_message
308  << "Failed to upcast to MacroElementNodeUpdateElementBase\n";
309  error_message << "Element must be derived from "
310  "MacroElementNodeUpdateElementBase\n";
311  error_message << "but it is of type " << typeid(el_pt).name();
312 
313  std::string function_name =
314  "MacroElementNodeUpdateCollapsibleChannelMesh::\n";
315  function_name += "MacroElementNodeUpdateCollapsibleChannelMesh()";
316 
317  throw OomphLibError(error_message.str(),
320  }
321 #endif
322 
323  // There's just one GeomObject
324  Vector<GeomObject*> geom_object_pt(1);
325  geom_object_pt[0] = this->Wall_pt;
326 
327  // Tell the element which geom objects its macro-element-based
328  // node update depends on
329  el_pt->set_node_update_info(geom_object_pt);
330  }
331 
332  // Add the geometric object(s) for the wall to the mesh's storage
333  Vector<GeomObject*> geom_object_pt(1);
334  geom_object_pt[0] = this->Wall_pt;
336 
337  // Fill in the domain pointer to the mesh's storage in the base class
339 
340  } // end of constructor
341 
342 
345 
346 
347  }; // end of mesh
348 
349 
353 
354 
355  //=====start_of_mesh=======================================================
364  //========================================================================
365  template<class ELEMENT>
367  : public virtual MacroElementNodeUpdateCollapsibleChannelMesh<ELEMENT>,
368  public virtual RefineableQuadMesh<ELEMENT>
369  {
370  public:
376  const unsigned& nup,
377  const unsigned& ncollapsible,
378  const unsigned& ndown,
379  const unsigned& ny,
380  const double& lup,
381  const double& lcollapsible,
382  const double& ldown,
383  const double& ly,
385  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
386  : CollapsibleChannelMesh<ELEMENT>(nup,
387  ncollapsible,
388  ndown,
389  ny,
390  lup,
391  lcollapsible,
392  ldown,
393  ly,
394  wall_pt,
395  time_stepper_pt),
397  ncollapsible,
398  ndown,
399  ny,
400  lup,
401  lcollapsible,
402  ldown,
403  ly,
404  wall_pt,
405  time_stepper_pt)
406  {
407  // Build quadtree forest
408  this->setup_quadtree_forest();
409  }
410 
413 
414  }; // end of mesh
415 
416 
420 
421 
422  //========start_of_algebraic_collapsible_channel_mesh==============
424  //=================================================================
425  template<class ELEMENT>
427  : public virtual CollapsibleChannelMesh<ELEMENT>,
428  public AlgebraicMesh
429  {
430  public:
437  const unsigned& nup,
438  const unsigned& ncollapsible,
439  const unsigned& ndown,
440  const unsigned& ny,
441  const double& lup,
442  const double& lcollapsible,
443  const double& ldown,
444  const double& ly,
446  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
447  : CollapsibleChannelMesh<ELEMENT>(nup,
448  ncollapsible,
449  ndown,
450  ny,
451  lup,
452  lcollapsible,
453  ldown,
454  ly,
455  wall_pt,
456  time_stepper_pt)
457  {
458  // Add the geometric object to the list associated with this AlgebraicMesh
460 
461  // Setup algebraic node update operations
463  }
464 
467 
468 
475  const unsigned& nup,
476  const unsigned& ncollapsible,
477  const unsigned& ndown,
478  const unsigned& ny,
479  const double& lup,
480  const double& lcollapsible,
481  const double& ldown,
482  const double& ly,
484  CollapsibleChannelDomain::BLSquashFctPt bl_squash_function_pt,
485  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
486  : CollapsibleChannelMesh<ELEMENT>(nup,
487  ncollapsible,
488  ndown,
489  ny,
490  lup,
491  lcollapsible,
492  ldown,
493  ly,
494  wall_pt,
495  time_stepper_pt)
496  {
497  // Add the geometric object to the list associated with this AlgebraicMesh
499 
500  // Set boundary layer squash function
501  this->Domain_pt->bl_squash_fct_pt() = bl_squash_function_pt;
502 
503  // Do MacroElement-based node update
505 
506  // Setup algebraic node update operations
508  }
509 
518  {
519  std::ostringstream error_message;
520  error_message
521  << "It does not make sense to set the bl_squash_fct_pt \n"
522  << "outside the constructor as it's only used to set up the \n"
523  << "algebraic remesh data when the algebraic mesh is first built. \n";
524  std::string function_name =
525  "AlgebraicCollapsibleChannelMesh::bl_squash_fct_pt()\n";
526 
527  throw OomphLibError(
528  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
529 
530  // Dummy return
531  return Dummy_fct_pt;
532  }
533 
534 
543  {
544  std::ostringstream error_message;
545  error_message
546  << "It does not make sense to set the axial_spacing_fct_pt \n"
547  << "outside the constructor as it's only used to set up the \n"
548  << "algebraic remesh data when the algebraic mesh is first built. \n";
549  std::string function_name =
550  "AlgebraicCollapsibleChannelMesh::axial_spacing_fct_pt()\n";
551 
552  throw OomphLibError(
553  error_message.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
554 
555  // Dummy return
556  return Dummy_fct_pt;
557  }
558 
559 
562  void algebraic_node_update(const unsigned& t, AlgebraicNode*& node_pt);
563 
568 
569  protected:
572 
575  };
576 
577 
581 
582 
583  //=====start_of_refineable_algebraic_collapsible_channel_mesh=====
586  //=================================================================
587  template<class ELEMENT>
589  : public RefineableQuadMesh<ELEMENT>,
590  public virtual AlgebraicCollapsibleChannelMesh<ELEMENT>
591  {
592  public:
599  const unsigned& nup,
600  const unsigned& ncollapsible,
601  const unsigned& ndown,
602  const unsigned& ny,
603  const double& lup,
604  const double& lcollapsible,
605  const double& ldown,
606  const double& ly,
608  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
609  : CollapsibleChannelMesh<ELEMENT>(nup,
610  ncollapsible,
611  ndown,
612  ny,
613  lup,
614  lcollapsible,
615  ldown,
616  ly,
617  wall_pt,
618  time_stepper_pt),
619  AlgebraicCollapsibleChannelMesh<ELEMENT>(nup,
620  ncollapsible,
621  ndown,
622  ny,
623  lup,
624  lcollapsible,
625  ldown,
626  ly,
627  wall_pt,
628  time_stepper_pt)
629  {
630  // Build quadtree forest
631  this->setup_quadtree_forest();
632  }
633 
634 
641  const unsigned& nup,
642  const unsigned& ncollapsible,
643  const unsigned& ndown,
644  const unsigned& ny,
645  const double& lup,
646  const double& lcollapsible,
647  const double& ldown,
648  const double& ly,
650  CollapsibleChannelDomain::BLSquashFctPt bl_squash_function_pt,
651  TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
652  : CollapsibleChannelMesh<ELEMENT>(nup,
653  ncollapsible,
654  ndown,
655  ny,
656  lup,
657  lcollapsible,
658  ldown,
659  ly,
660  wall_pt,
661  time_stepper_pt),
662  AlgebraicCollapsibleChannelMesh<ELEMENT>(nup,
663  ncollapsible,
664  ndown,
665  ny,
666  lup,
667  lcollapsible,
668  ldown,
669  ly,
670  wall_pt,
671  bl_squash_function_pt,
672  time_stepper_pt)
673  {
674  // Build quadtree forest
675  this->setup_quadtree_forest();
676  }
677 
681  };
682 
683 
684 } // namespace oomph
685 
686 #endif
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Collapsible channel mesh with algebraic node update.
Definition: collapsible_channel_mesh.template.h:429
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)
Definition: collapsible_channel_mesh.template.h:474
void setup_algebraic_node_update()
Function to setup the algebraic node update.
Definition: collapsible_channel_mesh.template.cc:324
CollapsibleChannelDomain::BLSquashFctPt Dummy_fct_pt
Dummy function pointer.
Definition: collapsible_channel_mesh.template.h:574
virtual ~AlgebraicCollapsibleChannelMesh()
Destructor: empty.
Definition: collapsible_channel_mesh.template.h:466
void update_node_update(AlgebraicNode *&node_pt)
Definition: collapsible_channel_mesh.template.h:567
CollapsibleChannelDomain::BLSquashFctPt & bl_squash_fct_pt()
Definition: collapsible_channel_mesh.template.h:517
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)
Definition: collapsible_channel_mesh.template.h:436
void algebraic_node_update(const unsigned &t, AlgebraicNode *&node_pt)
Definition: collapsible_channel_mesh.template.cc:242
CollapsibleChannelDomain::BLSquashFctPt & axial_spacing_fct_pt()
Definition: collapsible_channel_mesh.template.h:542
Definition: algebraic_elements.h:599
void add_geom_object_list_pt(GeomObject *geom_object_pt)
Definition: algebraic_elements.h:823
AlgebraicNode * node_pt(const unsigned long &n)
Return a pointer to the n-th global AlgebraicNode.
Definition: algebraic_elements.h:620
Definition: algebraic_elements.h:55
Collapsible channel domain.
Definition: collapsible_channel_domain.h:41
AxialSpacingFctPt & axial_spacing_fct_pt()
Definition: collapsible_channel_domain.h:186
double(* BLSquashFctPt)(const double &s)
Definition: collapsible_channel_domain.h:152
double(* AxialSpacingFctPt)(const double &xi)
Definition: collapsible_channel_domain.h:182
BLSquashFctPt & bl_squash_fct_pt()
Definition: collapsible_channel_domain.h:165
Definition: collapsible_channel_mesh.template.h:65
GeomObject *& wall_pt()
Access function to GeomObject representing wall.
Definition: collapsible_channel_mesh.template.h:91
~CollapsibleChannelMesh()
destructor
Definition: collapsible_channel_mesh.template.h:85
GeomObject * Wall_pt
Pointer to geometric object that represents the moving wall.
Definition: collapsible_channel_mesh.template.h:162
CollapsibleChannelDomain * domain_pt()
Access function to domain.
Definition: collapsible_channel_mesh.template.h:97
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)
Definition: collapsible_channel_mesh.template.cc:43
CollapsibleChannelDomain::BLSquashFctPt bl_squash_fct_pt() const
Definition: collapsible_channel_mesh.template.h:119
virtual CollapsibleChannelDomain::AxialSpacingFctPt & axial_spacing_fct_pt() const
Definition: collapsible_channel_mesh.template.h:138
unsigned Ncollapsible
Number of element columns in collapsible part.
Definition: collapsible_channel_mesh.template.h:153
virtual CollapsibleChannelDomain::BLSquashFctPt & bl_squash_fct_pt()
Definition: collapsible_channel_mesh.template.h:109
unsigned Nup
Number of element columns in upstream part.
Definition: collapsible_channel_mesh.template.h:150
virtual CollapsibleChannelDomain::AxialSpacingFctPt & axial_spacing_fct_pt()
Definition: collapsible_channel_mesh.template.h:130
unsigned Ndown
Number of element columns in downstream part.
Definition: collapsible_channel_mesh.template.h:156
CollapsibleChannelDomain * Domain_pt
Pointer to domain.
Definition: collapsible_channel_mesh.template.h:147
unsigned Ny
Number of element rows across channel.
Definition: collapsible_channel_mesh.template.h:159
Definition: geom_objects.h:101
Definition: collapsible_channel_mesh.template.h:241
virtual ~MacroElementNodeUpdateCollapsibleChannelMesh()
Destructor: empty.
Definition: collapsible_channel_mesh.template.h:344
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)
Definition: collapsible_channel_mesh.template.h:247
Base class for elements that allow MacroElement-based node update.
Definition: macro_element_node_update_element.h:197
Definition: macro_element_node_update_element.h:360
void set_geom_object_vector_pt(Vector< GeomObject * > geom_object_vector_pt)
Definition: macro_element_node_update_element.h:510
Domain *& macro_domain_pt()
Broken assignment operator.
Definition: macro_element_node_update_element.h:376
Definition: collapsible_channel_mesh.template.h:369
virtual ~MacroElementNodeUpdateRefineableCollapsibleChannelMesh()
Destructor: empty.
Definition: collapsible_channel_mesh.template.h:412
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)
Definition: collapsible_channel_mesh.template.h:375
static Steady< 0 > Default_TimeStepper
The Steady Timestepper.
Definition: mesh.h:75
virtual void node_update(const bool &update_all_solid_nodes=false)
Definition: mesh.cc:287
const Vector< GeneralisedElement * > & element_pt() const
Return reference to the Vector of elements.
Definition: mesh.h:460
unsigned long nelement() const
Return number of elements in the mesh.
Definition: mesh.h:590
Definition: oomph_definitions.h:222
Definition: collapsible_channel_mesh.template.h:591
void update_node_update(AlgebraicNode *&node_pt)
Definition: collapsible_channel_mesh.template.cc:437
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)
Definition: collapsible_channel_mesh.template.h:598
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)
Definition: collapsible_channel_mesh.template.h:640
Definition: collapsible_channel_mesh.template.h:186
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)
Definition: collapsible_channel_mesh.template.h:190
~RefineableCollapsibleChannelMesh()
Destructor(empty)
Definition: collapsible_channel_mesh.template.h:218
Definition: refineable_quad_mesh.h:53
void setup_quadtree_forest()
Definition: refineable_quad_mesh.h:88
Definition: simple_rectangular_quadmesh.template.h:58
const unsigned & ny() const
Access function for number of elements in y directions.
Definition: simple_rectangular_quadmesh.template.h:77
Definition: timesteppers.h:231
const double ly
Definition: ConstraintElementsUnitTest.cpp:34
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
string name
Definition: plotDoE.py:33
t
Definition: plotPSD.py:36
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86