26 #ifndef OOMPH_FISH_MESH_HEADER
27 #define OOMPH_FISH_MESH_HEADER
30 #include "../generic/refineable_quad_mesh.h"
31 #include "../generic/macro_element.h"
32 #include "../generic/domain.h"
33 #include "../generic/algebraic_elements.h"
34 #include "../generic/quad_mesh.h"
35 #include "../generic/macro_element_node_update_element.h"
38 #include "../generic/algebraic_elements.h"
41 #include "../generic/macro_element_node_update_element.h"
53 template<
class ELEMENT>
126 template<
class ELEMENT>
135 :
FishMesh<ELEMENT>(time_stepper_pt)
152 :
FishMesh<ELEMENT>(back_pt, time_stepper_pt)
183 class MacroElementNodeUpdateNode;
196 template<
class ELEMENT>
208 :
FishMesh<ELEMENT>(back_pt, time_stepper_pt),
212 ELEMENT* el_pt =
new ELEMENT;
215 std::ostringstream error_message;
216 error_message <<
"Base class for ELEMENT in "
217 <<
"MacroElementNodeUpdateRefineableFishMesh needs"
218 <<
"to be of type MacroElementNodeUpdateElement!\n";
219 error_message <<
"Whereas it is: typeid(el_pt).name()"
220 <<
typeid(el_pt).
name() << std::endl;
223 "MacroElementNodeUpdateRefineableFishMesh::\n";
224 function_name +=
"MacroElementNodeUpdateRefineableFishMesh()";
237 unsigned n_element = this->
nelement();
238 for (
unsigned i = 0;
i < n_element;
i++)
241 ELEMENT* el_pt =
dynamic_cast<ELEMENT*
>(this->
element_pt(
i));
249 std::ostringstream error_message;
251 <<
"Failed to upcast to MacroElementNodeUpdateElementBase\n";
252 error_message <<
"Element must be derived from "
253 "MacroElementNodeUpdateElementBase\n";
254 error_message <<
"but it is of type " <<
typeid(el_pt).
name();
257 "MacroElementNodeUpdateRefineableFishMesh::\n";
258 function_name +=
"MacroElementNodeUpdateRefinableFishMesh()";
267 geom_object_pt[0] = this->
Back_pt;
271 el_pt->set_node_update_info(geom_object_pt);
276 geom_object_pt[0] = this->
Back_pt;
294 if (update_all_solid_nodes)
297 "Doesn't make sense to use an MacroElementNodeUpdateMesh with\n";
299 "SolidElements so specifying update_all_solid_nodes=true\n";
300 error_message +=
"doesn't make sense either\n";
303 "MacroElementNodeUpdateRefineableFishMesh::";
304 function_name +=
"node_update()";
325 template<
class ELEMENT>
333 :
FishMesh<ELEMENT>(time_stepper_pt)
344 :
FishMesh<ELEMENT>(back_pt, time_stepper_pt)
376 std::ostringstream error_message;
377 error_message <<
"The node update fct id is " <<
id
378 <<
", but it should only be one of " << this->
Lower_body
380 <<
" or " << this->
Upper_fin << std::endl;
382 "AlgebraicFishMesh::algebraic_node_update()";
395 virtual void node_update(
const bool& update_all_solid_nodes =
false)
398 if (update_all_solid_nodes)
401 "Doesn't make sense to use an AlgebraicMesh with\n";
403 "SolidElements so specifying update_all_solid_nodes=true\n";
404 error_message +=
"doesn't make sense either\n";
406 std::string function_name =
"AlgebraicFishMesh::node_update()";
439 zeta[0] = 0.5 * (xi_nose + xi_tail);
445 if ((geom_obj_pt != this->
Back_pt) || (s[0] !=
zeta[0]))
447 std::ostringstream error_message;
448 error_message <<
"AlgebraicFishMesh only works with GeomObjects\n"
449 <<
"that do not contain sub-elements (e.g. GeomObjects\n"
450 <<
"that represent a wall finite element mesh!\n"
451 <<
"Back_pt : " << this->
Back_pt << std::endl
452 <<
"geom_obj_pt: " << geom_obj_pt << std::endl
453 <<
"s[0] : " <<
s[0] << std::endl
454 <<
"zeta[0] : " <<
zeta[0] << std::endl;
488 template<
class ELEMENT>
501 :
FishMesh<ELEMENT>(time_stepper_pt),
518 :
FishMesh<ELEMENT>(back_pt, time_stepper_pt),
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Fish shaped mesh with algebraic node update function for nodes.
Definition: fish_mesh.template.h:328
virtual ~AlgebraicFishMesh()
Destructor: empty.
Definition: fish_mesh.template.h:354
void setup_algebraic_node_update()
Definition: fish_mesh.template.cc:682
virtual void node_update(const bool &update_all_solid_nodes=false)
Definition: fish_mesh.template.h:395
AlgebraicFishMesh(TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: fish_mesh.template.h:332
void node_update_in_body(const unsigned &t, AlgebraicNode *&node_pt)
Algebraic update function for nodes in upper/lower body.
Definition: fish_mesh.template.cc:893
void update_node_update(AlgebraicNode *&node_pt)
Definition: fish_mesh.template.h:424
AlgebraicFishMesh(GeomObject *back_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: fish_mesh.template.h:342
void algebraic_node_update(const unsigned &t, AlgebraicNode *&node_pt)
Definition: fish_mesh.template.h:358
void node_update_in_fin(const unsigned &t, AlgebraicNode *&node_pt)
Algebraic update function for nodes in upper/lower fin.
Definition: fish_mesh.template.cc:949
Definition: algebraic_elements.h:599
void node_update(const bool &update_all_solid_nodes=false)
Definition: algebraic_elements.h:653
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
int node_update_fct_id()
Default (usually first if there are multiple ones) node update fct id.
Definition: algebraic_elements.h:146
Refineable fish shaped mesh with algebraic node update function.
Definition: fish_mesh.template.h:491
AlgebraicRefineableFishMesh(GeomObject *back_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: fish_mesh.template.h:515
virtual ~AlgebraicRefineableFishMesh()
Destructor: empty.
Definition: fish_mesh.template.h:526
void node_update(const bool &update_all_solid_nodes=false)
Definition: fish_mesh.template.h:530
AlgebraicRefineableFishMesh(TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: fish_mesh.template.h:499
Definition: fish_domain.h:43
double & xi_nose()
Start coordinate on wall (near nose)
Definition: fish_domain.h:101
double & xi_tail()
End coordinate on wall (near tail)
Definition: fish_domain.h:107
Definition: fish_mesh.template.h:55
@ Lower_body
Definition: fish_mesh.template.h:95
@ Lower_fin
Definition: fish_mesh.template.h:97
@ Upper_fin
Definition: fish_mesh.template.h:98
@ Upper_body
Definition: fish_mesh.template.h:96
GeomObject * Back_pt
Pointer to fish back.
Definition: fish_mesh.template.h:105
virtual ~FishMesh()
Definition: fish_mesh.template.h:69
FishMesh(TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: fish_mesh.template.cc:39
GeomObject *& fish_back_pt()
Access function to geom object that represents the fish's back.
Definition: fish_mesh.template.h:79
void build_mesh(TimeStepper *time_stepper_pt)
Build the mesh, using the geometric object identified by Back_pt.
Definition: fish_mesh.template.cc:83
bool Must_kill_fish_back
Do I need to kill the fish back geom object?
Definition: fish_mesh.template.h:111
FishDomain *& domain_pt()
Access function to FishDomain.
Definition: fish_mesh.template.h:86
FishDomain * Domain_pt
Pointer to domain.
Definition: fish_mesh.template.h:108
Definition: geom_objects.h:101
virtual void locate_zeta(const Vector< double > &zeta, GeomObject *&sub_geom_object_pt, Vector< double > &s, const bool &use_coordinate_as_initial_guess=false)
Definition: geom_objects.h:381
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
void node_update(const bool &update_all_solid_nodes=false)
Definition: macro_element_node_update_element.h:387
Domain *& macro_domain_pt()
Broken assignment operator.
Definition: macro_element_node_update_element.h:376
Definition: fish_mesh.template.h:200
void node_update(const bool &update_all_solid_nodes=false)
Definition: fish_mesh.template.h:291
virtual ~MacroElementNodeUpdateRefineableFishMesh()
Destructor: empty.
Definition: fish_mesh.template.h:284
MacroElementNodeUpdateRefineableFishMesh(GeomObject *back_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: fish_mesh.template.h:205
static Steady< 0 > Default_TimeStepper
The Steady Timestepper.
Definition: mesh.h:75
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
Base class for quad meshes (meshes made of 2D quad elements).
Definition: quad_mesh.h:57
Definition: fish_mesh.template.h:129
void setup_adaptivity()
Definition: fish_mesh.template.cc:661
RefineableFishMesh(TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: fish_mesh.template.h:133
RefineableFishMesh(GeomObject *back_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: fish_mesh.template.h:149
virtual ~RefineableFishMesh()
Definition: fish_mesh.template.h:163
Definition: refineable_quad_mesh.h:53
Definition: timesteppers.h:231
RealScalar s
Definition: level1_cplx_impl.h:130
EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp< Eigen::internal::scalar_zeta_op< typename DerivedX::Scalar >, const DerivedX, const DerivedQ > zeta(const Eigen::ArrayBase< DerivedX > &x, const Eigen::ArrayBase< DerivedQ > &q)
Definition: SpecialFunctionsArrayAPI.h:152
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