1#ifndef PRECICE_NO_PETSC
22#include "precice/impl/versions.hpp"
40 v.setGlobalIndex(v.getID() + offset);
49 for (
int dim = 0; dim < inputIntegral.size(); ++dim) {
50 BOOST_TEST(inputIntegral(dim) == outputIntegral(dim));
63 const Eigen::Map<const Eigen::VectorXd>
asEigen()
const
63 const Eigen::Map<const Eigen::VectorXd>
asEigen()
const {
…}
94 int globalIndexOffset = 0)
99 for (
auto &vertex : vertices) {
100 if (vertex.rank == context.
rank or vertex.rank == -1) {
101 if (vertex.position.size() == 3)
102 mesh->
createVertex(Eigen::Vector3d(vertex.position.data()));
103 else if (vertex.position.size() == 2)
104 mesh->
createVertex(Eigen::Vector2d(vertex.position.data()));
106 int valueDimension = vertex.value.size();
108 if (vertex.owner == context.
rank)
113 d.conservativeResize(i * valueDimension + valueDimension);
115 for (
int dim = 0; dim < valueDimension; ++dim) {
116 d(i * valueDimension + dim) = vertex.value.at(dim);
131 int inGlobalIndexOffset = 0)
133 int meshDimension = inMeshSpec.at(0).position.size();
134 int valueDimension = inMeshSpec.at(0).value.size();
138 int inDataID = inData->
getID();
144 int outDataID = outData->
getID();
153 Eigen::VectorXd guess;
158 for (
auto run : {1, 2, 3, 4}) {
165 mapping.
map(inDataID, outDataID, guess);
168 for (
auto &referenceVertex : referenceSpec) {
169 if (referenceVertex.first == context.
rank or referenceVertex.first == -1) {
170 for (
int dim = 0; dim < valueDimension; ++dim) {
171 BOOST_TEST_INFO(
"Index of vertex: " <<
index <<
" - Dimension: " << dim);
172 BOOST_TEST(outData->
values()(
index * valueDimension + dim) == referenceVertex.second.at(dim));
177 BOOST_TEST(outData->
values().size() ==
index * valueDimension);
191 {-1, 0, {0, 0}, {1}},
192 {-1, 0, {0, 1}, {2}},
193 {-1, 1, {1, 0}, {3}},
194 {-1, 1, {1, 1}, {4}},
195 {-1, 2, {2, 0}, {5}},
196 {-1, 2, {2, 1}, {6}},
197 {-1, 3, {3, 0}, {7}},
198 {-1, 3, {3, 1}, {8}}},
200 {0, -1, {0, 0}, {0}},
201 {0, -1, {0, 1}, {0}},
202 {1, -1, {1, 0}, {0}},
203 {1, -1, {1, 1}, {0}},
204 {2, -1, {2, 0}, {0}},
205 {2, -1, {2, 1}, {0}},
206 {3, -1, {3, 0}, {0}},
207 {3, -1, {3, 1}, {0}}},
228 {-1, 0, {0, 0}, {1, 4}},
229 {-1, 0, {0, 1}, {2, 5}},
230 {-1, 1, {1, 0}, {3, 6}},
231 {-1, 1, {1, 1}, {4, 7}},
232 {-1, 2, {2, 0}, {5, 8}},
233 {-1, 2, {2, 1}, {6, 9}},
234 {-1, 3, {3, 0}, {7, 10}},
235 {-1, 3, {3, 1}, {8, 11}}},
237 {0, -1, {0, 0}, {0, 0}},
238 {0, -1, {0, 1}, {0, 0}},
239 {1, -1, {1, 0}, {0, 0}},
240 {1, -1, {1, 1}, {0, 0}},
241 {2, -1, {2, 0}, {0, 0}},
242 {2, -1, {2, 1}, {0, 0}},
243 {3, -1, {3, 0}, {0, 0}},
244 {3, -1, {3, 1}, {0, 0}}},
266 {-1, 0, {0, 0}, {1}},
267 {-1, 0, {0, 1}, {2}},
268 {-1, 1, {1, 0}, {3}},
269 {-1, 1, {1, 1}, {4}},
270 {-1, 1, {2, 0}, {5}},
271 {-1, 3, {2, 1}, {6}},
272 {-1, 3, {3, 0}, {7}},
273 {-1, 3, {3, 1}, {8}}},
275 {0, -1, {0, 0}, {0}},
276 {0, -1, {0, 1}, {0}},
277 {0, -1, {1, 0}, {0}},
278 {2, -1, {1, 1}, {0}},
279 {2, -1, {2, 0}, {0}},
280 {2, -1, {2, 1}, {0}},
281 {3, -1, {3, 0}, {0}},
282 {3, -1, {3, 1}, {0}}},
311 {0, -1, {1, 1}, {4}},
312 {0, -1, {2, 0}, {5}},
313 {0, -1, {2, 1}, {6}},
316 {2, -1, {0, 0}, {1}},
317 {2, -1, {0, 1}, {2}},
318 {2, -1, {1, 0}, {3}},
320 {2, -1, {2, 0}, {5}},
322 {2, -1, {3, 0}, {7}},
323 {2, -1, {3, 1}, {8}},
326 {3, -1, {2, 1}, {6}},
331 {0, -1, {0, 0}, {0}},
332 {0, -1, {0, 1}, {0}},
333 {0, -1, {1, 0}, {0}},
334 {2, -1, {1, 1}, {0}},
335 {2, -1, {2, 0}, {0}},
336 {2, -1, {2, 1}, {0}},
337 {3, -1, {3, 0}, {0}},
338 {3, -1, {3, 1}, {0}}},
349 globalIndexOffsets.at(context.rank));
365 {0, 0, {0, 0}, {1, 4}},
366 {0, 0, {0, 1}, {2, 5}},
367 {0, 0, {1, 0}, {3, 6}},
368 {0, -1, {1, 1}, {4, 7}},
369 {0, -1, {2, 0}, {5, 8}},
370 {0, -1, {2, 1}, {6, 9}},
373 {2, -1, {0, 0}, {1, 4}},
374 {2, -1, {0, 1}, {2, 5}},
375 {2, -1, {1, 0}, {3, 6}},
376 {2, 2, {1, 1}, {4, 7}},
377 {2, -1, {2, 0}, {5, 8}},
378 {2, 2, {2, 1}, {6, 9}},
379 {2, -1, {3, 0}, {7, 10}},
380 {2, -1, {3, 1}, {8, 11}},
382 {3, 3, {2, 0}, {5, 8}},
383 {3, -1, {2, 1}, {6, 9}},
384 {3, 3, {3, 0}, {7, 10}},
385 {3, 3, {3, 1}, {8, 11}},
388 {0, -1, {0, 0}, {0, 0}},
389 {0, -1, {0, 1}, {0, 0}},
390 {0, -1, {1, 0}, {0, 0}},
391 {2, -1, {1, 1}, {0, 0}},
392 {2, -1, {2, 0}, {0, 0}},
393 {2, -1, {2, 1}, {0, 0}},
394 {3, -1, {3, 0}, {0, 0}},
395 {3, -1, {3, 1}, {0, 0}}},
406 globalIndexOffsets.at(context.rank));
423 {1, 1, {0, 0}, {1.1}},
424 {1, 1, {0, 1}, {2.5}},
427 {1, -1, {2, 0}, {5}},
428 {1, -1, {2, 1}, {6}},
429 {1, -1, {3, 0}, {7}},
430 {1, -1, {3, 1}, {8}},
432 {2, -1, {0, 0}, {1.1}},
433 {2, -1, {0, 1}, {2.5}},
434 {2, -1, {1, 0}, {3}},
435 {2, -1, {1, 1}, {4}},
444 {1, -1, {2, 0}, {0}},
445 {1, -1, {1, 0}, {0}},
446 {1, -1, {0, 1}, {0}},
447 {1, -1, {1, 1}, {0}},
448 {1, -1, {0, 0}, {0}},
449 {2, -1, {2, 0}, {0}},
450 {2, -1, {2, 1}, {0}},
451 {2, -1, {3, 0}, {0}},
452 {2, -1, {3, 1}, {0}}},
462 globalIndexOffsets.at(context.rank));
478 {0, 0, {0, 0}, {1.1}},
479 {0, 0, {0, 1}, {2.5}},
480 {0, -1, {1, 0}, {3}},
481 {0, -1, {1, 1}, {4}},
482 {0, -1, {2, 0}, {5}},
483 {0, -1, {2, 1}, {6}},
484 {0, -1, {3, 0}, {7}},
485 {0, -1, {3, 1}, {8}},
486 {1, -1, {0, 0}, {1.1}},
487 {1, -1, {0, 1}, {2.5}},
490 {1, -1, {2, 0}, {5}},
491 {1, -1, {2, 1}, {6}},
492 {1, -1, {3, 0}, {7}},
493 {1, -1, {3, 1}, {8}},
494 {2, -1, {0, 0}, {1.1}},
495 {2, -1, {0, 1}, {2.5}},
496 {2, -1, {1, 0}, {3}},
497 {2, -1, {1, 1}, {4}},
500 {2, -1, {3, 0}, {7}},
501 {2, -1, {3, 1}, {8}},
502 {3, -1, {0, 0}, {1.1}},
503 {3, -1, {0, 1}, {2.5}},
504 {3, -1, {1, 0}, {3}},
505 {3, -1, {1, 1}, {4}},
506 {3, -1, {2, 0}, {5}},
507 {3, -1, {2, 1}, {6}},
513 {1, -1, {2, 0}, {0}},
514 {1, -1, {1, 0}, {0}},
515 {1, -1, {0, 1}, {0}},
516 {1, -1, {1, 1}, {0}},
517 {1, -1, {0, 0}, {0}},
518 {2, -1, {2, 0}, {0}},
519 {2, -1, {2, 1}, {0}},
520 {2, -1, {3, 0}, {0}},
521 {2, -1, {3, 1}, {0}}},
531 globalIndexOffsets.at(context.rank));
537 *boost::unit_test::tolerance(1e-7))
553 {1, -1, {2, 0}, {5}},
554 {1, -1, {2, 1}, {6}},
555 {1, -1, {3, 0}, {7}},
556 {1, -1, {3, 1}, {8}},
558 {2, -1, {0, 0}, {1}},
559 {2, -1, {0, 1}, {2}},
560 {2, -1, {1, 0}, {3}},
561 {2, -1, {1, 1}, {4}},
570 {1, -1, {2, 0}, {0}},
571 {1, -1, {1, 0}, {0}},
572 {1, -1, {0, 1}, {0}},
573 {1, -1, {1, 1}, {0}},
574 {1, -1, {0, 0}, {0}},
575 {2, -1, {2, 0}, {0}},
576 {2, -1, {2, 1}, {0}},
577 {2, -1, {3, 0}, {0}},
578 {2, -1, {3, 1}, {0}}},
588 globalIndexOffsets.at(context.rank));
601 {0, -1, {0, 0}, {1}},
602 {0, -1, {0, 1}, {2}},
603 {1, -1, {1, 0}, {3}},
604 {1, -1, {1, 1}, {4}},
605 {2, -1, {2, 0}, {5}},
606 {2, -1, {2, 1}, {6}},
607 {3, -1, {3, 0}, {7}},
608 {3, -1, {3, 1}, {8}}},
610 {-1, 0, {0, 0}, {0}},
611 {-1, 0, {0, 1}, {0}},
612 {-1, 1, {1, 0}, {0}},
613 {-1, 1, {1, 1}, {0}},
614 {-1, 2, {2, 0}, {0}},
615 {-1, 2, {2, 1}, {0}},
616 {-1, 3, {3, 0}, {0}},
617 {-1, 3, {3, 1}, {0}}},
665 {0, -1, {0, 0}, {1, 4}},
666 {0, -1, {0, 1}, {2, 5}},
667 {1, -1, {1, 0}, {3, 6}},
668 {1, -1, {1, 1}, {4, 7}},
669 {2, -1, {2, 0}, {5, 8}},
670 {2, -1, {2, 1}, {6, 9}},
671 {3, -1, {3, 0}, {7, 10}},
672 {3, -1, {3, 1}, {8, 11}}},
674 {-1, 0, {0, 0}, {0, 0}},
675 {-1, 0, {0, 1}, {0, 0}},
676 {-1, 1, {1, 0}, {0, 0}},
677 {-1, 1, {1, 1}, {0, 0}},
678 {-1, 2, {2, 0}, {0, 0}},
679 {-1, 2, {2, 1}, {0, 0}},
680 {-1, 3, {3, 0}, {0, 0}},
681 {-1, 3, {3, 1}, {0, 0}}},
731 {1, -1, {0, 0}, {1}},
732 {1, -1, {0, 1}, {2}},
733 {1, -1, {1, 0}, {3}},
734 {1, -1, {1, 1}, {4}},
735 {2, -1, {2, 0}, {5}},
736 {2, -1, {2, 1}, {6}},
737 {3, -1, {3, 0}, {7}},
738 {3, -1, {3, 1}, {8}}},
740 {-1, 1, {0, 0}, {0}},
741 {-1, 1, {0, 1}, {0}},
742 {-1, 1, {1, 0}, {0}},
743 {-1, 1, {1, 1}, {0}},
744 {-1, 2, {2, 0}, {0}},
745 {-1, 2, {2, 1}, {0}},
746 {-1, 3, {3, 0}, {0}},
747 {-1, 3, {3, 1}, {0}}},
782 globalIndexOffsets.at(context.rank));
797 {1, -1, {0, 0}, {1}},
798 {1, -1, {1, 0}, {3}},
799 {1, -1, {1, 1}, {4}},
800 {2, -1, {2, 0}, {5}},
801 {2, -1, {2, 1}, {6}},
802 {3, -1, {3, 0}, {7}},
803 {3, -1, {3, 1}, {8}}},
805 {-1, 1, {0, 0}, {0}},
806 {-1, 1, {0, 1}, {0}},
807 {-1, 1, {1, 0}, {0}},
808 {-1, 1, {1, 1}, {0}},
809 {-1, 2, {2, 0}, {0}},
810 {-1, 2, {2, 1}, {0}},
811 {-1, 3, {3, 0}, {0}},
812 {-1, 3, {3, 1}, {0}}},
847 globalIndexOffsets.at(context.rank));
853 *boost::unit_test::tolerance(1e-6))
863 {0, -1, {0, 0}, {1}},
864 {0, -1, {0, 1}, {2}},
865 {1, -1, {1, 0}, {3}},
866 {1, -1, {1, 1}, {4}},
867 {2, -1, {2, 0}, {5}},
868 {2, -1, {2, 1}, {6}},
869 {3, -1, {3, 0}, {7}},
870 {3, -1, {3, 1}, {8}}},
872 {-1, 1, {0, 1}, {0}},
873 {-1, 1, {1, 0}, {0}},
874 {-1, 1, {1, 1}, {0}},
875 {-1, 2, {2, 0}, {0}},
876 {-1, 2, {2, 1}, {0}},
877 {-1, 3, {3, 0}, {0}},
878 {-1, 3, {3, 1}, {0}}},
888 {1, {2.4285714526861519}},
909 globalIndexOffsets.at(context.rank));
922 {0, -1, {0, 0}, {1}},
923 {0, -1, {0, 1}, {2}},
924 {1, -1, {1, 0}, {3}},
925 {1, -1, {1, 1}, {4}},
926 {2, -1, {2, 0}, {5}},
927 {2, -1, {2, 1}, {6}},
928 {3, -1, {3, 0}, {7}},
929 {3, -1, {3, 1}, {8}}},
931 {-1, 0, {0, 0}, {0}},
932 {-1, 1, {0, 1}, {0}},
933 {-1, 1, {1, 0}, {0}},
934 {-1, 0, {1, 1}, {0}},
935 {-1, 2, {2, 0}, {0}},
936 {-1, 2, {2, 1}, {0}},
937 {-1, 3, {3, 0}, {0}},
938 {-1, 3, {3, 1}, {0}}},
986 {0, -1, {0, 0}, {1, 4}},
987 {0, -1, {0, 1}, {2, 5}},
988 {1, -1, {1, 0}, {3, 6}},
989 {1, -1, {1, 1}, {4, 7}},
990 {2, -1, {2, 0}, {5, 8}},
991 {2, -1, {2, 1}, {6, 9}},
992 {3, -1, {3, 0}, {7, 10}},
993 {3, -1, {3, 1}, {8, 11}}},
995 {-1, 0, {0, 0}, {0, 0}},
996 {-1, 1, {0, 1}, {0, 0}},
997 {-1, 1, {1, 0}, {0, 0}},
998 {-1, 0, {1, 1}, {0, 0}},
999 {-1, 2, {2, 0}, {0, 0}},
1000 {-1, 2, {2, 1}, {0, 0}},
1001 {-1, 3, {3, 0}, {0, 0}},
1002 {-1, 3, {3, 1}, {0, 0}}},
1047 int meshDimension = inMeshSpec.at(0).position.size();
1048 int valueDimension = inMeshSpec.at(0).value.size();
1057 BOOST_TEST_MESSAGE(
"Mesh sizes in: " << inMesh->
nVertices() <<
" out: " << outMesh->
nVertices());
1060 BOOST_TEST_MESSAGE(
"Basis function has support radius " << fct.
getSupportRadius());
1069 mapping.setMeshes(inMesh, outMesh);
1070 mapping.tagMeshFirstRound();
1072 const auto &taggedMesh = consistent ? inMesh : outMesh;
1076 for (
const auto &vspec : shouldTagFirstRound) {
1077 expectedFirst.
emplace(vspec.asEigen());
1080 for (
const auto &v : taggedMesh->vertices()) {
1081 bool found = expectedFirst.
count(v.getCoords()) != 0;
1082 BOOST_TEST((!found || v.isTagged()),
1083 "FirstRound: Vertex " << v <<
" is tagged, but should not be.");
1084 BOOST_TEST((found || !v.isTagged()),
1085 "FirstRound: Vertex " << v <<
" is not tagged, but should be.");
1090 expectedFirst.
begin(), expectedFirst.
end());
1091 for (
const auto &vspec : shouldTagSecondRound) {
1092 expectedSecond.
emplace(vspec.asEigen());
1095 mapping.tagMeshSecondRound();
1097 for (
const auto &v : taggedMesh->vertices()) {
1098 bool found = expectedSecond.
count(v.getCoords()) != 0;
1099 BOOST_TEST((!found || v.isTagged()),
1100 "SecondRound: Vertex " << v <<
" is tagged, but should not be.");
1101 BOOST_TEST((found || !v.isTagged()),
1102 "SecondRound: Vertex " << v <<
" is not tagged, but should be.");
1116 {0, -1, {0, 0}, {0}}};
1118 {0, -1, {-1, 0}, {1}},
1119 {0, -1, {-2, 0}, {1}},
1120 {0, 0, {1, 0}, {1}},
1121 {0, -1, {2, 0}, {1}},
1122 {0, -1, {0, -1}, {1}},
1123 {0, -1, {0, -2}, {1}},
1124 {0, -1, {0, 1}, {1}},
1125 {0, -1, {0, 2}, {1}}
1128 {0, -1, {-1, 0}, {1}},
1129 {0, -1, {1, 0}, {1}},
1130 {0, -1, {0, -1}, {1}},
1131 {0, -1, {0, 1}, {1}}};
1133 {0, -1, {2, 0}, {1}}};
1134 testTagging(context, inMeshSpec, outMeshSpec, shouldTagFirstRound, shouldTagSecondRound,
true);
1147 {0, -1, {0, 0}, {0}}};
1149 {0, -1, {-1, 0}, {1}},
1150 {0, -1, {-2, 0}, {1}},
1151 {0, 0, {1, 0}, {1}},
1152 {0, -1, {2, 0}, {1}},
1153 {0, -1, {0, -1}, {1}},
1154 {0, -1, {0, -2}, {1}},
1155 {0, -1, {0, 1}, {1}},
1156 {0, -1, {0, 2}, {1}}
1159 {0, -1, {0, 0}, {1}}};
1161 {0, -1, {0, 0}, {1}}};
1162 testTagging(context, inMeshSpec, outMeshSpec, shouldTagFirstRound, shouldTagSecondRound,
false);
1172 using Eigen::Vector2d;
1177 int inDataID = inData->
getID();
1185 auto &values = inData->
values();
1186 values << 1.0, 2.0, 2.0, 1.0;
1191 int outDataID = outData->
getID();
1197 mapping.setMeshes(inMesh, outMesh);
1198 BOOST_TEST(mapping.hasComputedMapping() ==
false);
1201 mapping.computeMapping();
1202 Eigen::VectorXd guess;
1203 mapping.map(inDataID, outDataID, guess);
1204 double value = outData->
values()(0);
1205 BOOST_TEST(mapping.hasComputedMapping() ==
true);
1206 BOOST_TEST(value == 1.0);
1207 BOOST_TEST(guess.size() > 0);
1211 mapping.computeMapping();
1212 mapping.map(inDataID, outDataID, guess);
1213 value = outData->
values()(0);
1214 BOOST_TEST(mapping.hasComputedMapping() ==
true);
1215 BOOST_TEST(value == 1.0);
1216 BOOST_TEST(guess.size() > 0);
1220 mapping.computeMapping();
1221 mapping.map(inDataID, outDataID, guess);
1222 value = outData->
values()(0);
1223 BOOST_TEST(mapping.hasComputedMapping() ==
true);
1224 BOOST_TEST(value == 1.0);
1225 BOOST_TEST(guess.size() > 0);
1229 mapping.computeMapping();
1230 mapping.map(inDataID, outDataID, guess);
1231 value = outData->
values()(0);
1232 BOOST_TEST(mapping.hasComputedMapping() ==
true);
1233 BOOST_TEST(value == 2.0);
1234 BOOST_TEST(guess.size() > 0);
1238 mapping.computeMapping();
1239 mapping.map(inDataID, outDataID, guess);
1240 value = outData->
values()(0);
1241 BOOST_TEST(mapping.hasComputedMapping() ==
true);
1242 BOOST_TEST(value == 2.0);
1243 BOOST_TEST(guess.size() > 0);
1247 mapping.computeMapping();
1248 mapping.map(inDataID, outDataID, guess);
1249 value = outData->
values()(0);
1250 BOOST_TEST(mapping.hasComputedMapping() ==
true);
1251 BOOST_TEST(value == 2.0);
1252 BOOST_TEST(guess.size() > 0);
1256 mapping.computeMapping();
1257 mapping.map(inDataID, outDataID, guess);
1258 value = outData->
values()(0);
1259 BOOST_TEST(mapping.hasComputedMapping() ==
true);
1260 BOOST_TEST(value == 1.5);
1261 BOOST_TEST(guess.size() > 0);
1265 mapping.computeMapping();
1266 mapping.map(inDataID, outDataID, guess);
1267 value = outData->
values()(0);
1268 BOOST_TEST(mapping.hasComputedMapping() ==
true);
1269 BOOST_TEST(value == 1.5);
1270 BOOST_TEST(guess.size() > 0);
1274 mapping.computeMapping();
1275 mapping.map(inDataID, outDataID, guess);
1276 value = outData->
values()(0);
1277 BOOST_TEST(mapping.hasComputedMapping() ==
true);
1278 BOOST_TEST(value == 1.5);
1279 BOOST_TEST(guess.size() > 0);
1285 using Eigen::Vector2d;
1290 int inDataID = inData->
getID();
1298 auto &values = inData->
values();
1299 values << 1.0, 4.0, 2.0, 5.0, 2.0, 5.0, 1.0, 4.0;
1304 int outDataID = outData->
getID();
1315 Eigen::VectorXd guess;
1316 mapping.
map(inDataID, outDataID, guess);
1317 double value1 = outData->
values()(0);
1318 double value2 = outData->
values()(1);
1320 BOOST_TEST(value1 == 1.0);
1321 BOOST_TEST(value2 == 4.0);
1322 BOOST_TEST(guess.size() > 0);
1327 mapping.
map(inDataID, outDataID, guess);
1328 value1 = outData->
values()(0);
1329 value2 = outData->
values()(1);
1331 BOOST_TEST(value1 == 1.0);
1332 BOOST_TEST(value2 == 4.0);
1333 BOOST_TEST(guess.size() > 0);
1338 mapping.
map(inDataID, outDataID, guess);
1339 value1 = outData->
values()(0);
1340 value2 = outData->
values()(1);
1342 BOOST_TEST(value1 == 1.0);
1343 BOOST_TEST(value2 == 4.0);
1344 BOOST_TEST(guess.size() > 0);
1349 mapping.
map(inDataID, outDataID, guess);
1350 value1 = outData->
values()(0);
1351 value2 = outData->
values()(1);
1353 BOOST_TEST(value1 == 2.0);
1354 BOOST_TEST(value2 == 5.0);
1355 BOOST_TEST(guess.size() > 0);
1360 mapping.
map(inDataID, outDataID, guess);
1361 value1 = outData->
values()(0);
1362 value2 = outData->
values()(1);
1364 BOOST_TEST(value1 == 2.0);
1365 BOOST_TEST(value2 == 5.0);
1366 BOOST_TEST(guess.size() > 0);
1371 mapping.
map(inDataID, outDataID, guess);
1372 value1 = outData->
values()(0);
1373 value2 = outData->
values()(1);
1375 BOOST_TEST(value1 == 2.0);
1376 BOOST_TEST(value2 == 5.0);
1377 BOOST_TEST(guess.size() > 0);
1382 mapping.
map(inDataID, outDataID, guess);
1383 value1 = outData->
values()(0);
1384 value2 = outData->
values()(1);
1386 BOOST_TEST(value1 == 1.5);
1387 BOOST_TEST(value2 == 4.5);
1388 BOOST_TEST(guess.size() > 0);
1393 mapping.
map(inDataID, outDataID, guess);
1394 value1 = outData->
values()(0);
1395 value2 = outData->
values()(1);
1397 BOOST_TEST(value1 == 1.5);
1398 BOOST_TEST(value2 == 4.5);
1399 BOOST_TEST(guess.size() > 0);
1404 mapping.
map(inDataID, outDataID, guess);
1405 value1 = outData->
values()(0);
1406 value2 = outData->
values()(1);
1408 BOOST_TEST(value1 == 1.5);
1409 BOOST_TEST(value2 == 4.5);
1410 BOOST_TEST(guess.size() > 0);
1420 int inDataID = inData->
getID();
1432 auto &values = inData->
values();
1433 values << 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0;
1438 int outDataID = outData->
getID();
1447 vertex.
setCoords(Eigen::Vector3d(0.0, 0.0, 0.0));
1449 Eigen::VectorXd guess;
1450 mapping.
map(inDataID, outDataID, guess);
1451 double value = outData->
values()(0);
1453 BOOST_TEST(value == 1.0);
1454 BOOST_TEST(guess.size() > 0);
1457 vertex.
setCoords(Eigen::Vector3d(0.0, 0.5, 0.0));
1459 mapping.
map(inDataID, outDataID, guess);
1460 value = outData->
values()(0);
1462 BOOST_TEST(value == 1.0);
1463 BOOST_TEST(guess.size() > 0);
1466 vertex.
setCoords(Eigen::Vector3d(0.5, 0.5, 0.0));
1468 mapping.
map(inDataID, outDataID, guess);
1469 value = outData->
values()(0);
1471 BOOST_TEST(value == 1.0);
1472 BOOST_TEST(guess.size() > 0);
1475 vertex.
setCoords(Eigen::Vector3d(1.0, 0.0, 0.0));
1477 mapping.
map(inDataID, outDataID, guess);
1478 value = outData->
values()(0);
1480 BOOST_TEST(value == 1.0);
1481 BOOST_TEST(guess.size() > 0);
1484 vertex.
setCoords(Eigen::Vector3d(1.0, 1.0, 0.0));
1486 mapping.
map(inDataID, outDataID, guess);
1487 value = outData->
values()(0);
1489 BOOST_TEST(value == 1.0);
1490 BOOST_TEST(guess.size() > 0);
1493 vertex.
setCoords(Eigen::Vector3d(0.0, 0.0, 1.0));
1495 mapping.
map(inDataID, outDataID, guess);
1496 value = outData->
values()(0);
1498 BOOST_TEST(value == 2.0);
1499 BOOST_TEST(guess.size() > 0);
1502 vertex.
setCoords(Eigen::Vector3d(1.0, 0.0, 1.0));
1504 mapping.
map(inDataID, outDataID, guess);
1505 value = outData->
values()(0);
1507 BOOST_TEST(value == 2.0);
1508 BOOST_TEST(guess.size() > 0);
1511 vertex.
setCoords(Eigen::Vector3d(1.0, 1.0, 1.0));
1513 mapping.
map(inDataID, outDataID, guess);
1514 value = outData->
values()(0);
1516 BOOST_TEST(value == 2.0);
1517 BOOST_TEST(guess.size() > 0);
1520 vertex.
setCoords(Eigen::Vector3d(0.5, 0.5, 1.0));
1522 mapping.
map(inDataID, outDataID, guess);
1523 value = outData->
values()(0);
1525 BOOST_TEST(value == 2.0);
1526 BOOST_TEST(guess.size() > 0);
1529 vertex.
setCoords(Eigen::Vector3d(0.0, 0.0, 0.5));
1531 mapping.
map(inDataID, outDataID, guess);
1532 value = outData->
values()(0);
1534 BOOST_TEST(value, 1.5);
1535 BOOST_TEST(guess.size() > 0);
1538 vertex.
setCoords(Eigen::Vector3d(1.0, 0.0, 0.5));
1540 mapping.
map(inDataID, outDataID, guess);
1541 value = outData->
values()(0);
1543 BOOST_TEST(value == 1.5);
1544 BOOST_TEST(guess.size() > 0);
1547 vertex.
setCoords(Eigen::Vector3d(0.0, 1.0, 0.5));
1549 mapping.
map(inDataID, outDataID, guess);
1550 value = outData->
values()(0);
1552 BOOST_TEST(value == 1.5);
1553 BOOST_TEST(guess.size() > 0);
1556 vertex.
setCoords(Eigen::Vector3d(1.0, 1.0, 0.5));
1558 mapping.
map(inDataID, outDataID, guess);
1559 value = outData->
values()(0);
1561 BOOST_TEST(value == 1.5);
1562 BOOST_TEST(guess.size() > 0);
1565 vertex.
setCoords(Eigen::Vector3d(0.5, 0.5, 0.5));
1567 mapping.
map(inDataID, outDataID, guess);
1568 value = outData->
values()(0);
1570 BOOST_TEST(value == 1.5);
1571 BOOST_TEST(guess.size() > 0);
1577 using Eigen::Vector2d;
1582 int inDataID = inData->
getID();
1596 auto &inValues = inData->
values();
1597 inValues << 1.0, 2.0, 2.0, 1.0;
1602 int outDataID = outData->
getID();
1603 auto &outV1 = outMesh->
createVertex(Vector2d(0.0, 0.0));
1604 auto &outV2 = outMesh->
createVertex(Vector2d(0.0, 1.0));
1605 auto &outV3 = outMesh->
createVertex(Vector2d(1.1, 1.1));
1606 auto &outV4 = outMesh->
createVertex(Vector2d(0.1, 1.1));
1619 Eigen::VectorXd guess;
1620 mapping.
map(inDataID, outDataID, guess);
1621 BOOST_TEST(guess.size() > 0);
1633 int inDataID = inData->
getID();
1634 auto &inV1 = inMesh->
createVertex(Eigen::Vector3d(0.0, 0.0, 0.0));
1635 auto &inV2 = inMesh->
createVertex(Eigen::Vector3d(1.0, 0.0, 0.0));
1636 auto &inV3 = inMesh->
createVertex(Eigen::Vector3d(0.0, 1.0, 0.5));
1637 auto &inV4 = inMesh->
createVertex(Eigen::Vector3d(2.0, 0.0, 0.0));
1638 auto &inV5 = inMesh->
createVertex(Eigen::Vector3d(0.0, 2.0, 0.0));
1639 auto &inV6 = inMesh->
createVertex(Eigen::Vector3d(0.0, 2.0, 1.0));
1652 auto &inValues = inData->
values();
1653 inValues << 1.0, 2.0, 4.0, 6.0, 8.0, 9.0;
1658 int outDataID = outData->
getID();
1659 auto &outV1 = outMesh->
createVertex(Eigen::Vector3d(0.0, 0.0, 0.0));
1660 auto &outV2 = outMesh->
createVertex(Eigen::Vector3d(1.0, 0.0, 0.0));
1661 auto &outV3 = outMesh->
createVertex(Eigen::Vector3d(0.0, 1.1, 0.6));
1662 auto &outE1 = outMesh->
createEdge(outV1, outV2);
1663 auto &outE2 = outMesh->
createEdge(outV2, outV3);
1664 auto &outE3 = outMesh->
createEdge(outV1, outV3);
1675 Eigen::VectorXd guess;
1676 mapping.
map(inDataID, outDataID, guess);
1677 BOOST_TEST(guess.size() > 0);
1684 const int dimensions = 2;
1685 const double tolerance = 1e-6;
1686 using Eigen::Vector2d;
1691 int inDataID = inData->
getID();
1695 inData->
values() << 1.0, 2.0;
1701 int outDataID = outData->
getID();
1709 auto &values = outData->
values();
1717 Eigen::VectorXd guess;
1718 mapping.
map(inDataID, outDataID, guess);
1720 BOOST_TEST(
testing::equals(values, Eigen::Vector4d(0.5, 0.5, 1.0, 1.0), tolerance));
1721 BOOST_TEST(guess.size() > 0);
1727 mapping.
map(inDataID, outDataID, guess);
1729 BOOST_TEST(
testing::equals(values, Eigen::Vector4d(0.5, 1.0, 1.0, 0.5), tolerance));
1730 BOOST_TEST(guess.size() > 0);
1736 mapping.
map(inDataID, outDataID, guess);
1738 BOOST_TEST(
testing::equals(values, Eigen::Vector4d(0.0, 2.0, 0.0, 1.0), tolerance));
1739 BOOST_TEST(guess.size() > 0);
1745 mapping.
map(inDataID, outDataID, guess);
1747 BOOST_TEST(
testing::equals(values, Eigen::Vector4d(1.0, 0.0, 2.0, 0.0), tolerance));
1748 BOOST_TEST(guess.size() > 0);
1754 mapping.
map(inDataID, outDataID, guess);
1756 BOOST_TEST(values.sum() == 3.0);
1757 BOOST_TEST(guess.size() > 0);
1762 const int dimensions = 2;
1763 const double tolerance = 1e-6;
1764 using Eigen::Vector2d;
1769 int inDataID = inData->
getID();
1773 inData->
values() << 1.0, 4.0, 2.0, 5.0;
1779 int outDataID = outData->
getID();
1787 auto &values = outData->
values();
1795 Eigen::VectorXd guess;
1796 mapping.
map(inDataID, outDataID, guess);
1798 Eigen::VectorXd refValues(8);
1799 refValues << 0.5, 2, 0.5, 2, 1.0, 2.5, 1.0, 2.5;
1801 BOOST_TEST(guess.size() > 0);
1807 mapping.
map(inDataID, outDataID, guess);
1809 refValues << 0.5, 2, 1.0, 2.5, 1.0, 2.5, 0.5, 2;
1811 BOOST_TEST(guess.size() > 0);
1817 mapping.
map(inDataID, outDataID, guess);
1819 refValues << 0.0, 0.0, 2.0, 5.0, 0.0, 0.0, 1.0, 4.0;
1821 BOOST_TEST(guess.size() > 0);
1827 mapping.
map(inDataID, outDataID, guess);
1829 refValues << 1.0, 4.0, 0.0, 0.0, 2.0, 5.0, 0.0, 0.0;
1831 BOOST_TEST(guess.size() > 0);
1837 mapping.
map(inDataID, outDataID, guess);
1839 BOOST_TEST(values.sum() == 12.0);
1840 BOOST_TEST(guess.size() > 0);
1845 using Eigen::Vector3d;
1851 int inDataID = inData->
getID();
1855 inData->
values() << 1.0, 2.0;
1861 int outDataID = outData->
getID();
1873 auto &values = outData->
values();
1874 double expectedSum = inData->
values().sum();
1879 vertex0.
setCoords(Vector3d(0.5, 0.0, 0.0));
1880 vertex1.
setCoords(Vector3d(0.5, 1.0, 0.0));
1882 Eigen::VectorXd guess;
1883 mapping.
map(inDataID, outDataID, guess);
1885 BOOST_TEST(values.sum() == expectedSum);
1886 BOOST_TEST(guess.size() > 0);
2007 double supportRadius = 1.2;
2031 double supportRadius = 1.2;
2055 double supportRadius = 1.2;
2079 using Eigen::Vector2d;
2088 {{xDead, yDead, zDead}});
2092 mesh::PtrData inData = inMesh->createData(
"InData", 1, 0_dataID);
2093 int inDataID = inData->
getID();
2094 inMesh->createVertex(Vector2d(0.0, 1.0));
2095 inMesh->createVertex(Vector2d(1.0, 1.0));
2096 inMesh->createVertex(Vector2d(2.0, 1.0));
2097 inMesh->createVertex(Vector2d(3.0, 1.0));
2098 inMesh->allocateDataValues();
2101 auto &values = inData->
values();
2102 values << 1.0, 2.0, 2.0, 1.0;
2107 int outDataID = outData->
getID();
2113 mapping.setMeshes(inMesh, outMesh);
2114 BOOST_TEST(mapping.hasComputedMapping() ==
false);
2117 mapping.computeMapping();
2118 Eigen::VectorXd guess;
2119 mapping.map(inDataID, outDataID, guess);
2120 double value = outData->
values()(0);
2121 BOOST_TEST(mapping.hasComputedMapping() ==
true);
2122 BOOST_TEST(value == 1.0);
2123 BOOST_TEST(guess.size() > 0);
2130 using Eigen::Vector3d;
2133 double supportRadius = 1.2;
2143 mesh::PtrData inData = inMesh->createData(
"InData", 1, 0_dataID);
2144 int inDataID = inData->
getID();
2145 inMesh->createVertex(Vector3d(0.0, 3.0, 0.0));
2146 inMesh->createVertex(Vector3d(1.0, 3.0, 0.0));
2147 inMesh->createVertex(Vector3d(0.0, 3.0, 1.0));
2148 inMesh->createVertex(Vector3d(1.0, 3.0, 1.0));
2149 inMesh->allocateDataValues();
2152 auto &values = inData->
values();
2153 values << 1.0, 2.0, 3.0, 4.0;
2158 int outDataID = outData->
getID();
2167 mapping.setMeshes(inMesh, outMesh);
2168 BOOST_TEST(mapping.hasComputedMapping() ==
false);
2170 mapping.computeMapping();
2171 Eigen::VectorXd guess;
2172 mapping.map(inDataID, outDataID, guess);
2173 BOOST_TEST(mapping.hasComputedMapping() ==
true);
2174 BOOST_TEST(guess.size() > 0);
2177 BOOST_TEST(outData->
values()(0) == 1.0);
2178 BOOST_TEST(outData->
values()(1) == 2.0);
2179 BOOST_TEST(outData->
values()(2) == 2.9);
2180 BOOST_TEST(outData->
values()(3) == 4.3);
2185 *boost::unit_test::tolerance(1e-6))
2188 using Eigen::Vector2d;
2191 bool xDead =
false, yDead =
false, zDead =
false;
2198 int inDataID = inData->
getID();
2205 inData->
values() << 1, 1, 1, 1;
2210 int outDataID = outData->
getID();
2218 {{xDead, yDead, zDead}},
2219 1e-9, Polynomial::OFF);
2221 mappingOff.computeMapping();
2222 Eigen::VectorXd guess;
2223 mappingOff.map(inDataID, outDataID, guess);
2225 BOOST_TEST(outData->
values()(0) <= 0.01);
2226 BOOST_TEST(guess.size() > 0);
2231 {{xDead, yDead, zDead}},
2232 1e-9, Polynomial::ON);
2235 mappingOn.computeMapping();
2236 mappingOn.map(inDataID, outDataID, guess);
2238 BOOST_TEST(outData->
values()(0) == 1.0);
2239 BOOST_TEST(guess.size() > 0);
2244 {{xDead, yDead, zDead}},
2245 1e-9, Polynomial::SEPARATE);
2248 mappingSep.computeMapping();
2249 mappingSep.map(inDataID, outDataID, guess);
2251 BOOST_TEST(outData->
values()(0) == 1.0);
2252 BOOST_TEST(guess.size() > 0);
2257 *
boost::unit_test::tolerance(1e-6))
2260 using Eigen::Vector2d;
2263 bool xDead =
false, yDead =
false, zDead =
false;
2270 int inDataID = inData->
getID();
2277 inData->
values() << 1, 1, 1, 1;
2282 int outDataID = outData->
getID();
2292 {{xDead, yDead, zDead}},
2293 1e-9, Polynomial::OFF);
2295 mappingOff.computeMapping();
2296 Eigen::VectorXd guess;
2297 mappingOff.map(inDataID, outDataID, guess);
2298 BOOST_TEST(guess.size() > 0);
2301 BOOST_TEST(outData->
values()(0) == 2.119967);
2302 BOOST_TEST(outData->
values()(1) == 0.0);
2303 BOOST_TEST(outData->
values()(2) == 0.0);
2307 {{xDead, yDead, zDead}},
2308 1e-9, Polynomial::ON);
2311 mappingOn.computeMapping();
2312 mappingOn.map(inDataID, outDataID, guess);
2313 BOOST_TEST(guess.size() > 0);
2316 BOOST_TEST(outData->
values()(0) == 0);
2317 BOOST_TEST(outData->
values()(1) == 26.0);
2318 BOOST_TEST(outData->
values()(2) == -22.0);
2322 {{xDead, yDead, zDead}},
2323 1e-9, Polynomial::SEPARATE);
2326 mappingSep.computeMapping();
2327 mappingSep.map(inDataID, outDataID, guess);
2328 BOOST_TEST(guess.size() > 0);
2331 BOOST_TEST(outData->
values()(0) == 0);
2332 BOOST_TEST(outData->
values()(1) == 26.0);
2333 BOOST_TEST(outData->
values()(2) == -22.0);
2351 {{
false,
false,
false}});
2369 {{
false,
false,
false}});
2372 mapping2.computeMapping();
2380 using Eigen::Vector2d;
2383 bool xDead =
false, yDead =
false, zDead =
false;
2390 int inDataID = inData->
getID();
2397 inData->
values() << 1, 1, 1, 1;
2402 int outDataID = outData->
getID();
2409 {{xDead, yDead, zDead}});
2411 mapping1.computeMapping();
2412 Eigen::VectorXd guess;
2413 mapping1.map(inDataID, outDataID, guess);
2414 BOOST_TEST(guess.size() > 0);
2417 BOOST_TEST(outData->
values()(0) == 1);
2420 {{xDead, yDead, zDead}});
2421 inData->
values() << 0, 0, 0, 0;
2423 mapping2.setMeshes(outMesh, inMesh);
2424 mapping2.computeMapping();
2425 mapping2.map(outDataID, inDataID, guess);
2427 BOOST_TEST(inData->
values()(0) == 1.0);
2428 BOOST_TEST(inData->
values()(1) == 1.0);
2429 BOOST_TEST(inData->
values()(2) == 1.0);
2430 BOOST_TEST(inData->
values()(3) == 1.0);
BOOST_AUTO_TEST_SUITE(PreProcess)
BOOST_AUTO_TEST_SUITE_END()
void testTagging(const TestContext &context, MeshSpecification inMeshSpec, MeshSpecification outMeshSpec, MeshSpecification shouldTagFirstRound, MeshSpecification shouldTagSecondRound, bool consistent)
void perform3DTestScaledConsistentMapping(Mapping &mapping)
void addGlobalIndex(mesh::PtrMesh &mesh, int offset=0)
void perform2DTestConservativeMappingVector(Mapping &mapping)
void perform2DTestScaledConsistentMapping(Mapping &mapping)
void perform2DTestConsistentMappingVector(Mapping &mapping)
void perform2DTestConsistentMapping(Mapping &mapping)
void perform3DTestConsistentMapping(Mapping &mapping)
void perform3DTestConservativeMapping(Mapping &mapping)
void perform2DTestConservativeMapping(Mapping &mapping)
void testDistributed(const TestContext &context, Mapping &mapping, MeshSpecification inMeshSpec, MeshSpecification outMeshSpec, ReferenceSpecification referenceSpec, int inGlobalIndexOffset=0)
void getDistributedMesh(const TestContext &context, MeshSpecification const &vertices, mesh::PtrMesh &mesh, mesh::PtrData &data, int globalIndexOffset=0)
void testSerialScaledConsistent(mesh::PtrMesh inMesh, mesh::PtrMesh outMesh, PtrData inData, PtrData outData)
BOOST_AUTO_TEST_CASE(MapThinPlateSplines)
#define PRECICE_TEST_SETUP(...)
Creates and attaches a TestSetup to a Boost test case.
Wendland radial basis function with compact support.
Wendland radial basis function with compact support.
Radial basis function with compact support.
Radial basis function with global and compact support.
double getSupportRadius() const
Radial basis function with global support.
Abstract base class for mapping of data from one mesh to another.
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.
virtual void computeMapping()=0
Computes the mapping coefficients from the in- and output mesh.
bool hasComputedMapping() const
Returns true, if the mapping has been computed.
void map(int inputDataID, int outputDataID)
Radial basis function with global support.
Mapping with radial basis functions using the Petsc library to solve the resulting system.
Radial basis function with global support.
Radial basis function with global support.
DataID getID() const
Returns the ID of the data set (supposed to be unique).
Eigen::VectorXd & values()
Returns a reference to the data values.
Container and creator for meshes.
Triangle & createTriangle(Edge &edgeOne, Edge &edgeTwo, Edge &edgeThree)
Creates and initializes a Triangle object.
VertexContainer & vertices()
Returns modifieable container holding all vertices.
std::size_t nVertices() const
Returns the number of vertices.
PtrData & createData(const std::string &name, int dimension, DataID id, int waveformDegree=time::Time::DEFAULT_WAVEFORM_DEGREE)
Create only data for vertex.
void computeBoundingBox()
Computes the boundingBox for the vertices.
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.
void setCoords(const VECTOR_T &coordinates)
Sets the coordinates of the vertex.
void setGlobalIndex(int globalIndex)
void setOwner(bool owner)
Rank rank
the rank of the current participant
contains data mapping from points to meshes.
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...
contains the testing framework.
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...
Main namespace of the precice library.
Holds rank, owner, position and value of a single vertex.
std::vector< double > value
std::vector< double > position
const Eigen::Map< const Eigen::VectorXd > asEigen() const
static constexpr bool hasCompactSupport()