Neste programa de exemplo, estou fazendo a mesma coisa (pelo menos acho) de duas maneiras diferentes. Estou executando isso no meu pc Linux e monitorando o uso de memória com o top. Usando o gfortran, acho que na primeira maneira (entre "1" e "2") a memória usada é de 8,2 GB, enquanto na segunda maneira (entre "2" e "3") o uso da memória é de 3,0 GB. Com o compilador Intel, a diferença é ainda maior: 10 GB versus 3 GB. Isso parece uma penalidade excessiva pelo uso de ponteiros. Por que isso acontece?
program test
implicit none
type nodesType
integer:: nnodes
integer,dimension(:),pointer:: nodes
end type nodesType
type nodesType2
integer:: nnodes
integer,dimension(4):: nodes
end type nodesType2
type(nodesType),dimension(:),allocatable:: FaceList
type(nodesType2),dimension(:),allocatable:: FaceList2
integer:: n,i
n = 100000000
print *, '1'
read(*,*)
allocate(FaceList(n))
do i=1,n
FaceList(i)%nnodes = 4
allocate(FaceList(i)%nodes(4))
FaceList(i)%nodes(1:4) = (/1,2,3,4/)
end do
print *, '2'
read(*,*)
do i=1,n
deallocate(FaceList(i)%nodes)
end do
deallocate(FaceList)
allocate(FaceList2(n))
do i=1,n
FaceList2(i)%nnodes = 4
FaceList2(i)%nodes(1:4) = (/1,2,3,4/)
end do
print *, '3'
read(*,*)
end program test
O plano de fundo é o refinamento da grade local. Eu escolhi a lista vinculada para adicionar e remover faces facilmente. O número de nós é 4 por padrão, mas pode se tornar maior dependendo dos refinamentos locais.