En este programa de muestra estoy haciendo lo mismo (al menos eso creo) de dos maneras diferentes. Estoy ejecutando esto en mi PC con Linux y monitoreando el uso de memoria con top. Usando gfortran encuentro que en la primera forma (entre "1" y "2") la memoria utilizada es de 8.2GB, mientras que en la segunda forma (entre "2" y "3") el uso de la memoria es de 3.0GB. Con el compilador de Intel, la diferencia es aún mayor: 10GB frente a 3GB. Esto parece una penalización excesiva por usar punteros. ¿Por qué pasó esto?
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
El fondo es el refinamiento de la red local. Elegí la lista vinculada para agregar y eliminar caras fácilmente. El número de nodos es 4 de forma predeterminada, pero puede aumentar según los refinamientos locales.