Поэлементное управление массивом
-
27-10-2019 - |
Вопрос
Я пытаюсь проверить, не возвращают ли мои массивы ерунду, обращаясь к элементам, выходящим за границы, в fortran. И я хочу проверить, что эти значения меньше единицы, и если они есть, измените их на единицу.
Это фрагмент моего кода, вызывающий проблемы:
lastNeighLabel=(/clusterLabel(jj-1,kk,ll), clusterLabel(jj,kk-1,ll), clusterLabel(jj,kk,ll-1)/)
LastNeighLabel содержит метку кластера (от 1 до n, где n - общее количество найденных уникальных отдельных кластеров) для последнего соседа в направлениях x, y, z соответственно.
Когда jj
или kk
или ll
равны 1, они пытаются получить доступ к 0-му элементу в массиве, а поскольку FORTRAN
отсчитывает от 1 в массивах, он пытается уничтожить вселенную. В настоящее время я запутался примерно из 8 операторов if / elseif, пытающихся закодировать для каждого случая. Но я надеялся, что есть способ работать с каждым элементом. В общем, я хотел бы сказать сгенерировать код кода в зависимости от того, какой элемент вызывает проблему.
Но я не могу придумать, как это сделать, потому что where будет управлять только переданными ему переменными, а не другим массивом с тем же индексом. Или я не прав?
С удовольствием отредактирую, если это не имеет смысла.
Решение
Может быть, вы могли бы использовать функцию?
родовое слово, а затем используйте f (clusterLabel, jj-1, kk, ll) и т. д.
Другие советы
Необязательно, чтобы Фортран имел доступ к массивам, начиная с единицы.Допускается любое начальное значение.Если вам удобнее иметь нулевой индексированный массив, объявите массив как:
родовое словоИли
родовое словои добавьте индексы 0, чтобы уловить особые случаи.
Это может быть еще одним решением вашей проблемы, поскольку нулевые значения индекса допустимы.
Другой возможный способ приблизиться к этому - создать расширенный массив меток кластера (с границами индекса, начинающимися с 0), который равен массиву меток кластера со слоем нулей, прикрепленных снаружи.Затем вы можете позволить вашему циклу безопасно работать со всеми значениями jj, kk и ll.Это возможное решение зависит от размера массива.
родовое слово