- Aujourd'hui le comportement d'un objet soumis à des sollicitations est calculé sur ordinateur
avant sa construction effective,
ce qui nécessite souvent la création d'un maillage en tétraèdres et/ou pentaèdres et/ou hexaèdres.
- Pour obtenir une meilleure précision des calculs, ce maillage doit être adapté
à la solution calculée.
- Cette adaptation nécessite à tout moment de savoir où est positionné un sommet,
intérieur ou extérieur à un volume, sur une face, sur une courbe ou est un point spécial, afin ou non de le
déplacer correctement.
- Actuellement, la majorité des objets sont conçus à l'aide de logiciels de C.A.O..
- Une adaptation efficace du maillage nécessite la connaissance et un accès rapide à la structuration interne des objets C.A.O., laquelle est spécifique de chaque logiciel.
- Un choix optimal est obtenu lorsque le logiciel de CAO et le mailleur sont écrits avec le même langage
informatique.
- Malheureusement, la plupart des logiciels de CAO ne permettent, ni l'accès au "source", ni cet accès direct
aux fonctions géométriques par un langage compilé.
- Une exception, le logiciel de CAO OpenCascade, écrit en C++ et de "source" téléchargeable sur le Web.
D'où l'idée de construire l'objet par OpenCascade puis le mailler, le tout en C++ avec
un accès direct C++ aux fonctions CAO sur les objets.
Pour faciliter le travail de l'utilisateur, les aspects graphique et interactif
doivent être ajoutés à la programmation.
Quels sont les pré-requis pour construire un tel mailleur?:
Disposer de mailleurs C++ (ou Fortran appelables en C++)
- pour subdiviser une courbe en segments;
- pour trianguler une surface plane;
- pour décomposer un volume en tétraèdres;
et ne pas être trop effrayé par
- 14 223 fichiers include en C++;
- 515 répertoires de fichiers source C++;
- un fichier tar.gz de 160 573 067 octets; (version 5.0 de mai 2003).
La programmation d'un tel mailleur passe par la connaissance de la représentation interne d'un objet dans OpenCascade,
laquelle est définie par ses FRONTIERES (BOUNDARY REPRESENTATION (BRep)):
(les noms anglais sont conservés car ils font partie du vocabulaire OpenCascade)
- un COMPSOLID est un ensemble de SOLIDS connectés par leurs FACES;
- un SOLID (cylindre, cône, sphère, tore, ...) est un volume limité par des SHELLS;
- un SHELL est un ensemble de FACES connectées par leurs EDGES;
- une FACE est une TRANSFORMATION définie sur un domaine interne à un rectangle de paramètres
U V et à valeur dans R3
(cf cylindre: [0,2 Pi] x [0,H] -> R3, cône, sphère, torus, surface de BEZIER, surface NURBS, ... );
- la frontière d'une FACE est limitée par des WIRES;
- un WIRE est un ensemble d'EDGES, connectés par des VERTICES;
- un EDGE est une TRANSFORMATION définie sur un intervalle d'un paramètre U
à valeur dans R3
(cf courbe de BEZIER: [0,1] -> R3, courbe NURBS, ... );
- un VERTEX est une extrémité d'un EDGE.
Cette représentation par les frontières induit un GRAPHE connectant les différentes SHAPES
(CompSolid, Solid, Shell, Face, Wire, Edge, Vertex).
Dans NEF, comment le maillage est il construit?
OpenCascade permet le parcours des différentes SHAPES du COMPSOLID
pour chaque EDGE du COMPSOLID
L'intervalle en U de définition de l'EDGE est subdivisé en segments
de façon à être inférieur à la donnée de la longueur maximale d'une arête du maillage
et le maximum de déflexion (distance entre la courbe et la corde) dans R3.
La transformation des segments de l'intervalle en U donne les arêtes dans
R3.
==> Création du maillage en U et en 3d-mesh pour chaque EDGE
pour chaque FACE du COMPSOLID
pour chaque WIRE de la face
pour chaque EDGE du WIRE
Le maillage en U de l'EDGE est assemblé après mise à l'échelle
dans le plan UV pour constituer un WIRE plan
La surface UV, limitée par les arêtes des Wires est triangulée
de façon à ce que toute arête dans R3 soit inférieure à la donnée de la longueur maximale d'une arête du maillage
et du maximum de la déflexion des arêtes dans R3.
La transformation de la FACE envoie les triangles du domaine U V dans
R3 pour constituer la triangulation de la FACE.
pour chaque SOLID du COMPSOLID
pour chaque SHELL du SOLID
pour chaque FACE du SHELL
Le maillage 3d de la FACE est assemblé
pour former la frontière du SOLID
Ici, la triangulation, peau de chaque SOLID du COMPSOLID, est faîte.
Alors, les volumes limités par cette triangulation sont tétraèdrisés.
Le maillage peut ensuite être sauvegardée dans un fichier.
Les algorithmes de maillage:
Pour un EDGE, la SEGMENTATION de son intervalle en U
est réalisée par DICHOTOMIE pour obtenir la longueur idéale des arêtes dans R3 ainsi que leur déflexion
au dessous de la valeur fournie.
Pour une FACE, la TRIANGULATION de son domaine UV
est faîte par subdivision d'un ARBRE-4 de TRIANGLES EQUILATERAUX, puis,
homogénéisation, échange des diagonales selon le critère de DELAUNAY, barycentrage des sommets voisins,
ajoûts ou déplacements de sommets, ... (cf [2])
Pour un COMPSOLID, la TETRAEDRISATION de chacun des VOLUMES
limitée par la triangulation de sa frontière est faîte selon le critère de DELAUNAY
à partir des sommets d'un ARBRE 5-14 d' OCTAEDRES et TETRAEDRES,
homogénéisation, échange d'arêtes-triangles (mt->2mt-4), barycentrage de sommets voisins,
ajoûts ou déplacements de sommets, ... (cf [3])
L'utilisateur peut entrer sous forme d'une CONSTANTE ou une FONCTION de (X,Y,Z)
- la LONGUEUR MAXIMALE des ARETES des EDGES ou des TRIANGLES des FACES
- la DEFLEXION MAXIMALE entre l'arête et l'EDGE ou
entre le PLAN défini par les 3 sommets du triangle et sa FACE.
Exemple:
Si aretemax=0 la fonction de l'utilisateur suivante est active:
DefFonc areteideale( x, y, z );
DefVar d; d=(x**2+y**2+(z-12)**2)/36;
si d<1 alors
areteideale=0.3*(1-d)+d; {interpolation de 0.3 à 1 dans une sphère de rayon 6}
sinon
areteideale=1.0;
FinSi;
FinFonc;
et inactive si aretemax>0.
Afin d'améliorer le confort de l'utilisateur, un Systême de Coordonnées Utilisateur (SCU)
et des CALQUES sont disponibles.
Démonstration: Construction d'un maillage d'une tête de CARDAN
2 points et un rayon => le cylindre du bas
2 points et un rayon => le cylindre du haut
2 points min max => la boite
le cylindre supérieur moins la boite
son union avec le cylindre inférieur
2 points et un rayon => le cylindre d'axe Z futur "trou"
l'objet moins le cylindre d'axe Z
2 points et un rayon => le cylindre supérieur d'axe Y
l'objet moins le cylindre supérieur d'axe Y
2 points et 2 rayons => le tronc de cône
l'intersection du cardan et du cône tronc de cône donne le chamfrein
1 point et 2 rayons => le tore
l'objet moins le tore => le cardan
le cardan après tétraèdrisation avec aretemax=1
la triangulation du cardan avec aretemax=0.5
la triangulation du cardan avec aretemax=1 et deflexion max=0.01
la triangulation du cardan avec aretemax=0, deflexion max=0.1 et la fonction
DefFunc areteideale(x,y,z);
if abs(z-12)<2 then
areteideale = 0.3;
else
areteideale = 1;
endif;
EndFunc;
la triangulation du cardan avec aretemax=0, deflexion max=0.1 et la fonction
DefFonc areteideale(x,y,z);
si abs(x)<2 ou abs(z-12)<2 alors
areteideale = 0.3;
sinon
areteideale = 1;
finsi;
FinFonc;
la triangulation du cardan avec aretemax=0, deflexion max=0.1 et la fonction
DefFonc areteideale(x,y,z);
DefVar d; d=(x**2+y**2+(z-12)**2)/36;
si d<1 alors
areteideale = 0.3;
sinon
areteideale = 1;
FinSi;
FinFonc;
Bibliography:
[1] http ://www.opencascade.org Le serveur Web d'accès au logiciel OpenCascade
[2] A. Perronnet, Triangulation par arbre-4 de triangles
équilatéraux et maximisation de la qualité, Laboratoire
Jacques-Louis Lions Paris, Rapport R92015
[3] A. Perronnet, Tetrahedrization by the 5-14 OTT tree technic
and the Delaunay's criterion, VIII Conference on Finite Elements
in Fluids, Barcelona, sept. 1993