Pay attention as "real*8" is not standard Fortran but just a quite common 
extension accepted by most compilers. :-)


Il giorno sabato 30 maggio 2015 21:10:39 UTC+2, Andre Bieler ha scritto:
>
> Ok so I have a few simple examples working for ccalling fortran functions 
> and subroutines from Julia.
> Maybe someone will find this useful examples when first looking into 
> calling fortran from julia.
>
> compile the following fortran module with
>
> *gfortran simplemodule.f95 -o simplemodule.so -shared -fPIC*
>
>
> ```
> !fileName = simplemodule.f95
> module simpleModule
>
> implicit none
>
> contains
> function foo(x)
>   integer :: foo, x
>   foo = x * 2
> end function foo
>
> subroutine bar(x, a, b)
>   integer, intent(in) :: x
>   integer, intent(out) :: a, b
>   
>   a = x + 3
>   b = x * 3
> end subroutine bar
>
> subroutine keg(x, a, b)
>   real*8, intent(in) :: x
>   real*8, intent(out) :: a, b
>   
>   a = x + 3.0
>   b = x * 3.0
> end subroutine keg
>
> subroutine ruf(x, y)
>   real*8, dimension(3), intent(in) :: x
>   real*8, dimension(3), intent(out) :: y
>   integer :: i
>   
>   DO i = 1, 3
>     y(i) = 2*x(i)
>   END DO
> end subroutine ruf
>
> end module simplemodule
> ```
>
> then you can use the following julia script to call the functions from the 
> shared library.
>
> ```
> x1 = 7
> a1 = [0]
> b1 = [0]
>
> r1 = ccall((:__simplemodule_MOD_foo, 
> "/home/abieler/testPrograms/fortranShardLib/simplemodule.so"), Int64, 
>             (Ptr{Int64},), &x1)
>
> println(r1)
> println()
>
> ccall((:__simplemodule_MOD_bar, 
> "/home/abieler/testPrograms/fortranShardLib/simplemodule.so"), Void, 
>       (Ptr{Int64}, Ptr{Int64}, Ptr{Int64}), &x1, a1, b1)
>       
> println(a1[1])
> println(b1[1])
> println()
>
> x2 = 7.0
> a2 = Cdouble[1.0]
> b2 = Cdouble[1.0]
>
> ccall((:__simplemodule_MOD_keg, 
> "/home/abieler/testPrograms/fortranShardLib/simplemodule.so"), Void, 
>       (Ptr{Float64}, Ptr{Float64}, Ptr{Float64}), &x2, a2, b2)
>       
> println(a2[1])
> println(b2[1])
> println()
>
> x3 = [1.0, 2.0, 3.0]
> y3 = [0.0, 0.0, 0.0]
> ccall((:__simplemodule_MOD_ruf, 
> "/home/abieler/testPrograms/fortranShardLib/simplemodule.so"), Void, 
>       (Ptr{Float64}, Ptr{Float64}), x3, y3)
>       
> println(y3)
> ```
>
>

Reply via email to