Interoperabilidade entre C e Fortran

 

Vamos a mais um tutorial para o pessoal que gosta de programar. Uma coisa que tive que aprender a todo custo foi como interoperar C e Fortran. Então ai vão algumas dicas para quem quiser se aventurar.
Um módulo que descobri que pode ajudar muito a interoperar entre estas linguagens é o módulo ISO_C_BINDING. No meu caso estou desenvolvendo códigos CUDA em C, mas a aplicação principal está em Fortran. Então foi preciso fazer com que o programa em Fortran “chamasse” os códigos escritos em C. Vamos aos exemplos.

Vamos ver primeiro os códigos em C:

//cuda.cu
void c_function(int n, int *vetor, double v, float *array) {
    //comandos
}

Agora que já sabemos como é o protótipo da função em C devemos criar um módulo em Fortran para “chamar” esta função. Veja como fica este módulo

!fortran_c.f90
module interop
    interface inter_c_function
        subroutine f_function (n, vetor, v, array) bind(c, name='c_function')
            use iso_c_binding
            implicit none

            integer(c_int), value :: n
            integer(c_int), dimension(:) :: vetor
            real(c_double), value :: v
            real(c_float), dimension(:) :: array
        end subroutine
    end interface
end module

Os trechos de códigos em Fortran para usar este módulo podem ser usados como se segue:

!main.f90
!modulo q vc criou
use interop
use iso_c_binding

!variaveis em Fortran
real(c_double) :: valor
real(c_foat), allocatable, dimension(:) :: array
integer(c_int) :: n
integer(c_int), allocatable, dimension(:) :: vetor

!+ comandos em Fortran

!chamada do codigo em C
call f_function(n, vetor, valor, array)

No meu caso, como o código em C usava código CUDA, o Makefile ficou como se segue:

LIBS = -lcudart
OBJS = fortran_c.o cuda.o

all: $(OBJS) main.f90
	ifort -o teste main.f90 $(OBJS) $(LIBS)

cuda.o: cuda.cu
	nvcc -c cuda.cu $(LIBS)

fortran_c.o: fortran_f.f90
	ifort -c fortran_c.f90

Veja mais sobre interoperabilidade aqui

Anúncios

2 comentários sobre “Interoperabilidade entre C e Fortran

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s