Я пытаюсь связать параллельную программу MPI Fortran с параллельной библиотекой C, которая также использует MPI. Архитектура программного обеспечения ориентирована на Fortran, поэтому я стараюсь максимально использовать Fortran.
Поэтому мне нужно передать подпрограммам C дескриптор коммуникатора MPI. Они имеют форму
int CFunction(int *something, MPI_Comm *Ccomm)
MPI поставляется с интерфейсами для преобразования Fortran в дескриптор коммуникатора C:
MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
Однако эти подпрограммы должны вызываться из C, поэтому прямо сейчас мне пришлось добавить функции-оболочки C, которым я могу передать коммуникатор Fortran:
int CFunction_FMPI(int *something, MPI_Fint *Fcomm)
{ MPI_Comm Ccomm; int status;
Ccomm = MPI_Comm_f2c(*Fcomm); // Convert Fortran->C communicator
status = CFunction(*something,*Ccomm); // Call original function
return status;
}
затем мне пришлось написать второй интерфейс — для CFunction_FMPI
— используя привязки Fortran C, чтобы его можно было вызывать из Fortran.
Мой вопрос: нет ли лучшего способа сделать это, то есть избежать оболочки C с преобразованием коммуникатора Fortran-> C? Я думаю, что лучше всего было бы вызвать MPI_Comm_f2c
непосредственно из Фортрана и сохранить результат в переменной type(c_ptr)
или integer(c_int)
, но я не смог этого сделать, поскольку между типом MPI_Comm
и Фортраном нет прямой/общей привязки.