Perché il mio risolutore lineare iterativo non converge?


26

Cosa può andare storto quando si usano i metodi di Krylov precondizionati di KSP (il pacchetto di risolutore lineare di PETSc ) per risolvere un sistema lineare sparso come quelli ottenuti discretizzando e linearizzando equazioni differenziali parziali?

Quali passi posso prendere per determinare cosa non va nel mio problema?

Quali modifiche posso apportare per risolvere con successo ed efficienza il mio sistema lineare?


Intendi che questa domanda sia una domanda sui solutori lineari iterativi specificamente in PETSc (che è quello che avrei raccolto dal testo del corpo della domanda) o che sia una domanda sui potenziali fallimenti algoritmici dei solutori lineari iterativi in ​​un software principalmente- contesto agnostico (qual è quello che avrei raccolto guardando solo il titolo)?
Geoff Oxberry,

4
Ha il petsctag. La metodologia è generale, ma penso che la risposta sarebbe meno utile se ogni "prova questo" non includesse anche il "come". In alternativa, il "come" dovrebbe essere molto più lungo (e più soggetto a errori per lo spettatore) se dovesse essere spiegato in modo indipendente dal software. Se qualcuno vuole spiegare come fare tutte queste cose usando un pacchetto diverso, renderò felicemente la domanda indipendente dal software e cambierò la mia risposta per affermare che descrive cosa fare in PETSc. Nota: ho aggiunto questo, che è una versione avanzata di una FAQ, quindi mi piacerebbe che le persone a questo sito.
Jed Brown,

Risposte:


26

Consiglio iniziale

  • Corri sempre con -ksp_converged_reason -ksp_monitor_true_residualquando cerchi di capire perché un metodo non converge.
  • Ridurre al minimo le dimensioni del problema e il numero di processi per dimostrare l'errore. Spesso si ottengono informazioni determinando quali piccoli problemi mostrano il comportamento che sta causando il fallimento del metodo e la riduzione dei tempi di risposta. Inoltre, ci sono alcune tecniche di indagine che possono essere utilizzate solo per piccoli sistemi.
  • Se il problema si verifica solo dopo un numero elevato di passaggi temporali, passaggi di continuazione o passaggi di risoluzione non lineari, considerare la possibilità di scrivere lo stato del modello quando si verifica un errore in modo da poter sperimentare rapidamente.
  • In alternativa, specialmente se il tuo software non ha capacità di checkpoint, usa -ksp_view_binaryo MatView()per salvare il sistema lineare, quindi usa il codice at $PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.cper leggere nella matrice e risolverlo (possibilmente con un diverso numero di processi). Ciò richiede una matrice assemblata, quindi l'utilità può essere alquanto limitata.
  • Esistono molte possibili scelte del solutore (ad esempio un numero infinito disponibile nella riga di comando in PETSc a causa di un numero arbitrario di livelli di composizione), vedere questa domanda per consigli generali sulla scelta dei solutori lineari.

