Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


doc:user:tutorials:tuto1

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
doc:user:tutorials:tuto1 [2014/05/07 12:34]
boman
doc:user:tutorials:tuto1 [2016/07/11 16:45]
boemer [Temporal Integration]
Line 1: Line 1:
-====== Premier cas-test ======+ 
 +====== How to build my own FE model? ======
  
  
Line 7: Line 8:
  
  
-Je suppose dans cette section que vous avez suivi et compris le document [[doc:user:tutorials:tuto0]]. Vous savez donc utiliser l'[[doc:user:general:glossaire#interpréteur]] [[doc:user:general:glossaire#python]] de manière basique.  +Before reading this page, the document [[doc:user:tutorials:tuto0]] must be read and understoodIn other wordsyou must be able to use a [[doc:user:general:glossaire#Python]] [[doc:user:general:glossaire#interpreter]] in a basic way
- +
- +
- +
-Sur cette pageje décris, ligne après ligne, les étapes qui mènent à la mise au point d'un [[doc:user:general:glossaire#module]] python (ou [[doc:user:general:glossaire#jeu de données]]) permettant d'écraser un bloc de matière par un poinçon (matrice de contact) cylindrique en état plan de déformationUn aperçu de la déformée finale: +
- +
- +
  
 +In the following document are described, line after line, the steps leading to the development of a input file where a cylindrical die will crush a block of material in plane strain. Here is a preview of the final deformation.
  
 <html> <html>
