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) прекрасно справляется с этим типом структуры.