Вопрос

Я пытаюсь проверить, не возвращают ли мои массивы ерунду, обращаясь к элементам, выходящим за границы, в 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.Это возможное решение зависит от размера массива.

родовое слово
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top