반복 선형 솔버가 수렴하지 않는 이유는 무엇입니까?


26

KSP ( PETSc 의 선형 솔버 패키지)의 사전 조건부 Krylov 방법을 사용하여 부분 미분 방정식을 불연속 화하고 선형화하는 것과 같은 희소 선형 시스템을 풀 때 무엇이 ​​잘못 될 수 있습니까?

문제점에 어떤 문제가 있는지 판별하기 위해 어떤 단계를 수행해야합니까?

선형 시스템을 성공적이고 효율적으로 해결하기 위해 어떤 변경을 할 수 있습니까?


이 질문이 PETSc의 반복 선형 솔버에 대한 질문 (질문 본문에서 수집 한 것임) 또는 대부분의 소프트웨어에서 반복 선형 솔버의 잠재적 알고리즘 실패에 대한 질문입니까? 불가지론 적 맥락 (제목만을 보면서 수집 한 내용)?
Geoff Oxberry

4
그것은이 petsc태그를. 방법론은 일반적이지만 각 "이것을 시도하십시오"에 "방법"이 포함되어 있지 않은 경우에는 대답이 덜 유용 할 것입니다. 또는 소프트웨어와 무관하게 설명해야 할 경우 "어떻게"가 훨씬 길어야하며 (뷰어에게 오류가 발생하기 쉬워야 함) 누군가가 다른 패키지를 사용하여 이러한 모든 일을 수행하는 방법을 설명하고 싶다면 행복하게 소프트웨어에 구애받지 않고 PETSc에서해야 할 일을 설명하도록 내 대답을 변경합니다. 참고 :이 기능은 FAQ의 개선 된 버전이므로이 사이트에 사람들을 추가 할 수 있습니다.
Jed Brown

답변:


26

초기 조언

  • -ksp_converged_reason -ksp_monitor_true_residual왜 메소드가 수렴하지 않는지 배우려고 할 때 항상 실행하십시오 .
  • 장애를 설명하기 위해 문제 크기와 프로세스 수를 가능한 작게 만드십시오. 분석법이 고장 나고 처리 시간이 단축되는 동작을 나타내는 작은 문제를 파악하여 통찰력을 얻는 경우가 많습니다. 또한 소규모 시스템에만 사용할 수있는 몇 가지 조사 기술이 있습니다.
  • 많은 시간 단계, 연속 단계 또는 비선형 해결 단계 후에 만 ​​문제가 발생하는 경우 신속하게 실험 할 수 있도록 실패가 발생할 때 모델 상태를 기록해보십시오.
  • 또는 특히 소프트웨어에 검사 점 기능이없는 경우 -ksp_view_binary또는 MatView()선형 시스템을 사용하여 저장 한 다음 코드를 사용 $PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.c하여 행렬을 읽고 해결하십시오 (다른 프로세스 수로 가능). 여기에는 조립 된 매트릭스가 필요하므로 유용성이 다소 제한 될 수 있습니다.
  • 가능한 솔버 선택 사항이 많이 있습니다 (예 : 임의의 수의 구성 레벨로 인해 PETSc의 명령 행에서 사용 가능한 무한 수) . 선형 솔버 선택에 대한 일반적인 조언 은 이 질문 을 참조하십시오 .

KSP가 수렴하지 않는 일반적인 이유

  • 방정식은 우연히 특이합니다 (예 : 경계 조건을 부과하는 것을 잊었습니다). 를 사용하여 작은 문제가 있는지 확인하십시오 -pc_type svd -pc_svd_monitor. 또한 -pc_type lu(예를 들어 타사 패키지를 통해 병렬로 -pc_type lu -pc_factor_mat_solver_package superlu_dist) 직접 솔버를 사용해보십시오 .
  • 방정식은 의도적으로 단수 (예 : 상수 null 공간)이지만 Krylov 방법은 알려지지 않았습니다 KSPSetNullSpace().
  • 방정식은 의도적으로 단수이고 KSPSetNullSpace()사용되었지만 오른쪽은 일치하지 않습니다. 전화 MatNullSpaceRemove()하기 전에 오른쪽 에서 전화해야 할 수도 있습니다 KSPSolve().
  • 방정식은 무한하므로 표준 전제 조건이 작동하지 않습니다. 일반적으로 물리학에서이를 알지만, -ksp_compute_eigenvalues로 확인할 수 있습니다 -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) 구현 방법에 대한 조언이 필요한지 문의하십시오 . 예를 들어, 고주파 Helmholtz에 대해서는 이 질문 을 참조하십시오 . 적당한 문제 크기는 직접 솔버를 사용하여 살 수 있는지 확인하십시오.
  • 이 방법이 사전 조정 된 잔차로 수렴하지만 실제 잔차가 아닌 경우, 사전 조정기는 단일 또는 거의 같습니다. 이는 안 장점 문제 (예 : 비압축성 흐름) 또는 강하게 비대칭적인 연산자 (예 : 시간 단계가 긴 저 마이크로 쌍곡선 문제)에 일반적입니다.
  • 전제 조건이 너무 약하거나 불안정합니다. -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. "더 쉬운"매개 변수 체제로 수렴되는지 확인하십시오.
  • 비대칭 문제에 대칭 방법이 사용되고 있습니다.
  • Classical Gram-Schmidt가 불안정 해지고 있습니다. -ksp_gmres_modifiedgramschmidt예를 들어, 다르게 직교하는 방법을 사용하십시오 -ksp_type gcr.

16

학생들에게 저의 조언은이 경우 직접 해결사를 시험해 보는 것입니다. 그 이유는 솔버가 수렴하지 않는 두 가지 이유가 있습니다. (i) 행렬이 잘못되었거나 (ii) 솔버 / 전제 조건에 문제가 있습니다. 직접 솔버는 거의 항상 예상 솔루션과 비교할 수있는 결과를 산출하므로 직접 솔버의 대답이 올 바르면 반복 솔버 / 전제 조건에 문제가 있음을 알 수 있습니다. 반면에 답이 틀리면 문제는 매트릭스와 오른쪽을 조립하는 것입니다.

나는 보통 UMFPACK을 직접 솔버로 사용합니다. PETSC와 비슷한 것을 시도하는 것이 간단하다고 확신합니다.


5
-pc_type lu -pc_factor_mat_solver_type umfpackPETSc를 -pc_type cholesky -pc_factor_mat_solver_package cholmod통해 UMFPACK (또는 SPD 문제)을 사용하지만 UMFPACK 및 CHOLMOD는 직렬입니다. 병렬의 경우 -pc_factor_mat_solver_package superlu_dist또는mumps , pastix, spooles.
Jed Brown

2
명확히하기 위해 (예)를 사용하기위한 완전한 옵션 세트 superlu_dist는입니다 -ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist. 맞습니까?
레온 에이버리

모르겠어요 이 작업을 수행하면 어떻게됩니까?
Wolfgang Bangerth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.