Skip to content
💎 Feel++: Finite Element Embedded Language and Library in C++
C++ C Makefile CMake Fortran Shell Other
Branch: develop
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
.buildkite add merge/aero to pipeline testsuite on buildkite Jun 4, 2019
.github Update Mar 27, 2018
.templates change templates Nov 8, 2016
benchmarks set GTEST to OFF Apr 21, 2019
cmake/modules Merge remote-tracking branch 'origin/develop' into feature/sc-geomap Dec 5, 2018
data up operatorlagrangep1 : add also equispaced ref + rename with pointset Jun 7, 2019
databases/materials dynamic viscosity is named mu Apr 6, 2015
doc set min cmake version to 3.7.2 in sub projects Mar 20, 2019
feelpp add hypercube mesh case to qs laplacian Aug 19, 2019
mor fix eim tests and opusapp Jun 5, 2019
ports up macport : increase Petsc and Slepc version (3.11.2) [ci skip] May 23, 2019
quickstart Merge remote-tracking branch 'origin/develop' into feature/sc-geomap Dec 5, 2018
research add feelpp_get_environment() #1218 Sep 27, 2018
testsuite fix compilation Aug 1, 2019
toolboxes WARNING : change heat_k_Cu -> heat_Cu_k and electric_sigma_Cu -> elec… Aug 13, 2019
.clang-format Merge branch 'develop' into feature/hdg-sc Dec 28, 2016
.codacy.yml add codacy(code coverage) support [ci skip] May 6, 2018
.dir-locals.el fix function space creation Jun 7, 2017
.emacs-dirvars various changes: Mar 16, 2015
.gitattributes up [ci skip] Oct 8, 2018
.gitignore ignore Apr 15, 2019
.gitmodules Closes #1313 Apr 15, 2019
.travis.yml add ubuntu 17.04 to travis May 6, 2017
CHANGELOG.adoc up CHANGELOG [ci skip] Jun 11, 2019
CMakeLists.txt fix FEEELPP_ENABLED_PROJECTS in expand Apr 15, 2019
CMakeLists.txt.user rm Feb 6, 2014
CONTRIBUTING.adoc minor update [ci skip] Apr 17, 2017
COPYING.adoc update COPYING according to the LICENSE update [ci skip] Apr 17, 2017
CTestConfig.cmake fixes #372 and #374 Jun 9, 2014 up INSTALL [ci-skip] Jun 29, 2014
LICENSE Create LICENSE May 6, 2018
LICENSE.adoc use adoc file [ci skip] Apr 15, 2017
README.adoc Update README.adoc Aug 16, 2018
configure Merge remote-tracking branch 'origin/develop' into feature/sc-geomap Mar 16, 2019


Feel++: Finite Element Embedded Library in C++

feelpp Build Status ee741577e2454024a18d44603be62a6d

Feel++ is a C++ library for continuous or discontinuous Galerkin methods including finite element method(FEM), spectral element methods(SEM), reduced basis methods, discontinuous galerkin methods (DG and HDG) in 1D 2D and 3D and in parallel.

Feel++ Documentation

Gitter Discussion Forum

We encourage you to ask questions and discuss any aspects of the project on the Feel++ Gitter forum. New contributors are always welcome!

Join the chat at

Continuous Integration

Feel++ maintains various branches. At the core, the development model is greatly inspired by existing models out there. The central repo holds two main branches with an infinite lifetime: master and develop


Main branch where the source code of HEAD always reflects a production-ready state.


Main branch where the source code of HEAD always reflects a state with the latest delivered development changes for the next release. Some would call this the “integration branch”. This is where any automatic nightly builds are built from.


Feature branches (or sometimes called topic branches) are used to develop new features for the upcoming or a distant future release. When starting development of a feature, the target release in which this feature will be incorporated may well be unknown at that point. The essence of a feature branch is that it exists as long as the feature is in development, but will eventually be merged back into develop (to definitely add the new feature to the upcoming release) or discarded (in case of a disappointing experiment).

Platform & Compiler master develop

Buildkite Ubuntu 16.04 clang6

Build Status

Build Status

Buildkite Ubuntu 16.04 clang5



Buildkite Ubuntu 16.04 clang4



Buildkite MacOsX Homebrew



What is Feel++?

Feel++ is a C++ library for continuous or discontinuous Galerkin methods including finite element method(FEM), spectral element methods(SEM), reduced basis methods, discontinuous galerkin methods (DG and HDG) in 1D 2D and 3D and in parallel. The objectives of this framework is quite ambitious; ambitions which could be express in various ways such as :

  • the creation of a versatile mathematical kernel solving easily problems using different techniques thus allowing testing and comparing methods, e.g. cG versus dG,

  • the creation of a small and manageable library which shall nevertheless encompass a wide range of numerical methods and techniques,

  • build mathematical software that follows closely the mathematical abstractions associated with partial differential equations (PDE),

  • the creation of a library entirely in C++ allowing to create complex and typically multi-physics applications such as fluid-structure interaction or mass transport in haemodynamic.

Some basic installation procedure are available in the INSTALL file, the detailled process is available here.


Here are the latest releases of Feel++


  • 1D 2D and 3D (including high order) geometries and also lower topological dimension 1D(curve) in 2D and 3D or 2D(surface) in 3D

  • continuous and discontinuous arbitrary order Galerkin Methods in 1D, 2D and 3D including finite and spectral element methods

  • domain specific embedded language in C++ for variational formulations

  • interfaced with PETSc for linear and non-linear solvers

  • seamless parallel computations using PETSc

  • interfaced with SLEPc for large-scale sparse standard and generalized eigenvalue solvers

  • supports Gmsh for mesh generation

  • supports Gmsh for post-processing (including on high order geometries)

  • supports Paraview and CEI/Ensight for post-processing and the following file formats: ensight gold, gmsh, xdmf.


