0

実行時に Fortran90 派生型とポインターを割り当てることに関して質問があります。コードが入力ファイルを読み取った後、派生変数の型をサブルーチンに渡したいと考えています。したがって、入力に応じて、適切なデータ型を渡します。説明させてください:

私は2つのモジュールを持っています:

モジュール A_modモジュール B_mod。それぞれに固有のデータ型とサブルーチンがあります。例えば:

Module A_mod

type A
real :: x, y
end type

contains

subroutine FunA(me)
type (A), intent(in) :: me
<do stuff>
end subroutine

End module A_mod

モジュール B_modは、A を B に置き換えた上記のミラーです (データ型 B にも x と y が整数として定義されています)。

このインターフェイスを持つ 3 番目のモジュールもあります。

interface fun
modular procedure funA, funB
end interface

これが私の問題です。ユーザーは、入力ファイルを介して、使用するモジュール サブルーチンを決定します。実行時に関連付けられる汎用ポインターを作成するにはどうすればよいですか? または、ポインターを必要としない同様のもの。

例えば:

type (?) :: pt
Call fun(pt)

ここで、プログラムは入力ファイルを読み取った後、インターフェース化されたサブルーチン「fun」に送信される正しいデータ型を選択します。したがって、型は実行時まで不明です。

Fortran でコードの実行部分で変数を宣言できる場合、たとえば次のようになります。

IF(input.EQ."A") THEN
type(A) :: pt
ELSE
type(B) :: pt
END IF

CALL fun(pt)

任意の提案をいただければ幸いです!!

ありがとうございました

4

1 に答える 1

2

これを Fortran 90 できれいに行うのは困難です。Fortran 2003 では簡単です。

fun( で)ジェネリック参照が検出されたときに呼び出すプロシージャの解決は、CALL fun(pt)の宣言された型に基づいてコンパイル時に行われますpt

Fortran 90 に制限されている場合は、実行時に使用する特定の派生型を示す何らかのフラグを効果的に維持し、型 A と型 B のそれぞれに名前付きオブジェクトを用意し、fun正しい名前の引数を選択する IF 構造 を参照したい。

(オブジェクトのサイズが大きい場合は、それらが共通のストレージを持つように手配できます。)

何かのようなもの:

TYPE(A) :: pt_A
TYPE(B) :: pt_B
...
IF (input .EQ. 'A') THEN
  CALL fun(pt_A)
ELSE
  CALL fun(pt_B)
END IF

F2003 では、fun という名前の特定のバインディングを持つ共通の親型を定義します。 pt次に、必要に応じてタイプ A またはタイプ B のいずれかに入力に基づいて割り当てられる、多態的な割り当て可能オブジェクトになります。

TYPE :: Parent
CONTAINS
  PROCEDURE(parent_Fun), DEFERRED :: Fun
END TYPE Parent

ABSTRACT INTERFACE
  SUBROUTINE parent_Fun(obj)
    IMPORT :: Parent
    IMPLICIT NONE
    CLASS(Parent), INTENT(IN) :: obj
  END SUBROUTINE parent_Fun
END INTERFACE

TYPE, EXTENDS(Parent) :: A
  REAL :: x, y
CONTAINS
  PROCEDURE :: A => A_Fun
END TYPE A

TYPE, EXTENDS(Parent) :: B
  INTEGER :: x, y
CONTAINS
  PROCEDURE :: B => B_Fun
END TYPE B

CLASS(Parent), ALLOCATABLE :: pt
...
IF (input .EQ. 'A') THEN
  ALLOCATE(A:: pt)
ELSE
  ALLOCATE(B:: pt)
END IF
...
CALL pt%Fun()
于 2013-05-24T03:22:09.480 に答える