Я работаю над инструментом моделирования волновых энергетических преобразователей, где мне нужно связать два пакета программного обеспечения друг с другом. Одна программа написана в Fortran, другая - на С++. Мне нужно отправить информацию из программы Fortran в программу на С++ на каждом временном шаге. Однако сначала данные должны обрабатываться на Python перед отправкой в программу на С++. Я получил подсказку для использования MPI для передачи данных между программами.
Теперь я пытаюсь отправить простую строку из кода Fortran в Python, но код Python застрял в команде receive.
Мой форвардный код выглядит следующим образом:
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
Мой код Python выглядит следующим образом:
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)
Код Python никогда не проходит мимо команды приема MPI и не заканчивается. Код Fortran завершает и правильно печатает сообщение "MPI FINALIZED".
Я не вижу, где я делаю что-то неправильно, сообщение отправляется из процесса 0 в процесс 0 с тегом 22 и использует MPI_COMM_WORLD
в обоих кодах.