Co może pójść nie tak, gdy zastosuje się wstępne metody Kryłowa z KSP ( pakiet solvera liniowego PETSc ) do rozwiązania rzadkiego układu liniowego, takiego jak te uzyskane przez dyskretyzację i linearyzację równań różniczkowych cząstkowych?
Jakie kroki mogę podjąć, aby ustalić, co jest nie tak z moim problemem?
Jakie zmiany mogę wprowadzić, aby skutecznie i skutecznie rozwiązać mój system liniowy?
petsc
tag. Metodologia jest ogólna, ale myślę, że odpowiedź byłaby mniej przydatna, gdyby każde „spróbuj tego” nie zawierało również „jak”. Alternatywnie „jak” musiałoby być znacznie dłuższe (i bardziej podatne na błędy dla widza), gdyby wymagało to wyjaśnienia w sposób niezależny od oprogramowania. Jeśli ktoś chce wyjaśnić, jak zrobić te wszystkie rzeczy przy użyciu innego pakietu, z przyjemnością zmienię pytanie w oprogramowanie i zmienię odpowiedź na stwierdzenie, że opisuje, co robić w PETSc. Uwaga: dodałem tę, która jest ulepszoną wersją FAQ, więc mogę polubić ludzi na tej stronie.Odpowiedzi:
Wstępna porada
-ksp_converged_reason -ksp_monitor_true_residual
staraj się dowiedzieć, dlaczego metoda nie jest zbieżna.-ksp_view_binary
lubMatView()
zapisz system liniowy, a następnie użyj kodu at,$PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.c
aby odczytać matrycę i rozwiązać ją (być może przy innej liczbie procesów). Wymaga to złożonej matrycy, więc jej użyteczność może być nieco ograniczona.Typowe przyczyny braku konwergencji KSP
-pc_type svd -pc_svd_monitor
. Wypróbuj również bezpośredni solver z-pc_type lu
(za pośrednictwem pakietu innej firmy równolegle, np-pc_type lu -pc_factor_mat_solver_package superlu_dist
.).KSPSetNullSpace()
.KSPSetNullSpace()
zostały użyte, ale prawa strona nie jest spójna. Być może będziesz musiał zadzwonićMatNullSpaceRemove()
po prawej stronie, zanim zadzwoniszKSPSolve()
.-ksp_gmres_restart 1000 -pc_type none
. W przypadku prostych problemów z siodłem spróbuj-pc_type fieldsplit -pc_fieldsplit_type schur -pc_fieldsplit_detect_saddle_point
. Aby uzyskać więcej informacji, zobacz Podręcznik użytkownika i stronę podręcznika PCFIELDSPLIT . W przypadku trudniejszych problemów zapoznaj się z literaturą, aby znaleźć solidne metody i zapytaj tutaj ([email protected]
lub[email protected]
), czy chcesz uzyskać porady dotyczące ich wdrożenia. Na przykład zobacz to pytanie dla wysokiej częstotliwości Helmholtza. W przypadku skromnych rozmiarów problemów sprawdź, czy możesz żyć tylko za pomocą bezpośredniego solvera.-pc_type asm -sub_pc_type lu
poprawia współczynnik konwergencji. Jeśli GMRES traci zbyt duży postęp w ponownym uruchomieniu, sprawdź, czy dłuższe ponowne uruchomienie nie pomaga-ksp_gmres_restart 300
. Jeśli transpozycja jest dostępna, wypróbuj-ksp_type bcgs
inne metody, które nie wymagają ponownego uruchomienia. (Należy zauważyć, że zbieżność z tymi metodami jest często błędna).-pc_type lu
lub równolegle, używając pakietu innej firmy (np.-pc_type lu -pc_factor_mat_solver_package superlu_dist
Lubmumps
). Metoda powinna zbiegać się w jednej iteracji, jeśli macierze są takie same, aw „małej” liczbie iteracji w przeciwnym razie. Spróbuj-snes_type test
sprawdzić macierze, jeśli rozwiązujesz problem nieliniowy.-ksp_type fgmres or -ksp_type gcr
.-pc_mg_galerkin
algebraicznie skonstruować poprawnie wyskalowany operator zgrubny lub upewnij się, że wszystkie równania są skalowane w ten sam sposób, jeśli chcesz użyć ponownie zdyskretowanych poziomów zgrubnych.-ksp_diagonal_scale -ksp_diagonal_scale_fix
. Być może zmień sformułowanie problemu, aby uzyskać bardziej przyjazne równania algebraiczne. Jeśli nie możesz poprawić skalowania, może być konieczne użycie bezpośredniego solvera.-mat_mffd_type ds
.). Spróbuj użyć większą precyzję, aby różnicowanie dokładniejsze./configure --with-precision=__float128 --download-f2cblaslapack
. Sprawdź, czy zbiega się w „łatwiejszych” systemach parametrów.-ksp_gmres_modifiedgramschmidt
lub zastosuj metodę, która inaczej ortogonalizuje, np-ksp_type gcr
.źródło
Moja rada dla studentów polega na wypróbowaniu bezpośredniego rozwiązania w takich przypadkach. Powodem jest to, że istnieją dwie klasy powodów, dla których solver może się nie zbiegać: (i) matryca jest niepoprawna lub (ii) występuje problem z solverem / warunkiem wstępnym. Bezpośrednie solwery prawie zawsze dają coś, co można porównać z oczekiwanym rozwiązaniem, więc jeśli odpowiedź bezpośredniego solwera wygląda poprawnie, oznacza to, że problem dotyczy iteracyjnego solvera / warunku wstępnego. Z drugiej strony, jeśli odpowiedź wydaje się błędna, problem polega na złożeniu matrycy i prawej stronie.
Zwykle używam UMFPACK jako bezpośredniego solvera. Jestem pewien, że łatwo wypróbować coś podobnego z PETSC.
źródło
-pc_type lu -pc_factor_mat_solver_type umfpack
używać UMFPACK (lub w-pc_type cholesky -pc_factor_mat_solver_package cholmod
przypadku problemów z SPD) za pośrednictwem PETSc, ale pamiętaj, że UMFPACK i CHOLMOD są szeregowe. Dla równoległej stosowania-pc_factor_mat_solver_package superlu_dist
lubmumps
,pastix
,spooles
.superlu_dist
Byłby-ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist
. Czy to prawda?