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?
petsc
tag. 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.Jawaban:
Saran awal
-ksp_converged_reason -ksp_monitor_true_residual
ketika mencoba mempelajari mengapa metode tidak konvergen.-ksp_view_binary
atauMatView()
untuk menyimpan sistem linier, maka gunakan kode di$PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.c
untuk membaca dalam matriks dan selesaikan (mungkin dengan sejumlah proses yang berbeda). Ini membutuhkan matriks rakitan, jadi kegunaannya bisa agak terbatas.Alasan umum untuk KSP tidak konvergen
-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
).KSPSetNullSpace()
.KSPSetNullSpace()
digunakan, tetapi sisi kanan tidak konsisten. Anda mungkin harus meneleponMatNullSpaceRemove()
di sebelah kanan sebelum meneleponKSPSolve()
.-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.-pc_type asm -sub_pc_type lu
meningkatkan 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 bcgs
atau metode lain yang tidak memerlukan restart. (Perhatikan bahwa konvergensi dengan metode ini sering tidak menentu.)-pc_type lu
atau secara paralel menggunakan paket pihak ketiga (mis.-pc_type lu -pc_factor_mat_solver_package superlu_dist
, Ataumumps
). Metode harus konvergen dalam satu iterasi jika matriksnya sama, dan dalam sejumlah kecil "iterasi sebaliknya. Cobalah-snes_type test
untuk memeriksa matriks jika menyelesaikan masalah nonlinier.-ksp_type fgmres or -ksp_type gcr
.-pc_mg_galerkin
untuk 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.-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.-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".-ksp_gmres_modifiedgramschmidt
atau gunakan metode yang ortogonisasi secara berbeda, misalnya-ksp_type gcr
.sumber
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.
sumber
-pc_type lu -pc_factor_mat_solver_type umfpack
untuk menggunakan UMFPACK (atau-pc_type cholesky -pc_factor_mat_solver_package cholmod
untuk masalah SPD) melalui PETSc, tetapi perhatikan bahwa UMFPACK dan CHOLMOD bersifat serial. Untuk paralel, penggunaan-pc_factor_mat_solver_package superlu_dist
ataumumps
,pastix
,spooles
.superlu_dist
adalah-ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist
. Apakah itu benar?