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. Checkout What is Feel++?, Feel++ Features and some Examples.
Here is the latest release of Feel++
Feel++ is split into three components:
feelpp : library and tools
feelpp-toolboxes : mono and multiphysics toolboxes (cfd, csm, heat transfer, fsi, heat and fluid, hdg(poisson and elasticity), thermo-electric and maxwell)
feelpp-mor: model order reduction applications and tools
Feel++ is packaged and delivered via docker, debian and ubuntu packages.
Component | Docker | Debian/Buster | Ubuntu/Eoan | Ubuntu/Focal |
---|---|---|---|---|
feelpp |
||||
feelpp-toolboxes |
||||
feelpp-mor |
We encourage you to ask questions and discuss any aspects of the project on Slack. New contributors are always welcome!
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
master
Main branch where the source code of HEAD always reflects a production-ready state.
develop
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/*
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 |
---|---|---|
Ubuntu Focal/20.04 clang-9 |
||
Ubuntu Disco/19.04 clang-9 |
||
Debian Buster/10 clang-7 |
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.
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 (dG and hdG) 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 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.
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.
Further information and documentation about Feel++ can be found on the project’s website.
The Feel++ organization on GitHub hosts the project’s source code, issue tracker, and sub-projects.
Copyright © 2011-2019 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.
Here is a full example to solve
#include <feel/feel.hpp>
int main(int argc, char**argv )
{
using namespace Feel;
Environment env( _argc=argc, _argv=argv,
_desc=feel_options(),
_about=about(_name="qs_laplacian",
_author="Feel++ Consortium",
_email="feelpp-devel@feelpp.org"));
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),
_expr=id(v));
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.) );
a.solve(_rhs=l,_solution=u);
auto e = exporter( _mesh=mesh, _name="qs_laplacian" );
e->add( "u", u );
e->save();
return 0;
}
Here is a full non-linear example - the Bratu equation - to solve
#include <feel/feel.hpp>
inline
Feel::po::options_description
makeOptions()
{
Feel::po::options_description bratuoptions( "Bratu problem options" );
bratuoptions.add_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$
*/
int
main( int argc, char** argv )
{
using namespace Feel;
Environment env( _argc=argc, _argv=argv,
_desc=makeOptions(),
_about=about(_name="bratu",
_author="Christophe Prud'homme",
_email="christophe.prudhomme@feelpp.org"));
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() ) );
};
u.zero();
backend()->nlSolver()->residual = Residual;
backend()->nlSolver()->jacobian = Jacobian;
backend()->nlSolve( _solution=u );
auto e = exporter( _mesh=mesh );
e->add( "u", u );
e->save();
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。