From 7f7cdccad97431e98c1d40fc22fb6b6b454ec143 Mon Sep 17 00:00:00 2001 From: Gaspard Jankowiak Date: Wed, 11 Feb 2015 16:05:32 +0100 Subject: [PATCH] notes fenics --- divers.markdown | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/divers.markdown b/divers.markdown index a1329a5..3679c4e 100644 --- a/divers.markdown +++ b/divers.markdown @@ -1,6 +1,6 @@ --- layout: default -math: false +math: true --- FR\|[EN](/en/misc) @@ -9,6 +9,47 @@ FR\|[EN](/en/misc) # Divers +## Notes FEniCS (interface Python) + +[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**. + +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. + +Dans la suite, `mesh` correspondra au maillage, et dans les expressions variationnelles, `u` à la fonction inconnue et `v` à la fonction test, et sont des fonctions scalaires, sauf indication contraire. `M` est la matrice de rigidité et `b` le membre de droite du système linéaire associé à la formulation variationnelle, construits avec les fonctions `assemble` ou `assemble_system`. + +- 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 : + +~~~ +n = FacetNormal(mesh) +a = ... + inner(grad(u), n)*v*dx +~~~ +{: .language-python} + +- 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 : + +{% highlight python %} +left_boundary = CompiledSubDomain('on_boundary && near(x[0], x_left)', + x_left=0.5) +{% endhighlight %} + +- Pour visualiser forme de la matrice de rigidité, on peut utiliser la bibliothèque `matplotlib`, et sa fonction `spy`. Puisque le système est *a priori* de grande dimension, on ne peut pas simplement faire appel à `M.vector().array()`, il faut créer une matrice `scipy` creuse. + +{% highlight python %} +import scipy.sparse as sp +import matplotlib.pyplot as plt + +M = assemble(...) + +rows, cols, values = M.data() +sp_M = sp.csr_matrix(values, cols, rows) + +plt.spy(sp_M) +plt.show() # ne pas oublier show pour afficher le graphe +{% endhighlight %} + +[1]: http://fenicsproject.org/ + ## Un blog de Terrence Tao plus lisible Voici [un petit bout](https://gist.github.com/gjankowiak/9692034) de CSS pour nettoyer les posts de blogs et les rendre plus agréables à lire.