Mengapa pemecah linear berulang saya tidak konvergen?

26

Apa yang bisa salah ketika menggunakan metode Krylov yang dikondisikan sebelumnya dari KSP ( paket solver linier PETSc ) untuk menyelesaikan sistem linier yang jarang seperti yang diperoleh dengan mengkritisi dan membuat linierisasi persamaan diferensial parsial?

Langkah apa yang bisa saya ambil untuk menentukan apa yang salah untuk masalah saya?

Perubahan apa yang dapat saya buat untuk berhasil dan efisien menyelesaikan sistem linear saya?

Jed Brown
sumber
Apakah Anda ingin pertanyaan ini menjadi pertanyaan tentang pemecah linear berulang khususnya dalam PETSc (yang akan saya kumpulkan dari teks isi pertanyaan), atau untuk menjadi pertanyaan tentang potensi kegagalan algoritmik pemecah linear iteratif dalam sebagian besar perangkat lunak- konteks agnostik (yang akan saya kumpulkan dari melihat headline saja)?
Geoff Oxberry
4
Ini memiliki petsctag. Metodologinya umum, tetapi saya pikir jawabannya akan kurang bermanfaat jika masing-masing "coba ini" tidak juga menyertakan "bagaimana". Atau, "bagaimana" harus lebih lama (dan lebih rentan terhadap penampil) jika perlu dijelaskan dengan cara agnostik perangkat lunak. Jika seseorang ingin menjelaskan bagaimana melakukan semua hal ini menggunakan paket yang berbeda, saya dengan senang hati akan membuat perangkat lunak pertanyaan-agnostik dan mengubah jawaban saya untuk menyatakan bahwa itu menjelaskan apa yang harus dilakukan dalam PETSc. Catatan: Saya menambahkan ini, yang merupakan versi yang ditingkatkan dari FAQ, jadi saya bisa menyukai orang-orang di situs ini.
Jed Brown

Jawaban:

26

Saran awal

  • Selalu jalankan -ksp_converged_reason -ksp_monitor_true_residualketika mencoba mempelajari mengapa metode tidak konvergen.
  • Buat ukuran masalah dan jumlah proses sekecil mungkin untuk menunjukkan kegagalan. Anda sering mendapatkan wawasan dengan menentukan masalah kecil apa yang menunjukkan perilaku yang menyebabkan metode Anda rusak dan waktu pembalikan berkurang. Selain itu, ada beberapa teknik investigasi yang hanya dapat digunakan untuk sistem kecil.
  • Jika masalah hanya muncul setelah sejumlah besar langkah waktu, langkah lanjutan, atau langkah penyelesaian nonlinier, pertimbangkan untuk menuliskan status model saat kegagalan terjadi sehingga Anda dapat melakukan percobaan dengan cepat.
  • Atau, terutama jika perangkat lunak Anda tidak memiliki kapabilitas pos pemeriksaan, gunakan -ksp_view_binaryatau MatView()untuk menyimpan sistem linier, maka gunakan kode di $PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.cuntuk membaca dalam matriks dan selesaikan (mungkin dengan sejumlah proses yang berbeda). Ini membutuhkan matriks rakitan, jadi kegunaannya bisa agak terbatas.
  • Ada banyak pilihan solver yang mungkin (mis. Angka tak terbatas yang tersedia di baris perintah dalam PETSc karena jumlah level komposisi yang berubah-ubah), lihat pertanyaan ini untuk saran umum tentang pemilihan solver linier.

