PlasCom2  1.0
XPACC Multi-physics simluation application
EulerTestFixtures.H
Go to the documentation of this file.
1 #ifndef __EULER_TEST_FIXTURES_H__
2 #define __EULER_TEST_FIXTURES_H__
3 
4 namespace testfixtures {
5  namespace euler {
6 
7  inline double Gauss(const double &amplitude,const std::vector<double> &width,
8  const std::vector<double> &center, const std::vector<double> &xPos)
9  {
10  std::vector<double>::const_iterator wIt = width.begin();
11  std::vector<double>::const_iterator cIt = center.begin();
12  std::vector<double>::const_iterator xIt = xPos.begin();
13  double expTerm = 0;
14  while(wIt != width.end()){
15  double xLoc = (*xIt-*cIt)/(*wIt);
16  xIt++;
17  wIt++;
18  cIt++;
19  expTerm += xLoc*xLoc;
20  }
21  expTerm *= -1.0;
22  return(amplitude*std::exp(expTerm));
23  };
24 
25  template<typename GridType,typename StateType>
26  int SetupEulerState(const GridType &inGrid,StateType &inState,StateType &inParams,
27  int numScalars,bool withFluxes = false)
28  {
29  size_t numPointsBuffer = inGrid.BufferSize();
30  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
31  const std::vector<size_t> &gridSizes(inGrid.GridSizes());
32  const pcpp::IndexIntervalType &partitionInterval(inGrid.PartitionInterval());
33  const pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
34  int numDim = bufferSizes.size();
35 
36  inState.AddField("simTime",'s',1,8,"s");
37 
38  // Conserved quantities, mass, momentum, and energy densities
39  inState.AddField("rho",'n',1,8,"mass");
40  inState.AddField("rhoV",'n',numDim,8,"momentum");
41  inState.AddField("rhoE",'n',1,8,"energy");
42  if(numScalars>0)
43  inState.AddField("scalarVars",'n',numScalars,8,"m/M");
44 
45  // Dependent quantities, pressure, temperature, velocity
46  inState.AddField("pressure",'n',1,8,"pressure");
47  inState.AddField("temperature",'n',1,8,"temperature");
48  inState.AddField("rhom1",'n',1,8,"volume");
49  inState.AddField("velocity",'n',numDim,8,"velocity");
50 
51  // if(withFluxes){
52  // // Flux quanitites (if tracking desired)
53  // inState.AddField("massFlux",'n',3,8,"");
54  // inState.AddField("mom1Flux",'n',3,8,"");
55  // inState.AddField("mom2Flux",'n',3,8,"");
56  // inState.AddField("mom3Flux",'n',3,8,"");
57  // inState.AddField("energyFlux",'n',3,8,"");
58  // }
59 
60  inState.Create(numPointsBuffer,0);
61  if(numScalars == 0)
62  inState.SetStateFields("rho rhoV rhoE");
63  else
64  inState.SetStateFields("rho rhoV rhoE scalarVars");
65  inState.InitializeFieldHandles();
66 
67  inParams.AddField("gamma",'s',1,8,"");
68  inParams.AddField("inputDT",'s',1,8,"s");
69  inParams.AddField("inputCFL",'s',1,8,"");
70  inParams.AddField("refRe",'s',1,8,"");
71  inParams.AddField("Numbers",'s',3,8,"");
72  inParams.AddField("Flags",'s',1,4,"");
73 
74  inParams.Create(numPointsBuffer,0);
75 
76  return(0);
77  };
78 
79 
80  template<typename GridType,typename StateType>
81  int InitializeQuiescentFlow(const GridType &inGrid,StateType &inState,bool everyWhere = false)
82  {
83  int rhoHandle = inState.GetDataIndex("rho");
84  if(rhoHandle < 0)
85  return(1);
86  pcpp::field::dataset::DataBufferType &rhoData(inState.Field(rhoHandle));
87  double *rhoPtr = rhoData.Data<double>();
88  if(!rhoPtr)
89  return(1);
90 
91  int rhoVHandle = inState.GetDataIndex("rhoV");
92  if(rhoVHandle < 0)
93  return(1);
94  pcpp::field::dataset::DataBufferType &rhoVData(inState.Field(rhoVHandle));
95  double *rhoVPtr = rhoVData.Data<double>();
96  if(!rhoVPtr)
97  return(1);
98 
99  int rhoEHandle = inState.GetDataIndex("rhoE");
100  if(rhoEHandle < 0)
101  return(1);
102  pcpp::field::dataset::DataBufferType &rhoEData(inState.Field(rhoEHandle));
103  double *rhoEPtr = rhoEData.Data<double>();
104  if(!rhoPtr)
105  return(1);
106 
107  size_t numPointsBuffer = inGrid.BufferSize();
108  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
109  const std::vector<size_t> &gridSizes(inGrid.GridSizes());
110  const pcpp::IndexIntervalType &partitionInterval(inGrid.PartitionInterval());
111  const pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
112  int numDim = gridSizes.size();
113  double rhoE = 1.0/.4;
114  if(everyWhere){
115  for(size_t iPoint = 0;iPoint < numPointsBuffer;iPoint++){
116  rhoPtr[iPoint] = 1.0;
117  rhoEPtr[iPoint] = rhoE;
118  }
119  for(size_t iPoint = 0;iPoint < numDim*numPointsBuffer;iPoint++)
120  rhoVPtr[iPoint] = 0.0;
121  } else {
122  if(numDim == 3){
123  size_t iStart = partitionBufferInterval[0].first;
124  size_t iEnd = partitionBufferInterval[0].second;
125  size_t jStart = partitionBufferInterval[1].first;
126  size_t jEnd = partitionBufferInterval[1].second;
127  size_t kStart = partitionBufferInterval[2].first;
128  size_t kEnd = partitionBufferInterval[2].second;
129  size_t nPlane = bufferSizes[0]*bufferSizes[1];
130  for(size_t kIndex = kStart;kIndex <= kEnd;kIndex++){
131  size_t kBufferIndex = kIndex*nPlane;
132  for(size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
133  size_t jkBufferIndex = kBufferIndex + jIndex*bufferSizes[0];
134  for(size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
135  size_t bufferIndex = jkBufferIndex + iIndex;
136  rhoPtr[bufferIndex] = 1.0;
137  rhoEPtr[bufferIndex] = rhoE;
138  rhoVPtr[bufferIndex] = 0.0;
139  rhoVPtr[bufferIndex+numPointsBuffer] = 0.0;
140  rhoVPtr[bufferIndex+2*numPointsBuffer] = 0.0;
141  }
142  }
143  }
144  } else if (numDim == 2) {
145  size_t iStart = partitionBufferInterval[0].first;
146  size_t iEnd = partitionBufferInterval[0].second;
147  size_t jStart = partitionBufferInterval[1].first;
148  size_t jEnd = partitionBufferInterval[1].second;
149  for(size_t jIndex = jStart;jIndex <= jEnd;jIndex++){
150  size_t jBufferIndex = jIndex*bufferSizes[0];
151  for(size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
152  size_t bufferIndex = jBufferIndex + iIndex;
153  rhoPtr[bufferIndex] = 1.0;
154  rhoEPtr[bufferIndex] = rhoE;
155  rhoVPtr[bufferIndex] = 0.0;
156  rhoVPtr[bufferIndex+numPointsBuffer] = 0.0;
157  }
158  }
159  } else if (numDim == 1) {
160  size_t iStart = partitionBufferInterval[0].first;
161  size_t iEnd = partitionBufferInterval[0].second;
162  for(size_t iIndex = iStart;iIndex <= iEnd;iIndex++){
163  rhoPtr[iIndex] = 1.0;
164  rhoEPtr[iIndex] = rhoE;
165  rhoVPtr[iIndex] = 0.0;
166  }
167  }
168  }
169  return(0);
170  };
171 
172  }
173 }
174 #endif
Definition: Euler.f90:1
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
double Gauss(const double &amplitude, const std::vector< double > &width, const std::vector< double > &center, const std::vector< double > &xPos)
int SetupEulerState(const GridType &inGrid, StateType &inState, StateType &inParams, int numScalars, bool withFluxes=false)
void const size_t const size_t * bufferSizes
Definition: MetricKernels.H:19
void const size_t const size_t const size_t const int * numScalars
Definition: EulerKernels.H:17
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
int InitializeQuiescentFlow(const GridType &inGrid, StateType &inState, bool everyWhere=false)
void const size_t * numPointsBuffer
Definition: MetricKernels.H:19