preCICE v3.2.0
Loading...
Searching...
No Matches
NearestNeighborGradientMappingTest.cpp
Go to the documentation of this file.
1#include <Eigen/Core>
2#include <algorithm>
4#include "mapping/Mapping.hpp"
6#include "math/constants.hpp"
7#include "mesh/Mesh.hpp"
9#include "mesh/Vertex.hpp"
11#include "testing/Testing.hpp"
12
13using namespace precice;
14using namespace precice::mesh;
15
16BOOST_AUTO_TEST_SUITE(MappingTests)
17BOOST_AUTO_TEST_SUITE(NearestNeighborGradientMapping)
18
20BOOST_AUTO_TEST_CASE(ConsistentNonIncremental)
21{
23 int dimensions = 2;
24 using testing::equals;
25
26 // Create mesh to map from
27 PtrMesh inMesh(new Mesh("InMesh", dimensions, testing::nextMeshID()));
28 Vertex &inVertex0 = inMesh->createVertex(Eigen::Vector2d::Constant(0.0));
29 Vertex &inVertex1 = inMesh->createVertex(Eigen::Vector2d::Constant(1.0));
30
31 // Create data
32 Eigen::VectorXd inValuesScalar = Eigen::VectorXd::Zero(2);
33 Eigen::VectorXd inValuesVector = Eigen::VectorXd::Zero(4);
34 inValuesScalar << 1.0, 2.0;
35 inValuesVector << 1.0, 2.0, 3.0, 4.0;
36
37 // Create corresponding gradient data (all gradient values = const = 1)
38 Eigen::MatrixXd inGradientsScalar(dimensions, 2);
39 Eigen::MatrixXd inGradientsVector(dimensions, 4);
40 inGradientsScalar.setOnes();
41 inGradientsVector.setOnes();
42
43 // Create mesh to map to
44 PtrMesh outMesh(new Mesh("OutMesh", dimensions, testing::nextMeshID()));
45 Vertex &outVertex0 = outMesh->createVertex(Eigen::Vector2d::Constant(0.0));
46 Vertex &outVertex1 = outMesh->createVertex(Eigen::Vector2d::Constant(1.0));
47
48 // Setup mapping with mapping coordinates and geometry used
50 mapping.setMeshes(inMesh, outMesh);
51 BOOST_TEST(mapping.hasComputedMapping() == false);
52
53 // Map data with coinciding vertices, has to result in equal values.
54 // Distance between in and out vertices is zero
55 mapping.computeMapping();
56 Eigen::VectorXd outValuesScalar = Eigen::VectorXd::Zero(2);
57 time::Sample inSampleScalar(1, inValuesScalar, inGradientsScalar);
58 mapping.map(inSampleScalar, outValuesScalar);
59 BOOST_TEST(mapping.hasComputedMapping() == true);
60
61 BOOST_TEST(outValuesScalar(0) == inValuesScalar(0));
62 BOOST_TEST(outValuesScalar(1) == inValuesScalar(1));
63
64 Eigen::VectorXd outValuesVector = Eigen::VectorXd::Zero(4);
65 time::Sample inSampleVector(2, inValuesVector, inGradientsVector);
66 mapping.map(inSampleVector, outValuesVector);
67 BOOST_CHECK(equals(inValuesVector, outValuesVector));
68
69 // Map data with almost coinciding vertices, with a null gradient, has to result in equal values
70 inGradientsScalar.setZero();
71 inGradientsVector.setZero();
72
73 outVertex0.setCoords(inVertex0.getCoords() + Eigen::Vector2d::Constant(0.1));
74 outVertex1.setCoords(inVertex1.getCoords() + Eigen::Vector2d::Constant(0.1));
75
76 mapping.computeMapping();
77 inSampleScalar = time::Sample(1, inValuesScalar, inGradientsScalar);
78 mapping.map(inSampleScalar, outValuesScalar);
79 BOOST_TEST(mapping.hasComputedMapping() == true);
80 BOOST_TEST(outValuesScalar(0) == inValuesScalar(0));
81 BOOST_TEST(outValuesScalar(1) == inValuesScalar(1));
82 inSampleVector = time::Sample(2, inValuesVector, inGradientsVector);
83 mapping.map(inSampleVector, outValuesVector);
84 Eigen::Vector4d expected(1.0, 2.0, 3.0, 4.0);
85 BOOST_CHECK(equals(expected, outValuesVector));
86
87 // Map data with almost coinciding vertices, should be a little different with the gradient optimization
88 inGradientsScalar.setOnes();
89 inGradientsVector.setOnes();
90 outVertex0.setCoords(inVertex0.getCoords() + Eigen::Vector2d::Constant(0.1));
91 outVertex1.setCoords(inVertex1.getCoords() + Eigen::Vector2d::Constant(0.1));
92
93 mapping.computeMapping();
94 inSampleScalar = time::Sample(1, inValuesScalar, inGradientsScalar);
95 mapping.map(inSampleScalar, outValuesScalar);
96 BOOST_TEST(mapping.hasComputedMapping() == true);
97 BOOST_TEST(outValuesScalar(0) == inValuesScalar(0) + 0.2);
98 BOOST_TEST(outValuesScalar(1) == inValuesScalar(1) + 0.2);
99 inSampleVector = time::Sample(2, inValuesVector, inGradientsVector);
100 mapping.map(inSampleVector, outValuesVector);
101 expected << 1.2, 2.2, 3.2, 4.2;
102 BOOST_CHECK(equals(expected, outValuesVector));
103}
104
105PRECICE_TEST_SETUP(1_rank)
106BOOST_AUTO_TEST_CASE(ConsistentGradientNotConstant)
107{
109 int dimensions = 2;
110 using testing::equals;
111
112 // Create mesh to map from
113 PtrMesh inMesh(new Mesh("InMesh", dimensions, testing::nextMeshID()));
114 inMesh->createVertex(Eigen::Vector2d::Constant(0.0));
115 inMesh->createVertex(Eigen::Vector2d::Constant(1.0));
116
117 // Create data
118 Eigen::VectorXd inValuesScalar = Eigen::VectorXd::Zero(2);
119 Eigen::VectorXd inValuesVector = Eigen::VectorXd::Zero(4);
120 inValuesScalar << 1.0, 2.0;
121 inValuesVector << 1.0, 2.0, 3.0, 4.0;
122
123 // Create corresponding gradient data (all gradient values = const = 1)
124 Eigen::MatrixXd inGradientsScalar(dimensions, 2);
125 Eigen::MatrixXd inGradientsVector(dimensions, 4);
126
127 inGradientsScalar.col(0) << 2.0, 3.0;
128 inGradientsScalar.col(1) << 2.0, 3.0;
129
130 inGradientsVector.col(0) << 2.0, 3.0;
131 inGradientsVector.col(1) << 4.0, 5.0;
132 inGradientsVector.col(2) << 2.0, 3.0;
133 inGradientsVector.col(3) << 4.0, 5.0;
134
135 // Create mesh to map to
136 PtrMesh outMesh(new Mesh("OutMesh", dimensions, testing::nextMeshID()));
137 outMesh->createVertex(Eigen::Vector2d::Constant(0.1));
138 outMesh->createVertex(Eigen::Vector2d::Constant(1.1));
139
140 // Setup mapping with mapping coordinates and geometry used
142 mapping.setMeshes(inMesh, outMesh);
143 BOOST_TEST(mapping.hasComputedMapping() == false);
144
145 mapping.computeMapping();
146 Eigen::VectorXd outValuesScalar = Eigen::VectorXd::Zero(2);
147 time::Sample inSampleScalar(1, inValuesScalar, inGradientsScalar);
148 mapping.map(inSampleScalar, outValuesScalar);
149 BOOST_TEST(mapping.hasComputedMapping() == true);
150
151 BOOST_TEST(outValuesScalar(0) == inValuesScalar(0) + 0.5);
152 BOOST_TEST(outValuesScalar(1) == inValuesScalar(1) + 0.5);
153
154 Eigen::VectorXd outValuesVector = Eigen::VectorXd::Zero(4);
155 time::Sample inSampleVector(2, inValuesVector, inGradientsVector);
156 mapping.map(inSampleVector, outValuesVector);
157 Eigen::Vector4d expected(1.5, 2.9, 3.5, 4.9);
158 BOOST_CHECK(equals(expected, outValuesVector));
159}
160
BOOST_AUTO_TEST_CASE(testIQNIMVJPPWithSubsteps)
boost::test_tools::predicate_result equals(const std::vector< float > &VectorA, const std::vector< float > &VectorB, float tolerance)
equals to be used in tests. Compares two std::vectors using a given tolerance. Prints both operands o...
Definition Testing.cpp:93
BOOST_AUTO_TEST_SUITE(PreProcess)
BOOST_AUTO_TEST_SUITE_END()
#define PRECICE_TEST()
Definition Testing.hpp:39
#define PRECICE_TEST_SETUP(...)
Creates and attaches a TestSetup to a Boost test case.
Definition Testing.hpp:29
Mapping using nearest neighboring vertices and their local gradient values.
Container and creator for meshes.
Definition Mesh.hpp:38
Vertex & createVertex(const Eigen::Ref< const Eigen::VectorXd > &coords)
Creates and initializes a Vertex object.
Definition Mesh.cpp:105
Vertex of a mesh.
Definition Vertex.hpp:16
void setCoords(const VECTOR_T &coordinates)
Sets the coordinates of the vertex.
Definition Vertex.hpp:101
Eigen::VectorXd getCoords() const
Returns the coordinates of the vertex.
Definition Vertex.hpp:114
contains data mapping from points to meshes.
provides Mesh, Data and primitives.
std::shared_ptr< Mesh > PtrMesh
boost::test_tools::predicate_result equals(const std::vector< float > &VectorA, const std::vector< float > &VectorB, float tolerance)
equals to be used in tests. Compares two std::vectors using a given tolerance. Prints both operands o...
Definition Testing.cpp:93
Main namespace of the precice library.