From 58c59ecd31b31922bc715c0306e42b87e982e41d Mon Sep 17 00:00:00 2001 From: Timo Koch <timo.koch@iws.uni-stuttgart.de> Date: Wed, 25 Jul 2018 16:10:40 +0200 Subject: [PATCH] [test] Add scaling tests with different magnitudes --- test/common/geometry/test_makegeometry.cc | 109 ++++++++++++---------- 1 file changed, 60 insertions(+), 49 deletions(-) diff --git a/test/common/geometry/test_makegeometry.cc b/test/common/geometry/test_makegeometry.cc index 78821515ad..9de3d36a7f 100644 --- a/test/common/geometry/test_makegeometry.cc +++ b/test/common/geometry/test_makegeometry.cc @@ -79,7 +79,7 @@ void permutatePointsAndTest(const std::vector<GlobalPosition>& cornerPoints, std::cout << "point " << p << " lies within the quadrilateral" << std::endl; } else - DUNE_THROW(Dune::InvalidStateException, "Check for point inside geometry failed. Point " << p << " does not lie within the geometry!"); + DUNE_THROW(Dune::InvalidStateException, "False negative: Check for point " << p << " which is inside the geometry failed"); } for(const auto& p : pointsOutsideGeometry) @@ -90,7 +90,7 @@ void permutatePointsAndTest(const std::vector<GlobalPosition>& cornerPoints, std::cout << "point " << p << " lies outside of the quadrilateral" << std::endl; } else - DUNE_THROW(Dune::InvalidStateException, "Check for point outside geometry failed. Point " << p << " does lie within the geometry!"); + DUNE_THROW(Dune::InvalidStateException, "False positive: Check for point " << p << " which is outside the geometry failed"); } } while(std::next_permutation(s.begin(), s.end())); @@ -100,20 +100,21 @@ template<class GlobalPosition> void checkAxisAlignedGeometry(std::vector<GlobalPosition>& cornerPoints, std::vector<GlobalPosition>& pointsWithinGeometry, std::vector<GlobalPosition>& pointsOutsideGeometry, - const int normalDirection) + const int normalDirection, + const typename GlobalPosition::value_type scale) { static const char dim[]= "xyz"; std::cout << "testing for quadrilateral with normal in " << dim[normalDirection] << " direction" << std::endl; // check if points are coplanar if(!Dumux::pointsAreCoplanar(cornerPoints)) - DUNE_THROW(Dune::InvalidStateException, "False positive, points are actually coplanar!"); + DUNE_THROW(Dune::InvalidStateException, "False negative, points are actually coplanar!"); - cornerPoints[0][normalDirection] += 1e-9; + cornerPoints[0][normalDirection] += 1e-5*scale; // we make them non-coplanar if(Dumux::pointsAreCoplanar(cornerPoints)) - DUNE_THROW(Dune::InvalidStateException, "Points are not coplanar!"); + DUNE_THROW(Dune::InvalidStateException, "False positive, points are actually not coplanar!"); - cornerPoints[0][normalDirection] -= 1e-9; + cornerPoints[0][normalDirection] -= 1e-5*scale; permutatePointsAndTest(cornerPoints, pointsWithinGeometry, pointsOutsideGeometry); @@ -122,19 +123,22 @@ void checkAxisAlignedGeometry(std::vector<GlobalPosition>& cornerPoints, std::vector<GlobalPosition> pointsWithinGeometryForRandomTest = { {0.6, 0.6, 0.6}, {0.4, 0.4, 0.4} }; for(auto& p : pointsWithinGeometryForRandomTest) + { + p *= scale; p[normalDirection] = 0.0; + } auto pointsOutsideGeometryForRandomTest = pointsOutsideGeometry; - pointsOutsideGeometryForRandomTest[0] = {1.5, 1.5, 1.5}; + pointsOutsideGeometryForRandomTest[0] = {1.5*scale, 1.5*scale, 1.5*scale}; pointsOutsideGeometryForRandomTest[0][normalDirection] = 0.0; - for(int i = 0; i< 10; i++) - { - // uniform random number generator - std::random_device rd; - std::mt19937 generator(rd()); - std::uniform_real_distribution<> uniformdist(-0.3, 0.3); + // uniform random number generator + std::random_device rd; + std::mt19937 generator(rd()); + std::uniform_real_distribution<> uniformdist(-0.3*scale, 0.3*scale); + for(int i = 0; i < 10; i++) + { for(auto&& p : cornerPoints) { for(int x = 0; x < p.size(); ++x) @@ -148,8 +152,6 @@ void checkAxisAlignedGeometry(std::vector<GlobalPosition>& cornerPoints, cornerPoints = origCornerPoints; } - - } int main(int argc, char** argv) try @@ -157,50 +159,59 @@ int main(int argc, char** argv) try using namespace Dumux; using GlobalPosition = Dune::FieldVector<double, 3>; - GlobalPosition p0 = {0,0,0}; - GlobalPosition p1 = {1,0,0}; - GlobalPosition p2 = {0,1,0}; - GlobalPosition p3 = {1,1,0}; + std::array<double, 3> scaling{{1e-12, 1.0, 1e12}}; - std::vector<GlobalPosition> cornerPoints = {p0, p1, p2, p3}; + for (const double scale : scaling) + { + const double size = 1.0*scale; + const double half = 0.5*scale; + const double small = 1e-3*scale; - std::vector<GlobalPosition> pointsWithinGeometry = { GlobalPosition{0.5, 0.5, 0.0}, - GlobalPosition{cornerPoints[0][0] + 1e-3, cornerPoints[0][1] + 1e-3, 0.0}, - GlobalPosition{cornerPoints[3][0] - 1e-3, cornerPoints[3][1] - 1e-3, 0.0} }; + GlobalPosition p0 = {0, 0, 0}; + GlobalPosition p1 = {size, 0, 0}; + GlobalPosition p2 = {0, size, 0}; + GlobalPosition p3 = {size, size, 0}; - std::vector<GlobalPosition> pointsOutsideGeometry = { GlobalPosition{cornerPoints[0][0] - 1e-3, cornerPoints[0][1] - 1e-3, 0.0}, - GlobalPosition{0.5, 0.5, 1e-3} }; + std::vector<GlobalPosition> cornerPoints = {p0, p1, p2, p3}; - // do the checks for a quadrilateral parallel to the x and y axis - checkAxisAlignedGeometry(cornerPoints, pointsWithinGeometry, pointsOutsideGeometry, 2); + std::vector<GlobalPosition> pointsWithinGeometry = { GlobalPosition{half, half, 0.0}, + GlobalPosition{cornerPoints[0][0] + small, cornerPoints[0][1] + small, 0.0}, + GlobalPosition{cornerPoints[3][0] - small, cornerPoints[3][1] - small, 0.0} }; - // rotate the quadrilateral to make it parallel to the other axes and test again - for(int i = 1; i >=0; --i) - { - for(auto& p : cornerPoints) - std::rotate(p.begin(), p.begin() + 1, p.end()); - for(auto& p : pointsWithinGeometry) - std::rotate(p.begin(), p.begin() + 1, p.end()); - for(auto& p : pointsOutsideGeometry) - std::rotate(p.begin(), p.begin() + 1, p.end()); - - checkAxisAlignedGeometry(cornerPoints, pointsWithinGeometry, pointsOutsideGeometry, i); - } + std::vector<GlobalPosition> pointsOutsideGeometry = { GlobalPosition{cornerPoints[0][0] - small, cornerPoints[0][1] - small, 0.0}, + GlobalPosition{half, half, small} }; - std::cout << "testing for non axis-aligned quadrilateral" << std::endl; + // do the checks for a quadrilateral parallel to the x and y axis + checkAxisAlignedGeometry(cornerPoints, pointsWithinGeometry, pointsOutsideGeometry, 2, size); - cornerPoints[0][0] += 0.5; - cornerPoints[1][0] -= 0.5; - cornerPoints[2][0] += 0.5; - cornerPoints[3][0] -= 0.5; + // rotate the quadrilateral to make it parallel to the other axes and test again + for(int i = 1; i >=0; --i) + { + for(auto& p : cornerPoints) + std::rotate(p.begin(), p.begin() + 1, p.end()); + for(auto& p : pointsWithinGeometry) + std::rotate(p.begin(), p.begin() + 1, p.end()); + for(auto& p : pointsOutsideGeometry) + std::rotate(p.begin(), p.begin() + 1, p.end()); + + checkAxisAlignedGeometry(cornerPoints, pointsWithinGeometry, pointsOutsideGeometry, i, size); + } - GlobalPosition pointToCheck5 = {0.0, 0.5, 0.5}; + std::cout << "testing for non axis-aligned quadrilateral" << std::endl; - pointsWithinGeometry = {pointToCheck5}; + cornerPoints[0][0] += half; + cornerPoints[1][0] -= half; + cornerPoints[2][0] += half; + cornerPoints[3][0] -= half; - pointsOutsideGeometry[1] = pointsOutsideGeometry[0]; + GlobalPosition pointToCheck5 = {0.0, half, half}; - permutatePointsAndTest(cornerPoints, pointsWithinGeometry, pointsOutsideGeometry); + pointsWithinGeometry = {pointToCheck5}; + + pointsOutsideGeometry[1] = pointsOutsideGeometry[0]; + + permutatePointsAndTest(cornerPoints, pointsWithinGeometry, pointsOutsideGeometry); + } return 0; } -- GitLab