
- Nettoyage de l'ALE (refactoring) : but = étendre
l'ALE aux éléments EAS (et aux futurs éléments
de coques) de manière propre.
- Création de la classe AuxiliaryVelMeshBuilder (création
du maillage volume finis nodal pour la convection des vitesses en dynamique
et de la température en thermique).
- Utilisation de la classe AuxiliaryMeshBuilder (création
du maillage volumes finis autour des points de Gauss).
- Création de la classe MeshBuilder, classe mère
des deux classes ci-dessus.
- Extraction des enum ReZoningType et ConvectionType
dans un fichier séparé.
- Nettoyage du source (toujours en cours). Rien à voir avec l'ancien
source!
- Ajout de la création de la Topologie
avant le maillage:
- [Petite Intro] Il est maintenant possible de créer un maillage
sans notion d'éléments finis (ce qu'on appelle "Topology"
dans Metafor) et, dans un second temps, appliquer des éléments
sur le maillage. C'est une étape INDISPENSABLE pour permettrre
une gestion unifiée de la géométrie des différents
éléments. Par exemple, le Quad thermique de Laurent à
champ quadratique mais à géométrie linéaire
pourra être traité sans artifices comme un Quad lorsqu'il
s'agira de géométrie. Cet élément aura 8 noeuds
mais seulement 4 points (les 4 sommets du Quad). Les noeuds d'interface
pourront facilement être associés aux arêtes dans un
deuxième temps (via un FieldApplicator - voir plus loin). Il sera
donc facile de boucler soit sur les noeuds (pour accéder à
la physique) ou sur les sommets (pour accéder à la géométrie).
Ces deux notions seront à terme complètement distinctes.
Grand intérêt aussi pour unifier l'élément
classique, le EAS et des coques quadrangulaires...
- Modification de HashedNumberedObjectSetTemplate: 3 types
de hashage différents sont possibles pour ce hash_set: hash par
numéro utilisateur (utile pour rechercher une entité rapidement
quand on connait son numéro - hash par numéro "DB étendu"
(utile pour l'identification de doublons dans la géométrie)
- hash par "pointeur étendu" (même utilité).
Le mot "étendu" veut dire que la fonction de hashage
fait la somme des fonctions de ses composants si bien que deux entités
géométriques définies dans un ordre différent
(par exemple, deux edges orientés de manière opposée)
on le même numéro de hashage.
- Ajout d'un type de mailles (appelé CellType) : CELL_HEXA,
CELL_QUAD, ...
- Ajout de constructeur de mailles : LineBuilder, QuadBuilder,
HexaBuilder. Ces classes remplissent une géométrie
de type voulu. Précédemment, ce code était en vrac
dans l'élément (MetaElement.cpp).
- Ajout d'une fonction Topology.define() du même type
que ElementSet.define() qui permet de définir les mailles
(toujours sans aucune notions d'éléments) - (voir
exemple 1). Vu la similitude des classes Geometry et Topology,
il est aussi possible de créer de la géométrie utilisateur
par ce procédé (comme le createCube.e et addCube.e)
avec l'avantage, ici, que la suppression des éléments de
géométrie commune à deux cubes est automatiquement
faite. Il est donc possible d'assembler des cubes qui seront maillés
plus tard et former ainsi des géométries complexes (voir
exemple 2).
- Modification des mailleurs: les mailleurs 1D créent des CELL_LINE,
les mailleurs 2D créent des CELL_QUAD et les mailleurs
3D des CELL_HEXA. Ces mailles sont toujours créées
si bien qu'il n'est plus possible de ne créer que des noeuds sur
une face par exemple. Pour l'instant, les deux manières de faire
(l'ancienne - créer des éléments sur des noeuds -
et la nouvelle - créer des mailles sur des points) sont accessibles
(la nouvelle est temporairement mesh2 ou mit2).
J'espère pouvoir modifier tous les cas-tests rapidement. Si qqun
veut m'aider, je dis pas non.
- Définition d'une classe FieldApplicator (si vous avez
une autre idée pour le nom, je suis preneur) qui dérive
d'Interaction. Cette nouvelle classe permet d'appliquer des
éléments sur un maillage constitué de mailles (voir
exemple 2). Avant d'utiliser cette classe, il est important de comprendre
qu'aucun noeud n'a été créé. On travaille
avec des points géométriques (ça paraît logique
mais c'est pas du tout ce qu'on faisait avant). Le FieldApplicator
prend une série de mailles et applique l'élément
voulu (ça paraît bête mais ça ne l'est pas:
regardez la routine, surtout celle de l'hexaèdre).
- J'ai modifié deux cas-tests pour utiliser cette nouvelle manière
de faire: cont2.e et ale_coin3d.e (dans le répertoire
apps.d/qs_e.d). Je vous conseille d'aller voir les modifs.
- Et voilà, c'est tout pour l'instant mais il reste à modifier
toutes les interactions pour qu'elles appliquent la même philosophie.
Ce qui sera bien, par exemple, c'est qu'il sera possible de créer
les éléments de contact AVANT le maillage volumique par
exemple. En fait, l'ordre n'a plus aucune importance (c'est pas vraiment
le cas maintenant).
- Autre truc: la routine Topology::build() ne sert plus à
rien si on utilise cette philosophie.
- Modifs de Laurent: accélération et optimisation globale du
code (voir ce lien)
Examples
Un petit exemple (création de mailles "à
la main") :
Domain test;
#
Refer domain(test);
Refer geo(domain[GEOMETRY_PO]);
Refer topo(domain[TOPOLOGY_PO]);
#
topo[POINTSET_PO].define(10, 0.0, 0.0, 0.0);
topo[POINTSET_PO].define(20, 1.0, 0.0, 0.0);
topo[POINTSET_PO].define(30, 1.0, 1.0, 0.0);
topo[POINTSET_PO].define(40, 0.0, 1.0, 0.0);
topo[POINTSET_PO].define(50, 2.0, 0.0, 0.0);
topo[POINTSET_PO].define(60, 2.0, 1.0, 0.0);
#
topo.define(1, CELL_QUAD, topo, 10,20,30,40);
topo.define(2, CELL_QUAD, topo, 20,50,60,30);
#
topo[POINTSET_PO].build_hash();
topo[CURVESET_PO].build_hash();
topo.renumberDuplicateNos();
Un autre exemple (2D) où on utilise la création
de mailles pour générer de la géométrie utilisateur
(à la createCube) et on maille cette géométrie avec les
mailleurs modifiés:
Domain test2;
#
Refer domain(test2);
Refer geo(domain[GEOMETRY_PO]);
#
geo[POINTSET_PO].define(1, 0.0, 0.0, 0.0);
geo[POINTSET_PO].define(2, 1.0, 0.0, 0.0);
geo[POINTSET_PO].define(3, 1.0, 1.0, 0.0);
geo[POINTSET_PO].define(4, 0.0, 1.0, 0.0);
geo[POINTSET_PO].define(5, 2.0, 0.0, 0.0);
geo[POINTSET_PO].define(6, 2.0, 1.0, 0.0);
#
# on cree deux quads comme si c'etait des mailles
#
geo.define(1, CELL_QUAD, geo, 1,2,3,4); # comme createSquare !!
geo.define(2, CELL_QUAD, geo, 2,5,6,3); # comme addSquare !!
#
# maillage des deux quads
#
geo[CURVESET_PO][1].mesh2(4);
geo[CURVESET_PO][2].mesh2(4);
geo[CURVESET_PO][3].mesh2(4);
geo[CURVESET_PO][4].mesh2(4);
geo[CURVESET_PO][5].mesh2(4);
geo[CURVESET_PO][6].mesh2(4);
geo[CURVESET_PO][7].mesh2(4);
#
geo[SIDESET_PO][1].mit2(1);
geo[SIDESET_PO][2].mit2(1);
#
# Generation des elements choisis sur la geometrie du maillage
#
FieldApplicator app(1);
app.push(1,SIDE_PO);
app.setElementType(Volume2x1Gp2DMetaElement);
domain[INTERACTIONSET_PO].copy(app);
domain[INTERACTIONSET_PO].generateElements();
Pour mettre à jour, updatez les sources et ajoutez les nouveaux fichiers
dans oo_ale oo_geo oo_elements et oo_elements/i_