quarter_tube_mesh.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-2025 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#ifndef OOMPH_QUARTER_TUBE_MESH_HEADER
27#define OOMPH_QUARTER_TUBE_MESH_HEADER
28
29// Headers
32#include "generic/domain.h"
34#include "generic/brick_mesh.h"
36
37// Include the headers file for domain
38#include "quarter_tube_domain.h"
39
40namespace oomph
41{
42 //====================================================================
43 /// 3D quarter tube mesh class.
44 /// The domain is specified by the GeomObject that identifies
45 /// boundary 3. Non-refineable base version!
46 ///
47 /// The mesh boundaries are numbered as follows:
48 /// - Boundary 0: "Inflow" cross section; located along the
49 /// line parametrised by \f$ \xi_0 = \xi_0^{lo} \f$
50 /// on the geometric object that specifies the wall.
51 /// - Boundary 1: Plane x=0
52 /// - Boundary 2: Plane y=0
53 /// - Boundary 3: The curved wall
54 /// - Boundary 4: "Outflow" cross section; located along the
55 /// line parametrised by \f$ \xi_0 = \xi_0^{hi} \f$
56 /// on the geometric object that specifies the wall.
57 ///
58 /// IMPORTANT NOTE: The interface looks more general than it should.
59 /// The toplogy must remain that of a quarter tube,
60 /// or the mesh generation will break.
61 //====================================================================
62 template<class ELEMENT>
63 class QuarterTubeMesh : public virtual BrickMeshBase
64 {
65 public:
66 /// Constructor: Pass pointer to geometric object that
67 /// specifies the wall, start and end coordinates on the
68 /// geometric object, and the fraction along
69 /// which the dividing line is to be placed, and the timestepper.
70 /// Timestepper defaults to Steady dummy timestepper.
72 const Vector<double>& xi_lo,
73 const double& fract_mid,
74 const Vector<double>& xi_hi,
75 const unsigned& nlayer,
76 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper);
77
78 /// Destructor: empty
80 {
81 delete Domain_pt;
82 }
83
84 /// Access function to GeomObject representing wall
86 {
87 return Wall_pt;
88 }
89
90 /// Access function to domain
92 {
93 return Domain_pt;
94 }
95
96 /// Function pointer for function that squashes
97 /// the outer macro elements towards
98 /// the wall by mapping the input value of the "radial" macro element
99 /// coordinate to the return value (defined in the underlying Domain object)
104
105
106 /// Function pointer for function for axial spacing
111
112 /// Access function to underlying domain
114 {
115 return Domain_pt;
116 }
117
118 protected:
119 /// Pointer to domain
121
122 /// Pointer to the geometric object that represents the curved wall
124
125 /// Lower limits for the coordinates along the wall
127
128 /// Fraction along wall where outer ring is to be divided
129 double Fract_mid;
130
131 /// Upper limits for the coordinates along the wall
133 };
134
135
136 ////////////////////////////////////////////////////////////////////
137 ////////////////////////////////////////////////////////////////////
138 ////////////////////////////////////////////////////////////////////
139
140 //=============================================================
141 /// Adaptative version of the QuarterTubeMesh base mesh.
142 /// The domain is specified by the GeomObject that identifies
143 /// boundary 3.
144 ///
145 /// The mesh boundaries are numbered as follows:
146 /// - Boundary 0: "Inflow" cross section; located along the
147 /// line parametrised by \f$ \xi_0 = \xi_0^{lo} \f$
148 /// on the geometric object that specifies the wall.
149 /// - Boundary 1: Plane x=0
150 /// - Boundary 2: Plane y=0
151 /// - Boundary 3: The curved wall
152 /// - Boundary 4: "Outflow" cross section; located along the
153 /// line parametrised by \f$ \xi_0 = \xi_0^{hi} \f$
154 /// on the geometric object that specifies the wall.
155 //=============================================================
156 template<class ELEMENT>
157 class RefineableQuarterTubeMesh : public virtual QuarterTubeMesh<ELEMENT>,
158 public RefineableBrickMesh<ELEMENT>
159
160 {
161 public:
162 /// Constructor for adaptive deformable quarter tube mesh class.
163 /// The domain is specified by the GeomObject that
164 /// identifies boundary 3. Pass pointer to geometric object that
165 /// specifies the wall, start and end coordinates on the
166 /// geometric object, and the fraction along
167 /// which the dividing line is to be placed, and the timestepper.
168 /// Timestepper defaults to Steady dummy timestepper.
171 const Vector<double>& xi_lo,
172 const double& fract_mid,
173 const Vector<double>& xi_hi,
174 const unsigned& nlayer,
175 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
176 : QuarterTubeMesh<ELEMENT>(
177 wall_pt, xi_lo, fract_mid, xi_hi, nlayer, time_stepper_pt)
178 {
179 // Loop over all elements and set macro element pointer
181 ielem++)
182 {
183 dynamic_cast<RefineableQElement<3>*>(
185 ->set_macro_elem_pt(this->Domain_pt->macro_element_pt(ielem));
186 }
187
188 // Setup Octree forest: Turn elements into individual octrees
189 // and plant in forest
191 for (unsigned iel = 0; iel < QuarterTubeMesh<ELEMENT>::nelement(); iel++)
192 {
194 ELEMENT* ref_el_pt = dynamic_cast<ELEMENT*>(el_pt);
196 trees_pt.push_back(octree_root_pt);
197 }
198 this->Forest_pt = new OcTreeForest(trees_pt);
199
200#ifdef PARANOID
201 // Run self test
202 unsigned success_flag =
203 dynamic_cast<OcTreeForest*>(this->Forest_pt)->self_test();
204 if (success_flag == 0)
205 {
206 oomph_info << "Successfully built octree forest " << std::endl;
207 }
208 else
209 {
210 throw OomphLibError("Trouble in building octree forest ",
213 }
214#endif
215 }
216
217 /// Destructor: empty
219 };
220
221
222 ////////////////////////////////////////////////////////////////////
223 ////////////////////////////////////////////////////////////////////
224 // MacroElementNodeUpdate-version of RefineableQuarterTubeMesh
225 ////////////////////////////////////////////////////////////////////
226 ////////////////////////////////////////////////////////////////////
227
228 class MacroElementNodeUpdateNode;
229
230 //========================================================================
231 /// MacroElementNodeUpdate version of RefineableQuarterTubeMesh
232 //========================================================================
233 template<class ELEMENT>
235 : public virtual MacroElementNodeUpdateMesh,
236 public virtual RefineableQuarterTubeMesh<ELEMENT>
237 {
238 public:
239 /// Constructor: Pass pointer to geometric object, start and
240 /// end coordinates on the geometric object and the fraction along
241 /// which the dividing line is to be placed when updating the nodal
242 /// positions, and timestepper (defaults to (Steady) default timestepper
243 /// defined in Mesh). Setup the refineable mesh (by calling the
244 /// constructor for the underlying RefineableQuarterTubeMesh)
245 /// and the algebraic node update functions for nodes.
248 const Vector<double>& xi_lo,
249 const double& fract_mid,
250 const Vector<double>& xi_hi,
251 const unsigned& nlayer,
252 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
255 wall_pt, xi_lo, fract_mid, xi_hi, nlayer, time_stepper_pt),
256 QuarterTubeMesh<ELEMENT>(
257 wall_pt, xi_lo, fract_mid, xi_hi, nlayer, time_stepper_pt)
258 {
259#ifdef PARANOID
260 ELEMENT* el_pt = new ELEMENT;
261 if (dynamic_cast<MacroElementNodeUpdateElementBase*>(el_pt) == 0)
262 {
263 std::ostringstream error_message;
264 error_message << "Base class for ELEMENT in "
265 << "MacroElementNodeUpdateRefineableQuarterTubeMesh needs"
266 << "to be of type MacroElementNodeUpdateElement!\n";
267 error_message << "Whereas it is: typeid(el_pt).name()"
268 << typeid(el_pt).name() << std::endl;
269
270 std::string function_name =
271 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh::\n";
273 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh()";
274
275 throw OomphLibError(error_message.str(),
278 }
279 delete el_pt;
280#endif
281
282 // Setup all the information that's required for MacroElement-based
283 // node update: Tell the elements that their geometry depends on the
284 // fishback geometric object
286 }
287
288 /// Destructor: empty
290
291 /// Resolve mesh update: Update current nodal
292 /// positions via sparse MacroElement-based update.
293 /// [Doesn't make sense to use this mesh with SolidElements anyway,
294 /// so we buffer the case if update_all_solid_nodes is set to
295 /// true.]
296 void node_update(const bool& update_all_solid_nodes = false)
297 {
298#ifdef PARANOID
300 {
301 std::string error_message =
302 "Doesn't make sense to use an MacroElementNodeUpdateMesh with\n";
303 error_message +=
304 "SolidElements so specifying update_all_solid_nodes=true\n";
305 error_message += "doesn't make sense either\n";
306
307 std::string function_name =
308 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh::\n";
309 function_name += "node_update()";
310
311 throw OomphLibError(
313 }
314#endif
316 }
317
318 private:
319 /// Setup all the information that's required for MacroElement-based
320 /// node update: Tell the elements that their geometry depends on the
321 /// geometric object that parametrises the wall
323 {
324 unsigned n_element = this->nelement();
325 for (unsigned i = 0; i < n_element; i++)
326 {
327 // Upcast from FiniteElement to the present element
328 ELEMENT* el_pt = dynamic_cast<ELEMENT*>(this->element_pt(i));
329
330#ifdef PARANOID
331 // Check if cast is successful
334 if (m_el_pt == 0)
335 {
336 std::ostringstream error_message;
337 error_message
338 << "Failed to upcast to MacroElementNodeUpdateElementBase\n";
339 error_message << "Element must be derived from "
340 "MacroElementNodeUpdateElementBase\n";
341 error_message << "but it is of type " << typeid(el_pt).name();
342
343 std::string function_name =
344 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh::\n";
345 function_name += "setup_macro_element_node_update()";
346
347 throw OomphLibError(error_message.str(),
350 }
351#endif
352 // There's just one GeomObject
353 Vector<GeomObject*> geom_object_pt(1);
354 geom_object_pt[0] = this->Wall_pt;
355
356 // Tell the element which geom objects its macro-element-based
357 // node update depends on
358 el_pt->set_node_update_info(geom_object_pt);
359 }
360
361 // Add the geometric object(s) for the wall to the mesh's storage
362 Vector<GeomObject*> geom_object_pt(1);
363 geom_object_pt[0] = this->Wall_pt;
365
366 // Fill in the domain pointer to the mesh's storage in the base class
368 }
369 };
370
371 //======================================================================
372 /// AlgebraicMesh version of RefineableQuarterTubeMesh
373 //=====================================================================
374
375 //====================================================================
376 /// Algebraic 3D quarter tube mesh class.
377 ///
378 /// The mesh boundaries are numbered as follows:
379 /// - Boundary 0: "Inflow" cross section; located along the
380 /// line parametrised by \f$ \xi_0 = \xi_0^{lo} \f$
381 /// on the geometric object that specifies the wall.
382 /// - Boundary 1: Plane x=0
383 /// - Boundary 2: Plane y=0
384 /// - Boundary 3: The curved wall - specified by the GeomObject
385 /// passed to the mesh constructor.
386 /// - Boundary 4: "Outflow" cross section; located along the
387 /// line parametrised by \f$ \xi_0 = \xi_0^{hi} \f$
388 /// on the geometric object that specifies the wall.
389 //====================================================================
390
391 //========================================================================
392 /// Algebraic version of RefineableQuarterTubeMesh
393 ///
394 /// Cross section through mesh looking along tube.........
395 ///
396 /// ---___
397 /// | ---____
398 /// | - BOUNDARY 3
399 /// | /
400 /// | [Region 2] / |
401 /// | / |
402 /// | N / |
403 /// | |_ E / |
404 /// BOUNDARY 1 |------------ |
405 /// | | |
406 /// | [Region 0] | [Region 1] | ^
407 /// | | | / \ direction of
408 /// | N | N | | 2nd Lagrangian
409 /// | |_ E | |_ E | | coordinate
410 /// |____________|____________| | along wall GeomObject
411 ///
412 /// BOUNDARY 2
413 ///
414 /// The Domain is built of slices each consisting of three
415 /// MacroElements as sketched.
416 /// The local coordinates are such that the (E)astern direction
417 /// coincides with the positive s_0 direction, while the
418 /// (N)orther direction coincides with the positive s_1 direction.
419 /// The positive s_2 direction points down the tube.
420 ///
421 /// Elements need to be derived from AlgebraicElementBase. In
422 /// addition to the refinement procedures available for the
423 /// RefineableQuarterTubeMesh which forms the basis for this mesh,
424 /// three algebraic node update functions are implemented for the nodes
425 /// in the three regions defined by the Domain MacroElements.
426 /// Note: it is assumed the cross section down the tube is
427 /// uniform when setup_algebraic_node_update() is called.
428 //========================================================================
429 template<class ELEMENT>
431 : public virtual AlgebraicMesh,
432 public RefineableQuarterTubeMesh<ELEMENT>
433 {
434 public:
435 /// Constructor: Pass pointer to geometric object, start and
436 /// end coordinates of the geometric object and the fraction along
437 /// the 2nd Lagrangian coordinate at which the dividing line between
438 /// region 1 and region 2 is to be placed, and timestepper
439 /// (defaults to (Steady) default timestepper defined in Mesh).
440 /// Sets up the refineable mesh (by calling the constructor for the
441 /// underlying RefineableQuarterTubeMesh).
444 const Vector<double>& xi_lo,
445 const double& fract_mid,
446 const Vector<double>& xi_hi,
447 const unsigned& nlayer,
448 const double centre_box_size = 1.0,
449 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
450 : QuarterTubeMesh<ELEMENT>(
451 wall_pt, xi_lo, fract_mid, xi_hi, nlayer, time_stepper_pt),
453 wall_pt, xi_lo, fract_mid, xi_hi, nlayer, time_stepper_pt),
455 {
456#ifdef PARANOID
457 ELEMENT* el_pt = new ELEMENT;
458 if (dynamic_cast<AlgebraicElementBase*>(el_pt) == 0)
459 {
460 std::ostringstream error_message;
461
462 error_message << "Base class for ELEMENT in "
463 << "AlgebraicRefineableQuarterTubeMesh needs"
464 << "to be of type AlgebraicElement!\n";
465 error_message << "Whereas it is: typeid(el_pt).name()"
466 << typeid(el_pt).name() << std::endl;
467
468 std::string function_name = " AlgebraicRefineableQuarterTubeMesh::\n";
469 function_name += "AlgebraicRefineableQuarterTubeMesh()";
470
471 throw OomphLibError(error_message.str(),
474 }
475 delete el_pt;
476#endif
477
478 // Add the geometric object to the list associated with this AlgebraicMesh
480
481 // Setup algebraic node update operations
483
484 // Ensure nodes are in their default position
485 node_update();
486 }
487
488 /// Run self-test for algebraic mesh -- return 0/1 for OK/failure
489 unsigned self_test()
490 {
492 }
493
494 /// Broken version of the QuarterTubeDomain function
495 /// Function is broken because axial spacing isn't implemented
496 /// yet for the Algebraic version of the RefineableQuarterTubeMesh.
497 /// Note: this function must be used BEFORE algebraic_node_update(...)
498 /// is called.
500 {
501 std::ostringstream error_message;
502 error_message << "AxialSpacingFctPt has not been implemented "
503 << "for the AlgebraicRefineableQuarterTubeMesh\n";
504
505 std::string function_name =
506 " AlgebraicRefineableQuarterTubeMesh::AxialSpacingFctPt()";
507
508 throw OomphLibError(
510
511 return this->Domain_pt->axial_spacing_fct_pt();
512 }
513
514 /// Resolve mesh update: Update current nodal
515 /// positions via algebraic node update.
516 /// [Doesn't make sense to use this mesh with SolidElements anyway,
517 /// so we buffer the case if update_all_solid_nodes is set to
518 /// true.]
519 void node_update(const bool& update_all_solid_nodes = false)
520 {
521#ifdef PARANOID
523 {
524 std::string error_message =
525 "Doesn't make sense to use an AlgebraicMesh with\n";
526 error_message +=
527 "SolidElements so specifying update_all_solid_nodes=true\n";
528 error_message += "doesn't make sense either\n";
529
530 std::string function_name = " AlgebraicRefineableQuarterTubeMesh::";
531 function_name += "node_update()";
532
533 throw OomphLibError(
535 }
536#endif
537
539 }
540
541
542 /// Implement the algebraic node update function for a node
543 /// at time level t (t=0: present; t>0: previous): Update with
544 /// the node's first (default) update function.
546 {
547 // Update with the update function for the node's first (default)
548 // node update fct
549 unsigned id = node_pt->node_update_fct_id();
550
551 switch (id)
552 {
553 case Central_region:
554
555 // Central region
557 break;
558
560
561 // Lower right region
563 break;
564
566
567 // Upper left region
569 break;
570
571 default:
572
573 std::ostringstream error_message;
574 error_message << "The node update fct id is " << id
575 << ", but it should only be one of " << Central_region
576 << ", " << Lower_right_region << " or "
577 << Upper_left_region << std::endl;
578 std::string function_name = " AlgebraicRefineableQuarterTubeMesh::";
579 function_name += "algebraic_node_update()";
580
581 throw OomphLibError(error_message.str(),
584 }
585 }
586
587 /// Update the node update info for specified algebraic node
588 /// following any spatial mesh adaptation.
590 {
591 // Get all node update fct for this node (resizes internally)
594
595 // Loop over all update fcts
596 unsigned n_update = id.size();
597 for (unsigned i = 0; i < n_update; i++)
598 {
600 }
601 }
602
603 private:
604 /// Size of centre box
606
607 /// Remesh function ids
608 enum
609 {
613 };
614
615 /// Fractional width of central region
616 double Lambda_x;
617
618 /// Fractional height of central region
619 double Lambda_y;
620
621 /// Algebraic update function for a node that is located
622 /// in the central region
623 void node_update_central_region(const unsigned& t, AlgebraicNode*& node_pt);
624
625 /// Algebraic update function for a node that is located
626 /// in the lower-right region
627 void node_update_lower_right_region(const unsigned& t,
629
630 /// Algebraic update function for a node that is located
631 /// in the upper-left region
632 void node_update_upper_left_region(const unsigned& t,
634
635 /// Setup algebraic update operation for all nodes
637
638 /// Update algebraic node update function for nodes in
639 /// the region defined by region_id
641 };
642
643} // namespace oomph
645#endif
cstr elem_len * i
Definition cfortran.h:603
char t
Definition cfortran.h:568
Base class for algebraic elements.
Algebraic meshes contain AlgebraicElements and AlgebraicNodes. They implement the node update functio...
void node_update(const bool &update_all_solid_nodes=false)
Update all nodal positions via algebraic node update functions [Doesn't make sense to use this mesh w...
unsigned self_test()
Self test: check consistentency of multiple node updates.
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.
Algebraic nodes are nodes with an algebraic positional update function.
int node_update_fct_id()
Default (usually first if there are multiple ones) node update fct 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.
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 &region_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)...
Base class for brick meshes (meshes made of 3D brick elements).
Definition brick_mesh.h:178
MacroElement * macro_element_pt(const unsigned &i)
Access to i-th macro element.
Definition domain.h:116
A general Finite Element class.
Definition elements.h:1317
double size() const
Calculate the size of the element (length, area, volume,...) in Eulerian computational coordinates....
Definition elements.cc:4320
A geometric object is an object that provides a parametrised description of its shape via the functio...
Base class for elements that allow MacroElement-based node update.
MacroElementNodeUpdateMeshes contain MacroElementNodeUpdateNodes which have their own node update fun...
void set_geom_object_vector_pt(Vector< GeomObject * > geom_object_vector_pt)
Set geometric objects associated with MacroElementNodeUpdateMesh; this must also be called from the c...
Domain *& macro_domain_pt()
Broken assignment operator.
void node_update(const bool &update_all_solid_nodes=false)
Update all nodal positions via sparse MacroElement-based update functions. If a Node is hanging its p...
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 ...
static Steady< 0 > Default_TimeStepper
Default Steady Timestepper, to be used in default arguments to Mesh constructors.
Definition mesh.h:75
FiniteElement * finite_element_pt(const unsigned &e) const
Upcast (downcast?) to FiniteElement (needed to access FiniteElement member functions).
Definition mesh.h:477
const Vector< GeneralisedElement * > & element_pt() const
Return reference to the Vector of elements.
Definition mesh.h:464
unsigned self_test()
Self-test: Check elements and nodes. Return 0 for OK.
Definition mesh.cc:778
unsigned long nelement() const
Return number of elements in the mesh.
Definition mesh.h:598
An OcTreeForest consists of a collection of OcTreeRoots. Each member tree can have neighbours to its ...
Definition octree.h:928
OcTreeRoot is a OcTree that forms the root of a (recursive) octree. The "root node" is special as it ...
Definition octree.h:611
An OomphLibError object which should be thrown when an run-time error is encountered....
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.
Intermediate mesh class that implements the mesh adaptation functions specified in the TreeBasedRefin...
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...
TAdvectionDiffusionReactionElement<NREAGENT,DIM,NNODE_1D> elements are isoparametric triangular DIM-d...
Base class for time-stepping schemes. Timestepper provides an approximation of the temporal derivativ...
TreeForest * Forest_pt
Forest representation of the mesh.
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
OomphInfo oomph_info
Single (global) instantiation of the OomphInfo object – this is used throughout the library as a "rep...