Line 27: Line 22:
 \\ \\
  
 +Since Metafor is continuously improved and modified, the syntax of some commands may have slightly changed since the writing of this documentation. However, this input file is part of the [[doc:user:general:glossaire#batterie|test battery]], so a working file corresponding to your version of Metafor can be found in ''apps\tutorials\tutorial1.py''.
  
  
-Vu que Metafor est en constante évolution, il est possible que la syntaxe de certaines commandes ait changé. Ce test fait partie de la [[doc:user:general:glossaire#batterie|batterie de tests]] de Metafor et évolue au fil des mises à jour. L'utilisateur peut voir la version la plus récente (correspondant à sa version) dans ''apps\tutorials\tutorial1.py''.+===== Input-file Description =====
  
 +A Metafor input file is a Python module which defines an object called ''Metafor''. This main object will be retrieved and used by the GUI once the user presses the blue PLAY button. The image below shows a schematic organization of a module and the hierarchical structure of the various objects that will be involved in the test case.
  
 +{{ doc:user:objets-metafor.png?400 |Click to enlarge the picture}}
  
 +To sum up, one input file = one (or several) Python files = one Metafor object. 
  
 +==== Heading ====
  
- +The module usually begins with some Python comments (preceded by " '' # '' ") .
- +
-===== Description du jeu de données ===== +
- +
- +
- +
-Un jeu de données Metafor est un module python définissant un objet "analyse" (nommée ''Metafor''). Cet objet va être récupéré et manipulé par la commande ''meta'' que l'utilisateur entre en ligne de commande. L'image ci-dessous résume shématiquement l'organisation d'un module et la structure hiérarchique des différents objets qui vont intervenir dans un problème.  +
- +
- +
- +
-{{ doc:user:objets-metafor.png?400 |Cliquez pour agrandir...}} +
- +
- +
- +
-__En résumé:__ un jeu de données = un (ou plusieurs) fichiers python = un objet ''Metafor''.  +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
-==== Entête ==== +
- +
- +
- +
-Le module débute avec quelques commentaires (précédés de "''#''").  +
- +
  
   # -*- coding: latin-1; -*-   # -*- coding: latin-1; -*-
Line 74: Line 42:
   # Tutorial   # Tutorial
  
- +The line "coding" is required if we want to use accented characters in python. The "SVN tag" ''$Id$'' (optionalallows us to know the version of this file.
- +
-La ligne "coding" permet d'utiliser des caractères accentués sous python. Le "tag CVS" $Id$ (facultatifpermet de connaître la version de ce fichier. +
- +
  
   from wrap import *   from wrap import *
   import math   import math
  
- +The first line imports the Python/C++ interface of Metafor (called ''wrap''in the current namespace, so that all compiled C++ objects of Metafor are available in Python. 
- +  
-Comme tous les [[doc:user:general:glossaire#cas-tests]] de Metafor, notre [[doc:user:general:glossaire#module]] importe tous les modules de Metafor dans son espace de nom. Grâce à cela, les [[doc:user:tutorials:tuto0#objets]] de Metafor peuvent être utilisés sans être préfixés par "''wrap''" (''wrap'' = wrapper littéralement "emballeur"). Il sera donc possible par exemple de parler de la classe ''Domain'' et non ''wrap.Domain''. On importe également le module ''math'' de python (pour calculer plus loin des sinus et cosinus). +The ''math'' module is also imported, in this case, to use the sine and cosine functions later.
- +
  
   metafor = Metafor()   metafor = Metafor()
   domain = metafor.getDomain()   domain = metafor.getDomain()
  
 +The main object of the module is now created as an instance of the ''Metafor'' class. This command ''Metafor()'' creates an [[doc:user:tutorials:tuto0#objets|object]] Metafor, from which we can extract a ''Domain''. The domain is a container (see [[doc:user:general:références#References]]). It contains all objects that are required by the model (geometry, elements, nodes, fixations and other boundary conditions, materials, ...).
  
- +The analysis will then handle data from this domain tofor exampleintegrate temporally over its evolution equations
-On crée ensuite l'objet principal du module. Il s'agit d'un objet de type ''Metafor''. Chaque modèle numérique traité par Metafor est articulé autour d'une analyse ''Metafor''. Pour l'instant, il n'existe qu'un seul type d'analyse appartenant au LTAS-MN2L (d'autres sont fournies par [[doc:user:general:glossaire#Oofelie]] mais ne sont pas compilées dans l'exec de Metafor). Cette commande crée donc un [[doc:user:tutorials:tuto0#objets|objet]] Metafor. A partir de l'analyse ''metafor'' on peut en extraire un ''Domain''. Le domaine est un conteneur (voir [[doc:user:general:références]]). Il contient tous les objets nécessaires au modèle (géométrie, liste d'éléments, noeuds, fixations et autres conditions aux limites, liste de matériaux, etc). +
- +
-L'analyse se charge de manipuler les données du domaine pourpar exempleintégrer temporellement ses équations d'évolution +
  
  
-La seule [[doc:user:tutorials:tuto0#fonctions|fonction]] du [[doc:user:general:glossaire#module]] nécessaire au bon fonctionnement de Metafor est la fonction ''getMetafor()'' qui doit retourner l'analyse du module (''metafor'')Elle sera appelée par la fonction de démarrage de Metafor (fonction ''meta'').+The only [[doc:user:tutorials:tuto0#fonctions|function]] of the [[doc:user:general:glossaire#module]] that Metafor requires to work properly is the function ''getMetafor()'' which must return the analysis, ''metafor''This function is automatically called during the initialization when using the command ''meta''.
  
  
Line 108: Line 67:
  
  
-Le paramètre ''p'' est un dictionnaire facultatif utilisé pour les études paramétriques.+The parameter ''p'' is an optional dictionary used for parametric studies.
  
  
Line 114: Line 73:
  
  
-==== Paramètres ====+==== Parameters ====
  
 +Parameters should always be used instead of numbers, to easily modify the model. Indeed, one [[doc:user:general:glossaire#Finite Element]] simulation alone hardly has any meaning, the solution must be checked by varying numerical parameters. For this reason, all parameters are gathered in the beginning of the module, to modify them easily.
  
- 
-Il est souvent très utile de paramétrer un modèle pour pouvoir facilement modifier des grandeurs. Il faut toujours préférer des paramètres que des valeurs écrites "en dur". En effet, un calcul [[doc:user:general:glossaire#EF]] n'a jamais de sens s'il est effectué tout seul. Il faut toujours vérifier la solution en faisant varier les paramètres numériques. Ces paramètres peuvent être regroupés en début de fichier comme ici pour pouvoir être facilement modifiés.  
  
  
Line 129: Line 87:
  
  
-On définit 4 paramètres la longueur et la largeur du rectangle à mailler et le nombre de mailles dans les 2 directions. +Four parameters are definedthe length and width of the rectangle to mesh, and the number of mesh elements in the two directions.
  
  
Line 137: Line 95:
  
  
 +==== Geometry ====
  
  
-==== Géométrie ==== 
- 
- 
- 
-On va ensuite créer une géométrie "utilisateur" (par opposition à la géométrie du maillage qui sera générée automatiquement lors de la création des mailles). Pour y arriver, on va récupérer une [[doc:user:general:References|référence python]] vers l'objet "géométrie" (de type ''Geometry'') du domaine que nous venons de créer: 
  
 +Now, a "user" geometry is defined (in opposition to a "mesh" geometry, which will be automatically generated when meshing the part). To do so, a [[doc:user:general:References|Python reference]] pointing towards the "geometry" object (type ''Geometry'') is retrieved from the just-created domain.
  
  
   geometry = domain.getGeometry()   geometry = domain.getGeometry()
-  geometry.setDimPlaneStrain()+  geometry.setDimPlaneStrain(1.0)
  
  
- +The first line retrieves the reference from the domainThe second line sets the type of geometryHere, plane strain is chosen, but axisymmetric or 3D are also possible (see [[doc:user:general:cmdsprelim|Structure of a Metafor module]]).
-La première ligne récupère la référence en faisant la demande au domaineLa seconde ligne fixe le type de géométrieIl s'agit de l'état plan de déformation (ce pourrait être axisymétrique ou 3D -- voir [[doc:user:general:cmdsprelim]]). +
  
  
 {{ doc:user:topo_brep.gif |Geometrie B-REP}} {{ doc:user:topo_brep.gif |Geometrie B-REP}}
-<note>TODO : Schéma en anglais par cohérence avec les notations</note>+<note>TODO : Schéma en anglais</note>
  
  
-La création d'une géométrie suit toujours le même schéma (voir figure ci-dessus). Il faut savoir qu'on utilise, dans Metafor, une représentation de type B-REP (Boundary Representationsimplifiée pour laquelle chaque entité est définie comme étant un ensemble des entités de niveau inférieur. L'objet  ''[[doc:user:geometry:user:volumes|Volume]]'', l'entité 3D de plus haut niveauest constitué d'une ou plusieurs ''Skins'' (peaux)une skin externe (première skin) et un éventuel ensemble de trousUne ''[[doc:user:geometry:user:peaux|Skin]]'' est constituée d'un ensemble ordonné de ''Sides'' (faces)Une ''[[doc:user:geometry:user:faces|Side]]'' est un ensemble de ''Wires'' (contours): un wire externe et un éventuel ensemble de trous. On associe également une ''[[doc:user:geometry:user:surfaces|Surface]]'' à la ''Side''Un ''[[doc:user:geometry:user:contours|Wire]]'' est un ensemble ordonné de ''Curves'' (courbes) et d'objets dérivés (''Line'', ''Arc'', ...). Enfinune ''[[doc:user:geometry:user:courbes|Curve]]'' est un ensemble de ''[[doc:user:geometry:user:points|Points]]'', qui sont les entités de base de la géométrie +Defining a geometry always follows the same pattern (see figure above). In Metafor, a simplified Boundary Representation (B-REP) is used, where each entity is defined as a set of lower level entities: 
- +    * The ''[[doc:user:geometry:user:volumes|Volume]]'' objectthe 3D entity of highest levelconsists of one or several ''Skins''one external one and a set of holes 
-Pourquoi parle-t-on de B-REP simplifié (voir figure ci-dessous)? Parce que les concepts géométriques et topologiques sont mélangés pour les curves et les points. En effet, une curve devrait être définie comme une arête constituée de 2 sommets à laquelle on associe une géométrie. +    * A ''[[doc:user:geometry:user:peaux|Skin]]'' consists of an ordered set of ''Sides''. 
 +    * A ''[[doc:user:geometry:user:faces|Side]]'' is a set of ''Wires'', an external one and a set of holes (We also associate a ''[[doc:user:geometry:user:surfaces|Surface]]'' to a ''side'') 
 +    * A ''[[doc:user:geometry:user:contours|Wire]]'' is an ordered set of ''Curves'' and other derived objects (''Line'', ''Arc'', ...).  
 +    * Finally''[[doc:user:geometry:user:courbes|Curve]]'' is a set of ''[[doc:user:geometry:user:points|Points]]'', which are the entities of lowest level.
  
 +This is called a simplified B-REP (see figure below) because geometric and topological concepts are mixed for curves and points. In a traditional B-REP, a curve would be defined as an edge consisting of two vertices, to which a geometry is associated.
  
 {{ doc:user:topo_metafor.gif |B-REP Simplifié (Métafor)}} {{ doc:user:topo_metafor.gif |B-REP Simplifié (Métafor)}}
  
-A chaque entité géométrique est associé un ensemble (''Set'')Ainsil'objet ''Point'' se "range" dans un ''PointSet''Les ensembles géométriques sont contenus dans la géométriePour y accéderon utilise, comme plus haut, une fonction de type ''get*()''+To each geometric entity is associated a ''Set''Thusthe objects ''Points'' are gathered in a ''PointSet'', the objects ''Curves'' in a ''CurveSet''... All these sets are included in the object ''Geometry''. To access thema function ''get*()'' is used (''getPointSet()'', ...).
- +
- +
- +
-La définition des objets dans les ensembles se fait par deux techniques en fonction de la taille de l'objet à créer: +
  
  
-  * Pour les objets de petite taille qui demandent peu de paramètres pour être totalement définis (les ''[[doc:user:geometry:user:points|]]'' mais aussi les [[doc:user:conditions:displacements|fixations]], par exemple), on utilise une fonction membre ''set.define()''.+Geometric objects can be defined in two waysdepending on their size and complexity :
  
-  * Pour les objets qui nécessitent plus d'arguments, on crée un objet temporaire, on le remplit et on le copie dans l'ensemble (voir plus loin, lors de la définition des curves par exemple). 
  
 +  * Small objects which require few parameters to be defined, like ''[[doc:user:geometry:user:points|]]'' or [[doc:user:conditions:displacements|fixations]], are defined with the function ''set.define()''.
  
 +  * Bigger objects which require more arguments, like curves, are defined using a temporary object, which is filled and copied. For example, a curve is created by first defining a line (see below).
  
-Icipour les ''[[doc:user:geometry:user:points]]'', la première méthode est disponibleLe premier argument est un numéro utilisateur (strictement positif et unique pour chaque ensemble) et les 3 suivants sont les coordonnées $x, y \mbox{ et } z$. Comme on s'est placé en état plan de déformationle plan de travail est le plan par défaut $z=0$ et seules les coordonnées $x$ et $y$ sont fournies.+In this example, ''[[doc:user:geometry:user:points]]'' are defined with the first methodi.e. with the "define"-function. The first argument is a user number, which must be strictly positive and different for each entity in a common set. The next three arguments are the spatial coordinates $x$$y$ and $z$. Since the geometry was set to plane strainthe default plane $z=0$ is considered and only $x$ and $y$ are given.
  
  
Line 198: Line 150:
  
  
-Nous continuons ensuite par les objets ''[[doc:user:geometry:user:courbes|Curves]]'':+Next, the ''[[doc:user:geometry:user:courbes|curves]]'' are defined:
  
  
Line 210: Line 162:
  
  
 +The first line retrieves a reference pointing towards the set of all curves, named ''CurveSet''. Curves can be of different types (lines, arcs, ...) and sometimes quite complex (''Nurbs''), therefore the second method is used: creating the object, then adding it to the set. The function ''Line'' requires three argument, a user number and the two end points, when the function ''Arc'' requires three points.
  
-La première ligne récupère une référence vers l'ensemble des curves, le ''CurveSet''Puisque les curves utilisées par Metafor peuvent être de nombreux types et parfois très complexes (''Nurbs''), on utilise ici la deuxième façon d'enrichir un ensemble par la création d'un objet suivie de l'ajout de cet objet dans l'ensembleLes objets ''Line'' (segment de droite) se définissent par un numéro et les points des deux extrémités. Un ''Arc'' utilise 3 points.+The arc is defined to model a [[doc:user:general:glossaire#contact matrix]]Thereforeits orientation matters and must be defined with "area on the left"This means that, if the arc is followed in the way given by the succession of its points, the die will be on the left hand side.
  
  
  
-Il faut remarquer également que l'arc de cercle est destiné à modéliser une [[doc:user:general:glossaire#matrice de contact]]. Son orientation a donc de l'importance: il doit être défini "aire à gauche" (la matière du poinçon est à gauche si on parcourt le cercle dans le sens défini par la succession de ses points). +After the curves come the ''[[doc:user:geometry:user:contours|wires]]'':
- +
- +
- +
-Suivent les ''[[doc:user:geometry:user:contours|Wires]]'':+
  
  
  
   wireset = geometry.getWireSet()   wireset = geometry.getWireSet()
-  wireset.add( Wire(1, [curveset(1), curveset(2), curveset(3), curveset(4)]) )+  wireset.add(Wire(1, [curveset(1), curveset(2), curveset(3), curveset(4)]))
  
  
  
-Même méthode pour le wire constitué des 4 lignesCelles-ci sont spécifiées par le [[doc:user:general:glossaire#tuple]] python ''[curveset(1), curveset(2), curveset(3), curveset(4)]''.+Wires are defined in the same way as curvesTwo arguments are required, the user number and the Python [[doc:user:general:glossaire#tuple]]''[curveset(1), curveset(2), curveset(3), curveset(4)]'', which contains the curves.
  
- +Finally, the highest order element for a 2D casethe ''[[doc:user:geometry:user:faces|side]]'', is also defined with the second method (create object then add it to the container ''WireSet'').
- +
-Nous passons au dernier niveau pour un test 2D, la ''[[doc:user:geometry:user:faces|Side]]'':+
  
  
Line 241: Line 188:
  
  
-La méthode utilisée est identique (création de l'objet et ajout dans le conteneur correspondant ''WireSet''). A ce stadeil est souvent utile de vérifier si la géométrie est correctePour ce fairel'utilisateur de Metafor possède les outils de visualisation du module ''wrap'' (que nous avons importés au début du fichier). Il suffit d'ajouter ces lignes: +At this point, the whole geometry is definedso it is recommended to check whether this was done properlyTo do soviewing tools coming from the ''wrap'' module can be used (this module was imported at the very beginning), with the command lines:
- +
  
   if 1:   if 1:
Line 251: Line 196:
       win.open()       win.open()
  
 +With these lines, a new ''VizWin'' object (graphical window) named ''win'' is created. The points and curves are added to this object. The function ''open()'' finally opens the window.
  
 +These lines are included in a "''if'' block", easy to activate and deactivate by replacing the 1 by a 0 and vice versa. 
  
-de lancer metafor et d'importer le module (ou le charger à l'aide de l'interface graphique): 
  
 +To view the geometry, Metafor must be run and the module loaded with the GUI or imported with the command
  
  
   import apps.qs.tutorial    import apps.qs.tutorial 
- 
- 
- 
-On a créé un objet de type ''VizWin'' (fenêtre graphique) nommé ''win''. On y ajoute ensuite ce qu'on veut visualiser (ici, les points et les curves). La fonction ''open()'' ouvre la fenêtre. 
- 
-Nous avons mis ces objets dans un "bloc ''if''" facile à activer et désactiver (il suffit de remplacer le 1 par 0 pour supprimer l'affichage tout en gardant la possibilité de le réactiver plus tard). 
- 
  
  
Line 270: Line 210:
  
  
 +Another way to check the geometry is with the function ''print''. For instance, ''print geometry'' gives a summary of the contents of the container ''Geometry''.
 +==== Mesh ====
  
-Une autre manière de vérifier la géométrie est l'utilisation de la fonction ''print''. Par exemple, ''print geometry'' donne un résumé du contenu de la géométrie. 
- 
-==== Maillage ==== 
- 
- 
- 
-Nous passons maintenant au maillage de la géométrie. Puisque Metafor définit la totalité des conditions aux limites sur la géométrie, il serait tout à fait possible de mailler la structure à la fin du module. L'utilisateur doit bien comprendre qu'il ne sera jamais amené à manipuler ni le maillage ni des noeuds ni des éléments. Il est toujours beaucoup plus intelligent de se référer toujours à la géométrie utilisateur. En effet, le nombre de mailles est généralement le paramètre que l'on modifie en premier lieu (pour vérifier la solution obtenue). Si certaines commandes se réfèrent directement à des numéros de noeuds ou de mailles, elles devront être modifiées chaque fois qu'on modifie le maillage. Tout ceci donc pour dire que ce que nous allons faire pourrait se faire à un autre endroit dans le module. 
  
 +Now, the model must be meshed. This could also be done later one, because the boundary conditions are defined based on the user geometry and not on the mesh itself. Indeed, the user will not have to handle neither mesh, elements nor nodes. It is always much better to define boundary conditions based on the user geometry, since the mesh is the first parameter that is usually changed to verify the solution. Therefore, if some conditions are defined based on nodes number, they must be changed every time the mesh is refined. All of this to say that meshing the part could be done later on.
  
   SimpleMesher1D(curveset(1)).execute(n1)   SimpleMesher1D(curveset(1)).execute(n1)
Line 287: Line 223:
  
  
 +As could be seen above, an object in a set is accessed with the use of parentheses (there is one exception regarding the [[doc:user:elements:general:materials|list of materials]], and old [[doc:user:general:glossaire#Oofelie]] object still requiring brackets). For example, a [[doc:user:general:references|reference]] towards curve 2 is retrieved with the line ''curveset(2)''.
  
-A ce stade, il faut savoir que, pour accéder à un objet dans un ensemble, il faut utiliser l'opérateur parenthèse (la seule exception est la [[doc:user:elements:general:materials|liste des matériaux]] qui est un vieil objet [[doc:user:general:glossaire#Oofelie]] et qui utilise toujours les crochets). On obtient donc une [[doc:user:general:references|référence]] vers la courbe numéro 2 en tapant ''curveset(2)''. 
- 
- 
- 
-Les mailleurs ([[doc:user:geometry:mesh:1d]], [[doc:user:geometry:mesh:2d]]) sont associés à l'entité que l'on veut mailler et exécutés par la commande ''execute()''. Pour la face 1, nous utilisons le [[doc:user:geometry:mesh:2d|mailleur intégré MIT]] (Méthode d'Interpolation Transfinie) qui convient pour des faces à topologie quadrangulaire dont le nombre d'éléments des lignes en vis-à-vis est égal. 
  
  
 +The meshers ([[doc:user:geometry:mesh:1d|1D Mesher]], [[doc:user:geometry:mesh:2d|2D Mesher]]) are linked to the entity that must be meshed and executed with the command ''execute()''. For face 1, the [[doc:user:geometry:mesh:2d|integrated mesher TIM]] (Transfinite Interpolation Method), suitable for quadrangles where two opposite edges have the same numbers of elements, is used.
  
-Tout comme nous avons vérifié la géométrie utilisateuril est possible de vérifier visuellement la géometrie du maillage en créant une fenêtre ''VizWin'' de la manière suivante:+As for the geometryit is recommended to visually check whether the geometry was meshed properly by opening a ''VizWin'' window with the following lines :
  
  
Line 309: Line 242:
  
  
-La géométrie à afficher est appelée "mesh" (la [[doc:user:general:glossaire#mesh|géométrie du maillage]] contient aussi les relations de voisinage).+The geometry to display is called "mesh" (the [[doc:user:general:glossaire#mesh|mesh geometry]] also contains neighboring relations).
  
  
Line 316: Line 249:
  
  
 +It is also possible to use the function ''print'' to display a list of all mesh elements, edges and vertices.
  
-Il est possible également d'utiliser la fonction ''print'' pour afficher la liste des mailles, des arêtes et des sommets. 
  
  
  
  
-==== Définition des éléments volumiques ====+==== Defining volume elements ====
  
 +Now that the geometry is defined, physical properties must be assigned to the domain, by associating ([[doc:user:general:glossaire#ef|Finite Elements]]) to the mesh. Here, 2D-[[doc:user:general:glossaire#volume elements]] will be used.
  
- +=== Material ===
-Nous allons maintenant définir la physique du problème en commençant par informer le domaine des entités physiques ([[doc:user:general:glossaire#ef|éléments finis]]) à associer au maillage. Dans ce cas-ci, nous voulons des [[doc:user:general:glossaire#éléments de volume]] 2D sur les mailles qui viennent d'être créées. +
- +
- +
- +
-=== Materiau === +
- +
- +
- +
-Définissons tout d'abord le comportement volumique du bloc. Ceci peut être fait par la [[doc:user:elements:general:materials|définition de matériaux]]. L'ensemble des matériaux du problème se trouve dans le domaine.+
  
  
 +First, the volume behavior of the block which is to be crushed is defined. This is done by [[doc:user:elements:general:materials|defining a material]]. The set of all materials can be found in the domain.
  
   materialset = domain.getMaterialSet()   materialset = domain.getMaterialSet()
Line 345: Line 271:
   materialset(1).put(YIELD_NUM,             1)   materialset(1).put(YIELD_NUM,             1)
  
- +A law to model hardening is also required. This law must be defined in the set ''MaterialLawSet'', also found in the domain
- +
-Nous avons également besoin d'une loi d'écrouissage (à définir dans l'ensemble des lois d'écrouissages (''MaterialLawSet'' qui se trouve également dans le domaine): +
  
  
Line 357: Line 280:
  
  
 +When looking at the commands above, [[doc:user:elements:general:materials|defining a material]] is done by calling the ''MaterialSet'' function named ''define()'', with the material number and type as arguments. Here, the elastic plastic material named ''EvpIsoHHypoMaterial'' is chosen.
  
-On constate que [[doc:user:elements:general:materials|créer un matériau]] revient à utiliser la fonction ''define()'' de ''MaterialSet'' en fournissant le numéro et le type du matériau (icic'est un matériau élasto-plastique nommé ''EvpIsoHHypoMaterial''). +A reference point towards the newly created object can be retrieved with the parenthesis operator (materialset1 = materialset(1)), but this reference is also supplied by the function ''define()'' (materialset1 = materialset.define (1, EvpIsoHHypoMaterial)). 
  
-Une [[doc:user:general:references|référence]] vers l'objet créé dans son ensemble peut être récupérée à l'aide de l'opérateur "parenthèse" (materialset1 = materialset(1))mais notons aussi que la fonction ''define()'' renvoie cette même [[doc:user:general:references|référence]]. On utilise alors la fonction membre "''put()''" du matériau pour définir l'ensemble des paramètres requis (module de Young, densitéetc).+After defining the type of materialthe material function ''put()'' is used to define the required parameters, such as Young Modulusdensity...
  
-En particulieron associé une loi d'écrouissage grâce au code ''YIELD_NUM'')cette loi est définie de manière similaire à un matériau dans l'ensemble ''MaterialLawSet''Les paramètres sont ici une limite élastique (''IH_SIGEL''et un taux d'écrouissage linéaire (''IH_H''). Chaque matériau et loi ont des codes qui leur sont propres. +With this function, a hardening law was also associated to the material using the ''YIELD_NUM'' codeThis law is defined in the same way as a material, in the set named ''MaterialLawSet'' (retrieving a reference from the domain, defining the law, then assigning its parameters)Here, a linear isotropic hardening is assumed, so the required parameters are the yield stress (''IH_SIGEL''and the hardening coefficient (''IH_H''). Each law and material have their own codes.
- +
- +
- +
-=== Propriétés élémentaires === +
- +
- +
- +
-Avant de définir les éléments finis, on a besoin de créer un objet [[doc:user:elements:general:start|"propriétés élémentaires"]] (objet ''ElementProperties'') pour associer les futurs éléments au matériau que nous venons de créer:+
  
 +=== Element Properties ===
  
 +Before defining Finite Elements, an object called ''[[doc:user:elements:general:start|ElementProperties]]'' must be defined. This ''ElementProperties'' will link the newly defined materials to these Finite Elements.
  
   prp1 = ElementProperties(Volume2DElement)   prp1 = ElementProperties(Volume2DElement)
   prp1.put(MATERIAL, 1)   prp1.put(MATERIAL, 1)
   prp1.put(CAUCHYMECHVOLINTMETH, VES_CMVIM_SRIPR)   prp1.put(CAUCHYMECHVOLINTMETH, VES_CMVIM_SRIPR)
 +  
 +It is when defining an Element Properties that the desired type of Finite Element is specified. Here, the type ''Volume2DElement'' is chosen, but other possibilities exist. For example, the thermomechanical ''TmVolume2DElement'' could also be used if heat transfer was significant.
  
 +It is also at this point that the use of the selective SRI integration with pressure report is set, to avoid locking.
  
  
-On en profite pour spécifier à ce niveau qu'on veut effectuer une sous-intégration sélective de type SRI avec report de pression pour éviter le locking. La [[doc:user:elements:general:def_element_properties|définition]] d'un ''ElementProperties'' permet de spécifier le type d'élément volumique voulu (c'est ici qu'on pourrait par exemple un élément thermomécanique au lieu de l'élément mécanique ''Volume2DElement''). +=== Element Generator - FieldApplicator ===
- +
- +
- +
-=== Générateur d'éléments le FieldApplicator === +
- +
- +
- +
-Il faut enfin ajouter un générateur d'éléments (on appelle ce type d'objet "[[doc:user:general:glossaire#interaction|interaction]]" dans Metafor). Le générateur d'éléments volumique s'appelle ''FieldApplicator'':+
  
 +Finally, an element generator is used to apply the newly defined Element Properties to the meshed geometry. In Metafor, these objects are called [[doc:user:general:glossaire#interaction|interactions]]". The generator in charge of volume elements is the ''FieldApplicator''
  
   app = FieldApplicator(1)   app = FieldApplicator(1)
Line 398: Line 312:
  
  
 +The ''FieldApplicator'' has a user number, and is defined in the set ''InteractionSet'', which can also be found in the domain. 
  
-Le ''FieldApplicator'' un numéro et s'ajoute dans l'objet ''InteractionSet'' du domaineIl est nécessaire de spécifier l'entité géométrique maillée sur laquelle vont être créés les futurs éléments finis. La création des éléments est toujours associée à une entité géométrique du problème. On ne va donc pas appliquer les [[doc:user:#EF]] sur les mailles mais plutôt sur la géométrie utilisateurLes liens entre mailles et EF seront effectués en interne dans Metafor.+Then, this element must be applied to part of the meshed geometry, with the command ''push()'' (here to sideset(1))Generating Finite Elements is always associated to a geometric entity, not to the mesh itselfLinking the mesh to the Finite Elements is internally done by Metafor.
  
 +Afterwards, the Element Properties is added to the interaction, with the command ''addProperty()''.
  
 +Before going further, a "''print interactionset''" should be run to display all interactions (see [[doc:user:elements:volumes:volumeinteraction]]).
  
-Le lien entre l'interaction et le ''ElementProperties'' se fait avec la commande ''addProperty()''. 
  
 +==== Boundary Conditions ====
  
 +=== Fixed end ===
  
-Pour voir si tout s'est bien passéil est peut être utile d'effectuer un "''print interactionset''" pour afficher le contenu de l'ensemble des interactions du domaine. Pour plus de détails, voir [[doc:user:elements:volumes:volumeinteraction]]. +Nowthe boundary conditions are considered. The set which handles all boundary conditions commands is called the ''LoadingSet''.
-==== Conditions limites : Fixations & déplacements imposés ====+
  
-=== Fixations === +The X component of line 4 and the Y component of line 1 must be [[doc:user:conditions:displacements|fixed]], by symmetry.
- +
-Passons aux conditions aux limites. L'ensemble gérant les commandes de condition limites est le ''LoadingSet'' (ensemble des chargements). +
- +
-Nous voulons [[doc:user:conditions:displacements|fixer]] la composante X de la ligne 4 et la composante Y de la ligne 1 (plans de symmétrie)+
  
  
Line 421: Line 334:
   loadingset.define(curveset(1), Field1D(TY,RE))   loadingset.define(curveset(1), Field1D(TY,RE))
  
 +In these lines, the object ''Field1D'' passed in argument is a code which designates the degree of freedom which must be fixed. Here, ''TX,RE'' stands for "**T**ranslation along **X**", **RE**lative value, which is the displacement along X.
  
  
-Dans ces commandes, L'objet ''Field1D'' passé en argument est un code qui désigne le degré de liberté qu'on veut fixer. En particulier, ''TX,RE'' signifie "**T**ranslation selon **X**", valeur **RE**lative; c'est-à-dire le déplacement. 
  
 +=== Loadings (non-zero displacement, static load, ...) ===
  
- +In this test casethe motion of the die over time must be describedTo do so, a [[doc:user:general:fonctions|function]] ''d=f(t)'' is defined, for example with the class called ''PieceWiseLinearFunction'' :
-=== Chargements (déplacement non nul, charge statique appliquée, ...) === +
- +
- +
- +
-Dans l'exempleon besoin de décrire la manière dont le poinçon va bouger au cours du temps. Pour cela, on définit une [[doc:user:general:fonctions|fonction]] de type ''d=f(t)''. La classe ''PieceWiseLinearFunction'' permet de générer des fonctions linéaires par morceau: +
  
  
Line 440: Line 348:
  
  
- +This non-zero displacement is defined with the ''LoadingSet'' :
-Le déplacement se définit grace à l'ensemble ''LoadingSet'' du domaine: +
      
  
Line 448: Line 354:
  
  
- +Setting fixed ends or displacements is done in the same way as the definition of points in the geometry, with the single ''define()'' commandFor the non-zero displacement of the diethe geometric entity ''curveset(5)'' is first giventhen the direction ''TY,RE'' (displacement  along ''Y''), the amplitude -0.4 and finally the temporal evolution, with the reference to the function ''fct''This means that the movement will be described with ''d(t) = -0.4 * fct(t) = -0.4 * t''.
-La [[doc:user:conditions:displacements|création des fixations]] et des [[doc:user:elements:contact:rigid_matrices|déplacements]] suit le même schéma que la définition des points de la géométrie: une seule commande ''define()'' suffitIci, pour les déplacements imposés de notre matrice de contacton spécifie l'entité (''curveset(5)'' = courbe 5)la direction (''TY,RE''déplacement selon ''y''), l'amplitude (-0.4) et l'évolution temporelle (référence à la fonction ''fct'')Le mouvement final sera ''d(t) = -0.4 * fct(t) = -0.4 * t''. +
  
 ==== Contact ==== ==== Contact ====
Line 456: Line 360:
  
  
-Le contact est géré par des éléments de contact. Il faut donc définir un nouvel ensemble d'éléments exatement de la même manière que ce que nous avons fait pour les éléments volumiques; c'est-à-dire la définition d'un matériau de contact, un ''ElementProperties'' et un générateur d'éléments (une interaction). +Contact is managed by contact elementsA new set of elements must be defined, in the same way as volume elements : first with a contact materialthen an ''ElementProperties'', and finally with an element generator (interaction).
- +
  
-Le matériau (matériau #2 dans le ''MaterialSet'') définit un contact collant: 
  
 +The material chosen is called ''StickingContactMaterial'' (second material put in ''MaterialSet'') :
  
  
Line 469: Line 371:
   materialset(2).put(PEN_NORMALE, 10000)   materialset(2).put(PEN_NORMALE, 10000)
  
- +Then, the ElementProperties ''Contact2DElement'' links this material to the finite elements to be defined, and set the type of element to generate.
- +
-On crée ensuite des propriétés élémentaires pour lier le matériau aux futurs éléments et définir le type d'éléments à générer (''Contact2DElement''). +
  
  
Line 478: Line 377:
   prp2.put (MATERIAL, 2)   prp2.put (MATERIAL, 2)
  
- +Finally, the element generatorSeveral can be chosendepending on how contact is modeledHere, contact is between a rigid entity, the die, and a deformable entity, the meshed solid. The corresponding generator is called ''RdContactinteraction'', where Rd stands for Rigid-Defo :
- +
-Il existe plusieurs générateurs d'éléments de contactsIcinous voulons un contact entre une entité rigide (le poinçon) et une entité déformable (le solide maillé)Le générateur correspondant s'appelle ''RdContactinteraction'' (RD pour Rigid-Defo) +
  
  
Line 490: Line 386:
   interactionset.add(ci)   interactionset.add(ci)
  
-   +The deformable entity is specified with the command ''push()'', the rigid one with ''setTool()''.
-l'objet déformable est spécifié par un ''push()'' et l'entité rigide par ''setTool()''.+
  
 +It should be noted that the contact interaction number must be different from the ''FieldApplicator'' number defined earlier, since both objects are included in the same set ''InteractionSet''.
 +==== Temporal Integration ====
  
 +The description of this model is now over. What is left to consider is the way the ''Metafor'' analysis, in charge of running the simulation, will integrate the equations temporally.
  
-Notons que l'interaction de contact étant ajouté à l'''InteractionSet''son numéro DOIT être différent de celui du ''FieldApplicator'' (les deux objets sont des interactions...). +Many options are availablehowever the simplest one is chosen herewhich is a quasi-static integration (where the inertia is neglected). What remains to be defined is the temporal interval during which the simulation will be run, and the way the results will be saved (see [[doc:user:integration:general:time_step]]).
-==== Paramètres de l'intégration temporelle ==== +
- +
- +
- +
-La description du modèle étant terminéenous allons maintenant nous occuper de la manière dont l'analyse ''Metafor'', qui lancera et pilotera le calcul, va intégrer les équations.  +
- +
- +
- +
-Beaucoup d'options sont disponibles et nous nous limitons ici au minimum, c'est-à-dire à un test quasi-statique (les forces d'inertie sont négligées). Il reste à spécifier l'espace temporel qui nous intéresse et la manière d'archiver les résultats (voir [[doc:user:integration:general:time_step]]). +
  
  
Line 512: Line 400:
   tsm.setNextTime(1.0, 1, 1.0)   tsm.setNextTime(1.0, 1, 1.0)
  
 +The ''TimeStepManager'' of ''Metafor'' is used to specify the relevant parameters.
  
 +First, the initial time, $t=0$ and the initial time step, $d_t = 0.01 s$ are set using the command ''setInitialTime''. Afterwards, the time step will be adjusted automatically if needed.
  
-On utilise le gestionnaire de pas de temps (objet ''TimeStepManager'') de ''Metafor'' pour spécifier le temps initial (t=0) et le pas de temps initial (dt=0.01s). Ceci-ci initialisera la gestion du pas de temps automatique. La commande ''setNextTime()'' est ensuite utilisée pour spécifier les étapes suivantes du calcul (iciune seule) avec le temps final (t=1s), le nombre d'archivages sur disque voulus (un seul en plus du temps initial - on aura donc 2 archivageset le pas de temps maximum pour cette période (dt=1.0). +Then, the command ''setNextTime()'' is used to specify the next steps of the simulation (hereonly one step corresponding to the final time $t = 1 s$ is considered), the number of times data must be saved on disk (here, only one in addition to the initial configuration, so two saving points), and the maximal time step which can be used during this interval ($d_t = 1.0 s$).
  
  
Line 521: Line 410:
   mim.setMaxNbOfIterations(7)   mim.setMaxNbOfIterations(7)
   mim.setResidualTolerance(1.0e-4)   mim.setResidualTolerance(1.0e-4)
 +  
  
 +Afterwards, the ''MechanicalIterationManager'' is considered (see [[doc:user:integration:general:mim_tim]]). This object sets the parameters of the Newton-Raphson algorithm, used to solve the equilibrium equations. Here, a maximum of 7 mechanical [[doc:user:general:glossaire#iterations]] is set, with the default tolerance of 1.0e-4.
 +==== Curves Extraction  ====
  
- +It is also possible to save some [[doc:user:results:courbes_res|result curves]], which are defined as the temporal evolution of a variable on a given geometric entity
-Nous faisons appel ensuite à l'objet ''MechanicalIterationManager'' (voir [[doc:user:integration:general:mim_tim]]) qui permet de paramétrer l'algorithme de [[doc:user:general:glossaire#Newton-Raphson]] utilisé lors de la résolution des équations d'équilibre. On utilise 7 [[doc:user:general:glossaire#itérations]] au maximum et une tolérance de 1.0e-4 (c'est la valeur par défaut). +
- +
- +
- +
- +
- +
- +
- +
- +
- +
-==== Extraction de courbes ==== +
- +
- +
- +
-Si on veut aller plus loin, il est possible de définir également des [[doc:user:results:courbes_res|courbes de résultats]] sauvées sur disque (variation temporelle de valeurs définies sur la géométrie) +
- +
  
   valuesmanager = metafor.getValuesManager()   valuesmanager = metafor.getValuesManager()
   valuesmanager.add(1, MiscValueExtractor(metafor,EXT_T),'time')   valuesmanager.add(1, MiscValueExtractor(metafor,EXT_T),'time')
-  valuesmanager.add(2, DbValueExtractor(curveset(1), Field1D(TY,GF2)), SumOperator(), 'force') +  valuesmanager.add(2, DbNodalValueExtractor(curveset(1), Field1D(TY,GF2)), SumOperator(), 'force')
- +
- +
- +
- +
- +
-Ces courbes peuvent être visualisées dans ''VizWin'' (c'est-à-dire en temps réel, pendant que le calcul tourne) -- voir [[doc:user:results:viz_courbes]]. +
- +
- +
- +
-La première ligne va chercher le gestionnaire de courbes dans l'analyse Metafor.  +
- +
- +
- +
-La ligne suivante définit la courbe numéro 1 qui va archiver la valeur du temps à chaque pas de temps. +
- +
- +
- +
-On définit ensuite une courbe (de numéro arbitraire 2) qui extrait la valeur ''Field1D(TY,GF2)'' (forces externes) en chaque noeud, en fait la somme et l'écrit sur le fichier nommé ''force''.  +
- +
- +
- +
- +
- +
- +
- +
- +
- +
-===== Lancer le calcul ===== +
  
 +The first line fetches the ''ValuesManager'', in charge of handling the result curves, from the analysis ''Metafor''.
  
 +The second line defines the first curve, which will save the time value at each time step.
  
 +The third line defines a second result curve which extracts the value ''Field1D(TY,GF2)'' (external forces), at each node of the geometric curve 1, then sums all these values and writes it under the name ''force''.
  
-Le calcul se charge par ''load('apps.qs.tutorial')'' si le module est nommé "''tutorial.py''" et se trouve dans le répertoire ''apps/qs''. Ensuiteon démarre l'intégration par ''meta()''.+These curves can be viewed in real time in ''VizWin'', see [[doc:user:results:viz_courbes]]. 
 +===== Running the simulation =====
  
 +First, the test case must be loaded using the command ''load('apps.qs.tutorial')'', if the module is named "''tutorial.py''" and is located in the folder ''apps/qs''
  
 +Then, the integration is started with the command ''meta()''.
  
-On obtient la célèbre figure suivante:+If everything was done properly, this famous figure is obtained
  
  
Line 589: Line 441:
  
  
- +At the same time, the [[doc:user:general:glossaire#python]] window indicates the temporal integration was successful. 
-Tandis que la fenêtre [[doc:user:general:glossaire#python]] nous indique le bon déroulement de l'intégration temporelle:+
  
  
Line 604: Line 455:
  
  
-===== Visualiser les résultats =====+===== Viewing Results =====
  
  
  
-==== Recharger les configurations sauvegardées ==== +==== Loading Saved Configurations ====
- +
- +
- +
- +
- +
-Grâce à ''VizWin'' et la visualisation en temps réel, il est possible de voir à tout moment l'état du calcul. Pendant celui-ci, des [[doc:user:general:glossaire#fac|fichiers d'archivage]] (''.bfac.gz'') sont régulièrement créés et peuvent être relus par la suite. +
  
 +Using ''VizWin'' and real time viewing, it is possible to follow the temporal integration. During this integration, some [[doc:user:general:glossaire#fac|saving files]] (''.bfac.gz'') are created and may be read again once the integration is completed.
  
 {{ doc:user:workspace.jpg |doc:user:workspace.jpg}} {{ doc:user:workspace.jpg |doc:user:workspace.jpg}}
  
 +This was explained in details in [[doc:user:tutorials:premiertest]].
  
  
-Pour plus de détails sur la procédure, voir [[doc:user:tutorials:premiertest]]. 
  
  
Line 628: Line 473:
  
  
 +==== Viewing Curves Using Excel ====
  
 +Run Excel, and load the desired ''.ascii'' files (''time.ascii'' et ''force.ascii'' in this example). Use the filter "All files *.*".
  
-==== Les courbes sous Excel ==== +A box opens to configure the importationAt this pointit is important to check that the point "." is set as decimal separator (see figure below).
- +
- +
- +
-Ouvrez Excel et chargez les fichiers ''.ascii'' voulus (''time.ascii'' et ''force.ascii'' par exemple). Lors de l'ouvertureutilisez le filtre "Tous les fichiers *.*"+
- +
-Une boite de dialogue s'ouvre pour configurer l'importation. Il est important de vérifier à ce niveau que le point "." est bien le séparateur de décimales (voir figure ci-dessous)+
- +
  
 {{ doc:user:import-excel.png |}} {{ doc:user:import-excel.png |}}
  
 +Once both files are imported, the two data columns must be placed on a single sheet, and a 2D plot must be defined when selecting the data.
  
- +The result is shown on the following figure :
-Une fois les deux fichiers importés, placez les deux colonnes dans une seule feuille de calcul et définissez un graphique 2D en sélectionnant les données.  +
- +
-Le résultat est montré sur la figure suivante: +
- +
  
 {{ doc:user:plot-excel.png |}} {{ doc:user:plot-excel.png |}}
Line 654: Line 489:
  
  
-==== Les courbes sous Matlab ====+==== Viewing Curves Using Matlab ====
  
- +It is much easier using Matlab. Simply load the curves using the command ''load'', then plot the results as shown below
- +
-Sous matlab, c'est beaucoup plus simple: +
- +
- +
- +
-Lancez matlab et chargez les courbes avec la commande ''load''. Utilisez ensuite la commande ''plot'' pour tracer la courbe:+
  
  
  
 {{ doc:user:import-matlab.png |}} {{ doc:user:import-matlab.png |}}
- 
-==== En vidéo ==== 
- 
- 
-<html> 
-<iframe width="853" height="480" src="//www.youtube.com/embed/7TSd3caZK2U" frameborder="0" allowfullscreen></iframe> 
-</html> 
doc/user/tutorials/tuto1.txt · Last modified: 2016/07/11 16:45 by boemer