From 55cbd835c9d19230a0004e41c7fb44be79035349 Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Thu, 6 Jul 2023 18:08:02 +0200 Subject: [PATCH 1/2] =?UTF-8?q?[arcane,aleph]=20Dans=20le=20backend=20'PET?= =?UTF-8?q?Sc',=20utilise=20'BlockJacobi'=20comme=20pr=C3=A9conditionneur?= =?UTF-8?q?=20au=20lieu=20de=20'ILU'=20et=20'IC'.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 'ILU' et 'IC' ne sont pas supportés par PETSc en parallèle. --- arcane/src/arcane/aleph/petsc/AlephPETSc.cc | 45 +++++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/arcane/src/arcane/aleph/petsc/AlephPETSc.cc b/arcane/src/arcane/aleph/petsc/AlephPETSc.cc index 304bff9f2..49c3303a6 100644 --- a/arcane/src/arcane/aleph/petsc/AlephPETSc.cc +++ b/arcane/src/arcane/aleph/petsc/AlephPETSc.cc @@ -37,6 +37,20 @@ namespace Arcane { +namespace +{ + +inline void +petscCheck(PetscErrorCode error_code) +{ + if (error_code==PETSC_SUCCESS) + return; + PetscCallVoid(error_code); + ARCANE_FATAL("Error in PETSc backend errcode={0}",error_code); +} + +} + /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ @@ -214,7 +228,7 @@ _checkInitPETSc() debug() << Trace::Color::cyan() << "[AlephTopologyPETSc] Initializing PETSc. UseArg=" << has_args; if (has_args){ const CommandLineArguments& args = init_args.commandLineArguments(); - PetscInitialize(args.commandLineArgc(),args.commandLineArgv(),PETSC_NULL,PETSC_NULL); + PetscInitialize(args.commandLineArgc(),args.commandLineArgv(),nullptr,nullptr); } else{ PetscInitializeNoArguments(); @@ -364,10 +378,10 @@ AlephMatrixCreate(void) m_kernel->topology()->nb_row_size(), // M = number of global rows m_kernel->topology()->nb_row_size(), // N = number of global columns 0, // ignored (number of nonzeros per row in DIAGONAL portion of local submatrix) - // array containing the number of nonzeros in the various rows of the DIAGONAL portion of local submatrix + // array containing the number of nonzeros in the various rows of the DIAGONAL portion of local submatrix m_kernel->topology()->gathered_nb_row_elements().subView(ilower,size).unguardedBasePointer(), 0, // ignored (number of nonzeros per row in the OFF-DIAGONAL portion of local submatrix) - // array containing the number of nonzeros in the various rows of the OFF-DIAGONAL portion of local submatrix + // array containing the number of nonzeros in the various rows of the OFF-DIAGONAL portion of local submatrix m_kernel->topology()->gathered_nb_row_elements().subView(ilower,size).unguardedBasePointer(), &m_petsc_matrix); MatSetOption(m_petsc_matrix, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_FALSE); @@ -470,6 +484,7 @@ AlephMatrixSolve(AlephVector* x,AlephVector* b,AlephVector* t, ARCANE_CHECK_POINTER(x_petsc); ARCANE_CHECK_POINTER(b_petsc); + const bool is_parallel = m_kernel->subParallelMng(m_index)->isParallel(); Vec solution = x_petsc->m_petsc_vector; Vec RHS = b_petsc->m_petsc_vector; @@ -496,14 +511,27 @@ AlephMatrixSolve(AlephVector* x,AlephVector* b,AlephVector* t, } KSPGetPC(m_ksp_solver,&prec); + switch(solver_param->precond()){ case TypesSolver::NONE : PCSetType(prec,PCNONE); break; // Jacobi (i.e. diagonal scaling preconditioning) case TypesSolver::DIAGONAL : PCSetType(prec,PCJACOBI); break; // Incomplete factorization preconditioners. - case TypesSolver::ILU : PCSetType(prec,PCILU); break; + case TypesSolver::ILU: + // ILU ne fonctionne pas en parallèle avec PETSc (sauf si compilé avec Hypre) + if (is_parallel) + PCSetType(prec,PCBJACOBI); + else + PCSetType(prec,PCILU); + break; // Incomplete Cholesky factorization preconditioners. - case TypesSolver::IC : PCSetType(prec,PCICC); break; + case TypesSolver::IC: + // IC ne fonctionne pas en parallèle avec PETSc. + if (is_parallel) + PCSetType(prec,PCBJACOBI); + else + PCSetType(prec,PCICC); + break; // Sparse Approximate Inverse method of Grote and Barnard as a preconditioner (SIAM J. Sci. Comput.; vol 18, nr 3) case TypesSolver::SPAIstat : PCSetType(prec,PCSPAI); break; // Use multigrid preconditioning. @@ -569,13 +597,14 @@ AlephMatrixSolve(AlephVector* x,AlephVector* b,AlephVector* t, KSPGetType(m_ksp_solver,&kt); PCType pt; PCGetType(prec,&pt); - debug()<<"[AlephMatrixSolve] Will use KSP type :" << kt << " PC type : "<< pt ; + info(4) << "[AlephMatrixSolve] Will use KSP type :" << kt << " PC type : "<< pt + << " is_parallel=" << is_parallel; // solve the linear system // debug()<<"[AlephMatrixSolve] All set up, now solving"; - KSPSolve(m_ksp_solver,RHS,solution); + petscCheck(KSPSolve(m_ksp_solver,RHS,solution)); debug()<<"[AlephMatrixSolve] solved"; - KSPGetConvergedReason(m_ksp_solver,&reason); + petscCheck(KSPGetConvergedReason(m_ksp_solver,&reason)); switch(reason){ #if !PETSC_VERSION_(3,0,0) From c8fdff6e35d985d805b33cadeb334f82f4231bcd Mon Sep 17 00:00:00 2001 From: Gilles Grospellier Date: Thu, 6 Jul 2023 21:09:08 +0200 Subject: [PATCH 2/2] =?UTF-8?q?[arcane,aleph]=20Corrige=20compilation=20av?= =?UTF-8?q?ec=20les=20versions=20de=20PETSc=20ant=C3=A9rieures=20=C3=A0=20?= =?UTF-8?q?la=203.18.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arcane/src/arcane/aleph/petsc/AlephPETSc.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arcane/src/arcane/aleph/petsc/AlephPETSc.cc b/arcane/src/arcane/aleph/petsc/AlephPETSc.cc index 49c3303a6..48c828af1 100644 --- a/arcane/src/arcane/aleph/petsc/AlephPETSc.cc +++ b/arcane/src/arcane/aleph/petsc/AlephPETSc.cc @@ -43,10 +43,18 @@ namespace inline void petscCheck(PetscErrorCode error_code) { + // Note GG: Je ne sais pas vraiment à partir de quelle version de PETSc + // la valeur 'PETSC_SUCCESS' la fonction 'PetscCallVoid' sont + // disponibles mais elles le sont dans la 3.18.0. +#if PETSC_VERSION_GE(3,18,0) if (error_code==PETSC_SUCCESS) return; PetscCallVoid(error_code); ARCANE_FATAL("Error in PETSc backend errcode={0}",error_code); +#else + if (error_code!=0) + ARCANE_FATAL("Error in PETSc backend errcode={0}",error_code); +#endif } }