2

複素数 Fortran 配列の虚数部への「ポインター」を、実数のみを操作する BLAS 関数に渡したいと思います。データのコピーを必要としないので、C 言語の意味での「ポインター」を意味します。

たとえば、次の単純なコードを考えてみましょう (実際のコードはもう少し複雑です)。

function foo(c1, c2, n) result(r)
  complex, dimension(:), intent(in) :: c1, c2
  integer, intent(in) :: n
  real :: r

  real, external :: SDOT

  r = SDOT(n, c1(1)%re, 2, c2(1)%im, 2)
end function foo

残念ながら、%reand%imは Fortran 2008 でのみ指定されています。さらに、どちらのコンパイラもサポートしていないため、配列の個々の要素に複雑な部分セレクターを適用することが標準で許可されているかどうかはわかりません。

gfortran「非派生型変数の予期しない '%'」というエラーが表示されます。

私が必要とするものを達成する他の方法はありますか?

4

3 に答える 3

0

@Vladimir Fの提案に従って、次のコードになりました。

bar.Fファイル:

function bar(c1, c2, n) result(r)
  real, intent(in) :: c1(*), c2(*)
  integer, intent(in) :: n
  real :: r

  r = SDOT(n, c1(1), 2, c2(2), 2)
end function bar

foo.Fファイル:

function foo(c1, c2, n) result(r)
  complex, dimension(:), intent(in) :: c1, c2
  integer, intent(in) :: n
  real :: r

  real, external :: bar

  r = bar(c1, c2, n)
end function foo
于 2016-12-01T20:13:57.143 に答える
0
function foo(c1, c2, n) result(r)
  complex, dimension(:), intent(in) :: c1, c2
  integer, intent(in) :: n
  real :: r
  REAL, DIMENSION(n) :: reality, dreamy

  real, external :: SDOT
  Reality = REAL(c1)
  DReamy  = IMAG(c2)
  r = SDOT(n, Reality, 1, Dreamy, 1)
end function foo

AIMAG と REAL は ELEMENTAL であるため、これらはスタック上の一時ベクトルであるため、SDOT 呼び出しに配置できるはずです。

于 2016-12-02T13:39:26.780 に答える