PFASST++
test_advection_diffusion.cpp
Go to the documentation of this file.
1 /*
2  * Tests for the advection-diffusion examples.
3  */
4 
5 #include <algorithm>
6 #include <iostream>
7 #include <tuple>
8 #include <vector>
9 using namespace std;
10 
11 #include <gtest/gtest.h>
12 #include <gmock/gmock.h>
13 
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
19 
20 
21 MATCHER(DoubleNear, "")
22 {
23  return abs(get<0>(arg) - get<1>(arg)) < 1e-15;
24 }
25 
26 MATCHER(DoubleLess, "")
27 {
28  return get<0>(arg) < get<1>(arg);
29 }
30 
31 TEST(ErrorTest, VanillaSDC)
32 {
33  typedef error_map::value_type vtype;
34 
35  auto get_iter = [](const vtype x) { return get<1>(get<0>(x)); };
36  auto get_error = [](const vtype x) { return get<1>(x); };
37 
38  auto errors = run_vanilla_sdc(0.0);
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); }));
41 
42  vector<double> tol = { 7e-9, 7e-9, 7e-9, 7e-9 };
43  vector<double> err;
44  for (auto& x: errors) {
45  if (get_iter(x) == max_iter) {
46  err.push_back(get_error(x));
47  }
48  }
49 
50  EXPECT_THAT(err, testing::Pointwise(DoubleLess(), tol));
51  ASSERT_EQ(max_iter, (size_t) 3);
52 }
53 
54 TEST(AdaptiveErrorTest, VanillaSDC)
55 {
56  typedef error_map::value_type vtype;
57 
58  auto get_iter = [](const vtype x) { return get<1>(get<0>(x)); };
59  auto get_error = [](const vtype x) { return get<1>(x); };
60 
61  auto errors = run_vanilla_sdc(1.e-6);
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); }));
64 
65  vector<double> tol = { 5e-8, 5e-8, 5e-8, 5e-8 };
66  vector<double> err;
67  for (auto& x: errors) {
68  if (get_iter(x) == max_iter) {
69  err.push_back(get_error(x));
70  }
71  }
72 
73  EXPECT_THAT(err, testing::Pointwise(DoubleLess(), tol));
74  ASSERT_EQ(max_iter, (size_t) 2);
75 }
76 
77 TEST(RelativeAdaptiveErrorTest, VanillaSDC)
78 {
79  typedef error_map::value_type vtype;
80 
81  auto get_iter = [](const vtype x) { return get<1>(get<0>(x)); };
82  auto get_error = [](const vtype x) { return get<1>(x); };
83 
84  auto errors = run_vanilla_sdc(0.0, 1.e-6);
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); }));
87 
88  vector<double> tol = { 5e-8, 5e-8, 5e-8, 5e-8 };
89  vector<double> err;
90  for (auto& x: errors) {
91  if (get_iter(x) == max_iter) {
92  err.push_back(get_error(x));
93  }
94  }
95 
96  EXPECT_THAT(err, testing::Pointwise(DoubleLess(), tol));
97  ASSERT_EQ(max_iter, (size_t) 2);
98 }
99 
100 TEST(ErrorTest, SerialMLSDC)
101 {
102  typedef error_map::value_type vtype;
103 
104  auto errors_and_residuals = run_serial_mlsdc(2);
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); };
108 
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); }));
111 
112  vector<double> tol = { 8e-10, 8e-10, 8e-10, 8e-10 };
113  vector<double> err;
114  for (auto& x: errors) {
115  if (get_iter(x) == max_iter) {
116  err.push_back(get_error(x));
117  }
118  }
119 
120  EXPECT_THAT(err, testing::Pointwise(DoubleLess(), tol));
121 }
122 
123 TEST(FASTest, SerialMLSDC)
124 {
125  typedef error_map::key_type ktype;
126 
127  auto errors_and_residuals = run_serial_mlsdc(3);
128  auto residuals = get<1>(errors_and_residuals);
129 
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);
155 }
156 
157 int main(int argc, char** argv)
158 {
159  testing::InitGoogleTest(&argc, argv);
160  pfasst::log::start_log(argc, argv);
162  return RUN_ALL_TESTS();
163 }
TEST(ErrorTest, VanillaSDC)
static void start_log(int argc, char **argv)
Starts easylogging++ with given arguments and loads configuration.
Definition: logging.hpp:518
STL namespace.
MATCHER(DoubleNear,"")
static void add_custom_logger(const string &id)
Provides convenient way of adding additional named loggers.
Definition: logging.hpp:360
error_map run_vanilla_sdc(double abs_residual_tol, double rel_residual_tol=0.0)
Advection/diffusion example using an encapsulated IMEX sweeper.
Definition: vanilla_sdc.cpp:34
int main(int argc, char **argv)
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.