29#include "navier_stokes.h"
32#include "constitutive.h"
35#include "meshes/one_d_lagrangian_mesh.h"
38#include "meshes/collapsible_channel_mesh.h"
48template <
class ELEMENT>
50 public virtual CollapsibleChannelMesh<ELEMENT>,
51 public virtual SolidMesh
61 const unsigned&
ndown,
257 for(
unsigned i=0;
i<2;
i++)
277template <
class ELEMENT>
287 const unsigned&
ndown,
426template <
class ELEMENT>
430 const unsigned&
ndown,
449 Problem::Max_residuals=1000.0;
493 Bulk_mesh_pt->set_lagrangian_nodal_coordinates();
498 Applied_fluid_traction_mesh_pt =
new Mesh;
502 create_traction_elements(5,Bulk_mesh_pt,Applied_fluid_traction_mesh_pt);
506 Lagrange_multiplier_mesh_pt=
new SolidMesh;
507 create_lagrange_multiplier_elements();
526 unsigned n_element=Bulk_mesh_pt->nelement();
540 el_pt->constitutive_law_pt() = Constitutive_law_pt;
558 for(
unsigned i=0;
i<2;
i++)
560 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(
i);
570 for(
unsigned i=0;
i<2;
i++)
572 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(
i);
582 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(1);
592 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->pin(1);
605 for(
unsigned i=0;
i<2;
i++)
607 dynamic_cast<SolidNode*
>(bulk_mesh_pt()->
616 unsigned nnod=bulk_mesh_pt()->nnode();
622 for(
unsigned i=0;
i<2;
i++)
635 unsigned n_el=Applied_fluid_traction_mesh_pt->nelement();
641 Applied_fluid_traction_mesh_pt->element_pt(
e));
678 elem_pt->set_normal_pointing_out_of_fluid();
689 for(
unsigned b=0;
b<2;
b++)
692 wall_mesh_pt()->boundary_node_pt(
b,0)->pin_position(0);
693 wall_mesh_pt()->boundary_node_pt(
b,0)->pin_position(1);
715 num_nod= wall_mesh_pt()->nnode();
716 Wall_node_pt=wall_mesh_pt()->node_pt(Ncollapsible/2);
732 bulk_mesh_pt()->boundary_node_pt(
ibound,
inod)->
742 (
this,3,Bulk_mesh_pt,Wall_mesh_pt);
756template <
class ELEMENT>
790 unsigned n_elem=wall_mesh_pt()->nelement();
803 << Wall_node_pt->x(1) <<
" "
804 << Left_node_pt->value(0) <<
" "
805 << Right_node_pt->value(0) <<
" "
818template <
class ELEMENT>
824 unsigned n_element = bulk_mesh_pt->nboundary_element(
b);
831 (bulk_mesh_pt->boundary_element_pt(
b,
e));
834 int face_index = bulk_mesh_pt->face_index_at_boundary(
b,
e);
852template<
class ELEMENT>
875template<
class ELEMENT>
883 unsigned n_element = bulk_mesh_pt()->nboundary_element(
b);
890 bulk_mesh_pt()->boundary_element_pt(
b,
e));
893 int face_index = bulk_mesh_pt()->face_index_at_boundary(
b,
e);
896 Lagrange_multiplier_mesh_pt->add_element_pt(
904 n_element=Lagrange_multiplier_mesh_pt->nelement();
910 (Lagrange_multiplier_mesh_pt->element_pt(
i));
915 el_pt->set_boundary_shape_geom_object_pt(Wall_geom_object_pt,
b);
924 if ((
nod_pt->is_on_boundary(2))||(
nod_pt->is_on_boundary(4)))
949template<
class ELEMENT>
954 unsigned n_element = Lagrange_multiplier_mesh_pt->nelement();
960 delete Lagrange_multiplier_mesh_pt->element_pt(
e);
964 Lagrange_multiplier_mesh_pt->flush_element_and_node_storage();
973template <
class ELEMENT>
980 error_stream <<
"Timestepper has to be from the BDF family!\n"
981 <<
"You have specified a timestepper from the "
990 unsigned num_nod = bulk_mesh_pt()->nnode();
995 x[0]=bulk_mesh_pt()->node_pt(
n)->x(0);
996 x[1]=bulk_mesh_pt()->node_pt(
n)->x(1);
999 bulk_mesh_pt()->node_pt(
n)->set_value(0,6.0*(
x[1]/Ly)*(1.0-(
x[1]/Ly)));
1000 bulk_mesh_pt()->node_pt(
n)->set_value(1,0.0);
1004 bulk_mesh_pt()->assign_initial_values_impulsive();
1005 wall_mesh_pt()->assign_initial_values_impulsive();
1087 problem.set_initial_condition();
Upgrade mesh to solid mesh.
ElasticCollapsibleChannelMesh(const unsigned &nup, const unsigned &ncollapsible, const unsigned &ndown, const unsigned &ny, const double &lup, const double &lcollapsible, const double &ldown, const double &ly, GeomObject *wall_pt, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Build mesh and copy Eulerian coords to Lagrangian ones so that the initial configuration...
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.
void create_lagrange_multiplier_elements()
Create elements that enforce prescribed boundary motion by Lagrange multipliers.
ElasticCollapsibleChannelMesh< ELEMENT > * bulk_mesh_pt()
Access function for the specific bulk (fluid) mesh.
SolidMesh * Lagrange_multiplier_mesh_pt
Pointers to mesh of Lagrange multiplier elements.
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)
ConstitutiveLaw * Constitutive_law_pt
Constitutive law used to determine the mesh deformation.
unsigned Ny
Number of elements across the channel.
unsigned Ndown
Number of elements in the x direction in the downstream part of the channel.
ElasticCollapsibleChannelMesh< ELEMENT > * Bulk_mesh_pt
Pointer to the "bulk" mesh.
double Lup
x-length in the upstream part of the channel
MeshAsGeomObject * Wall_geom_object_pt
Geometric object incarnation of the wall mesh.
MacroElementNodeUpdateCollapsibleChannelMesh< ELEMENT > * Bulk_mesh_pt
Pointer to the "bulk" mesh.
void delete_lagrange_multiplier_elements()
Delete elements that enforce prescribed boundary motion by Lagrange multipliers.
~FSICollapsibleChannelProblem()
Destructor (empty)
void actions_before_newton_convergence_check()
Update no slip before Newton convergence check.
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
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.
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 Nu
Pseudo-solid Poisson ratio.
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 Lambda_sq
Pseudo-solid mass density.
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.