При решении задач математической физики разностными методами процесс вычислений часто носит итеративный характер. Такие процессы можно задавать с помощью уже описанных средств языка Норма. Для этого необходимо изменить (расширить) описание областей, определенных в задаче, добавив дополнительное направление, соответствующее индексу итерации. Однако такое расширение не всегда оправдано, так как это направление, по существу, является фиктивным, оно отражает способ вычисления, а не пространственно-временную сетку. Кроме этого, для такого фиктивного направления не всегда известны границы диапазона.
Специальная конструкция ITERATION позволяет задать итеративный вычислительный процесс и обойти при этом отмеченные выше трудности.
Неформально, итерация задает итеративные вычисления с индексом итерации, меняющимся от 0 до некоторого целого положительного значения, которое определяется условием завершения итерации.
Рассмотрим итеративный вычислительный процесс, связанный с решением системы уравнений:
и задаваемый формулами
условие завершения
На языке Норма этот процесс описывается следующим образом :
Собственно итерация представлена последними 8-ю строками примера. В заголовке итерации указывается индекс итерации - в данном случае N, и перечисляются величины, участвующие в итеративных вычислениях и представляющие результат этих вычислений - в данном случае это X (значение с последнего шага итерации) и Xped (значение с предпоследнего шага итерации). Величина Xpred не требует дополнительного описания: считается, что она описана так же, как и X. Значения X, как и Xpred могут использоваться для вычислений вне итерации; в данном примере эти значения просто объявлены выходными.
При описании итерации можно использовать возможность задания граничных значений итерируемых величин (вообще говоря, необязательных). Граничные значения итерируемой переменной задаются при помощи обычных операторов языка Норма внутри блока BOUNDARY ... END BOUNDARY. Эти значения считаются неизменными на протяжении всей итерации и определены на каждом шаге итерации.
Начальные значения для итерируемых величин задаются при помощи блока INITIAL...END INITIAL.
Тело итерации представляет собой часть программы, написанной на языке Норма. В частности, внутри итерации можно определить новую итерацию по другому направлению. В примере тело итерации состоит из единственного оператора ASSUME.
Индекс итерации может использоваться в списке индексов, указываемом для итерируемой величины, т.е. фактически можно считать, что итерируемая величина в пределах итерации имеет дополнительный итерационный индекс (по фиктивному направлению). Индекс итерации без смещения можно не указывать.
Индекс итерации может быть указан только у итерируемых величин.
В теле конструкции ITERATION могут вычисляться значения величин, не указанных в списке итерируемых величин. Такие величины могут потребоваться, например, для представления промежуточных результатов, вычисляемых на каждом из витков итерации. Использование таких величин не приводит к нарушению правила об однократном присваивании - считается, что на каждом витке итерации используется новая копия величины.
Итерационный процесс завершается, если логическое выражение, заданное в условии выхода, принимает значение "истина".