This is an old revision of the document!
Table of Contents
Mailleurs 3D
Mailleur transfini
Metafor possède en interne un mailleur simple transfini qui permet de mailler des objets à topologie hexaédrique (6 faces tel un cube). Pour des géométries plus complexes, il est nécessaire de découper manuellement la structure en domaines hexaédriques ou de se tourner vers des mailleurs externes plus élaborés (Samcef, TetGen, …) et d'importer le maillage (voir Reading SAMCEF files).
Remarque préliminaire: Pour mailler un Volume
, il faut tout d'abord mailler les Sides
et les Curves
qui le composent !
Avec autodétection
L'autodétection est possible si on a une Skin
avec 12 arêtes possédant chacune une seule ligne.
TransfiniteMesher3D(volumeset(number)).execute(type)
number | numéro du Volume |
type | = True si génération des mailles (CELL_HEXA )= False si génération de points uniquement (utile pour debug seulement) |
Dans ce cas, la Skin
doit être définie obligatoirement avec l'orientation de la figure ci-dessous:
c'est-à-dire
skin = add(Skin(1)); for i in [1,2,3,4,5,6]: skin.push(sideset(i))
où les numéros du push
sont les numéros des Sides
de la Skin
.
Sans autodétection
Le cas sans autodétection est le cas général. Il peut être appliqué à n'importe quelle Skin
hexaédrique. La définition de celle-ci ne doit pas nécessairement suivre le schéma ci-dessus (les numéros des Sides
peuvent être ordonnés de manière quelconque).
Pour fonctionner, le mailleur doit recevoir un ensemble de 12 ensembles de Curves
définissant les arêtes.
mat = ((mat11, ..., mat1nbmax), ..., (mat121, ..., mat12nbmax)) TransfiniteMesher3D(volumeset(number)).execute2(mat, type)
number | numéro du Volume hexaédrique |
mat | tuple de dimension 12, où chaque entrée regroupe les numéros des Curves utilisées |
Les numéros des Curves
doivent obligatoirement être indiqués dans l'ordre suivant:
Exemple:
Le domaine hexaédrique ci-dessus peut se mailler indifféremment par:
TransfiniteMesher3D(volumeset(1)).execute2( ((103,101,102),2,3,4,5,6,7,8,10,11,12,13) )
ou
TransfiniteMesher3D(volumeset(1)).execute2( (5,11,(103,101,102),10,7,12,3,13,8,6,2,4) )
ou
TransfiniteMesher3D(volumeset(1)).execute2( (6,12,2,11,8,13,4,10,5,7,3,(101,102,103)) )
ou
...
pour donner
Maillage transfini 3D avec une distribution non uniforme des mailles
Il suffit de procéder de la manière suivante pour mailler un Volume
:
MesherTFI3D =TransfiniteMesher3D(volumeset(number)) MesherTFI3D.setEnableDistribution() MesherTFI3D.execute(type, tri) ou MesherTFI3D.execute2(mat, type)
lorsqu'un de ses bords est discrétisé par une distribution de maille.
Remarque : Par défaut, le paramètre de la fonction setEnableDistribution
est True
.
Mailleur par extrusion
Cette méthode est utilisable mais pourrait être améliorée: densité non constante sur la direction d'extrusion, amélioration de la vitesse de maillage (ça me semble lent), sortie des noeuds extrudés en groupes (internes, surface externe, etc). Tant que maintenant, on peut extruder une Side
, une Skin
ou un Group
selon une direction quelconque avec un nombre d'éléments quelconques.
On peut aussi créer la géométrie suite à l'extrusion (uniquement pour une Side
). Pour une Skin
ou un Group
, on peut créer les Points
et les Curves
liées par l'extrusion aux Points
et aux Curves
de l'objet.
Exemple
Il s'agit de l'extrusion d'un cercle troué par un carré (voir apps.qs.extruMesher3d
).
Je vous épargne la création et le maillage du cercle. Pour extruder le résultat (la Side
#1), on écrit:
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 | toutes les mailles y font référence (le FieldApplicator est appliqué sur ce Groupe) |
setFillGroup() | remplit le Group 1 avec les noeuds du maillage |
setDirection | direction d'extrusion (par défaut = z ) |
setLength | longueur d'extrusion |
setNbOfLayers | nombre d'éléments extrudés |
execute | effectue l'extrusion |
getLastLayer(no) | renvoie le Groupe grpNo (numéro no ) contenant les noeuds de la dernière couche |
En maillant en deux dimensions, bien définir les contours “aire à gauche”
Exemple 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)
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 | |
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
.
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
).
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 |