IPPL API Reference
Independent Parallel Particle Layer C++ API
Loading...
Searching...
No Matches
PreconditionerValidation.h
1#ifndef IPPL_PRECONDITIONER_VALIDATION_H
2#define IPPL_PRECONDITIONER_VALIDATION_H
3
4#include <cmath>
5#include <string>
6
7#include "LinearSolvers/PCG.h"
8#include "Utility/Inform.h"
9#include "Utility/IpplException.h"
10
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)) {
15 throw IpplException(
16 caller_name.c_str(),
17 ("Unknown preconditioner_type '" + preconditioner_type
18 + "'. Supported types: jacobi, newton, chebyshev, richardson, "
19 "richardson_alt, gauss-seidel, ssor")
20 .c_str());
21 }
22 }
23
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 << "."
31 << endl;
32 };
33
34 if (level <= 0) {
35 warnAndDefault("newton_level", std::to_string(level),
36 std::to_string(pcg_preconditioner_defaults::newton_level));
37 level = pcg_preconditioner_defaults::newton_level;
38 }
39 if (degree <= 0) {
40 warnAndDefault("chebyshev_degree", std::to_string(degree),
41 std::to_string(pcg_preconditioner_defaults::chebyshev_degree));
42 degree = pcg_preconditioner_defaults::chebyshev_degree;
43 }
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;
48 }
49 if (inner <= 0) {
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;
53 }
54 if (outer <= 0) {
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;
58 }
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;
63 }
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;
68 }
69 }
70} // namespace ippl::preconditioner_validation
71
72#endif
Definition Inform.h:40
Definition IpplException.h:6