pseudo_solid_collapsible_tube_work.cc File Reference
#include "generic.h"
#include "solid.h"
#include "constitutive.h"
#include "navier_stokes.h"
#include "multi_physics.h"
#include "meshes/simple_cubic_mesh.h"
#include "meshes/quarter_tube_mesh.h"

Classes

class  oomph::PseudoElasticBulkElement< ELEMENT >
 
class  oomph::FaceGeometry< PseudoElasticBulkElement< ELEMENT > >
 FaceGeometry of wrapped element is the same as the underlying element. More...
 
class  WallMesh< ELEMENT >
 
class  FluidMesh< ELEMENT >
 
class  PseudoElasticCollapsibleChannelProblem< FLUID_ELEMENT, SOLID_ELEMENT >
 

Namespaces

 oomph
 DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
 
 Global_Parameters
 Namespace for global parameters.
 

Typedefs

typedef PseudoElasticCollapsibleChannelProblem< RefineablePseudoSolidNodeUpdateElement< RefineableQTaylorHoodElement< 3 >, PseudoElasticBulkElement< RefineableQPVDElement< 3, 3 > > >, RefineableQPVDElement< 3, 3 > > PseudoElasticFSIProblem
 

Functions

void Global_Parameters::press_load (const Vector< double > &xi, const Vector< double > &x, const Vector< double > &N, Vector< double > &load)
 Load function for wall. More...
 
void set_pseudo_elastic_fsi_solver (PseudoElasticFSIProblem &problem, const unsigned &ps_prec_type)
 
int main (int argc, char *argv[])
 

Typedef Documentation

◆ PseudoElasticFSIProblem

Function Documentation

◆ main()

int main ( int argc  ,
char argv[] 
)

Demonstrate how to solve a 3D FSI problem with pseudo-solid node update for the fluid mesh.

1741 {
1742 
1743 #ifdef OOMPH_HAS_MPI
1744  MPI_Helpers::init(argc,argv,false);
1745 #endif
1746 
1747  // Store command line arguments
1748  CommandLineArgs::setup(argc,argv);
1749 
1750  // Create generalised Hookean constitutive equations
1753 
1756 
1757  //Set up the problem
1759 
1760  // Doc info
1761  DocInfo doc_info;
1762  doc_info.set_directory("RESLT");
1763 
1764  // Doc initial configuration
1765  problem.doc_solution(doc_info);
1766  oomph_info << "Before manual refine: doc_info.number()="
1767  << doc_info.number() << std::endl;
1768  doc_info.number()++;
1769 
1770  // Do manual non-uniform refinement
1771  if (CommandLineArgs::Argc!=1)
1772  {
1773  problem.adapt();
1774  }
1775 
1776  // Doc afterwards
1777  problem.doc_solution(doc_info);
1778  oomph_info << "After manual refine: doc_info.number()="
1779  << doc_info.number() << std::endl;
1780  doc_info.number()++;
1781 
1782  // Setup timestepping
1785  problem.initialise_dt(dt);
1786  problem.set_initial_condition();
1787 
1788  unsigned ps_prec_type = std::atoi(argv[3]);
1789 
1790  // set
1791  if (CommandLineArgs::Argc>2)
1792  {
1793  set_pseudo_elastic_fsi_solver(problem,ps_prec_type);
1794  }
1795 
1796  // Steady run
1797  problem.steady_run(doc_info);
1798 
1799  // Unteady run
1800  problem.unsteady_run(doc_info);
1801 
1802  // // clean up
1803  // if (CommandLineArgs::Argc>2)
1804  // {
1805  // IterativeLinearSolver* solver_pt = dynamic_cast<IterativeLinearSolver*>(problem.linear_solver_pt());
1806  // delete solver_pt->preconditioner_pt();
1807  // delete solver_pt;
1808  // }
1809 
1810 
1811 #ifdef OOMPH_HAS_MPI
1812  MPI_Helpers::finalize();
1813 #endif
1814 
1815 } // end_of_main
Definition: interaction/pseudo_solid_collapsible_tube/pseudo_solid_collapsible_tube.cc:436
Definition: oomph_utilities.h:499
void set_directory(const std::string &directory)
Definition: oomph_utilities.cc:298
unsigned & number()
Number used (e.g.) for labeling output files.
Definition: oomph_utilities.h:554
Definition: constitutive_laws.h:699
void setup(Time *time_pt)
Create all GeomObjects needed to define the cylinder and the flag.
Definition: turek_flag_non_fsi.cc:277
double Nu_pseudo_elastic
Definition: interaction/pseudo_solid_collapsible_tube/pseudo_solid_collapsible_tube.cc:376
ConstitutiveLaw * Constitutive_law_pseudo_elastic_pt
Pointer to constitutive law for the pseudo elastic node update elements.
Definition: interaction/pseudo_solid_collapsible_tube/pseudo_solid_collapsible_tube.cc:368
double Dt
Timestep.
Definition: interaction/pseudo_solid_collapsible_tube/pseudo_solid_collapsible_tube.cc:415
ConstitutiveLaw * Constitutive_law_wall_pt
Pointer to constitutive law for the wall.
Definition: interaction/pseudo_solid_collapsible_tube/pseudo_solid_collapsible_tube.cc:365
double Nu_wall
Definition: interaction/pseudo_solid_collapsible_tube/pseudo_solid_collapsible_tube.cc:372
unsigned Nstep_per_period
Number of steps per period.
Definition: interaction/pseudo_solid_collapsible_tube/pseudo_solid_collapsible_tube.cc:418
double T
Period of periodic variation in inflow pressure.
Definition: interaction/pseudo_solid_collapsible_tube/pseudo_solid_collapsible_tube.cc:412
int Argc
Number of arguments + 1.
Definition: oomph_utilities.cc:407
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
void set_pseudo_elastic_fsi_solver(PseudoElasticFSIProblem &problem, const unsigned &ps_prec_type)
Definition: pseudo_solid_collapsible_tube_work.cc:1604
Constructor for SteadyAxisymAdvectionDiffusion problem
Definition: steady_axisym_advection_diffusion.cc:213

