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 .

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top