In questo programma di esempio sto facendo la stessa cosa (almeno la penso così) in due modi diversi. Sto eseguendo questo sul mio PC Linux e monitorando l'utilizzo della memoria con top. Usando gfortran trovo che nel primo modo (tra "1" e "2") la memoria utilizzata sia di 8,2 GB, mentre nel secondo modo (tra "2" e "3") l'utilizzo della memoria è di 3,0 GB. Con il compilatore Intel la differenza è ancora maggiore: 10 GB contro 3 GB. Questo sembra una penalità eccessiva per l'utilizzo di puntatori. Perché succede?
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
Lo sfondo è il perfezionamento della griglia locale. Ho scelto l'elenco collegato per aggiungere e rimuovere facilmente i volti. Il numero di nodi è 4 per impostazione predefinita, ma può aumentare a seconda dei perfezionamenti locali.