web-dev-qa-db-ja.com

「%」はFortranで/何を意味しますか?

いくつかのFortranコードを読み込もうとしていますが、%(パーセント記号)の機能を判別できません。

それは次のような行にあります:

   x = a%rho * g * (-g*a%sigma + m%gb * m%ca * (1.6 * a%rho+g))

それは何をするためのものか?

17
Abe

Fortran 90では、C++のように構造を作成できます。基本的にドット(。)演算子として機能します。

から http://www.lahey.com/lookat90.htm

構造(派生タイプ)

派生型を使用してデータをグループ化できます。これにより、ユーザーは組み込み型(配列やポインターを含む)を新しい型に結合でき、その個々のコンポーネントにはパーセント記号を区切り文字として使用してアクセスできます。 (派生型は、VAX Fortranではレコードと呼ばれます。)!派生型とモジュールの使用例。

module pipedef
   type pipe                          ! Define new type 'pipe', which
     real diameter                    ! is made up of two reals, an
     real flowrate                    ! integer, and a character.
     integer length
     character(len=10) :: flowtype
   end type pipe
end module pipedef

program main
   use pipedef                ! Associate module pipedef with main.
   type(pipe) water1, gas1    ! Declare two variables of type 'pipe'.
   water1 = pipe(4.5,44.8,1200,"turbulent") ! Assign value to water1.
   gas1%diameter = 14.9                     ! Assign value to parts
   gas1%flowrate = 91.284                   ! of gas1.
   gas1%length = 2550
   gas1%flowtype = 'laminar'
   .
   .
   .
end program
30
NickLH

これは、派生型のパーツ識別子です。これをチェックしてください。 http://www.lahey.com/lookat90.htm

4
Carth

トークンとしての%には、密接に関連する多くの用途があります。 Fortranが開発されるにつれて、それらの使用は数が増えてきました。

Fortran 90に戻り、質問で見られる使用法では、%を使用して派生型のコンポーネントにアクセスします。その型のオブジェクトaを持つ派生型a_tを考えてみましょう。

type a_t
  real rho, sigma
end type
type(a_t) a

rhoのコンポーネントsigmaおよびaには、a%rhoおよびa%sigmaを使用してアクセスできます。質問に見られるように、これらのコンポーネントは式(a%rho * gなど)で使用される場合もあれば、代入の左側(a%rho=1.)である場合もあります。

派生型のコンポーネントは、それ自体が派生型のオブジェクトである可能性があります。

type b_t
  type(a_t) a
end type
type(b_t) b

したがって、1つの参照に%が複数表示される場合があります。

b%a%rho = ...

ここでは、それ自体がrhoのコンポーネントである派生型オブジェクトaのコンポーネントbが割り当てのターゲットです。 1つの参照で%sの非常に恐ろしい数を見ることができますが、パーツ参照は常に左から右に解決されます。

Fortran 2003に来ると、他のいくつかの方法で派生型に関連する%が表示されます。

  • オブジェクトのバインディングを参照する。
  • パラメータ化されたタイプのパラメータの照会。

派生型を検討してください

type a_t(n)
  integer, len :: n=1
  real x(n)
 contains
  procedure f
end type
type(a_t(2)) a

オブジェクトaには、単一の長さ型パラメーターと型にバインドされたプロシージャーがあります。のような表現で

x = a%f()

派生型オブジェクトのバインディングfが参照されます。

nのパラメータaは、次のように参照できます。

print *, a%n, SIZE(a%x)

コンポーネントxが参照されるのと同じくらいです。

最後に、Fortran 2008以降、%を使用して、複雑なオブジェクトの実数部と虚数部にアクセスできます。

complex x, y(3)
x%im = 1.
x%re = 0.
y = (2., 1.)
print *, y(2)%im+y(3)%re
2
francescalus