Fortran: l'initialisation de l'attribution et de la valeur aux tableaux
Question
Pour initialiser et de la valeur assign aux tableaux Fortran nous faisons comme suit:
INITIALISATION:
real(kind=8):: r(3,4) ... r(:,:) = 0.0_8
si nous utilisons
real(kind=8):: r(3,4) ... r = 0.0_8
et si nous faisons comme:
real(kind=8):: r(3,4) ... r = 0
aussi pour la situation telle que:
real(kind=8):: r(3,4), q(3,4), p(30,40) ... q = 0 r = q r = p(1:3,21:24)
nous préférons faire comme:
real(kind=8):: r(3,4), q(3,4), p(30,40) ... q = 0.0_8 r(:,:) = q(:,:) r(:,:) = p(1:3,21:24)
nous ne savons pas si espère que vous nous fournissez des raisons pour chacun que vous préférez .
La solution
Pensez-vous que "kind = 8" signifie 8 octets? Ce n'est pas vrai pour tous les compilateurs. La portabilité maximale est obtenue en utilisant la valeur intrinsèque de selected_real_kind pour définir une valeur type:
integer, parameter :: DRK = selected_real_kind (14)
quelques-unes des options que vous liste, je préfère
r = 0.0_8
, ou mieux r=0.0_DRK
.
Ceci définit l'ensemble du réseau. Il n'y a pas besoin de désigner des sections de tableau dans ce cas, puisque vous appelez le tableau entier: r (:, :). Steve Lionel a une discussion de savoir pourquoi essayer de faire des tableaux évidents avec ":" est pas une bonne idée - il existe des différences entre array et array (:) . Comme argument, le premier a déclaré qu'il dimensions, tandis que le second commence toujours à 1 - voir http://software.intel.com/en-us/blogs/2008/03/31/doctor-it-hurts-when-i -Avez-ce /
Depuis r est réel, r = 0 implique une conversion. Pour la valeur zéro cela ne presque certainement pas d'importance, mais il pourrait faire une différence importante avec d'autres valeurs. par ex.,
r = 3.1415927654
et
r = 3.141592654_8
donnera des valeurs différentes à r
parce que les constantes sont différentes, la première étant converti en simple précision avant la cession.
Autres conseils
Pour des considérations générales (y compris la déclaration et sur) efficacement attribution à l'aide des tableaux en Fortran, je vous suggère de lire cette .
Pour toute réponse plus précise à votre question, je l'ai fait quelques tests il y a quelques mois qui pourraient vous intéresser. Voici les résultats. Ceci est un test sur mon ordinateur portable sur Linux Archlinux personnal x86-64, avec GNU Fortran (GCC) 4.6.1 20.110.819 (préversion) sans option d'optimisation.
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
à
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
à
array = 0.0d0
! time : 0.250
à
array ( : , : , : ) = 0.0d0
! time : 0.250