PlasCom2  1.0
XPACC Multi-physics simluation application
TestInviscid.C
Go to the documentation of this file.
1 #include "Testing.H"
2 #include "Simulation.H"
3 #include "RKTestFixtures.H"
4 #include "EulerRHS.H"
5 #include "Stencil.H"
6 #include "PCPPCommUtil.H"
7 #include "PCPPReport.H"
8 #include "PCPPIntervalUtils.H"
9 #include "TestFixtures.H"
10 #include "EulerTestFixtures.H"
11 #include "EOS.H"
12 
14 
16 
17 void TestEulerKernels(ix::test::results &serialUnitResults)
18 {
19 
21 
22  std::cout << "TestEulerKernels.." << std::endl;
23 
24  // -- Set up the grid --
25 
26  // int numDim = 2;
27 
28  std::vector<bool> dimComputeDV(2,true);
29  std::vector<bool> dimUniformGridMetric(2,true);
30  std::vector<bool> dimEulerRHS(2,true);
31  std::vector<bool> dimUniformFlux(2,true);
32 
33  for(int nDim = 2;nDim <= 3;nDim++){
34 
35  grid_t testGrid;
36 
37  int numDim = nDim;
38 
39  std::vector<double> &realGridExtent(testGrid.PhysicalExtent());
40  realGridExtent.resize(numDim*2,0.0);
41  for(int iDim = 0;iDim < numDim;iDim++)
42  realGridExtent[iDim*2 + 1] = 1.0;
43 
44 
45  std::vector<size_t> &numNodes(testGrid.GridSizes());
46  numNodes.resize(numDim);
47  numNodes[0] = 11;
48  numNodes[1] = 101;
49  if(numDim == 3)
50  numNodes[2] = 1001;
51 
52  // numNodes[0] = 4;
53  // numNodes[1] = 4;
54  // numNodes[2] = 4;
55 
56  size_t numNodesDomain = 1;
57  size_t numCellsDomain = 1;
58  std::vector<double> dX(numDim,0.0);
59  std::vector<double> gridMetric(numDim,0.0);
60 
61  for(int iDim = 0;iDim < numDim;iDim++){
62  numNodesDomain *= numNodes[iDim];
63  numCellsDomain *= (numNodes[iDim]-1);
64  dX[iDim] = (realGridExtent[iDim*2+1] - realGridExtent[iDim*2])/(numNodes[iDim]-1);
65  gridMetric[iDim] = 1.0/dX[iDim];
66  }
67  testGrid.SetGridSpacings(dX);
68  if(testGrid.Finalize()){
69  std::cout << "Grid finalization failed." << std::endl;
70  return;
71  }
72  // testGrid.DX() = dX[0];
73  // testGrid.DY() = dX[1];
74 
75  // if(numDim == 3){
76  // testGrid.DZ() = dX[2];
77  // }
78 
79  // testGrid.GlobalExtent().InitSimple(numNodes);
80  // testGrid.LocalExtent().InitSimple(numNodes);
81  // testGrid.NumberOfGlobalNodes() = numNodes;
82  std::vector<size_t> bufferInterval;
83  testGrid.PartitionBufferInterval().Flatten(bufferInterval);
84 
85  // std::cout << "Partition Buffer Interval: ";
86  // testGrid.PartitionBufferInterval().PrettyPrint(std::cout);
87  // std::cout << std::endl;
88 
89  double a = 1.0;
90  double t = 1.0;
91  double gamma = 1.4;
92  double specGasConst = 1.0;
93  double dt = 1.0;
94  double cfl = 1.0;
95  std::vector<double> vVec(numDim,0.0);
96  vVec[0] = 1.0;
97  vVec[1] = -1.0;
98  double v = vVec[0];
99 
100 
101  std::vector<double> expectedRhoM1(numNodesDomain,1.0);
102  std::vector<double> expectedFlux((numDim+2)*numNodesDomain,0.0);
103  std::vector<double> expectedPressure(numNodesDomain,1.0);
104  std::vector<double> expectedTemperature(numNodesDomain,1.0);
105  std::vector<double> expectedVHat(numDim*numNodesDomain,0.0);
106  std::vector<double> expectedVelocity(numDim*numNodesDomain,0.0);
107  std::vector<double> expectedInternalEnergy(numNodesDomain,1.0/(gamma-1.0));
108  std::vector<double> expectedRHS((numDim+2)*numNodesDomain,0.0);
109 
110  std::vector<double> ke(numNodesDomain,0.0);
111  std::vector<double> rho(numNodesDomain,1.0);
112  std::vector<double> rhoV(numDim*numNodesDomain,1.0);
113  std::vector<double> rhoE(numNodesDomain,0.0);
114  // dX = <.1,.01,.001>
115  // Velocity = <1.0,-1.0,0>
116  // rhoV = 1.0 * Velocity
117  // vHat = Velocity/dX
118  for(int iDim = 0;iDim < numDim;iDim++){
119  for(int iPoint = 0;iPoint < numNodesDomain;iPoint++){
120  rhoV[iDim*numNodesDomain + iPoint] = rho[iPoint]*vVec[iDim];
121  ke[iPoint] += .5*rho[iPoint]*vVec[iDim]*vVec[iDim];
122  expectedVelocity[iDim*numNodesDomain+iPoint] = vVec[iDim];
123  expectedVHat[iDim*numNodesDomain+iPoint] = vVec[iDim]/dX[iDim];
124  }
125  }
126  // rhoE = [1.0/(gamma-1.0) + .5*rhoV*Velocity]
127  for(int iPoint = 0;iPoint < numNodesDomain;iPoint++){
128  rhoE[iPoint] = 1.0/(gamma-1.0) + ke[iPoint];
129  }
130 
131  std::vector<double> T(numNodesDomain,0.0);
132  std::vector<double> p(numNodesDomain,0.0);
133  std::vector<double> rhom1(numNodesDomain,0.0);
134  std::vector<double> velocity(numDim*numNodesDomain,-.1);
135  std::vector<double> internalEnergy(numNodesDomain,0.);
136 
137 
138  std::vector<double *> vBuffers(numDim,(double *)NULL);
139  for(int iDim = 0;iDim < numDim;iDim++)
140  vBuffers[iDim] = &velocity[iDim*numNodesDomain];
141 
142  std::vector<double *> myStateBuffers(numDim+2,NULL);
143  myStateBuffers[0] = &rho[0];
144  for(int iDim = 0;iDim < numDim;iDim++)
145  myStateBuffers[iDim+1] = &rhoV[iDim*numNodesDomain];
146  myStateBuffers[numDim+1] = &rhoE[0];
147 
148  std::vector<double *> myDVBuffers(4+numDim,NULL);
149  myDVBuffers[0] = &p[0];
150  myDVBuffers[1] = &T[0];
151  myDVBuffers[2] = &rhom1[0];
152 
153  for(int iDim = 0;iDim < numDim;iDim++){
154  vBuffers[iDim] = &velocity[iDim*numNodesDomain];
155  myDVBuffers[3+iDim] = vBuffers[iDim];
156  }
157  myDVBuffers[numDim+3] = &internalEnergy[0];
158 
159  pcpp::IndexIntervalType bufferExtent;
160  bufferExtent.InitSimple(numNodes);
161 
162  // setup a new equation of state object for this grid
163  eos::perfect_gas myEOS;
164  //myEOS.InitializeBufferExtents(bufferExtent,numNodes);
165  myEOS.SetupPressureBuffer(&p[0]);
166  myEOS.SetupTemperatureBuffer(&T[0]);
167  myEOS.SetupSpecificVolumeBuffer(&rhom1[0]);
168  myEOS.SetupInternalEnergyBuffer(&internalEnergy[0]);
169 
170  myEOS.SetSpecificGasConstant(specGasConst);
171  myEOS.SetGamma(gamma);
172 
173  if(myEOS.InitializeMaterialProperties()){
174  std::cout << "Failed to initialize EOS" << std::endl;
175  }
176 
177  if(euler::util::ComputeDVBuffer(bufferExtent,numNodes,myStateBuffers,myDVBuffers))
178  {
179  std::cout << "ComputeDVBuffer failed." << std::endl;
180  }
181 
182  // now calculate the pressure and temperature
183  if(myEOS.ComputePressureBuffer(bufferExtent,numNodes)) {
184  std::cout << "ComputePressure failed." << std::endl;
185  }
186 
187  if(myEOS.ComputeTemperatureBuffer(bufferExtent,numNodes)) {
188  std::cout << "ComputeTemperature failed." << std::endl;
189  }
190 
191  bool computeDVWorks = true;
192  bool pfailed = false;
193  bool tfailed = false;
194  bool rfailed = false;
195  bool vfailed = false;
196  bool efailed = false;
197 
198  for(int iNode = 0;iNode < numNodesDomain;iNode++){
199  if(std::abs(p[iNode] - expectedPressure[iNode]) > 1e-15){
200  computeDVWorks = false;
201  pfailed = true;
202  }
203  if(std::abs(T[iNode] - expectedTemperature[iNode]) > 1e-15){
204  computeDVWorks = false;
205  tfailed = true;
206  }
207  if(std::abs(rhom1[iNode] - expectedRhoM1[iNode]) > 1e-15){
208  computeDVWorks = false;
209  rfailed = true;
210  }
211  if(std::abs(internalEnergy[iNode] - expectedInternalEnergy[iNode]) > 1e-15){
212  computeDVWorks = false;
213  efailed = true;
214  }
215  for(int iDim = 0;iDim < numDim;iDim++){
216  if(std::abs(velocity[iDim*numNodesDomain+iNode] -
217  expectedVelocity[iDim*numNodesDomain+iNode]) > 1e-15){
218  computeDVWorks = false;
219  vfailed = true;
220  }
221  }
222  }
223 
224  dimComputeDV[numDim-2] = computeDVWorks ;
225  if(pfailed){
226  std::cout << "Pressure failed" << std::endl;
227  }
228  if(tfailed){
229  std::cout << "Temp failed" << std::endl;
230  }
231  if(rfailed){
232  std::cout << "RhoM1 failed" << std::endl;
233  }
234  if(vfailed){
235  std::cout << "Velo failed" << std::endl;
236  }
237  if(efailed){
238  std::cout << "Internal energy failed" << std::endl;
239  }
240 
241 
242  // velocity.resize(0,0);
243  // velocity.resize(numDim*numNodesDomain,1.0);
244  std::vector<double> velHat(numDim*numNodesDomain,0.0);
245 
246  std::vector<size_t> fortranBufferInterval(2*numDim,1);
247  for(int iDim = 0;iDim < numDim;iDim++){
248  fortranBufferInterval[2*iDim+1] = bufferInterval[2*iDim+1] + 1;
249  }
250 
251  FC_MODULE(grid,applyuniformgridmetric,GRID,APPLYUNIFORMGRIDMETRIC)
252  (&numDim,&numNodes[0],&numNodesDomain,
253  &fortranBufferInterval[0],
254  &gridMetric[0],&velocity[0],&velHat[0]);
255 
256  std::vector<double *> vHatBuffers(numDim,(double *)NULL);
257  for(int iDim = 0;iDim < numDim;iDim++){
258  vBuffers[iDim] = &velocity[iDim*numNodesDomain];
259  vHatBuffers[iDim] = &velHat[iDim*numNodesDomain];
260  }
261  // double *vHat1 = &velHat[0];
262  // double *vHat2 = &velHat[numNodesDomain];
263  // double *vHat3 = &velHat[numNodesDomain*2];
264 
265  bool uniformGridMetricWorks = true;
266  for(int iDim = 0;iDim < numDim;iDim++){
267  size_t iOffset = iDim*numNodesDomain;
268  for(int iNode = 0;iNode < numNodesDomain;iNode++){
269  double error = std::abs(velHat[iOffset+iNode] - expectedVHat[iOffset+iNode]);
270  if(error > 1e-15){
271  uniformGridMetricWorks = false;
272  }
273  }
274  }
275  dimUniformGridMetric[numDim-2] = uniformGridMetricWorks;
276 
277  {
278  for(int iDim = 0;iDim < numDim;iDim++){
279  size_t vectorOffset = iDim*numNodesDomain;
280  std::vector<double> scaledPressure(numNodesDomain,0.0);
281  for(size_t iPoint = 0;iPoint < numNodesDomain;iPoint++)
282  scaledPressure[iPoint] = p[iPoint]*gridMetric[iDim];
283  std::vector<double> eulerFlux(numNodesDomain*(numDim+2),0.0);
284  std::vector<double> expectedFlux((numDim+2)*numNodesDomain,0.0);
285  for(size_t iPoint = 0;iPoint < numNodesDomain;iPoint++){
286  //expectedFlux[iPoint] = rho[iPoint]*velocity[vectorOffset+iPoint];
287  expectedFlux[iPoint] = rho[iPoint]*velHat[vectorOffset+iPoint];
288  size_t fOffset = 0;
289  for(int ivDim = 0;ivDim < numDim;ivDim++){
290  size_t iOffset = ivDim*numNodesDomain;
291  fOffset = iOffset + numNodesDomain;
292  expectedFlux[iPoint+fOffset] =
293  //rhoV[iOffset+iPoint]*velocity[vectorOffset+iPoint];
294  rhoV[iOffset+iPoint]*velHat[vectorOffset+iPoint];
295  if(ivDim == iDim)
296  //expectedFlux[iPoint+fOffset] += p[iPoint];
297  expectedFlux[iPoint+fOffset] += scaledPressure[iPoint];
298  }
299  fOffset += numNodesDomain;
300  expectedFlux[iPoint+fOffset] =
301  //(rhoE[iPoint]+p[iPoint])*velocity[vectorOffset+iPoint];
302  (rhoE[iPoint]+p[iPoint])*velHat[vectorOffset+iPoint];
303  }
304  int fluxDim = iDim + 1;
305 
306  FC_MODULE(euler,uniformflux,EULER,UNIFORMFLUX)
307  (&numDim,&fluxDim,&numNodes[0],&numNodesDomain,&fortranBufferInterval[0],
308  &gridMetric[0],&rho[0],&rhoV[0],&rhoE[0],
309  &velHat[0],&p[0],&scaledPressure[0],&eulerFlux[0]);
310 
311  std::vector<bool> uniformFlux(numDim+2,true);
312  for(int fDim = 0 ;fDim < (numDim+2);fDim++){
313  size_t fOffset = fDim * numNodesDomain;
314  bool triggered = false;
315  for(size_t iPoint = 0;iPoint < numNodesDomain;iPoint++){
316  if(std::abs(eulerFlux[fOffset+iPoint] - expectedFlux[fOffset+iPoint]) > 1e-15){
317  if(!triggered){
318  std::cout << "Actual: " << eulerFlux[fOffset+iPoint] << std::endl
319  << "Expected: " << expectedFlux[fOffset+iPoint] << std::endl;
320  triggered = true;
321  }
322  uniformFlux[fDim] = false;
323  }
324  }
325  }
326  for(int fDim = 0;fDim < (numDim+2);fDim++){
327  if(!uniformFlux[fDim]){
328  dimUniformFlux[numDim-2] = false;
329  std::cout << "uniform flux failed in dim,fdim " << iDim
330  << "," << fDim << std::endl;
331  }
332  }
333 
334  }
335  }
336 
339 
340  // Forticate the stencil starts
341  for(int iStencil = 0;iStencil < sbp12.numStencils;iStencil++)
342  sbp12.stencilStarts[iStencil]++;
343 
344  int numStencils = sbp12.numStencils;
345  int boundaryDepth = 1;
346 
347 
348  // Create stencil connectivity
349  std::vector<int> stencilConnectivity(numDim*numNodesDomain,0);
350  plascom2::operators::sbp::CreateStencilConnectivity(numDim,&numNodes[0],&fortranBufferInterval[0],
351  boundaryDepth,&stencilConnectivity[0],true);
352 
353 
354  std::vector<size_t> applyNodes(numNodesDomain,0);
355  size_t nNode = 1;
356  for(size_t iNode = 0;iNode < numNodesDomain;iNode++)
357  applyNodes[iNode] = nNode++;
358 
359  int *stencilSizes = sbp12.stencilSizes;
360  int *stencilStarts = sbp12.stencilStarts;
361  int numStencilValues = sbp12.numValues;
362  double *stencilWeights = sbp12.stencilWeights;
363  int *stencilOffsets = sbp12.stencilOffsets;
364  int *stencilID = &stencilConnectivity[0];
365  int numScalar = 0;
366  double *scalarBuffer = NULL;
367 
368  // Note, RHS *must* be zero upon entry to Euler kernel; Euler kernel
369  // only accumulates to RHS vector, doesn't "set" its value.
370  std::vector<double> rhsBuffer((numDim+2)*numNodesDomain,0.0);
371 
372  FC_MODULE(euler,uniformrhs,EULER,UNIFORMRHS)
373  (&numDim,&numNodes[0],&numNodesDomain,&fortranBufferInterval[0],
374  &fortranBufferInterval[0],&gridMetric[0],
375  &numStencils,&numStencilValues,stencilSizes,stencilStarts,
377  &rho[0],&rhoV[0],&rhoE[0],
378  &velHat[0],&p[0],&rhsBuffer[0],&rhsBuffer[numNodesDomain],
379  &rhsBuffer[(numDim+1)*numNodesDomain]);
380 
381  bool eulerRHSWorks = true;
382 
383 
384  for(size_t iNode = 0;iNode < numNodesDomain;iNode++){
385  if(std::abs(rhsBuffer[iNode]) > 1e-16){
386  std::cout << "drho[" << iNode << "] = " << rhsBuffer[iNode] << std::endl;
387  eulerRHSWorks = false;
388  }
389  for(int iDim = 0;iDim < numDim;iDim++){
390  if(std::abs(rhsBuffer[iNode+(iDim+1)*numNodesDomain]) > 1e-16){
391  std::cout << "dV[" << iDim << "][" << iNode << "] = "
392  << rhsBuffer[iNode+(iDim+1)*numNodesDomain]
393  << std::endl;
394  eulerRHSWorks = false;
395  }
396  }
397  if(std::abs(rhsBuffer[iNode+(numDim+1)*numNodesDomain]) > 1e-16){
398  std::cout << "dE[" << iNode << "] = "
399  << rhsBuffer[iNode+(numDim+1)*numNodesDomain] << std::endl;
400  eulerRHSWorks = false;
401  }
402  }
403  dimEulerRHS[numDim-2] = eulerRHSWorks;
404  }
405 
406  bool computeDVWorks = true;
407  bool eulerRHSWorks = true;
408  bool uniformGridMetricWorks = true;
409  bool uniformFluxWorks = true;
410  // Make sure these tests worked in 2d and 3d
411  for(int nDim = 2;nDim <= 3;nDim++){
412  computeDVWorks = computeDVWorks && dimComputeDV[nDim-2];
413  eulerRHSWorks = eulerRHSWorks && dimEulerRHS[nDim-2];
414  uniformGridMetricWorks = uniformGridMetricWorks && dimUniformGridMetric[nDim-2];
415  uniformFluxWorks = uniformFluxWorks&&dimUniformFlux[nDim-2];
416  }
417 
418  serialUnitResults.UpdateResult("Euler:Kernels:DV",computeDVWorks);
419  serialUnitResults.UpdateResult("Euler:Kernels:UniformRHS",eulerRHSWorks);
420  serialUnitResults.UpdateResult("Euler:Kernels:UniformFlux",uniformFluxWorks);
421  serialUnitResults.UpdateResult("Grid:Kernels:ApplyUniformGridMetric",uniformGridMetricWorks);
422 };
423 
424 
425 void TestEulerRHS(ix::test::results &parallelUnitResults,pcpp::CommunicatorType &testComm)
426 {
427  std::cout << "TestEulerRHS..." << std::endl;
428 
435 
439 
440  std::ostringstream messageStream;
441 
442  grid_t simGrid;
443  operator_t sbpOperator;
444  halo_t &simHalo(simGrid.Halo());
445  state_t simState;
446  state_t paramState;
447 
448  bool parTestEulerRHS = true;
449  std::vector<size_t> gridSizes(3,4);
450 
451 
452  if(testfixtures::CreateSimulationFixtures(simGrid,simHalo,sbpOperator,
453  gridSizes,2,testComm,&messageStream)){
454  parTestEulerRHS = false;
455  std::cout << "TestEulerRHS failed in CreateSimulation Fixtures" << std::endl;
456  return;
457  }
458 
459 /*
460  // Test simple halo exchange to verify Communicators
461  std::cout << "Verify Communicators" << std::endl;
462  std::vector<int> gridNeighbors;
463  simGrid.Communicator().CartNeighbors(gridNeighbors);
464 
465  std::vector<double> &GridCoords(simGrid.CoordinateData());
466  int messageId = simHalo.CreateMessageBuffers(2);
467  std::cout << "Pack" << std::endl;
468  simHalo.PackMessageBuffers(messageId,0,2,&GridCoords[0]);
469  std::cout << "Send" << std::endl;
470  simHalo.SendMessage(messageId,gridNeighbors,simGrid.Communicator());
471  std::cout << "Receive" << std::endl;
472  simHalo.ReceiveMessage(messageId,gridNeighbors,simGrid.Communicator());
473  std::cout << "Unpack" << std::endl;
474  simHalo.UnPackMessageBuffers(messageId,0,2,&GridCoords[0]);
475 
476  simGrid.Communicator().Barrier();
477 */
478 
479  pcpp::IndexIntervalType &partitionBufferInterval(simGrid.PartitionBufferInterval());
480 
481  if(testfixtures::euler::SetupEulerState(simGrid,simState,paramState,0)){
482  parTestEulerRHS = false;
483  std::cout << "TestEulerRHS failed in SetupEulerState" << std::endl;
484  return;
485  }
486 
487  std::cout << messageStream.str() << std::endl;
488 
489  size_t numPointsBuffer = simGrid.BufferSize();
490 
491  double t = 0.0;
492  double gamma = 1.4;
493  double dt = .001;
494  double cfl = 1.0;
495  double Re = 0.0;
496  int flags = 1;
497 
498  int numDim = 3;
499 
500  paramState.SetFieldBuffer("gamma",&gamma);
501  paramState.SetFieldBuffer("inputDT",&dt);
502  paramState.SetFieldBuffer("inputCFL",&cfl);
503  paramState.SetFieldBuffer("refRe",&Re);
504  paramState.SetFieldBuffer("Flags",&flags);
505 
506  std::vector<double> rho(numPointsBuffer,1.0);
507  std::vector<double> rhoV(3*numPointsBuffer,0.0);
508  std::vector<double> rhoE(3*numPointsBuffer,1.0/(gamma-1.0));
509 
510  std::vector<double> dRho(numPointsBuffer,1.0);
511  std::vector<double> dRhoV(3*numPointsBuffer,0.0);
512  std::vector<double> dRhoE(3*numPointsBuffer,1.0/(gamma-1.0));
513 
514  std::vector<double> T(numPointsBuffer,0.0);
515  std::vector<double> p(numPointsBuffer,0.0);
516  std::vector<double> V(3*numPointsBuffer,0.0);
517 
518  std::vector<double> rhom1(numPointsBuffer,0.0);
519 
520 
521  simState.SetFieldBuffer("simTime",&t);
522  simState.SetFieldBuffer("rho",&rho[0]);
523  simState.SetFieldBuffer("rhoV",&rhoV[0]);
524  simState.SetFieldBuffer("rhoE",&rhoE[0]);
525 
526  simState.SetFieldBuffer("pressure",&p[0]);
527  simState.SetFieldBuffer("temperature",&T[0]);
528  simState.SetFieldBuffer("velocity",&V[0]);
529  simState.SetFieldBuffer("rhom1",&rhom1[0]);
530 
531  state_t rhsState(simState);
532 
533  rhsState.SetFieldBuffer("rho",&dRho[0]);
534  rhsState.SetFieldBuffer("rhoV",&dRhoV[0]);
535  rhsState.SetFieldBuffer("rhoE",&dRhoE[0]);
536 
537  // set up the domain - don't care about this in testing
538  // domain_t eulerDomain;
539  // eulerDomain.numGrids = 1;
540  // eulerDomain.Grids().resize(1,&simGrid);
541  // eulerDomain.States().resize(1,&simState);
542 
543  // -- Set up the RHS --
544  rhs_t eulerRHS;
545 
546  std::cout << "Before initialize" << std::endl;
547 
548  if(eulerRHS.Initialize(simGrid,simState,paramState,sbpOperator)){
549  parTestEulerRHS = false;
550  std::cout << "TestEulerRHS failed in eulerRHS.Initialize" << std::endl;
551  return;
552  }
553 
554  std::cout << "Done initialize" << std::endl;
555 
556  if(eulerRHS.SetupRHS(simGrid,simState,rhsState)){
557  parTestEulerRHS = false;
558  std::cout << "TestEulerRHS failed in eulerRHS.SetupRHS" << std::endl;
559  return;
560  }
561 
562  std::cout << "Done setupRHS" << std::endl;
563 
564  const std::vector<double *> &inputStateBuffers(eulerRHS.StateBuffers());
565  const std::vector<double *> &outputStateBuffers(eulerRHS.RHSBuffers());
566 
567 
568  // check conserved quantities
569  if(inputStateBuffers[0] != &rho[0])
570  parTestEulerRHS = false;
571  for(int iDim = 0;iDim < numDim;iDim++){
572  if(inputStateBuffers[iDim+1] != &rhoV[iDim*numPointsBuffer])
573  parTestEulerRHS = false;
574  }
575  if(inputStateBuffers[numDim+1] != &rhoE[0])
576  parTestEulerRHS = false;
577 
578  parTestEulerRHS = CheckResult(parTestEulerRHS,testComm);
579  if(!parTestEulerRHS){
580  std::cout << "Problem 1" << std::endl;
581  }
582  // check RHS buffers
583  if(outputStateBuffers[0] != &dRho[0])
584  parTestEulerRHS = false;
585  if(outputStateBuffers[1] != &dRhoV[0])
586  parTestEulerRHS = false;
587  if(outputStateBuffers[numDim+1] != &dRhoE[0])
588  parTestEulerRHS = false;
589  parTestEulerRHS = CheckResult(parTestEulerRHS,testComm);
590  if(!parTestEulerRHS){
591  std::cout << "Problem 2" << std::endl;
592  }
593 
594  std::cout << "Done Problem 1 and 2" << std::endl;
595 
596  // Call SetupRHS again, with switched arguments
597  if(eulerRHS.SetupRHS(simGrid,rhsState,simState)){
598  parTestEulerRHS = false;
599  }
600  parTestEulerRHS = CheckResult(parTestEulerRHS,testComm);
601  if(!parTestEulerRHS){
602  std::cout << "Problem 3" << std::endl;
603  }
604 
605  // check conserved quantities
606  if(inputStateBuffers[0] != &dRho[0])
607  parTestEulerRHS = false;
608  for(int iDim = 0;iDim < numDim;iDim++)
609  if(inputStateBuffers[iDim+1] != &dRhoV[iDim*numPointsBuffer])
610  parTestEulerRHS = false;
611  if(inputStateBuffers[numDim+1] != &dRhoE[0])
612  parTestEulerRHS = false;
613  parTestEulerRHS = CheckResult(parTestEulerRHS,testComm);
614  if(!parTestEulerRHS){
615  std::cout << "Problem 4" << std::endl;
616  }
617 
618  std::cout << "Done Problem 3 and 4" << std::endl;
619 
620  // check RHS buffers
621  if(outputStateBuffers[0] != &rho[0])
622  parTestEulerRHS = false;
623  if(outputStateBuffers[1] != &rhoV[0])
624  parTestEulerRHS = false;
625  if(outputStateBuffers[numDim+1] != &rhoE[0])
626  parTestEulerRHS = false;
627  parTestEulerRHS = CheckResult(parTestEulerRHS,testComm);
628  if(!parTestEulerRHS){
629  std::cout << "Problem 5" << std::endl;
630  }
631 
632  std::cout << "Done Problem 5" << std::endl;
633 
634  int returnCode = eulerRHS.RHS(0);
635  if(returnCode > 0){
636  parTestEulerRHS = false;
637  }
638 
639  parTestEulerRHS = CheckResult(parTestEulerRHS,testComm);
640  if(!parTestEulerRHS){
641  std::cout << "Problem 6" << " Return code " << returnCode << std::endl;
642  }
643 
644  std::cout << "Done Problem 6" << std::endl;
645 
646  parallelUnitResults.UpdateResult("Euler:RHS:RunsInParallel",parTestEulerRHS);
647 
648 };
649 
650 void TestEulerRHS2(ix::test::results &parallelUnitResults,pcpp::CommunicatorType &testComm)
651 {
652  std::cout << "TestEulerRHS2..." << std::endl;
653 
660 
664 
665  std::ostringstream messageStream;
666 
667  grid_t simGrid;
668  operator_t sbpOperator;
669  halo_t &simHalo(simGrid.Halo());
670  state_t simState;
671  state_t paramState;
672 
673  bool parTestEulerRHS = true;
674  std::vector<size_t> gridSizes(3,4);
675 
676  if(testfixtures::CreateSimulationFixtures(simGrid,simHalo,sbpOperator,
677  gridSizes,2,testComm,&messageStream)){
678  parTestEulerRHS = false;
679  return;
680  }
681 
682  pcpp::IndexIntervalType &partitionBufferInterval(simGrid.PartitionBufferInterval());
683 
684  if(testfixtures::euler::SetupEulerState(simGrid,simState,paramState,0)){
685  parTestEulerRHS = false;
686  return;
687  }
688 
689  std::cout << messageStream.str() << std::endl;
690 
691  size_t numPointsBuffer = simGrid.BufferSize();
692 
693  double t = 0.0;
694  double gamma = 1.4;
695  double dt = .001;
696  double cfl = 1.0;
697  double Re = 0.0;
698  // double numbers[] = {};
699  int flags = 1;
700 
701  int numDim = 3;
702 
703  paramState.SetFieldBuffer("gamma",&gamma);
704  paramState.SetFieldBuffer("inputDT",&dt);
705  paramState.SetFieldBuffer("inputCFL",&cfl);
706  paramState.SetFieldBuffer("refRe",&Re);
707  // paramState.SetFieldBuffer("Numbers",numbers);
708  paramState.SetFieldBuffer("Flags",&flags);
709 
710  std::vector<double> rho(numPointsBuffer,1.0);
711  std::vector<double> rhoV(3*numPointsBuffer,0.0);
712  std::vector<double> rhoE(3*numPointsBuffer,1.0/(gamma-1.0));
713 
714  std::vector<double> dRho(numPointsBuffer,0.0);
715  std::vector<double> dRhoV(3*numPointsBuffer,0.0);
716  std::vector<double> dRhoE(numPointsBuffer,0.0);
717 
718  std::vector<double> T(numPointsBuffer,0.0);
719  std::vector<double> p(numPointsBuffer,0.0);
720  std::vector<double> V(3*numPointsBuffer,0.0);
721 
722  std::vector<double> rhom1(numPointsBuffer,0.0);
723 
724 
725  simState.SetFieldBuffer("simTime",&t);
726  simState.SetFieldBuffer("rho",&rho[0]);
727  simState.SetFieldBuffer("rhoV",&rhoV[0]);
728  simState.SetFieldBuffer("rhoE",&rhoE[0]);
729 
730  simState.SetFieldBuffer("pressure",&p[0]);
731  simState.SetFieldBuffer("temperature",&T[0]);
732  simState.SetFieldBuffer("velocity",&V[0]);
733  simState.SetFieldBuffer("rhom1",&rhom1[0]);
734 
735  state_t rhsState(simState);
736 
737  rhsState.SetFieldBuffer("rho",&dRho[0]);
738  rhsState.SetFieldBuffer("rhoV",&dRhoV[0]);
739  rhsState.SetFieldBuffer("rhoE",&dRhoE[0]);
740 
741  // set up the domain - don't care about this in testing
742  // domain_t eulerDomain;
743  // eulerDomain.numGrids = 1;
744  // eulerDomain.Grids().resize(1,&simGrid);
745  // eulerDomain.States().resize(1,&simState);
746 
747  // -- Set up the RHS --
748  rhs_t eulerRHS;
749 
750  if(eulerRHS.Initialize(simGrid,simState,paramState,sbpOperator)){
751  parTestEulerRHS = false;
752  return;
753  }
754 
755  if(eulerRHS.SetupRHS(simGrid,simState,rhsState)){
756  parTestEulerRHS = false;
757  return;
758  }
759 
760  simGrid.SetNumThreads(1);
761  eulerRHS.InitThreadIntervals();
762 
763 
764  int returnCode = eulerRHS.RHS(0);
765  if(returnCode > 0){
766  parTestEulerRHS = false;
767  }
768 
769  parTestEulerRHS = CheckResult(parTestEulerRHS,testComm);
770  if(!parTestEulerRHS){
771  std::cout << "Problem 0" << std::endl;
772  }
773 
774  if(parTestEulerRHS){
775  for(size_t iPoint = 0;(iPoint < numPointsBuffer)&&parTestEulerRHS;iPoint++){
776  if(std::abs(dRho[iPoint]) > 1e-15) parTestEulerRHS = false;
777  for(int iDim = 0;iDim < numDim;iDim++)
778  if(std::abs(dRhoV[iPoint+iDim*numPointsBuffer]) > 1e-15) parTestEulerRHS = false;
779  if(std::abs(dRhoE[iPoint]) > 1e-15) parTestEulerRHS = false;
780  }
781  }
782 
783  parTestEulerRHS = CheckResult(parTestEulerRHS,testComm);
784  if(!parTestEulerRHS){
785  std::cout << "Problem 1" << std::endl;
786  }
787 
788  parallelUnitResults.UpdateResult("Euler:RHS:3dWorksInParallel",parTestEulerRHS);
789 
790 
791 };
void const size_t const size_t const size_t const int const int const double * gridMetric
Definition: EulerKernels.H:10
int ComputeDVBuffer(const pcpp::IndexIntervalType &regionInterval, const std::vector< size_t > &bufferSizes, const std::vector< double *> &stateBuffers, std::vector< double *> &dvBuffers)
Definition: EulerUtil.C:153
void size_t int size_t int size_t int int * stencilSizes
subroutine applyuniformgridmetric(numDim, gridSizes, numPoints, opInterval, gridMetric, vBuffer, vHat)
Definition: Grid.f90:170
void Flatten(ContainerType &output) const
Definition: IndexUtil.H:274
int * stencilSizes
The number of weights for each stencil.
Definition: Stencil.H:102
subroutine uniformrhs(numDim, gridSizes, numPoints, fullInterval, opInterval, gridMetric, numStencils, numStencilValues, stencilSizes, stencilStarts, stencilOffsets, stencilWeights, stencilID, rhoBuffer, rhoVBuffer, rhoEBuffer, velHat, pressureBuffer, rhoRHS, rhoVRHS, rhoERHS)
Definition: Euler.f90:17
Definition: Euler.f90:1
plascom2::operators::sbp::base operator_t
void SetNumThreads(int numThreads)
Definition: Grid.C:2291
void size_t int size_t int size_t int int int * stencilStarts
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
bool CheckResult(bool &localResult, pcpp::CommunicatorType &testComm)
Definition: PCPPCommUtil.C:176
void SetupPressureBuffer(double *const inPtr)
Definition: EOS.H:69
int ComputePressureBuffer(const pcpp::IndexIntervalType &regionInterval, const std::vector< size_t > &bufferSizes)
Compute pressure for the entire buffer.
Definition: EOS.C:5
int * stencilStarts
The starting index into the stencilWeight and stencilOffset arrays for each stencil.
Definition: Stencil.H:104
int * stencilOffsets
The offsets wrt the grid point at which the stencil is being applied.
Definition: Stencil.H:106
void const size_t const size_t const size_t const int const int const double const double const double const double const double * velHat
Definition: EulerKernels.H:10
pcpp::CommunicatorType comm_t
void SetGamma(const double &inValue)
Definition: EOS.H:174
void SetSpecificGasConstant(const double &inValue)
Definition: EOS.H:167
void const size_t const size_t const size_t const int const double const int const double * velocity
Definition: MetricKernels.H:19
pcpp::IndexIntervalType interval_t
int SetupEulerState(const GridType &inGrid, StateType &inState, StateType &inParams, int numScalars, bool withFluxes=false)
void SetupInternalEnergyBuffer(double *const inPtr)
Definition: EOS.H:73
pcpp::ParallelGlobalType global_t
Definition: TestHDF5.C:16
void TestEulerRHS(ix::test::results &parallelUnitResults, pcpp::CommunicatorType &testComm)
Definition: TestInviscid.C:425
void SetupTemperatureBuffer(double *const inPtr)
Definition: EOS.H:70
Encapsulating class for collections of test results.
Definition: Testing.H:18
void size_t int size_t int size_t int int int int double int * stencilOffsets
simulation::domain::base< grid_t, state_t > domain_t
Definition: PlasCom2.H:19
void const size_t const size_t const int const size_t const size_t const size_t const size_t const int const double const double const double const double const double const double const double const double const int * numScalar
Definition: SATKernels.H:10
pcpp::IndexIntervalType & PartitionBufferInterval()
Definition: Grid.H:519
const std::vector< size_t > & GridSizes() const
Definition: Grid.H:469
void size_t int size_t int size_t int int int int double int int * stencilID
void SetupSpecificVolumeBuffer(double *const inPtr)
Definition: EOS.H:71
void SetGridSpacings(const std::vector< double > &inSpacing)
Definition: Grid.H:540
Definition: Grid.f90:1
Main encapsulation of MPI.
Definition: COMM.H:62
int InitializeMaterialProperties()
Derive material properties from a minimum required set.
Definition: EOS.H:145
int CreateStencilConnectivity(int numDim, size_t *dimSizes, size_t *opInterval, int boundaryDepth, int *stencilID, bool fortranInterval=false)
Creates simple stencil connectivity assuming all domain boundaries are physical boundaries.
Definition: Stencil.C:840
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.
Definition: Stencil.H:26
int numValues
The total number of weights for all stencils (reqd for Fortran)
Definition: Stencil.H:98
int CreateSimulationFixtures(GridType &inGrid, HaloType &inHalo, plascom2::operators::sbp::base &inOperator, const std::vector< size_t > &gridSizes, int interiorOrder, pcpp::CommunicatorType &inComm, std::ostream *messageStreamPtr=NULL)
Definition: TestFixtures.H:31
subroutine uniformflux(numDim, fluxDim, gridSizes, numPoints, opInterval, gridMetric, rhoBuffer, rhoVBuffer, rhoEBuffer, velHat, pressureBuffer, scaledPressure, fluxBuffer)
Definition: Euler.f90:154
void const size_t const size_t const size_t const int const double * V
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 * bufferInterval
void UpdateResult(const std::string &name, const ValueType &result)
Updates an existing test result.
Definition: Testing.H:55
Perfect Gas Equation of State.
Definition: EOS.H:124
const std::vector< double > & PhysicalExtent() const
Definition: Grid.H:533
Definition: EulerRHS.H:33
double * stencilWeights
The stencil weights.
Definition: Stencil.H:108
void size_t int size_t int size_t int int int int double * stencilWeights
void size_t int size_t int size_t int * numStencils
simulation::state::base state_t
Definition: TestInviscid.C:15
int numStencils
The number of stencils (e.g. interior + boundary)
Definition: Stencil.H:93
void TestEulerRHS2(ix::test::results &parallelUnitResults, pcpp::CommunicatorType &testComm)
Definition: TestInviscid.C:650
void const size_t const size_t const size_t const int const double * scalarBuffer
Definition: EulerKernels.H:17
int Initialize(base &stencilSet, int interiorOrder)
Initialize the sbp::base stencilset with the SBP operator of given order.
Definition: Stencil.C:360
simulation::grid::halo halo_t
Definition: PlasCom2.H:18
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
simulation::grid::parallel_blockstructured grid_t
Definition: PlasCom2.H:16
int ComputeTemperatureBuffer(const pcpp::IndexIntervalType &regionInterval, const std::vector< size_t > &bufferSizes)
Compute temperature for the entire buffer.
Definition: EOS.C:52
void TestEulerKernels(ix::test::results &serialUnitResults)
Definition: TestInviscid.C:17
void SetFieldBuffer(const std::string &name, void *buf)
int Finalize(bool allocateCoordinateData=false)
Definition: Grid.C:2318
void InitSimple(const ContainerType &inSize)
Definition: IndexUtil.H:169
void const size_t * numPointsBuffer
Definition: MetricKernels.H:19
void FC_MODULE(euler, flux1d, EULER, FLUX1D)(const int *numDim