30#include "navier_stokes.h"
111 void position(
const Vector<double>& zeta, Vector<double>& r)
const
122 void position(
const unsigned& t,
const Vector<double>& zeta,
123 Vector<double>& r)
const
138 DenseMatrix<double> &drdzeta,
139 RankThreeTensor<double> &ddrdzeta)
const
187 const Vector<double>& x,
188 const Vector<double>& n,
189 Vector<double>& traction)
209 void load(
const Vector<double>& xi,
const Vector<double>& x,
210 const Vector<double>& N, Vector<double>&
load)
212 for(
unsigned i=0;i<2;i++)
232template <
class ELEMENT>
241 const unsigned& ncollapsible,
242 const unsigned& ndown,
245 const double& lcollapsible,
253#ifdef MACRO_ELEMENT_NODE_UPDATE
303 void doc_solution(DocInfo& doc_info,ofstream& trace_file);
313 Mesh*
const &traction_mesh_pt);
340#ifdef MACRO_ELEMENT_NODE_UPDATE
377template <
class ELEMENT>
380 const unsigned& ncollapsible,
381 const unsigned& ndown,
384 const double& lcollapsible,
390 Ncollapsible=ncollapsible;
394 Lcollapsible=lcollapsible;
400 Problem::Max_residuals=1000.0;
405 add_time_stepper_pt(
new BDF<2>);
414 (Ncollapsible,Lcollapsible,undeformed_wall_pt);
420 MeshAsGeomObject* wall_geom_object_pt=
421 new MeshAsGeomObject(Wall_mesh_pt);
424#ifdef MACRO_ELEMENT_NODE_UPDATE
429 (nup, ncollapsible, ndown, ny,
438 Bulk_mesh_pt->node_update();
445 (nup, ncollapsible, ndown, ny,
457 Applied_fluid_traction_mesh_pt =
new Mesh;
461 create_traction_elements(5,Bulk_mesh_pt,Applied_fluid_traction_mesh_pt);
477 unsigned n_element=Bulk_mesh_pt->nelement();
502 for(
unsigned i=0;
i<2;
i++)
504 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(
i);
514 for(
unsigned i=0;
i<2;
i++)
516 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(
i);
526 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(1);
535 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(1);
544 unsigned n_el=Applied_fluid_traction_mesh_pt->nelement();
550 Applied_fluid_traction_mesh_pt->element_pt(
e));
587 elem_pt->set_normal_pointing_out_of_fluid();
598 for(
unsigned b=0;
b<2;
b++)
601 wall_mesh_pt()->boundary_node_pt(
b,0)->pin_position(0);
602 wall_mesh_pt()->boundary_node_pt(
b,0)->pin_position(1);
625 Wall_node_pt=wall_mesh_pt()->node_pt(Ncollapsible/2);
642 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->
644 FSI_functions::apply_no_slip_on_moving_wall);
652 FSI_functions::setup_fluid_load_info_for_solid_elements<ELEMENT,2>
653 (
this,3,Bulk_mesh_pt,Wall_mesh_pt);
667template <
class ELEMENT>
673#ifdef MACRO_ELEMENT_NODE_UPDATE
676 if (CommandLineArgs::Argc>1)
678 FSI_functions::doc_fsi<MacroElementNodeUpdateNode>(Bulk_mesh_pt,Wall_mesh_pt,
doc_info);
684 if (CommandLineArgs::Argc>1)
686 FSI_functions::doc_fsi<AlgebraicNode>(Bulk_mesh_pt,Wall_mesh_pt,
doc_info);
715 << Wall_node_pt->x(1) <<
" "
716 << Left_node_pt->value(0) <<
" "
717 << Right_node_pt->value(0) <<
" "
729template <
class ELEMENT>
735 unsigned n_element = bulk_mesh_pt->nboundary_element(
b);
742 (bulk_mesh_pt->boundary_element_pt(
b,
e));
745 int face_index = bulk_mesh_pt->face_index_at_boundary(
b,
e);
764template <
class ELEMENT>
771 error_stream <<
"Timestepper has to be from the BDF family!\n"
772 <<
"You have specified a timestepper from the "
781 bulk_mesh_pt()->node_update();
784 unsigned num_nod = bulk_mesh_pt()->nnode();
789 x[0]=bulk_mesh_pt()->node_pt(
n)->x(0);
790 x[1]=bulk_mesh_pt()->node_pt(
n)->x(1);
793 bulk_mesh_pt()->node_pt(
n)->set_value(0,6.0*(x[1]/Ly)*(1.0-(x[1]/Ly)));
794 bulk_mesh_pt()->node_pt(
n)->set_value(1,0.0);
798 bulk_mesh_pt()->assign_initial_values_impulsive();
819 if (CommandLineArgs::Argc>1)
843#ifdef MACRO_ELEMENT_NODE_UPDATE
850 problem(nup, ncollapsible, ndown, ny,
858 problem(nup, ncollapsible, ndown, ny,
870 problem(nup, ncollapsible, ndown, ny,
878 problem(nup, ncollapsible, ndown, ny,
899 problem.set_initial_condition();
919 if (CommandLineArgs::Argc>1)
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.
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.
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.
AlgebraicCollapsibleChannelMesh< ELEMENT > * Bulk_mesh_pt
Pointer to the "bulk" mesh.
double Lup
x-length in the upstream part of the channel
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.
double Lcollapsible
x-length in the collapsible part of the channel
AlgebraicCollapsibleChannelMesh< ELEMENT > * bulk_mesh_pt()
Access function for the specific bulk (fluid) mesh.
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 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.
Collapsible channel mesh with algebraic node update.
Collapsible channel mesh with MacroElement-based node update. The collapsible segment is represented ...
1D mesh parametrised in terms of a 1D Lagrangian coordinate. The Eulerian positions of the nodes are ...
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.