one_d_womersley.cc File Reference
#include <cstring>
#include "generic.h"
#include "navier_stokes.h"
#include "meshes/collapsible_channel_mesh.h"
#include "womersley.h"
#include "multi_physics.h"

Classes

class  OscillatingWall
 
class  CollapsibleChannelProblem< ELEMENT >
 Problem class. More...
 

Namespaces

 BL_Squash
 
 Global_Physical_Variables
 Global variables.
 

Functions

double BL_Squash::squash_fct (const double &s)
 
void Global_Physical_Variables::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. More...
 
int main (int argc, char *argv[])
 

Function Documentation

◆ main()

int main ( int argc  ,
char argv[] 
)

Driver code for an unsteady adaptive collapsible channel problem with prescribed wall motion. Presence of command line arguments indicates validation run with coarse resolution and small number of timesteps.

1521 {
1522  // Store command line arguments
1523  CommandLineArgs::setup(argc,argv);
1524 
1525  //Uncomment for parallel stuff
1526  /*#ifdef OOMPH_HAS_MPI
1527  // Initialise MPI
1528  MPI_Helpers::init(argc,argv);
1529 
1530  // Swtich off output modifier
1531  oomph_info.output_modifier_pt() = &default_output_modifier;
1532 
1533  // switch off oomph_info output for all processors but rank 0
1534  if (MPI_Helpers::My_rank!=0)
1535  {
1536  oomph_info.stream_pt() = &oomph_nullstream;
1537  OomphLibWarning::set_stream_pt(&oomph_nullstream);
1538  OomphLibError::set_stream_pt(&oomph_nullstream);
1539  }
1540  else
1541  {
1542  oomph_info << "\n\n=====================================================\n";
1543  oomph_info << "Number of processors: "
1544  << MPI_Helpers::Nproc << "\n";
1545  }
1546  #endif */
1547 
1548  // Set default values
1549  string directory_for_data = "RESLT";
1550  unsigned outflow = 0;
1552  unsigned solver=1;
1553  unsigned p_solver=2;
1554  unsigned f_solver=2;
1555  unsigned refinement=0;
1556  unsigned nsteps=200;
1557  double amplitude=1.0e-2;
1558  double period=0.45;
1559  bool validation_run=false;
1560 
1561  //Set Trilinos default value
1562 #ifdef OOMPH_HAS_TRILINOS
1563  unsigned f_ml_settings=1;
1564 #endif
1565 
1566  // Set Hypre default values
1567 #ifdef OOMPH_HAS_HYPRE
1568  unsigned f_bamg_smoother=1;
1569  double f_bamg_damping=1.0;
1570  double f_bamg_strength=0.25;
1571 #endif
1572 
1573 
1574 
1575  // Parse command line
1576  int arg_index = 0;
1577  unsigned print_help = 0;
1578 
1579  while (arg_index < argc)
1580  {
1581  if ( strcmp(argv[arg_index], "-dir") == 0 )
1582  {
1583  arg_index++;
1584  string directory_number = argv[arg_index++];
1585  directory_for_data += directory_number;
1586  }
1587  else if ( strcmp(argv[arg_index], "-outflow") == 0 )
1588  {
1589  arg_index++;
1590  outflow = atoi(argv[arg_index++]);
1591  }
1592  else if ( strcmp(argv[arg_index], "-Re") == 0 )
1593  {
1594  arg_index++;
1595  Global_Physical_Variables::Re = atof(argv[arg_index++]);
1596  }
1597  else if ( strcmp(argv[arg_index], "-solver") == 0 )
1598  {
1599  arg_index++;
1600  solver = atoi(argv[arg_index++]);
1601  }
1602  else if ( strcmp(argv[arg_index], "-p_solver") == 0 )
1603  {
1604  arg_index++;
1605  p_solver = atoi(argv[arg_index++]);
1606  }
1607  else if ( strcmp(argv[arg_index], "-f_solver") == 0 )
1608  {
1609  arg_index++;
1610  f_solver = atoi(argv[arg_index++]);
1611  }
1612 #ifdef OOMPH_HAS_HYPRE
1613  else if ( strcmp(argv[arg_index], "-f_bamg_smoother") == 0 )
1614  {
1615  arg_index++;
1616  f_bamg_smoother = atoi(argv[arg_index++]);
1617  }
1618  else if ( strcmp(argv[arg_index], "-f_bamg_damping") == 0 )
1619  {
1620  arg_index++;
1621  f_bamg_damping = atof(argv[arg_index++]);
1622  }
1623  else if ( strcmp(argv[arg_index], "-f_bamg_strength") == 0 )
1624  {
1625  arg_index++;
1626  f_bamg_strength = atof(argv[arg_index++]);
1627  }
1628 #endif
1629 #ifdef OOMPH_HAS_TRILINOS
1630  else if ( strcmp(argv[arg_index], "-f_ml_settings") == 0 )
1631  {
1632  arg_index++;
1633  f_ml_settings = atoi(argv[arg_index++]);
1634  }
1635 #endif
1636  else if ( strcmp(argv[arg_index], "-refine") == 0 )
1637  {
1638  arg_index++;
1639  refinement = atoi(argv[arg_index++]);
1640  }
1641  else if ( strcmp(argv[arg_index], "-amplitude") == 0 )
1642  {
1643  arg_index++;
1644  amplitude = atof(argv[arg_index++]);
1645  }
1646  else if ( strcmp(argv[arg_index], "-nsteps") == 0 )
1647  {
1648  arg_index++;
1649  nsteps = atoi(argv[arg_index++]);
1650  }
1651  else if ( strcmp(argv[arg_index], "-period") == 0 )
1652  {
1653  arg_index++;
1654  period = atof(argv[arg_index++]);
1655  }
1656  else if ( strcmp(argv[arg_index], "-validation_run") == 0 )
1657  {
1658  arg_index++;
1659  validation_run=true;
1660  }
1661  else if ( strcmp(argv[arg_index], "-help") == 0 )
1662  {
1663  print_help = 1;
1664  break;
1665  }
1666  else
1667  {
1668  arg_index++;
1669  }
1670  }
1671 
1672  if (print_help)
1673  {
1674  if (MPI_Helpers::communicator_pt()->my_rank()==0)
1675  {
1676  oomph_info << "\n\nOption flags:\n";
1677  oomph_info << "-dir <n> Data saved to /RESLTn\n";
1678  oomph_info << "-outflow <ID> Outflow type:\n"
1679  << " ID=0 flux control\n"
1680  << " ID=1 pressure driven with impedance"
1681  << " with LSC preconditioner\n"
1682  << " ID=2 pressure driven with impedance"
1683  << " with block triangluar and LSC preconditioner\n"
1684  << " ID=3 prescribed outflow\n"
1685 
1686  << " otherwise pressure driven flow\n";
1687  oomph_info << "-Re <value> Sets Re=value\n";
1688  oomph_info << "-nsteps <value> Number of timesteps\n";
1689  oomph_info << "-solver <ID> Linear solver type:\n"
1690  << " ID=0 GMRES\n"
1691  << " otherwise SuperLU is used\n";
1692  oomph_info << "-p_solver <ID> P matrix solve type:\n"
1693  << " ID=0 BoomerAMG\n"
1694  << " ID=1 ML SA-AMG\n"
1695  << " otherwise SuperLU is used\n";
1696  oomph_info << "-f_solver <ID> F matrix solve type\n"
1697  << " ID=0 BoomerAMG\n"
1698  << " ID=1 ML SA-AMG\n"
1699  << " otherwise SuperLU is used\n";
1700  oomph_info << "-f_bamg_smoother <ID> BoomerAMG smoother for F matrix\n"
1701  << " ID=0 damped Jacobi\n"
1702  << " ID=1 Gauss-Seidel\n";
1703  oomph_info << "-f_bamg_damping <value> BoomerAMG Jacobi damping for F matrix\n";
1704  oomph_info << "-f_bamg_strength <value> BoomerAMG strength paramater F matrix\n";
1705  oomph_info << "-f_ml_settings <ID> Settings for ML on F matrix\n"
1706  << " ID=0 NSSA\n"
1707  << " otherwise SA\n";
1708  oomph_info << "-refine <n> Refines mesh n times\n";
1709  oomph_info << "-period <value> Set period to value\n";
1710  oomph_info << "-amplitude <value> Set amplitude to value\n";
1711  oomph_info << "-validation_run Generate validation data for 1D Womersley\n";
1712  }
1713 //#ifdef OOMPH_HAS_MPI
1714 // // finalize MPI
1715 // MPI_Helpers::finalize();
1716 //#endif
1717  return (0);
1718  }
1719 
1720  // Set validation values
1721  if (validation_run)
1722  {
1723  if (outflow==0)
1724  {
1725  directory_for_data = "RESLT_flux_control";
1726  }
1727  else if (outflow==1)
1728  {
1729  directory_for_data = "RESLT_impedance_tube";
1730  }
1731  else if (outflow==2)
1732  {
1733  directory_for_data = "RESLT_impedance_tube_with_flux_control";
1734  }
1737  solver=0;
1738  refinement=0;
1739  amplitude=0.5;
1740  period=10.0;
1741  }
1742 
1743  // Let St=1
1745 
1746  // Output settings
1747  oomph_info << "Storing data in /"
1748  << directory_for_data << "\n";
1749  oomph_info << "Outflow type: "
1750  << outflow << "\n";
1751  oomph_info << "Re="
1753  << "\n";
1754  if (solver==0)
1755  {
1756  oomph_info << "Using GMRES solver\n";
1757  if (p_solver==0)
1758  {
1759 #ifdef OOMPH_HAS_HYPRE
1760  oomph_info << "Using BoomerAMG on P matrix\n";
1761 #else
1762  oomph_info
1763  << "Warning: Hypre not available. Using SuperLU on P matrix\n";
1764 #endif
1765  }
1766  else if (p_solver==1)
1767  {
1768 #ifdef OOMPH_HAS_TRILINOS
1769  oomph_info << "Using ML SA-AMG on P matrix\n";
1770 #else
1771  oomph_info
1772  << "Warning: Trilinos not available. Using SuperLU on P matrix\n";
1773 #endif
1774  }
1775  else
1776  {
1777  oomph_info << "Using SuperLU on P matrix\n";
1778  }
1779  if (f_solver==0)
1780  {
1781 #ifdef OOMPH_HAS_HYPRE
1782  oomph_info << "Using BoomerAMG on F matrix\n"
1783  << "smoother: " << f_bamg_smoother
1784  << "\ndamping: " << f_bamg_damping
1785  << "\nstrength: " << f_bamg_strength
1786  << "\n";
1787 #else
1788  oomph_info
1789  << "Warning: Hypre not available. Using SuperLU on F matrix\n";
1790 #endif
1791  }
1792  else if (f_solver==1)
1793  {
1794 #ifdef OOMPH_HAS_TRILINOS
1795  oomph_info << "Using ML SA-AMG on F matrix ";
1796  if (f_ml_settings==0)
1797  {
1798  oomph_info << "with NSSA settings\n";
1799  }
1800  else
1801  {
1802  oomph_info << "with SA settings\n";
1803  }
1804 #else
1805  oomph_info
1806  << "Warning: Trilinos not available. Using SuperLU on F matrix\n";
1807 #endif
1808  }
1809  else
1810  {
1811  oomph_info << "Using SuperLU on F matrix\n";
1812  }
1813  }
1814  else
1815  {
1816  oomph_info << "Using SuperLU solver\n";
1817  }
1818 
1819  oomph_info << "Refining mesh " << refinement << " times\n";
1820 
1821  // Number of elements in the domain
1822  unsigned nup=20;
1823  unsigned ncollapsible=8;
1824  unsigned ndown=40;
1825  unsigned ny=16;
1826 
1827  // Length of the domain
1828  double lup=5.0;
1829  double lcollapsible=1.0;
1830  double ldown=10.0;
1831  double ly=1.0;
1832  double limpedance=0.0;
1833 
1834  // Modify values if using impedance tube
1835  if ((outflow==1) || (outflow==2))
1836  {
1837  limpedance = 5.0;
1838  ldown-=limpedance;
1839  ndown=20;
1840  }
1841 
1842  // Modify values for validation run
1843  if (validation_run)
1844  {
1845  limpedance = 8.0;
1846  ldown=2.0;
1847  nup=10;
1848  ncollapsible=4;
1849  ny=8;
1850  ndown=4;
1851  }
1852 
1853  oomph_info << "Amplitude=" << amplitude
1854  << "\nPeriod=" << period << "\n";
1855 
1856  // Solver stuff
1857  GMRES<CRDoubleMatrix>* iterative_solver_pt=0;
1858  NavierStokesSchurComplementPreconditioner* ns_preconditioner_pt=0;
1859 
1860  // Don't build the problem with Crouzeix Raviart Elements if using the
1861  // SchurComplement preconditioner!
1863  problem(nup, ncollapsible, ndown, ny,
1864  lup, lcollapsible, ldown, ly, limpedance,
1865  amplitude, period, outflow);
1866 
1867  //problem.switch_off_wall_oscillations();
1868 
1869  // Refine problem
1870  for (unsigned i=0;i<refinement;i++)
1871  {
1872  problem.refine_uniformly();
1873  }
1874 
1875  if (solver==0)
1876  {
1877  // Set up the solver and pass to the problem
1878  iterative_solver_pt = new GMRES<CRDoubleMatrix>;
1879  // iterative_solver_pt->set_preconditioner_RHS();
1880  iterative_solver_pt->max_iter() = 200;
1881  iterative_solver_pt->tolerance() = 1.0e-8;
1882  problem.linear_solver_pt() = iterative_solver_pt;
1883 
1884  // Set up the preconditioner
1885  NavierStokesSchurComplementPreconditioner* ns_preconditioner_pt = 0;
1886  FSIPreconditioner* fsi_preconditioner_pt = 0;
1887 
1888  if (outflow==2)
1889  {
1890  // Construct the FSI preconditioner
1891  fsi_preconditioner_pt = new FSIPreconditioner(&problem);
1892  fsi_preconditioner_pt->enable_doc_time();
1893 
1894  // Get a pointer to the preconditioner
1895  ns_preconditioner_pt =
1897  (fsi_preconditioner_pt->navier_stokes_preconditioner_pt());
1898 
1899  // Set solid mesh with "true" to tolerate multiple element types.
1900  fsi_preconditioner_pt->
1901  set_wall_mesh(problem.outflow_impedance_master_mesh_pt(),true);
1902 
1903  // Set fluid mesh
1904  fsi_preconditioner_pt->
1905  set_navier_stokes_mesh
1906  (problem.create_mesh_for_navier_stokes_preconditioner());
1907 
1908  // Pass the FSI preconditioner to the solver
1909  iterative_solver_pt->preconditioner_pt() = fsi_preconditioner_pt;
1910  }
1911  else
1912  {
1913  // Construct the preconditioner and pass in the problem pointer.
1914  ns_preconditioner_pt = new NavierStokesSchurComplementPreconditioner
1915  (&problem);
1916 
1917  // Setup the fluid mesh
1918  ns_preconditioner_pt->set_navier_stokes_mesh
1919  (problem.create_mesh_for_navier_stokes_preconditioner());
1920 
1921  // Pass the preconditioner to the solver
1922  iterative_solver_pt->preconditioner_pt() = ns_preconditioner_pt;
1923  }
1924 
1925  // Settings for the LCS preconditioner
1926  ns_preconditioner_pt->set_navier_stokes_mesh(
1927  problem.create_mesh_for_navier_stokes_preconditioner());
1928  ns_preconditioner_pt->enable_doc_time();
1929 
1930  // Set up the P sub block preconditioner
1931 #ifdef OOMPH_HAS_HYPRE
1932  if (p_solver==0)
1933  {
1934 #ifdef OOMPH_HAS_HYPRE
1935  Preconditioner* p_preconditioner_pt = new HyprePreconditioner;
1936  HyprePreconditioner* hypre_preconditioner_pt =
1937  static_cast<HyprePreconditioner*>(p_preconditioner_pt);
1939  set_defaults_for_2D_poisson_problem(hypre_preconditioner_pt);
1940  ns_preconditioner_pt->set_p_preconditioner(p_preconditioner_pt);
1941 #endif
1942  }
1943 #endif
1944 
1945 #ifdef OOMPH_HAS_TRILINOS
1946  if (p_solver==1)
1947  {
1948 #ifdef OOMPH_HAS_TRILINOS
1949  Preconditioner* p_preconditioner_pt = new TrilinosMLPreconditioner;
1950  ns_preconditioner_pt->set_p_preconditioner(p_preconditioner_pt);
1951 #endif
1952  }
1953 #endif
1954 
1955  // Set up the F sub block precondioner
1956 #ifdef OOMPH_HAS_HYPRE
1957  if (f_solver==0)
1958  {
1959 #ifdef OOMPH_HAS_HYPRE
1960  Preconditioner* f_preconditioner_pt = new HyprePreconditioner;
1961  HyprePreconditioner* hypre_preconditioner_pt =
1962  static_cast<HyprePreconditioner*>(f_preconditioner_pt);
1963  hypre_preconditioner_pt->use_BoomerAMG();
1964  hypre_preconditioner_pt->set_amg_iterations(1);
1965  hypre_preconditioner_pt->amg_using_simple_smoothing();
1966  hypre_preconditioner_pt->amg_simple_smoother()=f_bamg_smoother;
1967  hypre_preconditioner_pt->amg_damping()=f_bamg_damping;
1968  hypre_preconditioner_pt->amg_strength()=f_bamg_strength;
1969  ns_preconditioner_pt->set_f_preconditioner(f_preconditioner_pt);
1970 #endif
1971  }
1972 #endif
1973 
1974 #ifdef OOMPH_HAS_TRILINOS
1975  if (f_solver==1)
1976  {
1977 #ifdef OOMPH_HAS_TRILINOS
1978  Preconditioner* f_preconditioner_pt = new TrilinosMLPreconditioner;
1979  TrilinosMLPreconditioner* trilinos_preconditioner_pt =
1980  static_cast<TrilinosMLPreconditioner*>(f_preconditioner_pt);
1981  if (f_ml_settings==1)
1982  {
1983  trilinos_preconditioner_pt->set_NSSA_default_values();
1984  }
1985  else
1986  {
1987  trilinos_preconditioner_pt->set_SA_default_values();
1988  }
1989  ns_preconditioner_pt->set_f_preconditioner(f_preconditioner_pt);
1990 #endif
1991  }
1992 #endif
1993  }
1994 
1995  // run the problem
1996  problem.unsteady_run(directory_for_data, nsteps, validation_run);
1997 
1998  // delete stuff - remembering P and F matrix preconditioners are
1999  // deleted in the Schur complement preconditioner
2000  delete iterative_solver_pt;
2001  iterative_solver_pt=0;
2002  delete ns_preconditioner_pt;
2003  ns_preconditioner_pt=0;
2004 
2005 
2006 //#ifdef OOMPH_HAS_MPI
2007 // // finalize MPI
2008 // MPI_Helpers::finalize();
2009 //#endif
2010 
2011 } //end of driver code
BiCGSTAB< SparseMatrix< double > > solver
Definition: BiCGSTAB_simple.cpp:5
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Problem class.
Definition: collapsible_channel.cc:236
Definition: fsi_preconditioners.h:51
void enable_doc_time()
Enable documentation of time.
Definition: fsi_preconditioners.h:205
NavierStokesSchurComplementPreconditioner * navier_stokes_preconditioner_pt() const
Access function to the Navier Stokes preconditioner (inexact solver)
Definition: fsi_preconditioners.h:198
The GMRES method.
Definition: iterative_linear_solver.h:1227
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
double & amg_damping()
Access function to AMG_damping parameter.
Definition: hypre_solver.h:1032
void set_amg_iterations(const unsigned &amg_iterations)
Function to set the number of times to apply BoomerAMG.
Definition: hypre_solver.h:964
void amg_using_simple_smoothing()
Definition: hypre_solver.h:977
void use_BoomerAMG()
Function to select BoomerAMG as the preconditioner.
Definition: hypre_solver.h:958
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
unsigned & max_iter()
Access to max. number of iterations.
Definition: iterative_linear_solver.h:113
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
void set_navier_stokes_mesh(Mesh *mesh_pt, const bool &allow_multiple_element_type_in_navier_stokes_mesh=false)
Definition: navier_stokes_preconditioners.h:732
void enable_doc_time()
Enable documentation of time.
Definition: navier_stokes_preconditioners.h:805
Definition: preconditioner.h:54
Definition: trilinos_preconditioners.h:152
void set_NSSA_default_values()
Broken assignment operator.
Definition: trilinos_preconditioners.h:177
void set_SA_default_values()
Definition: trilinos_preconditioners.h:200
void setup(Time *time_pt)
Create all GeomObjects needed to define the cylinder and the flag.
Definition: turek_flag_non_fsi.cc:277
double ReSt
Womersley number.
Definition: rayleigh_instability.cc:56
double Re
Reynolds number.
Definition: fibre.cc:55
const double ly
Definition: ConstraintElementsUnitTest.cpp:34
const unsigned ny
Definition: ConstraintElementsUnitTest.cpp:31
void set_defaults_for_2D_poisson_problem(HyprePreconditioner *hypre_preconditioner_pt)
Definition: hypre_solver.cc:45
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
Constructor for SteadyAxisymAdvectionDiffusion problem
Definition: steady_axisym_advection_diffusion.cc:213

