solverpre
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| solverpre [2018/05/11 20:26] – admin | solverpre [2021/03/22 20:07] (current) – jeferson | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== ATUALIZAÇÃO - 22/03/2021 ====== | ||
| + | |||
| + | Nos testes realizados mais recentemente, | ||
| + | |||
| + | Observações: | ||
| + | |||
| + | Pré-condicionador: | ||
| + | |||
| + | Solver: Tanto o GMRES quanto suas variantes (FGMRES, DGMRES etc) não pareceram apresentar muita diferença na convergência. O método BiCGSTAB também funcionou bem, inclusive sendo um pouco mais rápido do que o GMRES. | ||
| + | |||
| + | SNES: O problema foi resolvido dentro do paradigma SNES do PETSc, bastante recomendado pois, embora aumente levemente o tempo de processamento devido à integração separada da matriz jacobiana e do vetor RHS, proporciona uma convergência muito maior do que o Newton-Raphson puro (especialmente para o campo de pressão). | ||
| + | |||
| Problema: -Hélice 2D | Problema: -Hélice 2D | ||
| - | SetUp 1: GMRES+PCASM | + | ===== SetUp 1: GMRES+PCASM |
| <code cpp> | <code cpp> | ||
| Line 14: | Line 26: | ||
| </ | </ | ||
| - | Não converge. Aumentando para 5000 interações | + | Não converge |
| + | |||
| + | Aumentando para 5000 iterações | ||
| + | |||
| + | Mantendo 5000 iterações e aumentando para 50 GMRES o erro do solver linear diminui um pouco mas o não linear não converge bem, mas se ajusta com o passar do tempo. | ||
| + | |||
| + | Mantendo 5000 iterações e aumentando para 500 GMRES o erro do solver linear diminui mas a convergencia ainda é ruim, devendo se acertar com o processo dinâmico, eu espero. | ||
| + | |||
| + | ===== - SetUp 2: DGMRES + PCNONE ===== | ||
| + | |||
| + | Para o problema da hélice 2d resolvendo pelo método Arlequin o solver DGMRES sem precondicionamento ficou excelente. Converge em cerca de 30 a 90 iterações (um pouco mais nos primeiros passos de tempo), porém demanda um limite maior de iterações dentro do Newton-Raphson (utilizei em torno de 5). | ||
| + | |||
| + | <code c> | ||
| + | ierr = KSPCreate(PETSC_COMM_WORLD,& | ||
| + | ierr = KSPSetOperators(ksp, | ||
| + | ierr = KSPSetTolerances(ksp, | ||
| + | CHKERRQ(ierr); | ||
| + | ierr = KSPGetPC(ksp,& | ||
| + | ierr = KSPSetType(ksp, | ||
| + | ierr = KSPGMRESSetRestart(ksp, | ||
| + | ierr = KSPSolve(ksp, | ||
| + | </ | ||
| + | |||
| + | ===== - MUMPS: ===== | ||
| + | |||
| + | O [[http:// | ||
| + | |||
| + | <code c> | ||
| + | ierr = KSPCreate(PETSC_COMM_WORLD,& | ||
| + | ierr = KSPSetOperators(ksp, | ||
| + | #if defined(PETSC_HAVE_MUMPS) | ||
| + | ierr = KSPSetType(ksp, | ||
| + | ierr = KSPGetPC(ksp,& | ||
| + | ierr = PCSetType(pc, | ||
| + | #endif | ||
| + | ierr = KSPSetFromOptions(ksp); | ||
| + | ierr = KSPSetUp(ksp); | ||
| + | ierr = KSPSolve(ksp, | ||
| + | </ | ||
| + | |||
| + | No entanto, alguns erros podem acontecer durante a execução do MUMPs. Para monitorálos é importante ler o seu [[http:// | ||
| + | |||
| + | <code c> | ||
| + | ierr = PCFactorSetMatSolverType(pc, | ||
| + | ierr = PCFactorSetUpMatSolverType(pc); | ||
| + | ierr = PCFactorGetMatrix(pc,& | ||
| + | </ | ||
| + | |||
| + | Lembrando que uma nova matriz F deve ser declarada no preâmbulo da função. | ||
| + | |||
| + | Assim, para acessar a flag INFO(1) utiliza-se o seguinte comando: | ||
| + | |||
| + | <code c> | ||
| + | PetscInt info1; | ||
| + | ierr = MatMumpsGetInfo(F, | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | info1); | ||
| + | </ | ||
| + | |||
| + | Se INFO(1) = 0, o problema será realizado sem erros. Para os demais valores de INFO(1), consultar o [[http:// | ||
| + | |||
| + | ==== -Solução de problemas no MUMPS ==== | ||
| + | |||
| + | Em um determinado problema obteve-se, por exemplo, a flag INFO(1) = -9. Segundo o [[http:// | ||
| + | |||
| + | <code c> | ||
| + | #if defined(PETSC_HAVE_MUMPS) | ||
| + | ierr = KSPSetType(ksp, | ||
| + | ierr = KSPGetPC(ksp,& | ||
| + | ierr = PCSetType(pc, | ||
| + | |||
| + | ierr = PCFactorSetMatSolverType(pc, | ||
| + | PCFactorSetUpMatSolverType(pc); | ||
| + | PCFactorGetMatrix(pc,& | ||
| + | |||
| + | PetscInt ival, | ||
| + | icntl = 14; ival = 60; | ||
| + | MatMumpsSetIcntl(F, | ||
| + | #endif | ||
| + | |||
| + | ierr = KSPSetFromOptions(ksp); | ||
| + | ierr = KSPSetUp(ksp); | ||
| + | |||
| + | #if defined(PETSC_HAVE_MUMPS) | ||
| + | PetscInt | ||
| + | |||
| + | MatMumpsGetInfo(F, | ||
| + | MatMumpsGetInfo(F, | ||
| + | MatMumpsGetIcntl(F, | ||
| + | if(rank == 0) std::cout <<" | ||
| + | <<" | ||
| + | #endif | ||
| + | </ | ||
| + | |||
| + | Note que a última parte do código é construída para monitorar os valores de INFO(1), INFO(2) e ICNTL(14). É fortemente recomendado que pelo menos INFO(1) e INFO(2) sejam monitorados a cada chamada do MUMPS para facilitar o diagnóstico de possíveis //bugs// ou erros de execução. | ||
| + | ====== | ||
solverpre.1526070408.txt.gz · Last modified: by admin