Motivi comuni per cui KSP non converge

  • Le equazioni sono singolari per caso (ad es. Dimenticato di imporre condizioni al contorno). Controlla questo per un piccolo problema con -pc_type svd -pc_svd_monitor. Prova anche un risolutore diretto con -pc_type lu(tramite un pacchetto di terze parti in parallelo, ad es -pc_type lu -pc_factor_mat_solver_package superlu_dist.).
  • Le equazioni sono intenzionalmente singolari (ad esempio spazio nullo costante), ma il metodo di Krylov non è stato informato, vedi KSPSetNullSpace().
  • Le equazioni sono volutamente singolari ed è KSPSetNullSpace()stata utilizzata, ma il lato destro non è coerente. Potrebbe essere necessario chiamare MatNullSpaceRemove()sul lato destro prima di chiamare KSPSolve().
  • Le equazioni sono indefinite in modo che i precondizionatori standard non funzionino. Di solito lo saprai dalla fisica, ma puoi controllare con -ksp_compute_eigenvalues -ksp_gmres_restart 1000 -pc_type none. Per semplici problemi relativi al punto di sella, provare -pc_type fieldsplit -pc_fieldsplit_type schur -pc_fieldsplit_detect_saddle_point. Consultare il Manuale dell'utente e la pagina man PCFIELDSPLIT per maggiori dettagli. Per problemi più difficili, leggi la letteratura per trovare metodi affidabili e chiedi qui (o petsc-users@mcs.anl.govo petsc-maint@mcs.anl.gov) se vuoi consigli su come implementarli. Ad esempio, vedi questa domanda per Helmholtz ad alta frequenza. Per dimensioni di problemi modeste, vedi se riesci a convivere solo usando un risolutore diretto.
  • Se il metodo converge in residuo precondizionato, ma non in residuo reale, il precondizionatore è probabilmente singolare o quasi. Ciò è comune per problemi del punto di sella (ad es. Flusso incomprimibile) o operatori fortemente non simmetrici (ad es. Problemi iperbolici a basso Mach con grandi intervalli di tempo).
  • Il precondizionatore è troppo debole o instabile. Vedi se -pc_type asm -sub_pc_type lumigliora il tasso di convergenza. Se GMRES sta perdendo troppi progressi nel riavvio, vedere se i riavvii più lunghi aiutano -ksp_gmres_restart 300. Se è disponibile una trasposizione, provare -ksp_type bcgso altri metodi che non richiedono un riavvio. (Si noti che la convergenza con questi metodi è spesso irregolare.)
  • La matrice di precondizionamento potrebbe non essere vicina all'operatore (eventualmente non assemblato). Prova a risolvere con un risolutore diretto, in seriale con -pc_type luo in parallelo usando un pacchetto di terze parti (ad esempio -pc_type lu -pc_factor_mat_solver_package superlu_dist, o mumps). Il metodo dovrebbe convergere in una iterazione se le matrici sono uguali e in un numero "piccolo" di iterazioni in caso contrario. Prova -snes_type testa controllare le matrici se risolvi un problema non lineare.
  • Il precondizionatore non è lineare (ad es. Una soluzione iterativa nidificata), provare -ksp_type fgmres or -ksp_type gcr.
  • Stai utilizzando il multigrid geometrico, ma alcune equazioni (spesso condizioni al contorno) non sono ridimensionate in modo compatibile tra i livelli. Prova -pc_mg_galerkina costruire algebricamente un operatore grossolano correttamente ridimensionato o assicurati che tutte le equazioni siano ridimensionate allo stesso modo se desideri utilizzare livelli grossolani ridiscritti.
  • La matrice è molto mal condizionata. Controllare il numero della condizione utilizzando i metodi descritti qui . Prova a migliorarlo scegliendo il relativo ridimensionamento dei componenti / condizioni al contorno. Prova -ksp_diagonal_scale -ksp_diagonal_scale_fix. Forse cambi la formulazione del problema per produrre equazioni algebriche più amichevoli. Se non è possibile correggere il ridimensionamento, potrebbe essere necessario utilizzare un risolutore diretto.
  • La matrice non è lineare (ad es. Valutata usando la differenziazione finita di una funzione non lineare). Prova diversi parametri di differenziazione (ad es -mat_mffd_type ds.). Provare a utilizzare una maggiore precisione per rendere la differenziazione più accurata, ./configure --with-precision=__float128 --download-f2cblaslapack. Controlla se converge in regimi di parametri "più facili".
  • Un metodo simmetrico viene utilizzato per un problema non simmetrico.
  • Il classico Gram-Schmidt sta diventando instabile, prova -ksp_gmres_modifiedgramschmidto usa un metodo che ortogonalizza in modo diverso, ad es -ksp_type gcr.

16

Il mio consiglio agli studenti è di provare un risolutore diretto in questi casi. Il motivo è che ci sono due classi di ragioni per cui un risolutore potrebbe non convergere: (i) la matrice è sbagliata o (ii) c'è un problema con il risolutore / precondizionatore. I risolutori diretti danno quasi sempre qualcosa che puoi confrontare con la soluzione che ti aspetti, quindi se la risposta del risolutore diretto sembra corretta, allora sai che il problema è con il risolutore / precondizione iterativo. D'altra parte, se la risposta sembra errata, il problema è con l'assemblaggio della matrice e del lato destro.

In genere utilizzo UMFPACK come risolutore diretto. Sono sicuro che è semplice provare qualcosa di simile con PETSC.


5
-pc_type lu -pc_factor_mat_solver_type umfpackutilizzare UMFPACK (o -pc_type cholesky -pc_factor_mat_solver_package cholmodper problemi SPD) tramite PETSc, ma si noti che UMFPACK e CHOLMOD sono seriali. Per parallelo, uso -pc_factor_mat_solver_package superlu_disto mumps, pastix, spooles.
Jed Brown,

2
Giusto per essere chiari, l'opzione completa impostata per l'utilizzo (ad es.) superlu_distSarebbe -ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist. È giusto?
Leon Avery,

Non lo so. Cosa succede se lo fai?
Wolfgang Bangerth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.