1#ifndef IPPL_PRECONDITIONER_VALIDATION_H
2#define IPPL_PRECONDITIONER_VALIDATION_H
7#include "LinearSolvers/PCG.h"
8#include "Utility/Inform.h"
9#include "Utility/IpplException.h"
11namespace ippl::preconditioner_validation {
12 inline void throwIfUnknownType(
const std::string& preconditioner_type,
13 const std::string& caller_name) {
14 if (!pcg_preconditioner_defaults::is_valid_type(preconditioner_type)) {
17 (
"Unknown preconditioner_type '" + preconditioner_type
18 +
"'. Supported types: jacobi, newton, chebyshev, richardson, "
19 "richardson_alt, gauss-seidel, ssor")
24 inline void sanitizeParams(
const std::string& preconditioner_type,
Inform& warn,
int& level,
25 int& degree,
int& richardson_iterations,
int& inner,
int& outer,
26 double& omega,
int* communication =
nullptr) {
27 auto warnAndDefault = [&](
const std::string& what,
const std::string& value,
28 const std::string& default_value) {
29 warn <<
"Invalid " << what <<
"='" << value <<
"' for preconditioner '"
30 << preconditioner_type <<
"'. Using default " << what <<
"=" << default_value <<
"."
35 warnAndDefault(
"newton_level", std::to_string(level),
36 std::to_string(pcg_preconditioner_defaults::newton_level));
37 level = pcg_preconditioner_defaults::newton_level;
40 warnAndDefault(
"chebyshev_degree", std::to_string(degree),
41 std::to_string(pcg_preconditioner_defaults::chebyshev_degree));
42 degree = pcg_preconditioner_defaults::chebyshev_degree;
44 if (richardson_iterations <= 0) {
45 warnAndDefault(
"richardson_iterations", std::to_string(richardson_iterations),
46 std::to_string(pcg_preconditioner_defaults::richardson_iterations));
47 richardson_iterations = pcg_preconditioner_defaults::richardson_iterations;
50 warnAndDefault(
"gauss_seidel_inner_iterations", std::to_string(inner),
51 std::to_string(pcg_preconditioner_defaults::gauss_seidel_inner));
52 inner = pcg_preconditioner_defaults::gauss_seidel_inner;
55 warnAndDefault(
"gauss_seidel_outer_iterations", std::to_string(outer),
56 std::to_string(pcg_preconditioner_defaults::gauss_seidel_outer));
57 outer = pcg_preconditioner_defaults::gauss_seidel_outer;
59 if (!std::isfinite(omega)) {
60 warnAndDefault(
"ssor_omega", std::to_string(omega),
61 std::to_string(pcg_preconditioner_defaults::ssor_omega));
62 omega = pcg_preconditioner_defaults::ssor_omega;
64 if (communication !=
nullptr && !(*communication == 0 || *communication == 1)) {
65 warnAndDefault(
"communication", std::to_string(*communication),
66 std::to_string(pcg_preconditioner_defaults::communication));
67 *communication = pcg_preconditioner_defaults::communication;
Definition IpplException.h:6