This is an old revision of the document!
Table of Contents
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 !
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:
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 Volume
to 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:
Example:
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:
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 (see
apps.qs.extruMesher3d).
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)
==== 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é).
curveOrSide
Si : =
Curve → la
Side renvoyée est tangente à la direction d'extrusion.
curveOrSide
Si : =
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é)
pointOrCurve
Si : =
Point → la
Curve renvoyée est tangente à la direction d'extrusion.
pointOrCurve
Si : =
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 |