PlasCom2  1.0
XPACC Multi-physics simluation application
TestEOS.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 
17 
18 void TestEOS_ComputeBuffers(ix::test::results &serialUnitResults)
19 {
20 
21  std::cout << "TestEOS_ComputeBuffers" << std::endl;
22 
23  // -- Set up the grid --
24 
25  std::vector<bool> dimComputeEOS(2,true);
26 
27  for(int nDim = 2;nDim <= 3;nDim++){
28 
29  grid_t testGrid;
30 
31  int numDim = nDim;
32 
33  std::vector<double> &realGridExtent(testGrid.PhysicalExtent());
34  realGridExtent.resize(numDim*2,0.0);
35  for(int iDim = 0;iDim < numDim;iDim++)
36  realGridExtent[iDim*2 + 1] = 1.0;
37 
38 
39  std::vector<size_t> &numNodes(testGrid.GridSizes());
40  numNodes.resize(numDim);
41  numNodes[0] = 11;
42  numNodes[1] = 101;
43  if(numDim == 3)
44  numNodes[2] = 1001;
45 
46  size_t numNodesDomain = 1;
47  size_t numCellsDomain = 1;
48  std::vector<double> dX(numDim,0.0);
49  std::vector<double> gridMetric(numDim,0.0);
50 
51  for(int iDim = 0;iDim < numDim;iDim++){
52  numNodesDomain *= numNodes[iDim];
53  numCellsDomain *= (numNodes[iDim]-1);
54  dX[iDim] = (realGridExtent[iDim*2+1] - realGridExtent[iDim*2])/(numNodes[iDim]-1);
55  gridMetric[iDim] = 1.0/dX[iDim];
56  }
57  testGrid.SetGridSpacings(dX);
58  if(testGrid.Finalize()){
59  std::cout << "Grid finalization failed." << std::endl;
60  return;
61  }
62  std::vector<size_t> bufferInterval;
63  testGrid.PartitionBufferInterval().Flatten(bufferInterval);
64 
65  double a = 1.0;
66  double t = 1.0;
67  double gamma = 1.4;
68  double specGasConst = 1.0;
69  double dt = 1.0;
70  double cfl = 1.0;
71  std::vector<double> vVec(numDim,0.0);
72  vVec[0] = 1.0;
73  vVec[1] = -1.0;
74  double v = vVec[0];
75 
76  std::vector<double> expectedPressure(numNodesDomain,1.0);
77  std::vector<double> expectedTemperature(numNodesDomain,1.0);
78 
79  std::vector<double> ke(numNodesDomain,0.0);
80  std::vector<double> rho(numNodesDomain,1.0);
81  std::vector<double> rhoV(numDim*numNodesDomain,0.0);
82  std::vector<double> rhoE(numNodesDomain,0.0);
83  // dX = <.1,.01,.001>
84  // Velocity = <1.0,-1.0,0>
85  // rhoV = 1.0 * Velocity
86  // vHat = Velocity/dX
87  for(int iDim = 0;iDim < numDim;iDim++){
88  for(int iPoint = 0;iPoint < numNodesDomain;iPoint++){
89  rhoV[iDim*numNodesDomain + iPoint] = rho[iPoint]*vVec[iDim];
90  ke[iPoint] += .5*rho[iPoint]*vVec[iDim]*vVec[iDim];
91  }
92  }
93  // rhoE = [1.0/(gamma-1.0) + .5*rhoV*Velocity]
94  for(int iPoint = 0;iPoint < numNodesDomain;iPoint++){
95  rhoE[iPoint] = 1.0/(gamma-1.0) + ke[iPoint];
96  }
97 
98  std::vector<double> T(numNodesDomain,0.);
99  std::vector<double> p(numNodesDomain,0.);
100  std::vector<double> rhom1(numNodesDomain,0.);
101  std::vector<double> velocity(numDim*numNodesDomain,0.);
102  std::vector<double> internalEnergy(numNodesDomain,0.);
103 
104  //std::vector<double *> vBuffers(numDim,(double *)NULL);
105  //for(int iDim = 0;iDim < numDim;iDim++)
106  //vBuffers[iDim] = &velocity[iDim*numNodesDomain];
107 
108  std::vector<double *> myStateBuffers(numDim+2,NULL);
109  myStateBuffers[0] = &rho[0];
110  for(int iDim = 0;iDim < numDim;iDim++)
111  myStateBuffers[iDim+1] = &rhoV[iDim*numNodesDomain];
112  myStateBuffers[numDim+1] = &rhoE[0];
113 
114  std::vector<double *> myDVBuffers(4+numDim,NULL);
115  myDVBuffers[0] = &p[0];
116  myDVBuffers[1] = &T[0];
117  myDVBuffers[2] = &rhom1[0];
118 
119  for(int iDim = 0;iDim < numDim;iDim++)
120  myDVBuffers[iDim+3] = &velocity[iDim*numNodesDomain];
121  myDVBuffers[numDim+3] = &internalEnergy[0];
122 
123  pcpp::IndexIntervalType bufferExtent;
124  bufferExtent.InitSimple(numNodes);
125 
126  //std::cout << "bufferExtent " << bufferExtent << std::endl;
127  //std::cout << "bufferInterval " << bufferInterval << std::endl;
128 
129  // setup a new equation of state object for this grid
130  eos::perfect_gas myEOS;
131  //myEOS.InitializeBufferExtents(bufferExtent,numNodes);
132  myEOS.SetupPressureBuffer(&p[0]);
133  myEOS.SetupTemperatureBuffer(&T[0]);
134  myEOS.SetupSpecificVolumeBuffer(&rhom1[0]);
135  myEOS.SetupInternalEnergyBuffer(&internalEnergy[0]);
136 
137  myEOS.SetSpecificGasConstant(specGasConst);
138  myEOS.SetGamma(gamma);
139 
140  if(myEOS.InitializeMaterialProperties()){
141  std::cout << "Failed to initialize EOS" << std::endl;
142  }
143 
144  //std::cout << "Before ComputeDVBuffer" << std::endl;
145 
146  // first calculate the specific volume, velocity, and internal energy
147  // this is testing elsewhere
148  if(euler::util::ComputeDVBuffer(bufferExtent,numNodes,myStateBuffers,myDVBuffers)) {
149  std::cout << "ComputeDVBuffer failed." << std::endl;
150  }
151 
152  //std::cout << "Before ComputePressureBuffer" << std::endl;
153 
154  // now calculate the pressure and temperature
155  if(myEOS.ComputePressureBuffer(bufferExtent,numNodes)) {
156  std::cout << "ComputePressure failed." << std::endl;
157  }
158 
159  if(myEOS.ComputeTemperatureBuffer(bufferExtent,numNodes)) {
160  std::cout << "ComputeTemperature failed." << std::endl;
161  }
162 
163  bool computeEOSWorks = true;
164  bool pfailed = false;
165  bool tfailed = false;
166 
167  bool printPressure=true;
168  bool printTemperature=true;
169  for(int iNode = 0;iNode < numNodesDomain;iNode++){
170  if(std::abs(p[iNode] - expectedPressure[iNode]) > 1e-15){
171  if(printPressure){
172  std::cout << "In EOS_ComputeBuffers, Expected p=" << expectedPressure[iNode]
173  << " got p=" << p[iNode] << " at iNode=" << iNode << std::endl;
174  std::cout << "No further messages will be generated for " << std::endl;
175  printPressure = false;
176  }
177  computeEOSWorks = false;
178  pfailed = true;
179  }
180 
181  if(std::abs(T[iNode] - expectedTemperature[iNode]) > 1e-15){
182  if(printTemperature){
183  std::cout << "In EOS_ComputeBuffers, Expected T=" << expectedTemperature[iNode]
184  << " got T=" << T[iNode] << " at iNode=" << iNode << std::endl;
185  std::cout << "No further messages will be generated for " << std::endl;
186  printTemperature = false;
187  }
188  computeEOSWorks = false;
189  tfailed = true;
190  }
191  }
192 
193  dimComputeEOS[numDim-2] = computeEOSWorks ;
194  if(pfailed){
195  std::cout << "Pressure failed" << std::endl;
196  }
197  if(tfailed){
198  std::cout << "Temperature failed" << std::endl;
199  }
200  }
201 
202  bool computeEOSWorks = true;
203  // Make sure these tests worked in 2d and 3d
204  for(int nDim = 2;nDim <= 3;nDim++){
205  computeEOSWorks = computeEOSWorks && dimComputeEOS[nDim-2];
206  }
207 
208  serialUnitResults.UpdateResult("EOS:ComputeBuffers",computeEOSWorks);
209 };
210 
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
simulation::grid::parallel_blockstructured grid_t
Definition: TestEOS.C:16
simulation::state::base state_t
Definition: TestEOS.C:15
void Flatten(ContainerType &output) const
Definition: IndexUtil.H:274
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
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
void SetupInternalEnergyBuffer(double *const inPtr)
Definition: EOS.H:73
void SetupTemperatureBuffer(double *const inPtr)
Definition: EOS.H:70
Encapsulating class for collections of test results.
Definition: Testing.H:18
pcpp::IndexIntervalType & PartitionBufferInterval()
Definition: Grid.H:519
const std::vector< size_t > & GridSizes() const
Definition: Grid.H:469
void SetupSpecificVolumeBuffer(double *const inPtr)
Definition: EOS.H:71
void SetGridSpacings(const std::vector< double > &inSpacing)
Definition: Grid.H:540
int InitializeMaterialProperties()
Derive material properties from a minimum required set.
Definition: EOS.H:145
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.
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
void TestEOS_ComputeBuffers(ix::test::results &serialUnitResults)
Definition: TestEOS.C:18
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
int ComputeTemperatureBuffer(const pcpp::IndexIntervalType &regionInterval, const std::vector< size_t > &bufferSizes)
Compute temperature for the entire buffer.
Definition: EOS.C:52
int Finalize(bool allocateCoordinateData=false)
Definition: Grid.C:2318
void InitSimple(const ContainerType &inSize)
Definition: IndexUtil.H:169