===== Commit - LPx - 24 Octobre 2018 ===== Interface matériaux Lagamine : - Mise en place de la structure informatique - interface de loi "simples" ===== Contexte : ===== * Le projet SolarPerform (Laurent Duchêne UEE), consiste à développer pour CMI une loi matériau pour les tubes de centrales électriques solaires à sels fondus. * Une série d'expériences ont été faites par le CRM pour mesurer le comportement du matériau à (très) haute température et Hélène Morch (doctorante chez Laurent) a développé la loi matériau correspondante dans Lagamine. * Afin d'assurer l'exploitation de la dite loi par GDTech pour le compte de CMI, il nous a été demandé de retranscrire cette loi dans Metafor (GDTech possédant licences et compétences pour utiliser Metafor). * Après réflexion avec Romain et Jean-Philippe, on a plutôt proposé d'interfacer la loi matériau de Lagamine afin de pouvoir l'appeler dans un calcul Metafor. * Le présent commit est la première phase de cette interface. Il consiste en : * la compilation de Lagamine (Fortran) sous forme d'une librairie statique * la génération d'une librairie dynamique appelable par le C++ et contenant les matériaux interfacés * la génération d'une structure de matériaux Metafor gérant les paramètres matériaux, les appels aux fonctions de calcul du matériau, la gestions des valeurs aux points d'intégration (GPState) et termes de raideur (GKState),... * une première série de tests (ATTENTION, IL N'Y A PAS ENCORE EUT DE VERIFICATION COMPARATIVE ET DETAILLEE DE LA QUALITE DES RESULTATS NUMERIQUES) * ====== Compilation de Lagamine (exe) ====== * Les sources de Lagamine sont composées d'un prépro (Prepro), du solveur (Lagamine) et d'un post-pro (Select) * Un snapshot des sources Lagamine (version officielle du 02/10/2018) a été commitée sur un répository du département UEE du GitLab de l'ULiège : https://gitlab.uliege.be/UEE/Lagamine (en cas de besoin d'accéder à ces sources, demander à L.Duchêne de vous donner l'accès au repository) * Ces sources sont actuellement inchangées * Une branche dénommée "L.Papeleux" a été créée * Des CMakeList.txt ont été ajoutés, fait un peu de nettoyage de forme (suppression de fichiers _old et _bak, suppression des espaces en fin de ligne, ...) * La compilation sous windows (via le compilateur intel fortran 17) effectuée * ATTENTION : * la version windows est intimement dépendante d'un module du compilateur fortran nommé [[https://software.intel.com/en-us/node/535310|"QuickWin"]] * CMake ne supporte pas "QuickWin". * Il faut donc pour compiler Lagamine sous Windows modifier le projet après création par CMake : * Sélectionner le projet -> properties * Dans la configuration Fortran -> Librairies : choisir comme RuntimeLibrary "QuickWin" en Release et "Debug QuickWin" en Debug (voir figures) * Valider (Apply) {{:commit:2018:10_24:lagaminequickwinrelease.png?300 |}} {{:commit:2018:10_24:lagaminequickwindebug.png?300|}} * Au besoin, faire de même pour les autres projets (Prepro et Select) * La suppression de la dépendance à QuickWin ainsi que le portage sous Linux (à sources constantes) demandant de travailler la structure et le fond du code, on n'a pas poursuivi cette voie plus avant (le but d'avoir une version de debug de Lagamine sur mon pc étant atteint) ====== LagamineAPI ====== * Un projet "LagamineAPI" a été crée dans le groupe du service sur le GitLab ULiège pour générer une librairie dynamique des lois matériaux de Lagamine appelable par Metafor. Ce projet est accessible à l'adresse : https://gitlab.uliege.be/am-dept/MN2L/LagamineAPI * Le projet se décompose en * LagamineLib : génération d'une lib statique Fortran de Lagamine (tout est dans la lib, sauf les fichiers qui ne compilent pas sous linux). Cette section ne contient aucune source, pour compiler cette lib, il est nécessaire de faire un "git clone" des sources de Lagamine (à partir du gitlab UEE) * LagamineAPI : génération d'une lib dynamique C++ contenant uniquement les lois choisies. Actuellement, seules 4 lois matériaux sont interfacées : * ELA3D : loi élastique * ARB3D : loi élasto-plastique à écrouissage isotrope/mixte/cinématique * HILL3D : loi élasto-plastique à surface de plasticité de Hill 48 * IRSID3D : (je sais pas trop) * Pour interfacer une loi, il faut : * définir l'interface vers la loi fortran dans le fichier "lagamine.h" (le mecanisme CMake "FortranCInterface" permet d'assurer à travers CMake le respect des Calling Convention entre fortran et C/C++. C'est CMake qui génère les Macros "FC_GLOBAL" et "FC_GLOBAL_". Voir le fichier FC.h dans le répertoire de compilation du projet) * générer une fonction C++ dans le namespace qui se borne à appeler la fonction fortran (fichiers "lagamineAPI.h/cpp") * Attention, pour générer ce projet, il est nécessaire de disposer d'un compilateur Fortran et C++ * La librairie lagamineAPI.dll (lagamineAPI.so) est compilée dans mes Libs (sur le ftp : /ftp/metafor/bin/VS2015_X64/LibsVS2015_2018-10-23.zip) et installée sur toutes les stations (sauf fabulous) dans /opt/lagamine-20181022 et un liens symbolique /opt/lagamine généré pour une évolution transparente à l'avenir * => mettez à jour vos Libs (et réexecutez le setup) * ==> mettez à jour vos LinuxBin (~/bin) sur les stations * Cette librairie est appelée à évoluer au fur et à mesure que j'ajouterais des lois matériaux dans l'interface * Spring : les vérifications liées à "FortranCInterface" indiquent une incompatibilité entre gfortran (fortran gnu) et icc (c++ intel) et comme on a pas acheté le compilateur intel fortran (ifort) => compilation de LagamineLib classiquement avec gfortran et gcc (utiliser le fichier de configuration spring-gcc.cmake au lieu de spring.gcc) * Windows : de memoire, je crois avoir lu que le mécanisme "FortranCInterface" permettrait de linker des libs gfortran (mingw) avec le visual c++. ====== Metafor ====== * Nouveau projet dans oo_nda : mtLagamine (désactivable avec l'option de cmake : NDA_LAGAMINE) * Le matériau générique LagamineMaterial dérive de HypoMaterial * les matériaux interfacé sont : * ElaLagMaterial : interface vers ELA3D * ArbLagMaterial : interface vers ARB3D * Hill48LagMaterial : interface vers HILL3D * Les pages de doc sont à faire pour définir la signification des paramètres matériaux => actuellement regardez dans les tests ... * dans chaque sous répertoire de test, chaque test est dupliqué en version Metafor et version Metafor/Lagamine (préfixés par "Lag") * Principales différences avec Metafor : * Calcul en contraintes (pas de séparation Deviatoric et Volumic) => pas possible d'utiliser les SRI "PURS" * ce n'est pas l'incrément de défo qui est passé au calcul des contraintes, mais le tenseur D "taux de déformation * La matrice de raideur est calculée au moment du calcul des contraintes (ca me simplifie le travail, je n'ai que 1 routine à interfacer) => stoquée dans le LagamineGPKState dans la variable "complianceTensor" (9x9 doubles) * Une fonction ''void FourthOrderTensor3D::addLagamineComplianceTensor(const double *c)'' ajoute la matrice de raideur matérielle calculée par Lagamine (consevée dans le "complianceTensor) dans le formalisme Metafor. On a donc déjà accès à des calculs avec matrice de raideur tangente analytique (au sens Metafor, le "complianceTensor" étant parfois calculé par perturbation au sein du matériau) * ====== Nexts steps : ====== * Vérifier la justesse des résultats sur monos éléments (contrainte, objectivité, petites défo / grand déplacement / grandes rotations / grandes défo, ...) * Débugger la non convergence de "Shear3DAnaSriPr" et "Shear3DSNumSriPr" dans la procédure materialTesting des différentes lois ARB3D * discuter avec Helene, Laurent ou autre personne connaissant Lagamine de la fixation de certains paramètre numériques * récupérer des jeux de données et résultats Lagamine (pour comparaison : j'ai du mal à les écrire) * implémenter des matériaux TM (gérer la dépendance des paramètres à la température) * faire un peu de réflexion sur le naming des matériaux * réfléchir à des petites réorganisations des matériaux Metafor pour simplifier les structures et interfaces (actuellement les LagamineMaterials dérivent de HypoMaterial, mais on pourrait faire glisser le curseur pour éviter les redéfintions et autres copier-coller) * documenter ===== Divers : ===== * GETMACRO_C : Ajout d'un cast C pour forcer le typage (de double[] en double*) : Romain est-ce une bonne idée (j'ai fait ca vite mais maintenant je me pose la question de la sécurité d'une telle démarche ... Ne devrais-je pas explicitement caster la sortie de mon get ? // ----------- GETTER macro const #define GETMACRO_C(TYPE, VAR, UVAR) \ inline TYPE get##UVAR() const { return (TYPE) VAR; } // ----------- GETTER macro #define GETMACRO(TYPE, VAR, UVAR) \ inline TYPE get##UVAR() { return (TYPE) VAR; } * toolbox.utilities : ajout d'un try except autour de la récupération du nom d'utilisateur (le NAS ayant fait sa mise à jour durant mes batteries, j'ai ~1/5 des tests qui ont foiré à l'affichage du nom d'utilisateur !!! toolbox.utilities : lignes 81-84 import pwd try: print "\tby :", pwd.getpwuid(os.getuid()).pw_name except: # if ldap is down => pwd cannot return getpwuid print "\tby :", os.getuid() ===== UPDATE : ===== * update sous Windows : * updatez vos sources (oo_meta ET oo_nda) * récupérez (sur le ftp: /ftp/metafor/bin/VS2015_X64/LibsVS2015_2018-10-23.zip) et installez la nouvelle version des Libs * update Linux : * updatez vos sources * updatez le système de configuration (linuxbin dans ~/bin) * sur d'autres machines : venez me trouver... ===== Fichiers ajoutés/supprimés : ===== Added : oo_meta/CMake/findLAGAMINE.cmake Added : oo_nda/mtLagamine Added : oo_nda/mtLagamine/__init__.py Added : oo_nda/mtLagamine/_src Added : oo_nda/mtLagamine/_src/CMakeLists.txt Added : oo_nda/mtLagamine/_src/Added : oo_nda/mtLagamine.i Added : oo_nda/mtLagamine/src Added : oo_nda/mtLagamine/src/ArbLagGpState.cpp Added : oo_nda/mtLagamine/src/ArbLagGpState.h Added : oo_nda/mtLagamine/src/ArbLagMaterial.cpp Added : oo_nda/mtLagamine/src/ArbLagMaterial.h Added : oo_nda/mtLagamine/src/CMakeLists.txt Added : oo_nda/mtLagamine/src/ElaLagGpState.cpp Added : oo_nda/mtLagamine/src/ElaLagGpState.h Added : oo_nda/mtLagamine/src/ElaLagMaterial.cpp Added : oo_nda/mtLagamine/src/ElaLagMaterial.h Added : oo_nda/mtLagamine/src/Hill48LagGpState.cpp Added : oo_nda/mtLagamine/src/Hill48LagGpState.h Added : oo_nda/mtLagamine/src/Hill48LagMaterial.cpp Added : oo_nda/mtLagamine/src/Hill48LagMaterial.h Added : oo_nda/mtLagamine/src/LagamineGpkState.cpp Added : oo_nda/mtLagamine/src/LagamineGpkState.h Added : oo_nda/mtLagamine/src/LagamineMaterial.cpp Added : oo_nda/mtLagamine/src/LagamineMaterial.h Added : oo_nda/mtLagamine/src/Added : oo_nda/mtLagamine.cpp Added : oo_nda/mtLagamine/src/Added : oo_nda/mtLagamine.h Added : oo_nda/mtLagamine/tests Added : oo_nda/mtLagamine/tests/__init__.py Added : oo_nda/mtLagamine/tests/Arb3D Added : oo_nda/mtLagamine/tests/Arb3D/__init__.py Added : oo_nda/mtLagamine/tests/Arb3D/EvpIsoHLinTrac3dEasAna.py Added : oo_nda/mtLagamine/tests/Arb3D/EvpIsoHLinTrac3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Arb3D/EvpKinHLinTrac3dEasAna.py Added : oo_nda/mtLagamine/tests/Arb3D/EvpKinHLinTrac3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Arb3D/EvpMixtHLinTrac3dEasAna.py Added : oo_nda/mtLagamine/tests/Arb3D/EvpMixtHLinTrac3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Arb3D/LagEpArcLinHTrac3dEasAna.py Added : oo_nda/mtLagamine/tests/Arb3D/LagEpArcLinHTrac3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Arb3D/LagEpIsoHLinTrac3dEasAna.py Added : oo_nda/mtLagamine/tests/Arb3D/LagEpIsoHLinTrac3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Arb3D/LagEpKinHLinTrac3dEasAna.py Added : oo_nda/mtLagamine/tests/Arb3D/LagEpKinHLinTrac3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Arb3D/LagEpMixtHLinTrac3dEasAna.py Added : oo_nda/mtLagamine/tests/Arb3D/LagEpMixtHLinTrac3dSriPrAna.py Added : oo_nda/mtLagamine/tests/complex Added : oo_nda/mtLagamine/tests/complex/__init__.py Added : oo_nda/mtLagamine/tests/complex/Arb3D2IsoHLagamine.py Added : oo_nda/mtLagamine/tests/complex/Arb3D2KinHLagamine.py Added : oo_nda/mtLagamine/tests/complex/Arb3D2MixtHLagamine.py Added : oo_nda/mtLagamine/tests/complex/Arb3DIsoHLagamine.py Added : oo_nda/mtLagamine/tests/complex/Arb3DKinHLagamine.py Added : oo_nda/mtLagamine/tests/complex/Arb3DMixtHLagamine.py Added : oo_nda/mtLagamine/tests/complex/ElastLagamine.py Added : oo_nda/mtLagamine/tests/Ela3D Added : oo_nda/mtLagamine/tests/Ela3D/__init__.py Added : oo_nda/mtLagamine/tests/Ela3D/ElastCis3dEasAna.py Added : oo_nda/mtLagamine/tests/Ela3D/ElastCis3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Ela3D/ElastCis3dStdAna.py Added : oo_nda/mtLagamine/tests/Ela3D/ElastTrac3dEasAna.py Added : oo_nda/mtLagamine/tests/Ela3D/ElastTrac3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Ela3D/ElastTrac3dStdAna.py Added : oo_nda/mtLagamine/tests/Ela3D/LagElastCis3dEasAna.py Added : oo_nda/mtLagamine/tests/Ela3D/LagElastCis3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Ela3D/LagElastCis3dStdAna.py Added : oo_nda/mtLagamine/tests/Ela3D/LagElastTrac3dEasAna.py Added : oo_nda/mtLagamine/tests/Ela3D/LagElastTrac3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Ela3D/LagElastTrac3dStdAna.py Added : oo_nda/mtLagamine/tests/Hill3D Added : oo_nda/mtLagamine/tests/Hill3D/__init__.py Added : oo_nda/mtLagamine/tests/Hill3D/EvpIsoHKrupCis3dEasAna.py Added : oo_nda/mtLagamine/tests/Hill3D/EvpIsoHKrupCis3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Hill3D/EvpIsoHKrupTrac3dEasAna.py Added : oo_nda/mtLagamine/tests/Hill3D/EvpIsoHKrupTrac3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Hill3D/LagEvpIsoHKrupCis3dEasAna.py Added : oo_nda/mtLagamine/tests/Hill3D/LagEvpIsoHKrupCis3dSriPrAna.py Added : oo_nda/mtLagamine/tests/Hill3D/LagEvpIsoHKrupTrac3dEasAna.py Added : oo_nda/mtLagamine/tests/Hill3D/LagEvpIsoHKrupTrac3dSriPrAna.py Added : oo_nda/mtLagamine/tools Added : oo_nda/mtLagamine/tools/__init__.py Added : oo_nda/mtLagamine/tools/monoMat3D.py Deleted : Moved : ===== Tests ajoutés/supprimés ===== Adding: Deleted : Moved : --- //[[L.Papeleux@ulg.ac.be|Luc Papeleux]] 2018/10/23 //