Skip to content

Commit

Permalink
Eigenvalue Solver: Support shell matrices
Browse files Browse the repository at this point in the history
Closes  #7398
  • Loading branch information
fdkong committed Nov 20, 2019
1 parent 9ac4618 commit 62ebb4f
Show file tree
Hide file tree
Showing 14 changed files with 39 additions and 70 deletions.
2 changes: 1 addition & 1 deletion framework/include/base/SolverParams.h
Expand Up @@ -24,5 +24,5 @@ class SolverParams
Moose::EigenSolveType _eigen_solve_type;
Moose::EigenProblemType _eigen_problem_type;
Moose::WhichEigenPairs _which_eigen_pairs;
bool _eigen_matrix_free;
};

5 changes: 0 additions & 5 deletions framework/include/problems/EigenProblem.h
Expand Up @@ -55,10 +55,6 @@ class EigenProblem : public FEProblemBase
*/
bool negativeSignEigenKernel() { return _negative_sign_eigen_kernel; }

bool matrixFree() { return _matrix_free; }

void matrixFree(bool matrix_free) { _matrix_free = matrix_free; }

#if LIBMESH_HAVE_SLEPC
void setEigenproblemType(Moose::EigenProblemType eigen_problem_type);

Expand Down Expand Up @@ -104,7 +100,6 @@ class EigenProblem : public FEProblemBase
std::shared_ptr<NonlinearEigenSystem> _nl_eigen;

bool _negative_sign_eigen_kernel;
bool _matrix_free;

unsigned int _active_eigen_index;
/// Timers
Expand Down
14 changes: 6 additions & 8 deletions framework/include/utils/MooseTypes.h
Expand Up @@ -678,14 +678,12 @@ enum SolveType
*/
enum EigenSolveType
{
EST_POWER, ///< Power / Inverse / RQI
EST_ARNOLDI, ///< Arnoldi
EST_KRYLOVSCHUR, ///< Krylov-Schur
EST_JACOBI_DAVIDSON, ///< Jacobi-Davidson
EST_NONLINEAR_POWER, ///< Nonlinear inverse power
EST_MF_NONLINEAR_POWER, ///< Matrix-free nonlinear inverse power
EST_MONOLITH_NEWTON, ///< Newton-based eigen solver
EST_MF_MONOLITH_NEWTON, ///< Matrix-free Newton-based eigen solver
EST_POWER, ///< Power / Inverse / RQI
EST_ARNOLDI, ///< Arnoldi
EST_KRYLOVSCHUR, ///< Krylov-Schur
EST_JACOBI_DAVIDSON, ///< Jacobi-Davidson
EST_NONLINEAR_POWER, ///< Nonlinear inverse power
EST_NEWTON, ///< Newton-based eigen solver
};

