I have expanded to a smaller example to show deallocate of allocatable components, which appears to work.
! ftn95 /64 /debug /link
!
! var1(idim1)%var2(idim2)%var3(idim3,idim4)
!
!
module modv3
integer :: idim1,idim2,idim3,idim4
integer*8 :: bytes = 0
type v2
integer :: n
real, allocatable, dimension(:,:) :: var3
end type v2
type v1
integer :: m
type(v2), allocatable, dimension (:) :: var2
end type v1
type (v1) var1(0:3) ! 4 types of fish
Contains
integer function fun1 ()
real :: rand4
integer :: k
write (*,10)
10 format (/' regenerating data structure')
bytes = 0
do idim1 = 0, 3
idim2 = 10 + idim1*3 ! was 100
idim3 = 12
if ( allocated ( var1(idim1)%var2 )) call deallocate_var2 ( idim1 )
var1(idim1)%m = idim2
allocate ( var1(idim1)%var2(idim2) )
bytes = bytes + idim2*4
do k = 1,idim2
CALL RANDOM_NUMBER(rand4)
idim4 = rand4 * 1000. + 1
if ( allocated ( var1(idim1)%var2(k)%var3 )) then
deallocate ( var1(idim1)%var2(k)%var3 )
write (*,*) 'unexpected deallocate var1(idim1)%var2(k)%var3'
end if
allocate ( var1(idim1)%var2(k)%var3(idim3,idim4) )
write (*,11) 'var1( ',idim1,' )% var2( ',k,' )% var3 (', idim3,' x ',idim4,' )'
11 format ( a,i0,a,i0,a,i0,a,i0,a)
var1(idim1)%var2(k)%n = idim4
var1(idim1)%var2(k)%var3(1,1) = idim4
bytes = bytes + 4 + idim3*idim4*4
end do
end do
fun1=2
end function fun1
subroutine deallocate_var2 ( j )
integer :: j,lj,k, nd
if ( allocated ( var1(j)%var2 ) ) then
nd = 0
lj = var1(j)%m
do k = 1,lj
if ( .not. allocated ( var1(j)%var2(k)%var3 )) cycle
deallocate ( var1(j)%var2(k)%var3 )
nd = nd+1
end do
deallocate ( var1(j)%var2 )
nd = nd+1
write (*,fmt='(a,i0,a,i0,a,i0)') '( var1( ',j,' )%var2( ',lj,' ) DEALLOCATED ',nd
end if
end subroutine deallocate_var2
end module modv3
!=========================
Program Prg
use modv3
integer, external :: fun2
integer :: jj
jj = fun1 ()
jj = fun1 ()
jj = fun2 ()
write (*,*) '??'
read (*,*) jj
end program
!========================
integer function fun2 ()
use modv3
integer :: j,lj,k
do j = 0,3
lj = var1(j)%m
do k = 1,lj,4
print*, var1(j)%m, j,k, var1(j)%var2(k)%n, var1(j)%var2(k)%var3(1,1) ! checking just one fish on the surface
end do
end do
write (*,11) bytes,' bytes allocated'
11 format (B'zzz,zzz,zzz,zz#',a)
fun2=2
end function fun2
Paul, the following warning appears false.
[FTN95/x64 Ver. 9.00.0 Copyright (c) Silverfrost Ltd 1993-2023]
0036) if ( allocated ( var1(idim1)%var2 )) call deallocate_var2 ( idim1 )
WARNING - 1179: MODV3!VAR1 is not ALLOCATABLE yet is used in an ALLOCATED test