反復線形ソルバーが収束しないのはなぜですか?


26

KSPPETScの線形ソルバーパッケージ)から事前に条件付けされたKrylovメソッドを使用して、偏微分方程式の離散化と線形化によって得られるようなスパース線形システムを解くと、何が問題になる可能性がありますか?

私の問題で何が問題になっているのかを判断するには、どのような手順を踏めばよいですか?

線形システムを正常かつ効率的に解決するために、どのような変更を加えることができますか?


この質問は、特にPETScの反復線形ソルバーに関する質問(質問本文から私が集めたものです)ですか、それともほとんどソフトウェアの反復線形ソルバーの潜在的なアルゴリズムの失敗に関する質問ですか?不可知論的文脈(これは、見出しだけを見ることから集めたものです)?
ジェフオックスベリー

4
それは持っているpetscタグを。方法論は一般的ですが、「これを試す」それぞれに「方法」も含まれていなければ、答えはあまり役に立たないと思います。あるいは、ソフトウェアに依存しない方法で説明する必要がある場合、「方法」ははるかに長くする必要があります(そして、視聴者にとってよりエラーが発生しやすくなります)。誰かが別のパッケージを使用してこれらすべてを行う方法を説明したい場合は、喜んでソフトウェアに依存しない質問を作成し、PETScで何をすべきかを説明するように私の答えを変更します。注:これを追加しました。これはFAQの拡張バージョンであるため、このサイトの人々を気に入っていただけます。
ジェッドブラウン

回答:


26

最初のアドバイス

  • -ksp_converged_reason -ksp_monitor_true_residualメソッドが収束しない理由を学習しようとするときは常にwithを実行します。
  • 障害を実証するために、問題のサイズとプロセスの数をできるだけ小さくします。多くの場合、メソッドが故障する原因となる動作を示す小さな問題を特定することで洞察を得て、所要時間を短縮します。さらに、小規模なシステムでのみ使用できる調査手法がいくつかあります。
  • 多数のタイムステップ、継続ステップ、または非線形解析ステップの後にのみ問題が発生する場合、迅速に実験できるように、障害が発生したときにモデルの状態を書き出すことを検討してください。
  • あるいは、特にソフトウェアにチェックポイント機能がない場合、線形システムを使用-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
  • 方程式は意図的に特異(例:一定のヌル空間)ですが、クリロフ法は知らされていません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)に問い合わせてください。たとえば、高周波数ヘルムホルツについてはこの質問をご覧ください。控えめな問題のサイズについては、直接ソルバーを使用するだけで生きることができるかどうかを確認してください。
  • メソッドが事前条件付き残差に収束するが、真の残差に収束しない場合、前提条件子は特異またはほぼそうです。これは、addle点の問題(非圧縮性の流れなど)や強く非対称な演算子(大きなタイムステップのある低マッハ双曲線問題など)によく見られます。
  • 前提条件が弱すぎるか、不安定です。-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)を使用して、シリアルソルバーまたはパラレルソルバーで直接ソルバーで解いてみてください。この方法は、行列が同じ場合は1回の反復で収束し、そうでない場合は「少数」の反復で収束する必要があります。-snes_type test非線形問題を解く場合は、行列を確認してください。
  • 前提条件は非線形です(たとえば、入れ子になった反復解法)、try -ksp_type fgmres or -ksp_type gcr
  • ジオメトリックマルチグリッドを使用していますが、一部の方程式(多くの場合、境界条件)はレベル間で互換性がありません。試してみてください-pc_mg_galerkin代数的に正しくスケール粗オペレータを構築したり、rediscretized粗いレベルを使用する場合は、すべての方程式が同じようにスケーリングされていることを確認します。
  • 行列は非常に悪条件です。ここで説明する方法を使用して、条件番号を確認します。コンポーネント/境界条件の相対的なスケーリングを選択して、改善を試みてください。試してみてください-ksp_diagonal_scale -ksp_diagonal_scale_fix。おそらく、問題の定式化を変更して、より友好的な代数方程式を作成します。スケーリングを修正できない場合は、直接ソルバーを使用する必要があります。
  • 行列は非線形です(たとえば、非線形関数の有限差分を使用して評価されます)。異なる差分パラメータを試してください(例-mat_mffd_type ds)。差分をより正確にするために、より高い精度を使用してみてください./configure --with-precision=__float128 --download-f2cblaslapack。「より簡単な」パラメータレジームで収束するかどうかを確認します。
  • 対称法は、非対称問題に使用されています。
  • 古典グラムシュミットが不安定になってきて、試す-ksp_gmres_modifiedgramschmidtか、例えば、異なる直交化法を使用-ksp_type gcr

16

学生への私のアドバイスは、これらの場合に直接ソルバーを試すことです。その理由は、ソルバーが収束しない理由には2つのクラスがあることです。(i)マトリックスが間違っているか、(ii)ソルバー/前提条件に問題があります。直接ソルバーは、ほとんどの場合、期待するソリューションと比較できるものを生成するため、直接ソルバーの答えが正しいように見える場合、問題は反復ソルバー/前提条件にあることがわかります。一方、答えが間違っているようであれば、問題はマトリックスと右側を組み立てることにあります。

通常、UMFPACKを直接ソルバーとして使用します。PETSCで似たようなことを試すのは簡単だと確信しています。


5
-pc_type lu -pc_factor_mat_solver_type umfpack-pc_type cholesky -pc_factor_mat_solver_package cholmodPETScを介してUMFPACK(またはSPDの問題)を使用しますが、UMFPACKとCHOLMODはシリアルであることに注意してください。並列の-pc_factor_mat_solver_package superlu_dist場合mumpspastix、または、、を使用しますspooles
ジェッドブラウン

2
明確にするために、(たとえば)を使用するための完全なオプションセットsuperlu_distはになります-ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist。そうですか?
レオンエイブリー

知りません。これを行うとどうなりますか?
ヴォルフガングバンガース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.