Skip to content

Commit fccbb5e

Browse files
committed
Merge branch 'integrate/roberts-pr-69' into development
This merges Robert's first PR (#69). I've squashed a few commits into one (6ef96566) on his request. * integrate/roberts-pr-69: QUAD: uniform -> Uniform QUAD: enum class for quadrature types as well.. QUAD: changed type to enum class, containing S and Q so far Signed-off-by: Torbjörn Klatt <[email protected]>
2 parents f6c19b7 + ed088c9 commit fccbb5e

File tree

9 files changed

+52
-47
lines changed

9 files changed

+52
-47
lines changed

examples/advection_diffusion/mpi_pfasst.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ error_map run_mpi_pfasst()
3030
const double dt = 0.01;
3131
const size_t niters = 4;
3232

33-
vector<pair<size_t, string>> nodes = {
34-
{ 3, "gauss-lobatto" },
35-
{ 5, "gauss-lobatto" }
33+
vector<pair<size_t, pfasst::QuadratureType>> nodes = {
34+
{ 3, pfasst::QuadratureType::GaussLobatto },
35+
{ 5, pfasst::QuadratureType::GaussLobatto }
3636
};
3737

3838
vector<size_t> ndofs = { 64, 128 };

examples/advection_diffusion/serial_mlsdc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ error_map run_serial_mlsdc()
3939
* (according to 'xrat').
4040
*/
4141
for (size_t l = 0; l < nlevs; l++) {
42-
auto nodes = compute_nodes<double>(nnodes, "gauss-lobatto");
42+
auto nodes = compute_nodes<double>(nnodes, pfasst::QuadratureType::GaussLobatto);
4343
auto factory = make_shared<VectorFactory<double>>(ndofs);
4444
auto sweeper = make_shared<AdvectionDiffusionSweeper<>>(ndofs);
4545
auto transfer = make_shared<SpectralTransfer1D<>>();

examples/advection_diffusion/serial_mlsdc_autobuild.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ int main(int /*argc*/, char** /*argv*/)
3636
const double dt = 0.01;
3737
const size_t niters = 4;
3838

39-
vector<pair<size_t, string>> nodes = {
40-
{ 3, "gauss-lobatto" },
41-
{ 5, "gauss-lobatto" }
39+
vector<pair<size_t, pfasst::QuadratureType>> nodes = {
40+
{ 3, pfasst::QuadratureType::GaussLobatto },
41+
{ 5, pfasst::QuadratureType::GaussLegendre }
4242
};
4343

4444
vector<size_t> ndofs = { 64, 128 };

examples/advection_diffusion/vanilla_sdc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ error_map run_vanilla_sdc()
2525
const size_t ndofs = 64;
2626
const size_t niters = 4;
2727

28-
auto nodes = pfasst::compute_nodes(nnodes, "gauss-lobatto");
28+
auto nodes = pfasst::compute_nodes(nnodes, pfasst::QuadratureType::GaussLobatto);
2929
auto factory = make_shared<pfasst::encap::VectorFactory<double>>(ndofs);
3030
auto sweeper = make_shared<AdvectionDiffusionSweeper<>>(ndofs);
3131

examples/scalar/scalar_sdc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ double run_scalar_sdc(const size_t nsteps, const double dt, const size_t nnodes,
2323
pfasst::SDC<> sdc;
2424

2525
const complex<double> y0 = complex<double>(1.0, 0.0);
26-
auto nodes = pfasst::compute_nodes(nnodes, "gauss-lobatto");
26+
auto nodes = pfasst::compute_nodes(nnodes, pfasst::QuadratureType::GaussLobatto);
2727
auto factory = make_shared<pfasst::encap::VectorFactory<complex<double>>>(1);
2828
auto sweeper = make_shared<ScalarSweeper<>>(lambda, y0);
2929

include/pfasst/encap/automagic.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace pfasst
2323
>;
2424

2525
template<typename ControllerT, typename BuildT, typename time = time_precision>
26-
void auto_build(ControllerT& c, vector<pair<size_t, string>> nodes, BuildT build)
26+
void auto_build(ControllerT& c, vector<pair<size_t, pfasst::QuadratureType>> nodes, BuildT build)
2727
{
2828
for (size_t l = 0; l < nodes.size(); l++) {
2929
auto nds = pfasst::compute_nodes<time>(get<0>(nodes[l]), get<1>(nodes[l]));

include/pfasst/encap/imex_sweeper.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,9 @@ namespace pfasst
199199
auto is_proper = this->get_is_proper();
200200
assert(nodes.size() >= 1);
201201

202-
this->s_mat = compute_quadrature(nodes, nodes, is_proper, 's');
202+
this->s_mat = compute_quadrature(nodes, nodes, is_proper, QuadratureMatrix::S);
203203

204-
auto q_mat = compute_quadrature(nodes, nodes, is_proper, 'q');
204+
auto q_mat = compute_quadrature(nodes, nodes, is_proper, QuadratureMatrix::Q);
205205
this->b_mat = matrix<time>(1, nodes.size());
206206
for (size_t m = 0; m < nodes.size(); m++) {
207207
this->b_mat(0, m) = q_mat(nodes.size() - 2, m);

include/pfasst/quadrature.hpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -160,19 +160,20 @@ namespace pfasst
160160
return p2;
161161
}
162162
};
163-
163+
164+
enum class QuadratureType { GaussLegendre, GaussLobatto, GaussRadau, ClenshawCurtis, Uniform };
164165
template<typename node = time_precision>
165-
vector<node> compute_nodes(size_t nnodes, string qtype)
166+
vector<node> compute_nodes(size_t nnodes, QuadratureType qtype)
166167
{
167168
vector<node> nodes(nnodes);
168169

169-
if (qtype == "gauss-legendre") {
170+
if (qtype == QuadratureType::GaussLegendre) {
170171
auto roots = Polynomial<node>::legendre(nnodes).roots();
171172
for (size_t j = 0; j < nnodes; j++) {
172173
nodes[j] = 0.5 * (1.0 + roots[j]);
173174
}
174175

175-
} else if (qtype == "gauss-lobatto") {
176+
} else if (qtype == QuadratureType::GaussLobatto) {
176177
auto roots = Polynomial<node>::legendre(nnodes - 1).differentiate().roots();
177178
assert(nnodes >= 2);
178179
for (size_t j = 0; j < nnodes - 2; j++) {
@@ -181,7 +182,7 @@ namespace pfasst
181182
nodes.front() = 0.0;
182183
nodes.back() = 1.0;
183184

184-
} else if (qtype == "gauss-radau") {
185+
} else if (qtype == QuadratureType::GaussRadau) {
185186
auto l = Polynomial<node>::legendre(nnodes);
186187
auto lm1 = Polynomial<node>::legendre(nnodes - 1);
187188
for (size_t i = 0; i < nnodes; i++) {
@@ -193,12 +194,12 @@ namespace pfasst
193194
}
194195
nodes.back() = 1.0;
195196

196-
} else if (qtype == "clenshaw-curtis") {
197+
} else if (qtype == QuadratureType::ClenshawCurtis) {
197198
for (size_t j = 0; j < nnodes; j++) {
198199
nodes[j] = 0.5 * (1.0 - cos(j * PI / (nnodes - 1)));
199200
}
200201

201-
} else if (qtype == "uniform") {
202+
} else if (qtype == QuadratureType::Uniform) {
202203
for (size_t j = 0; j < nnodes; j++) {
203204
nodes[j] = node(j) / (nnodes - 1);
204205
}
@@ -227,10 +228,12 @@ namespace pfasst
227228
return pair<vector<node>, vector<bool>>(nodes, is_proper);
228229
}
229230

230-
231+
// enum class QuadratureMatrix { S, Q, QQ }; // returning QQ might be cool for 2nd-order stuff
232+
enum class QuadratureMatrix { S, Q };
233+
231234
template<typename node = time_precision>
232235
matrix<node> compute_quadrature(vector<node> dst, vector<node> src, vector<bool> is_proper,
233-
char type)
236+
QuadratureMatrix type)
234237
{
235238
const size_t ndst = dst.size();
236239
const size_t nsrc = src.size();
@@ -261,12 +264,14 @@ namespace pfasst
261264
auto P = p.integrate();
262265
for (size_t j = 1; j < ndst; j++) {
263266
node q = 0.0;
264-
if (type == 's') {
267+
if (type == QuadratureMatrix::S) {
265268
q = P.evaluate(dst[j]) - P.evaluate(dst[j - 1]);
266-
} else {
269+
} else if (type == QuadratureMatrix::Q) {
267270
q = P.evaluate(dst[j]) - P.evaluate(0.0);
271+
} else {
272+
throw ValueError("Further matrix types are not implemented yet");
268273
}
269-
274+
270275
mat(j - 1, i) = q / den;
271276
}
272277
}

tests/test_quadrature.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,13 @@ TEST(NodesTest, GaussLegendreNodes)
7373
0.9745539561713793
7474
};
7575

76-
auto l3 = pfasst::compute_nodes<long double>(3, "gauss-legendre");
76+
auto l3 = pfasst::compute_nodes<long double>(3, pfasst::QuadratureType::GaussLegendre);
7777
EXPECT_THAT(l3, testing::Pointwise(DoubleNear(), l3e));
7878

79-
auto l5 = pfasst::compute_nodes<long double>(5, "gauss-legendre");
79+
auto l5 = pfasst::compute_nodes<long double>(5, pfasst::QuadratureType::GaussLegendre);
8080
EXPECT_THAT(l5, testing::Pointwise(DoubleNear(), l5e));
8181

82-
auto l7 = pfasst::compute_nodes<long double>(7, "gauss-legendre");
82+
auto l7 = pfasst::compute_nodes<long double>(7, pfasst::QuadratureType::GaussLegendre);
8383
EXPECT_THAT(l7, testing::Pointwise(DoubleNear(), l7e));
8484
}
8585

@@ -121,19 +121,19 @@ TEST(NodesTest, GaussLobattoNodes)
121121
1.0
122122
};
123123

124-
auto l2 = pfasst::compute_nodes<long double>(2, "gauss-lobatto");
124+
auto l2 = pfasst::compute_nodes<long double>(2, pfasst::QuadratureType::GaussLobatto);
125125
EXPECT_THAT(l2, testing::Pointwise(DoubleNear(), l2e));
126126

127-
auto l3 = pfasst::compute_nodes<long double>(3, "gauss-lobatto");
127+
auto l3 = pfasst::compute_nodes<long double>(3, pfasst::QuadratureType::GaussLobatto);
128128
EXPECT_THAT(l3, testing::Pointwise(DoubleNear(), l3e));
129129

130-
auto l5 = pfasst::compute_nodes<long double>(5, "gauss-lobatto");
130+
auto l5 = pfasst::compute_nodes<long double>(5, pfasst::QuadratureType::GaussLobatto);
131131
EXPECT_THAT(l5, testing::Pointwise(DoubleNear(), l5e));
132132

133-
auto l7 = pfasst::compute_nodes<long double>(7, "gauss-lobatto");
133+
auto l7 = pfasst::compute_nodes<long double>(7, pfasst::QuadratureType::GaussLobatto);
134134
EXPECT_THAT(l7, testing::Pointwise(DoubleNear(), l7e));
135135

136-
auto l9 = pfasst::compute_nodes<long double>(9, "gauss-lobatto");
136+
auto l9 = pfasst::compute_nodes<long double>(9, pfasst::QuadratureType::GaussLobatto);
137137
EXPECT_THAT(l9, testing::Pointwise(DoubleNear(), l9e));
138138
}
139139

@@ -175,19 +175,19 @@ TEST(NodesTest, ClenshawCurtisNodes)
175175
1.0
176176
};
177177

178-
auto cc2 = pfasst::compute_nodes<long double>(2, "clenshaw-curtis");
178+
auto cc2 = pfasst::compute_nodes<long double>(2, pfasst::QuadratureType::ClenshawCurtis);
179179
EXPECT_THAT(cc2, testing::Pointwise(DoubleNear(), cc2e));
180180

181-
auto cc3 = pfasst::compute_nodes<long double>(3, "clenshaw-curtis");
181+
auto cc3 = pfasst::compute_nodes<long double>(3, pfasst::QuadratureType::ClenshawCurtis);
182182
EXPECT_THAT(cc3, testing::Pointwise(DoubleNear(), cc3e));
183183

184-
auto cc5 = pfasst::compute_nodes<long double>(5, "clenshaw-curtis");
184+
auto cc5 = pfasst::compute_nodes<long double>(5, pfasst::QuadratureType::ClenshawCurtis);
185185
EXPECT_THAT(cc5, testing::Pointwise(DoubleNear(), cc5e));
186186

187-
auto cc7 = pfasst::compute_nodes<long double>(7, "clenshaw-curtis");
187+
auto cc7 = pfasst::compute_nodes<long double>(7, pfasst::QuadratureType::ClenshawCurtis);
188188
EXPECT_THAT(cc7, testing::Pointwise(DoubleNear(), cc7e));
189189

190-
auto cc9 = pfasst::compute_nodes<long double>(9, "clenshaw-curtis");
190+
auto cc9 = pfasst::compute_nodes<long double>(9, pfasst::QuadratureType::ClenshawCurtis);
191191
EXPECT_THAT(cc9, testing::Pointwise(DoubleNear(), cc9e));
192192
}
193193

@@ -209,34 +209,34 @@ TEST(NodesTest, UniformNodes)
209209
1.0
210210
};
211211

212-
auto u2 = pfasst::compute_nodes<long double>(2, "uniform");
212+
auto u2 = pfasst::compute_nodes<long double>(2, pfasst::QuadratureType::Uniform);
213213
EXPECT_THAT(u2, testing::Pointwise(DoubleNear(), u2e));
214214

215-
auto u3 = pfasst::compute_nodes<long double>(3, "uniform");
215+
auto u3 = pfasst::compute_nodes<long double>(3, pfasst::QuadratureType::Uniform);
216216
EXPECT_THAT(u3, testing::Pointwise(DoubleNear(), u3e));
217217

218-
auto u5 = pfasst::compute_nodes<long double>(5, "uniform");
218+
auto u5 = pfasst::compute_nodes<long double>(5, pfasst::QuadratureType::Uniform);
219219
EXPECT_THAT(u5, testing::Pointwise(DoubleNear(), u5e));
220220
}
221221

