¿Es posible enviar datos desde un programa Fortran a Python usando MPI?
Estoy trabajando en una herramienta para modelar convertidores de energía de onda, donde necesito acoplar dos paquetes de software entre sí. Un programa está escrito en Fortran, el otro en C ++. Necesito enviar información del programa Fortran al programa C ++ en cada paso de tiempo. Sin embargo, los datos primero deben procesarse en Python antes de enviarse al programa C ++. He recibido una sugerencia para usar MPI para transferir los datos entre los programas.
Ahora estoy tratando de enviar una cadena simple del código de Fortran a Python, pero el código de Python se atasca en el comando de recepción.
Mi código Fortran se ve así:
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
Mi código de Python es el siguiente:
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)
El código de Python nunca pasa el comando de recepción de MPI y no termina. El código Fortran termina e imprime correctamente el mensaje "MPI FINALIZADO".
No veo dónde estoy haciendo algo mal, el mensaje se envía desde el proceso 0 al proceso 0 con una etiqueta 22 y usaMPI_COMM_WORLD
en ambos códigos