создание несмежных данных и создание временных массивов - PullRequest
0 голосов
/ 08 июня 2019

На аналогичный вопрос ответили в Предупреждение времени выполнения Fortran: временный массив . Однако решения не совсем помогают мне в моем случае. Внутри подпрограммы у меня есть вызов подпрограммы:

subroutine initialize_prim(prim)

 real(kind=wp), dimension(2, -4:204), intent(out) :: prim

call double_gaussian(prim(1, :))

end subroutine initialize_prim
subroutine double_gaussian(y)

    real(kind=wp), dimension(-4:204), intent(out) :: y

    integer :: i

    do i = -4, 204
      y(i) = 0.5 * ( &
         exp(-((r(i) - r0))**2) + exp(-((r(i) + r0)/std_dev)**2))
    end do

  end subroutine double_gaussian

Это дает сообщение об ошибке, говорящее, что fortran создает временный массив для "y" в "double_gaussian". Прочитав немного о случайных массивах, я понимаю, почему появляется эта ошибка. Теперь, глядя на всю мою программу, было бы очень утомительно инвертировать порядок массивов для «prim», так что решение на самом деле невозможно. Для создания предполагаемых фигур в "double_gaussian" я попытался сделать,


    real(kind=wp), dimension(:), intent(out) :: y

    integer :: i

    do i = -4, 204
      y(i) = 0.5 * ( &
         exp(-((r(i) - r0))**2) + exp(-((r(i) + r0)/std_dev)**2))
    end do

  end subroutine double_gaussian

Это, однако, приводит к сбою fortran с сообщением об ошибке «Индекс -4» измерения 1 массива «у» ниже нижней границы 1 ». Похоже, что для формата предполагаемой формы индексация, тем не менее, начинается с 1, тогда как она начинается с -4, как в моем случае. Есть ли способ решить эту проблему?

1 Ответ

1 голос
/ 08 июня 2019

Я думаю, что вы, возможно, неправильно интерпретировали предупреждение как ошибку .Обычно компиляторы выдают предупреждение при создании временных массивов - это полезное средство для высокопроизводительного программирования.Но я не уверен, что компилятор считает это ошибкой.И да, я понимаю, почему вы, возможно, не захотите переупорядочивать свой массив, просто чтобы избежать этого

Что касается сбоя - вы обнаружили, что подпрограммы Фортрана автоматически не знают о нижних границах массивов, которые вытщательно установить, чтобы быть отличным от 1 (ни их верхние границы также).Если необходимо, вы должны пройти границы (обычно только нижнюю границу, процедура может сама определить верхнюю границу) в списке аргументов.

Однако это редко необходимо, и, похоже, это не входит в ваш код - цикл для установки каждого значения массива y можно (если я правильно понимаю) заменить на

y = 0.5 * (exp(-((r - r0))**2) + exp(-((r + r0)/std_dev)**2))

PS Я думаю, что эта часть вашего вопроса о подпрограммах, не учитывающих нижние границы массива, отличного от 1, почти наверняка является дубликатом нескольких других вопросов, заданных поблизости, но которые я не смог сразу найти.

...