222222
TEST(QuadratureTest, GaussLobattoNodes)
223223
{
224-
auto l3 = pfasst::compute_nodes<long double>(3, "gauss-lobatto");
224+
auto l3 = pfasst::compute_nodes<long double>(3, pfasst::QuadratureType::GaussLobatto);
225225
auto a3 = pfasst::augment_nodes(l3);
226-
auto s3 = pfasst::compute_quadrature(get<0>(a3), get<0>(a3), get<1>(a3), 's');
226+
auto s3 = pfasst::compute_quadrature(get<0>(a3), get<0>(a3), get<1>(a3), pfasst::QuadratureMatrix::S);
227227
const long double s3e[6] = { 0.20833333333333333,
228228
0.33333333333333333,
229229
-0.04166666666666666,
230230
-0.04166666666666666,
231231
0.33333333333333333,
232232
0.20833333333333333
233233
};
234-
234+
235235
EXPECT_THAT(s3.data(), testing::Pointwise(DoubleNear(), s3e));
236236

237-
auto l5 = pfasst::compute_nodes<long double>(5, "gauss-lobatto");
237+
auto l5 = pfasst::compute_nodes<long double>(5, pfasst::QuadratureType::GaussLobatto);
238238
auto a5 = pfasst::augment_nodes(l5);
239-
auto s5 = pfasst::compute_quadrature(get<0>(a5), get<0>(a5), get<1>(a5), 's');
239+
auto s5 = pfasst::compute_quadrature(get<0>(a5), get<0>(a5), get<1>(a5), pfasst::QuadratureMatrix::S);
240240
const long double s5e[] = { 0.067728432186156897969267419174073482,
241241
0.11974476934341168251615379970493965,
242242
-0.021735721866558113665511351745074292,
@@ -263,9 +263,9 @@ TEST(QuadratureTest, GaussLobattoNodes)
263263

264264
TEST(QuadratureTest, ClenshawCurtisNodes)
265265
{
266-
auto c4 = pfasst::compute_nodes<long double>(4, "clenshaw-curtis");
266+
auto c4 = pfasst::compute_nodes<long double>(4, pfasst::QuadratureType::ClenshawCurtis);
267267
auto a4 = pfasst::augment_nodes(c4);
268-
auto s4 = pfasst::compute_quadrature(get<0>(a4), get<0>(a4), get<1>(a4), 's');
268+
auto s4 = pfasst::compute_quadrature(get<0>(a4), get<0>(a4), get<1>(a4), pfasst::QuadratureMatrix::S);
269269
const long double s4e[] = { 0.10243055555555555555555555555555556,
270270
0.16319444444444444444444444444444444,
271271
-0.024305555555555555555555555555555556,

0 commit comments

Comments
 (0)