oomph::FSI_functions Namespace Reference

Namespace for "global" FSI functions. More...

Functions

void apply_no_slip_on_moving_wall (Node *node_pt)
 
template<class FLUID_ELEMENT , unsigned DIM_FLUID>
void setup_fluid_load_info_for_solid_elements (Problem *problem_pt, Vector< unsigned > &boundary_in_fluid_mesh, Mesh *const &fluid_mesh_pt, Vector< Mesh * > &solid_mesh_pt, const unsigned &face=0)
 
template<class FLUID_ELEMENT , unsigned DIM_FLUID>
void setup_fluid_load_info_for_solid_elements (Problem *problem_pt, const unsigned &boundary_in_fluid_mesh, Mesh *const &fluid_mesh_pt, Mesh *const &solid_mesh_pt, const unsigned &face=0)
 
template<class SOLID_ELEMENT , unsigned DIM_SOLID>
void setup_solid_elements_for_displacement_bc (Problem *problem_pt, const Vector< unsigned > &b_solid_fsi, Mesh *const &solid_mesh_pt, Vector< Mesh * > &lagrange_multiplier_mesh_pt)
 
template<class SOLID_ELEMENT , unsigned DIM_SOLID>
void setup_solid_elements_for_displacement_bc (Problem *problem_pt, const unsigned &b_solid_fsi, Mesh *const &solid_mesh_pt, Mesh *const &lagrange_multiplier_mesh_pt)
 
template<class NODE >
void doc_fsi (Mesh *fluid_mesh_pt, SolidMesh *wall_mesh_pt, DocInfo &doc_info)
 

Variables

double Strouhal_for_no_slip = 1.0
 

Detailed Description

Namespace for "global" FSI functions.

///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////

Function Documentation

◆ apply_no_slip_on_moving_wall()

void oomph::FSI_functions::apply_no_slip_on_moving_wall ( Node node_pt)

Apply no-slip condition for N.St. on a moving wall node u = St dR/dt, where the Strouhal number St = a/(UT) is defined by FSI_functions::Strouhal_for_no_slip and is initialised to 1.0. Note: This requires the x,y,[z] velocity components to be stored in nodal values 0,1,[2]. This is the default for all currently existing Navier-Stokes elements. If you use any others, use this function at your own risk.

Apply no-slip condition for N.St. on a moving wall node, u = St dR/dt, where the Strouhal number St = a/(UT) is defined by FSI_functions::Strouhal_for_no_slip and is initialised to 1.0. Note: This requires the x,y,[z] velocity components to be stored in nodal values 0,1,[2]. This is the default for all currently existing Navier-Stokes elements. If you use any others, use this function at your own risk.

