Allocation à l'exécution pour partage de variables avec Fortran?
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:
1 2 3 4
| ...
REAL, DIMENSION(10,10) :: TESTMATRIX
COMMON/FFCOUPLED/ TESTMATRIX
... |
Code:
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:
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:
Code:
1 2 3 4 5 6 7 8 9 10 11
| ...
#ifdef __cplusplus
extern "C" {
#endif
struct{
double **testmatrix;
} ffcoupled_;
#ifdef __cplusplus
}
#endif
... |
et l'allocation fonction de données disponibles uniquement à l'éxécution:
Code:
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