Peano
main.cpp
Go to the documentation of this file.
1 #include "MyObserver.h"
2 
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"
9 
10 #include "peano4/peano4.h"
11 #include "peano4/grid/Spacetree.h"
12 #include "peano4/parallel/SpacetreeSet.h"
13 #include "peano4/parallel/Node.h"
14 
15 
16 tarch::logging::Log _log("examples::grid");
17 
18 
19 std::bitset<DIMENSIONS> periodicBC = 0;
20 
21 #include "peano4/UnitTests.h"
22 #include "tarch/UnitTests.h"
23 
24 
25 void runTests() {
26  int unitTestsErrors = 0;
27  tarch::tests::TestCase* tests = nullptr;
28 
29  tests = tarch::getUnitTests();
30  tests->run();
31  unitTestsErrors += tests->getNumberOfErrors();
32  delete tests;
33 
34  tests = peano4::getUnitTests();
35  tests->run();
36  unitTestsErrors += tests->getNumberOfErrors();
37  delete tests;
38 
39  if (unitTestsErrors != 0) {
40  logError("main()", "unit tests failed. Quit.");
41  tarch::mpi::Rank::abort( -2 );
42  }
43 }
44 
45 
46 
47 void runSerial() {
48  examples::grid::MyObserver emptyObserver;
49 
50  peano4::initSingletons(
51 #if DIMENSIONS==2
52  {0.0, 0.0},
53  {1.0, 1.0},
54 #else
55  {0.0, 0.0, 0.0},
56  {1.0, 1.0, 1.0},
57 #endif
59  );
60 
61 
62  // You wouldn't do this usually. We always work against the set.
63  peano4::grid::Spacetree spacetree(
64 #if DIMENSIONS==2
65  {0.0, 0.0},
66  {1.0, 1.0}
67 #else
68  {0.0, 0.0, 0.0},
69  {1.0, 1.0, 1.0}
70 #endif
71  );
72 
73 
74  for (int i=0; i<2*examples::grid::MyObserver::GridRefinementIterations + examples::grid::MyObserver::StationaryIterations; i++) {
75  tarch::logging::CommandLineLogger::getInstance().closeOutputStreamAndReopenNewOne();
76 
77  #if PEANO_DEBUG>0
78  emptyObserver.beginTraversalOnRank(false);
79  #endif
80  spacetree.traverse( emptyObserver );
81  #if PEANO_DEBUG>0
82  emptyObserver.endTraversalOnRank(false);
83  #endif
84 
85  logInfo( "runSerial(...)", "grid statistics = " << spacetree.getGridStatistics().toString() );
86  }
87 
88 
89  peano4::grid::TraversalVTKPlotter plotterObserver( "grid-serial" );
90  spacetree.traverse( plotterObserver );
91 
92  peano4::shutdownSingletons();
93 }
94 
95 
97  static int phase = 0;
98 
99  int targetRank = (phase+1) % tarch::mpi::Rank::getInstance().getNumberOfRanks();
100 
101  if (phase==0) {
102  const int spacetreeOfInterest = 0;
103 
104  if ( peano4::parallel::SpacetreeSet::getInstance().isLocalSpacetree(spacetreeOfInterest) ) {
105  if (
106  peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D
107  and
108  peano4::parallel::SpacetreeSet::getInstance().split(0,peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()/3,targetRank)
109  and
110  peano4::parallel::SpacetreeSet::getInstance().split(0,peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()/3,targetRank)
111  ) {
112  logInfo( "updateDomainDecomposition()", "split rank 0 into 1 and 2 -> success" );
113  phase++;
114  }
115  }
116  else phase++;
117  }
118  else if (
119  phase==1
120  and
121  peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D*2
122  ) {
123  const int spacetreeOfInterest = 1;
124 
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" );
128  phase++;
129  }
130  else {
131  logInfo( "updateDomainDecomposition()", "split rank 1 -> success" );
132  }
133  }
134  else phase++;
135  }
136  else if (
137  phase==2
138  and
139  peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D*4
140  ) {
141  const int spacetreeOfInterest = periodicBC==0 ? 1 : 0;
142  if ( peano4::parallel::SpacetreeSet::getInstance().isLocalSpacetree(spacetreeOfInterest) ) {
143  if ( not peano4::parallel::SpacetreeSet::getInstance().split(
144  spacetreeOfInterest,
145  peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()/3/3/3,targetRank)
146  ) {
147  phase++;
148  }
149  }
150  else phase++;
151  }
152  else if (
153  phase==3
154  and
155  peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D*6
156  ) {
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) ) {
160  phase++;
161  }
162  }
163  else phase++;
164  }
165  else if (
166  phase==4
167  and
168  peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D*8
169  ) {
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) ) {
173  phase++;
174  }
175  }
176  else phase++;
177  }
178  else if (
179  phase==5
180  and
181  peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells()>=THREE_POWER_D*10
182  ) {
183  const int spacetreeOfInterest = 1;
184  if ( peano4::parallel::SpacetreeSet::getInstance().isLocalSpacetree(spacetreeOfInterest) ) {
185  if ( not peano4::parallel::SpacetreeSet::getInstance().split(1,10,targetRank) ) {
186  phase++;
187  }
188  }
189  else phase++;
190  }
191 }
192 
193 
194 void runParallel() {
195  peano4::initSingletons(
196 #if DIMENSIONS==2
197  {0.0, 0.0},
198  {1.0, 1.0},
199 #else
200  {0.0, 0.0, 0.0},
201  {1.0, 1.0, 1.0},
202 #endif
203  periodicBC
204  );
205 
206  examples::grid::MyObserver emptyObserver;
207 
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();
212  #if PEANO_DEBUG>0
213  emptyObserver.beginTraversalOnRank(true);
214  #endif
215  peano4::parallel::SpacetreeSet::getInstance().traverse( emptyObserver );
216  #if PEANO_DEBUG>0
217  emptyObserver.endTraversalOnRank(true);
218  #endif
219 
220  logInfo( "runParallel(...)", "grid statistics = " << peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().toString() );
221 
223  }
224 
225  logInfo( "runParallel(...)", "terminated successfully" );
226  }
227  else { // not the global master
228  while (peano4::parallel::Node::getInstance().continueToRun()) {
229  assertionEquals( peano4::parallel::Node::getInstance().getCurrentProgramStep(), 14 );
230 
231  tarch::logging::CommandLineLogger::getInstance().closeOutputStreamAndReopenNewOne();
232 
233  #if PEANO_DEBUG>0
234  emptyObserver.beginTraversalOnRank(true);
235  #endif
236  peano4::parallel::SpacetreeSet::getInstance().traverse(emptyObserver);
237  #if PEANO_DEBUG>0
238  emptyObserver.endTraversalOnRank(true);
239  #endif
240  }
241  }
242 
243  peano4::shutdownSingletons();
244 }
245 
246 
247 int main(int argc, char** argv) {
248  const int ExitCodeSuccess = 0;
249  const int ExitCodeUnitTestsFailed = 1;
250 
251  peano4::initParallelEnvironment(&argc,&argv);
252  peano4::fillLookupTables();
253 
254  tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
255  tarch::logging::LogFilter::FilterListEntry::TargetDebug, tarch::logging::LogFilter::FilterListEntry::AnyRank, "peano4", true
256  ));
257  tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
258  tarch::logging::LogFilter::FilterListEntry::TargetInfo, tarch::logging::LogFilter::FilterListEntry::AnyRank, "peano4", false
259  ));
260  tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
261  tarch::logging::LogFilter::FilterListEntry::TargetTrace, tarch::logging::LogFilter::FilterListEntry::AnyRank, "peano4", false
262  ));
263  tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
264  tarch::logging::LogFilter::FilterListEntry::TargetDebug, tarch::logging::LogFilter::FilterListEntry::AnyRank, "tarch", true
265  ));
266  tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
267  tarch::logging::LogFilter::FilterListEntry::TargetInfo, tarch::logging::LogFilter::FilterListEntry::AnyRank, "tarch", false
268  ));
269  tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
270  tarch::logging::LogFilter::FilterListEntry::TargetTrace, tarch::logging::LogFilter::FilterListEntry::AnyRank, "tarch", false
271  ));
272  tarch::logging::CommandLineLogger::getInstance().setOutputFile( "trace.txt" );
273 
274  tarch::multicore::Core::getInstance().configure(4,2,1);
275 
276  runTests();
277 
278  if (argc==2) {
279  periodicBC = std::atoi( argv[1] );
280  }
281  else {
282  srand( time(NULL) );
283  periodicBC = 0;
284  for (int i=0; i<DIMENSIONS; i++) {
285  periodicBC[i] = rand() < RAND_MAX / 5;
286  }
287  logInfo( "main(...)", "use a random periodic boundary condition choice: " << periodicBC );
288  }
289 
290  #if defined(WITH_MPI) or defined(WITH_MULTITHREADING)
291  runParallel();
292  #else
293  runSerial();
294  #endif
295 
296  peano4::shutdownParallelEnvironment();
297 
298  return 0;
299 }
void runSerial()
Definition: main.cpp:47
std::bitset< DIMENSIONS > periodicBC
Definition: main.cpp:19
int main(int argc, char **argv)
Definition: main.cpp:247
void runTests()
Definition: main.cpp:25
void runParallel()
Definition: main.cpp:194
tarch::logging::Log _log("examples::grid")
void updateDomainDecomposition()
Definition: main.cpp:96