diff --git a/src/petsc4Foam/solvers/petscSolver.C b/src/petsc4Foam/solvers/petscSolver.C index e0803841658d18a31975849073cd32e5ca1ec77e..624c4d830c91d3bdc3bf8935be40b92b611ad053 100644 --- a/src/petsc4Foam/solvers/petscSolver.C +++ b/src/petsc4Foam/solvers/petscSolver.C @@ -129,6 +129,7 @@ Foam::solverPerformance Foam::petscSolver::solve petscDict_.getOrDefault("verbose", false) ); + // set all petsc flags in the prefix db dictionary petscDictOptions = petscDict_.subOrEmptyDict("options"); PetscUtils::setFlags ( @@ -290,18 +291,6 @@ void Foam::petscSolver::buildKsp petscDict_.getOrDefault("verbose", false) ); - // Solver name from petsc dictionary - word solverName; - petscDict_.readIfPresent("solver", solverName); - - // Preconditioner name from petsc dictionary, or from parent - word precondName; - petscDict_.readIfPresent("preconditioner", precondName); - - // Sub-preconditioner name from petsc dictionary - word subPrecondName; - petscDict_.readIfPresent("sub_preconditioner", subPrecondName); - // Create parallel solver context KSPCreate(PETSC_COMM_WORLD, &ksp); @@ -315,52 +304,6 @@ void Foam::petscSolver::buildKsp PC pc; KSPGetPC(ksp, &pc); - if (!precondName.empty()) - { - PCSetType(pc, precondName.c_str()); - } - - if (!subPrecondName.empty()) - { - PetscUtils::setFlag - ( - prefix_ + "sub_pc_type_", - subPrecondName, - verbose - ); - PetscUtils::setFlags - ( - prefix_ + "sub_pc_" + subPrecondName + "_", - petscDict_.subOrEmptyDict(subPrecondName + "Coeffs"), - verbose - ); - PetscUtils::setFlags - ( - prefix_ + "sub_pc_factor_" , - petscDict_.subOrEmptyDict("factorCoeffs"), - verbose - ); - } - - PetscUtils::setFlags - ( - prefix_ + "pc_" + precondName + "_", - petscDict_.subOrEmptyDict(precondName + "Coeffs"), - verbose - ); - - // Set the linear solver - if (!solverName.empty()) - { - KSPSetType(ksp, solverName.c_str()); - } - PetscUtils::setFlags - ( - prefix_ + "ksp_" + solverName + "_", - petscDict_.subOrEmptyDict(solverName + "Coeffs"), - verbose - ); - // OpenFOAM relative tolerance -> tolerance_ KSPSetTolerances ( @@ -371,15 +314,19 @@ void Foam::petscSolver::buildKsp maxIter_ ); + // ksp set options from db + KSPSetFromOptions(ksp); + + KSPType ksptype; + KSPGetType(ksp, &ksptype); + const word solverName(ksptype); + // Use solution from the previous timestep if the solver is not 'preonly' if (solverName != "preonly") { KSPSetInitialGuessNonzero(ksp, PETSC_TRUE); } - // ksp set options from db - KSPSetFromOptions(ksp); - KSPSetUp(ksp); } @@ -410,8 +357,6 @@ void Foam::petscSolver::computeMatAllocation // Set the prefix for the options db (e.g. -eqn_p_) MatSetOptionsPrefix(Amat, prefix_.c_str()); - dictionary matDict = petscDict_.subOrEmptyDict("matCoeffs"); - PetscUtils::setFlags(prefix_ + "mat_", matDict); MatSetFromOptions(Amat); // On-processor non-zero entries, per row.