Я реализовал многосеточный решатель V-Cycle, используя как линейную коррекцию дефектов (LDC), так и схему полного приближения (FAS).
Моя проблема заключается в следующем: при использовании LDC остаток уменьшается в ~ 0,03 раза за цикл. Реализация FAS тоже сходится с линейным коэффициентом, но коэффициент составляет всего ~ 0,58. Таким образом, ФАС нужно примерно в 20 раз больше количества циклов.
Большая часть кода используется совместно, единственное отличие - вычисления вниз / вверх, используемые НРС
вниз:
до:
и ФАС использует
вниз:
вверх:
Мои тестовые настройки взяты из "Учебника по многосеточным сеткам, второе издание" Бригга, стр. 64, имеет аналитическое решение
с
и уравнение с использованием типичной линейной 5-точечный трафарет в качестве оператора Лапласа- . Первоначальное предположение .
Изменение настройки теста, например, на тривиальное с использованием первоначального предположения приводит к почти одинаковым коэффициентам сходимости.
Так как отличается только код «вниз / вверх», результаты НРС соответствуют книге, и, по крайней мере, FAS, похоже, тоже работает, я понятия не имею, почему он намного медленнее при той же линейной настройке.
В LDC и FAS есть одно странное поведение, которое я пока не могу объяснить, это происходит только в том случае, если первоначальное предположение неверно (например, но также и в моих полносеточных экспериментах, где интерполяция в новую точную сетку увеличивает остаток от до ): если я увеличу число посткорреспондентских релаксаций до очень большого числа, так что решение будет решено с точностью станка на грубой сетке, оно потеряет почти все цифры при переходе на один шаг вверх к следующей мелкой сетке.
Поскольку картинка говорит больше, чем слова:
// first cycle, levels 0-4
// DOWN
VCycle top 4, start res_norm 3.676520e+02 // initial residual
VCycle top 4, cycle 0, current 4, res_norm 3.676520e+02
VCycle top 4, cycle 0, current 4, res_norm 1.520312e+02 // relaxed (2 iterations)
VCycle tau_norm 2.148001e+01 (DEBUG calculation)
VCycle top 4, cycle 0, current 3, res_norm 1.049619e+02 // restricted
VCycle top 4, cycle 0, current 3, res_norm 5.050392e+01 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 2, res_norm 3.518764e+01 // restricted
VCycle top 4, cycle 0, current 2, res_norm 1.759372e+01 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 1, res_norm 1.234398e+01 // restricted
VCycle top 4, cycle 0, current 1, res_norm 4.728777e+00 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 0, res_norm 3.343750e+00 // restricted
// coarsest grid
VCycle top 4, cycle 0, current 0, res_norm 0.000000e+00 // solved
// UP
VCycle top 4, cycle 0, current 1, res_norm 3.738426e+00 // prolonged
VCycle top 4, cycle 0, current 1, res_norm 0.000000e+00 // relaxed (many iterations)
VCycle top 4, cycle 0, current 2, res_norm 1.509429e+01 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 2, res_norm 2.512148e-15 // relaxed (many iterations)
VCycle top 4, cycle 0, current 3, res_norm 4.695979e+01 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 3, res_norm 0.000000e+00 // relaxed (many iterations)
VCycle top 4, cycle 0, current 4, res_norm 1.469312e+02 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 4, res_norm 9.172812e-24 // relaxed (many iterations)
Я не уверен, может ли быть получено только несколько цифр за цикл или это указывает на ошибку во время интерполяции в точную сетку. Если это последний случай, то как НРС может достичь остаточных коэффициентов на уровне книги ~ 0,03 при использовании всегда 2 релаксаций?