quarter_circle_sector_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_CIRCLE_SECTOR_MESH_HEADER
27#define OOMPH_QUARTER_CIRCLE_SECTOR_MESH_HEADER
28
31#include "generic/domain.h"
33#include "generic/quad_mesh.h"
35
36// Include the headers file for domain
38
39namespace oomph
40{
41 ////////////////////////////////////////////////////////////////////
42 ////////////////////////////////////////////////////////////////////
43 ////////////////////////////////////////////////////////////////////
44
45 class GeomObject;
46
47 //====================================================================
48 /// 2D quarter ring mesh class.
49 /// The domain is specified by the GeomObject that identifies boundary 1.
50 ///
51 ///
52 /// \code
53 /// ---___
54 /// | ---____
55 /// | - BOUNDARY 1
56 /// | /
57 /// | [2] / |
58 /// | / |
59 /// | N / |
60 /// | |_ E / |
61 /// BOUNDARY 2 |----------- |
62 /// | | [1] |
63 /// | [0] | | ^
64 /// | | | / \ direction of
65 /// | N | N | | Lagrangian
66 /// | |_ E | |_ E | | coordinate
67 /// |__________|___________| | along wall GeomObject
68 ///
69 /// BOUNDARY 0
70 ///
71 /// Within the elements (MacroElements), the local coordinates
72 /// are such that the (E)astern direction coincides with the positive
73 /// s_0 direction, while the (N)orther direction coincides with the positive
74 /// s_1 direction.
75 ///
76 /// \endcode
77 ///
78 /// Domain is parametrised by three macro elements as sketched.
79 /// Nodal positions are determined via macro-element-based representation
80 /// of the Domain (as a QuarterCircleSectorDomain).
81 //====================================================================
82 template<class ELEMENT>
84 {
85 public:
86 /// Constructor: Pass pointer to geometric object that
87 /// specifies the wall, start and end coordinates on the
88 /// geometric object, and the fraction along
89 /// which the dividing line is to be placed, and the timestepper
90 /// (defaults to (Steady) default timestepper defined in Mesh)
93 const double& xi_lo,
94 const double& fract_mid,
95 const double& xi_hi,
96 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper);
97
98 /// Destructor:
100
101 /// Access function to GeomObject representing wall
103 {
104 return Wall_pt;
105 }
106
107 /// Access function to domain
112
113 /// Function pointer for function that squashes
114 /// the outer two macro elements towards
115 /// the wall by mapping the input value of the "radial" macro element
116 /// coordinate to the return value (defined in the underlying Domain object)
121
122 protected:
123 /// Pointer to Domain
125
126 /// Pointer to the geometric object that represents the curved wall
127 /// (mesh boundary 1)
129
130 /// Lower limit for the (1D) coordinates along the wall
131 double Xi_lo;
132
133 /// Fraction along wall where outer ring is to be divided
134 double Fract_mid;
135
136 /// Upper limit for the (1D) coordinates along the wall
137 double Xi_hi;
138 };
139
140
141 ////////////////////////////////////////////////////////////////////
142 ////////////////////////////////////////////////////////////////////
143 ////////////////////////////////////////////////////////////////////
144
145 //====================================================================
146 /// 2D quarter ring mesh class inherited from RefineableQuadMesh.
147 /// The domain is specified by the GeomObject that identifies boundary 1.
148 ///
149 ///
150 /// \code
151 /// ---___
152 /// | ---____
153 /// | - BOUNDARY 1
154 /// | /
155 /// | [2] / |
156 /// | / |
157 /// | N / |
158 /// | |_ E / |
159 /// BOUNDARY 2 |----------- |
160 /// | | [1] |
161 /// | [0] | | ^
162 /// | | | / \ direction of
163 /// | N | N | | Lagrangian
164 /// | |_ E | |_ E | | coordinate
165 /// |__________|___________| | along wall GeomObject
166 ///
167 /// BOUNDARY 0
168 ///
169 /// Within the elements (MacroElements), the local coordinates
170 /// are such that the (E)astern direction coincides with the positive
171 /// s_0 direction, while the (N)orther direction coincides with the positive
172 /// s_1 direction.
173 ///
174 /// \endcode
175 ///
176 /// Domain is parametrised by three macro elements as sketched.
177 ///
178 //====================================================================
179 template<class ELEMENT>
181 : public QuarterCircleSectorMesh<ELEMENT>,
182 public virtual RefineableQuadMesh<ELEMENT>
183 {
184 public:
185 /// Constructor: Pass pointer to geometric object that
186 /// specifies the wall, start and end coordinates on the
187 /// geometric object, and the fraction along
188 /// which the dividing line is to be placed, and the timestepper
189 /// (defaults to (Steady) default timestepper defined in Mesh).
190 /// Adds refinement data to elements of QuarterCircleSectorMesh.
193 const double& xi_lo,
194 const double& fract_mid,
195 const double& xi_hi,
196 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
197 : QuarterCircleSectorMesh<ELEMENT>(
198 wall_pt, xi_lo, fract_mid, xi_hi, time_stepper_pt)
199 {
200 // Basic mesh has been built -- just need to setup the
201 // adaptivity information:
202
203 // Setup quadtree forest
204 this->setup_quadtree_forest();
205 }
206
207 /// Destructor: Empty
209 };
210
211
212 ////////////////////////////////////////////////////////////////////
213 ////////////////////////////////////////////////////////////////////
214 // MacroElementNodeUpdate-version of RefineableQuarterCircleSectorMesh
215 ////////////////////////////////////////////////////////////////////
216 ////////////////////////////////////////////////////////////////////
217
218 class MacroElementNodeUpdateNode;
219
220 //========================================================================
221 /// MacroElementNodeUpdate version of RefineableQuarterCircleSectorMesh
222 ///
223 /// \code
224 /// ---___
225 /// | ---____
226 /// | - BOUNDARY 1
227 /// | /
228 /// | [2] / |
229 /// | / |
230 /// | N / |
231 /// | |_ E / |
232 /// BOUNDARY 2 |----------- |
233 /// | | [1] |
234 /// | [0] | | ^
235 /// | | | / \ direction of
236 /// | N | N | | Lagrangian
237 /// | |_ E | |_ E | | coordinate
238 /// |__________|___________| | along wall GeomObject
239 ///
240 /// BOUNDARY 0
241 ///
242 /// Within the elements (MacroElements), the local coordinates
243 /// are such that the (E)astern direction coincides with the positive
244 /// s_0 direction, while the (N)orther direction coincides with the positive
245 /// s_1 direction.
246 ///
247 /// \endcode
248 ///
249 /// Domain is parametrised by three macro elements as sketched. Elements
250 /// need to be derived from MacroElementNodeUpdateElementBase.
251 //========================================================================
252 template<class ELEMENT>
254 : public virtual MacroElementNodeUpdateMesh,
255 public virtual RefineableQuarterCircleSectorMesh<ELEMENT>
256 {
257 public:
258 /// Constructor: Pass pointer to geometric object, start and
259 /// end coordinates on the geometric object and the fraction along
260 /// which the dividing line is to be placed when updating the nodal
261 /// positions, and timestepper (defaults to (Steady) default timestepper
262 /// defined in Mesh). Setup the refineable mesh (by calling the
263 /// constructor for the underlying RefineableQuarterCircleSectorMesh)
264 /// and the algebraic node update functions for nodes.
267 const double& xi_lo,
268 const double& fract_mid,
269 const double& xi_hi,
270 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
273 wall_pt, xi_lo, fract_mid, xi_hi, time_stepper_pt)
274 {
275#ifdef PARANOID
276 ELEMENT* el_pt = new ELEMENT;
277 if (dynamic_cast<MacroElementNodeUpdateElementBase*>(el_pt) == 0)
278 {
279 std::ostringstream error_message;
280 error_message
281 << "Base class for ELEMENT in "
282 << "MacroElementNodeUpdateRefineableQuarterCircleSectorMesh needs"
283 << "to be of type MacroElementNodeUpdateElement!\n";
284 error_message << "Whereas it is: typeid(el_pt).name()"
285 << typeid(el_pt).name() << std::endl;
286
287 std::string function_name =
288 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh::\n";
290 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh()";
291
292 throw OomphLibError(error_message.str(),
295 }
296 delete el_pt;
297#endif
298
299 // Setup all the information that's required for MacroElement-based
300 // node update: Tell the elements that their geometry depends on the
301 // fishback geometric object
303 }
304
305 /// Destructor: empty
307
308 /// Resolve mesh update: Update current nodal
309 /// positions via sparse MacroElement-based update.
310 /// [Doesn't make sense to use this mesh with SolidElements anyway,
311 /// so we buffer the case if update_all_solid_nodes is set to
312 /// true.]
313 void node_update(const bool& update_all_solid_nodes = false)
314 {
315#ifdef PARANOID
317 {
318 std::string error_message =
319 "Doesn't make sense to use an MacroElementNodeUpdateMesh with\n";
320 error_message +=
321 "SolidElements so specifying update_all_solid_nodes=true\n";
322 error_message += "doesn't make sense either\n";
323
324 std::string function_name =
325 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh::\n";
326 function_name += "node_update()";
327
328 throw OomphLibError(
330 }
331#endif
333 }
334
335 private:
336 /// Setup all the information that's required for MacroElement-based
337 /// node update: Tell the elements that their geometry depends on the
338 /// geometric object that parametrises the wall
340 {
341 unsigned n_element = this->nelement();
342 for (unsigned i = 0; i < n_element; i++)
343 {
344 // Upcast from FiniteElement to the present element
345 ELEMENT* el_pt = dynamic_cast<ELEMENT*>(this->element_pt(i));
346
347#ifdef PARANOID
348 // Check if cast is successful
351 if (m_el_pt == 0)
352 {
353 std::ostringstream error_message;
354 error_message
355 << "Failed to upcast to MacroElementNodeUpdateElementBase\n";
356 error_message << "Element must be derived from "
357 "MacroElementNodeUpdateElementBase\n";
358 error_message << "but it is of type " << typeid(el_pt).name();
359
360 std::string function_name =
361 "MacroElementNodeUpdateRefineableQuaterCircleSectorMesh::\n";
362 function_name += "setup_macro_element_node_update()";
363
364 throw OomphLibError(error_message.str(),
367 }
368#endif
369 // There's just one GeomObject
370 Vector<GeomObject*> geom_object_pt(1);
371 geom_object_pt[0] = this->Wall_pt;
372
373 // Tell the element which geom objects its macro-element-based
374 // node update depends on
375 el_pt->set_node_update_info(geom_object_pt);
376 }
377
378 // Add the geometric object(s) for the wall to the mesh's storage
379 Vector<GeomObject*> geom_object_pt(1);
380 geom_object_pt[0] = this->Wall_pt;
382
383 // Fill in the domain pointer to the mesh's storage in the base class
385 }
386 };
387
388
389 ///////////////////////////////////////////////////////////////////////
390 ///////////////////////////////////////////////////////////////////////
391 // Algebraic-mesh-version of RefineableQuarterCircleSectorMesh
392 ///////////////////////////////////////////////////////////////////////
393 ///////////////////////////////////////////////////////////////////////
394
395 class AlgebraicNode;
396
397 //========================================================================
398 /// Algebraic version of RefineableQuarterCircleSectorMesh
399 ///
400 /// \code
401 /// ---___
402 /// | ---____
403 /// | - BOUNDARY 1
404 /// | /
405 /// | [2] / |
406 /// | / |
407 /// | N / |
408 /// | |_ E / |
409 /// BOUNDARY 2 |----------- |
410 /// | | [1] |
411 /// | [0] | | ^
412 /// | | | / \ direction of
413 /// | N | N | | Lagrangian
414 /// | |_ E | |_ E | | coordinate
415 /// |__________|___________| | along wall GeomObject
416 ///
417 /// BOUNDARY 0
418 ///
419 /// Within the elements (MacroElements), the local coordinates
420 /// are such that the (E)astern direction coincides with the positive
421 /// s_0 direction, while the (N)orther direction coincides with the positive
422 /// s_1 direction.
423 ///
424 /// \endcode
425 ///
426 /// Domain is parametrised by three macro elements as sketched. Elements
427 /// need to be derived from AlgebraicElementBase. In addition
428 /// to all the refinement procedures available for
429 /// RefineableQuarterCircleSectorMesh which forms the basis for
430 /// this mesh, we implement algebraic node update functions for the nodes.
431 //========================================================================
432 template<class ELEMENT>
434 : public virtual AlgebraicMesh,
436 {
437 public:
438 /// Constructor: Pass pointer to geometric object, start and
439 /// end coordinates on the geometric object and the fraction along
440 /// which the dividing line is to be placed when updating the nodal
441 /// positions, and timestepper (defaults to (Steady) default timestepper
442 /// defined in Mesh). Setup the refineable mesh (by calling the
443 /// constructor for the underlying RefineableQuarterCircleSectorMesh)
444 /// and the algebraic update functions for nodes.
447 const double& xi_lo,
448 const double& fract_mid,
449 const double& xi_hi,
450 TimeStepper* time_stepper_pt = &Mesh::Default_TimeStepper)
452 wall_pt, xi_lo, fract_mid, xi_hi, time_stepper_pt)
453 {
454#ifdef PARANOID
455 ELEMENT* el_pt = new ELEMENT;
456 if (dynamic_cast<AlgebraicElementBase*>(el_pt) == 0)
457 {
458 std::ostringstream error_message;
459
460 error_message << "Base class for ELEMENT in "
461 << "AlgebraicRefineableQuarterCircleSectorMesh needs"
462 << "to be of type AlgebraicElement!\n";
463 error_message << "Whereas it is: typeid(el_pt).name()"
464 << typeid(el_pt).name() << std::endl;
465
466 std::string function_name =
467 " AlgebraicRefineableQuarterCircleSectorMesh::\n";
468 function_name += "AlgebraicRefineableQuarterCircleSectorMesh()";
469
470 throw OomphLibError(error_message.str(),
473 }
474 delete el_pt;
475#endif
476
477 // Add the geometric object to the list associated with this AlgebraicMesh
479
480 // Setup algebraic node update operations
482 }
483
484 /// Run self-test for algebraic mesh -- return 0/1 for OK/failure
485 unsigned self_test()
486 {
488 }
489
490 /// Resolve mesh update: Update current nodal
491 /// positions via algebraic node update.
492 /// [Doesn't make sense to use this mesh with SolidElements anyway,
493 /// so we buffer the case if update_all_solid_nodes is set to
494 /// true.]
495 void node_update(const bool& update_all_solid_nodes = false)
496 {
497#ifdef PARANOID
499 {
500 std::string error_message =
501 "Doesn't make sense to use an AlgebraicMesh with\n";
502 error_message +=
503 "SolidElements so specifying update_all_solid_nodes=true\n";
504 error_message += "doesn't make sense either\n";
505
506 std::string function_name =
507 " AlgebraicRefineableQuarterCircleSectorMesh::";
508 function_name += "node_update()";
509
510 throw OomphLibError(
512 }
513#endif
515 }
516
517
518 /// Implement the algebraic node update function for a node
519 /// at time level t (t=0: present; t>0: previous): Update with
520 /// the node's first (default) update function.
522 {
523 // Update with the update function for the node's first (default)
524 // node update fct
525 unsigned id = node_pt->node_update_fct_id();
526
527 switch (id)
528 {
529 case Central_box:
530
531 // Central box
533 break;
534
535 case Lower_right_box:
536
537 // Lower right box
539 break;
540
541 case Upper_left_box:
542
543 // Upper left box
545 break;
546
547 default:
548
549 std::ostringstream error_message;
550 error_message << "The node update fct id is " << id
551 << ", but it should only be one of " << Central_box
552 << ", " << Lower_right_box << " or " << Upper_left_box
553 << std::endl;
554 std::string function_name =
555 " AlgebraicRefineableQuarterCircleSectorMesh::";
556 function_name += "algebraic_node_update()";
557
558 throw OomphLibError(error_message.str(),
561 }
562 }
563
564 /// Update the node update info for specified algebraic node
565 /// following any spatial mesh adaptation.
567 {
568 // Get all node update fct for this node (resizes internally)
571
572 // Loop over all update fcts
573 unsigned n_update = id.size();
574 for (unsigned i = 0; i < n_update; i++)
575 {
576 switch (id[i])
577 {
578 case Central_box:
579
580 // Central box: no update
581 break;
582
583 case Lower_right_box:
584
585 // Lower right box
587 break;
588
589 case Upper_left_box:
590
591 // Upper left box
593 break;
594
595 default:
596
597 // Never get here....
598 std::ostringstream error_message;
599 error_message << "Node update fct id is " << id[i]
600 << ", but it should only be one of" << Central_box
601 << ", " << Lower_right_box << " or " << Upper_left_box
602 << std::endl;
603
604 std::string function_name =
605 " AlgebraicRefineableQuarterCircleSectorMesh::";
606 function_name += "update_node_update()";
607
608 throw OomphLibError(error_message.str(),
611 }
612 }
613 }
614
615 private:
616 /// Remesh function ids
617 enum
618 {
622 };
623
624 /// Fractional width of central box
625 double Lambda_x;
626
627 /// Fractional height of central box
628 double Lambda_y;
629
630 /// Algebraic update function for a node that is located
631 /// in the central box
632 void node_update_in_central_box(const unsigned& t, AlgebraicNode*& node_pt);
633
634 /// Algebraic update function for a node that is located
635 /// in the lower right box
636 void node_update_in_lower_right_box(const unsigned& t,
638
639 /// Algebraic update function for a node that is located
640 /// in the upper left box
641 void node_update_in_upper_left_box(const unsigned& t,
643
644 /// Setup algebraic update operation for all nodes
646
647
648 /// Update algebraic node update function for nodes in
649 /// lower right box
651
652 /// Update algebraic node update function for nodes
653 /// in upper left box
655 };
656
657} // namespace oomph
658
660#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.
Algebraic version of RefineableQuarterCircleSectorMesh.
void update_node_update(AlgebraicNode *&node_pt)
Update the node update info for specified algebraic node following any spatial mesh adaptation.
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 setup_algebraic_node_update()
Setup algebraic update operation for all nodes.
AlgebraicRefineableQuarterCircleSectorMesh(GeomObject *wall_pt, const double &xi_lo, const double &fract_mid, const double &xi_hi, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass pointer to geometric object, start and end coordinates on the geometric object and ...
unsigned self_test()
Run self-test for algebraic mesh – return 0/1 for OK/failure.
void update_node_update_in_lower_right_box(AlgebraicNode *&node_pt)
Update algebraic node update function for nodes in lower right box.
void node_update_in_central_box(const unsigned &t, AlgebraicNode *&node_pt)
Algebraic update function for a node that is located in the central box.
void node_update_in_lower_right_box(const unsigned &t, AlgebraicNode *&node_pt)
Algebraic update function for a node that is located in the lower right box.
void update_node_update_in_upper_left_box(AlgebraicNode *&node_pt)
Update algebraic node update function for nodes in upper left box.
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)...
void node_update_in_upper_left_box(const unsigned &t, AlgebraicNode *&node_pt)
Algebraic update function for a node that is located in the upper left box.
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 RefineableQuarterCircleSectorMesh.
void setup_macro_element_node_update()
Setup all the information that's required for MacroElement-based node update: Tell the elements that ...
void node_update(const bool &update_all_solid_nodes=false)
Resolve mesh update: Update current nodal positions via sparse MacroElement-based update....
MacroElementNodeUpdateRefineableQuarterCircleSectorMesh(GeomObject *wall_pt, const double &xi_lo, const double &fract_mid, const double &xi_hi, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass pointer to geometric object, start and end coordinates on the geometric object and ...
static Steady< 0 > Default_TimeStepper
Default Steady Timestepper, to be used in default arguments to Mesh constructors.
Definition mesh.h:75
const Vector< GeneralisedElement * > & element_pt() const
Return reference to the Vector of elements.
Definition mesh.h:464
unsigned long nelement() const
Return number of elements in the mesh.
Definition mesh.h:598
An OomphLibError object which should be thrown when an run-time error is encountered....
Base class for quad meshes (meshes made of 2D quad elements).
Definition quad_mesh.h:57
Circular sector as domain. Domain is bounded by curved boundary which is represented by a GeomObject....
double(* BLSquashFctPt)(const double &s)
Typedef for function pointer for function that squashes the outer two macro elements towards the wall...
BLSquashFctPt & bl_squash_fct_pt()
Function pointer for function that squashes the outer two macro elements towards the wall by mapping ...
2D quarter ring mesh class. The domain is specified by the GeomObject that identifies boundary 1.
double Fract_mid
Fraction along wall where outer ring is to be divided.
GeomObject *& wall_pt()
Access function to GeomObject representing wall.
double Xi_hi
Upper limit for the (1D) coordinates along the wall.
GeomObject * Wall_pt
Pointer to the geometric object that represents the curved wall (mesh boundary 1)
QuarterCircleSectorDomain * Domain_pt
Pointer to Domain.
QuarterCircleSectorDomain * domain_pt()
Access function to domain.
double Xi_lo
Lower limit for the (1D) coordinates along the wall.
QuarterCircleSectorDomain::BLSquashFctPt & bl_squash_fct_pt()
Function pointer for function that squashes the outer two macro elements towards the wall by mapping ...
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...
2D quarter ring mesh class inherited from RefineableQuadMesh. The domain is specified by the GeomObje...
RefineableQuarterCircleSectorMesh(GeomObject *wall_pt, const double &xi_lo, const double &fract_mid, const double &xi_hi, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass pointer to geometric object that specifies the wall, start and end coordinates on t...
virtual ~RefineableQuarterCircleSectorMesh()
Destructor: Empty.
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...
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).