Model Inteface#

Fortran C Interface Example#

#include <stdio.h>

void test_proc_c(int n, double A[3][2]) {

    printf("test_proc_c\n");
    printf("n = %d\n", n);

    printf("matrix A\n");

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%6.2f ", A[j][i]);
        }
        printf("\n");
    }
}
program demo_fort
    use iso_c_binding, only: c_int, c_double
    implicit none
    integer :: i, j
    integer(c_int) :: n_fort = 7
    real(c_double), dimension(2, 3) :: A_fort

    interface
        subroutine test_proc_c(n_c, A_c) bind(C, name='test_proc_c')
            use iso_c_binding, only: c_int, c_double
            integer(c_int), intent(in), value :: n_c
            real(c_double), dimension(2, 3), intent(in) :: A_c
        end subroutine test_proc_c
    end interface

    do j = 1, 3
        do i = 1, 2
            A_fort(i, j) = real(i + j, c_double)
        end do
    end do

    call test_proc_c(n_fort, A_fort)
end program demo_fort
all: test_proc_c.o demo_fort.o demo_fort

test_proc_c.o : test_proc_c.c
    gcc -c test_proc_c.c

demo_fort.o : demo_fort.f90
    gfortran -c demo_fort.f90

demo_fort : test_proc_c.o demo_fort.o
    gfortran -o demo_fort demo_fort.o test_proc_c.o -lc

clean:
    rm -f test_proc_c.o demo_fort.o demo_fort
$ ./demo_fort
test_proc_c
n = 7
matrix A
  2.00   3.00   4.00
  3.00   4.00   5.00