3#include <boost/test/tools/old/interface.hpp>
49 const
std::
string &nameParticipant,
50 const mesh::MeshConfiguration &meshConfig,
51 const
std::vector<
int> &validIterations)
53 BOOST_REQUIRE(meshConfig.meshes().size() == 1);
55 BOOST_REQUIRE(mesh->data().size() == 2);
56 BOOST_REQUIRE(!mesh->empty());
57 BOOST_REQUIRE(!validIterations.empty());
61 auto &dataValues0 = mesh->data(0)->values();
62 auto &dataValues1 = mesh->data(1)->values();
63 double initialStepsizeData0 = 5.0;
64 double stepsizeData0 = 5.0;
65 Eigen::VectorXd initialStepsizeData1 = Eigen::VectorXd::Constant(3, 5.0);
66 Eigen::VectorXd stepsizeData1 = Eigen::VectorXd::Constant(3, 5.0);
67 double computedTime = 0.0;
68 int computedTimesteps = 0;
71 BOOST_TEST(((nameParticipant == nameParticipant0) || (nameParticipant == nameParticipant1)));
72 int iterationCount = 0;
73 std::vector<int>::const_iterator iterValidIterations = validIterations.begin();
75 if (nameParticipant == nameParticipant0) {
76 mesh->data(0)->setSampleAtTime(0,
time::Sample{mesh->data(0)->getDimensions(), mesh->data(0)->values()});
77 cplScheme.initialize();
78 BOOST_TEST(not cplScheme.isTimeWindowComplete());
79 BOOST_TEST(cplScheme.isActionRequired(CouplingScheme::Action::WriteCheckpoint));
80 BOOST_TEST(not cplScheme.isActionRequired(CouplingScheme::Action::ReadCheckpoint));
81 BOOST_TEST(not cplScheme.hasDataBeenReceived());
85 cplScheme.markActionFulfilled(CouplingScheme::Action::WriteCheckpoint);
86 BOOST_TEST(cplScheme.isActionFulfilled(CouplingScheme::Action::WriteCheckpoint));
88 while (cplScheme.isCouplingOngoing()) {
89 dataValues0(
index) += stepsizeData0;
91 double maxTimeStepSize = cplScheme.getNextTimeStepMaxSize();
92 cplScheme.addComputedTime(maxTimeStepSize);
93 mesh->data(0)->setSampleAtTime(cplScheme.getTime(),
time::Sample{mesh->data(0)->getDimensions(), mesh->data(0)->values()});
94 cplScheme.firstSynchronization({});
95 cplScheme.firstExchange();
96 cplScheme.secondSynchronization();
97 cplScheme.secondExchange();
102 if (cplScheme.isTimeWindowComplete()) {
104 computedTime += maxTimeStepSize;
107 BOOST_TEST(computedTimesteps == cplScheme.getTimeWindows() - 1);
110 BOOST_TEST(iterationCount == *iterValidIterations);
111 if (cplScheme.isCouplingOngoing()) {
112 BOOST_TEST(cplScheme.isActionRequired(CouplingScheme::Action::WriteCheckpoint));
113 cplScheme.markActionFulfilled(CouplingScheme::Action::WriteCheckpoint);
114 BOOST_TEST(cplScheme.isActionFulfilled(CouplingScheme::Action::WriteCheckpoint));
116 BOOST_TEST(not cplScheme.isActionRequired(CouplingScheme::Action::WriteCheckpoint));
117 BOOST_TEST(not cplScheme.isActionRequired(CouplingScheme::Action::ReadCheckpoint));
120 iterValidIterations++;
121 if (iterValidIterations == validIterations.end()) {
122 BOOST_REQUIRE(not cplScheme.isCouplingOngoing());
126 stepsizeData0 = initialStepsizeData0;
128 BOOST_TEST(cplScheme.isCouplingOngoing());
129 BOOST_TEST(iterationCount < *iterValidIterations);
130 BOOST_TEST(cplScheme.isActionRequired(CouplingScheme::Action::ReadCheckpoint));
131 cplScheme.markActionFulfilled(CouplingScheme::Action::ReadCheckpoint);
132 BOOST_TEST(cplScheme.isActionFulfilled(CouplingScheme::Action::ReadCheckpoint));
135 stepsizeData0 -= 1.0;
139 BOOST_TEST(cplScheme.hasDataBeenReceived());
141 cplScheme.finalize();
143 BOOST_TEST(computedTimesteps == 3);
144 }
else if (nameParticipant == nameParticipant1) {
145 mesh->data(1)->setSampleAtTime(0,
time::Sample{mesh->data(1)->getDimensions(), mesh->data(1)->values()});
146 cplScheme.initialize();
147 BOOST_TEST(not cplScheme.isTimeWindowComplete());
148 BOOST_TEST(cplScheme.isActionRequired(CouplingScheme::Action::WriteCheckpoint));
149 BOOST_TEST(not cplScheme.isActionRequired(CouplingScheme::Action::ReadCheckpoint));
150 BOOST_TEST(cplScheme.hasDataBeenReceived());
154 cplScheme.markActionFulfilled(CouplingScheme::Action::WriteCheckpoint);
155 BOOST_TEST(cplScheme.isActionFulfilled(CouplingScheme::Action::WriteCheckpoint));
157 while (cplScheme.isCouplingOngoing()) {
158 Eigen::VectorXd currentData(3);
159 currentData = dataValues1.segment(
index * 3, 3);
160 currentData += stepsizeData1;
161 dataValues1.segment(
index * 3, 3) = currentData;
163 double maxTimeStepSize = cplScheme.getNextTimeStepMaxSize();
164 cplScheme.addComputedTime(maxTimeStepSize);
165 mesh->data(1)->setSampleAtTime(cplScheme.getTime(),
time::Sample{mesh->data(1)->getDimensions(), mesh->data(1)->values()});
166 cplScheme.firstSynchronization({});
167 cplScheme.firstExchange();
168 cplScheme.secondSynchronization();
169 cplScheme.secondExchange();
174 if (cplScheme.isTimeWindowComplete()) {
176 computedTime += maxTimeStepSize;
179 BOOST_TEST(computedTimesteps == cplScheme.getTimeWindows() - 1);
182 BOOST_TEST(iterationCount == *iterValidIterations);
183 if (cplScheme.isCouplingOngoing()) {
184 BOOST_TEST(cplScheme.isActionRequired(CouplingScheme::Action::WriteCheckpoint));
185 cplScheme.markActionFulfilled(CouplingScheme::Action::WriteCheckpoint);
186 BOOST_TEST(cplScheme.isActionFulfilled(CouplingScheme::Action::WriteCheckpoint));
188 BOOST_TEST(not cplScheme.isActionRequired(CouplingScheme::Action::WriteCheckpoint));
189 BOOST_TEST(not cplScheme.isActionRequired(CouplingScheme::Action::ReadCheckpoint));
192 iterValidIterations++;
193 if (iterValidIterations == validIterations.end()) {
194 BOOST_REQUIRE(not cplScheme.isCouplingOngoing());
198 stepsizeData1 = initialStepsizeData1;
200 BOOST_TEST(cplScheme.isCouplingOngoing());
201 BOOST_TEST(iterationCount < *iterValidIterations);
202 BOOST_TEST(cplScheme.isActionRequired(CouplingScheme::Action::ReadCheckpoint));
205 cplScheme.markActionFulfilled(CouplingScheme::Action::ReadCheckpoint);
206 BOOST_TEST(cplScheme.isActionFulfilled(CouplingScheme::Action::ReadCheckpoint));
210 stepsizeData1 -= Eigen::Vector3d::Constant(1.0);
213 if (cplScheme.isCouplingOngoing())
214 BOOST_TEST(cplScheme.hasDataBeenReceived());
216 cplScheme.finalize();
218 BOOST_TEST(computedTimesteps == 3);
228 BOOST_REQUIRE(meshConfig.
meshes().size() == 1);
230 BOOST_REQUIRE(mesh->data().size() == 2);
231 BOOST_REQUIRE(!mesh->empty());
232 BOOST_REQUIRE(!validIterations.
empty());
234 double initialStepsizeData0 = 5.0;
235 double stepsizeData0 = 5.0;
236 Eigen::Vector3d initialStepsizeData1 = Eigen::Vector3d::Constant(5.0);
237 Eigen::Vector3d stepsizeData1 = Eigen::Vector3d::Constant(5.0);
238 double computedTime = 0.0;
239 int computedTimesteps = 0;
242 BOOST_TEST(((nameParticipant == nameParticipant0) || (nameParticipant == nameParticipant1)));
243 int iterationCount = 0;
244 std::vector<int>::const_iterator iterValidIterations =
245 validIterations.
begin();
247 if (nameParticipant == nameParticipant0) {
249 mesh->data(0)->setSampleAtTime(0,
time::Sample{mesh->data(0)->getDimensions(), mesh->data(0)->values()});
252 BOOST_TEST(cplScheme.
isActionRequired(CouplingScheme::Action::WriteCheckpoint));
253 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::ReadCheckpoint));
259 BOOST_TEST(cplScheme.
isActionFulfilled(CouplingScheme::Action::WriteCheckpoint));
262 double computedTimeStepSize = maxTimeStepSize / 2.0;
263 int subcyclingStep = 0;
266 mesh->data(0)->timeStepsStorage().trim();
271 mesh->data(0)->setSampleAtTime(cplScheme.
getTime(),
time::Sample{mesh->data(0)->getDimensions(), mesh->data(0)->values()});
281 mesh->data(0)->timeStepsStorage().trim();
282 computedTime += maxTimeStepSize;
288 BOOST_TEST(iterationCount == *iterValidIterations);
290 BOOST_TEST(cplScheme.
isActionRequired(CouplingScheme::Action::WriteCheckpoint));
292 BOOST_TEST(cplScheme.
isActionFulfilled(CouplingScheme::Action::WriteCheckpoint));
294 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::WriteCheckpoint));
295 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::ReadCheckpoint));
298 iterValidIterations++;
299 if (iterValidIterations == validIterations.
end()) {
304 stepsizeData0 = initialStepsizeData0;
305 BOOST_TEST(subcyclingStep == 1);
311 BOOST_TEST(iterationCount <= *iterValidIterations);
312 BOOST_TEST(cplScheme.
isActionRequired(CouplingScheme::Action::ReadCheckpoint));
313 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::WriteCheckpoint));
318 stepsizeData0 -= 1.0;
322 BOOST_TEST(iterationCount <= *iterValidIterations);
323 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::ReadCheckpoint));
324 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::WriteCheckpoint));
325 BOOST_TEST(subcyclingStep < 2);
332 BOOST_TEST(computedTimesteps == 3);
333 BOOST_TEST(stepsizeData0 == 5.0);
336 else if (nameParticipant == nameParticipant1) {
338 mesh->data(1)->setSampleAtTime(0,
time::Sample{mesh->data(1)->getDimensions(), mesh->data(1)->values()});
341 BOOST_TEST(cplScheme.
isActionRequired(CouplingScheme::Action::WriteCheckpoint));
342 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::ReadCheckpoint));
348 BOOST_TEST(cplScheme.
isActionFulfilled(CouplingScheme::Action::WriteCheckpoint));
351 double preferredTimeStepSize = maxTimeStepSize / 2.5;
352 double computedTimeStepSize = preferredTimeStepSize;
353 int subcyclingStep = 0;
356 mesh->data(1)->timeStepsStorage().trim();
361 mesh->data(1)->setSampleAtTime(cplScheme.
getTime(),
time::Sample{mesh->data(1)->getDimensions(), mesh->data(1)->values()});
366 computedTimeStepSize =
369 : preferredTimeStepSize;
374 mesh->data(1)->timeStepsStorage().trim();
376 computedTime += maxTimeStepSize;
382 BOOST_TEST(iterationCount == *iterValidIterations);
384 BOOST_TEST(cplScheme.
isActionRequired(CouplingScheme::Action::WriteCheckpoint));
386 BOOST_TEST(cplScheme.
isActionFulfilled(CouplingScheme::Action::WriteCheckpoint));
388 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::WriteCheckpoint));
389 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::ReadCheckpoint));
392 iterValidIterations++;
393 if (iterValidIterations == validIterations.
end()) {
398 stepsizeData1 = initialStepsizeData1;
399 BOOST_TEST(subcyclingStep == 2);
405 BOOST_TEST(iterationCount <= *iterValidIterations);
406 BOOST_TEST(cplScheme.
isActionRequired(CouplingScheme::Action::ReadCheckpoint));
407 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::WriteCheckpoint));
412 stepsizeData1.array() -= 1.0;
416 BOOST_TEST(iterationCount <= *iterValidIterations);
417 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::ReadCheckpoint));
418 BOOST_TEST(not cplScheme.
isActionRequired(CouplingScheme::Action::WriteCheckpoint));
419 BOOST_TEST(subcyclingStep < 3);
426 BOOST_TEST(computedTimesteps == 3);
445 using namespace mesh;
447 std::string path(_pathToTests +
"serial-implicit-cplscheme-relax-const-config.xml");
450 PtrDataConfiguration dataConfig(
new DataConfiguration(root));
451 PtrMeshConfiguration meshConfig(
new MeshConfiguration(root, dataConfig));
458 BOOST_CHECK(cplSchemeConfig.
getData(
"Data0",
"Mesh") != cplSchemeConfig.
getData(
"Data1",
"Mesh"));
460 BOOST_CHECK(cplSchemeConfig.
getData(
"Data0",
"Mesh") == cplSchemeConfig.
findDataByID(cplSchemeConfig.
getData(
"Data0",
"Mesh")->getID()));
461 BOOST_CHECK(cplSchemeConfig.
getData(
"Data1",
"Mesh") == cplSchemeConfig.
findDataByID(cplSchemeConfig.
getData(
"Data1",
"Mesh")->getID()));
462 BOOST_CHECK(cplSchemeConfig.
findDataByID(2) ==
nullptr);
473 auto m2n = context.connectPrimaryRanks(
"Participant0",
"Participant1", options);
475 using namespace mesh;
479 PtrDataConfiguration dataConfig(
new DataConfiguration(root));
480 dataConfig->addData(
"data0", mesh::Data::typeName::SCALAR);
481 dataConfig->addData(
"data1", mesh::Data::typeName::VECTOR);
483 MeshConfiguration meshConfig(root, dataConfig);
485 mesh->createData(
"data0", 1, 0_dataID);
486 mesh->createData(
"data1", 3, 1_dataID);
487 mesh->createVertex(Eigen::Vector3d::Zero());
488 mesh->allocateDataValues();
489 meshConfig.insertMeshToMeshDimensionsMap(mesh->getName(), mesh->getDimensions());
490 meshConfig.addMesh(mesh);
493 const double maxTime = 1.0;
494 const int maxTimeWindows = 3;
495 const double timeWindowSize = 0.1;
498 int sendDataIndex = -1;
499 int receiveDataIndex = -1;
500 int convergenceDataIndex = -1;
501 if (context.isNamed(nameParticipant0)) {
503 receiveDataIndex = 1;
504 convergenceDataIndex = receiveDataIndex;
507 receiveDataIndex = 0;
508 convergenceDataIndex = sendDataIndex;
512 const int minIterations = 1;
513 const int maxIterations = 100;
514 cplscheme::SerialCouplingScheme cplScheme(maxTime, maxTimeWindows, timeWindowSize, nameParticipant0, nameParticipant1, context.name, m2n,
constants::FIXED_TIME_WINDOW_SIZE,
BaseCouplingScheme::Implicit, minIterations, maxIterations);
515 cplScheme.
addDataToSend(mesh->data(sendDataIndex), mesh,
false,
true);
516 cplScheme.
addDataToReceive(mesh->data(receiveDataIndex), mesh,
false,
true);
519 double convergenceLimit1 = sqrt(3.0);
526 runCoupling(cplScheme, context.name, meshConfig, validIterations);
529PRECICE_TEST_SETUP(
"Participant0"_on(1_rank),
"Participant1"_on(1_rank), Require::Events)
534 using namespace mesh;
537 _pathToTests +
"serial-implicit-cplscheme-absolute-config.xml");
547 m2n::PtrM2N m2n = m2nConfig->getM2N(
"Participant0",
"Participant1");
548 useOnlyPrimaryCom(m2n) =
true;
551 meshConfig->meshes().at(0)->createVertex(Eigen::Vector3d(1.0, 1.0, 1.0));
552 meshConfig->meshes().at(0)->createVertex(Eigen::Vector3d(2.0, 1.0, -1.0));
553 meshConfig->meshes().at(0)->createVertex(Eigen::Vector3d(3.0, 1.0, 1.0));
554 meshConfig->meshes().at(0)->createVertex(Eigen::Vector3d(4.0, 1.0, -1.0));
555 meshConfig->meshes().at(0)->allocateDataValues();
559 if (context.isNamed(
"Participant0")) {
560 m2n->requestPrimaryRankConnection(
"Participant1",
"Participant0",
"");
562 m2n->acceptPrimaryRankConnection(
"Participant1",
"Participant0",
"");
565 runCoupling(*cplSchemeConfig.getCouplingScheme(context.name),
566 context.name, *meshConfig, validIterations);
569PRECICE_TEST_SETUP(
"Participant0"_on(1_rank),
"Participant1"_on(1_rank), Require::Events)
575 auto m2n = context.connectPrimaryRanks(
"Participant0",
"Participant1", options);
580 dataConfig->addData(
"data0", mesh::Data::typeName::SCALAR);
581 dataConfig->addData(
"data1", mesh::Data::typeName::VECTOR);
585 mesh->createData(
"data0", 1, 0_dataID);
586 mesh->createData(
"data1", 3, 1_dataID);
587 mesh->createVertex(Eigen::Vector3d::Zero());
588 mesh->allocateDataValues();
589 meshConfig.insertMeshToMeshDimensionsMap(mesh->getName(), mesh->getDimensions());
590 meshConfig.addMesh(mesh);
593 const double maxTime = 1.0;
594 const int maxTimeWindows = 3;
595 const double timeWindowSize = 0.1;
598 int sendDataIndex = -1;
599 int receiveDataIndex = -1;
600 if (context.isNamed(nameParticipant0)) {
602 receiveDataIndex = 1;
605 receiveDataIndex = 0;
609 const int minIterations = 1;
610 const int maxIterations = 3;
611 cplscheme::SerialCouplingScheme cplScheme(maxTime, maxTimeWindows, timeWindowSize, nameParticipant0, nameParticipant1, context.name, m2n,
constants::FIXED_TIME_WINDOW_SIZE,
BaseCouplingScheme::Implicit, minIterations, maxIterations);
612 cplScheme.addDataToSend(mesh->data(sendDataIndex), mesh,
false,
true);
613 cplScheme.addDataToReceive(mesh->data(receiveDataIndex), mesh,
false,
true);
614 cplScheme.determineInitialDataExchange();
618 runCoupling(cplScheme, context.name, meshConfig, validIterations);
621PRECICE_TEST_SETUP(
"Participant0"_on(1_rank),
"Participant1"_on(1_rank), Require::Events)
627 auto m2n = context.connectPrimaryRanks(
"Participant0",
"Participant1", options);
632 dataConfig->addData(
"data0", mesh::Data::typeName::SCALAR);
633 dataConfig->addData(
"data1", mesh::Data::typeName::VECTOR);
637 mesh->createData(
"data0", 1, 0_dataID);
638 mesh->createData(
"data1", 3, 1_dataID);
639 mesh->createVertex(Eigen::Vector3d::Zero());
640 mesh->allocateDataValues();
641 meshConfig.insertMeshToMeshDimensionsMap(mesh->getName(), mesh->getDimensions());
642 meshConfig.addMesh(mesh);
645 double maxTime = 1.0;
646 int maxTimeWindows = 3;
647 double timeWindowSize = 0.1;
650 int sendDataIndex = -1;
651 int receiveDataIndex = -1;
653 if (context.isNamed(nameParticipant0)) {
655 receiveDataIndex = 1;
656 validIterations = {3, 3, 3};
659 receiveDataIndex = 0;
660 validIterations = {3, 3, 3};
664 const int minIterations = 1;
665 const int maxIterations = 3;
666 cplscheme::SerialCouplingScheme cplScheme(maxTime, maxTimeWindows, timeWindowSize, nameParticipant0, nameParticipant1, context.name, m2n,
constants::FIXED_TIME_WINDOW_SIZE,
BaseCouplingScheme::Implicit, minIterations, maxIterations);
667 cplScheme.addDataToSend(mesh->data(sendDataIndex), mesh,
false,
true);
668 cplScheme.addDataToReceive(mesh->data(receiveDataIndex), mesh,
false,
true);
669 cplScheme.determineInitialDataExchange();
672 cplScheme, context.name, meshConfig, validIterations);
675PRECICE_TEST_SETUP(
"Participant0"_on(1_rank),
"Participant1"_on(1_rank), Require::Events)
681 auto m2n = context.connectPrimaryRanks(
"Participant0",
"Participant1", options);
688 dataConfig->addData(
"Data0", mesh::Data::typeName::SCALAR);
689 dataConfig->addData(
"Data1", mesh::Data::typeName::VECTOR);
693 const auto dataID0 = mesh->createData(
"Data0", 1, 0_dataID)->getID();
694 const auto dataID1 = mesh->createData(
"Data1", 3, 1_dataID)->getID();
695 mesh->createVertex(Eigen::Vector3d::Zero());
696 mesh->allocateDataValues();
697 meshConfig.insertMeshToMeshDimensionsMap(mesh->getName(), mesh->getDimensions());
698 meshConfig.addMesh(mesh);
701 const double maxTime = 1.0;
702 const int maxTimeWindows = 3;
703 const double timeWindowSize = 0.1;
704 const double timeStepSize = timeWindowSize;
707 int sendDataIndex = -1;
708 int receiveDataIndex = -1;
709 bool dataRequiresInitialization =
false;
710 if (context.isNamed(nameParticipant0)) {
711 sendDataIndex = dataID0;
712 receiveDataIndex = dataID1;
714 sendDataIndex = dataID1;
715 receiveDataIndex = dataID0;
716 dataRequiresInitialization =
true;
720 const int minIterations = 1;
721 const int maxIterations = 3;
722 cplscheme::SerialCouplingScheme cplScheme(maxTime, maxTimeWindows, timeWindowSize, nameParticipant0, nameParticipant1, context.name, m2n,
constants::FIXED_TIME_WINDOW_SIZE,
BaseCouplingScheme::Implicit, minIterations, maxIterations);
725 cplScheme.addDataToSend(mesh->data(sendDataIndex), mesh, dataRequiresInitialization,
true);
726 CouplingData *sendCouplingData = Fixture::getSendData(cplScheme, sendDataIndex);
727 cplScheme.addDataToReceive(mesh->data(receiveDataIndex), mesh, not dataRequiresInitialization,
true);
728 CouplingData *receiveCouplingData = Fixture::getReceiveData(cplScheme, receiveDataIndex);
729 cplScheme.determineInitialDataExchange();
731 if (context.isNamed(nameParticipant0)) {
733 BOOST_TEST(receiveCouplingData->
getSize() == 3);
736 BOOST_TEST(sendCouplingData->
getSize() == 1);
739 BOOST_TEST(Fixture::isImplicitCouplingScheme(cplScheme));
741 cplScheme.initialize();
742 BOOST_TEST(cplScheme.hasDataBeenReceived());
744 BOOST_TEST(receiveCouplingData->
getSize() == 3);
749 BOOST_TEST(sendCouplingData->
getSize() == 1);
755 while (cplScheme.isCouplingOngoing()) {
756 if (cplScheme.isActionRequired(CouplingScheme::Action::WriteCheckpoint)) {
757 cplScheme.markActionFulfilled(CouplingScheme::Action::WriteCheckpoint);
759 BOOST_TEST(cplScheme.getNextTimeStepMaxSize() == timeStepSize);
760 sendCouplingData->
setSampleAtTime(cplScheme.getTime() + timeStepSize,
time::Sample{sendCouplingData->getDimensions(), Eigen::VectorXd::Constant(sendCouplingData->getSize(), 4.0)});
761 cplScheme.addComputedTime(timeStepSize);
762 sendCouplingData->
setSampleAtTime(cplScheme.getTime(),
time::Sample{sendCouplingData->getDimensions(), Eigen::VectorXd::Constant(sendCouplingData->getSize(), 4.0)});
763 cplScheme.firstSynchronization({});
764 cplScheme.firstExchange();
765 cplScheme.secondSynchronization();
766 cplScheme.secondExchange();
767 BOOST_TEST(cplScheme.hasDataBeenReceived());
768 if (cplScheme.isActionRequired(CouplingScheme::Action::ReadCheckpoint)) {
769 cplScheme.markActionFulfilled(CouplingScheme::Action::ReadCheckpoint);
773 BOOST_TEST(context.isNamed(nameParticipant1));
774 BOOST_TEST(cplScheme.isActionRequired(CouplingScheme::Action::InitializeData));
775 Eigen::VectorXd v(3);
778 cplScheme.markActionFulfilled(CouplingScheme::Action::InitializeData);
779 BOOST_TEST(receiveCouplingData->
getSize() == 1);
781 BOOST_TEST(sendCouplingData->
getSize() == 3);
783 cplScheme.initialize();
784 BOOST_TEST(cplScheme.hasDataBeenReceived());
785 BOOST_TEST(receiveCouplingData->
getSize() == 1);
789 BOOST_TEST(sendCouplingData->
getSize() == 3);
793 while (cplScheme.isCouplingOngoing()) {
794 if (cplScheme.isActionRequired(CouplingScheme::Action::WriteCheckpoint)) {
795 cplScheme.markActionFulfilled(CouplingScheme::Action::WriteCheckpoint);
797 BOOST_TEST(cplScheme.getNextTimeStepMaxSize() == timeStepSize);
799 cplScheme.addComputedTime(timeStepSize);
800 cplScheme.firstSynchronization({});
801 cplScheme.firstExchange();
802 cplScheme.secondSynchronization();
803 cplScheme.secondExchange();
804 if (cplScheme.isCouplingOngoing()) {
805 BOOST_TEST(cplScheme.hasDataBeenReceived());
807 if (cplScheme.isActionRequired(CouplingScheme::Action::ReadCheckpoint)) {
808 cplScheme.markActionFulfilled(CouplingScheme::Action::ReadCheckpoint);
812 cplScheme.finalize();
BOOST_AUTO_TEST_SUITE(PreProcess)
BOOST_AUTO_TEST_SUITE_END()
void runCouplingWithSubcycling(CouplingScheme &cplScheme, const std::string &nameParticipant, const mesh::MeshConfiguration &meshConfig, const std::vector< int > &validIterations)
BOOST_AUTO_TEST_CASE(testParseConfigurationWithRelaxation)
void runCoupling(CouplingScheme &cplScheme, const std::string &nameParticipant, const mesh::MeshConfiguration &meshConfig, const std::vector< int > &validIterations)
#define PRECICE_TEST_SETUP(...)
Creates and attaches a TestSetup to a Boost test case.
Performs XML configuration of a participant.
void addConvergenceMeasure(int dataID, bool suffices, bool strict, impl::PtrConvergenceMeasure measure)
Adds a measure to determine the convergence of coupling iterations.
void addDataToReceive(const mesh::PtrData &data, mesh::PtrMesh mesh, bool requiresInitialization, bool exchangeSubsteps)
Adds data to be received on data exchange.
void addDataToSend(const mesh::PtrData &data, mesh::PtrMesh mesh, bool requiresInitialization, bool exchangeSubsteps)
Adds data to be sent on data exchange and possibly be modified during coupling iterations.
void determineInitialDataExchange() override
Determines which data is initialized and therefore has to be exchanged during initialize.
const Eigen::VectorXd & values() const
Returns a const reference to the data values.
int getDimensions() const
const Eigen::VectorXd & previousIteration() const
returns data value from previous iteration
void setSampleAtTime(double time, time::Sample sample)
Add sample at given time to _timeStepsStorage.
int getPreviousIterationSize() const
returns size of previous iteration
Configuration for coupling schemes.
mesh::PtrData getData(const std::string &dataName, const std::string &meshName) const
acceleration::PtrAccelerationConfiguration _accelerationConfig
mesh::PtrData findDataByID(int ID) const
Interface for all coupling schemes.
virtual void initialize()=0
Initializes the coupling scheme and establishes a communication connection to the coupling partner....
virtual ChangedMeshes firstSynchronization(const ChangedMeshes &changes)=0
virtual bool addComputedTime(double timeToAdd)=0
Adds newly computed time. Has to be called before every advance.
virtual double getTime() const =0
Returns the currently computed time of the coupling scheme.
virtual ChangedMeshes secondSynchronization()=0
virtual void markActionFulfilled(Action action)=0
Tells the coupling scheme that the accessor has performed the given action.
virtual void secondExchange()=0
virtual bool isActionFulfilled(Action action) const =0
Returns true, if the given action has already been performed by the accessor.
virtual double getNextTimeStepMaxSize() const =0
Returns the maximal size of the next time step to be computed.
virtual bool isTimeWindowComplete() const =0
Returns true, when the accessor can advance to the next time window.
virtual void finalize()=0
Finalizes the coupling and disconnects communication.
virtual bool isCouplingOngoing() const =0
Returns true, when the coupled simulation is still ongoing.
virtual int getTimeWindows() const =0
Returns the currently computed time windows of the coupling scheme.
virtual bool isActionRequired(Action action) const =0
Returns true, if the given action has to be performed by the accessor.
virtual bool hasDataBeenReceived() const =0
Returns true, if data has been exchanged in last call of advance().
virtual void firstExchange()=0
Coupling scheme for serial coupling, i.e. staggered execution of two coupled participants.
Measures the convergence from an old data set to a new one.
Configuration for communication channels between solvers.
Performs and provides configuration for Data objects from XML files.
const std::vector< PtrMesh > & meshes() const
Returns all configured meshes.
Container and creator for meshes.
VertexID getID() const
Returns the unique (among vertices of one mesh on one processor) ID of the vertex.
Represents an XML tag to be configured automatically.
contains implementations of coupling schemes for coupled simulations.
std::shared_ptr< DataConfiguration > PtrDataConfiguration
std::shared_ptr< MeshConfiguration > PtrMeshConfiguration
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...
std::string getPathToSources()
Returns the base path to the sources.
XMLTag getRootTag()
Returns an empty root tag with name "configuration".
std::string configure(XMLTag &tag, const precice::xml::ConfigurationContext &context, std::string_view configurationFilename)
Configures the given configuration from file configurationFilename.
Main namespace of the precice library.
SerialImplicitCouplingSchemeFixture()
struct giving access _useOnlyPrimaryCom
Tightly coupled to the parameters of Participant()