Как передать динамически распределенный массив в Фортран из Юлии - PullRequest
1 голос
/ 25 июня 2019

Я пытаюсь вызвать некоторый код fortran (f90) из julia, но, похоже, я не могу заставить fortran понимать динамически распределяемые массивы, переданные из julia.Этот код Фортрана:

MODULE myModule
    implicit none
    public Func
CONTAINS

subroutine Func(A,B)
    integer*8, intent(inout) :: A(3)
    integer*8, intent(inout) :: B(:)
    integer :: i

    write(*,*) "size of A"
    write(*,*) size(A)

    write(*,*) "A"
    do i=1,3
        write(*,*) A(i)
    enddo

    write(*,*) "size of B"
    write(*,*) size(B)

    write(*,*) "B"
    do i=1,size(B)
        write(*,*) B(i)
    enddo

end subroutine Func
end module

, вызываемый этим кодом джулии

A = [1,2,3]
B = [4,5,6]

ccall((:__mymodule_MOD_func,"./test.so"), Nothing ,(Ref{Int64},Ref{Int64}), A,B)

, дает такой результат

 size of A
           3
 A
                    1
                    2
                    3
 size of B
           0
 B

Я бы ожидал, что размер (B) будет равен 3.

Есть ли способ заставить это работать без изменения кода на фортране?Я знаю, что мог бы переписать код на Фортране, чтобы включить измерение массива в вызов функции, но я бы предпочел иметь возможность вызывать код на Фортране, который уже был написан аналогично приведенному мною примеру.

1 Ответ

0 голосов
/ 26 июня 2019

Я решил создать функцию-оболочку фортрана, которая принимает размер передаваемых динамических массивов.

subroutine wrapFunc(A,B,Bdim)
    integer*8, intent(inout) :: A(3)
    integer*8, intent(inout) :: Bdim
    integer*8, intent(inout) :: B(Bdim)
    call Func(A,B)    

end subroutine wrapFunc

Это позволяет мне не изменять существующий код Фортрана.

...