/**
Expand Down
3 changes: 2 additions & 1 deletion framework/src/base/SolverParams.C
Expand Up @@ -15,6 +15,7 @@ SolverParams::SolverParams()
_mffd_type(Moose::MFFD_INVALID),
_eigen_solve_type(Moose::EST_KRYLOVSCHUR),
_eigen_problem_type(Moose::EPT_SLEPC_DEFAULT),
_which_eigen_pairs(Moose::WEP_SLEPC_DEFAULT)
_which_eigen_pairs(Moose::WEP_SLEPC_DEFAULT),
_eigen_matrix_free(false)
{
}
2 changes: 0 additions & 2 deletions framework/src/executioners/Eigenvalue.C
Expand Up @@ -54,8 +54,6 @@ Eigenvalue::Eigenvalue(const InputParameters & parameters)

Moose::SlepcSupport::storeSlepcEigenProblemOptions(_eigen_problem, parameters);
_eigen_problem.setEigenproblemType(_eigen_problem.solverParams()._eigen_problem_type);

_eigen_problem.matrixFree(getParam<bool>("matrix_free"));
#endif
}

Expand Down
6 changes: 2 additions & 4 deletions framework/src/problems/EigenProblem.C
Expand Up @@ -283,7 +283,7 @@ void
EigenProblem::init()
{
// If matrix_free=true, this set Libmesh to use shell matrices
_nl_eigen->sys().use_shell_matrices(_matrix_free);
_nl_eigen->sys().use_shell_matrices(solverParams()._eigen_matrix_free);

FEProblemBase::init();

Expand All @@ -301,7 +301,5 @@ bool
EigenProblem::isNonlinearEigenvalueSolver()
{
return solverParams()._eigen_solve_type == Moose::EST_NONLINEAR_POWER ||
solverParams()._eigen_solve_type == Moose::EST_MF_NONLINEAR_POWER ||
solverParams()._eigen_solve_type == Moose::EST_MONOLITH_NEWTON ||
solverParams()._eigen_solve_type == Moose::EST_MF_MONOLITH_NEWTON;
solverParams()._eigen_solve_type == Moose::EST_NEWTON;
}
4 changes: 1 addition & 3 deletions framework/src/utils/Conversion.C
Expand Up @@ -82,9 +82,7 @@ initEigenSolveType()
eigen_solve_type_to_enum["KRYLOVSCHUR"] = EST_KRYLOVSCHUR;
eigen_solve_type_to_enum["JACOBI_DAVIDSON"] = EST_JACOBI_DAVIDSON;
eigen_solve_type_to_enum["NONLINEAR_POWER"] = EST_NONLINEAR_POWER;
eigen_solve_type_to_enum["MF_NONLINEAR_POWER"] = EST_MF_NONLINEAR_POWER;
eigen_solve_type_to_enum["MONOLITH_NEWTON"] = EST_MONOLITH_NEWTON;
eigen_solve_type_to_enum["MF_MONOLITH_NEWTON"] = EST_MF_MONOLITH_NEWTON;
eigen_solve_type_to_enum["NEWTON"] = EST_NEWTON;
}
}

Expand Down
55 changes: 15 additions & 40 deletions framework/src/utils/SlepcSupport.C
Expand Up @@ -35,8 +35,7 @@ InputParameters
getSlepcValidParams(InputParameters & params)
{
MooseEnum solve_type("POWER ARNOLDI KRYLOVSCHUR JACOBI_DAVIDSON "
"NONLINEAR_POWER MF_NONLINEAR_POWER "
"MONOLITH_NEWTON MF_MONOLITH_NEWTON");
"NONLINEAR_POWER NEWTON");
params.set<MooseEnum>("solve_type") = solve_type;

params.setDocString("solve_type",
Expand All @@ -45,9 +44,7 @@ getSlepcValidParams(InputParameters & params)
"KRYLOVSCHUR: Krylov-Schur "
"JACOBI_DAVIDSON: Jacobi-Davidson "
"NONLINEAR_POWER: Nonlinear Power "
"MF_NONLINEAR_POWER: Matrix-free Nonlinear Power "
"MONOLITH_NEWTON: Newton "
"MF_MONOLITH_NEWTON: Matrix-free Newton ");
"NEWTON: Newton ");

// When the eigenvalue problems is reformed as a coupled nonlinear system,
// we use part of Jacobian as the preconditioning matrix.
Expand Down Expand Up @@ -197,6 +194,8 @@ storeSlepcEigenProblemOptions(EigenProblem & eigen_problem, const InputParameter
}

eigen_problem.es().parameters.set<unsigned int>("basis vectors") = n_basis_vectors;

eigen_problem.solverParams()._eigen_matrix_free = params.get<bool>("matrix_free");
}

void
Expand Down Expand Up @@ -257,13 +256,11 @@ setSlepcOutputOptions(EigenProblem & eigen_problem)
switch (eigen_problem.solverParams()._eigen_solve_type)
{
case Moose::EST_NONLINEAR_POWER:
case Moose::EST_MF_NONLINEAR_POWER:
Moose::PetscSupport::setSinglePetscOption("-eps_power_snes_monitor");
Moose::PetscSupport::setSinglePetscOption("-eps_power_ksp_monitor");
break;

case Moose::EST_MONOLITH_NEWTON:
case Moose::EST_MF_MONOLITH_NEWTON:
case Moose::EST_NEWTON:
Moose::PetscSupport::setSinglePetscOption("-init_eps_monitor_conv");
Moose::PetscSupport::setSinglePetscOption("-init_eps_monitor");
Moose::PetscSupport::setSinglePetscOption("-eps_power_snes_monitor");
Expand Down Expand Up @@ -367,54 +364,32 @@ setEigenSolverOptions(SolverParams & solver_params, const InputParameters & para
Moose::PetscSupport::setSinglePetscOption("-eps_type", "power");
Moose::PetscSupport::setSinglePetscOption("-eps_power_nonlinear", "1");
Moose::PetscSupport::setSinglePetscOption("-eps_target_magnitude", "");
if (solver_params._eigen_matrix_free)
Moose::PetscSupport::setSinglePetscOption("-eps_power_snes_mf_operator", "1");
#else
mooseError("Nonlinear Inverse Power requires SLEPc 3.7.3 or higher");
#endif
break;

case Moose::EST_MF_NONLINEAR_POWER:
#if !SLEPC_VERSION_LESS_THAN(3, 8, 0) || !PETSC_VERSION_RELEASE
Moose::PetscSupport::setSinglePetscOption("-eps_type", "power");
Moose::PetscSupport::setSinglePetscOption("-eps_power_nonlinear", "1");
Moose::PetscSupport::setSinglePetscOption("-eps_power_snes_mf_operator", "1");
Moose::PetscSupport::setSinglePetscOption("-eps_target_magnitude", "");
#else
mooseError("Matrix-free nonlinear Inverse Power requires SLEPc 3.7.3 or higher");
#endif
break;

case Moose::EST_MONOLITH_NEWTON:
#if !SLEPC_VERSION_LESS_THAN(3, 8, 0) || !PETSC_VERSION_RELEASE
Moose::PetscSupport::setSinglePetscOption("-eps_type", "power");
Moose::PetscSupport::setSinglePetscOption("-eps_power_nonlinear", "1");
Moose::PetscSupport::setSinglePetscOption("-eps_power_update", "1");
Moose::PetscSupport::setSinglePetscOption("-init_eps_power_snes_max_it", "1");
Moose::PetscSupport::setSinglePetscOption("-init_eps_power_ksp_rtol", "1e-2");
Moose::PetscSupport::setSinglePetscOption(
"-init_eps_max_it", stringify(params.get<unsigned int>("free_power_iterations")));
Moose::PetscSupport::setSinglePetscOption("-eps_target_magnitude", "");
#else
mooseError("Newton-based eigenvalue solver requires SLEPc 3.7.3 or higher");
#endif
break;
else

case Moose::EST_MF_MONOLITH_NEWTON:
case Moose::EST_NEWTON:
#if !SLEPC_VERSION_LESS_THAN(3, 8, 0) || !PETSC_VERSION_RELEASE
Moose::PetscSupport::setSinglePetscOption("-eps_type", "power");
Moose::PetscSupport::setSinglePetscOption("-eps_power_nonlinear", "1");
Moose::PetscSupport::setSinglePetscOption("-eps_power_update", "1");
Moose::PetscSupport::setSinglePetscOption("-eps_power_snes_mf_operator", "1");
Moose::PetscSupport::setSinglePetscOption("-init_eps_power_snes_mf_operator", "1");
Moose::PetscSupport::setSinglePetscOption("-init_eps_power_snes_max_it", "1");
Moose::PetscSupport::setSinglePetscOption("-init_eps_power_ksp_rtol", "1e-2");
Moose::PetscSupport::setSinglePetscOption(
"-init_eps_max_it", stringify(params.get<unsigned int>("free_power_iterations")));
Moose::PetscSupport::setSinglePetscOption("-eps_target_magnitude", "");
if (solver_params._eigen_matrix_free)
{
Moose::PetscSupport::setSinglePetscOption("-eps_power_snes_mf_operator", "1");
Moose::PetscSupport::setSinglePetscOption("-init_eps_power_snes_mf_operator", "1");
}
#else
mooseError("Matrix-free Newton-based eigenvalue solver requires SLEPc 3.7.3 or higher");
mooseError("Newton-based eigenvalue solver requires SLEPc 3.7.3 or higher");
#endif
break;

default:
mooseError("Unknown eigen solver type \n");
}
Expand Down
3 changes: 2 additions & 1 deletion test/tests/problems/eigen_problem/ane.i
Expand Up @@ -53,7 +53,8 @@

[Executioner]
type = Eigenvalue
solve_type = MF_MONOLITH_NEWTON
matrix_free = true
solve_type = NEWTON
eigen_problem_type = GEN_NON_HERMITIAN
[]

Expand Down
3 changes: 2 additions & 1 deletion test/tests/problems/eigen_problem/ne.i
Expand Up @@ -50,7 +50,8 @@

[Executioner]
type = Eigenvalue
solve_type = MF_MONOLITH_NEWTON
matrix_free = true
solve_type = NEWTON
eigen_problem_type = GEN_NON_HERMITIAN
[]

Expand Down
3 changes: 2 additions & 1 deletion test/tests/problems/eigen_problem/ne_coupled.i
Expand Up @@ -107,7 +107,8 @@

[Executioner]
type = Eigenvalue
solve_type = MF_MONOLITH_NEWTON
matrix_free = true
solve_type = NEWTON
eigen_problem_type = GEN_NON_HERMITIAN
[]

Expand Down
3 changes: 2 additions & 1 deletion test/tests/problems/eigen_problem/ne_coupled_picard.i
Expand Up @@ -86,7 +86,8 @@

[Executioner]
type = Eigenvalue
solve_type = MF_MONOLITH_NEWTON
matrix_free = true
solve_type = NEWTON
eigen_problem_type = GEN_NON_HERMITIAN
picard_max_its = 10
picard_rel_tol = 1e-6
Expand Down
Expand Up @@ -81,7 +81,8 @@

[Executioner]
type = Eigenvalue
solve_type = MF_MONOLITH_NEWTON
matrix_free = true
solve_type = NEWTON
eigen_problem_type = GEN_NON_HERMITIAN
[]

Expand Down
3 changes: 2 additions & 1 deletion test/tests/problems/eigen_problem/ne_deficient_b.i
Expand Up @@ -79,7 +79,8 @@

[Executioner]
type = Eigenvalue
solve_type = MF_MONOLITH_NEWTON
matrix_free = true
solve_type = NEWTON
eigen_problem_type = GEN_NON_HERMITIAN
[]

Expand Down

0 comments on commit 62ebb4f

Please sign in to comment.