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.

Тем не менее, я сталкиваюсь с некоторыми странными проблемами при попытке отладки кода с использованием gdb 7.7.1 под Fedora. При попытке взглянуть на данные в элементе rbin массив (используя print rbin(10)%bpoints например) GDB всегда печатает (0, 0, 0, 0, 0, 0) хотя я назначил данные bpoints (например rbin(10)%bpoints = (/1,2,1,2,1,2/)). Если я смотрю на данные в элементе pbin использование массива print pbin(10)%bpoints например, тогда я получаю именно то, что ожидаю. У кого-нибудь есть понимание по этому вопросу?

1 ответ

Решение

Я использую подобные структуры в своем коде все время. Нет проблем компилирования или запуска под Linux-подобной ОС с использованием gfortran. У компилятора Intel были проблемы с этим типом кода 5 лет назад, но в последнее время я отошел от этого компилятора, так что я не уверен, догнали ли они теперь новые стандарты Fortran. Я использую MPI, поэтому я редко могу использовать GDB и не могу понять, почему он выбрасывает ошибки.

Во всяком случае, я согласен с Марком; Современный Фортран (скомпилированный с использованием gfortran) прекрасно справляется с этим типом структуры.

Другие вопросы по тегам