1

実は、fortran から magma を呼び出したいのです。そこで、magma.lib を追加し、magma の C 関数を使用するインターフェイスを作成します。

Interface
      Integer function magma_dpotrf(uplo, n, a, lda, info) BIND (C, NAME="magma_dpotrf")
        use iso_c_binding
        Implicit none
        !character (c_char), value :: uplo????
        integer (c_int), value ::n
        real (c_double) ::a(*)
        integer (c_int), value ::lda
        integer (c_int)::info
      end function
   end Interface

ただし、パラメーター uplo はユーザー定義型です。C コードでは (magma_uplo_t uplo):

typedef enum {
    MagmaUpper         = 121,
    MagmaLower         = 122,
    MagmaUpperLower    = 123,
    MagmaFull          = 123,  /* lascl, laset */
    MagmaHessenberg    = 124   /* lascl */
} magma_uplo_t;

magma_int_t
magma_dpotrf(
    magma_uplo_t uplo, magma_int_t n,
    double *A, magma_int_t lda,
    magma_int_t *info);

magma_int_t = int, インターフェースの作成方法を知っている人はいますか? 前もって感謝します

4

1 に答える 1

2

magma_uplo_t列挙です。Fortran 2003 ではそれらのサポートがいくつかありますがinteger(c_int)、121 から 124 までの値を取ることができる であると非常に安全に想定できます。

integer(c_int), value :: uplo

Fortran 2003 列挙を使用して、実際に定数を作成できます。

 enum, bind( C )
    enumerator :: MagmaUpper         = 121, &
                  MagmaLower         = 122, &
                  MagmaUpperLower    = 123, &
                  MagmaFull          = 123, &
                  MagmaHessenberg    = 124
  end enum

ただし、変数を使用すると、integer(kind=kind(MagmaUpper))完全に安全になるようにすることもできます。これは、GCC の--short-enumsオプションのようなもので生き残ります。

于 2015-05-06T13:52:00.920 に答える