English version available here
Le modèle 3D du piston peut être consulté via 3Dviewer
On souhaite calculer une structure 3D consituée de tétraèdres à 4 nœuds.
- Tous les fichiers nécessaires sont disponibles dans le dossier
calculs/piston
. - Un éditeur de fichier (
vim
,gedit
,Notepad++
,Visual Studio Code
...) afin d'éditer les fichiers fournis gmsh
est utilisé pour assurer le maillage.
La pièce étudiée est un piston:
Le fichier piston.step
contient la géométrie au format step issue d'un logiciel de CAO.
Le fichier piston-tet4.geo
est écrit au format gmsh.
-
Ouvrir le fichier
piston-tet4.geo
avec un éditeur de fichier (vim
,gedit
,Notepad++
,Visual Studio Code
...) et aussi avec gmsh. La variableh
définie la taille des éléments. Changer la taille de mailleh
pour mettreh=5
pour tester les programmes. -
Ouvrir
piston-tet4.geo
avecgmsh
:-
A l'aide de la souris, on peut de façon très simple faire tourner le modèle (clic gauche), le déplacer (clic droit) ou faire des zooms (bouton central).
-
Cliquer sur
Mesh; Define; Element size at points
: sélectionner tous les points avec le bouton gauche de la souris en laissant la toucheCtrl
enfoncée: les points doivent apparaitrent en rouge. Valider en tapante
. -
Les
physical groups
ffectent des noms aux éléments et aux nœuds pour pouvoir ensuite leur appliquer des conditions:Geometry
;physical group
;add
;surface
: sélectionner les 2 surfaces suivantes: puis tapere
. -
Définir le volume: cliquer sur
geometry/physical group/add/volume
et sélectionner la boule jaune, puis tapere
.
-
-
Rafraichir la fenêtre de votre éditeur de fichier dans laquelle est ouvert le fichier
piston-tet4.geo
(cliquer surRafraichir
ou rouvrir le fichier). -
Modifier les numéros des "physical groups" du fichier texte
Piston.geo
pour avoir les numéros corrects: 1, 2, 3 et 4 pour les surfaces, et 5 pour le volume. -
Modifier aussi à la fin de
Characteristic Length
le0.1
en -
Sauvegarder votre fichier dans l'éditeur de fichier.
-
Retourner dans la fenêtre
gmsh
puis cliquer surreload
-
Cliquer sur
Mesh; 2D
, le maillage surfacique doit apparaitre (sinon aller danstools/options/mesh/visibility
pour changer les entités affichées). -
Cliquer sur
Mesh; 3D
, le maillage volumique doit apparaitre. -
Dans le menu déroulant File, choisir Export, puis le format
Mesh - Gmsh (*.msh
), et enfinVersion 2 ASCII
dans le menu déroulant. Le maillage est ainsi sauvegardé dans le fichierpiston-tet4.msh
. Le choix d'une mauvaise version de maillage ne permettra pas de poursuivre l'exemple.
NB: le maillage peut également être obtenu via la commande (sur machine UNIX/Linux): gmsh -3 -format msh22 piston-tet4.geo
Programme Python Main-Piston-tet4.py
Ouvrir le fichier Main-Piston-tet4.py
avec un éditeur de fichier (idle
recommandé) ou ouvrir le fichier Main-Piston-tet4.ipynb
dans une instance jupyter
.
-
Partie
Import libraries
:Cette première partie indique à python les librairies spécifiques que l'on va utiliser. En déplaçant le
#
du commentaire, choisir la librairie de calcul au niveau élémentaire:-
Pour une version Python (typiquement pour Windows):
#from SILEXlight import silex_lib_tet4_fortran as silex_lib_elt from SILEXlight import silex_lib_tet4_python as silex_lib_elt
-
Pour une version avec une librairie Fortran compilée:
from SILEXlight import silex_lib_tet4_fortran as silex_lib_elt #from SILEXlight import silex_lib_tet4_python as silex_lib_elt
-
-
Partie
USER PART: Import mesh, boundary conditions and material
:-
La variable
MeshFileName
indique le nom du fichier maillage de provenant de gmsh (sans l'extension.msh
). -
La variable
ResultsFileName
indique le nom du fichier dans lequel les résultats sont écrits (sans l'extension.msh
). -
La variable
eltype
ndique le type d'éléments que l'on utilise: 4 pour les tétraèdres à 4 nœuds. Les autres types d'éléments sont détaillés dans la librairiesilex_lib_gmsh.py
-
La variable
ndim
ndique la dimension de la géométrie: 2 pour 2D, 3 pour 3D. -
La variable
flag_write_fields
indique le type de résultats que l'on souhaite écrire dans le fichier résultat:- 1 pour tous les champs,
- 0 pour une sortie courte,
- D'autres valeurs peuvent être définies à la fin du fichier
Main-Piston-tet4.py
.
-
La routine
ReadGmshNodes
de la librairiesilex_lib_gmsh
permet d'importer les coordonnées des nœuds depuis le fichier de maillage dans le tableaunodes
.Utilisation:
nodes=silex_lib_gmsh.ReadGmshNodes('mymesh.msh', 2 ou 3)
-
La routine
ReadGmshElements
de la librairiesilex_lib_gmsh
ermet d'importer la table de connectivité des éléments depuis le fichier de maillage dans le tableauelements
, les numéros des nœuds correspondants sont stockés dans le tableauIdnodes
.Utilisation:
elements,Idnodes=silex_lib_gmsh.ReadGmshElements('mymesh.msh',element_type,physical_group)
-
Une fois le maillage volume importé, on utilise la routine
ReadGmshElements
pour importer les maillages surfaciques de triangles à 3 nœuds (type d'élément 2) des surfaces fonctionnelles du calcul:elementsS1
àelementsS4
etIdnodeS1
àIdnodeS4
. -
Afin de vérifier si les maillages sont bien importés, on peut les écrire dans un fichier au format gmsh à l'aide de la routine
WriteResults
routine de la librairiesilex_lib_gmsh
.Utilisation:
silex_lib_gmsh.WriteResults('checkmesh.msh',nodes,elements,element_type)
-
La variable
Young
indique le module d'Young, ici 200000 MPa pour de l'acier. -
La variable
nu
ndique le coefficient de Poisson, ici 0.3 pour de l'acier. -
Les noeuds bloqués dans la direction
x
sont indiqués dans le tableauIdNodesFixed_x
(iciIdnodeS3
), ceux bloqués dans la directiony
dans le tableauIdNodesFixed_y
(iciIdnodeS1
), enfin ceux bloqués dans la direction z dans le tableauIdNodesFixed_z
(iciIdnodeS2
). -
On utilise dans le programme les numérotations suivantes:
-
Numérotation locale:
Numérotation des ddls au niveau local
Noms des inconnues Indexage Python Indexage Fortran Ux1 0 1 Uy1 1 2 Uz1 2 3 Ux2 3 4 Uy2 4 5 Uz2 5 6 Ux3 6 7 Uy3 7 8 Uz3 8 9 Ux4 9 10 Uy4 10 11 Uz4 11 12 -
Numérotation globale:
Numérotation des ddls au niveau global
Noms des inconnues Indexage Python Indexage Fortran Ux1 0 1 Uy1 1 2 Uz1 2 3 Ux2 3 4 Uy2 4 5 Uz2 5 6 .... .... .... Uxi (i-1)*3 (i-1)*3+1 Uyi (i-1)*3+1 (i-1)*3+2 Uzi (i-1)*3+2 (i-1)*3+3 .... .... .... Uxn (n-1)*3 (n-1)*3+1 Uyn (n-1)*3+1 (n-1)*3+2 Uzn (n-1)*3+2 (n-1)*3+3
-
-
La face supérieure est soumise à une pression de 10MPa (100bar). Les éléments triangles constituants cette surface sont dans le tableau
elementsS4
.
La routineforceonsurface
de la librairiesilex_lib_tet4
(renomméesilex_lib_elt
)ermet de calculer les forces aux nœuds dues à une force surfacique de normepress
dans la directiondirection
:Utilisation:
F = silex_lib_elt.forceonsurface(nodes, <surface_elements_where_the_load_is_applied>, press, direction)
Si la direction vaut
[0.0,0.0,0.0]
, alors c'est la normale locale à la surface qui est utilisée, c'est le cas pour une force surfacique due à une pression. Dans ce cas la direction de la normale étant calculée à partir de la numérotation locale des nœuds, elle peut être en sens opposé, il suffit de changer le signe de press pour obtenir une force dans la bonne direction.
-
-
Partie
EXPERT
-
nnodes
: nombre de nœuds. -
ndof
: nombre de degrés de liberté. -
nelem
: nombre d'éléments. -
Fixed_Dofs
: ddl bloqués. -
SolvedDofs
: ddl libres à calculer. -
Q
: déplacements aux nœuds. -
Calcul de la matrice de rigidité et assemblage au format sparse:
Ik,Jk,Vk=silex_lib_elt.stiffnessmatrix(nodes, elements, [Young,nu]) K=scipy.sparse.csc_matrix( (Vk,(Ik,Jk)), shape=(ndof,ndof), dtype=float)
-
Résolution du système en déplacement (on suppose que les déplacements imposés sont nuls, à modifier dans le cas contraire):
Q[SolvedDofs] = scipy.sparse.linalg.spsolve(K[SolvedDofs, :][:, SolvedDofs], F[SolvedDofs])
-
Calcul des contraintes
SigmaElem
etSigmaNodes
(dans les éléments et lissées aux nœuds), des déformationsEpsilonElem
etEpsilonNodes
(dans les éléments et lissées aux nœuds), des contributions des éléments à l'erreurErrorElem
, et enfin de l'erreur en énergie ZZ1ErrorGlobal
:SigmaElem, SigmaNodes, EpsilonElem, EpsilonNodes, ErrorElem, ErrorGlobal = silex_lib_elt.compute_stress_strain_error(nodes, elements, [Young,nu], Q)
-
disp
: déplacements des nœuds écrit sur 3 colonnes (ou 2 en 2D) pour la sortie au format gmsh. -
load
: efforts imposés aux nœuds écrit sur 3 colonnes (ou 2 en 2D) pour la sortie au format gmsh. -
fields_to_write
: liste python des champs à écrire dans le fichier résultat. Voir routineWriteResults
de la librairiesilex_lib_gmsh
pour plus de détails.
-
-
Diminuer la taille des éléments en effectuant plusieurs calculs, par exemple
h=5
,h=3
,h=1
et en changeant le nom du fichier de résultats. Diminuer la taille jusqu'à la limite mémoire de l'ordinateur. -
Noter les temps de calcul, le nombre de nœuds et le nombre d'éléments, puis comparer les résultats
-
Utiliser le fichier
plot_convergence.py
pour tracer les courbes suivantes:- Tracer l'évolution du déplacement en fonction du nombre de noeuds
- Tracer l'évolution de la contrainte de Von Mises maximum, non lissée et lissée en fonction du nombre de nœuds
- Tracer l'évolution de l'erreur globale en fonction de la taille des éléments (échelle log-log)
- Tracer l'évolution du temps de calcul en fonction du nombre de nœuds (échelle log-log).