Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


doc:user:geometry:mesh:3d

This is an old revision of the document!




3D meshers

Transfinite mesher

Metafor possess a simple transfinite mesher, which is able to mesh hexahedra (object with 6 sides, such as a cube). For more complex geometries, it is necessary to divide it into hexaedra or use external meshers (Samcef, TetGen, …) and import the mesh in Metafor (see Reading SAMCEF files).

Preliminary note: To mesh a Volume, all its Sides and Curves must be meshed first !

Volume hexaédrique

With auto-detection

Auto-detection is possible if the Skin has 12 edges, each of which possesses only one line.

TransfiniteMesher3D(volumeset(number)).execute(type)
number number of the Volume to mesh
type = True if mesh elements must be generated (CELL_HEXA)
= False if only nodes must be generated (useful to debug only)

In this case, the Skin must be defined tith the orientation shown below:

Définition de la skin du domaine pour l'autodétection

which means that

skin = add(Skin(1)); 
for i in [1,2,3,4,5,6]:
   skin.push(sideset(i))

where the number used in the push function are the number of the Sides included in the Skin.

Without auto-detection

This case is the most general, and can be applied to any Skin with the shape of a hexaedron. The definition of the skin must no longer be as the above figure shows, which means the sides can be “pushed” in the skin in any order.

The mesher needs a set of 12 sets of Curves, where each of these sets defines an edge of the hexaedron.

mat = ((mat11, ..., mat1nbmax), ..., (mat121, ..., mat12nbmax))
TransfiniteMesher3D(volumeset(number)).execute2(mat, type)

where number is the number of the hexahedral Volumeto mesh, and mat is a Python tuple with 12 components. Each component is a tuple which contains the number of the curves which constitute each edge. Each of these 12 edges can be made of a different number of curves.

These 12 tuples must be ordered as shown below:

Ordre des lignes dans le tuple python

Example:

Maillage manuel - géométrie initiale

The hexahedral domain above can be meshed with the command:

TransfiniteMesher3D(volumeset(1)).execute2( ((103,101,102),2,3,4,5,6,7,8,10,11,12,13) )

or

TransfiniteMesher3D(volumeset(1)).execute2( (5,11,(103,101,102),10,7,12,3,13,8,6,2,4) )

or

TransfiniteMesher3D(volumeset(1)).execute2( (6,12,2,11,8,13,4,10,5,7,3,(101,102,103)) )

or

...

leading to:

Maillage résultant

Transfinite 3D mesher with non-uniform mesh elements distribution

This is done with the commands:

MesherTFI3D =TransfiniteMesher3D(volumeset(number))
MesherTFI3D.setEnableDistribution()
MesherTFI3D.execute(type, tri) ou MesherTFI3D.execute2(mat, type)        

when one if the edges is already discretized using a mesh elements distribution.

Note : By default, the parameter setEnableDistribution is set to True.

Mesher by extrusion

