57 Eigen::VectorXd inValues(3);
58 inValues = Eigen::VectorXd::Constant(inValues.size(), value);
59 Eigen::VectorXd values(2);
60 values = Eigen::VectorXd::Constant(values.size(), 0.0);
65 mapping.
map(inSample, values);
66 BOOST_TEST_CONTEXT(*inMesh)
68 BOOST_TEST(values(0) == value * 1.5);
69 BOOST_TEST(values(1) == value * 1.5);
81 Eigen::VectorXd inValues(3);
82 inValues = Eigen::VectorXd::Constant(inValues.size(), value);
83 Eigen::VectorXd values(2);
84 values = Eigen::VectorXd::Constant(values.size(), 0.0);
89 mapping.
map(inSample, values);
90 BOOST_TEST_CONTEXT(*inMesh)
92 BOOST_TEST(values(0) == value * 2.0);
93 BOOST_TEST(values(1) == value * 1.0);
98 values = Eigen::VectorXd::Constant(values.size(), 0.0);
100 mapping.
map(inSample, values);
101 BOOST_TEST_CONTEXT(*inMesh)
103 BOOST_TEST(values(0) == value * 2.0);
104 BOOST_TEST(values(1) == value * 1.0);
113 using namespace mesh;
121 double valueVertex1 = 1.0;
122 double valueVertex2 = 2.0;
123 Eigen::VectorXd inValues(2);
124 inValues(0) = valueVertex1;
125 inValues(1) = valueVertex2;
142 Eigen::VectorXd outValues = Eigen::VectorXd::Zero(3);
144 mapping.
map(inSample, outValues);
148 BOOST_TEST(outValues(0) == (valueVertex1 + valueVertex2) * 0.5);
149 BOOST_TEST(outValues(1) == valueVertex1);
150 BOOST_TEST(outValues(2) == valueVertex2);
154 outValues = Eigen::VectorXd::Constant(outValues.size(), 0.0);
156 mapping.
map(inSample, outValues);
157 BOOST_TEST(outValues(0) == (valueVertex1 + valueVertex2) * 0.5);
158 BOOST_TEST(outValues(1) == valueVertex1);
159 BOOST_TEST(outValues(2) == valueVertex2);
176 Eigen::VectorXd outValues = Eigen::VectorXd::Zero(3);
177 outValues = Eigen::VectorXd::Constant(outValues.size(), 0.0);
181 mapping.
map(inSample, outValues);
182 BOOST_TEST(outValues(0) == valueVertex1);
183 BOOST_TEST(outValues(1) == valueVertex2);
184 BOOST_TEST(outValues(2) == (valueVertex1 + valueVertex2) * 0.5);
188 outValues = Eigen::VectorXd::Constant(outValues.size(), 0.0);
190 mapping.
map(inSample, outValues);
191 BOOST_TEST(outValues(0) == valueVertex1);
192 BOOST_TEST(outValues(1) == valueVertex2);
193 BOOST_TEST(outValues(2) == (valueVertex1 + valueVertex2) * 0.5);
201 using namespace mesh;
209 double valueVertex1 = 1.0;
210 double valueVertex2 = 2.0;
211 Eigen::VectorXd inValues(2);
212 inValues(0) = valueVertex1;
213 inValues(1) = valueVertex2;
218 Eigen::VectorXd outValues(3);
232 outValues = Eigen::VectorXd::Constant(outValues.size(), 0.0);
238 mapping.
map(inSample, outValues);
241 double scaleFactor = outValues(1) / inValues(0);
242 BOOST_TEST(scaleFactor != 1.0);
246 for (
int dim = 0; dim < inputIntegral.size(); ++dim) {
247 BOOST_TEST(inputIntegral(dim) == outputIntegral(dim));
249 BOOST_TEST(outValues(0) == (inValues(0) + inValues(1)) * 0.5 * scaleFactor);
250 BOOST_TEST(outValues(1) == inValues(0) * scaleFactor);
251 BOOST_TEST(outValues(2) == inValues(1) * scaleFactor);
258 using namespace mesh;
266 double valueVertex1 = 1.0;
267 double valueVertex2 = 2.0;
268 Eigen::VectorXd inValues(2);
269 inValues(0) = valueVertex1;
270 inValues(1) = valueVertex2;
276 Eigen::VectorXd outValues(3);
289 outValues = Eigen::VectorXd::Constant(outValues.size(), 0.0);
293 mapping.
map(inSample, outValues);
296 double scaleFactor = outValues(0) / inValues(0);
297 BOOST_TEST(scaleFactor != 1.0);
301 for (
int dim = 0; dim < inputIntegral.size(); ++dim) {
302 BOOST_TEST(inputIntegral(dim) == outputIntegral(dim));
304 BOOST_TEST(outValues(0) == inValues(0) * scaleFactor);
305 BOOST_TEST(outValues(1) == inValues(1) * scaleFactor);
306 BOOST_TEST(outValues(2) == (inValues(0) + inValues(1)) * 0.5 * scaleFactor);
313 using namespace mesh;
325 double valueVertex1 = 1.0;
326 double valueVertex2 = 2.0;
327 double valueVertex3 = 3.0;
328 Eigen::VectorXd values(3);
329 values(0) = valueVertex1;
330 values(1) = valueVertex2;
331 values(2) = valueVertex3;
345 Eigen::VectorXd outValues = Eigen::VectorXd::Zero(3);
349 mapping.
map(inSample, outValues);
353 BOOST_TEST_CONTEXT(*inMesh)
355 BOOST_TEST(outValues(0) == (valueVertex1 + valueVertex2) * 0.5);
356 BOOST_TEST(outValues(1) == (valueVertex1 + valueVertex3) * 0.5);
357 BOOST_TEST(outValues(2) == (valueVertex2 + valueVertex3) * 0.5);
365 using namespace mesh;
374 double valueVertex1 = 1.0;
375 double valueVertex2 = 2.0;
376 double valueVertex3 = 3.0;
377 Eigen::VectorXd values(3);
378 values(0) = valueVertex1;
379 values(1) = valueVertex2;
380 values(2) = valueVertex3;
395 Eigen::VectorXd outValues = Eigen::VectorXd::Zero(3);
398 mapping.
map(inSample, outValues);
402 BOOST_TEST_CONTEXT(*inMesh)
404 BOOST_TEST(outValues(0) == valueVertex1);
405 BOOST_TEST(outValues(1) == valueVertex2);
406 BOOST_TEST(outValues(2) == valueVertex3);
415 constexpr int dimensions = 3;
432 Eigen::VectorXd inValues = Eigen::VectorXd::Zero(4);
433 inValues << 1.0, 1.0, 1.0, 1.0;
439 Eigen::VectorXd outValues = Eigen::VectorXd::Zero(2);
440 outValues << 0.0, 0.0;
449 BOOST_TEST_INFO(
"In Data:" << inValues);
450 BOOST_TEST_INFO(
"Out Data before Mapping:" << outValues);
452 mapping.
map(inSample, outValues);
453 BOOST_TEST_INFO(
"Out Data after Mapping:" << outValues);
454 BOOST_TEST(outValues == outValues.cwiseAbs());
462 constexpr int dimensions = 3;
466 const double z1 = 0.1;
467 const double z2 = -0.1;
468 auto &v00 = inMesh->
createVertex(Eigen::Vector3d(0, 0, 0));
469 auto &v01 = inMesh->
createVertex(Eigen::Vector3d(0, 1, 0));
470 auto &v10 = inMesh->
createVertex(Eigen::Vector3d(1, 0, z1));
471 auto &v11 = inMesh->
createVertex(Eigen::Vector3d(1, 1, z1));
472 auto &v20 = inMesh->
createVertex(Eigen::Vector3d(2, 0, z2));
473 auto &v21 = inMesh->
createVertex(Eigen::Vector3d(2, 1, z2));
489 Eigen::VectorXd inValues = Eigen::VectorXd::Constant(6, 1.0);
494 Eigen::VectorXd outValues = Eigen::VectorXd::Constant(1, 0.0);
504 BOOST_TEST_INFO(
"In Data:" << inValues);
505 BOOST_TEST_INFO(
"Out Data before Mapping:" << outValues);
507 mapping.
map(inSample, outValues);
508 BOOST_TEST_INFO(
"Out Data after Mapping:" << outValues);
509 BOOST_TEST(outValues(0) == 1.0);
517 constexpr int dimensions = 3;
520 const double z1 = 0.1;
521 const double z2 = -0.1;
522 auto &v00 = inMesh->
createVertex(Eigen::Vector3d(0, 0, 0));
523 auto &v01 = inMesh->
createVertex(Eigen::Vector3d(0, 1, 0));
524 auto &v10 = inMesh->
createVertex(Eigen::Vector3d(1, 0, z1));
525 auto &v11 = inMesh->
createVertex(Eigen::Vector3d(1, 1, z1));
526 auto &v20 = inMesh->
createVertex(Eigen::Vector3d(2, 0, z2));
527 auto &v21 = inMesh->
createVertex(Eigen::Vector3d(2, 1, z2));
543 Eigen::VectorXd inValues = Eigen::VectorXd::Constant(6, 1.0);
546 auto &outV1 = outMesh->
createVertex(Eigen::Vector3d{0.7, 0.5, 0.0});
547 auto &outV2 = outMesh->
createVertex(Eigen::Vector3d{0.5, 0.0, 0.05});
548 auto &outV3 = outMesh->
createVertex(Eigen::Vector3d{0.5, 0.0, 0.0});
549 auto &outE1 = outMesh->
createEdge(outV1, outV2);
550 auto &outE2 = outMesh->
createEdge(outV2, outV3);
551 auto &outE3 = outMesh->
createEdge(outV1, outV3);
553 Eigen::VectorXd outValues = Eigen::VectorXd::Constant(3, 0.0);
564 mapping.
map(inSample, outValues);
569 for (
int dim = 0; dim < inputIntegral.size(); ++dim) {
570 BOOST_TEST(inputIntegral(dim) == outputIntegral(dim));
580 mapping.setMeshes(inMesh, outMesh);
581 BOOST_REQUIRE(mapping.hasComputedMapping() ==
false);
582 mapping.computeMapping();
583 BOOST_REQUIRE(mapping.hasComputedMapping() ==
true);
585 mapping.map(inSample, *outData);
603 constexpr int dimensions = 3;
607 auto &vc0 = inMesh->
createVertex(Eigen::Vector3d(3, 0, 0));
608 auto &vc1 = inMesh->
createVertex(Eigen::Vector3d(3, 2, 0));
609 auto &vc2 = inMesh->
createVertex(Eigen::Vector3d(4, 1, 0));
610 makeTriangle(inMesh, vc0, vc1, vc2);
613 auto &vf0 = inMesh->
createVertex(Eigen::Vector3d(0, 0, -1));
614 auto &vf1 = inMesh->
createVertex(Eigen::Vector3d(0, 2, -1));
615 auto &vf2 = inMesh->
createVertex(Eigen::Vector3d(0, 1, 1));
616 makeTriangle(inMesh, vf0, vf1, vf2);
618 Eigen::VectorXd inValues(5);
619 inValues << 0, 0, 0, 1, 1;
623 Eigen::VectorXd outValues = Eigen::VectorXd::Constant(1, 0.0);
628 BOOST_TEST(values(0) == 0.0);
639 auto &vf0 = inMesh->
createVertex(Eigen::Vector3d(0, 0, -1));
640 auto &vf1 = inMesh->
createVertex(Eigen::Vector3d(0, 1, 1));
641 auto &vf2 = inMesh->
createVertex(Eigen::Vector3d(0, 2, -1));
642 makeTriangle(inMesh, vf0, vf1, vf2);
645 auto &vc0 = inMesh->
createVertex(Eigen::Vector3d(3, 0, 0));
646 auto &vc1 = inMesh->
createVertex(Eigen::Vector3d(3, 2, 0));
647 auto &vc2 = inMesh->
createVertex(Eigen::Vector3d(4, 1, 0));
648 makeTriangle(inMesh, vc0, vc1, vc2);
650 Eigen::VectorXd inValues(6);
651 inValues << 1, 1, 1, 0, 0, 0;
655 Eigen::VectorXd outValues = Eigen::VectorXd::Constant(1, 0.0);
659 BOOST_TEST(values(0) == 1.0);
667 constexpr int dimensions = 3;
671 auto &vc0 = inMesh->
createVertex(Eigen::Vector3d(0, 0, 0));
672 auto &vc1 = inMesh->
createVertex(Eigen::Vector3d(0, 2, 0));
676 auto &vf0 = inMesh->
createVertex(Eigen::Vector3d(3, 0, 0));
677 auto &vf1 = inMesh->
createVertex(Eigen::Vector3d(3, 2, 2));
678 auto &vf2 = inMesh->
createVertex(Eigen::Vector3d(3, 1, 0));
679 makeTriangle(inMesh, vf0, vf1, vf2);
681 Eigen::VectorXd inValues(5);
682 inValues << 0, 1, 2, 2, 2;
686 Eigen::VectorXd outValues = Eigen::VectorXd::Constant(1, 0.0);
692 BOOST_TEST(values(0) == 0.5);
700 constexpr int dimensions = 3;
705 auto &vc0 = inMesh->
createVertex(Eigen::Vector3d(0, 0, 0));
706 auto &vc1 = inMesh->
createVertex(Eigen::Vector3d(0, 2, 2));
707 auto &vc2 = inMesh->
createVertex(Eigen::Vector3d(0, 1, 0));
708 makeTriangle(inMesh, vc0, vc1, vc2);
711 auto &vf0 = inMesh->
createVertex(Eigen::Vector3d(3, 0, 0));
712 auto &vf1 = inMesh->
createVertex(Eigen::Vector3d(3, 2, 2));
713 auto &vf2 = inMesh->
createVertex(Eigen::Vector3d(3, 1, 0));
714 makeTriangle(inMesh, vf0, vf1, vf2);
716 Eigen::VectorXd inValues(6);
717 inValues << 1, 1, 1, 0, 0, 0;
721 Eigen::VectorXd outValues = Eigen::VectorXd::Constant(1, 0.0);
725 BOOST_TEST(values(0) == 1.0);
BOOST_AUTO_TEST_SUITE(PreProcess)
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(testConservativeNonIncremental)
#define PRECICE_TEST_SETUP(...)
Creates and attaches a TestSetup to a Boost test case.
Constraint
Specifies additional constraints for a mapping.
@ SCALED_CONSISTENT_SURFACE
void setMeshes(const mesh::PtrMesh &input, const mesh::PtrMesh &output)
Sets input and output meshes carrying data to be mapped.
bool hasComputedMapping() const
Returns true, if the mapping has been computed.
void map(int inputDataID, int outputDataID)
Mapping using orthogonal projection to nearest triangle/edge/vertex and linear interpolation from pro...
void computeMapping() final override
Computes the projections and interpolation relations.
Linear edge of a mesh, defined by two Vertex objects.
Container and creator for meshes.
Triangle & createTriangle(Edge &edgeOne, Edge &edgeTwo, Edge &edgeThree)
Creates and initializes a Triangle object.
int getDimensions() const
Edge & createEdge(Vertex &vertexOne, Vertex &vertexTwo)
Creates and initializes an Edge object.
Vertex & createVertex(const Eigen::Ref< const Eigen::VectorXd > &coords)
Creates and initializes a Vertex object.
void allocateDataValues()
Allocates memory for the vertex data values and corresponding gradient values.
provides Mesh, Data and primitives.
Eigen::VectorXd integrateSurface(const PtrMesh &mesh, const Eigen::VectorXd &input)
Given the data and the mesh, this function returns the surface integral. Assumes no overlap exists fo...
Main namespace of the precice library.