1

我目前正在开发一个大型 Fortran 程序,其中我有一个离散的数值网格,其中包含我在网格范围内跟踪的一系列粒子。为此,我定义了以下三种派生类型:

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)%bpoints,gdb 总是会打印出来。如果我使用例如查看数组元素中的数据,那么我得到的正是我所期望的。有人对这个问题有一些见解吗?(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 的操作系统上编译或运行没有问题。英特尔编译器在 5 年前就遇到了这种类型的代码问题,但我最近离开了那个编译器,所以我不确定他们现在是否已经赶上了更新的 Fortran 标准。我使用 MPI,所以我很少使用 gdb 并且不能帮助解释为什么它会抛出错误。

无论如何,我同意马克的观点;现代 Fortran(使用 gfortran 编译)可以很好地处理这种类型的结构。

于 2014-08-25T13:48:53.420 回答