Невозможно передать действительный коммуникатор из фортрана в c / c ++ - PullRequest
1 голос
/ 05 июля 2019

После передачи MPI-коммуникатора из Фортрана в C / C ++ и проверки размера коммуникатора выдается следующее сообщение об ошибке:

Произошла ошибка в MPI_Comm_size на коммуникаторе ... MPI_COMM_WORLD ... MPI_ERR_COMM: неверный коммуникатор

Хотя коммуникатор на стороне C / C ++ не MPI_COMM_NULL, похоже, он также недопустим. Ниже приведен код, выдавший сообщение об ошибке.

C ++

extern "C" 
{
    MPI_Comm* f_MPI_Comm_f2c(MPI_Fint f_handle)
    {
        MPI_Comm* comm;
        comm = (MPI_Comm*)malloc(sizeof(MPI_Comm));
        *comm = MPI_Comm_f2c(f_handle);
        assert(*comm != MPI_COMM_NULL);

        int size;
        MPI_Comm_size(*comm, &size);
        std::cout << "size: " << size << std::endl;

        return comm;
    }
}

Модуль Fortran

module mymodule

use mpi
use, intrinsic :: ISO_C_Binding, only: c_ptr, c_null_ptr

implicit none
private

interface

    function f_MPI_Comm_f2c(comm) result(optr) bind(C, name="f_MPI_Comm_f2c")
        import c_ptr
        implicit none
        integer, intent(in) :: comm
        type(c_ptr) :: optr
    end function f_MPI_Comm_f2c        

end interface

type(c_ptr), save :: ccomm = c_null_ptr

public :: CreateCcomm

CONTAINS

    subroutine CreateCcomm(com)
        !type(c_ptr) :: ccomm
        integer, intent(in) :: com
        ccomm = f_MPI_Comm_f2c(com)
    end subroutine CreateCcomm

end module mymodule

Фортран водитель

program main

use mpi
use mymodule, only : CreateCcomm
IMPLICIT NONE
integer error

call MPI_Init(error)
call CreateCcomm(MPI_COMM_WORLD)
call MPI_Finalize (error)

end
...