References oomph::HyprePreconditioner::amg_damping(), oomph::HyprePreconditioner::amg_simple_smoother(), oomph::HyprePreconditioner::amg_strength(), oomph::HyprePreconditioner::amg_using_simple_smoothing(), oomph::FSIPreconditioner::enable_doc_time(), oomph::NavierStokesSchurComplementPreconditioner::enable_doc_time(), i, Mesh_Parameters::ly, oomph::IterativeLinearSolver::max_iter(), oomph::FSIPreconditioner::navier_stokes_preconditioner_pt(), Mesh_Parameters::ny, oomph::oomph_info, oomph::IterativeLinearSolver::preconditioner_pt(), problem, Global_Physical_Variables::Re, Global_Physical_Variables::ReSt, oomph::HyprePreconditioner::set_amg_iterations(), oomph::Hypre_default_settings::set_defaults_for_2D_poisson_problem(), oomph::NavierStokesSchurComplementPreconditioner::set_f_preconditioner(), oomph::NavierStokesSchurComplementPreconditioner::set_navier_stokes_mesh(), oomph::TrilinosMLPreconditioner::set_NSSA_default_values(), oomph::NavierStokesSchurComplementPreconditioner::set_p_preconditioner(), oomph::TrilinosMLPreconditioner::set_SA_default_values(), Flag_definition::setup(), solver, oomph::IterativeLinearSolver::tolerance(), and oomph::HyprePreconditioner::use_BoomerAMG().