Fortran: очистка определенного массива при выходе из подпрограммы - PullRequest
0 голосов
/ 04 августа 2011

Я делаю анализ чувствительности и, следовательно, мне нужно многократно запускать мою программу с разными параметрами.У меня есть основная программа, которая вызывает подпрограмму, которая вычисляет нужные мне значения.Поэтому мне нужно вызывать подпрограмму много раз.

Подпрограмма имеет несколько массивов, определенных как:

real, измерение (1000) :: array_1, array_2

После выхода измассив программа не освобождает массив, поэтому для двух вызовов функции мне нужно написать:

real, измерение (2000) :: array_1, array_2

Есть ли простое решение дляэтот ?Спасибо

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Если у вас много массивов с практически одинаковыми данными, то, как вы уже поняли, их имена массива, массива_1, массива_2 и т. Д. Вскоре станут неловкими.Два других возможных дизайна: 1) использовать один массив и обрабатывать данные в цикле.После обработки одной группы данных прочитайте следующую группу и перезапишите предыдущие данные в том же массиве.2) Используйте двумерный массив, как предложено @Yann, со вторым измерением, являющимся количеством наборов данных / различных наборов значений параметров.

Если массивы каждого набора данных имеют разную длину, для решения 1 вы можете объявить массив «выделяемым» и назначить его правильной длине в начале каждой итерации, а затем освободить в конце каждой итерации.Для 2, вероятно, было бы проще (но не самым эффективным для использования памяти) сделать длину максимальной длиной и иметь вспомогательный массив, определяющий используемую длину.

PS Являются ли эти массивы локальными для подпрограммы?Затем, если вы передаете длину подпрограмме в качестве аргумента, например, «len», вы можете объявить массивы как:

integer, intent (in) :: len
real, dimension(len) :: array_1, array_2

, и массивы будут воссозданы при повторном вызове подпрограммы с помощьюконкретная длина "лен".Внутри процедуры (подпрограммы или функции), и если длина передается в качестве аргумента, вы можете получить массив переменной длины очень просто.Вы даже можете получить длину, используя функцию размера, примененную к аргументу массива!В основной программе, или если длина не известна как константа или аргумент процедуры, вы можете отложить размер массива, присвоив ему атрибут «allocatable» в объявлении, и динамически выделить массив с помощью «allocate»."заявление.

1 голос
/ 04 августа 2011

Позвольте мне повторить вашу проблему, просто чтобы убедиться, что я правильно ее понимаю;Пожалуйста, поправьте меня, если я ошибаюсь.

  1. У вас есть подпрограмма, которая вычисляет 1000 значений в двух отдельных массивах: array_1 и array_2.
  2. Из вашей основной программы вы хотели бы вызывать эту подпрограмму много раз, каждый раз генерируя уникальные наборы из 1000 значений.

Допустим, вы хотите вызвать вашу подпрограмму N раз, хотите ли вы сравнить N наборов чисел вне подпрограммы, т.е. в вашей основной программе, или вы хотите сделать сравнениевнутри подпрограммы?

В любом случае, я объявляю массивы примерно так:

real, dimension(N,1000) :: array_1, array_2

Если вы хотите выполнить сравнение вне подпрограммы, вы сделаете вышеуказанное объявление в основнойпрограмма.Затем вы будете вызывать подпрограмму N раз, а после каждого i-го раза копировать значения в массивы main_1 (i, *) и array_2 (i, *).При этом подпрограмма будет иметь только массивы, определенные следующим образом:

real, dimension(1000) :: array_1, array_2

Каждый раз, когда подпрограмма вызывается, она будет повторно использовать эти массивы, перезаписывая предыдущие значения.Это должно быть хорошо, если вы записали предыдущие значения в массивах main.

Если вы делаете это в f90, вы можете динамически размещать array_1 и array_2, и пусть N будет переменной длины.Кроме того, вы можете изначально выделить массивы с достаточным пространством для хранения всех возможных вызовов подпрограммы.Допустим, вы не собираетесь выполнять более 100 вызовов подпрограммы:

real array_1(100,1000), array_2(100,1000)

Извините, если это не то, что вы ищете, но, пожалуйста, уточните, если я пропустил, понял ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...