1

私は現在、グリッドの境界内で追跡する一連の粒子を含む離散数値グリッドを持つ大規模な Fortran プログラムに取り組んでいます。これを行うために、次の 3 つの派生型を定義しました。

type :: particle
    real(pr), dimension(3) :: r = 0.0_pr ! position
    real(pr), dimension(3) :: p = 0.0_pr ! momentum
end type particle

type :: rcell ! position cell
    integer, dimension(6) :: bpoints = 0 ! cell grid points
    integer :: np = 0 ! number of particles in cell
    type(particle), dimension(50) :: parts ! particles in cell
end type rcell

type :: pcell ! momentum cell
    integer, dimension(6) :: bpoints = 0 ! cell grid points
    integer :: np = 0 ! number of particles in cell
end type pcell

...

type(rcell), dimension(:), allocatable :: rbin ! position space bins
type(pcell), dimension(:), allocatable :: pbin ! momentum space bins

...

allocate(rbin(100))
allocate(pbin(100))

まず第一に、これは派生型の許容可能な使用法ですか (つまり、派生型の配列を含む派生型の割り当て可能な配列を持つこと)? コードは、gfortran 4.8.3 を使用して正常にコンパイルされます。

ただし、Fedora で gdb 7.7.1 を使用してコードをデバッグしようとすると、奇妙な問題が発生します。rbin配列の要素のデータを調べようとすると(たとえばを使用して)、データを(たとえばに)割り当てたにもかかわらず、print rbin(10)%bpointsgdb は常に出力されます。たとえば、配列の要素のデータを見ると、期待どおりの結果が得られます。誰かがこの問題について洞察を持っていますか?(0, 0, 0, 0, 0, 0)bpointsrbin(10)%bpoints = (/1,2,1,2,1,2/)pbinprint pbin(10)%bpoints

4

1 に答える 1

1

私は常にコードでこの種の構造を使用しています。gfortran を使用して、Linux ライクな OS でコンパイルまたは実行しても問題ありません。Intel コンパイラは 5 年前にこのタイプのコードで問題を抱えていましたが、私は最近そのコンパイラから離れたので、最新の Fortran 標準に追いついたかどうかはわかりません。私は MPI を使用しているため、gdb を使用することはめったになく、エラーがスローされる理由については役に立ちません。

とにかく、私はマークに同意します。最新の Fortran (gfortran を使用してコンパイル) は、このタイプの構造を問題なく処理できます。

于 2014-08-25T13:48:53.420 に答える