65 lines
3.5 KiB
Markdown
65 lines
3.5 KiB
Markdown
---
|
|
layout: default
|
|
math: true
|
|
---
|
|
|
|
FR\|[EN](/en/misc)
|
|
{: .switcher}
|
|
{% include nav_fr.html %}
|
|
|
|
# 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.
|
|
Il est commenté (en anglais) pour pouvoir être adapté à vos besoins. Avec Firefox, il faut utiliser l'extension [Stylish](https://addons.mozilla.org/fr/firefox/addon/stylish/?src=search)
|
|
pour l'utiliser.
|
|
Et comme les maths sont affichés via de simples images, ce qui est moyennement esthétique, voilà [le bout](https://gist.github.com/gjankowiak/9692040)
|
|
de Javascript qui va avec. Il injecte [MathJax](http://www.mathjax.org/) dans la page, après avoir transformé les images en texte utilisable par lui. Pour l'utiliser avec Firefox,
|
|
il faut avoir installé [GreaseMonkey](https://addons.mozilla.org/fr/firefox/addon/greasemonkey/).
|
|
|
|
Voici un aperçu, avant à gauche, après à droite :
|
|
|
|
![before after](/images/misc/tao-before-after.jpg){: .centered_img}
|
|
|