Table of Contents

Commit 2016-06-13

Améliorations de la structure des super-éléments dans Metafor.

L'objectif est de pouvoir appliquer une précontrainte sur le modèle FEM à partir duquel le super-élément est ensuite construit. Le cas de la construction d'un super-élément à une vitesse donnée non nulle nous intéresse tout particulièrement dans le cadre du projet Abrawal.

Les étapes de création et d'utilisation ont donc été modifiées par rapport à ce qui a été initialement proposé au commit précédent (Commit du 07 Avril 2016).

Modifications apportées à la nouvelle structure

Précontrainte et création d'un super-élément

Typiquement, le jeu de données dans lequel le super-élément est créé consiste en un calcul de mise en rotation centrifuge du modèle FEM classique. Lorsque la vitesse cible est atteinte, i.e. à la fin du calcul, la création du super-élément est lancée via une fonction objective. Notons que la construction d'un super-élément à vitesse nulle (i.e., n'ayant subit aucune précontrainte) peut être lancée directement dans le fichier de création .py, ou via une fonction objective également.

Dans l'objectif de pouvoir construire un super-élément à vitesse variable (cf. [Sternchüss et al., 2006] et [Legrand et al., 2011]), il serait plus efficace de balayer une gamme de vitesses et de lancer la création d'un super-élément à différentes vitesses lors du même calcul.

Pour l'instant, 1 calcul = construction d'un (ou plusieurs) super-élément(s) à 1 vitesse donnée, cependant cela est possible en créant un PythonValueExtractor.

La précontrainte du modèle et la création d'un super-élément se déroulent de la manière suivante :

  1. Construction du modèle FEM : création des différentes interactions, en s'assurant que le domaine associé au futur super-élément soit défini par une interaction au moins
    1. Par ex, dans le cas d'une condensation du pied d'une aube par un super-élément, le modèle FEM sur lequel repose la construction du super-élément doit au moins contenir un FieldApplicator pour les éléments constituant le pied.
  2. Création de groupes de nœuds RETENUS qui serviront à l'utilisation du super-élément pour l'application de conditions aux limites ⇒ Peut être fait au moment de la création ou de l'utilisation, mais c'est plus facile au moment de la création car on a accès à la géométrie du modèle FEM.
  3. Création de groupes de nœuds CONDENSES pour lesquels on souhaite extraire une donnée au moment de l'utilisation (ex : déplacement selon X) ⇒ Doit être fait au moment de la création.
  4. Définition de la mise en rotation centrifuge (schéma d'intégration, conditions aux limites, vitesse de rotation, etc.)
  5. Appel à la fonction objective createSuperElement → 1 appel à la fonction createSuperElement = création d'1 super-élément

Pour rendre possible la création d'un super-élément sur un modèle précontraint, il a fallu :

  1. créer un nouveau DofFlag, et
  2. modifier les MechanicalMatrices, en conséquence.

Implémentation d'un nouveau DofFlag

  1. Ajout d'un nouveau flag belongingToSuperElem dans la classe DofFlags, en plus du flag fixed :
    • Il permet d'identifier les DDLs qui appartiennent au domaine du futur super-élément parmi tous les DDLs du modèle FEM si belongingToSuperElem = true (DDLs associés aux noeuds rouges sur la Fig. 1). De cette manière, il est possible de récupérer les blocs des matrices k et m du modèle FEM associés à ces DDLs uniquement nécessaires au calcul des matrices réduites du SE.
    • Le flag vaut false par défaut, et est fixé à true grâce à la commande setSuperElementNodes
    • A ce stade de la création du super-élément, les DDLs tels quebelonginToSuperElem = false (DDLs associés aux noeuds noirs sur la Fig. 1) n'ont pas d'intérêt.
  2. Implémentation d'une nouvelle classe BelongingToSEDofsSet, écrite de manière similaire à FixationSet, qui permet de gérer les flags belongingToSuperElem des DDLs du modèle.

Modifications des MechanicalMatrices

Création du super-élément à vitesse non nulle

La création proprement dite du SE, dans l'état précontraint, se décompose en plusieurs étapes :

Les matrices k et m du modèle FEM, à partir desquelles les matrices réduites vont être construites, prennent en compte le raidissement centrifuge du à la mise en rotation préalable du modèle FEM.

Sauvegarde du super-élément

Le super-élément ainsi construit est sauvegardé dans le sous-dossier <currentWorkDirectory>/Creation au travers des deux fichiers de sortie suivants :

Utilisation du super-élément créé

Les différentes étapes à réaliser dans le jeu de données pour utiliser le super-élément précédemment créé sont les suivantes :

La fonction defineSE(no, x, y, z) est définie comme suit :
→ Création et ajout au pointSet si pas de meshpoint ayant no comme UserNo,
→ Récupération s'il existe déjà un meshpoint ayant no comme UserNo dont les coordonnées sont identiques à (x, y, z).

Notons que le cas où un meshpoint ayant le même numéro existe déjà mais dont les coordonnées sont différentes de (x, y, z) n'est pas géré pour l'instant.
Le UserNo des noeuds du SE est défini à partir du UserNo dans le modèle FEM + un index.
Pour plus de sécurité, le nb de modes propres devrait être lu dans le fichier de sauvegarde… à faire.
On fait comme ça pour l'instant, mais un nouveau type d'élément, au même titre que VolumeElement ou ShellElement, devra être créé. On pourra ainsi définir les propriétés des éléments de l'interaction super-élément via prp = ElementProperties(Guyan) ou ElementProperties(CraigBampton).
Attention, pas d'erreur générée dans le cas où le type de super-élément ou le nombre de modes propres dans le cas CB fixées dans le jeu de données “utilisation”, ne correspondent pas à ceux du super-élément créé !

Cas-tests mtSuperElement

Cas-tests abrawal

Modification des cas-tests bladeCasingEngagementFSEGuyan et bladeCentrifugeLoadBSECraig de la batterie :

Fichiers ajoutés

Added: oo_meta\mtFEMBase\BelongingToSEDofsSet.h
Added: oo_meta\mtFEMBase\BelongingToSEDofsSet.cpp

Cas-tests ajoutés/renommés

Renamed: mtSuperElement\tests\Beam2DCompTX_FX_1.py -> Beam2DCompTXFX_1.py
Renamed: mtSuperElement\tests\Beam2DCompTX_FX_2.py -> Beam2DCompTXFX_2.py
Renamed: mtSuperElement\tests\Beam2DCompTX_FY_1.py -> Beam2DCompTXFY_1.py
Renamed: mtSuperElement\tests\Beam2DCompTX_FY_2.py -> Beam2DCompTXFY_2.py
Renamed: mtSuperElement\tests\Beam2DCompTY_FX_1.py -> Beam2DCompTYFX_1.py
Renamed: mtSuperElement\tests\Beam2DCompTY_FX_2.py -> Beam2DCompTYFX_2.py
Renamed: mtSuperElement\tests\Beam2DCompTY_FY_1.py -> Beam2DCompTYFY_1.py
Renamed: mtSuperElement\tests\Beam2DCompTY_FY_2.py -> Beam2DCompTYFY_2.py
Renamed: mtSuperElement\tests\Beam3DCompTX_FY_1.py -> Beam3DCompTXFY_1.py
Renamed: mtSuperElement\tests\Beam3DCompTX_FY_2.py -> Beam3DCompTXFY_2.py
Renamed: mtSuperElement\tests\Beam3DCompTY_FX_1.py -> Beam3DCompTYFX_1.py
Renamed: mtSuperElement\tests\Beam3DCompTY_FX_2.py -> Beam3DCompTYFX_2.py

Added:  mtSuperElement\tests\Beam3DFreqAnalysisCBCB_1.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisCBCB_2.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisCBFem_1.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisCBFem_2.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisCBG_1.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisCBG_2.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisFemCB_1.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisFemCB_2.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisFemG_1.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisFemG_2.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisGCB_1.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisGCB_2.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisGFem_1.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisGFem_2.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisGG_1.py
Added:  mtSuperElement\tests\Beam3DFreqAnalysisGG_2.py

Added: oo_meta/mtSuperElement/tests/tools/postObjectiveFunctions.py
Added: oo_meta/mtSuperElement/tests/tools/utilities.py

Added: oo_nda/abrawal/banc18ER/tools/bladeCentrifugeLoadBuildSE.py

Claire Hennuyer 2016/06/13