fsi_driven_cavity_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
27// Include guards
28#ifndef OOMPH_FSI_DRIVEN_CAVITY_MESH_HEADER
29#define OOMPH_FSI_DRIVEN_CAVITY_MESH_HEADER
30
31// Generic includes
32#include "../generic/refineable_quad_mesh.h"
33#include "../generic/macro_element.h"
34#include "../generic/domain.h"
35#include "../generic/quad_mesh.h"
36
37// Mesh is based on simple_rectangular_quadmesh
40
41// Include algebraic elements
42#include "../generic/algebraic_elements.h"
43
44
45namespace oomph
46{
47 //========================================================================
48 /// Mesh for W. Wall's FSI driven cavity problem.
49 /// The mesh is derived from the \c SimpleRectangularQuadMesh
50 /// so it's node and element numbering scheme is the same
51 /// as in that mesh. Only the boundaries are numbered differently
52 /// to allow the easy identification of the "collapsible" segment.
53 /// Boundary coordinates are set up for all nodes
54 /// located on boundary 3 (the collapsible segment).
55 /// The curvilinear ("collapsible") segment is defined by
56 /// a \c GeomObject.
57 /// - Boundary 0 is the moving lid.
58 /// - Boundary 1 is the gap above the moving lid on the right wall
59 /// - Boundary 2 is the rigid part of the right wall
60 /// - Boundary 3 is the moving (elastic) wall
61 /// - Boundary 4 is the rigid part of the left wall
62 /// - Boundary 5 is the gap above the moving lid on the left wall
63 //========================================================================
64 template<class ELEMENT>
66 {
67 public:
68 /// Constructor: Pass number of elements, number of elements,
69 /// fractional height of the gap above the moving wall,
70 /// pointer to GeomObject that defines the collapsible segment and pointer
71 /// to TimeStepper (defaults to the default timestepper, Steady).
73 const unsigned& nx,
74 const unsigned& ny,
75 const double& lx,
76 const double& ly,
77 const double& gap_fraction,
78 GeomObject* wall_pt,
79 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper);
80
81 protected:
82 /// Number of elements in x direction
83 unsigned Nx;
84
85 /// Number of elements in y direction
86 unsigned Ny;
87
88 /// Fraction of the gap next to moving lid, relative to the
89 /// height of the domain
91
92 /// Pointer to geometric object that represents the moving wall
94 };
95
96
97 /// //////////////////////////////////////////////////////////////////
98 /// //////////////////////////////////////////////////////////////////
99 /// //////////////////////////////////////////////////////////////////
100
101
102 //===================================================================
103 /// Refineable version of FSIDrivenCavityMesh.
104 /// The mesh is derived from the \c SimpleRectangularQuadMesh
105 /// so it's node and element numbering scheme is the same
106 /// as in that mesh. Only the boundaries are numbered differently
107 /// to allow the easy identification of the "collapsible" segment.
108 /// Boundary coordinates are set up for all nodes
109 /// located on boundary 3 (the collapsible segment).
110 /// The curvilinear ("collapsible") segment is defined by
111 /// a \c GeomObject.
112 /// - Boundary 0 is the moving lid.
113 /// - Boundary 1 is the gap above the moving lid on the right wall
114 /// - Boundary 2 is the rigid part of the right wall
115 /// - Boundary 3 is the moving (elastic) wall
116 /// - Boundary 4 is the rigid part of the left wall
117 /// - Boundary 5 is the gap above the moving lid on the left wall
118 //====================================================================
119 template<class ELEMENT>
121 : public virtual FSIDrivenCavityMesh<ELEMENT>,
122 public RefineableQuadMesh<ELEMENT>
123 {
124 public:
125 /// Constructor: Pass number of elements, lengths, pointer to
126 /// geometric object that describes the wall and timestepper
128 const unsigned& nx,
129 const unsigned& ny,
130 const double& lx,
131 const double& ly,
132 const double& gap_fraction,
133 GeomObject* wall_pt,
134 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
135 : FSIDrivenCavityMesh<ELEMENT>(
136 nx, ny, lx, ly, gap_fraction, wall_pt, time_stepper_pt)
137 {
138 // Build quadtree forest
139 this->setup_quadtree_forest();
140 }
141
142
143 /// Destructor(empty)
145 };
146
147
148 //=================================================================
149 /// / Alebraic node update version of FSIDrivenCavityMesh
150 /// - Boundary 0 is the moving lid.
151 /// - Boundary 1 is the gap above the moving lid on the right wall
152 /// - Boundary 2 is the rigid part of the right wall
153 /// - Boundary 3 is the moving (elastic) wall
154 /// - Boundary 4 is the rigid part of the left wall
155 /// - Boundary 5 is the gap above the moving lid on the left wall
156 //=================================================================
157 template<class ELEMENT>
159 : public virtual FSIDrivenCavityMesh<ELEMENT>,
160 public AlgebraicMesh
161 {
162 public:
163 /// Constructor: Pass number of elements, lengths, pointer to
164 /// GeomObject that defines the collapsible segment and pointer to
165 /// TimeStepper (defaults to the default timestepper, Steady).
167 const unsigned& nx,
168 const unsigned& ny,
169 const double& lx,
170 const double& ly,
171 const double& gap_fraction,
172 GeomObject* wall_pt,
173 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
174 : FSIDrivenCavityMesh<ELEMENT>(
175 nx, ny, lx, ly, gap_fraction, wall_pt, time_stepper_pt)
176 {
177 // Add the geometric object to the list associated with this AlgebraicMesh
179
180 // Setup algebraic node update operations
182 }
183
184 /// Destructor: empty
186
187 /// Update nodal position at time level t (t=0: present;
188 /// t>0: previous)
189 void algebraic_node_update(const unsigned& t, AlgebraicNode*& node_pt);
190
191 /// Update the node-udate data after mesh adaptation.
192 /// Empty -- no update of node update required as this is
193 /// non-refineable mesh.
195
196 protected:
197 /// Function to setup the algebraic node update
199 };
200
201
202 /// ////////////////////////////////////////////////////////////////////////
203 /// ////////////////////////////////////////////////////////////////////////
204 /// ////////////////////////////////////////////////////////////////////////
205
206
207 //=================================================================
208 /// Refineable version algebraic FSIDrivenCavityMesh.
209 /// - Boundary 0 is the moving lid.
210 /// - Boundary 1 is the gap above the moving lid on the right wall
211 /// - Boundary 2 is the rigid part of the right wall
212 /// - Boundary 3 is the moving (elastic) wall
213 /// - Boundary 4 is the rigid part of the left wall
214 /// - Boundary 5 is the gap above the moving lid on the left wall
215 //=================================================================
216 template<class ELEMENT>
218 : public RefineableQuadMesh<ELEMENT>,
219 public virtual AlgebraicFSIDrivenCavityMesh<ELEMENT>
220 {
221 public:
222 /// Constructor: Pass number of elements, lengths, pointer to
223 /// GeomObject that defines the collapsible segment and pointer to
224 /// TimeStepper (defaults to the default timestepper, Steady).
226 const unsigned& nx,
227 const unsigned& ny,
228 const double& lx,
229 const double& ly,
230 const double& gap_fraction,
231 GeomObject* wall_pt,
232 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
233 : FSIDrivenCavityMesh<ELEMENT>(
234 nx, ny, lx, ly, gap_fraction, wall_pt, time_stepper_pt),
236 nx, ny, lx, ly, gap_fraction, wall_pt, time_stepper_pt)
237 {
238 // Build quadtree forest
239 this->setup_quadtree_forest();
240 }
241
242 /// Update the node update data for specified node following
243 /// any mesh adapation
245 };
246
247
248} // namespace oomph
249
250#endif
char t
Definition: cfortran.h:568
/ Alebraic node update version of FSIDrivenCavityMesh
virtual ~AlgebraicFSIDrivenCavityMesh()
Destructor: empty.
void algebraic_node_update(const unsigned &t, AlgebraicNode *&node_pt)
Update nodal position at time level t (t=0: present; t>0: previous)
void setup_algebraic_node_update()
Function to setup the algebraic node update.
void update_node_update(AlgebraicNode *&node_pt)
Update the node-udate data after mesh adaptation. Empty – no update of node update required as this i...
AlgebraicFSIDrivenCavityMesh(const unsigned &nx, const unsigned &ny, const double &lx, const double &ly, const double &gap_fraction, GeomObject *wall_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass number of elements, lengths, pointer to GeomObject that defines the collapsible seg...
////////////////////////////////////////////////////////////////////
void add_geom_object_list_pt(GeomObject *geom_object_pt)
Add the specified GeomObject to the list of geometric objects associated with this AlgebraicMesh; rem...
AlgebraicNode * node_pt(const unsigned long &n)
Return a pointer to the n-th global AlgebraicNode.
////////////////////////////////////////////////////////////////////
Mesh for W. Wall's FSI driven cavity problem. The mesh is derived from the SimpleRectangularQuadMesh ...
unsigned Nx
Number of elements in x direction.
GeomObject * Wall_pt
Pointer to geometric object that represents the moving wall.
double Gap_fraction
Fraction of the gap next to moving lid, relative to the height of the domain.
FSIDrivenCavityMesh(const unsigned &nx, const unsigned &ny, const double &lx, const double &ly, const double &gap_fraction, GeomObject *wall_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass number of elements, number of elements, fractional height of the gap above the movi...
unsigned Ny
Number of elements in y direction.
/////////////////////////////////////////////////////////////////////
Definition: geom_objects.h:101
static Steady< 0 > Default_TimeStepper
Default Steady Timestepper, to be used in default arguments to Mesh constructors.
Definition: mesh.h:75
//////////////////////////////////////////////////////////////////////// ////////////////////////////...
RefineableAlgebraicFSIDrivenCavityMesh(const unsigned &nx, const unsigned &ny, const double &lx, const double &ly, const double &gap_fraction, GeomObject *wall_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass number of elements, lengths, pointer to GeomObject that defines the collapsible seg...
void update_node_update(AlgebraicNode *&node_pt)
Update the node update data for specified node following any mesh adapation.
////////////////////////////////////////////////////////////////// //////////////////////////////////...
RefineableFSIDrivenCavityMesh(const unsigned &nx, const unsigned &ny, const double &lx, const double &ly, const double &gap_fraction, 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...
Intermediate mesh class that implements the mesh adaptation functions specified in the TreeBasedRefin...
void setup_quadtree_forest()
Set up QuadTreeForest. Wipes any existing tree structure below the minimum refinement level and regar...
Simple rectangular 2D Quad mesh class. Nx : number of elements in the x direction.
const unsigned & ny() const
Access function for number of elements in y directions.
const unsigned & nx() const
Access function for number of elements in x directions.
////////////////////////////////////////////////////////////////////// //////////////////////////////...
Definition: timesteppers.h:231
//////////////////////////////////////////////////////////////////// ////////////////////////////////...