Фортран: инициализация и присвоение значения массивам - PullRequest
4 голосов
/ 12 января 2012

Для инициализации и присвоения значения массивам в Fortran мы делаем следующее:

Инициализация:

real(kind=8):: r(3,4)
...
r(:,:) = 0.0_8

что если мыиспользуйте только

real(kind=8):: r(3,4)
...
r = 0.0_8

, и что если мы сделаем как:

real(kind=8):: r(3,4)
...
r = 0

также для таких ситуаций, как:

real(kind=8):: r(3,4), q(3,4), p(30,40)
...
q = 0
r = q
r = p(1:3,21:24)

, мы предпочитаем делать как:

real(kind=8):: r(3,4), q(3,4), p(30,40)
...
q = 0.0_8
r(:,:) = q(:,:)
r(:,:) = p(1:3,21:24)

мы не уверены, поэтому надеемся, что вы предоставите нам некоторые причины для каждого, который вы предпочитаете .

Ответы [ 2 ]

11 голосов
/ 13 января 2012

Для общих соображений (включая объявление и присваивание) относительно эффективного использования массивов в Fortran, я бы предложил прочитать this .

Для более точного ответа на ваш вопрос, Несколько месяцев назад я провел несколько тестов , которые могут вас заинтересовать. Вот результаты. Это тест на моем персональном ноутбуке в Linux Archlinux x86-64 с GNU Fortran (GCC) 4.6.1 20110819 (предварительный выпуск) без параметров оптимизации.

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
6 голосов
/ 12 января 2012

Как вы думаете, что "kind = 8" означает 8 байтов? Это не верно для всех компиляторов. Максимальная переносимость достигается с помощью свойства selected_real_kind для определения значения вида:

integer, parameter :: DRK = selected_real_kind (14)

Из некоторых опций, которые вы перечисляете, я предпочитаю r = 0.0_8 или лучше r=0.0_DRK. Это определяет весь массив. В этом случае нет необходимости назначать секции массива, поскольку вы вызываете весь массив: r (:, :). Стив Лайонел обсуждает, почему попытка сделать массивы очевидными с помощью «:» не очень хорошая идея - существуют различия между массивом и массивом (:) . В качестве аргумента, первый имеет объявленные размеры, а второй всегда начинается с 1 - см. http://software.intel.com/en-us/blogs/2008/03/31/doctor-it-hurts-when-i-do-this/

Поскольку r является действительным, r = 0 подразумевает преобразование. Для нулевого значения это почти наверняка не имеет значения, но оно может иметь важное значение с другими значениями. например.,

r = 3.1415927654

и

r = 3.141592654_8

будет давать различные значения для r, поскольку константы различаются, причем первое перед преобразованием преобразуется в одинарную точность.

...