References oomph::CommandLineArgs::Argc, Global_Parameters::Constitutive_law_pseudo_elastic_pt, Global_Parameters::Constitutive_law_wall_pt, Global_Parameters::Dt, Global_Parameters::Nstep_per_period, Global_Parameters::Nu_pseudo_elastic, Global_Parameters::Nu_wall, oomph::DocInfo::number(), oomph::oomph_info, problem, oomph::DocInfo::set_directory(), set_pseudo_elastic_fsi_solver(), Flag_definition::setup(), and Global_Parameters::T.

◆ set_pseudo_elastic_fsi_solver()

void set_pseudo_elastic_fsi_solver ( PseudoElasticFSIProblem problem,
const unsigned ps_prec_type 
)

helper method to return GMRES preconditioned with the pseudo-elastic FSI preconditioner. The unsigned ps_prec_type is a flag for the pseudo solid block preconditioner type. 0 - Exact 1 - Block diagonal 2 - Block upper triangular 3 - Block lower triangular

1606 {
1607 //setup the solver
1608 
1609 #ifdef OOMPH_HAS_TRILINOS
1610 
1611 TrilinosAztecOOSolver* solver_pt = new
1613 solver_pt->solver_type() = TrilinosAztecOOSolver::GMRES;
1614 
1615 #else
1616 
1618 
1619 #endif
1620 
1621  solver_pt->tolerance()=1e-8;
1622 
1623  // preconditioner
1624  PseudoElasticFSIPreconditioner* prec_pt = new
1626 
1627  // meshes
1628  prec_pt->set_fluid_and_pseudo_elastic_mesh_pt(problem.fluid_mesh_pt());
1629  prec_pt->set_solid_mesh_pt(problem.wall_mesh_pt());
1631  problem.lagrange_multiplier_mesh_pt());
1632 
1633  // inexact pseudo-solid preconditioning
1634  // 0 - Exact
1635  // 1 - Block diagonal
1636  // 2 - Block upper triangular
1637  // 3 - Block lower triangular
1638  if(ps_prec_type == 0)
1639  {
1641  = PseudoElasticPreconditioner::Exact_block_preconditioner;
1642  }
1643  else if(ps_prec_type == 1)
1644  {
1646  = PseudoElasticPreconditioner::Block_diagonal_preconditioner;
1647  }
1648  else if(ps_prec_type == 2)
1649  {
1651  = PseudoElasticPreconditioner::Block_upper_triangular_preconditioner;
1652  }
1653  else if(ps_prec_type == 3)
1654  {
1656  = PseudoElasticPreconditioner::Block_lower_triangular_preconditioner;
1657  }
1658  else
1659  {
1660  pause("I do not know what to do");
1661  }
1662 
1663 #ifdef OOMPH_HAS_HYPRE
1664 
1667  (Pseudo_Elastic_Preconditioner_Subsidiary_Operator_Helper
1668  ::get_elastic_preconditioner);
1669 
1670 #endif
1671 
1672 #ifdef OOMPH_HAS_TRILINOS
1673 
1676  (Pseudo_Elastic_Preconditioner_Subsidiary_Operator_Helper
1677  ::get_lagrange_multiplier_preconditioner);
1678 
1679 #endif
1680 
1681 
1682  // inexact "real" solid preconditioning
1685  prec_pt->set_solid_preconditioner(solid_prec_pt);
1686 
1687 
1688 #ifdef OOMPH_HAS_HYPRE
1689 
1691  (Real_Solid_Preconditioner_Helper::get_preconditioner);
1692 
1693 #endif
1694 
1695  // inexact navier stokes preconditioning
1697  ns_prec_pt = prec_pt->navier_stokes_schur_complement_preconditioner_pt();
1699 
1700  // ns momentum
1703 
1704 #ifdef OOMPH_HAS_HYPRE
1705 
1707  (LSC_Preconditioner_Helper::set_hypre_preconditioner);
1708 
1709 #endif
1710 
1711  ns_prec_pt->set_f_preconditioner(f_prec_pt);
1712 
1713 #ifdef OOMPH_HAS_HYPRE
1714 
1715  // ns pressure poisson
1716  HyprePreconditioner* p_prec_pt = new HyprePreconditioner;
1717  p_prec_pt->set_amg_iterations(2);
1718  p_prec_pt->amg_using_simple_smoothing();
1719  p_prec_pt->amg_simple_smoother() = 3;
1720  p_prec_pt->hypre_method() = HyprePreconditioner::BoomerAMG;
1721  p_prec_pt->amg_strength() = 0.25;
1722  // Use 6 for parallel (Falgout) or 3 (Ruge Stuben)or serial
1723  p_prec_pt->amg_coarsening() = 6;
1724  p_prec_pt->disable_doc_time();
1725  ns_prec_pt->set_p_preconditioner(p_prec_pt);
1726 
1727 #endif
1728 
1729  // hierher end
1730 
1731  // and pass prec to solver and solver to problem
1732  solver_pt->preconditioner_pt() = prec_pt;
1733  problem.linear_solver_pt() = solver_pt;
1734 }
Array< double, 1, 3 > e(1./3., 0.5, 2.)
Definition: general_purpose_block_preconditioners.h:321
Definition: general_purpose_block_preconditioners.h:459
The GMRES method.
Definition: iterative_linear_solver.h:1227
void set_subsidiary_preconditioner_function(SubsidiaryPreconditionerFctPt sub_prec_fn)
access function to set the subsidiary preconditioner function.
Definition: general_purpose_block_preconditioners.h:136
Definition: hypre_solver.h:826
unsigned & amg_simple_smoother()
Access function to AMG_simple_smoother flag.
Definition: hypre_solver.h:983
double & amg_strength()
Access function to AMG_strength.
Definition: hypre_solver.h:1038
void set_amg_iterations(const unsigned &amg_iterations)
Function to set the number of times to apply BoomerAMG.
Definition: hypre_solver.h:964
unsigned & hypre_method()
Access function to Hypre_method flag – specified via enumeration.
Definition: hypre_solver.h:945
void disable_doc_time()
Disable documentation of preconditioner timings.
Definition: hypre_solver.h:939
void amg_using_simple_smoothing()
Definition: hypre_solver.h:977
unsigned & amg_coarsening()
Access function to AMG_coarsening flag.
Definition: hypre_solver.h:1020
Preconditioner *& preconditioner_pt()
Access function to preconditioner.
Definition: iterative_linear_solver.h:95
double & tolerance()
Access to convergence tolerance.
Definition: iterative_linear_solver.h:107
Definition: navier_stokes_preconditioners.h:607
void set_p_preconditioner(Preconditioner *new_p_preconditioner_pt)
Function to set a new pressure matrix preconditioner (inexact solver)
Definition: navier_stokes_preconditioners.h:745
void set_f_preconditioner(Preconditioner *new_f_preconditioner_pt)
Function to set a new momentum matrix preconditioner (inexact solver)
Definition: navier_stokes_preconditioners.h:769
Definition: pseudo_elastic_fsi_preconditioner.h:62
void enable_navier_stokes_schur_complement_preconditioner()
Definition: pseudo_elastic_fsi_preconditioner.h:193
NavierStokesSchurComplementPreconditioner *const navier_stokes_schur_complement_preconditioner_pt()
Access function to the Navier Stokes Schur complement preconditioner.
Definition: pseudo_elastic_fsi_preconditioner.h:186
void set_fluid_and_pseudo_elastic_mesh_pt(Mesh *mesh_pt)
specify the mesh containing the combined fluid/pseudo solid elements
Definition: pseudo_elastic_fsi_preconditioner.h:150
void set_solid_preconditioner(Preconditioner *prec_pt)
Definition: pseudo_elastic_fsi_preconditioner.h:169
void set_lagrange_multiplier_mesh_pt(Mesh *mesh_pt)
specify the mesh containing the lagrange multiplier elements
Definition: pseudo_elastic_fsi_preconditioner.h:162
PseudoElasticPreconditioner *const pseudo_elastic_preconditioner_pt()
Access function to the pseudo elastic subsidiary preconditioner.
Definition: pseudo_elastic_fsi_preconditioner.h:180
void set_solid_mesh_pt(Mesh *mesh_pt)
specify the mesh containing the solid elements
Definition: pseudo_elastic_fsi_preconditioner.h:156
Elastic_preconditioner_type & elastic_preconditioner_type()
Definition: pseudo_elastic_preconditioner.h:229
void set_lagrange_multiplier_subsidiary_preconditioner(SubsidiaryPreconditionerFctPt prec_fn)
Definition: pseudo_elastic_preconditioner.h:206
void set_elastic_subsidiary_preconditioner(SubsidiaryPreconditionerFctPt prec_fn)
Definition: pseudo_elastic_preconditioner.h:216
Definition: trilinos_solver.h:267
unsigned & solver_type()
Access function to Solver_type.
Definition: trilinos_solver.h:442
void pause(std::string message)
Pause and display message.
Definition: oomph_utilities.cc:1265

