PlasCom2  1.0
XPACC Multi-physics simluation application
TestState.C
Go to the documentation of this file.
1 #include "Testing.H"
2 #include "Simulation.H"
3 
4 void TestStateBasic(ix::test::results &serialUnitResults){
5 
6  bool defaultConstructor = true;
7  simulation::state::base testState;
8  if(testState.NumStateVar() != 0)
9  defaultConstructor = false;
10  if(!(testState.StateFieldIndices().empty()))
11  defaultConstructor = false;
12  if(!(testState.NumMeta() == 0))
13  defaultConstructor = false;
14  if(!(testState.NumData() == 0))
15  defaultConstructor = false;
16 
17  int numFields = 4;
18  int numStateFields = 2;
19  int numStateVar = 4;
20 
21  bool addField = true;
22  testState.AddField("simulationScalar",'s',1,8,"simunit");
23  testState.AddField("gridScalar",'g',1,8,"gridunit");
24  testState.AddField("nodeScalar",'n',1,8,"nodeunit");
25  testState.AddField("nodeVector",'n',3,8,"nodeunit");
26 
27  std::vector<std::string> myStateFieldNames(numStateFields);
28  myStateFieldNames[0] = "nodeScalar";
29  myStateFieldNames[1] = "nodeVector";
30 
31  if(testState.NumMeta() != numFields)
32  addField = false;
33  if(testState.NumData() != 0)
34  addField = false;
35 
36  bool statePrepare = true;
37  testState.Prepare();
38  if(testState.NumData() != numFields )
39  statePrepare = false;
40  for(int iField = 0;iField < numFields;iField++)
41  if(!testState.FieldEmpty(iField))
42  statePrepare = false;
43 
44  bool setFieldBuffer = true;
45  std::vector<double> simScalarVec(1,-107.0);
46  testState.SetFieldBuffer("simulationScalar",simScalarVec);
47  double *bufPtr = &simScalarVec[0];
49  &simScalarField(testState.Field("simulationScalar"));
50  double *simScalarData = simScalarField.Data<double>();
51  std::vector<double> nodeScalarVec(1,0.0);
52  testState.SetFieldBuffer("nodeScalar",nodeScalarVec);
54  &nodeScalarField(testState.Field("nodeScalar"));
55  std::vector<double> nodeVectorVec(3,1.0);
56  testState.SetFieldBuffer("nodeVector",nodeVectorVec);
58  &nodeVectorField(testState.Field("nodeVector"));
59 
60  double *nodeScalarPtr = &nodeScalarVec[0];
61  double *nodeVectorPtr = &nodeVectorVec[0];
62  double *stateScalarBuf = nodeScalarField.Data<double>();
63  double *stateVectorBuf = nodeVectorField.Data<double>();
64  if( simScalarData != bufPtr ||
65  nodeScalarPtr != stateScalarBuf ||
66  nodeVectorPtr != stateVectorBuf)
67  setFieldBuffer = false;
68 
69 
70  // Set state fields in various ways
71  bool setStateFieldsByID = true;
72  std::vector<int> stateFieldIDs(numStateFields,2);
73  stateFieldIDs[1] = 3;
74  int numAccepted = testState.SetStateFields(stateFieldIDs);
75  if(numAccepted != numStateFields){
76  std::cout << "Number of fields accepted != number of fields"
77  << std::endl;
78  setStateFieldsByID = false;
79  }
80 
81  std::vector<std::string> stateFieldNames(testState.GetStateFieldNames());
82  if(stateFieldNames != myStateFieldNames){
83  std::cout << "State field names don't match." << std::endl;
84  setStateFieldsByID = false;
85  std::cout << "State names: " << std::endl;
86  std::vector<std::string>::iterator nameIt = stateFieldNames.begin();
87  std::vector<std::string>::iterator nameIt2 = myStateFieldNames.begin();
88  while(nameIt != stateFieldNames.end())
89  std::cout << "'" << *nameIt++ << "' != '"
90  << *nameIt2++ << "'" << std::endl;
91  }
92  // -- test if state field setting failed
93  if(testState.NumStateFields() != numStateFields){
94  std::cout << "Number of fields not right." << std::endl;
95  setStateFieldsByID = false;
96  }
97  if(testState.NumStateVar() != numStateVar){
98  std::cout << "Number of state variables not right." << std::endl;
99  setStateFieldsByID = false;
100  }
101  if(stateFieldNames.size() != numStateFields){
102  std::cout << "Number of state field names unright." << std::endl;
103  setStateFieldsByID = false;
104  }
105 
106  bool getStateFieldData = true;
107  bool getStateDataByName = true;
108  double *stateScalarFieldData = testState.GetStateFieldData(0);
109  double *stateVectorFieldData = testState.GetStateFieldData(1);
110  double *stateVectorFieldData2 = testState.GetStateFieldData("nodeVector");
111  if(stateScalarFieldData != nodeScalarPtr)
112  getStateFieldData = false;
113  if(stateVectorFieldData != nodeVectorPtr)
114  getStateFieldData = false;
115  if(stateVectorFieldData2 != nodeVectorPtr)
116  getStateDataByName = false;
117 
118  bool setStateFieldsByName = true;
119  numAccepted = testState.SetStateFields(myStateFieldNames);
120  if(numAccepted != numStateFields)
121  setStateFieldsByName = false;
122  stateFieldNames = testState.GetStateFieldNames();
123  stateScalarFieldData = testState.GetStateFieldData(0);
124  stateVectorFieldData = testState.GetStateFieldData(1);
125  if(stateScalarFieldData != nodeScalarPtr)
126  setStateFieldsByName = false;
127  if(stateVectorFieldData != nodeVectorPtr)
128  setStateFieldsByName = false;
129  if(testState.NumStateFields() != numStateFields)
130  setStateFieldsByName = false;
131  if(testState.NumStateVar() != numStateVar)
132  setStateFieldsByName = false;
133  if(stateFieldNames.size() != numStateFields)
134  setStateFieldsByName = false;
135  if(stateFieldNames != myStateFieldNames)
136  setStateFieldsByName = false;
137 
138 
139  bool setStateFieldsByList = true;
140  std::string nameList("nodeScalar nodeVector");
141  numAccepted = testState.SetStateFields(nameList);
142  if(numAccepted != numStateFields)
143  setStateFieldsByList = false;
144  stateFieldNames = testState.GetStateFieldNames();
145  stateScalarFieldData = testState.GetStateFieldData(0);
146  stateVectorFieldData = testState.GetStateFieldData(1);
147  stateVectorFieldData2 = testState.GetStateFieldData("nodeVector");
148  if(stateVectorFieldData2 != nodeVectorPtr)
149  getStateDataByName = false;
150  if(stateScalarFieldData != nodeScalarPtr)
151  setStateFieldsByList = false;
152  if(stateVectorFieldData != nodeVectorPtr)
153  getStateFieldData = false;
154  if(testState.NumStateFields() != numStateFields)
155  setStateFieldsByList = false;
156  if(testState.NumStateVar() != numStateVar)
157  setStateFieldsByList = false;
158  if(stateFieldNames.size() != numStateFields)
159  setStateFieldsByList = false;
160  if(stateFieldNames != myStateFieldNames)
161  setStateFieldsByList = false;
162 
163  serialUnitResults.UpdateResult("State:DefaultConstructor",defaultConstructor);
164  serialUnitResults.UpdateResult("State:AddField",addField);
165  serialUnitResults.UpdateResult("State:Prepare",statePrepare);
166  serialUnitResults.UpdateResult("State:SetFieldBuffer",setFieldBuffer);
167  serialUnitResults.UpdateResult("State:SetStateFieldIDs",setStateFieldsByID);
168  serialUnitResults.UpdateResult("State:SetStateFieldNames",setStateFieldsByName);
169  serialUnitResults.UpdateResult("State:SetStateFieldList",setStateFieldsByList);
170  serialUnitResults.UpdateResult("State:GetStateDataByID",getStateFieldData);
171  serialUnitResults.UpdateResult("State:GetStateDataByName",getStateDataByName);
172 
173 }
174 
175 void TestStateOperations(ix::test::results &serialUnitResults) {
176 
177  using namespace operators;
178 
179  typedef simulation::state::base StateType;
180 
181  // Create the fields in the state object
182  StateType testState1;
183  StateType testState2;
184  testState1.AddField("b1",'n',1,8,"simunit");
185  testState1.AddField("b2",'n',1,8,"simunit");
186  testState1.AddField("b3",'n',1,8,"simunit");
187  testState1.AddField("b4",'n',3,8,"simunit");
188  testState2.AddField("b1",'n',1,8,"simunit");
189  testState2.AddField("b2",'n',1,8,"simunit");
190  testState2.AddField("b3",'n',1,8,"simunit");
191  testState2.AddField("b4",'n',3,8,"simunit");
192  testState1.Prepare();
193  testState2.Prepare();
194 
195  // Set the state data buffers
196  std::vector<double> buffer10(2,0);
197  std::vector<double> buffer11(2,1);
198  std::vector<double> buffer12(2,2);
199  std::vector<double> vector1(6,32);
200  for(int ivec = 3;ivec < 6;ivec++)
201  vector1[ivec] = 64;
202  std::vector<double> buffer20(2,4);
203  std::vector<double> buffer21(2,8);
204  std::vector<double> buffer22(2,16);
205  std::vector<double> vector2(6,128);
206  for(int ivec = 3;ivec < 6;ivec++)
207  vector2[ivec] = 256;
208 
209  testState1.SetFieldBuffer("b1",buffer10);
210  testState1.SetFieldBuffer("b2",buffer11);
211  testState1.SetFieldBuffer("b3",buffer12);
212  testState1.SetFieldBuffer("b4",vector1);
213  testState2.SetFieldBuffer("b1",buffer20);
214  testState2.SetFieldBuffer("b2",buffer21);
215  testState2.SetFieldBuffer("b3",buffer22);
216  testState2.SetFieldBuffer("b4",vector2);
217 
218  // Tell the states which of their fields
219  // are state variables
220  std::vector<int> stateFieldIndices(4,0);
221  stateFieldIndices[1] = 1;
222  stateFieldIndices[2] = 2;
223  stateFieldIndices[3] = 3;
224  testState1.SetStateFields(stateFieldIndices);
225  testState2.SetStateFields(stateFieldIndices);
226 
227  // Test aX + Y (result in Y)
228  bool axpy_works = true;
229  AXPY(1.0,testState1,testState2);
230  if(buffer20[0] != 4 || buffer20[1] != 4 ||
231  buffer21[0] != 9 || buffer21[1] != 9 ||
232  buffer22[0] != 18 || buffer22[1] != 18 ||
233  vector2[0] != 160 || vector2[1] != 160 ||
234  vector2[2] != 160 || vector2[3] != 320 ||
235  vector2[4] != 320 || vector2[5] != 320)
236  axpy_works = false;
237 
238  bool zero_works = true;
239  Zero(testState2);
240  if(buffer20[0] != 0 || buffer20[1] != 0 ||
241  buffer21[0] != 0 || buffer21[1] != 0 ||
242  buffer22[0] != 0 || buffer22[1] != 0 ||
243  vector2[0] != 0 || vector2[1] != 0 ||
244  vector2[2] != 0 || vector2[3] != 0 ||
245  vector2[4] != 0 || vector2[5] != 0)
246  zero_works = false;
247 
248  bool assignment_works = false;
249  Assign(testState1,testState2);
250 
251  // Note that assignment necessarily dissociates the
252  // target state from the previous buffer and allocates
253  // a new one. After assignment, the new values are copied
254  // back into the local vector.
255  double *b1Buf = testState2.Field("b1").Data<double>();
256  double *b2Buf = testState2.Field("b2").Data<double>();
257  double *b3Buf = testState2.Field("b3").Data<double>();
258  double *b4Buf = testState2.Field("b4").Data<double>();
259  buffer20.assign(b1Buf,b1Buf+2);
260  buffer21.assign(b2Buf,b2Buf+2);
261  buffer22.assign(b3Buf,b3Buf+2);
262  vector2.assign(b4Buf,b4Buf+6);
263  if(buffer20 == buffer10 &&
264  buffer21 == buffer11 &&
265  buffer22 == buffer12 &&
266  vector2 == vector1)
267  assignment_works = true;
268 
269 
270  bool scalarMultiply_works = false;
271  StateType testState3(2.0*testState1);
272  b1Buf = testState3.Field("b1").Data<double>();
273  b2Buf = testState3.Field("b2").Data<double>();
274  b3Buf = testState3.Field("b3").Data<double>();
275  b4Buf = testState3.Field("b4").Data<double>();
276  buffer20.assign(b1Buf,b1Buf+2);
277  buffer21.assign(b2Buf,b2Buf+2);
278  buffer22.assign(b3Buf,b3Buf+2);
279  vector2.assign(b4Buf,b4Buf+6);
280  if(buffer20[0] == 2.0*buffer10[0] &&
281  buffer20[1] == 2.0*buffer10[1] &&
282  buffer21[0] == 2.0*buffer11[0] &&
283  buffer21[1] == 2.0*buffer11[1] &&
284  buffer22[0] == 2.0*buffer12[0] &&
285  buffer22[1] == 2.0*buffer12[1] &&
286  vector2[0] == 2.0*vector1[0] &&
287  vector2[1] == 2.0*vector1[1] &&
288  vector2[2] == 2.0*vector1[2] &&
289  vector2[3] == 2.0*vector1[3] &&
290  vector2[4] == 2.0*vector1[4] &&
291  vector2[5] == 2.0*vector1[5])
292  scalarMultiply_works = true;
293 
294  bool sum_works = false;
295  StateType testState4(Sum(testState3,testState1));
296  b1Buf = testState4.Field("b1").Data<double>();
297  b2Buf = testState4.Field("b2").Data<double>();
298  b3Buf = testState4.Field("b3").Data<double>();
299  b4Buf = testState4.Field("b4").Data<double>();
300  buffer20.assign(b1Buf,b1Buf+2);
301  buffer21.assign(b2Buf,b2Buf+2);
302  buffer22.assign(b3Buf,b3Buf+2);
303  vector2.assign(b4Buf,b4Buf+6);
304  if(buffer20[0] == 3.0*buffer10[0] &&
305  buffer20[1] == 3.0*buffer10[1] &&
306  buffer21[0] == 3.0*buffer11[0] &&
307  buffer21[1] == 3.0*buffer11[1] &&
308  buffer22[0] == 3.0*buffer12[0] &&
309  buffer22[1] == 3.0*buffer12[1] &&
310  vector2[0] == 3.0*vector1[0] &&
311  vector2[1] == 3.0*vector1[1] &&
312  vector2[2] == 3.0*vector1[2] &&
313  vector2[3] == 3.0*vector1[3] &&
314  vector2[4] == 3.0*vector1[4] &&
315  vector2[5] == 3.0*vector1[5])
316  sum_works = true;
317 
318 
319  bool difference_works = false;
320  StateType testState5(Difference(testState3,testState4));
321  b1Buf = testState5.Field("b1").Data<double>();
322  b2Buf = testState5.Field("b2").Data<double>();
323  b3Buf = testState5.Field("b3").Data<double>();
324  b4Buf = testState5.Field("b4").Data<double>();
325  buffer20.assign(b1Buf,b1Buf+2);
326  buffer21.assign(b2Buf,b2Buf+2);
327  buffer22.assign(b3Buf,b3Buf+2);
328  vector2.assign(b4Buf,b4Buf+6);
329  if(buffer20[0] == buffer10[0] &&
330  buffer20[1] == buffer10[1] &&
331  buffer21[0] == buffer11[0] &&
332  buffer21[1] == buffer11[1] &&
333  buffer22[0] == buffer12[0] &&
334  buffer22[1] == buffer12[1] &&
335  vector2[0] == vector1[0] &&
336  vector2[1] == vector1[1] &&
337  vector2[2] == vector1[2] &&
338  vector2[3] == vector1[3] &&
339  vector2[4] == vector1[4] &&
340  vector2[5] == vector1[5])
341  difference_works = true;
342 
343  serialUnitResults.UpdateResult("State:AXPY",axpy_works);
344  serialUnitResults.UpdateResult("State:Zero",zero_works);
345  serialUnitResults.UpdateResult("State:Assignment",assignment_works);
346  serialUnitResults.UpdateResult("State:ScalarMultiply",scalarMultiply_works);
347  serialUnitResults.UpdateResult("State:Sum",sum_works);
348  serialUnitResults.UpdateResult("State:Difference",difference_works);
349 
350 }
351 
352 void TestStateMetaData(ix::test::results &serialUnitResults)
353 {
354 
355 };
356 
357 void TestStateHandles(ix::test::results &serialUnitResults)
358 {
359  typedef simulation::state::base StateType;
360 
361  bool testFieldHandles = true;
362 
363  StateType testState1;
364  StateType testState2;
365 
366  testState1.AddField("b1",'n',1,8,"simunit");
367  testState1.AddField("b2",'n',2,8,"simunit");
368  testState1.AddField("b3",'n',3,8,"simunit");
369  testState1.AddField("b4",'n',4,8,"simunit");
370 
371  if(testState1.InitializeFieldHandles()){
372  std::cout << "InitializeFieldHandles failed." << std::endl;
373  testFieldHandles = false;
374  }
375 
376  testState1.Create(100,0);
377 
378  int b1Handle = testState1.GetFieldHandle("b1");
379 
380  if(b1Handle < 0)
381  testFieldHandles = false;
382  if(b1Handle != 0)
383  testFieldHandles = false;
384 
385  serialUnitResults.UpdateResult("State:GetFieldHandle",testFieldHandles);
386 
387  int dataIndex = testState1.GetDataIndex("b1");
388  pcpp::field::dataset::DataBufferType &b1DataByIndex(testState1.Field(dataIndex));
389  double *b1PtrByIndex = b1DataByIndex.Data<double>();
390 
391  bool getFieldDataByHandle = true;
392  pcpp::field::dataset::DataBufferType &b1Data(testState1.GetFieldDataByHandle(b1Handle));
393  double *b1PtrByHandle = b1Data.Data<double>();
394  if(b1PtrByHandle != b1PtrByIndex)
395  getFieldDataByHandle = false;
396 
397  serialUnitResults.UpdateResult("State:GetFieldDataByHandle",getFieldDataByHandle);
398 
399  bool getFieldMetaDataByHandle = true;
400  const pcpp::field::dataset::MetaDataType &fieldMetaData
401  (testState1.GetFieldMetaData(dataIndex));
402 
403  const pcpp::field::dataset::MetaDataType &fieldMetaDataByHandle
404  (testState1.GetFieldMetaDataByHandle(b1Handle));
405 
406  if(fieldMetaData != fieldMetaDataByHandle)
407  getFieldMetaDataByHandle = false;
408 
409  serialUnitResults.UpdateResult("State:GetFieldMetaDataByHandle",getFieldMetaDataByHandle);
410 
411  const std::string copyFields("b3 b4");
412  testState2.Copy(testState1,copyFields);
413 
414  bool copyStateHandles = true;
415 
416  int b3Handle = testState1.GetFieldHandle("b3");
417  int b3Handle2 = testState2.GetFieldHandle("b3");
418  dataIndex = testState2.GetDataIndex("b3");
419  if(b3Handle != b3Handle2){
420  copyStateHandles = false;
421  std::cout << "B3 Handle = " << b3Handle << std::endl
422  << "B3 Copy Handle = " << b3Handle2 << std::endl;
423  }
424  if(dataIndex != 0){
425  copyStateHandles = false;
426  std::cout << "Copied b3 index = " << dataIndex << std::endl;
427  }
428 
429 
430  serialUnitResults.UpdateResult("State:CopyStateHandles",copyStateHandles);
431 
432 
433  return;
434 };
int SetStateFields(const std::vector< int > &inFieldIndices)
Definition: State.H:310
void TestStateMetaData(ix::test::results &serialUnitResults)
Definition: TestState.C:352
void AXPY(double a, StateType &X, StateType &Y)
void Assign(StateType &X, StateType &Y)
const std::vector< int > & StateFieldIndices() const
Definition: State.H:307
bool FieldEmpty(int known_field=0)
size_t NumData() const
StateType Difference(StateType &X, StateType &Y)
virtual void Prepare()
void TestStateBasic(ix::test::results &serialUnitResults)
Definition: TestState.C:4
Encapsulating class for collections of test results.
Definition: Testing.H:18
StateType Sum(StateType &X, StateType &Y)
void TestStateHandles(ix::test::results &serialUnitResults)
Definition: TestState.C:357
void Zero(StateType &X)
std::vector< std::string > GetStateFieldNames()
Definition: State.H:274
Testing constructs for unit testing.
size_t NumMeta() const
void UpdateResult(const std::string &name, const ValueType &result)
Updates an existing test result.
Definition: Testing.H:55
double * GetStateFieldData(int stateFieldIndex)
Definition: State.H:283
void AddField(const std::string &name, char loc, unsigned int ncomp, unsigned int dsize, const std::string &unit)
void TestStateOperations(ix::test::results &serialUnitResults)
Definition: TestState.C:175
void SetFieldBuffer(const std::string &name, void *buf)
DataBufferType & Field(const std::string &name)