49  {
50  // Find out spatial dimension of node
51  unsigned ndim = node_pt->ndim();
52  // Assign velocity
53  for (unsigned i = 0; i < ndim; i++)
54  {
55  node_pt->set_value(i,
56  Strouhal_for_no_slip * (node_pt->dposition_dt(i)));
57  }
58  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
double Strouhal_for_no_slip
Definition: fsi.cc:39

References oomph::Node::dposition_dt(), i, oomph::Node::ndim(), oomph::Data::set_value(), and Strouhal_for_no_slip.

Referenced by FSIChannelWithLeafletProblem< ELEMENT >::actions_after_adapt(), FSICollapsibleChannelProblem< ELEMENT >::actions_after_adapt(), FSIRingProblem::actions_after_adapt(), OscRingNStProblem< ELEMENT >::actions_after_adapt(), PseudoElasticCollapsibleChannelProblem< FLUID_ELEMENT, SOLID_ELEMENT >::actions_after_adapt(), TurekProblem< FLUID_ELEMENT, SOLID_ELEMENT >::actions_after_adapt(), FSIChannelWithLeafletProblem< ELEMENT >::actions_after_distribute(), FSIRingProblem::actions_after_distribute(), PseudoElasticCollapsibleChannelProblem< FLUID_ELEMENT, SOLID_ELEMENT >::actions_after_distribute(), TurekProblem< FLUID_ELEMENT, SOLID_ELEMENT >::actions_after_distribute(), ChannelWithLeafletProblem< ELEMENT >::actions_before_implicit_timestep(), CollapsibleChannelProblem< ELEMENT >::actions_before_implicit_timestep(), FlowAroundCylinderProblem< ELEMENT >::actions_before_implicit_timestep(), OscEllipseProblem< ELEMENT, TIMESTEPPER >::actions_before_implicit_timestep(), OscRingNStProblem< ELEMENT >::actions_before_implicit_timestep(), TurekNonFSIProblem< ELEMENT >::actions_before_implicit_timestep(), FSICollapsibleChannelProblem< ELEMENT >::actions_before_newton_convergence_check(), UnstructuredFSIProblem< FLUID_ELEMENT, SOLID_ELEMENT >::actions_before_newton_convergence_check(), CollapsibleChannelProblem< ELEMENT >::actions_before_newton_convergence_check(), UnstructuredImmersedEllipseProblem< ELEMENT >::complete_problem_setup(), UnstructuredFluidProblem< ELEMENT >::complete_problem_setup(), OscRingNStProblem< ELEMENT >::finish_problem_setup(), FSIChannelWithLeafletProblem< ELEMENT >::FSIChannelWithLeafletProblem(), FSICollapsibleChannelProblem< ELEMENT >::FSICollapsibleChannelProblem(), FSIDrivenCavityProblem< ELEMENT >::FSIDrivenCavityProblem(), FSIRingProblem::FSIRingProblem(), TurekProblem< FLUID_ELEMENT, SOLID_ELEMENT >::generic_actions_after(), OscRingNStProblem< ELEMENT >::OscRingNStProblem(), PseudoElasticCollapsibleChannelProblem< FLUID_ELEMENT, SOLID_ELEMENT >::PseudoElasticCollapsibleChannelProblem(), TurekProblem< FLUID_ELEMENT, SOLID_ELEMENT >::TurekProblem(), and UnstructuredFSIProblem< FLUID_ELEMENT, SOLID_ELEMENT >::UnstructuredFSIProblem().

◆ doc_fsi()

template<class NODE >
void oomph::FSI_functions::doc_fsi ( Mesh fluid_mesh_pt,
SolidMesh wall_mesh_pt,
DocInfo doc_info 
)

Doc FSI:

  1. Which Data values affect the traction onto the FSIWallElements and what type of Data is it stored in ([fluid-]nodes, internal Data [in fluid elements] or SolidNodes?
  2. Which SolidNodes affect the node update of the fluid nodes?

Output is in tecplot readable form: Use fs1.mcr and fsi2.mcr (or straightforward modifications thereof), stored in doc/interaction/fsi_collapsible_channel/nondist_figures to process.

Pass pointer to fluid and solid meshes and pointer to the DocInfo object that specifies the directory and the overall step number. Template parameter specifies the type of node that is used to implement the node update strategy.

727  {
728  std::ofstream some_file;
729  std::ostringstream filename;
730 
731  // Number of plot points
732  unsigned npts;
733  npts = 5;
734 
735  // Part 1: Doc which dofs affect the fluid traction on solid
736  //==========================================================
737 
738  // Tecplot helpers
739  Vector<std::string> label(3);
740  label[0] = "X=";
741  label[1] = "Y=";
742  label[2] = "Z=";
743 
744  // Output fluid solution/mesh
745  //---------------------------
746  filename << doc_info.directory() << "/fsi_doc_fluid_mesh"
747  << doc_info.number() << ".dat";
748  some_file.open(filename.str().c_str());
749  fluid_mesh_pt->output(some_file, npts);
750  some_file.close();
751 
752 
753  // Setup map that links the positional Data of SolidNodes with
754  //------------------------------------------------------------
755  // the nodes
756  //----------
757  std::map<Data*, Node*> solid_node_pt;
758  unsigned nnod = wall_mesh_pt->nnode();
759  for (unsigned j = 0; j < nnod; j++)
760  {
761  solid_node_pt[wall_mesh_pt->node_pt(j)->variable_position_pt()] =
762  wall_mesh_pt->node_pt(j);
763  }
764 
765 
766  // Setup map that links the internal (pressure) Data of fluid elements
767  // with
768  //-------------------------------------------------------------------------
769  // those fluid elements
770  //---------------------
771  std::map<Data*, FiniteElement*> internal_data_element_pt;
772  unsigned nelemf = fluid_mesh_pt->nelement();
773  for (unsigned e = 0; e < nelemf; e++)
774  {
775  unsigned ninternal = fluid_mesh_pt->element_pt(e)->ninternal_data();
776  for (unsigned k = 0; k < ninternal; k++)
777  {
778  internal_data_element_pt[fluid_mesh_pt->element_pt(e)
779  ->internal_data_pt(k)] =
780  fluid_mesh_pt->finite_element_pt(e);
781  }
782  }
783 
784 
785 #ifdef OOMPH_HAS_MPI
786  // External halo elements must also be included in this check
787  std::set<int> procs = fluid_mesh_pt->external_halo_proc();
788  for (std::set<int>::iterator it = procs.begin(); it != procs.end(); it++)
789  {
790  unsigned d = unsigned((*it));
791  unsigned n_ext_halo_f = fluid_mesh_pt->nexternal_halo_element(d);
792  for (unsigned e = 0; e < n_ext_halo_f; e++)
793  {
794  unsigned ninternal =
795  fluid_mesh_pt->external_halo_element_pt(d, e)->ninternal_data();
796  for (unsigned k = 0; k < ninternal; k++)
797  {
798  internal_data_element_pt[fluid_mesh_pt
799  ->external_halo_element_pt(d, e)
800  ->internal_data_pt(k)] =
801  dynamic_cast<FiniteElement*>(
802  fluid_mesh_pt->external_halo_element_pt(d, e));
803  }
804  }
805  }
806 #endif
807 
808 
809  // Loop over all wall elements
810  //----------------------------
811  unsigned nelem = wall_mesh_pt->nelement();
812  for (unsigned e = 0; e < nelem; e++)
813  {
814  // Reset the string contents to be empty
815  filename.str("");
816  // Set the new filename
817  filename << doc_info.directory() << "/fsi_doc_wall_element"
818  << doc_info.number() << "-" << e << ".dat";
819  some_file.open(filename.str().c_str());
820 
821  // Get pointer to wall element
822  FSIWallElement* el_pt =
823  dynamic_cast<FSIWallElement*>(wall_mesh_pt->finite_element_pt(e));
824 
825 #ifdef OOMPH_HAS_MPI
826  // If it's a halo element then it will not have set an adjacent
827  // fluid element so there's no point trying to output it!
828  if (!el_pt->is_halo())
829  {
830 #endif
831 
832  // Storage for local and global coords
833  unsigned ndim_local = el_pt->dim();
834  Vector<double> s(ndim_local);
835  unsigned ndim_eulerian = el_pt->nodal_dimension();
836  Vector<double> x(ndim_eulerian);
837 
838 
839  // Map to indicate if the internal Data for a given
840  // fluid element has been plotted already
841  std::map<FiniteElement*, bool> element_internal_data_has_been_plotted;
842 
843  // Loop over Gauss points and doc their position
844  //-----------------------------------------------
845  unsigned nint = el_pt->integral_pt()->nweight();
846  some_file << "ZONE I=" << nint << std::endl;
847  for (unsigned i = 0; i < nint; i++)
848  {
849  for (unsigned j = 0; j < ndim_local; j++)
850  {
851  s[j] = el_pt->integral_pt()->knot(i, j);
852  }
853  el_pt->interpolated_x(s, x);
854  for (unsigned j = 0; j < ndim_eulerian; j++)
855  {
856  some_file << x[j] << " ";
857  }
858  some_file << i << std::endl;
859  }
860 
861 
862  // Loop over Gauss points again to find corresponding points in fluid
863  //--------------------------------------------------------------------
864  // elements
865  //---------
866 
867  // Loop over front and back if required: Get number of fluid-loaded
868  // faces
869  unsigned n_loaded_face = 2;
870  if (el_pt->only_front_is_loaded_by_fluid()) n_loaded_face = 1;
871 
872  for (unsigned face = 0; face < n_loaded_face; face++)
873  {
874  some_file << "ZONE I=" << nint << std::endl;
875  for (unsigned i = 0; i < nint; i++)
876  {
877  // Get corresponding fluid element
878  FSIFluidElement* fluid_el_pt = dynamic_cast<FSIFluidElement*>(
879  el_pt->external_element_pt(face, i));
880 
881  // Get local coordinates in fluid element by copy operation
882  Vector<double> s_fluid(
883  el_pt->external_element_local_coord(face, i));
884 
885  // Get Eulerian position in fluid element
886  fluid_el_pt->interpolated_x(s_fluid, x);
887  for (unsigned j = 0; j < ndim_eulerian; j++)
888  {
889  some_file << x[j] << " ";
890  }
891  some_file << i << std::endl;
892  }
893  }
894 
895 
896  // Get the multiplicity of data that affects the load on this wall
897  // element
898  //------------------------------------------------------------------------
899  std::map<Data*, unsigned> data_count;
900  std::map<FiniteElement*, unsigned> internal_data_count;
901  {
902  Vector<Data*> external_interaction_field_data_pt(
903  el_pt->external_interaction_field_data_pt());
904  unsigned nexternal_interaction_field =
905  external_interaction_field_data_pt.size();
906  for (unsigned l = 0; l < nexternal_interaction_field; l++)
907  {
908  data_count[external_interaction_field_data_pt[l]]++;
909  if (internal_data_element_pt
910  [external_interaction_field_data_pt[l]] != 0)
911  {
912  internal_data_count
913  [internal_data_element_pt
914  [external_interaction_field_data_pt[l]]]++;
915  }
916  }
917  }
918 
919  {
920  Vector<Data*> external_interaction_geometric_data_pt(
921  el_pt->external_interaction_geometric_data_pt());
922  unsigned nexternal_interaction_geom =
923  external_interaction_geometric_data_pt.size();
924  for (unsigned l = 0; l < nexternal_interaction_geom; l++)
925  {
926  data_count[external_interaction_geometric_data_pt[l]]++;
927  if (internal_data_element_pt
928  [external_interaction_geometric_data_pt[l]] != 0)
929  {
930  internal_data_count
931  [internal_data_element_pt
932  [external_interaction_geometric_data_pt[l]]]++;
933  }
934  }
935  }
936 
937  // Loop over unique data entries
938  //------------------------------
939  for (std::map<Data*, unsigned>::iterator it = data_count.begin();
940  it != data_count.end();
941  it++)
942  {
943  Data* unique_data_pt = it->first;
944 
945  // Try to cast to a Node
946  //----------------------
947  Node* node_pt = dynamic_cast<Node*>(unique_data_pt);
948  if (node_pt == 0)
949  {
950  // Is it a solid node? NOTE: This query makes sense as we're
951  //----------------------------------------------------------
952  // checking for the SolidNode's *positional* Data, not for
953  //--------------------------------------------------------
954  // the SolidNode itself!
955  //----------------------
956  if (solid_node_pt[unique_data_pt] != 0)
957  {
958  some_file << "TEXT ";
959  for (unsigned j = 0; j < ndim_eulerian; j++)
960  {
961  some_file << label[j] << solid_node_pt[unique_data_pt]->x(j)
962  << " ";
963  }
964 
965  some_file << "CS=GRID, HU=FRAME, H=2.5, AN=MIDCENTER, C=GREEN "
966  << "T=\"" << it->second << "\"" << std::endl;
967  }
968 
969  // Is it internal (pressure) Data in a fluid element?
970  //---------------------------------------------------
971  else if (internal_data_element_pt[unique_data_pt] != 0)
972  {
973  if (!element_internal_data_has_been_plotted
974  [internal_data_element_pt[unique_data_pt]])
975  {
976  some_file << "TEXT ";
977  // Pointer to fluid element that contains this internal data
978  FiniteElement* fluid_el_pt =
979  internal_data_element_pt[unique_data_pt];
980 
981  // Get the plot coordinates in this element: centre + a bit of
982  // offset
983  double s_max = fluid_el_pt->s_max();
984  double s_min = fluid_el_pt->s_min();
985  Vector<double> s_fluid(ndim_eulerian);
986  Vector<double> x_fluid(ndim_eulerian);
987  for (unsigned k = 0; k < ndim_eulerian; k++)
988  {
989  s_fluid[k] = 0.5 * (s_max + s_min) + 0.1 * (s_max - s_min);
990  }
991  fluid_el_pt->interpolated_x(s_fluid, x_fluid);
992  for (unsigned j = 0; j < ndim_eulerian; j++)
993  {
994  some_file << label[j] << x_fluid[j] << " ";
995  }
996 
997  some_file << "CS=GRID, HU=FRAME, H=2.5, AN=MIDCENTER, C=BLUE "
998  << "T=\"" << it->second
999  << "\""
1000  // internal_data_count[fluid_el_pt]
1001  << std::endl;
1002 
1003  // Now we have plotted it....
1004  element_internal_data_has_been_plotted
1005  [internal_data_element_pt[unique_data_pt]] = true;
1006  }
1007  }
1008  else
1009  {
1010  std::ostringstream error_message;
1011  error_message
1012  << "Data that affects the load on an FSIWallElement\n"
1013  << "is neither a (fluid) Node, nor a SolidNode nor\n"
1014  << "internal Data in a (fluid) element\n"
1015  << "I don't think this should happen..." << std::endl;
1016  throw OomphLibError(error_message.str(),
1019  }
1020  }
1021  // It must be a node then
1022  //-----------------------
1023  else
1024  {
1025  some_file << "TEXT ";
1026  for (unsigned j = 0; j < ndim_eulerian; j++)
1027  {
1028  some_file << label[j] << node_pt->x(j) << ", ";
1029  }
1030  some_file << "CS=GRID, HU=FRAME, H=2.5, AN=MIDCENTER, C=RED "
1031  << "T=\"" << it->second << "\"" << std::endl;
1032  }
1033  }
1034 
1035 #ifdef OOMPH_HAS_MPI
1036  } // end is_halo()
1037 #endif
1038  some_file.close();
1039  }
1040 
1041  // Part 2: Doc which dofs affect the node update functions
1042  //========================================================
1043 
1044 
1045  // Counter for the number of nodes that are actually
1046  // affected by wall motion
1047  unsigned count = 0;
1048 
1049  // Loop over nodes in fluid mesh
1050  unsigned nnode_fluid = fluid_mesh_pt->nnode();
1051  for (unsigned j = 0; j < nnode_fluid; j++)
1052  {
1053  // Upcast node to appropriate type
1054  NODE* node_pt = dynamic_cast<NODE*>(fluid_mesh_pt->node_pt(j));
1055 
1056  unsigned ndim_eulerian = node_pt->ndim();
1057 
1058  // Cleart the filename
1059  filename.str("");
1060  filename << doc_info.directory() << "/fsi_doc_fluid_element"
1061  << doc_info.number() << "-" << count << ".dat";
1062  some_file.open(filename.str().c_str());
1063  some_file << "ZONE" << std::endl;
1064  for (unsigned i = 0; i < ndim_eulerian; i++)
1065  {
1066  some_file << node_pt->x(i) << " ";
1067  }
1068  some_file << std::endl;
1069 
1070  // Extract geom objects that affect the nodal position
1071  Vector<GeomObject*> geom_obj_pt(node_pt->vector_geom_object_pt());
1072 
1073 
1074  // Get the multiplicity of data that affects this node
1075  //----------------------------------------------------
1076  std::map<Data*, unsigned> data_count;
1077  unsigned ngeom = geom_obj_pt.size();
1078  for (unsigned i = 0; i < ngeom; i++)
1079  {
1080  unsigned ngeom_dat = geom_obj_pt[i]->ngeom_data();
1081  for (unsigned k = 0; k < ngeom_dat; k++)
1082  {
1083  data_count[geom_obj_pt[i]->geom_data_pt(k)]++;
1084  }
1085  }
1086 
1087  // Haven't actually doced any dependcies for this node
1088  bool written_something = false;
1089 
1090  // Loop over unique data entries
1091  //------------------------------
1092  for (std::map<Data*, unsigned>::iterator it = data_count.begin();
1093  it != data_count.end();
1094  it++)
1095  {
1096  Data* unique_data_pt = it->first;
1097 
1098  // Is it a solid node?
1099  if (solid_node_pt[unique_data_pt] != 0)
1100  {
1101  some_file << "TEXT ";
1102  for (unsigned j = 0; j < ndim_eulerian; j++)
1103  {
1104  some_file << label[j] << solid_node_pt[unique_data_pt]->x(j)
1105  << " ";
1106  }
1107 
1108  some_file << "CS=GRID, HU=FRAME, H=2.5, AN=MIDCENTER, C=GREEN "
1109  << "T=\"" << unique_data_pt->nvalue() << "\""
1110  << std::endl;
1111 
1112  // We've actually produced some output
1113  written_something = true;
1114  }
1115  // It's not a solid node --> ??
1116  else
1117  {
1118  std::ostringstream warn_message;
1119  warn_message
1120  << "Info: Position of a fluid node is affected by Data that"
1121  << "is not a SolidNode --> Can't plot this Data. \n\n"
1122  << "(You may also want to check if this is exepcted or likely "
1123  "to\n"
1124  << "indicate a bug in your code...)" << std::endl;
1125  throw OomphLibWarning(warn_message.str(),
1126  "FSI_functions::doc_fsi()",
1128  }
1129  }
1130 
1131 
1132  some_file.close();
1133 
1134  // If we've written something for the last node, bump up
1135  // counter for file so we don't overwrite
1136  if (written_something) count++;
1137  }
1138 
1139  } // end_of_doc_fsi
Array< double, 1, 3 > e(1./3., 0.5, 2.)
RealScalar s
Definition: level1_cplx_impl.h:130
char char char int int * k
Definition: level2_impl.h:374
string filename
Definition: MergeRestartFiles.py:39
label
Definition: UniformPSDSelfTest.py:24
list x
Definition: plotDoE.py:28
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References oomph::FiniteElement::dim(), oomph::DocInfo::directory(), e(), oomph::Mesh::element_pt(), oomph::ElementWithExternalElement::external_element_local_coord(), oomph::ElementWithExternalElement::external_element_pt(), oomph::ElementWithExternalElement::external_interaction_field_data_pt(), oomph::ElementWithExternalElement::external_interaction_geometric_data_pt(), MergeRestartFiles::filename, oomph::Mesh::finite_element_pt(), i, oomph::FiniteElement::integral_pt(), oomph::GeneralisedElement::internal_data_pt(), oomph::FiniteElement::interpolated_x(), j, k, oomph::Integral::knot(), UniformPSDSelfTest::label, oomph::Node::ndim(), oomph::Mesh::nelement(), oomph::GeneralisedElement::ninternal_data(), oomph::Mesh::nnode(), oomph::FiniteElement::nodal_dimension(), oomph::Mesh::node_pt(), oomph::SolidMesh::node_pt(), oomph::DocInfo::number(), oomph::Data::nvalue(), oomph::Integral::nweight(), oomph::FSIWallElement::only_front_is_loaded_by_fluid(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::Mesh::output(), s, oomph::FiniteElement::s_max(), oomph::FiniteElement::s_min(), oomph::SolidNode::variable_position_pt(), plotDoE::x, and oomph::Node::x().

◆ setup_fluid_load_info_for_solid_elements() [1/2]

template<class FLUID_ELEMENT , unsigned DIM_FLUID>
void oomph::FSI_functions::setup_fluid_load_info_for_solid_elements ( Problem problem_pt,
const unsigned boundary_in_fluid_mesh,
Mesh *const &  fluid_mesh_pt,
Mesh *const &  solid_mesh_pt,
const unsigned face = 0 
)

Set up the information that the FSIWallElements in the specified solid mesh require to obtain the fluid loading from the adjacent fluid elements in the specified fluid mesh. The parameter b specifies the boundary in the fluid mesh that is adjacent to the solid mesh. The template parameters specify the type of the fluid element and their spatial dimension. The optional final argument, face, identifies the face of the FSIWallElements that is exposed to the fluid. face defaults to 0, indicating that the front is loaded along the specified fluid mesh boundary. Set it to 1 to set up the FSI lookup schemes for fluid loading along the "back" of the FSIWallElements. This routine uses the procedures in the Multi_domain_functions namespace to set up the interaction by locating the adjacent (source) elements for each integration point of each solid element

638  {
639  // Thin wrapper to multi-domain function
642  DIM_FLUID>(
643  problem_pt, boundary_in_fluid_mesh, fluid_mesh_pt, solid_mesh_pt, face);
644  }
#define FLUID_ELEMENT
void setup_bulk_elements_adjacent_to_face_mesh(Problem *problem_pt, Vector< unsigned > &boundary_in_bulk_mesh, Mesh *const &bulk_mesh_pt, Vector< Mesh * > &face_mesh_pt, const unsigned &interaction=0)
/ Templated helper functions for multi-domain methods using locate_zeta
Definition: multi_domain.template.cc:72

References FLUID_ELEMENT, and oomph::Multi_domain_functions::setup_bulk_elements_adjacent_to_face_mesh().

◆ setup_fluid_load_info_for_solid_elements() [2/2]

template<class FLUID_ELEMENT , unsigned DIM_FLUID>
void oomph::FSI_functions::setup_fluid_load_info_for_solid_elements ( Problem problem_pt,
Vector< unsigned > &  boundary_in_fluid_mesh,
Mesh *const &  fluid_mesh_pt,
Vector< Mesh * > &  solid_mesh_pt,
const unsigned face = 0 
)

Set up the information that the FSIWallElements in the specified solid mesh require to obtain the fluid loading from the adjacent fluid elements in the specified fluid mesh. The parameter b specifies the boundary in the fluid mesh that is adjacent to the solid mesh. The template parameters specify the type of the fluid element and their spatial dimension. The optional final argument, face, identifies the face of the FSIWallElements that is exposed to the fluid. face defaults to 0, indicating that the front is loaded along the specified fluid mesh boundary. Set it to 1 to set up the FSI lookup schemes for fluid loading along the "back" of the FSIWallElements. This routine uses the procedures in the Multi_domain_functions namespace to set up the interaction by locating the adjacent (source) elements for each integration point of each solid element

This is the vector based version it works simultaneously on fluid fsi boundaries identified in the vector boundary_in_fluid_mesh and the corresponding solid meshes in solid_mesh_pt.

607  {
608  // Thin wrapper to multi-domain function
611  DIM_FLUID>(
612  problem_pt, boundary_in_fluid_mesh, fluid_mesh_pt, solid_mesh_pt, face);
613  }

References FLUID_ELEMENT, and oomph::Multi_domain_functions::setup_bulk_elements_adjacent_to_face_mesh().

◆ setup_solid_elements_for_displacement_bc() [1/2]

template<class SOLID_ELEMENT , unsigned DIM_SOLID>
void oomph::FSI_functions::setup_solid_elements_for_displacement_bc ( Problem problem_pt,
const unsigned b_solid_fsi,
Mesh *const &  solid_mesh_pt,
Mesh *const &  lagrange_multiplier_mesh_pt 
)

Setup multi-domain interaction required for imposition of solid displacements onto the pseudo-solid fluid mesh by Lagrange multipliers: This function locates the bulk solid elements next to boundary b_solid_fsi (the FSI boundary) in the solid mesh pointed to by Solid_mesh_pt. The deformation of these elements drives the deformation of the pseudo-solid fluid mesh via the Lagrange multiplier elements stored in l lagrange_multiplier_mesh_pt. The template parameters specify the type of the bulk solid elements and their spatial dimension.

697  {
698  // Thin wrapper to multi-domain function
700  SOLID_ELEMENT,
701  DIM_SOLID>(
702  problem_pt, b_solid_fsi, solid_mesh_pt, lagrange_multiplier_mesh_pt, 0);
703  }

References oomph::Multi_domain_functions::setup_bulk_elements_adjacent_to_face_mesh().

◆ setup_solid_elements_for_displacement_bc() [2/2]

template<class SOLID_ELEMENT , unsigned DIM_SOLID>
void oomph::FSI_functions::setup_solid_elements_for_displacement_bc ( Problem problem_pt,
const Vector< unsigned > &  b_solid_fsi,
Mesh *const &  solid_mesh_pt,
Vector< Mesh * > &  lagrange_multiplier_mesh_pt 
)

Setup multi-domain interaction required for imposition of solid displacements onto the pseudo-solid fluid mesh by Lagrange multipliers: This function locates the bulk solid elements next to boundary b_solid_fsi (the FSI boundary) in the solid mesh pointed to by Solid_mesh_pt. The deformation of these elements drives the deformation of the pseudo-solid fluid mesh via the Lagrange multiplier elements stored in lagrange_multiplier_mesh_pt. The template parameters specify the type of the bulk solid elements and their spatial dimension.

This is the vector based version it works simultaneously on solid fsi boundaries identified in the vector b_solid_fsi and the corresponding Lagrange multiplier meshes in lagrange_multiplier_mesh_pt.

670  {
671  // Thin wrapper to multi-domain function
673  SOLID_ELEMENT,
674  DIM_SOLID>(
675  problem_pt, b_solid_fsi, solid_mesh_pt, lagrange_multiplier_mesh_pt, 0);
676  }

References oomph::Multi_domain_functions::setup_bulk_elements_adjacent_to_face_mesh().

Variable Documentation

◆ Strouhal_for_no_slip

double oomph::FSI_functions::Strouhal_for_no_slip = 1.0

Strouhal number St = a/(UT) for application of no slip condition. Initialised to 1.0.

Referenced by apply_no_slip_on_moving_wall(), TurekProblem< FLUID_ELEMENT, SOLID_ELEMENT >::TurekProblem(), and FlowAroundCylinderProblem< ELEMENT >::unsteady_simulation().