Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


doc:user:geometry:mesh:3d

This is an old revision of the document!




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 !

Volume hexaédrique

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:

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

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:

Ordre des lignes dans le tuple python

Exemple:

Maillage manuel - géométrie initiale

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 résultant

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).

Extrusion d'un cercle troué

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)

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
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.

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).

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.1373636557.txt.gz · Last modified: 2016/03/30 15:22 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki