Appel d'une fonction FORTRAN native de C # corrompt la matrice envoyé

voix
1

Je teste l'appel de fonctions Fortran à partir d'une DLL, voici le code

La fonction en FORTRAN

! This subroutine is for multiplying two matrices
! A(m,n) * B(n,k) = C(m,k)
subroutine MatrixMultiplication(m, n, k, A, B, C)
    !DIR$ ATTRIBUTES DLLEXPORT :: MatrixMultiplication
    !DIR$ ATTRIBUTES ALIAS: 'MatrixMultiplication' :: MatrixMultiplication

!---------------------------------------------------
    implicit none
!---------------------------------------------------    
    integer, intent(in)  :: m,n,k
    real*8,  intent(in)  :: A(m,n), B(n,k)
    real*8,  intent(out) :: C(m,k)
    integer              :: i, j
!---------------------------------------------------

    ! Print matrix A and B to check if they are passed correctly

    open(unit=1, file=A.txt, status=replace)
    open(unit=2, file=B.txt, status=replace)
    open(unit=3, file=C.txt, status=replace)
    open(unit=4, file=variables.txt, status=replace)

    write(4,*) m,n,k

    do i=1,m
        write(1,100) ( A(i,j), j=1,n )
    end do

    do i=1,n
          write(2,100) ( B(i,j), j=1,k )
    end do

    C = matmul(A,B)

    ! write C to a text file
    do i=1,m
          write(3,100) ( C(i,j), j=1,k )
    end do

100 format(10f10.5)      
    return
end subroutine

La mise en œuvre en C #

    [DllImport(DLLname, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    public static extern void MatrixMultiplication(ref int m, ref int n,ref int k, 
                    [In] double[,] A, [In] double[,] B, [Out] double[,] C);


    static void Main(string[] args)
    {
        double[,] A = new double[,]
        {
            { 1,2,3,4,5,6 },
            { 1,2,3,4,5,6 },
            { 1,2,3,4,5,6 }
        };

        double[,] B = new double[,]
        {
            { 1,2,3 },
            { 1,2,3 },
            { 1,2,3 },
            { 1,2,3 },
            { 1,2,3 },
            { 1,2,3 }
        };

        int m = A.GetLength(0);
        int n = A.GetLength(1);
        int k = B.GetLength(1);
        double[,] C = new double[m, k];

        MatrixMultiplication(ref m, ref n, ref k, A, B, C);

    }

A.txt

1.00000        4.00000        1.00000        4.00000        1.00000        4.00000
2.00000        5.00000        2.00000        5.00000        2.00000        5.00000
3.00000        6.00000        3.00000        6.00000        3.00000        6.00000

b.txt

1.00000        1.00000        1.00000
2.00000        2.00000        2.00000
3.00000        3.00000        3.00000
1.00000        1.00000        1.00000
2.00000        2.00000        2.00000
3.00000        3.00000        3.00000

Il semble que la matrice adoptée en Fortran est rempli par des colonnes au lieu de lignes !! Toute solution?

Créé 26/01/2016 à 16:46
source utilisateur
Dans d'autres langues...                            


1 réponses

Appel d'une fonction FORTRAN native de C # corrompt la matrice envoyé

voix
1

Je teste l'appel de fonctions Fortran à partir d'une DLL, voici le code

La fonction en FORTRAN

! This subroutine is for multiplying two matrices
! A(m,n) * B(n,k) = C(m,k)
subroutine MatrixMultiplication(m, n, k, A, B, C)
    !DIR$ ATTRIBUTES DLLEXPORT :: MatrixMultiplication
    !DIR$ ATTRIBUTES ALIAS: 'MatrixMultiplication' :: MatrixMultiplication

!---------------------------------------------------
    implicit none
!---------------------------------------------------    
    integer, intent(in)  :: m,n,k
    real*8,  intent(in)  :: A(m,n), B(n,k)
    real*8,  intent(out) :: C(m,k)
    integer              :: i, j
!---------------------------------------------------

    ! Print matrix A and B to check if they are passed correctly

    open(unit=1, file="A.txt", status="replace")
    open(unit=2, file="B.txt", status="replace")
    open(unit=3, file="C.txt", status="replace")
    open(unit=4, file="variables.txt", status="replace")

    write(4,*) m,n,k

    do i=1,m
        write(1,100) ( A(i,j), j=1,n )
    end do

    do i=1,n
          write(2,100) ( B(i,j), j=1,k )
    end do

    C = matmul(A,B)

    ! write C to a text file
    do i=1,m
          write(3,100) ( C(i,j), j=1,k )
    end do

100 format(10f10.5)      
    return
end subroutine

La mise en œuvre en C #

    [DllImport(DLLname, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    public static extern void MatrixMultiplication(ref int m, ref int n,ref int k, 
                    [In] double[,] A, [In] double[,] B, [Out] double[,] C);


    static void Main(string[] args)
    {
        double[,] A = new double[,]
        {
            { 1,2,3,4,5,6 },
            { 1,2,3,4,5,6 },
            { 1,2,3,4,5,6 }
        };

        double[,] B = new double[,]
        {
            { 1,2,3 },
            { 1,2,3 },
            { 1,2,3 },
            { 1,2,3 },
            { 1,2,3 },
            { 1,2,3 }
        };

        int m = A.GetLength(0);
        int n = A.GetLength(1);
        int k = B.GetLength(1);
        double[,] C = new double[m, k];

        MatrixMultiplication(ref m, ref n, ref k, A, B, C);

    }

A.txt

1.00000        4.00000        1.00000        4.00000        1.00000        4.00000
2.00000        5.00000        2.00000        5.00000        2.00000        5.00000
3.00000        6.00000        3.00000        6.00000        3.00000        6.00000

b.txt

1.00000        1.00000        1.00000
2.00000        2.00000        2.00000
3.00000        3.00000        3.00000
1.00000        1.00000        1.00000
2.00000        2.00000        2.00000
3.00000        3.00000        3.00000

Il semble que la matrice adoptée en Fortran est rempli par des colonnes au lieu de lignes !! Toute solution?

Créé 26/01/2016 à 16:46
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more