You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.8 KiB
78 lines
2.8 KiB
2 years ago
|
#include <medusa/bits/domains/discretization_helpers.hpp>
|
||
|
#include <medusa/bits/types/Vec_fwd.hpp>
|
||
|
|
||
|
#include "gtest/gtest.h"
|
||
|
|
||
|
namespace mm {
|
||
|
|
||
|
|
||
|
TEST(Domains, SphereDiscretization1d) {
|
||
|
/// [SphereDiscretization usage example]
|
||
|
std::mt19937 gen;
|
||
|
double r = 2.3;
|
||
|
const int dim = 1;
|
||
|
auto v = discretization_helpers::SphereDiscretization<double, dim>::construct(r, 4, gen);
|
||
|
/// [SphereDiscretization usage example]
|
||
|
ASSERT_EQ(2, v.size());
|
||
|
std::sort(v.begin(), v.end());
|
||
|
EXPECT_EQ(-r, v[0][0]);
|
||
|
EXPECT_EQ(r, v[1][0]);
|
||
|
}
|
||
|
|
||
|
TEST(Domains, SphereDiscretization2d) {
|
||
|
double r = 2.3;
|
||
|
auto v = discretization_helpers::SphereDiscretization<double, 2>::construct(r, 4);
|
||
|
ASSERT_EQ(v.size(), 4);
|
||
|
std::sort(v.begin(), v.end());
|
||
|
double tol = 1e-15;
|
||
|
EXPECT_NEAR(v[0][0], -r, tol);
|
||
|
EXPECT_NEAR(v[0][1], 0, tol);
|
||
|
EXPECT_NEAR(v[1][0], 0, tol);
|
||
|
EXPECT_NEAR(v[1][1], -r, tol);
|
||
|
EXPECT_NEAR(v[2][0], 0, tol);
|
||
|
EXPECT_NEAR(v[2][1], r, tol);
|
||
|
EXPECT_NEAR(v[3][0], r, tol);
|
||
|
EXPECT_NEAR(v[3][1], 0, tol);
|
||
|
}
|
||
|
|
||
|
TEST(Domains, SphereDiscretization3d) {
|
||
|
double r = 2.3;
|
||
|
auto v = discretization_helpers::SphereDiscretization<double, 3>::construct(r, 6);
|
||
|
decltype(v) expected = {{-1.15, -1.99186, 2.43932e-16}, {-1.15, -0.995929, -1.725},
|
||
|
{-1.15, -0.995929, 1.725}, {-1.15, 0.995929, -1.725},
|
||
|
{-1.15, 0.995929, 1.725}, {-1.15, 1.99186, 0},
|
||
|
{1.15, -1.99186, 2.43932e-16}, {1.15, -0.995929, -1.725},
|
||
|
{1.15, -0.995929, 1.725}, {1.15, 0.995929, -1.725},
|
||
|
{1.15, 0.995929, 1.725}, {1.15, 1.99186, 0}};
|
||
|
std::sort(v.begin(), v.end());
|
||
|
double tol = 1e-5; // large due to low precision data above, but not really a problem
|
||
|
ASSERT_EQ(expected.size(), v.size());
|
||
|
int n = expected.size();
|
||
|
for (int i = 0; i < n; ++i) {
|
||
|
for (int j = 0; j < 3; ++j) {
|
||
|
EXPECT_NEAR(expected[i][j], v[i][j], tol);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TEST(Domains, DiscretizeLineWithDensity) {
|
||
|
/// [discretizeLineWithDensity]
|
||
|
Vec2d p = 0.0, q = {1.0, 0.5};
|
||
|
auto fn = [](const Vec2d& p) { return 0.1*(1+p[0]); };
|
||
|
auto d = discretization_helpers::discretizeLineWithDensity(p, q, fn);
|
||
|
/// [discretizeLineWithDensity]
|
||
|
Range<Vec2d> expected = {{0.0894427, 0.0447214}, {0.186885, 0.0934427}, {0.293044, 0.146522},
|
||
|
{0.408697, 0.204349}, {0.534695, 0.267347}, {0.671962, 0.335981},
|
||
|
{0.821507, 0.410753}};
|
||
|
// plot the points: endpoints are not included, spacing is variable
|
||
|
double tol = 1e-6;
|
||
|
ASSERT_EQ(expected.size(), d.size());
|
||
|
int n = d.size();
|
||
|
for (int i = 0; i < n; ++i) {
|
||
|
EXPECT_NEAR(expected[i][0], d[i][0], tol);
|
||
|
EXPECT_NEAR(expected[i][1], d[i][1], tol);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} // namespace mm
|