Lecture materials for the course "Continuum mechanics and fluid-structure interaction problems: mathematical modeling and numerical approximation"
Author | Luca Heltai [email protected] |
GitHub Repository: | https://github.com/luca-heltai/fsi-suite |
GitHub Pages: | https://luca-heltai.github.io/fsi-suite/ |
Licence: | see the file LICENCE.md |
Fluid-structure interaction (FSI) refers to the multiphysics coupling between the laws that describe fluid dynamics and structural mechanics.
This page collects the material that I have used for a course given at Kaust (https://www.kaust.edu.sa/en) during the spring semester of 2022.
The course covers three main topics: i) basics of continuum mechanics, ii) mathematical modeling of FSI problems, and iii) numerical implementations based on the finite element method. Theoretical lectures are backed up by applied laboratories based on the C++ language, using example codes developed with the open source finite element library deal.II (<www.dealii.org>). I cover basic principles of continuum mechanics, discuss Lagrangian, Eulerian, and Arbitrary Lagrangian-Eulerian formulations, and cover different coupling strategies, both from the theoretical point of view, and with the aid of computational laboratories.
The students will learn how to develop, use, and analyze state-of-the-art finite element approximations for the solution of continuum mechanics problems, including non-linear mechanics, computational fluid dynamics, and fluid-structure-interaction problems.
A glimpse of the PDEs that are discussed in the course is given by the following graph
@dotfile serial.dot width=100%
The laboratory part should enable a PhD student working on numerical analysis
of PDEs to implement state-of-the-art adaptive finite element codes for FSI
problems, that run in parallel, using modern C++ libraries. The implementation
are based on the deal.II
library (<www.dealii.org>).
Main topics covered by these lectures:
- Advanced Finite Element theory
- How to use a modern C++ IDE, to build and debug your codes
- How to use a large FEM library to solve complex PDE problems
- How to properly document your code using Doxygen
- How to use a proper Git workflow to develop your applications
- How to leverage GitHub actions, google tests, and docker images to test and deploy your application
- How hybrid parallelisation (threads + MPI + GPU) works in real life FEM applications
Up to date online documentation for the codes used in the laboratories is here:
https://luca-heltai.github.io/fsi-suite/
System | Status |
---|---|
Continous Integration | |
Docker | |
Doxygen | |
Indent |
One of my courses on theory and practice of finite elements:
Exceptional video lectures by Prof. Wolfgang Bangerth, that cover all the things you will ever need for finite element programming.
If you have Docker installed, you can run any of the programs available within this repository by executing the following commands:
wget https://raw.githubusercontent.com/luca-heltai/fsi-suite/main/fsi-suite.sh
chmod +x ./fsi-suite.sh
./fsi-suite.sh
you should see the following output:
Usage: ./fsi-suite.sh [-np N] program-name program-options
Will run program-name with program-options, possibly via mpirun, passing -np N to mpirun.
Here is a list of programs you can run:
linear_elasticity.g mpi_stokes.g
distributed_lagrange mesh_handler poisson
distributed_lagrange.g mesh_handler.g poisson.g
dof_plotter mpi_linear_elasticity reduced_lagrange
dof_plotter.g mpi_linear_elasticity.g reduced_lagrange.g
fsi_test mpi_poisson stokes
fsi_test.g mpi_poisson.g stokes.g
linear_elasticity mpi_stokes
Programs ending with .g are compiled with debug symbols. To see help on how to run
any of the programs, add a -h flag at the end.
The above command will download the latest docker image from the main
branch
of this repository (which is built and uploaded to
https://hub.docker.com/r/heltai/fsi-suite at every commit to master), mount the
current directory, in a directory with the same path inside the container, and
the program you selected. For example,
./fsi-suite.sh -np 4 mpi_poisson.g
will run the (debug version of the) executable based on the PDEs::MPI::Poisson
problem in parallel, using 4 processors. You can change grid, boundary
conditions, forcing terms, finite element spaces, etc. by editing the
configuration file which is created the first time you run the program, and then
passing it as an argument to the program itself, i.e., in the example above, the
parameter file that would be generated is used_mpi_poisson.g.prm
, which you
can edit and then pass as input to the program itself:
./fsi-suite.sh -np 4 mpi_poisson.g used_mpi_poisson.g.prm
If you want to read some documentation of what each parameter does and how it works, you can call the program passing a non-existing parameter file:
./fsi-suite.sh -np 4 mpi_poisson.g my_test.prm
----------------------------------------------------
Exception on processing:
--------------------------------------------------------
An error occurred in line <77> of file <../source/base/parameter_acceptor.cc> in function
static void dealii::ParameterAcceptor::initialize(const string&, const string&, dealii::ParameterHandler::OutputStyle, dealii::ParameterHandler&, dealii::ParameterHandler::OutputStyle)
The violated condition was:
false
Additional information:
You specified <my_test.prm> as input parameter file, but it does not
exist. We created it for you.
The created parameter file will also contain documentation for each parameter. Running again the same command will now use the parameter file that was just created:
./fsi-suite.sh -np 4 mpi_poisson.g my_test.prm
Number of cores : 8
Number of threads : 2
Number of MPI processes : 4
MPI rank of this process: 0
Cycle 0
System setup
Number of dofs 4
Number of degrees of freedom: 4 (4)
cells dofs u_L2_norm u_H1_norm
1 4 0.000e+00 - 0.000e+00 -
+---------------------------------------------+------------+------------+
| Total CPU time elapsed since start | 0.07s | |
| | | |
| Section | no. calls | CPU time | % of total |
+---------------------------------+-----------+------------+------------+
| assemble_system | 1 | 0.000425s | 0.61% |
| estimate | 1 | 0.000434s | 0.62% |
| output_results | 1 | 0.00591s | 8.4% |
| setup_system | 1 | 0.0124s | 18% |
| solve | 1 | 0.00547s | 7.8% |
+---------------------------------+-----------+------------+------------+
A tentative detailed program is shown below (this will be updated during the course to reflect the actual course content)
-
Course introduction.
- Motivating examples
- Basic principles and background knowledge.
-
Recap on Finite Element Methods
- Introduction to deal.II.
-
Basic principles of continuum mechanics
- conservation equations
- constitutive equations
- kinematics
- transport theorems
-
Lagrangian formulation of continuum mechanics (solids).
- Static and compressible linear elasticity
-
Recap on mixed problems
- Static incompressible linear elasticity
-
Eulerian formulation of continuum mechanics
- Stokes problem
-
Recap on time discretization schemes
- Time dependent Stokes problem
- Time dependent linear elasticity (wave equations)
-
Treating non-linearities
- IMEX
- predictor corrector
- fixed point
- Newton
-
Navier-Stokes equations
-
Segregated coupling
- Lagrangian domain deformation
-
Arbitrary Lagrangian Eulerian formulation
-
Immersed Boundary/Immersed Finite Element Method
-
Distributed Lagrange multiplier formulation
-
Students' projects.