To initialize and assign value to arrays in Fortran we do as the following:
Initializing:
real(kind=8):: r(3,4) ... r(:,:) = 0.0_8
what if we use only
real(kind=8):: r(3,4) ... r = 0.0_8
and what if we do as:
real(kind=8):: r(3,4) ... r = 0
also for situation such as:
real(kind=8):: r(3,4), q(3,4), p(30,40) ... q = 0 r = q r = p(1:3,21:24)
we prefer to do as:
real(kind=8):: r(3,4), q(3,4), p(30,40) ... q = 0.0_8 r(:,:) = q(:,:) r(:,:) = p(1:3,21:24)
we are not sure so hope you provide us some reasons for each one you prefer.
For general considerations (including declaration and assignation) about efficiently using arrays in Fortran, I would suggest to read this.
For more precise answer to your question, I did some tests some months ago that may interest you. Here are the results. This is a test on my personnal laptop on Linux Archlinux x86-64, with GNU Fortran (GCC) 4.6.1 20110819 (prerelease) without optimization options.
do i = 1 , 100
do j = 1 , 100
do k = 1 , 100 ! innest is fastest
array ( i , j , k ) = 0.0d0
end do
end do
end do
! reference time : 1.00
to
do i = 1 , 100
do j = 1 , 100
do k = 1 , 100
array ( k , j , i ) = 0.0d0
end do
end do
end do
! time : 0.499
to
array = 0.0d0
! time : 0.250
to
array ( : , : , : ) = 0.0d0
! time : 0.250
Do you think that "kind=8" means 8 bytes? That isn't true for all compilers. The maximum portability is achieved using the selected_real_kind intrinsic to define a kind value:
integer, parameter :: DRK = selected_real_kind (14)
Of some of the options that you list, I prefer
r = 0.0_8
, or better r=0.0_DRK
.
This defines the entire array. There is no need to designate array sections in this case, since you are calling out the entire array: r (:, :). Steve Lionel has a discussion of why trying to make arrays obvious with ":" isn't a good idea -- there are differences between array and array (:). As an argument, the first has it declared dimensions, while the second always begins at 1 -- see http://software.intel.com/en-us/blogs/2008/03/31/doctor-it-hurts-when-i-do-this/
Since r is real, r=0 implies a conversion. For the value zero this almost certainly doesn't matter, but it could make an important difference with other values. e.g.,
r = 3.1415927654
and
r = 3.141592654_8
will give different values to r
because the constants are different, the first being converted to single precision before the assignment.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With