Hello
I know this a has been covered before, but I am specifically looking for two answers to my question. First Have a look at the following code
program test implicit none type :: data integer :: ias = -7777 integer :: is = 0 integer :: ic = 1 real :: x1(3) = 0. real :: xx(3) = 0. real :: u1(3) = 0. !x1 real :: uu(3) = 0. !x2 real :: d1 = 0. real :: dd = 0. real :: m1 = 0. real :: mm = 0. real :: q = 0. real :: nd = 0. real :: dtr = -1. real :: ydef = 0. real :: dydefdt = 0. real :: uflcf(3) = 0. real :: elapst = 0. real :: dist = 0. real :: dt = 1.e-3 real :: ta2ud = 0. real :: eddyt = huge(1e99) real :: usssa(3) = 0. real :: qq2 = 0. ! - real :: nsda = 0. ! - real :: ddtqq = -1. ! - end type data integer(kind=8) :: i, n type(data), allocatable :: dat(:) real :: rmd, rand,t1,t2, omp_get_wtime real, allocatable::x(:,:) n = 50*10**6 allocate(dat(n)) allocate(x(3,n)) rmd = rand(2.0) t1 = omp_get_wtime() do i = 1, n dat(i)%x1(1) = rmd**2 - exp(real(i)) dat(i)%x1(2) = dat(i)%x1(1) - exp(real(i)) dat(i)%x1(3) = dat(i)%x1(2) - exp(real(i)) ! x(1,i) = rmd**2 - exp(real(i)) ! x(2,i)= x(1,i) - exp(real(i)) ! x(3,i)=x(2,i)- exp(real(i)) enddo t2 = omp_get_wtime() print*, t2-t1 end program
Now the difference between doing x(1,i) = ** and dat(i)% x1(1:3) is quite a lot when comparing t2-t1, which is because of the way memory is stored and cache access.
I firstly don't understand that printed t2-t1 exclusively for the case with dat(i)%.. can be way smaller then when compared to a physical stop watch. I felt sometime that the t2-t1 was quite smaller than what it felt, so when trying to use my stop watch I observed a a difference.
Secondly, and most importantly, if we for some reason are reluctant to go away from the declared type style, is there really no way the compiler can be tricked to consider those members of the declared type as continguous individually ?