Skip to content

Commit 191b391

Browse files
pancettatorbjoernk
authored andcommitted
QUAD: enum class for quadrature types as well..
QUAD: enum class for quadrature types as well.. now fix mpi as well QUAD: enum class for quadrature types as well.. now fix mpi as well, no, really QUAD: enum class for quadrature types as well.. now fix mpi as well, no, really (damnit, WIP)
1 parent 4e9a637 commit 191b391

File tree

8 files changed

+57
-42
lines changed

8 files changed

+57
-42
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/quadrature.hpp

Lines changed: 15 additions & 13 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,8 +228,9 @@ namespace pfasst
227228
return pair<vector<node>, vector<bool>>(nodes, is_proper);
228229
}
229230

230-
// enum class QuadratureMatrix {S, Q, QQ}; // returning QQ might be cool for 2nd-order stuff
231-
enum class QuadratureMatrix {S,Q};
231+
// enum class QuadratureMatrix { S, Q, QQ }; // returning QQ might be cool for 2nd-order stuff
232+
enum class QuadratureMatrix { S, Q };
233+
232234
template<typename node = time_precision>
233235
matrix<node> compute_quadrature(vector<node> dst, vector<node> src, vector<bool> is_proper,
234236
QuadratureMatrix type)
@@ -248,7 +250,7 @@ namespace pfasst
248250
p[0] = 1.0;
249251
for (size_t j = 1; j < nsrc + 1; j++) { p[j] = 0.0; }
250252
for (size_t m = 0; m < nsrc; m++) {
251-
if ((!is_proper[m]) || (m == i)) { continue; }
253+
if ((!is_proper[m]) || (m == i)) { continue; }
252254

253255
// p_{m+1}(x) = (x - x_j) * p_m(x)
254256
p1[0] = 0.0;
@@ -263,11 +265,11 @@ namespace pfasst
263265
for (size_t j = 1; j < ndst; j++) {
264266
node q = 0.0;
265267
if (type == QuadratureMatrix::S) {
266-
q = P.evaluate(dst[j]) - P.evaluate(dst[j - 1]);
268+
q = P.evaluate(dst[j]) - P.evaluate(dst[j - 1]);
267269
} else if (type == QuadratureMatrix::Q) {
268-
q = P.evaluate(dst[j]) - P.evaluate(0.0);
270+
q = P.evaluate(dst[j]) - P.evaluate(0.0);
269271
} else {
270-
throw ValueError("Further matrix types are not implemented yet");
272+
throw ValueError("Further matrix types are not implemented yet");
271273
}
272274

273275
mat(j - 1, i) = q / den;

tests/test_quadrature.cpp

Lines changed: 32 additions & 19 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,19 +209,19 @@ 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);
226226
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,
@@ -234,7 +234,7 @@ TEST(QuadratureTest, GaussLobattoNodes)
234234

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);
239239
auto s5 = pfasst::compute_quadrature(get<0>(a5), get<0>(a5), get<1>(a5), pfasst::QuadratureMatrix::S);
240240
const long double s5e[] = { 0.067728432186156897969267419174073482,
@@ -263,7 +263,7 @@ 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);
268268
auto s4 = pfasst::compute_quadrature(get<0>(a4), get<0>(a4), get<1>(a4), pfasst::QuadratureMatrix::S);
269269
const long double s4e[] = { 0.10243055555555555555555555555555556,
@@ -282,6 +282,19 @@ TEST(QuadratureTest, ClenshawCurtisNodes)
282282
EXPECT_THAT(s4.data(), testing::Pointwise(DoubleNear(), s4e));
283283
}
284284

285+
286+
//TEST_P(QmatTest)
287+
//{
288+
// time_t
289+
// for (size_t m = 1; m < nnodes; ++m) {
290+
// qsum = 0;
291+
// for (size_t j = 1; j < nnodes; ++j) {
292+
// qsum += q[m,i];
293+
// }
294+
// EXPECT_THAT(qsum-nodes[m], testing::DoubleNear(0, 1E-04))
295+
//
296+
//}
297+
285298
int main(int argc, char** argv)
286299
{
287300
testing::InitGoogleTest(&argc, argv);

0 commit comments

Comments
 (0)