elsA Couplage elsA/ens++ à l`aide du logiciel PALM (Note Technique )
Transcription
elsA Couplage elsA/ens++ à l`aide du logiciel PALM (Note Technique )
elsA DSNA Couplage elsA/ens++ à l’aide du logiciel PALM Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 1 / 27 Couplage elsA/ens++ à l’aide du logiciel PALM (Note Technique ) Objet : couplage multi-disciplinaire Qualité Rédacteur(s) Nom(s) Frieder Loercher Diffusion : Voir page en annexe DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 2 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA Couplage d’elsA à l’aide de PALM 1. Introduction Le logiciel PALM (Projet d’Assimilation par Logiciel Multi méthode), developpé au CERFACS (www.cerfacs.fr/~palm), permet de coupler plusieurs applications, éventuellement parallélisées via MPI ou OpenMP elles-mêmes. Les applications couplées avec PALM peuvent entre autres échanger des données aisément. PALM gère le rassemblement de champs de données d’une application distribuée sur plusieurs processeurs dans un champs global ainsi que la redistribution sur une autre configuration de processeurs utilisée par une autre application. Cette note décrit dans les Sections 2 à 8 une approche générale de l’utilisation de PALM avec elsA. Des applications que l’on pourrait coupler à elsA peuvent être par exemple : – une application de contrôle qui recoit en permanence pendant un calcul d’elsA des données elsA afin de fournir à l’utilisateur l’état du calcul ou des résultats intermédiaires. De plus, une telle application pourrait indiquer à elsA de terminer son calcul (par exemple, si un critère d’arrêt est atteint). – des applications multiphysiques en aéroelasticité, aérothermique, aéroacoustique. L’ONERA a déjà experimenté ce type de couplage avec l’outil CALCIUM d’EDF dans le cadre du projet ARCAE. Dans le cadre de ce travail, une application a été réalisée qui couple les logiciels elsA, ENS++ et elsa_damas et qui a les fonctionalités suivantes: – elle permet de mettre à jour en permanence une base de données damas, pendant un calcul d’elsA utilisant plusieurs processeurs, avec des résultats préliminaires d’elsA. – elle permet d’effectuer des post-traitements ENS++ à intervalles réguliers avec des résultats préliminaires d’un calcul d’elsA (par exemple, calculer de coupes de ρ à intervalle régulier). – elle permet d’effectuer, pendant un calcul elsA, en parallèle des post-traitements ENS++ des résultats préliminaires et d’arrêter le calcul elsA si les résultats du post-traitement correspondent à un critère d’arrr̂et (par exemple, si une variable calculée par ENS++ a convergé). Les Sections 9 à 13 décrivent précisément cette application particulière. a été couplé avec succès sur les machines Compaq Alpha du CERFACS et SUN SOLARIS5.9 du CERFACS et les IBM Power3 et Power4 du CINES. elsA Sur les machines Power3 et Power4, des problèmes ont été rencontrés dûs au fait qu’elsA utilise des librairies partagées. Un couplage elsA PALM nécessite que elsA soit compilé en mode statique (sur IBM). 2. PALM (Projet d’Assimilation par Logiciel Multi méthode) Il existe deux versions principales de PALM: PALM_research et PALM_MP. La version la plus récente est PALM_MP. Ce document est basé uniquement sur une utilisation de PALM_MP. Les DTP MODELES DE DONNEES AERODYNAMIQUES elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 3 / 27 avantages principaux de PALM_MP par rapport à PALM_research sont: – PALM_MP est basé sur le modèle MPMD (Multiple Process Multiple Data), alors que PALM_research est basé sur le modèle SPMD (Singe Process Multiple Data) émulant du MPMD. En pratique, cela veut dire que, pour les différentes applications couplées, différents fichiers exécutables sont créés (PALM_research: un exécutable global est généré qui est, pendant l’exécution, chargée entièrement sur tous les processeurs). – PALM_MP supporte le Fortran, le C et le C++ (alors que PALM_research supporte seulement le Fortran). – dans le futur, PALM_MP implémentera des objets de taille dynamique (jusqu’à présent, il faut figer les tailles des champs d’échange de données au moment de la compilation finale de l’application PALM). Comme elsA utilise des champs de taille dynamique, cela sera d’un grand interêt. Il est recommandé de bien se former à PALM avant de travailler sur le couplage PALM - elsA. Il existe de bons tutoriels, et après trois jours de formation, on a acquis les bases fondamentales pour un travailler avec PALM. 3. Que faut-il faire pour coupler une application avec PALM? 1. s’assurer de la disponibilié des fonctionalités du standard MPI2 sur la machine cible (nécessitées par PALM_MP). 2. installer le logiciel PALM_MP sur la machine cible. 3. pour chaque application (une application est appelée unité dans l’environnement PALM) , donner un certain nombre d’informations dans une "carte d’identité" (Nom de l’unité, nombre de processeurs de l’unité, taille des champs de données à envoyer et à recevoir, distribution des données sur les processeurs, nom des fichiers à compiler, nom de la fonction à appeler). 4. changer le nom de la fonction main de l’application dans le nom de la fonction à appeler décrit dans la carte d’identité. (Pour les unités Fortran: changer le mot clé PROGRAM dans l’unité en SUBROUTINE.) 5. enlever dans l’application les appels à MPI_Init et MPI_Finalize. 6. remplacer le communicateur MPI_COMM_WORLD par la variable PALM PL_COMM_EXEC. Note: pour pouvoir utiliser la constante PL_COMM_EXEC, il faut inclure un fichier d’entête, palmlib.h pour des unités en Fortran et palmlibc.h pour les unités en C ou C++. 7. PALM_Put et PALM_Get aux endroits où on veut envoyer ou recevoir des données d’une unité couplée. 8. définir, à l’aide du logiciel PrePALM, l’enchaînement des unités et les liens entre les applications (déroulement des lancements des unités, descriptions des communications possibles). 9. compiler l’application PALM (y compris la compilation des unités). 10. lancer l’application avec le programme principal qui s’appèle toujours palm_main. 4. Le standard MPI2 MPI2 est un nouveau standard de la parallélisation MPI (voir http://www.mpi-forum.org/docs/mpi-20-html/ Pour une utilisation de PALM_MP, il est nécessaire que ce standard soit disponible. Il ne l’est pas DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 4 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA encore sur plusieurs architectures récentes (Compaq Alpha, SOLARIS5.9, IBM AIX5.1, ...). Mais il existe, dans le domaine publique, une implémentation gratuite de la norme MPI2 qui s’appèle lam (www.lam-mpi.org) et qui met à disposition ces fonctionalités. lam est compilable sur une large gamme d’architectures récentes. Une application parallélisée avec lam-mpi doit être compilée avec un compilateur particulier (qui est effectivement le compilateur avec lequel lam a été compilé, légèrement modifié par lam). Ce compilateur a le nom mpiCC (C++), mpicc (C) ou mpif77 (Fortran 90 et 77) et se trouve dans le répertoire $LAMHOME/bin, où $LAMHOME est le répertoire d’installation de lam. Par conséquent, elsA doit être compilé (si lam est utilisé) avec ces compilateurs. Note: dans les fichiers Fortran d’elsA, il n’y a pas d’appels à des fonctions MPI, donc il suffit de changer le compilateur C++. Cela change si on veut envoyer des données à partir d’un sousprogramme Fortran (n’a pas Ãl’tÃl’écessaire dans le cadre de nos travaux) 5. Concept du couplage d’elsA avec PALM L’approche décrite ici a comme objectif de limiter les modifications dans le logiciel elsA autant que possible afin de garder une bonne modularité entre elsA, les autres unités à coupler et la zone de couplage avec des informations qui ne concernent que le couplage. Pour une utilisation d’elsA dans un cadre PALM, un nouveau suffixe de production a été introduit: le suffixe _palm. Les charactéristiques de compilation d’une production _palm sont: – le mot clé E_PALM est activé pour le compilateur C++. – deux répertoires de fichiers d’entête liés au couplage avec PALM sont mentionnés pour le compilateur C++ (il est nécessaire d’inclure des fichiers d’entête de PALM, donc on ajoute les répertoires où ces fichiers se trouvent à la liste des répertoires où le compilateur C++ cherche des fichiers d’entête). – un compilateur C++ adapté est utilisé pour la compilation, voir la Section précédente. Pendant la compilation, deux variables d’environnement sont utilisées: – PALMHOME qui contient le chemin d’ une version installée de PALM. – PALMWORKDIR qui contient le chemin du répertoire de couplage, càd le répertoire où toutes les informations concernant le couplage sont rassemblées. A l’aide du mot clé E_PALM, on peut maintenant distinguer, dans le code source, des parties de codes qui sont prises en compte seulement pour une compilation _palm. Pour une telle compilation, il faut maintenant: – changer le nom de la fonction main (dans une unité PALM, la fonction main ne doit pas apparaître). – enlever tous les MPI_Init et MPI_Finalize – changer toutes les occurences de MPI_COMM_WORLD par PL_COMM_EXEC (voir Section suivante pour la réalisation). DTP MODELES DE DONNEES AERODYNAMIQUES elsA DSNA Couplage elsA/ens++ à l’aide du logiciel PALM Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 5 / 27 – appeler les primitives PALM_Put et PALM_Get aux endroits où on veut envoyer et recevoir des données. La compilation d’elsA s’arrête après la création du fichier elsA_wrap.o (pas de création d’elsA_wrap.x). L’édition des liens finale sera effectuée au cours de la compilation de l’application couplée PALM. La "carte d’identité" de l’unité elsA se trouve dans le répertoire du couplage (un répertoire qui n’est pas logiquement un sous-répertoire d’elsA). Dans ce répertoire, il y a aussi tous les fichiers qui décrivent la configuration de l’application PALM avec toutes les communications possibles ainsi que les makefiles de PALM et finalement les exécutables. L’essentiel de ces fichiers est gérée à l’aide de l’outil prePALM. Il est recommandé d’utiliser toujours le mot clé _mpi avec le mot clé _palm, car on a identifié des problèmes en utilisant une version non-MPI d’elsA avec PALM. Le couplage d’elsA avec PALM a l’inconvénient de supprimer la possibilité de passer les paramètres d’appel de l’application PALM à l’unité elsA. On contourne ce problème via le fichier utilisé pour décrire la carte d’identité d’elsA où quelques lignes de code cherchent les paramètres d’appel pour elsA dans un fichier (elsaparams.in) et appellent la fonction main d’elsA (qui ne s’appele plus main) avec ces paramètres de ligne de commande. 6. Réalisation Dans cette section, les étapes d’une réalisation possible sont décrites pour un couplage d’elsA à l’aide de PALM. 1. s’assurer que le système a les capacités de MPI2. Si ce n’est pas le cas, il faut installer un outil qui s’appele lam sur le système (www.lam-mpi.org). lam doit être compilé avec les mêmes compilateurs que l’on veut utiliser pour la compilation d’elsA. Exemple: Si on veut compiler elsA avec le compilateur C++ cxx, il faut compiler lam avec cxx. Ensuite, lam crée un ”wrapper” mpiCC, qui correspond au compilateur cxx incluant des modifications lam et qui est à utiliser pour la compilation d’elsA. 2. installer le logiciel PALM_MP. 3. définir le suffixe de production _palm dans $ELSAHOME/Kernel/cfg/MakeMake.mk: palm) FLIST="${FLIST} -D___PALM"; PRODMOD="${PRODMODE}_palm";; 4. d’ajouter dans le fichier $ELSAHOME/Kernel/cfg/prods/Make_*.mk correspondant à la machine cible les lignes suivantes: #ifdef ___PALM PALMCCCFLAGS=-DE_PALM -I$(PALMHOME)/include -I$(PALMWORKDIR) E_PALM=yes #endif et ajouter, dans le même fichier, $(PALMCCCFLAGS) à la variable E_CCCFLAGS. La variable d’environnement PALMHOME contient le chemin au logiciel PALM, PALMWORKDIR contient le chemin pour le couplage. Avant la compilation d’elsA, ces variables sont à définir. 5. dans le même fichier, il faut définir les compilateurs utilisés. Pour un couplage elsA-PALM, avec le logiciel lam, le compilateur C++ à choisir est mpiCC (on peut distinguer entre une production d’elsA normale et une production à compiler pour une utilisation avec PALM à l’aide du mot clé ___PALM). DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 6 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA 6. modifier dans $ELSAHOME/Kernel/cfg/prods/Make_lib.mk, la règle .o.x: initiale (I3104f): @if ($(LD) $(E_SCOPE_LIB) -o $@ $< $(E_ELSALIBS) $(LDFLAGS) $(OTHERLIBS));\ then :; else rm -f $@ ;$(E_ECHOMAKE) " FAILED";fi changer en: @if [ x$(E_PALM) = xyes ]; then\ echo $(LD) $(E_SCOPE_LIB) $(ELSAHOME)/Kernel/src/$(E_SYS)/$< $(E_ELSALIBS)\ $(LDFLAGS) $(OTHERLIBS) > $(PALMWORKDIR)/elsalinkflags.in;\ $(E_ECHOMAKE) $@ NOT built. Parameters for linkage indicated\ in $(PALMWORKDIR)/elsalinkflags.in;\ else\ if ($(LD) $(E_SCOPE_LIB) -o $@ $< $(E_ELSALIBS) $(LDFLAGS) $(OTHERLIBS));\ then :; else rm -f $@ ;$(E_ECHOMAKE) " FAILED";fi ;\ fi Cette modification fait que, pour une production _palm, le fichier elsA_wrap.x n’est pas linké. Les paramètres du link qui auraient été utilisés sont écrits dans un fichier. Ceux-ci sont nécessaire pour le link final de l’application PALM. Note: tous les paramètres de linkage étaient écrits dans le fichier elsalinkflags.in sauf le -o $@. Le nom du fichier finalement linké dans le cadre PALM ne sera pas celui utilisé par elsA. 7. modifier dans $ELSAHOME/Kernel/src/Api/Make_obj.mk, le target api: initial (v3104f): @$(E_ECHOMAKE) " Symlink exec to " $(E_PRODDIR)/$(E_EXECNAME) @(cd $(E_PRODDIR); ln -sf Wrapper/elsA_wrap.x $(E_EXECNAME) 2>/dev/null) @$(E_ECHOMAKE) " Done" changé en: @if [ x$(E_PALM) = $(E_ECHOMAKE) " (cd $(E_PRODDIR); fi @$(E_ECHOMAKE) " xyes ]; then :; else\ Symlink exec to " $(E_PRODDIR)/$(E_EXECNAME);\ ln -sf Wrapper/elsA_wrap.x $(E_EXECNAME) 2>/dev/null);\ Done" Comme pour une production _palm le fichier elsA_wrap.x n’est pas linké, on ne fait pas non plus un lien symbolique sur ce fichier. 8. mettre des #ifdef E_PALM devant toutes les occurences de MPI_Init et MPI_FINALIZE dans le code source d’elsA (et des #endif après ces occurences). Toutes les occurences sont centralisées dans le fichier /src/Pcm/Base/PcmTaskMPI.C. 9. ajouter, dans le fichier $ELSAHOME/Kernel/src/Pcm/Base/PcmDefMpi.h, après la ligne #include <mpi.h>, les lignes: #ifdef E_PALM #undef MPI_COMM_WORLD #define MPI_COMM_WORLD PL_COMM_EXEC #endif Cela remplace la constante MPI_COMM_WORLD dans tout le code par PL_COMM_EXEC. Il faut donc inclure dans ce fichier (PcmDefMpi.h) le fichier palmlibc.h. Note: à partir de la version 3104f, le fichier mpi.h est uniquement inclu dans PcmDefMpi.h. Donc, ce mécanisme fonctionne seulement à partir de cette version d’elsA. 10. changer dans /src/Api/Wrapper/elsA_wrap.C la ligne: int main(int argc, char **argv) DTP MODELES DE DONNEES AERODYNAMIQUES elsA DSNA Couplage elsA/ens++ à l’aide du logiciel PALM Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 7 / 27 en: #ifdef E_PALM int progelsa(int argc, char **argv) #else int main(int argc, char **argv) #endif Note: le nom progelsa est choisi arbitrairement; cette fonction est appelée par une autre fonc- tion encore à définir dans le répertoire du couplage. 11. ici, le procédé pour chaque envoi ou reception de données est décrit. Si l’on veut envoyer/recevoir des données dans un "fichier" C++, il faut tout d’abord déclarer l’inclusion des fichiers: #include "palmlibc.h" #include "palm_user_paramc.h" //pour des constantes utilisateur dans PALM Maintenant, il est possible d’appeler PALM_Put resp. PALM_Get de n’importe quel endroit dans ce fichier. Pour pouvoir compiler tout cela aussi pour une production elsA sans PALM, il est pratique de mettre tout les instructions spécifique à PALM dans des #ifdef E_PALM-régions. 12. avant une compilation d’elsA, il faut définir les deux variables d’environnement utilisées dans les fichiers make: $PALMHOME contient le chemin au logiciel PALM, les fichiers include se trouvent dans $PALMHOME/include et les librairies dans $PALMHOME/lib. $PALMWORKDIR contient dans le répertoire du couplage; ici le compilateur trouve le fichier palm_user_param.h dans lequel les constantes d’utilisateur au niveau de PALM sont définites. 13. créer, dans le répertoire de couplage, un fichier .C avec la carte d’identité d’elsA et la fonction qui appele elsA (donc qui appele progelsa() dans cet exemple). Cette fonction simule aussi des paramètres d’appel à elsA. Ce fichier se présente, au minimum (sans communications décrites), comme suit: /*PALM_UNIT -name elsA\ -functions {C++ call_elsa}\ -object_files {unit_elsA.o}\ -parallel mpi\ -minproc 1\ -maxproc 1\ -comment {elsA caller} */ extern int progelsa(int argc, char ** argv); #include <ifstream.h> #include <iostream.h> extern "C" void call_elsa_(void) { ifstream infile; infile.open("elsaparams.in"); char argline[1000]; infile.getline(argline,1000,’\n’); infile.close(); int i=0; int argc_=1; char * ptr[20]; while(argline[i]!=0) { DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 8 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA if (((i==0)||(argline[i]==’ ’)) && (argline[i+1] != ’ ’) && (argline[i+1] != ’\n’) && (argline[i+1] != 0) && (argline[i+1] != ’\t’)) { if (i==0) ptr[argc_]=&(argline[i]); else { argline[i]=0; ptr[argc_]=&(argline[i+1]); } argc_++; } i++; } char nullarg[20]="main_block_1"; ptr[0]=nullarg; char ** argv_; argv_ = ptr; cout << "NOW CALLING ELSA..." << endl; int result=progelsa(argc_,argv_); cout << "ELSA returns: " << result << endl; } Ici, la carte d’identité est constituée seulement de la description de l’unité elsA, avec seulement un processeur. Dans cette carte d’identité, l’attribut functions, qui est affecté par call_elsa est définie comme la fonction à appeler par PALM lors d’un appel de l’unité elsA. PALM réserve dans ce cas 1 processeur à l’unité elsA. Le mot clé object_files contient normalement toutes les dépendances de l’unité, mais, il est trop complexe, dans le cas d’elsA, d’y mentionner tous les .o d’elsA; de plus on veut utiliser des librairies partagées. Donc, on mentionne ici seulement le fichier objet elsamask.o (pourvu que le fichier décrit ici soit nommé elsamask.C). Les autres dépendances seront résolues différemment. La nomenclature extern "C" void call_elsa_(void) est due à une inconsistance dans ma version de PALM et pourra plus tard être remplacée par extern "C" void call_elsa(void). La fonction call_elsa_ appele simplement la fonction progelsa, qui est en fait la fonction main d’elsA (avec le nom modifié.). De plus, call_elsa_ cherche des paramètres de la ligne de commande qu’il faut donner à elsA dans le fichier elsaparams.in et les fourni à progelsa. Note: le nom de l’exécutable est mis dans argv_[0]. Sur IBM, il est absolument nécessaire de bien le faire, sinon on obtient des erreurs difficile à identifier. 14. arrivé à ce stade, il faudrait aussi décrire les cartes d’identités des autres unités (i.e. les applications couplées à elsA). La marche à suivre pour une application couplée à elsA est équivalente à celle utilisée pour elsA. 15. définir, à l’aide du logiciel prePALM, le déroulement de l’application couplée et toutes les communications possibles puis création des fichiers PALM. 16. dans le fichier Makefile créé par prePALM, il faut ajouter, à la commande du linkage du programme qui correspond à elsA, les paramètres de linkage obtenus par la commande make api DTP MODELES DE DONNEES AERODYNAMIQUES elsA DSNA Couplage elsA/ens++ à l’aide du logiciel PALM Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 9 / 27 (y compris les librairies d’elsA et elsA_wrap.o). Il est strictement conseillé d’utiliser vraiment CES paramètres et de ne pas construire un lot de paramètres par main. On a réalisé cela en ajoutant au bon endroit ‘sed -e "s/[^ ]* //" elsalinkflags.mak‘. Note: à l’exécution de la règle make api, les paramètres de linkage d’elsA étaient écrits dans ce fichier. Le premier mot doit être enlevé à l’aide de sed, puisqu’il s’agit du compilateur lui-même. Note: on peut sans problème décrire une dépendance dans ce Makefile qui compile automatiquement le make elsa si nécessaire. Note: si on crée, dans la suite, à nouveau des fichiers à l’aide de PrePALM (suite à une modification...) , il faut faire attention de ne pas supprimer les modifications qui ont été faites dans ce Makefile. Le Makefile doit normalement seulement être modifié si de nouvelles unités sont ajoutées dans l’application PALM. 17. compilation d’elsA et des autres unités. 18. si tout s’est bien passé, un make dans le répertoire de couplage crée l’application couplée PALM. Pour la lancer, il faut lancer l’exécutable palm_main. 7. Descriptions des fonctionalités intégrés à partir de I3107e Les points de 3 à 10 de la section précédente sont intégrés dans elsA à partir de la version I3107e. De plus, l’envoi de données d’elsA est facilité à l’aide d’un nouveau format d’extraction qui s’appele palm. Un objet d’extraction avec ce format envoie les données à une interface PALM au lieu de les écrire dans un fichier, comme pour les autre formats. Les données envoyées par un objet d’extraction PALM sont toujours précédées par quelques informations concernant les données qui viennent dans la suite. Ce format d’extraction palm est réalisé notamment dans les deux fichiers Sio/Access/SioAccessPALM.h et Sio/Access/SioAccessPALM.C. La nouvelle classe créée dans ces fichiers se comporte similairement aux autres classes de format d’extraction, sauf que les données sont envoyées à une interface PALM au lieu d’un fichier. Note: le format palm fonctionne seulement pour des extractions de données, et non pas pour une importation de données, par exemple de maillages. Cette dernière fonctionalité pourrait être ajoutée très facilement si besoin est. Les données sont toujours envoyées dans le format double de C++. Pour le format du header envoyé avant les données, voir le fichier Sio/Access/SioAccessPALM.C. Les informations que l’on veut envoyer avant les données sont éventuellement à adapter à l’application couplée. Un objet d’extraction PALM donne aux paquets de données un tag PALM qui identifie le bloc d’où les données viennent et la variable à laquelle les données correspondent. Ce tag est calculé selon la formule iBlock*numVars+iVar. iVar est un indice qui correspond à une certaine variable, et numVars est l’indice le plus grand possible. La correspondance entre le nom de la variable et son indice est gérée dans le fichier Sio/Access/SioAccessPALM.C. Pour l’envoi d’un paquet de données, PALM utilise un nom pour spacename et un nom pour objectname (voir documentation PALM). Le string que l’on donne à un objet d’extraction PALM avec le mot clé filename dans le script Python est utilisé pour trouver ces deux noms. DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 10 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA Pour les headers, spacename est filename+"headerspace"+ et objectname est filename+"headerobject"+. Similairement, pour les vraies paquets de données, ces noms sont filename+"dataspace"+ et filename+"dataobject"+ respectivement. Il faut donc utiliser le mot clé filename pour les objets d’extraction PALM en correspondance avec les cartes d’identité de PALM, et en correspondance avec les unités receptrices. 8. Quelques retours d’expériences Dans cette section, on décrit quelques expériences utiles. – dans la version de PALM utilisée, prePALM n’a pas pu lire des cartes d’identité écrites en écriture C++, j’ai donc utilisé l’écriture C (ce qui n’est pas forcément compatible avec le standard de compilation C++. Ce problème devrait être resolu dans de futures versions de PALM_MP). – dans la carte d’identité: il faut, avant des paranthèses, toujours mettre un espace, donc par exemple shape (1) et pas shape(1). – lire une carte d’identité par prePALM: j’ai constaté qu’une mise à jour d’une carte d’identité conduit souvent à des inconsistences. Je recommande, pour l’instant, de toujours EFFACER une unité dans prePALM avant de la recharger. Cela a l’inconvenient que les liens de l’unité sont perdus et doivent être reconstruits. Ce problème devrait disparaître dans de futures versions de PALM. – dans prePALM: mettre TOUTES les instructions, unités etc. dans un bloc. – contrairement à PALM_research, il faut toujours définir le nombre de processeurs utilisés pour l’ensemble de l’application PALM. Si un nombre de processeurs trop petit et choisi, PALM peut essayer d’exécuter plusieur branches en séquentiel, ce qui peut conduire à des "deadlocks" de communication. – avant l’exécution de palm_main: lancer le daemon lamboot si nécessaire (si le standard MPI2 n’est pas implanté sur la machine cible). Si un programme utilisant lam ne se termine pas proprement, il faut appeler lamclean avant de relancer une application lam. – au moment où on effectue la commande lamboot, l’environnement actuel est exporté aux hosts de lam. Si on change dans la suite l’environnement actuel (par exemple si on change la version d’elsA utilisée), ce changement ne sera pas automatiquement pris en compte pour les hosts de lam. Pour les mettre à jour, il faut faire un lamhalt et un nouveau lamboot. 9. Un exemple d’application: Le couplage d’elsA, ENS++ et elsa_damas Les sections suivantes décrivent l’application couplée des trois logiciels elsA, ENS++, et elsadamas afin de réaliser des post-processings indisponibles dans elsA en cours de calcul (on evite ainsi d’implanter des fonctionalités ENS++ dans elsA). Cette application est capable de lancer dans un intervalle quelconque (en itérations d’elsA) soit le logiciel ENS++, soit le logiciel elsadamas ou bien les deux avec en entrée des résultats préliminaires d’elsA. De plus, la convergence de plusieurs variables calculées par ENS++ peut être utilisée pour piloter le comportement d’elsA et notamment son intérruption. DTP MODELES DE DONNEES AERODYNAMIQUES elsA DSNA Couplage elsA/ens++ à l’aide du logiciel PALM Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 11 / 27 10. Rappel: Préparation d’elsA, préparation de ENS++ et elsa_damas Rappelons les démarches qui sont à effectuer en général si on veut coupler elsA à l’aide de PALM. 1. PALM et l’environnement MPI2 (eventuellement lam) sont installés sur la machine, elsA est compilé avec un compilateur icompatible avec MPI2. La variable d’environnement PALMHOME contient le chemin vers une version installée de PALM. 2. dans elsA: Les appels à MPI_Init et MPI_Finalize sont supprimés pour la compilation PALM. 3. le communicateur MPI_COMM_WORLD est remplacé par PL_COMM_EXEC. 4. le nom de la fonction main a été changé en progelsa. 5. un répertoire pour l’application couplée a été créé. La variable d’environnement PALMWORKDIR contient le chemin vers ce répertoire. 6. le compilateur d’elsA ajoute les chemins PALMHOME et PALMWORKDIR à la liste des répertoires où il cherche des fichiers d’entête. 7. au lieu d’effectuer le link final de elsA_wrap.x, les paramètres du link final sont écrits dans un fichier (PALMWORKDIR/elsalinkflags.in). 8. dans PALMWORKDIR, une carte d’identité basique a été créée pour elsA. Note: à partir de la version d’elsA I3107, les points de 2 à 7 sont déjà réalisés dans elsa pour une production _palm. Les logiciels ENS++ et elsa_damas sont à préparer de la même manière. Plus précisement: – les points 2 à 3 n’ont pas d’importance, puisque ENS++ et elsadamas ne sont pas des logiciels parallélisés. – comme dans elsA il faut changer le nom de la fonction main dans ENS++: on la nomme progens. elsadamas est écrit en Fortran, donc il faut remplacer le mot PROGRAM par SUBROUTINE. – on ajoute les répertoires PALMHOME et PALMWORKDIR à la liste de répertoires où les compilateurs C++ et Fortran de ENS++ et elsadamas cherchent des fichiers d’entête. – comme pour elsA, le link final n’est pas effectué, et les paramètres du link final sont exportés dans des fichiers (PALMWORKDIR/enslinkflags.in et PALMWORKDIR/elsadamaslinkflags.in). Note: on a, plus tard, besoin des tous les paramètres de linkage, sauf le linkeur lui-même et sauf le -o fichier_executable (il ne faut pas écrire ces derniers paramètres dans le fichier). – pour ENS++ et elsadamas, des cartes d’identité basiques sont créées dans PALMWORKDIR. Exemple pour ENS++ (fichier unit_ens.cc): /*PALM_ID_MODE MP*/ /*PALM_UNIT -name ENS\ -functions {C++ call_ens}\ -object\_files {unit_ens.o}\ -comment {unit ENS} */ extern int progens(void); extern "C" void call_ens() { int i= progens(); } DTP MODELES DE DONNEES AERODYNAMIQUES elsA Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 12 / 27 11. Couplage elsA/ens++ à l’aide du logiciel PALM DSNA Le schéma de l’application couplée b1 b2 Start ON b2 4 100 elsA elsA b1 100 ENS ENS 100 end end elsA_DAMAS elsA_DAMAS b2 Fig. 1 – Schéma de l’application couplée Le schéma présenté est celui de l’application finale. Il est montré ici afin d’expliquer le déroulement de l’application couplée. L’application est constituée de deux branches (nommées b1 et b2). La branche b1 est Start On, càd elle est lancée au démarrage de l’application couplée. La première chose qu’elle fait est le lancement de la branche b2. Dans chaque branche, il y a un bloc (grande région réctangulaire). Un bloc correspond finalement à un exécutable. Il est important de mettre tous les actions à l’intérieur d’un bloc. Les trois unités que l’on voit sont les unités elsA, ENS++ et elsa_damas. Elles correspondent respectivement aux trois logiciels elsA, ENS++ et elsa_damas. L’unité elsA est une unité parallèle, qui utilise ici 4 processeurs (petit chiffre 4). Le concept permet de facilement modifier ce nombre, néanmoins, on voit déjà ici qu’il faut fixer le nombre de processeurs pour chaque unité avant la compilation de l’application couplée. Donc, si on change le nombre de processeurs d’elsA, il est nécessaire de faire quelques modifications des fichiers de description de l’application PALM. Les autres unités ne sont pas en parallèle et utilisent seulement un processus. 11.1. Description des échanges de données et informations L’unité elsA possède cinq communications possibles (slots), dont deux en entrée (cercles du haut) et trois en sortie (cercles du bas). La première entrée correspond à un signal qui autorise l’envoi de données d’elsA. Dans cette application, elsA doit envoyer des données quand la branche réceptrice signale qu’elle est prête. Donc, avant d’envoyer ses données, elsA envoie un signal signifiant qu’elle est prête (la dernière DTP MODELES DE DONNEES AERODYNAMIQUES elsA DSNA Couplage elsA/ens++ à l’aide du logiciel PALM Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 13 / 27 communication en sortie de l’unité elsA). Ensuite, elsA attend un second signal pour envoyer ses données (le PALM_Get pour le signal dans elsA attend jusqu’à ce que le signal soit reçu!). Note: le signal envoyé par elsA contient en plus l’information s’il s’agit de données dans un cadre "envoi périodique" ou dans un cadre "envoi final" de données (ce qui signifie que ce sont les données qui sont envoyées après qu’elsA ait terminé le calcul.) La branche b2 envoie le message qu’elle est prête à recevoir des données tout de suite après avoir reçu le signal d’elsA. Cependant, elle peut le faire seulement à partir du moment où elle a terminé toutes les actions d’ENS++ ou elsa_damas et la réception d’un paquet de données envoyé par elsA antérieurement. La deuxième entrée d’elsA vient d’un buffer. Ce buffer contient seulement un entier dont la valeur correspond à un feedback pour elsA. Suivant cette valeur, elsA peut par exemple terminer le calcul ou effectuer une autre action. Contrairement à une communication directe, une communication par le buffer ne bloque pas dans les PALM_Get: La valeur ne disparait pas du buffer après un PALM_Get et peut donc être reçue plusieurs fois. La première action effectuée par la branche b2 est le remplissage de ce buffer par une valeur qui signale à elsA de continuer normalement. Tant que cette valeur n’est pas modifiée, elsA aura toujours l’ordre de continuer normalement. Dans certaines conditions, comme décrit plus bas, la valeur dans ce buffer est modifiée en une valeur qui signale à elsA d’arrêter le calcul. Les deux sorties d’elsA qui restent correspondent à l’envoi de données résultantes du calcul d’elsA. Il y en a deux parce que toutes les données sont précédées par un paquet d’informations correspondant à la description de ces données. L’envoi de ces paquets se fait en utilisant une communication directe (avec ENS++ ou elsa_damas), pendant que l’envoi des données se fait ici via un buffer. On pourrait aussi envoyer les données directement, l’utilisation du buffer résulte des considérations de performance (si le buffer est utilisé, les données sont stockées seulement une fois dans la mémoire; sinon elles sont stockées deux fois parce qu’il y a deux envois). La description détaillée du transfert des données d’elsA est faite dans la Section 11.3. Les communications à l’intérieur de la branche 2 sont décrites dans la section suivante. 11.2. Description de la branche 2 La branche 2 est un peu plus complexe (notamment contrôle de convergence des variables calculées pas ENS++). Le code de branche 2 (Figure 2) correspond à ce qu’on voit dans la Figure 1, avec plus de détails, seulement pour la branche 2. La branche 2 contrôle le déroulement de l’application (alors que la branche 1 lance seulement une fois l’unité elsA). Selon les signaux qui viennent d’elsA, il est décidé quelles actions sont à effectuer dans branche 2: lancement d’ENS++, d’elsa_damas, ou fin du calcul. La branche 2 contrôle aussi le feedback qui est envoyé à elsA, donc la branche 2 est capable de signaler à elsA d’arrêter le calcul. Dans l’exemple décrit ici, la branche 2 surveille la convergence DTP MODELES DE DONNEES AERODYNAMIQUES elsA Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 14 / 27 Couplage elsA/ens++ à l’aide du logiciel PALM Declarations double precision :: FL_TOLERANCE = 0.0001 integer :: FL_MIN_CONFIRMS = 5 integer :: action_code = 0 double precision :: received_value = 0.d0 double precision :: old_value = 0.d0 double precision :: gap integer :: feedback = 0 integer :: flag = 0 logical :: in_tolerance integer :: nconfirmed = 0 integer :: ib_do BEGIN b2 BEGIN BLOCK 2 feedback=FL_CONTINUE PALM_PUT(one_integer,b2_put_3,PL_NO_TIME,PL_NO_TAG,feedback) DO ib_do = 1, FL_NVARS_TO_CONVERGE, 1 insert some zeros to the oldvalue buffer... PALM_PUT(one_double,b2_put_1,PL_NO_TIME,ib_do,received_value) ENDDO DO WHILE (action_code .ne. FL_FINAL_DATA) PALM_GET(one_integer,b2_get_1,PL_NO_TIME,PL_NO_TAG,action_code) flag=FL_RECEPTION_READY PALM_PUT(one_integer,b2_put_4,PL_NO_TIME,PL_NO_TAG,flag) IF (action_code .eq. FL_PERIODICAL_DATA) ENS in_tolerance=.true. DO ib_do = 1, FL_NVARS_TO_CONVERGE, 1 PALM_GET(one_double,b2_get_2,PL_NO_TIME,ib_do,received_value) PALM_GET(one_double,b2_get_3,PL_NO_TIME,ib_do,old_value) PALM_PUT(one_double,b2_put_2,PL_NO_TIME,ib_do,received_value) gap=abs((received_value−old_value)/old_value) IF (gap .GT. FL_TOLERANCE) in_tolerance=.false. ENDIF ENDDO IF (in_tolerance) nconfirmed=nconfirmed+1 ENDIF IF (.not. in_tolerance) nconfirmed=0 ENDIF IF (nconfirmed .GE. FL_MIN_CONFIRMS) feedback=FL_ELSA_CONVERGED write(*,*)’Send convergence flag to elsA’ PALM_PUT(one_integer,b2_put_5,PL_NO_TIME,PL_NO_TAG,feedback) ENDIF ENDIF IF (action_code .eq. FL_FINAL_DATA) elsA_DAMAS ENDIF ENDDO END BLOCK 2 END b2 Fig. 2 – Code de la branche b2 DTP MODELES DE DONNEES AERODYNAMIQUES DSNA elsA DSNA Couplage elsA/ens++ à l’aide du logiciel PALM Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 15 / 27 de plusieurs variables calculées par ENS++, et décide ainsi quand elsA doit s’arrêter. Afin de pouvoir faire tout cela, quelques variables sont déclarées dans branche 2 (voir Figure 2). Avec FL_TOLERANCE=0.0001 et FL_MIN_CONFIRMS=5, la branche va signaler à elsA d’arrêter le calcul au moment où la variation relative de toutes les variables envoyées par ENS++ était inférieur à 0.0001 (0.01%) pendant 5 évaluations succéssives d’ENS++. Regardons la Figure 2. Après les déclarations, le buffer pour le feedback à elsA est rempli par la constante integer global FL_CONTINUE, définie dans PrePALM. Cela signale à elsA de tout simplement continuer normalement le calcul. Note: dans la suite, quelques constantes comme FL_CONTINUE etc. aparaissent. Ce sont des constantes qu’il faut définir dans PrePALM. Une fois définies, elles seront connues dans les codes de branches et dans les unités (à l’aide d’un fichier d’entête qui est inclu, dans les unités en C++, c’est le fichier palm_user_paramc.h). Ensuite, un buffer appelé oldvaluebuffer est rempli avec des zéros. Ce buffer contient pour chaque variable à surveiller la valeur du tour précédent d’ENS++ afin de pouvoir la comparer avec les nouvelles valeurs obtenues par ENS++. On donne comme tag à chacune de ces variables un nombre (si on contrôle deux variables, ceux-ci sont les nombres un et deux). PALM garde dans le buffer pour chaque tag la valeur la plus récemment envoyée au buffer. Ensuite, la branche 2 entre dans la boucle principale. Dans cette boucle, elle attend toujours un signal action_code d’elsA. action_code peut être FL_PERIODICAL_DATA ou FL_FINAL_DATA. Après avoir reçu ce signal, un signal FL_RECEIPTION_READY est envoyé qui donne à elsA l’autorisation d’envoyer des données. Imaginons qu’ENS++ ou elsa_damas n’ont pas encore achevé le traitement des données d’un tour précédent: la branche deux ne va pas envoyer le FL_RECEIPTION_READY tout de suite, et elsA sera bloqué pour un certain temps. Pour éviter cela, l’intervalle d’envoi de données d’elsA à ENS++ doit être augmenté. Selon la valeur d’action_code, soit ENS++, soit elsa_damas est lancé. Note: il n’y aurait pas de problème pour les lancer tous les deux l’un après l’autre. Dans le cas où ENS++ est lancé, la branche 2 recoit après l’exécution de l’unité ENS++ un certain nombre de variables (celles dont on veut surveiller la convergence). Elle les compare avec les valeurs obtenues du oldvaluebuffer et met à jour ce buffer avec les nouvelles valeurs. Selon les résultats de ces comparaisons, le feedbackbuffer peut être mis à FL_ELSA_CONVERGED, ce qui signale à elsA d’arrêter le calcul. La branche 2 ne s’arrête, dans ce cas, pas encore, mais attend toujours le signal FL_FINAL_DATA, suivi de données, avant de se terminer. 11.3. Méthode pour gérer l’envoi de données distribuées sur plusieurs processeurs PALM fourni un mécanisme qui permet de rassembler automatiquement dans un champs global des données envoyées par plusieurs processus, et de redistribuer ces données pour une autre unité avec un nombre différent de processus. Ce mécanisme n’est pas utilisé pour le couplage décrit ici, pour les raisons suivantes: – PALM utilise l’hypothèse qu’un envoi de données d’un champs global correspond à exactement un PALM_Put sur chaque processus. Or, cette hypothèse ne convient pas à l’envoi de DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 16 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA données dans elsA: la structure du logiciel elsA conduit plutôt à un envoi de données par bloc. Comme le nombre de blocs par processeur est variable, cela conduit à plusieurs PALM_Put d’un processus elsA pour un champs global. – l’utilisation de distributeurs PALM nécessiterait que l’on fixe pour chaque processus la taille de la part locale du champs global au moment de la compilation de l’application couplée. Comme cette taille varie de bloc à bloc, cela serait très difficile à réaliser. – la structure des unités réceptrices (ENS++ et elsa_damas) est plutôt adaptée à une réception de données bloc par bloc et non pas dans un champs global. Donc le rassemblement de données de plusieurs blocs dans un grand champs n’a même pas d’interêt. La solution du problème est simple: chaque processus envoie des données bloc par bloc, et donne un tag à chaque paquet de données qui permet d’indentifier de quel bloc les informations viennent et à quelle variable elles correspondent. Si une unité réceptrice veut recevoir des valeurs d’une certaine variable pour un certain bloc, elle calcule le tag correspondant avec une simple formule et recoit un paquet de données avec ce tag. Ce mécanisme évite toute utilisation de distributeurs PALM. Le seul inconvenient est le fait que l’on ne peut plus utiliser, dans PrePALM, une association automatique. Pour 4 processeurs d’elsA, il faudrait utiliser une association 0:3|0 pour l’envoi de données. La distribution des objets PALM qui correspondent à l’envoi de données est, coté elsA, REPLICATED_ON_ALL_PROCS. 11.3.1. Informations supplémentaires pour un paquet de données Dans l’application décrite ici, chaque paquet de données est précédé par un paquet d’informations concernant les données. Ces informations contiennent par exemple les dimensions du bloc et le nom de la variable à laquelle les données correspondent. La structure de ce paquet d’informations est définie dans le fichier src/Sio/Access/SioAccessPALM.C. Si nécessaire, d’autres informations peuvent être rajoutées à ce header facilement. 11.3.2. Taille des objets d’échange de données Dans l’application réalisée, seulement un objet est utilisé pour tous les envois de données; càd que tous les envois de données ont la même taille. L’inconvénient principal est le fait qu’on génère un traffic qui est significativement plus élevé que nécessaire, puisqu’on est obligé de choisir la taille de cet objet assez élevée pour le bloc le plus grand. De plus, coté récepteur, on est obligé d’allouer, dans tous les cas, un champ qui est assez grand pour pouvoir contenir le paquet de données à recevoir. Pour le logiciel PALM, des objets de tailles dynamiques sont prévues dans une prochaine version. Cette nouvelle capacité permettra d’éviter les inconvénients décrits dans cette section. 12. Les cartes d’identité complètes Les communications décrites, les cartes d’identité complètes sont présentées ici. DTP MODELES DE DONNEES AERODYNAMIQUES elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 17 / 27 Pour modifier le code des unités le moins possible, les cartes d’identité ne sont pas ajoutées à des fichiers source de ces unités. Un nouveau fichier a été créé dans le répertoire PALMWORKDIR pour chaque unité qui contient la carte d’identité et un petit code qui appele l’unité. Le fait de mettre une fonction qui appele l’unité intrinsèque entre l’application PALM et le code de l’unité permet entre autre de fournir des paramètres de la ligne de commande ce qui est nécessaire par exemple pour elsA. Les trois fichiers unit_elsa.cc, unit_ens.cc et unit_elsadamas.cc sont définis comme suit: 12.1. unit_elsa.cc /*PALM_UNIT -name elsA\ -functions {C++ call_elsa}\ -parallel mpi\ -minproc 4\ -maxproc 4\ -object_files {unit_elsA.o}\ -comment {elsA} */ /*PALM_SPACE -name flagspace\ -shape(1)\ -element_size PL_INTEGER\ -comment {space used by all flags} */ /*PALM_SPACE -name ensdataheaderspace\ -shape(1)\ -element_size 5*PL_INTEGER_SIZE + 20\ -comment {space pour data information header} */ /*PALM_SPACE -name ensdatadataspace\ -shape (100000)\ -element_size PL_DOUBLE_PRECISION\ -comment {space for some real} */ /*PALM_OBJECT -name ensdataheaderobject\ -space ensdataheaderspace\ -localisation REPLICATED_ON_ALL_PROCS\ -intent OUT\ -tag ON\ -time OFF\ -comment {object for information header} */ /*PALM_OBJECT -name ensdatadataobject\ -space ensdatadataspace\ -localisation REPLICATED_ON_ALL_PROCS\ -tag ON\ -time OFF\ -intent OUT\ -comment {sending data} */ /*PALM_OBJECT -name flagobject\ -space flagspace\ DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 18 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA -localisation REPLICATED_ON_ALL_PROCS\ -intent INOUT\ -tag OFF\ -time OFF\ -comment {object for controlling inter application} */ /*PALM_OBJECT -name feedbackobject\ -space flagspace\ -localisation REPLICATED_ON_ALL_PROCS\ -intent IN\ -tag OFF\ -time OFF\ -comment {object for controlling inter application} */ #include <iostream.h> #include <fstream.h> extern int progelsa(int argc, char ** argv); extern "C" void call_elsa(void) { //here, the parameters for elsA are read from a file and given to elsa... ifstream infile; infile.open("elsaparams.in"); char argline[1000]; infile.getline(argline,1000,’\n’); infile.close(); int i=0; int argc_=1; char * ptr[20]; while(argline[i]!=0) { if (((i==0)||(argline[i]==’ ’)) && (argline[i+1] != ’ ’) && (argline[i+1] != ’\n’) && (argline[i+1] != 0) && (argline[i+1] != ’\t’)) { if (i==0) ptr[argc_]=&(argline[i]); else { argline[i]=0; ptr[argc_]=&(argline[i+1]); } argc_++; } i++; } char nullarg[20]="mainblock_1"; ptr[0]=nullarg; DTP MODELES DE DONNEES AERODYNAMIQUES elsA DSNA Couplage elsA/ens++ à l’aide du logiciel PALM Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 19 / 27 char ** argv_; argv_ = ptr; cout << "NOW CALLING ELSA..." << endl; int result=progelsa(argc_,argv_); cout << "ELSA returns: " << result << endl; } Comme la taille de ensdatadataspace est choisie à 100000 ici, le bloc le plus grand ne doit pas être plus grand que 100000 points. De plus, le nombre de processeurs utilisés par elsA est fixé ici! Si on veut changer une des deux grandeurs, il faut le faire dans ce fichier (et dans toutes les autres cartes d’identité si on change la taille des messages), ensuite charger ces nouvelles cartes d’identité dans PrePALM, adapter les associations et faire les compilations. Note: sur le IBM, il s’est avéré impératif de donner le bon argv[0] à elsA, qui doit contenir le nom de l’exécutable (main_block_1 dans cet exemple)! 12.2. unit_ens.cc /*PALM_ID_MODE MP*/ /*PALM_UNIT -name ENS\ -functions {C++ call_ens}\ -object_files {unit_ens.o}\ -comment {unit ENS} */ /*PALM_SPACE -name ensdataheaderspace\ -shape(1)\ -element_size 5*PL_INTEGER_SIZE + 20\ -comment {space pour data information header} */ /*PALM_SPACE -name ensdatadataspace\ -shape (100000)\ -element_size PL_DOUBLE_PRECISION\ -comment {space for some real} */ /*PALM_SPACE -name convergedataspace\ -spape (1)\ -element_size PL_DOUBLE_PRECISION\ -comment {space for convergence variables} */ /*PALM_OBJECT -name ensdataheaderobject\ -space ensdataheaderspace\ -intent IN\ -tag ON\ -time OFF\ -comment {object for information header} */ /*PALM_OBJECT -name ensdatadataobject\ -space ensdatadataspace\ -tag ON\ DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 20 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA -time OFF\ -intent IN\ -comment {receiving elsa data} */ /*PALM_OBJECT -name convergedataobject\ -space convergedataspace\ -intent OUT\ -tag ON\ -time OFF\ -comment {object for sending a variable value (for convergence tests)} */ extern int progens(void); extern "C" void call_ens() { int i= progens(); } 12.3. unit_elsadamas.cc /*PALM_ID_MODE MP*/ /*PALM_UNIT -name elsA_DAMAS\ -functions {C++ call_elsadamas}\ -object_files {unit_elsadamas.o}\ -comment {unit elsA-DAMAS} */ /*PALM_SPACE -name ensdataheaderspace\ -shape(1)\ -element_size 5*PL_INTEGER_SIZE + 20\ -comment {space pour data information header} */ /*PALM_SPACE -name ensdatadataspace\ -shape (100000)\ -element_size PL_DOUBLE_PRECISION\ -comment {space for some real} */ /*PALM_OBJECT -name ensdataheaderobject\ -space ensdataheaderspace\ -intent IN\ -tag ON\ -time OFF\ -comment {object for information header} */ /*PALM_OBJECT -name ensdatadataobject\ -space ensdatadataspace\ -tag ON\ -time OFF\ -intent IN\ -comment {receiving elsa data} */ extern "C" void elsa_damas_(void); DTP MODELES DE DONNEES AERODYNAMIQUES elsA DSNA Couplage elsA/ens++ à l’aide du logiciel PALM Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 21 / 27 extern "C" void call_elsadamas() { elsa_damas_(); } 13. Emplacement des actions PALM dans les unités Les communications PALM de l’application couplée ont été décrites dans la Section 11.1. Le problème qui reste à résoudre est: où, dans elsA et les autres unités, faut-il placer les PALM_Put et PALM_Get pour le bon déroulement de l’application? 13.1. Modifications PALM dans elsA L’unité elsA a le plus de communications des toutes les unités. Il y en a 5: 1. 2. 3. 4. 5. envoi du signal qu’elsA veut emettre des données. reception du signal que la branche 2 est prête à recevoir des données. reception du flag qui constitue un feedback à elsa. envoi des paquets d’informations précédants les données. les blocs de données. Les communications 1 et 2 se déroulent toujours l’une après l’autre aux mêmes endroits. Il y a deux endroits où ces deux communications sont effectuées. Tous les deux se trouvent dans le fichier SioApi.C; un dans extract() et un dans finalExtract(). La différence entre les deux est que, dans extract(), le signal FL_PERIODICAL_DATA est envoyé, pendant que dans finalExtracti(), le signal FL_FINAL_DATA est émis. Dans tous les deux cas, le signal est envoyé si au moins une extraction est effectivement à faire. C’est à dire que l’hypothèse est toujours faite que si au moins une extraction est effectuée pour une itération, les envois des données à PALM sont faits. Après avoir envoyé le signal FL_PERIODICAL_DATA resp. FL_FINAL_DATA, elsA attend le signal FL_RECEPTION_READY avant de continuer. Le signal qui signifie qu’elsA cherche à envoyer des données est envoyé seulement par le processus 0 d’elsA, pendant que le signal qui signifie que la branche réceptrice est prête à recevoir et reçu par tous les processus d’elsA: il est très important que tous les processus soient bloqués jusqu’à ce que la branche receptrice puisse recevoir des données. La récupération du feedback est effectuée dans le fichier TmoDriver_2.C dans computeSteadyFlow avant l’appel à sioExtract(). Si le flag est égal à FL_ELSA_CONVERGED, la fonction notifyConvergence() est appelée. Les PALM_Put correspondants aux communications 4 et 5 sont placés dans le submodule SioAccess. Une SioAccess classe a été créée qui envoie des données avec un PALM_Put au lieu de les écrire dans un fichier. Les données sont toujours précédées par un paquet d’informations. Cette classe est intégrée dans elsA à partir de la version I3107. Pour envoyer des données à une interface PALM, il faut donner comme format d’extraction dans le script Python d’elsA le mot clé palm. Pour la construction des noms des space et object, le string donné avec le mot clé filename est utilisé: DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 22 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA Pour le header, c’est filename + "headerspace" et filename + "headerobject" et pour les données, c’est filename + "dataspace" et filename + "dataobject". 13.2. Modifications PALM dans elsa_damas Dans elsa_damas, il y a deux PALM_Get: pour le header des données et pour les données ellesmêmes. Le mode de fonctionnement d’elsa_damas a été légèrement modifié par rapport à la version originale. D’abord, les paramètres pour elsa_damas ne sont plus lus interactivement depuis l’entrée standard, mais depuis un fichier (dans une application couplée, l’utilisation des entrées en interactif n’est pas possible). Au lieu de chercher des fichiers et de récuperer les données des fichiers, elsa_damas cherche maintenant les données d’une interface PALM. elsa_damas fait des PALM_Get pour toutes les variables et blocs qu’il est sensé recevoir. Il est codé en dur dans elsa_damas quelles variables et blocs sont à recevoir dans elsa_damas, et elsa_damas balaie tous les tags PALM correspondants en recevant les données. Note: la communication entre elsA et elsa_damas est seulement réalisée pour des variables sur les cellules des blocs entiers et non pas pour des variables aux surfaces (comme par exemple la friction). L’envoi des variables aux surfaces nécessiterait un mécanisme plus sophistiqué pour trouver des tags PALM (pour les blocs, le tag PALM est trouvé à l’aide de l’indice du bloc, mais il n’existe pas d’indice pour les surfaces). 13.3. Modifications PALM dans ENS++ Pour pouvoir utiliser ENS++ dans une application couplée, il fallait d’abord faire une modification dans ept.C : Au lieu de chercher des commandes dans le stream stdin, on les cherche dans un filestream, qui ouvre, pour chaque appel à ENS++, le fichier avec le script ENS++. Ceci est nécessaire puisqu’il n’est pas pratique d’utiliser le stdin dans le cadre d’une application couplée. Dans ENS++, il y a trois actions PALM: réceptions des headers et réceptions des données, et envoi des variables dont la convergence est surveillée. Toutes les autres informations sont toujours obtenues de la base DAMAS, donc celle-là doit être disponible. Les données (et les headers) sont reçus dans le fichier getblockvar.f, au lieu de les lire dans la base DAMAS. Il faut de plus assurer le bon traitement de cellules fictives. L’envoi des variables à surveiller se fait dans le fichier writescalar.f. Les variables écrites dans le ’fichier’ palm (selon le script ENS++) ne sont pas effectivement écrites dans ce fichier, mais envoyées avec un PALM_Put à l’interface PALM. Il faut qu’un tag PALM soit donné à chaque variable envoyée par ENS++: A la première variable, c’est le tag 1, à la deuxième le tag 2 etc. Comme la fonction writescalar peut être appelée plusieurs fois, le problème du tag est résolu à l’aide d’une variable COMMON, qui est initialisée à 1 DTP MODELES DE DONNEES AERODYNAMIQUES elsA DSNA Couplage elsA/ens++ à l’aide du logiciel PALM Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 23 / 27 dans la fonction openmodel et qui est incrémentée de 1 après chaque envoi d’une variable à une interface PALM. DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 24 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM Page sans texte DTP MODELES DE DONNEES AERODYNAMIQUES DSNA elsA DSNA Couplage elsA/ens++ à l’aide du logiciel PALM Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 25 / 27 14. * Index DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 26 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM Page sans texte DTP MODELES DE DONNEES AERODYNAMIQUES DSNA elsA Couplage elsA/ens++ à l’aide du logiciel PALM DSNA Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 27 / 27 DIFFUSION TYPE Archives Secrétariat Rédacteurs Développeurs elsA Utilisateurs elsA Responsable Documentation FIN de LISTE DTP MODELES DE DONNEES AERODYNAMIQUES Réf.: /ELSA/?? Date : ((6 juillet 2004)) Page : 28 / 27 elsA Couplage elsA/ens++ à l’aide du logiciel PALM DTP MODELES DE DONNEES AERODYNAMIQUES DSNA