===== 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 //