Если я правильно понимаю, у вас происходит какое-то пошаговое изменение времени, когда вы создаете значения в new_potential
путем вычислений на old_potential
.Затем сделайте старое равным новому и продолжайте.
Вы можете заменить существующие тесты сходимости одним оператором
converged = all(abs(new_potential - old_potential)<tol)
, который может быть быстрее.Если скорость теста является серьезной проблемой, вы можете проверить только каждую другую (или каждую третью или четвертую ...) итерацию
Несколько комментариев:
1) Если вы использовали потенциальныймассив с двумя плоскостями, вместо old_ и new_potential, вы можете перевести new_ в old_, поменяв местами индексы в конце каждой итерации.Поскольку ваш код стоит, происходит много движения данных.
2) Хотя с семантической точки зрения вы и вправе иметь цикл while, я бы всегда использовал цикл do с максимальным числом итераций, на всякий случайкритерий сходимости никогда не выполняется.
3) В вашей декларации REAL(KIND=DP) :: TOL = 0.001_DP
спецификация DP для числового значения TOL является избыточной, REAL(KIND=DP) :: TOL = 0.001
является адекватным.Я бы также сделал это параметром, компилятор может оптимизировать его использование, если он знает, что он неизменен.
4) Вам действительно не нужно выполнять CONVERGED = .TRUE.
внутри самого внешнего цикла,установите его перед первой итерацией - это сэкономит вам наносекунду или две.
Наконец, если ваш критерий сходимости состоит в том, что каждый элемент в потенциальном массиве сходится к 3dp, то это то, что вы должны проверить.Было бы относительно легко построить контрпримеры для предложенных вами средних значений.Однако меня беспокоит то, что ваша система никогда не будет сходиться на каждом элементе, и что вы должны использовать некоторое матричное вычисление нормы для определения сходимости.ТАК не место для урока в этой теме.