This method can be used, but could be improved upon: density non-constant along the extrusion direction, improvement of meshing speed, giving the extruded nodes as groups (internal ones, external surface, …). For now on, a Side, a Skin or a Group can be extruded along any direction, with any number of elements. The geometry associated to the extrusion can also be created (only for a Side). For a Skin or a Group, we can create the Points and Curves associated by extrusion to the Points and Curves of the object. === Example ==== Extrusion of a circle pierced by a square (seeapps.qs.extruMesher3d). Extrusion d'un cercle troué The definition and meshing of the circle can be seen in the the file. To extrude the result (Side #1): mesher = ExtrusionMesher3D(sideset(1), groupset(1)) mesher.setFillGroup(True) mesher.setDirection(0.0,0.0,1.0) mesher.setLength(8) mesher.setNbOfLayers(10) mesher.execute() grpNo = mesher.getLastLayer(no) | Group 1 | all the mesh element refer to this group (the FieldApplicator is applied to this group) | | setFillGroup() | fills Group 1 with the nodes of the mesh | | setDirection | direction of the extrusion (by default = z) | | setLength | length of the extrusion | | setNbOfLayers | number of extruded elements | | execute | execute the extrusion | | getLastLayer(no) | returns the group grpNo (number no) which contains the nodes of the last layer | :!: When meshing in 2D, the wires must be defined “area to the left” :!: === Example 2 ==== De la même manière, une face plane maillée en triangles peut être extrudée en 3D pour un maillage en prismes (voir le cas apps.monosMeca.monoTrac3dPenta) Maillage d'un cube en prismes ==== Création de la géométrie ==== === Cas général: Extrusion d'une Side, d'une Skin ou d'un Group === Après l'extrusion d'une Side, d'une Skin ou d'un Group, on peut créer la géométrie extrudée à partir d'une Side avec la fonction : mesher.createGeometryOn(Side, NoGObject, geometry) Les objets géométriques créés sont numérotés à partir de NoGObject. Une fonction permet de créer uniquement une Line correspondant à l'extrusion d'un Point : line = createLineAbove(pt1, NumLine, NumPtOnTop, geometry) | line | Line créée (numérotée : NumLine) | | pt1 | Point de référence | | NumPtOnTop | numéro du Point à l'autre extrémité du segment | === Cas particulier: extrusion d'une Side === Pour créer la géométrie après l'extrusion d'une Side, on utilise la fonction : mesher.createGeometry(NoGObject, geometry) :!: Pour utiliser cette fonction il faut que la cible à extruder soit de type Side :!: Les objets géométriques créés sont numérotés à partir de NoGObject. === Récupération des objets géométrique === La récupération des objets géométrique créés se fait avec les fonctions: Vol1 = mesher.getVolumeOnTop(side1) side = mesher.getSideOnTop(curveOrSide) curve = mesher.getCurveOnTop(pointOrCurve) point = mesher.getPointOnTop(ptref) | Vol1 | Volume créé à partir de la Side 1, celle extrudée. | side | Side créée à partir de l'objet curveOrSide (qui correspond à une Curve ou une Side de l'objet extrudé).
Si :
curveOrSide = Curve → la Side renvoyée est tangente à la direction d'extrusion.
Si :
curveOrSide = Side → la direction d'extrusion est un vecteur normale à la Side renvoyée | | curve | Curve créée à partir de pointOrCurve (qui correspond à un Point ou une Curve de l'objet extrudé)
Si :
pointOrCurve = Point → la Curve renvoyée est tangente à la direction d'extrusion.
Si :
pointOrCurve = Curve → la direction d'extrusion est un vecteur normal à la Curve renvoyée| | point | Point créé à partir de ptref (Point de l'objet extrudé) | La géométrie est crée dans le cas test apps.welding.welding et aspCrushing.tests.threeD.smoothStripRoughTool. <note important> ATTENTION, après la création de la géométrie, il faut ajouter le Volume (renvoyer par la fonction mesher.getVolumeOnTop(side)) à l'aide de la commande push dans le FieldApplicator à la place du groupe (groupset(1) du constructeur de l'objet ExtrusionMesher3D). Dans le cas particulier d'une seule couche d'éléments dans la direction d'extrusion, nous sommes obligés d'ajouter le groupe (groupset(1) du constructeur de l'objet ExtrusionMesher3D) à l'aide de la commande push dans le FieldApplicator, quelle que soit l'entité géométrique extrudée (Side, Skin ou Group). </note> ===== Mailleur par extrusion de révolution ===== Extrusion axisymétrique d'une face maillée. L'extrusion peut être ouverte ($0 < \mbox{angle} < 360^\circ$) ou fermée ($\mbox{angle} = 360^\circ$). A ce jour, il n'y a pas de reconstruction de la géométrie extrudée (utilisez les Group'' pour gérer vos fixations).

mesher = RevolutionExtrusionMesher3D(gobject, group, axe, angle=180.0)
setAngle(angle)
mesher.setNbOfLayers(10)
mesher.execute()
gobject Objet géométrique 2DMaillé
group Group father des mailles 3D
axe Ligne géométrique définissant l'axe de révolution
setLength longueur d'extrusion
setNbOfLayers nombre d'éléments extrudés
execute effectue l'extrusion

Exemple

doc/user/geometry/mesh/3d.1407512403.txt.gz · Last modified: 2016/03/30 15:22 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki