===== Commit 2016-07-25 ===== SuperElement : Nettoyage structure 2 Le gros du présent travail consiste en la séparation des structures de construction et d'utilisation des super-éléments. La construction passe par de nouvelles classes ''SuperElementBuilder'' et l'utilisation via la structure usuelle de Metafor : les Super-Elements dérivent de mtElement, utilisent l'ElementFactory, a ses propriétés élémentaires spécifiques, ... ===== SuperElementBuilder : Build Of ===== * Extraction de tous le code de construction des SuperElements vers les classes ''GuyanSuperElementBuilder'', ''CraigtBamptonSuperElementBuilder'', avec la classe mère ''SuperElementBuilder'' * Le constructeur passe le numéro de SE (identification des fichiers, volumeSE, ...) et le domain du modèle FEM * La frontière (''boundary'') peut dorénavant être introduite en plusieurs objets * Les extracteurs (DbNodalValueExtractor sur TX|TY|TZ) sont directement définis dans le builder * La création du SE & écriture sur disque est fait à travers la fonction ''computeSuperElement()'' * interface des SEBuilders : seBuilder = CraigBamptonSuperElementBuilder(no, domain) # no : numéro du SE / domain : du modèle FEM seBuilder = GuyanSuperElementBuilder(no, domain) # no : numéro du SE / domain : du modèle FEM seBuilder.setNbModes(nbModes) # nombre de modes à interface fixes (CB only) seBuilder.addInteraction(inter) # ajout des interactions constitutives du SE seBuilder.addBoundary(boundary) # ajout des objets définissant la frontière retenue du SE seBuilder.addExportedGroup(grp) # ajout de groups sauvegardés dans le SE seBuilder.setSolver(solver) # Définition du solver utilisé pour construire le SE (dss par défaut) seBuilder.setSymmetriseK(_symK) # force la symétrisation des matrices de construction du SE SEBuilder.addValueExtractor(no, DbNodalValueExtractor(gobject, Field1D(TX, RE))) # ajout d'extracteurs de déplacement (Field1D(TX, RE), Field1D(TY, RE), Field1D(TZ, RE)) sur les noeuds condensés seBuilder.computeSuperElement() # appel à la fonction de calcul et de sauvegarde du SE * Une fonction objective de construction des SE (démontrant l'utilisation des builders) se trouve dans le module ''mtSuperElement.tools.utilities'' : ''SuperElementBuilderObjF'' * le Builder génère 2 fichiers : ''superElement"no".py'' et ''SE_"no".gz'' dans le répertoire de construction ===== SuperElementInteraction : Use of ==== * L'utilisation d'un SE passe toujours : * par la lecture du fichier python de définition topologique du SE (''superElement"no".py''). * par la configuration d'une interaction (''CraigBamptonSuperElementInteraction'' ou ''GuyanSuperElementInteraction'') * Procédure de lecture : * Ce dernier copiant aussi le fichier de données (''SE_"no".gz'') dans le répertoire d'utilisation. * Un exemple de procédure d'importation du module de SE se trouve dans le fichier : oo_meta/mtSuperElement/tools/utilities.py. def getSuperElementImporter(seNo, domain, buildWDir, seIndex=0): seName = 'superElement'+str(seNo) #wDirCreate = os.path.split(os.getcwd())[0]+os.sep+'Creation' import imp (file, pathName, description) = imp.find_module(seName, [buildWDir]) seModule = imp.load_module(seName, file, pathName, description) # sei = seModule.SuperElementImporter(domain, buildWDir, seIndex) #sei.execute() #sei.importAllGroups() #sei.generateAllExtractors(seInter) # return sei * Il est à noter que la procédure décrite ci dessus est plus fiable que l'ajout du buildDir dans le ''sys.path'' (auquel cas le premier ''SuperElement"no".py'' trouvé sera chargé (pas nécessairement le bon) * l'importation n'est effectuée que à l'execution du ''SuperElementImporter'' * L'import de tous les groupes se fait via ''sei.importAllGroups()'' * L'import sélectif des groupes dont on a besoin à travers leur numéro numéro via ''sei.importGroup"no"()'' * Tous les extracteurs peuvent être construits (après création de la SEInteraction : ''sei.generateAllExtractors(seInter)'') * De même les extracteurs sur noeuds condensés peuvent être générés au coup par coup à travers le sei (''sei.generateExtractor"no"(seInter, fname)'') * ou directement dans le jeux de données qui permet de modifier les numéro d'extracteurs, et nom de fichier (''vm.add(newVMNo, SuperElementValueExtractor(seInter, no), 'newName')'' * Attention, actuellement seuls les DBValueExtractors de déplacement sont accessible (pour les extracteurs complexes, genre theta ou dRayon, il faut encore implémenter ce qu'il faut !!!) * la génération de l'interaction passe par la définition d'un propelem, d'une interaction et du push du volume (nb : tout ca devrait pouvoir être généré via le sei dans le fichier superelement.py => todo) * Guyan : prpSE = ElementProperties(GuyanSuperElement) seInter= GuyanSuperElementInteraction(no) seInter.addProperty(prpSE) seInter.push(volumeSet(p['SEIndex'] + 1)) interactionSet.add(seInter) * CraigtBampton : prpSE = ElementProperties(CraigtBamptonSuperElement) seInter= CraigtBamptonSuperElementInteraction(no) seInter.setNbModes(p['nbNormalModes']) seInter.addProperty(prpSE) seInter.push(volumeSet(p['SEIndex'] + 1)) interactionSet.add(seInter) * Actuellement, toujours 1 seul element par interaction (pas de push multiples) et il est toujours nécessaire de redéfinir le nombre de modes à interface fixe utilisé pour construire le CBSE ===== Forces centrifuges sur SE ===== * Le calcul des forces centrifuges implémenté par claire au commit précédent n'est actuellement plus en place. * Un calcul de transfert de forces externes est implémentée : $F_{Ext} = \alpha^T f_{Ext}$ et est relu comme force externe dans le jeux de donnée d'utilisation (et interfacé à travers le rotation factor pour l'IQSI) * Malheureusement, le vecteur de forces externes FEM $f_{Ext}$ ne prend pas encore en compte tous les termes de l'équilibre => il faut repenser l'ensembles des possibilités !!! ===== Divers sur SE ===== * Grosse augmentation des TSC_LEAKS pour les tests de construction sans pré-contrainte (et donc sans intégration temporelle). L'appel au destructeur de metafor doit être fait... ===== Divers ===== * mtFEMBase/element : ajout de const * mtMath::Matrix : resize de la matrix dans l'opérateur de lecture (''InArchive &operator>>'') * mtMath::Vector : resize du vector dans l'opérateur de lecture (''InArchive &operator>>'') * mtMath::SkyLineMatrix : symetriseAfcAcf(WithSolve &_Acf) -> NOT_IMPLEMENTED (le code est buggé => suppression de ''mtSuperElement.tests.beamCentrifugeLoad.beam3DEas20000Rpm20ModesSkyLineSymK'') * sticking : ajout de ${PROJECT_SOURCE_DIR}/mtElements/sticking dans les CMakeLists.txt * sticking : Ajout de 2 tests de mise en charge centrifuge * ===== Fichiers ajoutés/supprimés ===== added : oo_meta\mtSuperElement\tools added : oo_meta\mtSuperElement\tools\utilities.py added : oo_meta\mtSuperElement\src\CraigBamptonSuperElementBuilder.h/cpp added : oo_meta\mtSuperElement\src\GuyanSuperElementBuilder.h/cpp added : oo_meta\mtSuperElement\src\SuperElementBuilder.h/cpp added : oo_meta\mtSuperElement\src\SuperElementElShcuts.h/inl added : oo_meta\mtSuperElement\src\SuperElementValueExtractor.h/cpp deleted: oo_meta\mtSuperElement\tests\tools\utilities.py deleted: oo_meta\mtSuperElement\tests\tools\postObjectiveFunctions.py deleted : oo_meta\mtSuperElement\src\CraigBamptonSuperElementValueExtractor.h/cpp deleted : oo_meta\mtSuperElement\src\CraigBamptonSuperElementValueExtractorUse.h/cpp deleted : oo_meta\mtSuperElement\src\GuyanSuperElementValueExtractor.h/cpp deleted : oo_meta\mtSuperElement\src\GuyanSuperElementValueExtractorUse.h/cpp ===== Tests ajoutés/supprimés ===== added : oo_meta\apps\sticking\centrifugeLoad3d.py added : oo_meta\apps\sticking\centrifugeCyclicLoad3d.py deleted : oo_meta\mtSuperElement\tests\beamCentrifugeLoad\beam3DEas20000Rpm20ModesSkyLineSymK_1.py deleted : oo_meta\mtSuperElement\tests\beamCentrifugeLoad\beam3DEas20000Rpm20ModesSkyLineSymK_2.py --- //[[L.Papeleux@ulg.ac.be|Luc Papeleux]] 2016/07/25 //