Что может пойти не так, если использовать методы Крылова из KSP ( пакет линейного решателя PETSc ) с предварительными именами для решения разреженной линейной системы, например, полученной путем дискретизации и линеаризации уравнений в частных производных?
Какие шаги я могу предпринять, чтобы определить, что идет не так для моей проблемы?
Какие изменения я могу внести, чтобы успешно и эффективно решить мою линейную систему?
petsc
тег. Методология общая, но я думаю, что ответ был бы менее полезным, если бы каждое «попробуй это» также не включало «как». Альтернативно, «как» должно быть намного более длинным (и более подверженным ошибкам для зрителя), если бы его нужно было объяснить программно-независимым способом. Если кто-то захочет объяснить, как делать все эти вещи, используя другой пакет, я с радостью сделаю вопрос независимым от программного обеспечения и поменяю свой ответ, заявив, что он описывает, что делать в PETSc. Примечание: я добавил это, что является расширенной версией часто задаваемых вопросов, поэтому я мог бы понравиться людям на этом сайте.Ответы:
Первоначальный совет
-ksp_converged_reason -ksp_monitor_true_residual
понять, почему метод не сходится.-ksp_view_binary
илиMatView()
для сохранения линейной системы, а затем используйте код$PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.c
для чтения в матрице и ее решения (возможно, с другим числом процессов). Для этого требуется собранная матрица, поэтому ее полезность может быть несколько ограничена.Общие причины, по которым KSP не сходится
-pc_type svd -pc_svd_monitor
. Также попробуйте прямой решатель с-pc_type lu
(например, через сторонний пакет параллельно-pc_type lu -pc_factor_mat_solver_package superlu_dist
).KSPSetNullSpace()
.KSPSetNullSpace()
использовались, но правая часть не согласована. Возможно, вам придется позвонитьMatNullSpaceRemove()
с правой стороны, прежде чем звонитьKSPSolve()
.-ksp_gmres_restart 1000 -pc_type none
. Для простых проблем седловой точки, попробуйте-pc_type fieldsplit -pc_fieldsplit_type schur -pc_fieldsplit_detect_saddle_point
. См. Руководство пользователя и справочную страницу PCFIELDSPLIT для получения более подробной информации. Для более сложных проблем прочитайте литературу, чтобы найти надежные методы и спросите здесь (илиpetsc-users@mcs.anl.gov
илиpetsc-maint@mcs.anl.gov
), если вам нужен совет о том, как их реализовать. Например, посмотрите этот вопрос для высокой частоты Гельмгольца. Для скромных размеров проблемы, посмотрите, можете ли вы жить с помощью прямого решателя.-pc_type asm -sub_pc_type lu
улучшает ли скорость сходимости. Если GMRES теряет слишком много прогресса при перезапуске, посмотрите, поможет ли более длительный перезапуск-ksp_gmres_restart 300
. Если доступна транспонирование, попробуйте-ksp_type bcgs
другие способы, не требующие перезапуска. (Обратите внимание, что сходимость с этими методами часто ошибочна.)-pc_type lu
либо параллельно, используя сторонний пакет (например-pc_type lu -pc_factor_mat_solver_package superlu_dist
, илиmumps
). Метод должен сходиться за одну итерацию, если матрицы одинаковы, а в противном случае - за «небольшое» количество итераций. Попробуйте-snes_type test
проверить матрицы при решении нелинейной задачи.-ksp_type fgmres or -ksp_type gcr
.-pc_mg_galerkin
алгебраически построить правильно масштабированный грубый оператор или убедитесь, что все уравнения масштабируются одинаково, если вы хотите использовать повторно дискретизированные грубые уровни.-ksp_diagonal_scale -ksp_diagonal_scale_fix
. Возможно, измените постановку задачи, чтобы получить более дружественные алгебраические уравнения. Если вы не можете исправить масштабирование, вам может понадобиться прямой решатель.-mat_mffd_type ds
). Попробуйте использовать более высокую точность, чтобы сделать различие более точным./configure --with-precision=__float128 --download-f2cblaslapack
. Проверьте, сходится ли он в «более простых» режимах параметров.-ksp_gmres_modifiedgramschmidt
или используйте метод, который ортогонализирует по-разному, например-ksp_type gcr
.источник
Мой совет студентам - попробовать прямой решатель в этих случаях. Причина состоит в том, что существует два класса причин, по которым решатель может не сходиться: (i) матрица неверна или (ii) существует проблема с решателем / предварительным обработчиком. Прямые решатели почти всегда дают то, что вы можете сравнить с ожидаемым решением, поэтому, если ответ прямого решателя выглядит правильным, то вы знаете, что проблема заключается в итерационном решателе / предварительном условии. С другой стороны, если ответ выглядит неверно, проблема заключается в сборке матрицы и правой части.
Я обычно просто использую UMFPACK в качестве прямого решения. Я уверен, что это просто попробовать что-то подобное с PETSC.
источник
-pc_type lu -pc_factor_mat_solver_type umfpack
использовать UMFPACK (или-pc_type cholesky -pc_factor_mat_solver_package cholmod
для проблем с SPD) через PETSc, но учтите, что UMFPACK и CHOLMOD являются последовательными. Для параллельного использования,-pc_factor_mat_solver_package superlu_dist
илиmumps
,pastix
,spooles
.superlu_dist
будет-ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist
. Это правильно?