Salut à tous,
J'ai un code Fortran, qui calcule et simule l'état d'un système donné initialement. Ce code fait appel à des variables permanentes (variables sauvegardées entre les différentes entry de subroutines) et des variables globales (via des common).
Aujourd'hui on me demande d'intégrer ce code au sein d'un programme (C/Fortran) qui doit pouvoir s'en servir pour calculer et simuler l'état d'un nombre quelconque de systèmes à la fois (système 1 d'une part, système 2 d'autre part, etc). Il faut donc pouvoir, à chaque pas de temps de la simu d'ensemble, calculer la mise à jour du système 1, puis la mise à jour du système 2, etc.
(Bien sûr les différents systèmes auront des interactions les uns avec les autres extérieures à mon code, donc on ne peut pas faire entièrement toute la simu temporelle du système 1, puis du système 2, etc.)
Bien sûr en l'état ça ne peut pas marcher à cause des variables internes permanentes qui sont censées toujours concerner le même système initial.
Il y a des solutions bateau : tout passer en paramètre (lourd dans mon cas), ou rajouter une dimension aux variables permanentes (lourd aussi, surtout s'il faut créer un n+1 ème système au milieu de la simu). J'aimerais autant éviter ces solutions car mon code est déjà utilisé dans différentes simulations qui n'en ont pas du tout le besoin (ce besoin est réellement complètement exceptionnel dans mon cas), et dans la mesure du possible je ne souhaite pas vivre avec cette contrainte supplémentaire dans l'ensemble de mes programmes.
A priori, je cherche donc plutôt une solution qui me permettrait d'utiliser mon code tel quel, ie qui permette d'une façon ou d'une autre d'en lancer les fonctions en créant un espace mémoire dédié (au 1er appel de chaque système), puis en se replaçant dans cet espace mémoire aux prochains de appel de ce système.
Y a-t-il des solutions à mon problème ?
- J'imagine qu'en "codage pur", ce n'est pas possible : ie pas de fonction interne à gfortran/gcc (appel possible en C) qui permette de dire "prochain appel de telle fonction, tu le fais dans un nouvel espace mémoire" puis "prochain appel, tu le fais dans l'espace mémoire n° k" ?
- Peut-être mon problème trouve-t-il une solution si je passe mon code dans une librairie ou exécutable. L'idée étant qu'à chaque nouveau système 1,...,n, le programme principal irait lancer une nouvelle fois la librairie/exécutable, et devrait ensuite pouvoir être capable, au pas de temps suivant, d'aller commander "la suite" à la bonne instance de la librairie ou de l'exécutable (donc déjà lancé cette fois, et qui était en attente de nouvelles instructions).
Cela est-il faisable, d'une façon ou d'une autre ? Je pense que la solution "nouvelle instance de l'exécutable pour chaque nouveau système" doit au moins pouvoir marcher. Je n'ai jamais lancé d'exécutable depuis un autre code, mais j'imagine que pas de souci ; peut-être plus sur le "maintien des échanges" par la suite. Enfin j'imagine qu'en C au moins ça doit pouvoir se faire ? Est-ce qu'une telle solution introduit de gros overhead (ordre de grandeur en temps ?) au moment du "passage de témoin" vers et depuis l'exécutable qui contiendra mon code ?
Quelle est selon vous la meilleure façon pour moi de procéder ? Et comment ?
Merci beaucoup pour votre aide.
Partager