22 std::cout <<
"Entering TestRK4Advancer" << std::endl;
36 std::ostringstream messageStream;
38 std::vector<size_t> numNodes(gridSizes);
41 std::cerr <<
"ERROR! CreateSimpleGrid failed." << std::endl;
48 size_t numNodesDomain = numNodes[0]*numNodes[1]*numNodes[2];
49 size_t numCellsDomain = (numNodes[0]-1)*(numNodes[1]-1)*(numNodes[2]-1);
52 testState.
AddField(
"simTime",
's',1,8,
"s");
53 testState.
AddField(
"simDT",
's',1,8,
"s");
61 testState.
Create(numNodesDomain,numCellsDomain);
67 double f0 = a*testRHS.TestF(t,0);
68 double f1 = a*testRHS.TestF(t,1);
69 double f2 = a*testRHS.TestF(t,2);
70 double f3 = a*testRHS.TestF(t,3);
71 double f4 = a*testRHS.TestF(t,4);
72 double f5 = a*testRHS.TestF(t,5);
73 double f6 = a*testRHS.TestF(t,6);
78 rkDomain.SetNumGrids(1);
80 rkDomain.GridNames().resize(1,
"testgrid");
81 rkDomain.SetGrid(0,testGrid);
82 rkDomain.SetGridState(0,testState);
85 rkDomain.PartitionDomain(0);
86 state_t &domainState(rkDomain.State(0));
88 std::cout <<
"Initing" << std::endl;
89 rkDomain.SetRHS(testRHS);
90 testRHS.SetTimestep(dt);
93 domainState.SetFieldBuffer(
"simTime",&t);
94 domainState.SetFieldBuffer(
"simDT",&dt);
95 domainState.SetFieldBuffer(
"F0",&f0);
96 domainState.SetFieldBuffer(
"F1",&f1);
97 domainState.SetFieldBuffer(
"F2",&f2);
98 domainState.SetFieldBuffer(
"F3",&f3);
99 domainState.SetFieldBuffer(
"F4",&f4);
100 domainState.SetFieldBuffer(
"F5",&f5);
101 domainState.SetFieldBuffer(
"F6",&f6);
108 std::cout <<
"InitializeAdvancer" << std::endl;
116 std::cout << messageStream.str() << std::endl;
120 bool isAccurate =
true;
121 bool isOrder4 =
true;
122 double errorTolerance = 1e-15;
124 std::vector<std::vector<double> > errorValues(nTrial);
125 std::vector<double> timeSteps;
127 std::cout <<
"Beginning trials" << std::endl;
128 for(
int iTrial = 0;iTrial < 10;iTrial++){
133 dt = 1.0/(std::pow(2.0,static_cast<double>(iTrial)));
134 testRHS.SetTimestep(dt);
136 f0 = a*testRHS.TestF(t,0);
137 f1 = a*testRHS.TestF(t,1);
138 f2 = a*testRHS.TestF(t,2);
139 f3 = a*testRHS.TestF(t,3);
140 f4 = a*testRHS.TestF(t,4);
141 f5 = a*testRHS.TestF(t,5);
142 f6 = a*testRHS.TestF(t,6);
145 std::cout <<
"Driver:Time(before): " << t << std::endl;
146 std::cout <<
"Driver:TimeStep: " << dt << std::endl;
149 timeSteps.push_back(dt);
151 std::cout <<
"Driver:F(before): " << std::endl
152 <<
"Driver:f0 = " << f0 << std::endl
153 <<
"Driver:f1 = " << f1 << std::endl
154 <<
"Driver:f2 = " << f2 << std::endl
155 <<
"Driver:f3 = " << f3 << std::endl
156 <<
"Driver:f4 = " << f4 << std::endl
157 <<
"Driver:f5 = " << f5 << std::endl
158 <<
"Driver:f6 = " << f6 << std::endl;
165 if(std::abs(t - tbefore - dt) >= 1e-24){
166 std::cout <<
"Time did not advance, aborting test." << std::endl;
172 std::cout <<
"Time(after): " << t << std::endl;
173 std::cout <<
"Driver:F(after): " << std::endl
174 <<
"Driver:f0 = " << f0 << std::endl
175 <<
"Driver:f1 = " << f1 << std::endl
176 <<
"Driver:f2 = " << f2 << std::endl
177 <<
"Driver:f3 = " << f3 << std::endl
178 <<
"Driver:f4 = " << f4 << std::endl
179 <<
"Driver:f5 = " << f5 << std::endl
180 <<
"Driver:f6 = " << f6 << std::endl;
183 errorValues[iTrial].resize(7,0.0);
184 errorValues[iTrial][0] = std::abs(f0 - a*testRHS.TestF(t,0));
185 errorValues[iTrial][1] = std::abs(f1 - a*testRHS.TestF(t,1));
186 errorValues[iTrial][2] = std::abs(f2 - a*testRHS.TestF(t,2));
187 errorValues[iTrial][3] = std::abs(f3 - a*testRHS.TestF(t,3));
188 errorValues[iTrial][4] = std::abs(f4 - a*testRHS.TestF(t,4));
189 errorValues[iTrial][5] = std::abs(f5 - a*testRHS.TestF(t,5));
190 errorValues[iTrial][6] = std::abs(f6 - a*testRHS.TestF(t,6));
194 for(
int iVal = 0;iVal < 5;iVal++)
195 if(errorValues[iTrial][iVal] > errorTolerance)
199 for(
int iVal = 0;iVal < 7;iVal++){
200 std::cout <<
"Driver:Error(" << iVal <<
") = " << errorValues[iTrial][iVal] << std::endl;
206 for(
int iTrial = 0;iTrial < 8;iTrial++){
207 double logErr = std::log(errorValues[iTrial+1][5]/errorValues[iTrial][5]);
208 double logDT = std::log(timeSteps[iTrial+1]/timeSteps[iTrial]);
209 double methodOrder = logErr/logDT;
210 std::cout <<
"iTrial(" << iTrial <<
") Order: " << methodOrder << std::endl;
211 if(std::abs(methodOrder - 5) > 1e-3)
215 serialUnitResults.
UpdateResult(
"Advancer:RK4:DidNotCrashAndBurn",
true);
216 serialUnitResults.
UpdateResult(
"Advancer:RK4:Accurate",isAccurate);
217 serialUnitResults.
UpdateResult(
"Advancer:RK4:Order4",isOrder4);
225 std::cout <<
"TestRK4Advancer2" << std::endl;
239 std::ostringstream messageStream;
241 std::vector<size_t> numNodes(gridSizes);
250 size_t numNodesDomain = numNodes[0]*numNodes[1]*numNodes[2];
251 size_t numCellsDomain = (numNodes[0]-1)*(numNodes[1]-1)*(numNodes[2]-1);
255 testState.
AddField(
"simTime",
's',1,8,
"s");
256 testState.
AddField(
"simDT",
's',1,8,
"s");
257 testState.
AddField(
"inputCFL",
's',1,8,
"");
258 testState.
AddField(
"F0",
'n',1,8,
"");
259 testState.
AddField(
"F1",
'n',1,8,
"");
260 testState.
AddField(
"F2",
'n',1,8,
"");
261 testState.
AddField(
"F3",
'n',1,8,
"");
262 testState.
AddField(
"F4",
'n',1,8,
"");
263 testState.
AddField(
"F5",
'n',1,8,
"");
264 testState.
AddField(
"F6",
'n',1,8,
"");
265 testState.
Create(numNodesDomain,numCellsDomain);
272 double f0 = a*testRHS.TestF(t,0);
273 double f1 = a*testRHS.TestF(t,1);
274 double f2 = a*testRHS.TestF(t,2);
275 double f3 = a*testRHS.TestF(t,3);
276 double f4 = a*testRHS.TestF(t,4);
277 double f5 = a*testRHS.TestF(t,5);
278 double f6 = a*testRHS.TestF(t,6);
284 rkDomain.SetNumGrids(1);
285 rkDomain.SetGrid(0,testGrid);
286 rkDomain.SetGridState(0,testState);
287 state_t &domainState(rkDomain.State(0));
288 rkDomain.SetRHS(testRHS);
289 rkDomain.PartitionDomain(0);
290 testRHS.SetTimestep(dt);
293 domainState.SetFieldBuffer(
"simTime",&t);
294 domainState.SetFieldBuffer(
"simDT",&dt);
295 domainState.SetFieldBuffer(
"inputCFL",&cfl);
296 domainState.SetFieldBuffer(
"F0",&f0);
297 domainState.SetFieldBuffer(
"F1",&f1);
298 domainState.SetFieldBuffer(
"F2",&f2);
299 domainState.SetFieldBuffer(
"F3",&f3);
300 domainState.SetFieldBuffer(
"F4",&f4);
301 domainState.SetFieldBuffer(
"F5",&f5);
302 domainState.SetFieldBuffer(
"F6",&f6);
322 std::cout << messageStream.str() << std::endl;
326 bool isAccurate =
true;
327 bool isOrder4 =
true;
328 double errorTolerance = 1e-15;
330 std::vector<std::vector<double> > errorValues(nTrial);
331 std::vector<double> timeSteps;
333 for(
int iTrial = 0;iTrial < 10;iTrial++){
338 dt = 1.0/(std::pow(2.0,static_cast<double>(iTrial)));
339 testRHS.SetTimestep(dt);
340 f0 = a*testRHS.TestF(t,0);
341 f1 = a*testRHS.TestF(t,1);
342 f2 = a*testRHS.TestF(t,2);
343 f3 = a*testRHS.TestF(t,3);
344 f4 = a*testRHS.TestF(t,4);
345 f5 = a*testRHS.TestF(t,5);
346 f6 = a*testRHS.TestF(t,6);
349 std::cout <<
"Driver:Time(before): " << t << std::endl;
350 std::cout <<
"Driver:TimeStep: " << dt << std::endl;
353 timeSteps.push_back(dt);
355 std::cout <<
"Driver:F(before): " << std::endl
356 <<
"Driver:f0 = " << f0 << std::endl
357 <<
"Driver:f1 = " << f1 << std::endl
358 <<
"Driver:f2 = " << f2 << std::endl
359 <<
"Driver:f3 = " << f3 << std::endl
360 <<
"Driver:f4 = " << f4 << std::endl
361 <<
"Driver:f5 = " << f5 << std::endl
362 <<
"Driver:f6 = " << f6 << std::endl;
368 if(std::abs(t - tbefore - dt) >= 1e-24){
369 std::cout <<
"Time did not advance, aborting test." << std::endl;
376 std::cout <<
"Time(after): " << t << std::endl;
377 std::cout <<
"Driver:F(after): " << std::endl
378 <<
"Driver:f0 = " << f0 << std::endl
379 <<
"Driver:f1 = " << f1 << std::endl
380 <<
"Driver:f2 = " << f2 << std::endl
381 <<
"Driver:f3 = " << f3 << std::endl
382 <<
"Driver:f4 = " << f4 << std::endl
383 <<
"Driver:f5 = " << f5 << std::endl
384 <<
"Driver:f6 = " << f6 << std::endl;
388 errorValues[iTrial].resize(7,0.0);
389 errorValues[iTrial][0] = std::abs(f0 - a*testRHS.TestF(t,0));
390 errorValues[iTrial][1] = std::abs(f1 - a*testRHS.TestF(t,1));
391 errorValues[iTrial][2] = std::abs(f2 - a*testRHS.TestF(t,2));
392 errorValues[iTrial][3] = std::abs(f3 - a*testRHS.TestF(t,3));
393 errorValues[iTrial][4] = std::abs(f4 - a*testRHS.TestF(t,4));
394 errorValues[iTrial][5] = std::abs(f5 - a*testRHS.TestF(t,5));
395 errorValues[iTrial][6] = std::abs(f6 - a*testRHS.TestF(t,6));
399 for(
int iVal = 0;iVal < 5;iVal++)
400 if(errorValues[iTrial][iVal] > errorTolerance)
404 for(
int iVal = 0;iVal < 7;iVal++){
405 std::cout <<
"Driver:Error(" << iVal <<
") = " << errorValues[iTrial][iVal] << std::endl;
411 for(
int iTrial = 0;iTrial < 8;iTrial++){
412 double logErr = std::log(errorValues[iTrial+1][5]/errorValues[iTrial][5]);
413 double logDT = std::log(timeSteps[iTrial+1]/timeSteps[iTrial]);
414 double methodOrder = logErr/logDT;
415 std::cout <<
"iTrial(" << iTrial <<
") Order: " << methodOrder << std::endl;
416 if(std::abs(methodOrder - 5) > 1e-3)
420 serialUnitResults.
UpdateResult(
"Advancer:RK4_2:DidNotCrashAndBurn",
true);
421 serialUnitResults.
UpdateResult(
"Advancer:RK4_2:Accurate",isAccurate);
422 serialUnitResults.
UpdateResult(
"Advancer:RK4_2:Order4",isOrder4);
int CreateSimpleGrid(GridType &inGrid, const std::vector< size_t > &gridSizes)
pcpp::ParallelGlobalType global_t
int SetStateFields(const std::vector< int > &inFieldIndices)
void const size_t const size_t * gridSizes
void RenewStream(std::ostringstream &outStream)
int InitializeFieldHandles()
pcpp::CommunicatorType comm_t
virtual size_t Create(size_t number_of_nodes=0, size_t number_of_cells=0)
plascom2::operators::sbp::base operator_t
virtual int AdvanceDomain()
Advances domain, grid, and state by one step.
Encapsulating class for collections of test results.
simulation::domain::base< grid_t, state_t > domain_t
Main encapsulation of MPI.
void size_t int size_t int size_t int int int int double int int double double *void size_t int size_t int int int int int double int size_t size_t size_t double double *void size_t int size_t int size_t size_t int double int double double *void size_t size_t size_t double * a
Testing constructs for unit testing.
Encapsulation for a collection of operator stencils.
void TestRK4Advancer2(ix::test::results &serialUnitResults)
simulation::grid::parallel_blockstructured grid_t
simulation::state::base state_t
pcpp::IndexIntervalType interval_t
void UpdateResult(const std::string &name, const ValueType &result)
Updates an existing test result.
virtual int InitializeAdvancer(DomainType &inDomain, pcpp::ParallelGlobalType &inGlobal, std::ostream &inStream)
Initializes the advancer object.
void TestRK4Advancer(ix::test::results &serialUnitResults)
Simple Block Structured Mesh object.
void AddField(const std::string &name, char loc, unsigned int ncomp, unsigned int dsize, const std::string &unit)
void SetFieldBuffer(const std::string &name, void *buf)
void InitSimple(const ContainerType &inSize)