Alasan umum untuk KSP tidak konvergen

  • Persamaannya tunggal karena kebetulan (misal lupa memaksakan syarat batas). Periksa ini untuk masalah kecil menggunakan -pc_type svd -pc_svd_monitor. Coba juga pemecah langsung dengan -pc_type lu(melalui paket pihak ketiga secara paralel, misalnya -pc_type lu -pc_factor_mat_solver_package superlu_dist).
  • Persamaannya sengaja singular (misalnya ruang nol konstan), tetapi metode Krylov tidak diinformasikan, lihat KSPSetNullSpace().
  • Persamaannya sengaja singular dan KSPSetNullSpace()digunakan, tetapi sisi kanan tidak konsisten. Anda mungkin harus menelepon MatNullSpaceRemove()di sebelah kanan sebelum menelepon KSPSolve().
  • Persamaannya tidak pasti sehingga prekondisi standar tidak berfungsi. Biasanya Anda akan mengetahui ini dari fisika, tetapi Anda dapat memeriksanya dengan -ksp_compute_eigenvalues -ksp_gmres_restart 1000 -pc_type none. Untuk masalah sadel sederhana, cobalah -pc_type fieldsplit -pc_fieldsplit_type schur -pc_fieldsplit_detect_saddle_point. Lihat Manual Pengguna dan halaman manual PCFIELDSPLIT untuk lebih jelasnya. Untuk masalah yang lebih sulit, baca literatur untuk menemukan metode yang kuat dan tanyakan di sini (atau [email protected]atau [email protected]) jika Anda ingin saran tentang cara menerapkannya. Sebagai contoh, lihat pertanyaan ini untuk Helmholtz frekuensi tinggi. Untuk ukuran masalah sederhana, lihat apakah Anda dapat hidup dengan hanya menggunakan pemecah langsung.
  • Jika metode menyatu dalam residu prakondisi, tetapi tidak dalam residu sejati, prekondisi kemungkinan tunggal atau hampir sama. Ini umum untuk masalah titik sadel (misalnya aliran yang tidak dapat dimampatkan) atau operator yang sangat tidak simetris (misalnya masalah hiperbolik Mach rendah dengan langkah waktu yang besar).
  • Prekondisi terlalu lemah atau tidak stabil. Lihat apakah -pc_type asm -sub_pc_type lumeningkatkan tingkat konvergensi. Jika GMRES kehilangan terlalu banyak kemajuan dalam memulai ulang, lihat apakah akan lebih lama restart bantuan -ksp_gmres_restart 300. Jika transpos tersedia, coba -ksp_type bcgsatau metode lain yang tidak memerlukan restart. (Perhatikan bahwa konvergensi dengan metode ini sering tidak menentu.)
  • Matriks prekondisi mungkin tidak dekat dengan operator (mungkin belum dirangkai). Coba pecahkan dengan solver langsung, baik secara serial dengan -pc_type luatau secara paralel menggunakan paket pihak ketiga (mis. -pc_type lu -pc_factor_mat_solver_package superlu_dist, Atau mumps). Metode harus konvergen dalam satu iterasi jika matriksnya sama, dan dalam sejumlah kecil "iterasi sebaliknya. Cobalah -snes_type testuntuk memeriksa matriks jika menyelesaikan masalah nonlinier.
  • Prasyarat adalah nonlinier (mis. Penyelesaian berulang bersarang), cobalah -ksp_type fgmres or -ksp_type gcr.
  • Anda menggunakan multigrid geometris, tetapi beberapa persamaan (seringkali kondisi batas) tidak diskalakan secara serasi antar level. Cobalah -pc_mg_galerkinuntuk secara aljabar membangun operator kasar yang diskalakan dengan benar atau pastikan bahwa semua persamaan diskalakan dengan cara yang sama jika Anda ingin menggunakan level kasar yang disinkretkan ulang.
  • Matriks ini sangat buruk. Periksa nomor kondisi menggunakan metode yang dijelaskan di sini . Cobalah untuk memperbaikinya dengan memilih penskalaan relatif komponen / kondisi batas. Coba -ksp_diagonal_scale -ksp_diagonal_scale_fix. Mungkin mengubah rumusan masalah untuk menghasilkan persamaan aljabar yang lebih ramah. Jika Anda tidak dapat memperbaiki penskalaan, Anda mungkin perlu menggunakan pemecah langsung.
  • Matriksnya adalah nonlinier (misalnya dievaluasi menggunakan perbedaan hingga fungsi nonlinier). Coba berbagai parameter pembeda (mis -mat_mffd_type ds.). Coba gunakan presisi yang lebih tinggi untuk membuat perbedaan lebih akurat ./configure --with-precision=__float128 --download-f2cblaslapack,. Periksa apakah konvergen dalam rezim parameter "lebih mudah".
  • Metode simetris digunakan untuk masalah non-simetris.
  • Gram-Schmidt klasik menjadi tidak stabil, coba -ksp_gmres_modifiedgramschmidtatau gunakan metode yang ortogonisasi secara berbeda, misalnya -ksp_type gcr.
Jed Brown
sumber
16

Saran saya kepada siswa adalah untuk mencoba pemecah langsung dalam kasus ini. Alasannya adalah bahwa ada dua kelas alasan mengapa solver mungkin tidak konvergen: (i) matriksnya salah, atau (ii) ada masalah dengan solver / preconditioner. Pemecah langsung hampir selalu menghasilkan sesuatu yang dapat Anda bandingkan dengan solusi yang Anda harapkan, jadi jika jawaban pemecah langsung terlihat benar, maka Anda tahu masalahnya adalah dengan pemecah iteratif / prasyarat. Di sisi lain, jika jawabannya terlihat salah, masalahnya adalah dengan merakit matriks dan sisi kanan.

Saya biasanya hanya menggunakan UMFPACK sebagai pemecah langsung. Saya yakin itu mudah untuk mencoba sesuatu yang mirip dengan PETSC.

Wolfgang Bangerth
sumber
5
-pc_type lu -pc_factor_mat_solver_type umfpackuntuk menggunakan UMFPACK (atau -pc_type cholesky -pc_factor_mat_solver_package cholmoduntuk masalah SPD) melalui PETSc, tetapi perhatikan bahwa UMFPACK dan CHOLMOD bersifat serial. Untuk paralel, penggunaan -pc_factor_mat_solver_package superlu_distatau mumps, pastix, spooles.
Jed Brown
2
Untuk memperjelas, opsi lengkap yang diatur untuk menggunakan (misalnya) superlu_distadalah -ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist. Apakah itu benar?
Leon Avery
Saya tidak tahu Apa yang terjadi jika Anda melakukan ini?
Wolfgang Bangerth