É possível enviar dados de um programa Fortran para Python usando MPI?
Estou trabalhando em uma ferramenta para modelar conversores de energia das ondas, onde preciso acoplar dois pacotes de software. Um programa é escrito em Fortran, o outro em C ++. Preciso enviar informações do programa Fortran para o programa C ++ a cada etapa do tempo. No entanto, os dados primeiro precisam ser processados no Python antes de serem enviados para o programa C ++. Recebi uma dica para usar o MPI para transferir os dados entre os programas.
Agora estou tentando enviar uma string simples do código Fortran para Python, mas o código Python fica preso no comando de recebimento.
Meu código Fortran fica assim:
USE GlobalVariables
USE MPI
IMPLICIT NONE
CHARACTER(LEN=10):: astring
INTEGER :: comm, rank, size, mpierr
! Initialize MPI on first timestep
IF(tstep .LT. 2) THEN
call MPI_INIT(mpierr)
ENDIF
! make string to send to python
astring = "TEST"
! MPI Test
call MPI_Comm_size(MPI_COMM_WORLD, size, mpierr)
call MPI_Comm_rank(MPI_COMM_WORLD, rank, mpierr)
! Send message to python
CALL MPI_SEND(astring, len(astring), MPI_CHARACTER, 0, 22, MPI_COMM_WORLD, mpierr)
print *, 'MPI MESSAGE SENT ', mpierr
! Initialize MPI on first timestep
IF(tstep .EQ. Nsteps-1) THEN
call MPI_FINALIZE(mpierr)
print *, 'MPI FINALIZED!'
ENDIF
Meu código Python é o seguinte:
from mpi4py import MPI
import numpy as np
import subprocess as sp
import os
# Start OW3D_SPH in the background and send MPI message
os.chdir('OW3D_run')
args = ['OceanWave3D_SPH','OW3D.inp']
pid = sp.Popen(args,shell=False)
os.chdir('..')
# Check if MPI is initialized
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
# Receive message from fortran
test = comm.recv(source=0, tag=22)
# Let the program end
output = pid.communicate()
with open('test.txt','w') as f:
f.write(test)
O código Python nunca ultrapassa o comando MPI receive e não termina. O código Fortran termina e imprime corretamente a mensagem "MPI FINALIZED".
Não vejo onde estou fazendo algo errado, a mensagem é enviada do processo 0 para o processo 0 com uma tag 22 e usaMPI_COMM_WORLD
nos dois códigos.