Критерий остановки
Сами вычисления уже описаны, но когда их стоит завершить? Здесь поможет критерий остановки. Критерий остановки это такое условие, при выполнении которого мы считаем, что задача решена.
Описание применения критерия
Критерием остановки является максимальное значение невязки каждого решателя, т. е. при синхронизации решатель отправляет на сервер свою максимальную невязку, затем запрашивает у сервера общую максимальную невязку, которая равна максимальной среди всех решателей. Если значение этой величины меньше наперёд заданного числа ε, то это означает, что на всех решателях получены решения подзадач с необходимой точностью, а значит и вся задача решена с определённой наперёд заданной точностью ε. В противном случае, если хотя бы один решатель имеет отклонение больше ε, то вычисления продолжается на всех решателях.
Важной деталью, которую не следует упускать, здесь является то, что обмен совершается не раз в итерацию, а один раз в некоторое число итераций. Это число назовём «периодом обмена». Если значение периода обмена слишком велико, то есть вероятность, что к синхронизации величина максимальной невязки будет не больше числа ε. В этом случае всё ещё нельзя считать задачу решённой, т. к. граничные значения с другими решателями ещё не сошлись к решению задачи. То есть наблюдается сходимость не к конечному, а промежуточному решению. Особенно это заметно к концу расчётов для значения «периодом обмена» более 500 итераций. Для того чтобы устранить влияние этого эффекта после приёма перехлёста невязка считается так же и по границе и если максимальное значение невязки больше ε то расчёты продолжаются.
На последнем этапе результаты вычислений от решателей передаются на машину клиента. Результатом является матрица значений с элементами, полученными после всех итераций. Затем на основе маски начальной задачи и матрицы значений задачи осуществляется «склейка» всех объектов в единую матрицу решения, которая является окончательным решением задачи. Ещё раз схема решения задачи.
Итоги
Надо сказать, что с критерием остановки я намучился. Мои вычисления то не до конца сходились, то слишком долго считали. Или, что ещё хуже, зависали. Наверное, стоило сразу продумывать архитектуру, а не бросаться с шашкой наголо. Вот некоторые причины такого странного поведения. Если проверять критерий остановки, то некоторые области могут быстрей сойтись и отключиться, а какие-то медленней. Поэтому часть отвалится, часть их ждёт. Вторая причина — если игнорировать отключение, то можно сойтись не к тому решению.