I have the following piece of code:
program testdatatype
integer(8), parameter :: Stot= 2
integer(8), dimension(Stot) :: Nf
integer(8) :: f, s, Qind
integer(8), dimension(:, :), allocatable :: NqG
real(16), dimension(:, :, :), allocatable :: d3xnormfac
type NqGtype
integer(8), dimension(:, :), allocatable :: NqGvalT
end type NqGtype
type(NqGtype), dimension(Stot) :: NqGT
type d3xnormfactype
real(16), dimension(:, :, :), allocatable :: d3xnormfacvalT
end type d3xnormfactype
type(d3xnormfactype), dimension(Stot) :: d3xnormfacT
! ----------------------------------------------------
! LOOP 1.1:
do s= 1, Stot, 1
Nf(s)= 2d0
write(*, *) 'NfLoop1.1= ', Nf(s)
end do
! LOOP 1.2:
do s= 1, Stot, 1
write(*, *) 'NfLoop1.2= ', Nf(s)
end do
! ----------------------------------------------------
! LOOP 2.1:
do s= 1, Stot, 1
allocate(NqG(Nf(s), Stot))
do f= 1, Nf(s), 1
NqG(f, s)= 5d0
NqGT(s)%NqGvalT= NqG
write(*, *) 'NqGLoop2.1= ', NqG(f, s)
write(*, *) 'NqGTLoop2.1= ', NqGT(s)%NqGvalT(f, s)
end do
deallocate(NqG)
end do
! LOOP 2.2:
do s= 1, Stot, 1
do f= 1, Nf(s), 1
write(*, *) 'NqGTLoop2.2= ', NqGT(s)%NqGvalT(f, s)
end do
end do
! ----------------------------------------------------
! LOOP 3.1:
do s= 1, Stot, 1
do f= 1, Nf(s), 1
allocate(d3xnormfac(Nf(s), Stot, NqGT(s)%NqGvalT(f, s)))
do Qind= 1, NqGT(s)%NqGvalT(f, s)
d3xnormfac(f, s, Qind)= 153d12
d3xnormfacT(s)%d3xnormfacvalT= d3xnormfac
write(*, *) 'd3xnormfacLoop3.1= ', d3xnormfac(f, s, Qind)
write(*, *) 'd3xnormfacTLoop3.1= ', d3xnormfacT(s)%d3xnormfacvalT(f, s, Qind)
end do
deallocate(d3xnormfac)
end do
end do
! LOOP 3.2:
do s= 1, Stot, 1
do f= 1, Nf(s), 1
do Qind= 1, NqGT(s)%NqGvalT(f, s)
write(*, *) 'd3xnormfacTLoop3.2= ', d3xnormfacT(s)%d3xnormfacvalT(f, s, Qind)
end do
end do
end do
! ----------------------------------------------------
end program testdatatype
I am compiling this .f90 file on a mpif90 compiler. As you can see when I run this code it is apparent that the write
statement in Loop 1.1 gives the same as than in Loop 1.2, that is, the value of Nf(:)
is correct for all s values outside of Loop 1.1. This is the same for Loop 2.1 and Loop 2.2 (this time creating a derived data type). The output for Loop 1 is the following:
NfLoop1.1= 2
NfLoop1.1= 2
NfLoop1.2= 2
NfLoop1.2= 2
I am able to call out any correct value of the data type NqGT(s)%NqGT(f, s)
for any f and s value (in Loop 2.2) outside of the loop where it was created (Loop 2.1). There is no problem so far. When I run Loop 1 variables with Loop 2 the following output is given:
NfLoop1.1= 2
NfLoop1.1= 2
NfLoop1.2= 2
NfLoop1.2= 2
NqGLoop2.1= 5
NqGTLoop2.1= 5
NqGLoop2.1= 5
NqGTLoop2.1= 5
NqGLoop2.1= 5
NqGTLoop2.1= 5
NqGLoop2.1= 5
NqGTLoop2.1= 5
NqGTLoop2.2= 5
NqGTLoop2.2= 5
NqGTLoop2.2= 5
NqGTLoop2.2= 5
Furthermore, when running Loop 1 variables into Loop 2 derived data types, which in turn are used with Loop 3, the following output is given:
NfLoop1.1= 2
NfLoop1.1= 2
NfLoop1.2= 2
NfLoop1.2= 2
NqGLoop2.1= 5
NqGTLoop2.1= 5
NqGLoop2.1= 5
NqGTLoop2.1= 5
NqGLoop2.1= 5
NqGTLoop2.1= 5
NqGLoop2.1= 5
NqGTLoop2.1= 5
NqGTLoop2.2= 5
NqGTLoop2.2= 5
NqGTLoop2.2= 5
NqGTLoop2.2= 5
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.1= 153000000000000.000000000000000000000
d3xnormfacTLoop3.2= -1.83360386755485123703987599430319601E-2466
d3xnormfacTLoop3.2= 0.00000000000000000000000000000000000
d3xnormfacTLoop3.2= 0.00000000000000000000000000000000000
d3xnormfacTLoop3.2= 0.00000000000000000000000000000000000
d3xnormfacTLoop3.2= 0.00000000000000000000000000000000000
d3xnormfacTLoop3.2= 153000000000000.000000000000000000000
d3xnormfacTLoop3.2= 153000000000000.000000000000000000000
d3xnormfacTLoop3.2= 153000000000000.000000000000000000000
d3xnormfacTLoop3.2= 153000000000000.000000000000000000000
d3xnormfacTLoop3.2= 153000000000000.000000000000000000000
d3xnormfacTLoop3.2= 0.00000000000000000000000000000000000
d3xnormfacTLoop3.2= 0.00000000000000000000000000000000000
d3xnormfacTLoop3.2= 0.00000000000000000000000000000000000
d3xnormfacTLoop3.2= 0.00000000000000000000000000000000000
d3xnormfacTLoop3.2= 0.00000000000000000000000000000000000
d3xnormfacTLoop3.2= 153000000000000.000000000000000000000
d3xnormfacTLoop3.2= 153000000000000.000000000000000000000
d3xnormfacTLoop3.2= 153000000000000.000000000000000000000
d3xnormfacTLoop3.2= 153000000000000.000000000000000000000
d3xnormfacTLoop3.2= 153000000000000.000000000000000000000
However, when I am trying to do the same for Loop 3.1 I can no longer get all of the correct values of the derived data type d3xnormfacT(s)%d3xnormfacvalT(f, s, Qind)
, that is, the data type printed in Loop 3.2 does not equal the values printed of the same data type in Loop 3.1 (some values are correct but other values are not). How can I fix this? I must be missing something (pointers and/or allocation with the derived data types?)