In the spirit of free software, everyone is encouraged to help improve this project. If you discover errors or omissions in the source code, documentation, or website content, please don’t hesitate to submit an issue or open a pull request with a fix. New contributors are always welcome!

Here are some ways you can contribute:

  • by using develop versions

  • by reporting bugs

  • by suggesting new features

  • by writing or editing documentation

  • by writing specifications

  • by writing code — No patch is too small.

    • fix typos

    • add comments

    • write examples!

    • write tests!

  • by refactoring code

  • by fixing issues

  • by reviewing Pull Requests

The Contributing guide provides information on how to create, style, and submit issues, feature requests, code, and documentation to the Feel++ Project.

Getting Help

The Feel++ project is developed to help you easily do (i) modelisation simulation and optimisation and (ii) high performance computing. But we can’t do it without your feedback! We encourage you to ask questions and discuss any aspects of the project on the discussion list, on Twitter or in the chat room.


#feelpp hashtag or @feelpp mention

Chat (Gitter)


Further information and documentation about Feel++ can be found on the project’s website.

Home | News | Docs

The Feel++ organization on GitHub hosts the project’s source code, issue tracker, and sub-projects.

Source repository (git)

Issue tracker

Feel++ organization on GitHub

Copyright © 2011-2017 Feel++ Consortium. Free use of this software is granted under the terms of the GPL License.

See the LICENSE file for details.


Feel++ is led by Christophe Prud’homme and has received contributions from many other individuals. The project was initiated in 2006 by Christophe Prud’homme and based initially on lifeV and completely re-written since then.


Laplacian in 2D using P3 Lagrange basis functions

Here is a full example to solve -\Delta u = f \mbox{ in } \Omega,\quad u=g \mbox{ on } \partial \Omega

#include <feel/feel.hpp>

int main(int argc, char**argv )
    using namespace Feel;
    Environment env( _argc=argc, _argv=argv,
                                  _author="Feel++ Consortium",

    auto mesh = unitSquare();
    auto Vh = Pch<1>( mesh );
    auto u = Vh->element();
    auto v = Vh->element();

    auto l = form1( _test=Vh );
    l = integrate(_range=elements(mesh),

    auto a = form2( _trial=Vh, _test=Vh );
    a = integrate(_range=elements(mesh),
                  _expr=gradt(u)*trans(grad(v)) );
    a+=on(_range=boundaryfaces(mesh), _rhs=l, _element=u,
          _expr=constant(0.) );

    auto e = exporter( _mesh=mesh, _name="qs_laplacian" );
    e->add( "u", u );
    return 0;

Bratu equation in 2D

Here is a full non-linear example - the Bratu equation - to solve -\Delta u + e^u = 0 \mbox{ in } \Omega,\quad u=0 \mbox{ on } \partial \Omega.

#include <feel/feel.hpp>

    Feel::po::options_description bratuoptions( "Bratu problem options" );
    ( "lambda", Feel::po::value<double>()->default_value( 1 ),
                "exp() coefficient value for the Bratu problem" )
    ( "penalbc", Feel::po::value<double>()->default_value( 30 ),
                 "penalisation parameter for the weak boundary conditions" )
    ( "hsize", Feel::po::value<double>()->default_value( 0.1 ),
               "first h value to start convergence" )
    ( "export-matlab", "export matrix and vectors in matlab" )
    return bratuoptions.add( Feel::feel_options() );

 * Bratu Problem
 * solve \f$ -\Delta u + \lambda \exp(u) = 0, \quad u_\Gamma = 0\f$ on \f$\Omega\f$
main( int argc, char** argv )

    using namespace Feel;
    Environment env( _argc=argc, _argv=argv,
                                  _author="Christophe Prud'homme",
    auto mesh = unitSquare();
    auto Vh = Pch<3>( mesh );
    auto u = Vh->element();
    auto v = Vh->element();
    double penalbc = option(_name="penalbc").as<double>();
    double lambda = option(_name="lambda").as<double>();

    auto Jacobian = [=](const vector_ptrtype& X, sparse_matrix_ptrtype& J)
            auto a = form2( _test=Vh, _trial=Vh, _matrix=J );
            a = integrate( elements( mesh ), gradt( u )*trans( grad( v ) ) );
            a += integrate( elements( mesh ), lambda*( exp( idv( u ) ) )*idt( u )*id( v ) );
            a += integrate( boundaryfaces( mesh ),
               ( - trans( id( v ) )*( gradt( u )*N() ) - trans( idt( u ) )*( grad( v )*N()  + penalbc*trans( idt( u ) )*id( v )/hFace() ) );
    auto Residual = [=](const vector_ptrtype& X, vector_ptrtype& R)
            auto u = Vh->element();
            u = *X;
            auto r = form1( _test=Vh, _vector=R );
            r = integrate( elements( mesh ), gradv( u )*trans( grad( v ) ) );
            r +=  integrate( elements( mesh ),  lambda*exp( idv( u ) )*id( v ) );
            r +=  integrate( boundaryfaces( mesh ),
               ( - trans( id( v ) )*( gradv( u )*N() ) - trans( idv( u ) )*( grad( v )*N() ) + penalbc*trans( idv( u ) )*id( v )/hFace() ) );
    backend()->nlSolver()->residual = Residual;
    backend()->nlSolver()->jacobian = Jacobian;
    backend()->nlSolve( _solution=u );

    auto e = exporter( _mesh=mesh );
    e->add( "u", u );
You can’t perform that action at this time.