30#include "navier_stokes.h"
211 for(
unsigned i=0;
i<2;
i++)
231template <
class ELEMENT>
240 const unsigned& ncollapsible,
241 const unsigned& ndown,
251#ifdef MACRO_ELEMENT_NODE_UPDATE
348#ifdef MACRO_ELEMENT_NODE_UPDATE
384template <
class ELEMENT>
387 const unsigned& ncollapsible,
388 const unsigned& ndown,
407 Problem::Max_residuals=1000.0;
435#ifdef MACRO_ELEMENT_NODE_UPDATE
440 (nup, ncollapsible, ndown,
ny,
449 Bulk_mesh_pt->node_update();
456 (nup, ncollapsible, ndown,
ny,
464 if (CommandLineArgs::Argc>1)
467 Bulk_mesh_pt->refine_uniformly();
473 Applied_fluid_traction_mesh_pt =
new Mesh;
477 create_traction_elements(5,Bulk_mesh_pt,Applied_fluid_traction_mesh_pt);
497 unsigned n_element=Bulk_mesh_pt->nelement();
527 for(
unsigned i=0;
i<2;
i++)
529 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(
i);
539 for(
unsigned i=0;
i<2;
i++)
541 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(
i);
551 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(1);
561 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(1);
572 unsigned n_el=Applied_fluid_traction_mesh_pt->nelement();
578 Applied_fluid_traction_mesh_pt->element_pt(
e));
615 elem_pt->set_normal_pointing_out_of_fluid();
626 for(
unsigned b=0;
b<2;
b++)
629 wall_mesh_pt()->boundary_node_pt(
b,0)->pin_position(0);
630 wall_mesh_pt()->boundary_node_pt(
b,0)->pin_position(1);
652 num_nod= wall_mesh_pt()->nnode();
668 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->
670 FSI_functions::apply_no_slip_on_moving_wall);
679 FSI_functions::setup_fluid_load_info_for_solid_elements<ELEMENT,2>
680 (
this,3,Bulk_mesh_pt,Wall_mesh_pt);
694template <
class ELEMENT>
699#ifdef MACRO_ELEMENT_NODE_UPDATE
702 if (CommandLineArgs::Argc>1)
704 FSI_functions::doc_fsi<MacroElementNodeUpdateNode>
705 (Bulk_mesh_pt,Wall_mesh_pt,
doc_info);
711 if (CommandLineArgs::Argc>1)
713 FSI_functions::doc_fsi<AlgebraicNode>(Bulk_mesh_pt,Wall_mesh_pt,
doc_info);
748 unsigned n_elem=wall_mesh_pt()->nelement();
761 << Wall_node_pt->x(1) <<
" "
762 << Left_node_pt->value(0) <<
" "
763 << Right_node_pt->value(0) <<
" "
776template <
class ELEMENT>
782 unsigned n_element = bulk_mesh_pt->nboundary_element(
b);
789 (bulk_mesh_pt->boundary_element_pt(
b,
e));
792 int face_index = bulk_mesh_pt->face_index_at_boundary(
b,
e);
810template<
class ELEMENT>
834template <
class ELEMENT>
841 error_stream <<
"Timestepper has to be from the BDF family!\n"
842 <<
"You have specified a timestepper from the "
851 bulk_mesh_pt()->node_update();
854 unsigned num_nod = bulk_mesh_pt()->nnode();
859 x[0]=bulk_mesh_pt()->node_pt(
n)->x(0);
860 x[1]=bulk_mesh_pt()->node_pt(
n)->x(1);
863 bulk_mesh_pt()->node_pt(
n)->set_value(0,6.0*(x[1]/Ly)*(1.0-(x[1]/Ly)));
864 bulk_mesh_pt()->node_pt(
n)->set_value(1,0.0);
868 bulk_mesh_pt()->assign_initial_values_impulsive();
869 wall_mesh_pt()->assign_initial_values_impulsive();
880template<
class ELEMENT>
884 delete_traction_elements(Applied_fluid_traction_mesh_pt);
896template<
class ELEMENT>
901 create_traction_elements(5,Bulk_mesh_pt,Applied_fluid_traction_mesh_pt);
916 unsigned n_element=Applied_fluid_traction_mesh_pt->nelement();
922 Applied_fluid_traction_mesh_pt->element_pt(
e));
945 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->
947 FSI_functions::apply_no_slip_on_moving_wall);
958 FSI_functions::setup_fluid_load_info_for_solid_elements<ELEMENT,2>
959 (
this,3,Bulk_mesh_pt,Wall_mesh_pt);
979 if (CommandLineArgs::Argc>1)
1004#ifdef MACRO_ELEMENT_NODE_UPDATE
1011 problem(nup, ncollapsible, ndown, ny,
1019 problem(nup, ncollapsible, ndown, ny,
1031 problem(nup, ncollapsible, ndown, ny,
1039 problem(nup, ncollapsible, ndown, ny,
1062 problem.set_initial_condition();
1082 if (CommandLineArgs::Argc>1)
1089 problem.bulk_mesh_pt()->max_permitted_error()=1.0e-3;
1090 problem.bulk_mesh_pt()->min_permitted_error()=1.0e-5;
1093 if (CommandLineArgs::Argc>1)
1096 problem.bulk_mesh_pt()->max_permitted_error()=0.5e-2;
1097 problem.bulk_mesh_pt()->min_permitted_error()=0.5e-4;
Mesh * Applied_fluid_traction_mesh_pt
Pointer to the "surface" mesh that applies the traction at the inflow.
double Ldown
x-length in the downstream part of the channel
Node * Left_node_pt
Pointer to the left control node.
Node * Right_node_pt
Pointer to right control node.
MacroElementNodeUpdateRefineableCollapsibleChannelMesh< ELEMENT > * Bulk_mesh_pt
Pointer to the "bulk" mesh.
unsigned Nup
Number of elements in the x direction in the upstream part of the channel.
OneDLagrangianMesh< FSIHermiteBeamElement > * Wall_mesh_pt
Pointer to the "wall" mesh.
MacroElementNodeUpdateRefineableCollapsibleChannelMesh< ELEMENT > * bulk_mesh_pt()
Access function for the specific bulk (fluid) mesh.
unsigned Ncollapsible
Number of elements in the x direction in the collapsible part of the channel.
void actions_after_newton_solve()
Update the problem after solve (empty)
unsigned Ny
Number of elements across the channel.
unsigned Ndown
Number of elements in the x direction in the downstream part of the channel.
double Lup
x-length in the upstream part of the channel
void actions_before_adapt()
Actions before adapt: Wipe the mesh of prescribed traction elements.
RefineableAlgebraicCollapsibleChannelMesh< ELEMENT > * Bulk_mesh_pt
Pointer to the "bulk" mesh.
RefineableAlgebraicCollapsibleChannelMesh< ELEMENT > * bulk_mesh_pt()
Access function for the specific bulk (fluid) mesh.
MacroElementNodeUpdateCollapsibleChannelMesh< ELEMENT > * Bulk_mesh_pt
Pointer to the "bulk" mesh.
~FSICollapsibleChannelProblem()
Destructor (empty)
void actions_before_newton_convergence_check()
Update before checking Newton convergence: Update the nodal positions in the fluid mesh in response t...
void actions_before_newton_solve()
Update the problem specs before solve (empty)
Node * Wall_node_pt
Pointer to control node on the wall.
double Ly
Transverse length.
void actions_after_adapt()
Actions after adapt: Rebuild the mesh of prescribed traction elements and reset FSI.
double Lcollapsible
x-length in the collapsible part of the channel
OneDLagrangianMesh< FSIHermiteBeamElement > * wall_mesh_pt()
Access function for the wall mesh.
MacroElementNodeUpdateCollapsibleChannelMesh< ELEMENT > * bulk_mesh_pt()
Access function for the specific bulk (fluid) mesh.
void delete_traction_elements(Mesh *const &traction_mesh_pt)
Delete prescribed traction elements from the surface mesh.
void create_traction_elements(const unsigned &b, Mesh *const &bulk_mesh_pt, Mesh *const &traction_mesh_pt)
Create the prescribed traction elements on boundary b.
void set_initial_condition()
Apply initial conditions.
FSICollapsibleChannelProblem(const unsigned &nup, const unsigned &ncollapsible, const unsigned &ndown, const unsigned &ny, const double &lup, const double &lcollapsible, const double &ldown, const double &ly)
Constructor: The arguments are the number of elements and the lengths of the domain.
void doc_solution(DocInfo &doc_info, ofstream &trace_file)
Doc the solution.
unsigned Ncollapsible
Number of element columns in collapsible part.
unsigned Nup
Number of element columns in upstream part.
unsigned Ndown
Number of element columns in downstream part.
unsigned Ny
Number of element rows across channel.
Collapsible channel mesh with MacroElement-based node update. The collapsible segment is represented ...
const unsigned & ny() const
Access function for number of elements in y directions.
int main(int argc, char *argv[])
Driver code for a collapsible channel problem with FSI. Presence of command line arguments indicates ...
Namespace to define the mapping [0,1] -> [0,1] that re-distributes nodal points across the channel wi...
double squash_fct(const double &s)
Mapping [0,1] -> [0,1] that re-distributes nodal points across the channel width.
double Delta
Boundary layer width.
double Fract_in_BL
Fraction of points in boundary layer.
Namespace for phyical parameters.
double P_ext
External pressure.
double ReSt
Womersley = Reynolds times Strouhal.
void prescribed_traction(const double &t, const Vector< double > &x, const Vector< double > &n, Vector< double > &traction)
Traction applied on the fluid at the left (inflow) boundary.
void load(const Vector< double > &xi, const Vector< double > &x, const Vector< double > &N, Vector< double > &load)
Load function: Apply a constant external pressure to the wall. Note: This is the load without the flu...
double Sigma0
2nd Piola Kirchhoff pre-stress. As in Jensen & Heil (2003) paper.
double Q
Fluid structure interaction parameter: Ratio of stresses used for non-dimensionalisation of fluid to ...
double Re
Reynolds number.
double P_up
Default pressure on the left boundary.
double H
Non-dimensional wall thickness. As in Jensen & Heil (2003) paper.