References oomph::HyprePreconditioner::amg_coarsening(), oomph::HyprePreconditioner::amg_simple_smoother(), oomph::HyprePreconditioner::amg_strength(), oomph::HyprePreconditioner::amg_using_simple_smoothing(), oomph::HyprePreconditioner::disable_doc_time(), e(), oomph::PseudoElasticPreconditioner::elastic_preconditioner_type(), oomph::PseudoElasticFSIPreconditioner::enable_navier_stokes_schur_complement_preconditioner(), oomph::HyprePreconditioner::hypre_method(), oomph::PseudoElasticFSIPreconditioner::navier_stokes_schur_complement_preconditioner_pt(), oomph::pause(), oomph::IterativeLinearSolver::preconditioner_pt(), problem, oomph::PseudoElasticFSIPreconditioner::pseudo_elastic_preconditioner_pt(), oomph::HyprePreconditioner::set_amg_iterations(), oomph::PseudoElasticPreconditioner::set_elastic_subsidiary_preconditioner(), oomph::NavierStokesSchurComplementPreconditioner::set_f_preconditioner(), oomph::PseudoElasticFSIPreconditioner::set_fluid_and_pseudo_elastic_mesh_pt(), oomph::PseudoElasticFSIPreconditioner::set_lagrange_multiplier_mesh_pt(), oomph::PseudoElasticPreconditioner::set_lagrange_multiplier_subsidiary_preconditioner(), oomph::NavierStokesSchurComplementPreconditioner::set_p_preconditioner(), oomph::PseudoElasticFSIPreconditioner::set_solid_mesh_pt(), oomph::PseudoElasticFSIPreconditioner::set_solid_preconditioner(), oomph::GeneralPurposeBlockPreconditioner< MATRIX >::set_subsidiary_preconditioner_function(), oomph::TrilinosAztecOOSolver::solver_type(), and oomph::TrilinosAztecOOSolver::tolerance().

Referenced by main().