1 #include "MyObserver.h"
3 #include "tarch/logging/Log.h"
4 #include "tarch/logging/CommandLineLogger.h"
5 #include "tarch/logging/ChromeTraceFileLogger.h"
6 #include "tarch/logging/LogFilter.h"
7 #include "tarch/multicore/Core.h"
8 #include "tarch/mpi/Rank.h"
10 #include "peano4/peano4.h"
11 #include "peano4/grid/Spacetree.h"
12 #include "peano4/parallel/SpacetreeSet.h"
13 #include "peano4/parallel/Node.h"
16 tarch::logging::Log
_log(
"examples::grid");
21 #include "peano4/UnitTests.h"
22 #include "tarch/UnitTests.h"
26 int unitTestsErrors = 0;
27 tarch::tests::TestCase* tests =
nullptr;
29 tests = tarch::getUnitTests();
31 unitTestsErrors += tests->getNumberOfErrors();
34 tests = peano4::getUnitTests();
36 unitTestsErrors += tests->getNumberOfErrors();
39 if (unitTestsErrors != 0) {
40 logError(
"main()",
"unit tests failed. Quit.");
41 tarch::mpi::Rank::abort( -2 );
48 examples::grid::MyObserver emptyObserver;
50 peano4::initSingletons(
63 peano4::grid::Spacetree spacetree(
74 for (
int i=0; i<2*examples::grid::MyObserver::GridRefinementIterations + examples::grid::MyObserver::StationaryIterations; i++) {
75 tarch::logging::CommandLineLogger::getInstance().closeOutputStreamAndReopenNewOne();
78 emptyObserver.beginTraversalOnRank(
false);
80 spacetree.traverse( emptyObserver );
82 emptyObserver.endTraversalOnRank(
false);
85 logInfo(
"runSerial(...)",
"grid statistics = " << spacetree.getGridStatistics().toString() );
89 peano4::grid::TraversalVTKPlotter plotterObserver(
"grid-serial" );
90 spacetree.traverse( plotterObserver );
92 peano4::shutdownSingletons();
99 int targetRank = (phase+1) % tarch::mpi::Rank::getInstance().getNumberOfRanks();
102 const int spacetreeOfInterest = 0;
104 if ( peano4::parallel::SpacetreeSet::getInstance().isLocalSpacetree(spacetreeOfInterest) ) {
106 peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D
108 peano4::parallel::SpacetreeSet::getInstance().split(0,peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()/3,targetRank)
110 peano4::parallel::SpacetreeSet::getInstance().split(0,peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()/3,targetRank)
112 logInfo(
"updateDomainDecomposition()",
"split rank 0 into 1 and 2 -> success" );
121 peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D*2
123 const int spacetreeOfInterest = 1;
125 if ( peano4::parallel::SpacetreeSet::getInstance().isLocalSpacetree(spacetreeOfInterest) ) {
126 if ( not peano4::parallel::SpacetreeSet::getInstance().split(1,peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()/3/3,targetRank) ) {
127 logInfo(
"updateDomainDecomposition()",
"split rank 1 -> failed" );
131 logInfo(
"updateDomainDecomposition()",
"split rank 1 -> success" );
139 peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D*4
141 const int spacetreeOfInterest =
periodicBC==0 ? 1 : 0;
142 if ( peano4::parallel::SpacetreeSet::getInstance().isLocalSpacetree(spacetreeOfInterest) ) {
143 if ( not peano4::parallel::SpacetreeSet::getInstance().split(
145 peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()/3/3/3,targetRank)
155 peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D*6
157 const int spacetreeOfInterest = 2;
158 if ( peano4::parallel::SpacetreeSet::getInstance().isLocalSpacetree(spacetreeOfInterest) ) {
159 if ( not peano4::parallel::SpacetreeSet::getInstance().split(2,peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()/3/3/3/3,targetRank) ) {
168 peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D*8
170 const int spacetreeOfInterest = 2;
171 if ( peano4::parallel::SpacetreeSet::getInstance().isLocalSpacetree(spacetreeOfInterest) ) {
172 if ( not peano4::parallel::SpacetreeSet::getInstance().split(spacetreeOfInterest,peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()/3/3/3/3/3,targetRank) ) {
181 peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D*10
183 const int spacetreeOfInterest = 1;
184 if ( peano4::parallel::SpacetreeSet::getInstance().isLocalSpacetree(spacetreeOfInterest) ) {
185 if ( not peano4::parallel::SpacetreeSet::getInstance().split(1,10,targetRank) ) {
195 peano4::initSingletons(
206 examples::grid::MyObserver emptyObserver;
208 if (tarch::mpi::Rank::getInstance().isGlobalMaster() ) {
209 peano4::parallel::Node::getInstance().setNextProgramStep(14);
210 for (
int i=0; i<2*examples::grid::MyObserver::GridRefinementIterations + examples::grid::MyObserver::StationaryIterations; i++) {
211 tarch::logging::CommandLineLogger::getInstance().closeOutputStreamAndReopenNewOne();
213 emptyObserver.beginTraversalOnRank(
true);
215 peano4::parallel::SpacetreeSet::getInstance().traverse( emptyObserver );
217 emptyObserver.endTraversalOnRank(
true);
220 logInfo(
"runParallel(...)",
"grid statistics = " << peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().toString() );
225 logInfo(
"runParallel(...)",
"terminated successfully" );
228 while (peano4::parallel::Node::getInstance().continueToRun()) {
229 assertionEquals( peano4::parallel::Node::getInstance().getCurrentProgramStep(), 14 );
231 tarch::logging::CommandLineLogger::getInstance().closeOutputStreamAndReopenNewOne();
234 emptyObserver.beginTraversalOnRank(
true);
236 peano4::parallel::SpacetreeSet::getInstance().traverse(emptyObserver);
238 emptyObserver.endTraversalOnRank(
true);
243 peano4::shutdownSingletons();
247 int main(
int argc,
char** argv) {
248 const int ExitCodeSuccess = 0;
249 const int ExitCodeUnitTestsFailed = 1;
251 peano4::initParallelEnvironment(&argc,&argv);
252 peano4::fillLookupTables();
254 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
255 tarch::logging::LogFilter::FilterListEntry::TargetDebug, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"peano4",
true
257 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
258 tarch::logging::LogFilter::FilterListEntry::TargetInfo, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"peano4",
false
260 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
261 tarch::logging::LogFilter::FilterListEntry::TargetTrace, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"peano4",
false
263 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
264 tarch::logging::LogFilter::FilterListEntry::TargetDebug, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"tarch",
true
266 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
267 tarch::logging::LogFilter::FilterListEntry::TargetInfo, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"tarch",
false
269 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
270 tarch::logging::LogFilter::FilterListEntry::TargetTrace, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"tarch",
false
272 tarch::logging::CommandLineLogger::getInstance().setOutputFile(
"trace.txt" );
274 tarch::multicore::Core::getInstance().configure(4,2,1);
284 for (
int i=0; i<DIMENSIONS; i++) {
287 logInfo(
"main(...)",
"use a random periodic boundary condition choice: " <<
periodicBC );
290 #if defined(WITH_MPI) or defined(WITH_MULTITHREADING)
296 peano4::shutdownParallelEnvironment();
std::bitset< DIMENSIONS > periodicBC
int main(int argc, char **argv)
tarch::logging::Log _log("examples::grid")
void updateDomainDecomposition()