update divers.md

This commit is contained in:
Gaspard Jankowiak 2018-10-30 18:07:55 +01:00
parent 8366ba2629
commit a1bfbf6b0c

View file

@ -21,6 +21,21 @@ J'ai donnée une petite introduction à Jekyll à l'Université de Vienne, les s
[FEniCS][1] est un ensemble de bibliothèques permettant la résolution d'EDP avec la méthode des éléments finis. Il permet la description des problèmes sous forme variationnelle à haut niveau. Je rassemble ici quelques notes et conseils utiles pour l'interface Python, valable au moins pour la version **1.4**.
### Installation
Pour ceux qui ne sont pas sur Ubuntu et qui n'ont donc pas accès aux PPA, ou ceux qui ne veulent pas utiliser Docker, le plus simple pour installer FEniCS est de passer par [Anaconda](https://docs.continuum.io/anaconda/install), qui fourni un environnement de développement Python complet. Une fois installer, on peut récupérer FEniCS de cette façon:
{% highlight bash %}
# installation de FEniCS
$ conda create -n fenics -c conda-forge fenics
# activation du virtualenv FEniCS
$ source activate fenics
# installation des paquets manquants
$ conda install -c conda-forge matplotlib mshr pyyaml sympy=1.0
{% endhighlight %}
Si vous utilisez Python 2.x, je recommande de commencer tous vos fichiers de calcul par `from __future__ import division`, qui nous débarrasse de la division entière. Celle-ci est toujours accessible via l'opérateur `//`.
L'interface Python de FEniCS est rassemblée dans le module `dolfin`, qu'il faut donc importer pour pouvoir en profiter.
@ -28,19 +43,17 @@ Dans la suite, `mesh` correspondra au maillage, et dans les expressions variatio
- Par défaut, la variable d'espace n'est pas accessible directement pour l'écriture des formes variationnelles, mais on peut la définir avec `SpatialCoordinate`:
~~~
{% highlight python %}
x = SpatialCoordinate(mesh)
form = inner(grad(u), grad(v))*dx + (x[0]**2 + x[1]**2)*u*v*dx
~~~
{: .language-python}
{% endhighlight %}
- De la même façon, le vecteur normal au bord d'un maillage s'obtient avec la fonction `FacetNormal`, on peut dont définir des termes de bord, par exemple $\int \frac{\partial u}{\partial \nu}\, v\; \mathrm d x$, de la manière suivante :
~~~
{% highlight python %}
n = FacetNormal(mesh)
a = ... + inner(grad(u), n)*v*dx
~~~
{: .language-python}
{% endhighlight %}
- Il est possible de définir des régions du maillage (des `SubDomain`) de manière plus efficace (à voir ce que ça veut dire exactement) avec la fonction `CompiledSubDomain`, qui prend une chaîne de charactère. Celle-ci suit la syntaxe C++, et expose les variables `on_boundary` et `x`. Les autres doivent être passées en argument :