Quick Start with Docker

1. Installation Quick Start

Using Feel++ inside Docker is the recommended and fastest way to use Feel++.

We strongly encourage you to follow the Docker installation steps if you begin with Feel++ in particular as an end-user.

2. Usage Quick Start

Start the main Feel++ Docker container feelpp/feelpp-toolboxes` as follows

Command line to start the docker container
$ docker run -it --rm -e LOCAL_USER_ID=`id -u $USER`  -v $HOME/feel:/feel feelpp/feelpp-toolboxes
simply copy-paste the command line in your terminal to start the feelpp/feelpp-toolboxes container.

Here are some explanations about the different parts in the command line

$ docker (1)
  run (2)
  -it (3)
  --rm (4)
  -e LOCAL_USER_ID=`id -u`(5)
  -v $HOME/feel:/feel (6)
  feelpp/feelpp-toolboxes (7)
1 docker is the application that allows to create and execute Containers
2 run allows to execute the image feelpp/feelpp-toolboxes
3 the option -it runs Docker in interactive mode;
4 the option --rm makes sure that the container is deleted after the user exits Docker
5 we need to pass your user id to Docker so that the data you generate from Docker belongs to you;
6 maps the directory $HOME/feel on your host to /feel in Docker, Feel++ write in /feel the results of the simulations. Passing your id, i.e LOCAL_USER_ID, allows to ensure that the generated data on Feel++ belongs to you on your host system;
7 execute the image feelpp/feelpp-toolboxes and create the associated container .
Several testcases (configuration files) have been installed in /feel/testcases (in Docker container) or $HOME/feel/testcases once you have executed the command line above.
Running the quickstart Laplacian in sequential
$ feelpp_qs_laplacian_2d --config-file /feel/testcases/quickstart/laplacian/feelpp2d/feelpp2d.cfg
Explanations about running the quickstart Laplacian in sequential
> feelpp_qs_laplacian_2d (1)
--config-file /feel/testcases/quickstart/laplacian/feelpp2d/feelpp2d.cfg(2)
1 executable to run
2 configuration file (text) to setup the problem : mesh, material properties and boundary conditions

The results are stored in Docker in


and on your computer


The mesh and solutions can be visualized using e.g. Paraview or Visit.

ParaView (recommended)

is an open-source, multi-platform data analysis and visualization application.


is a distributed, parallel visualization and graphical analysis tool for data defined on two- and three-dimensional (2D and 3D) meshes

Quickstart Laplacian on 4 cores in parallel
> mpirun -np 4 feelpp_qs_laplacian_2d --config-file /feel/testcases/quickstart/laplacian/feelpp2d/feelpp2d.cfg

The results are stored in a simular place as above: just replace np_1 by np_4 in the paths above. The results should look like





3. Syntax Start

Here are some excerpts from Quickstart Laplacian that solves the Laplacian problem. It shows some of the features of Feel++ and in particular the domain specific language for Galerkin methods.

First we load the mesh, define the function space define some expressions

Laplacian problem in an arbitrary geometry, loading mesh and defining spaces
    auto mesh = loadMesh(_mesh=new Mesh<Simplex<FEELPP_DIM,1>>);

    auto Vh = Pch<2>( mesh ); (1)
    auto u = Vh->element("u"); (2)
    auto mu = expr(soption(_name="functions.mu")); // diffusion term (3)
    auto f = expr( soption(_name="functions.f"), "f" ); (4)
    auto r_1 = expr( soption(_name="functions.a"), "a" ); // Robin left hand side expression (5)
    auto r_2 = expr( soption(_name="functions.b"), "b" ); // Robin right hand side expression (6)
    auto n = expr( soption(_name="functions.c"), "c" ); // Neumann expression (7)
    auto solution = expr( checker().solution(), "solution" ); (8)
    auto g = checker().check()?solution:expr( soption(_name="functions.g"), "g" ); (9)
    auto v = Vh->element( g, "g" ); (3)

Second we define the linear and bilinear forms to solve the problem

Laplacian problem in an arbitrary geometry, defining forms and solving
    auto l = form1( _test=Vh );
    l = integrate(_range=elements(mesh),
    l+=integrate(_range=markedfaces(mesh,"Robin"), _expr=r_2*id(v));
    l+=integrate(_range=markedfaces(mesh,"Neumann"), _expr=n*id(v));

    auto a = form2( _trial=Vh, _test=Vh);
    a = integrate(_range=elements(mesh),
                  _expr=mu*inner(gradt(u),grad(v)) );
    a+=integrate(_range=markedfaces(mesh,"Robin"), _expr=r_1*idt(u)*id(v));
    a+=on(_range=markedfaces(mesh,"Dirichlet"), _rhs=l, _element=u, _expr=g );
    //! if no markers Robin Neumann or Dirichlet are present in the mesh then
    //! impose Dirichlet boundary conditions over the entire boundary
    if ( !mesh->hasAnyMarker({"Robin", "Neumann","Dirichlet"}) )
        a+=on(_range=boundaryfaces(mesh), _rhs=l, _element=u, _expr=g );

More explanations are available in the Laplacian example.