11 #include <gtest/gtest.h>
12 #include <gmock/gmock.h>
14 #define PFASST_UNIT_TESTING
15 #include "../examples/advection_diffusion/vanilla_sdc.cpp"
16 #include "../examples/advection_diffusion/serial_mlsdc.cpp"
17 #undef PFASST_UNIT_TESTING
23 return abs(get<0>(arg) - get<1>(arg)) < 1e-15;
28 return get<0>(arg) < get<1>(arg);
31 TEST(ErrorTest, VanillaSDC)
33 typedef error_map::value_type
vtype;
35 auto get_iter = [](
const vtype x) {
return get<1>(get<0>(x)); };
36 auto get_error = [](
const vtype x) {
return get<1>(x); };
39 auto max_iter = get_iter(*std::max_element(errors.begin(), errors.end(),
40 [get_iter](
const vtype p1,
const vtype p2) {
return get_iter(p1) < get_iter(p2); }));
42 vector<double> tol = { 7e-9, 7e-9, 7e-9, 7e-9 };
44 for (
auto& x: errors) {
45 if (get_iter(x) == max_iter) {
46 err.push_back(get_error(x));
50 EXPECT_THAT(err, testing::Pointwise(DoubleLess(), tol));
51 ASSERT_EQ(max_iter, (
size_t) 3);
54 TEST(AdaptiveErrorTest, VanillaSDC)
56 typedef error_map::value_type
vtype;
58 auto get_iter = [](
const vtype x) {
return get<1>(get<0>(x)); };
59 auto get_error = [](
const vtype x) {
return get<1>(x); };
62 auto max_iter = get_iter(*std::max_element(errors.begin(), errors.end(),
63 [get_iter](
const vtype p1,
const vtype p2) {
return get_iter(p1) < get_iter(p2); }));
65 vector<double> tol = { 5e-8, 5e-8, 5e-8, 5e-8 };
67 for (
auto& x: errors) {
68 if (get_iter(x) == max_iter) {
69 err.push_back(get_error(x));
73 EXPECT_THAT(err, testing::Pointwise(DoubleLess(), tol));
74 ASSERT_EQ(max_iter, (
size_t) 2);
77 TEST(RelativeAdaptiveErrorTest, VanillaSDC)
79 typedef error_map::value_type
vtype;
81 auto get_iter = [](
const vtype x) {
return get<1>(get<0>(x)); };
82 auto get_error = [](
const vtype x) {
return get<1>(x); };
85 auto max_iter = get_iter(*std::max_element(errors.begin(), errors.end(),
86 [get_iter](
const vtype p1,
const vtype p2) {
return get_iter(p1) < get_iter(p2); }));
88 vector<double> tol = { 5e-8, 5e-8, 5e-8, 5e-8 };
90 for (
auto& x: errors) {
91 if (get_iter(x) == max_iter) {
92 err.push_back(get_error(x));
96 EXPECT_THAT(err, testing::Pointwise(DoubleLess(), tol));
97 ASSERT_EQ(max_iter, (
size_t) 2);
102 typedef error_map::value_type
vtype;
105 auto errors = get<0>(errors_and_residuals);
106 auto get_iter = [](
const vtype x) {
return get<1>(get<0>(x)); };
107 auto get_error = [](
const vtype x) {
return get<1>(x); };
109 auto max_iter = get_iter(*std::max_element(errors.begin(), errors.end(),
110 [get_iter](
const vtype p1,
const vtype p2) {
return get_iter(p1) < get_iter(p2); }));
112 vector<double> tol = { 8e-10, 8e-10, 8e-10, 8e-10 };
114 for (
auto& x: errors) {
115 if (get_iter(x) == max_iter) {
116 err.push_back(get_error(x));
120 EXPECT_THAT(err, testing::Pointwise(DoubleLess(), tol));
125 typedef error_map::key_type
ktype;
128 auto residuals = get<1>(errors_and_residuals);
130 ASSERT_NEAR(residuals[2][
ktype(3, 0)], 0.000667207, 1.e-8);
131 ASSERT_NEAR(residuals[0][
ktype(3, 0)], 6.23966e-07, 1.e-12);
132 ASSERT_NEAR(residuals[1][
ktype(3, 0)], 1.27783e-08, 1.e-12);
133 ASSERT_NEAR(residuals[2][
ktype(3, 1)], 6.60607e-07, 1.e-12);
134 ASSERT_NEAR(residuals[0][
ktype(3, 1)], 5.19702e-10, 1.e-14);
135 ASSERT_NEAR(residuals[1][
ktype(3, 1)], 2.59963e-10, 1.e-12);
136 ASSERT_NEAR(residuals[2][
ktype(3, 2)], 8.89424e-09, 1.e-12);
137 ASSERT_NEAR(residuals[0][
ktype(3, 2)], 8.28716e-11, 1.e-14);
138 ASSERT_NEAR(residuals[1][
ktype(3, 2)], 4.54949e-11, 1.e-14);
139 ASSERT_NEAR(residuals[2][
ktype(3, 3)], 1.04101e-10, 1.e-12);
140 ASSERT_NEAR(residuals[0][
ktype(3, 3)], 8.35953e-11, 1.e-15);
141 ASSERT_NEAR(residuals[1][
ktype(3, 3)], 4.20877e-11, 1.e-15);
142 ASSERT_NEAR(residuals[2][
ktype(3, 4)], 2.18056e-12, 1.e-15);
143 ASSERT_NEAR(residuals[0][
ktype(3, 4)], 8.34365e-11, 1.e-15);
144 ASSERT_NEAR(residuals[1][
ktype(3, 4)], 4.19699e-11, 1.e-15);
145 ASSERT_NEAR(residuals[2][
ktype(3, 5)], 7.18701e-13, 1.e-15);
146 ASSERT_NEAR(residuals[0][
ktype(3, 5)], 8.34336e-11, 1.e-15);
147 ASSERT_NEAR(residuals[1][
ktype(3, 5)], 4.19691e-11, 1.e-15);
148 ASSERT_NEAR(residuals[2][
ktype(3, 6)], 7.07797e-13, 1.e-15);
149 ASSERT_NEAR(residuals[0][
ktype(3, 6)], 8.34340e-11, 1.e-15);
150 ASSERT_NEAR(residuals[1][
ktype(3, 6)], 4.19693e-11, 1.e-15);
151 ASSERT_NEAR(residuals[2][
ktype(3, 7)], 7.07356e-13, 1.e-15);
152 ASSERT_NEAR(residuals[0][
ktype(3, 7)], 8.34338e-11, 1.e-15);
153 ASSERT_NEAR(residuals[1][
ktype(3, 7)], 4.19698e-11, 1.e-15);
154 ASSERT_NEAR(residuals[2][
ktype(3, 8)], 7.07458e-13, 1.e-15);
157 int main(
int argc,
char** argv)
159 testing::InitGoogleTest(&argc, argv);
162 return RUN_ALL_TESTS();
TEST(ErrorTest, VanillaSDC)
static void start_log(int argc, char **argv)
Starts easylogging++ with given arguments and loads configuration.
static void add_custom_logger(const string &id)
Provides convenient way of adding additional named loggers.
error_map run_vanilla_sdc(double abs_residual_tol, double rel_residual_tol=0.0)
Advection/diffusion example using an encapsulated IMEX sweeper.
int main(int argc, char **argv)
error_map::value_type vtype
error_map::key_type ktype
tuple< error_map, residual_map > run_serial_mlsdc(size_t nlevs, size_t nsteps_in=4, double step_size_in=0.01, size_t num_iter_in=8, size_t nnodes_in=5, size_t ndofs_in=128)
Advection/diffusion example using an encapsulated IMEX sweeper.