Bonjour à tous,
je développe actuellement un code de calcul scientifique en C++ (disons le code A) que j'aimerais pouvoir interfacer avec un code existant et codé en Fortran (code B). Pour cela j'ai rajouté aux sources du code B un fichier C qui fait l'interface en chargeant la librairie dynamique issue du code A (libA).
Pour des raisons de communications entre les deux codes j'aimerais leur faire partager des espaces mémoires communs. Je suis arrivé à faire des choses très intéressantes à partir de tuto trouvés sur le net comme là par exemple. J'arrive tout de même à une limitation sévère en ce qui concerne le partage de matrices.
Si j'alloue les matrices à la compilation comme suit dans les fichiers Fortran et dans ma librairie:
Code Module Fortran : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ... REAL, DIMENSION(10,10) :: TESTMATRIX COMMON/FFCOUPLED/ TESTMATRIX ...
Code Dans un fichier d'en-tête des mes sources donnant libA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 ... #ifdef __cplusplus extern "C" { #endif struct{ double testmatrix[10][10]; } ffcoupled_; #ifdef __cplusplus } #endif ...
j'obtiens un partage de la zone mémoire associée au common 'ffcoupled', càd que je peux modifier avec le code B ou avec libA la matrice 'testmatrix'. Il y a donc bien concordance des types et de la table d'allocation entre les deux codes.
Maintenant ce qui me pose problème c'est que l'allocation de mémoire est 'compile-time' et non 'runtime'. J'aimerais donc modifier mes sources actuelles pour obtenir quelque chose proche des fichiers suivants:
Code Module Fortran avec allocation à l'exécution : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ... INTEGER :: NX, NY ... lecture des données fournies dans un fichier utilisateur ... REAL, DIMENSION(NX,NY) :: TESTMATRIX COMMON/FFCOUPLED/ TESTMATRIX ...
Du coté du C++ cela devrait donc ressembler à quelque chose comme ça:
et l'allocation fonction de données disponibles uniquement à l'éxécution:
Code Dans un fichier d'en-tête des mes sources donnant libA, disons foo.h : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ... #ifdef __cplusplus extern "C" { #endif struct{ double **testmatrix; } ffcoupled_; #ifdef __cplusplus } #endif ...
Code dans le fichier foo.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 ... #ifdef __cplusplus extern "C" { #endif void AllocateMatrix(const int nx, const int ny){ ffcoupled_.testmatrix = new double*[nx]; int i; for( i=0 ; i<nx ; i++ ) { ffcoupled_.testmatrix[i] = new double[ny]; } } #ifdef __cplusplus } #endif ...
mais je perds alors le partage d'espace mémoire entre les codes A et B. Je viens donc vers vous pour savoir si il existe une raison fondamentale à ce que l'allocation dynamique ne permette pas le partage que j'obtiens avec des allocations 'compile-time' ou si ce partage est possible (et donc que mon implantation est simplement mauvaise...).
Merci d'avance pour vos réponses,
Xavier
Partager