PlasCom2  1.0
XPACC Multi-physics simluation application
State.H
Go to the documentation of this file.
1 #ifndef __STATE_H__
2 #define __STATE_H__
3 
4 #include "PCPPTypes.H"
5 #include "PCPPUtil.H"
6 #include "PCPPFieldData.H"
7 
8 
9 namespace simulation {
10 
11  namespace state {
12 
15 
16  class base : public pcpp::field::dataset
17  {
18 
19  public:
20 
21  // friend simulation::state::base operator*(double,simulation::state::base &);
22 
23  base() : pcpp::field::dataset(), numStateVar(0), numStateFields(0) {};
24 
25  base(const base &inBase) : pcpp::field::dataset(inBase),
26  numStateVar(inBase.numStateVar),
29  // domainVarIndices(inBase.domainVarIndices),
30  // paramVarIndices(inBase.paramVarIndices){};
31 
32 
33  inline base &Zero()
34  {
35  std::vector<int>::iterator indexIt = stateFieldIndices.begin();
36  while(indexIt != stateFieldIndices.end()){
37  int fieldIndex(*indexIt++);
38  DataBufferType &fieldData(data[fieldIndex]);
39  size_t numItems = fieldData.NItems();
40  double *srcData = fieldData.Data<double>();
41  for(size_t iItem = 0;iItem < numItems;iItem++)
42  srcData[iItem] = 0.0;
43  }
44  return(*this);
45  }
46 
47  inline base &operator+=(const base &inBase)
48  {
49  assert(stateFieldIndices.size() == inBase.stateFieldIndices.size());
50  std::vector<int>::iterator indexIt = stateFieldIndices.begin();
51  std::vector<int>::const_iterator inIndexIt = inBase.stateFieldIndices.begin();
52  while(indexIt != stateFieldIndices.end()){
53  int fieldIndex(*indexIt++);
54  int inFieldIndex(*inIndexIt++);
55  assert(inBase.meta[inFieldIndex] == meta[fieldIndex]);
56  DataBufferType &fieldData(data[fieldIndex]);
57  size_t numItems = fieldData.NItems();
58 
59  const double *srcData = inBase.data[inFieldIndex].Data<double>();
60  double *targData = data[fieldIndex].Data<double>();
61  for(size_t iItem = 0;iItem < numItems;iItem++)
62  targData[iItem] += srcData[iItem];
63  }
64  return(*this);
65  };
66 
67  inline base &operator-=(const base &inBase)
68  {
69 
70  assert(stateFieldIndices.size() == inBase.stateFieldIndices.size());
71 
72  std::vector<int>::const_iterator indexIt = stateFieldIndices.begin();
73  std::vector<int>::const_iterator index2It = inBase.stateFieldIndices.begin();
74 
75  while(indexIt != stateFieldIndices.end()){
76 
77  const int myFieldIndex(*indexIt++);
78  const int otherFieldIndex(*index2It++);
79  assert((meta[myFieldIndex].ncomp == inBase.meta[otherFieldIndex].ncomp) &&
80  (meta[myFieldIndex].dsize == inBase.meta[otherFieldIndex].dsize));
81 
82  DataBufferType &fieldData(data[myFieldIndex]);
83  const double *srcData = inBase.data[otherFieldIndex].Data<double>();
84  double *targData = fieldData.Data<double>();
85 
86  size_t numItems = fieldData.NItems();
87  for(size_t iItem = 0;iItem < numItems;iItem++){
88  targData[iItem] -= srcData[iItem];
89  }
90 
91  }
92  return(*this);
93  };
94 
95  inline base operator+(const base &inBase)
96  {
97  base returnVal;
98  returnVal.Copy(*this);
99  returnVal += inBase;
100  return(returnVal);
101  };
102 
103  inline base operator-(const base &inBase)
104  {
105  base returnVal;
106  returnVal.Copy(*this);
107  returnVal -= inBase;
108  return(returnVal);
109  };
110 
111  inline base &operator*=(double inScalar)
112  {
113  std::vector<int>::iterator indexIt = stateFieldIndices.begin();
114  while(indexIt != stateFieldIndices.end()){
115  int fieldIndex(*indexIt++);
116  DataBufferType &fieldData(data[fieldIndex]);
117  size_t numItems = fieldData.NItems();
118  double *targData = fieldData.Data<double>();
119  for(size_t iItem = 0;iItem < numItems;iItem++)
120  targData[iItem] *= inScalar;
121  }
122  return(*this);
123  };
124 
125  inline base operator*(double inScalar)
126  {
127  base returnValue;
128  returnValue.Copy(*this);
129  returnValue *= inScalar;
130  return(returnValue);
131  };
132 
133  inline base &operator=(const base &inState)
134  {
135  if(this != &inState){
136  Copy(inState);
137  }
138  return(*this);
139  };
140 
141  virtual void Destroy(const std::string &fieldName)
142  {
144  };
145  virtual void Report(std::ostream &outStream)
146  {
147  bool verbose = false;
148  int numField = NumData();
149  // std::cout << "Number of data items in this state object: " << numField << std::endl;
150  for(int iField = 0;iField < numField;iField++){
151 
152  int dataIndex = iField;
153 
154  const std::string &fieldName(meta[dataIndex].name);
155  size_t numPoints = data[dataIndex].NItems();
156  size_t numComponents = meta[dataIndex].ncomp;
157  size_t numItems = numPoints/numComponents;
158  size_t dsize = meta[dataIndex].dsize;
159  bool stateField = (std::find(stateFieldIndices.begin(),stateFieldIndices.end(),iField)
160  != stateFieldIndices.end());
161 
162  outStream << (stateField ? "" : "State ") << "Field: "
163  << fieldName << std::endl
164  << "number of components: " << numComponents << std::endl
165  << "number of items: " << numItems << std::endl
166  << "number of bytes/item: " << meta[dataIndex].dsize << std::endl;
167 
168 
169  if(dsize == 1){
170  signed char *dataBuffer = GetFieldBuffer<signed char>(fieldName);
171  outStream << "buffer address: " << dataBuffer << std::endl;
172  for(int iComponent = 0;iComponent < numComponents;iComponent++){
173  std::ostringstream Ostr;
174  Ostr << "component-" << iComponent << " ";
175  outStream << (numComponents > 1 ? Ostr.str() : "" )
176  << "buffer stats:" << std::endl;
177  pcpp::util::ReportBufferStats(outStream,numItems,&dataBuffer[iComponent*numItems]);
178  }
179  } else if (dsize == 4){
180  int *dataBuffer = GetFieldBuffer<int>(fieldName);
181  outStream << "buffer address: " << dataBuffer << std::endl;
182  for(int iComponent = 0;iComponent < numComponents;iComponent++){
183  std::ostringstream Ostr;
184  Ostr << "component-" << iComponent << " ";
185  outStream << (numComponents > 1 ? Ostr.str() : "" )
186  << "buffer stats:" << std::endl;
187  pcpp::util::ReportBufferStats(outStream,numItems,&dataBuffer[iComponent*numItems]);
188  }
189  } else if (dsize == 8){
190  double *dataBuffer = GetFieldBuffer<double>(fieldName);
191  outStream << "buffer address: " << dataBuffer << std::endl;
192  for(int iComponent = 0;iComponent < numComponents;iComponent++){
193  std::ostringstream Ostr;
194  Ostr << "component-" << iComponent << " ";
195  outStream << (numComponents > 1 ? Ostr.str() : "" )
196  << "buffer stats:" << std::endl;
197  pcpp::util::ReportBufferStats(outStream,numItems,&dataBuffer[iComponent*numItems]);
198  }
199  }
200  }
201  };
202 
203  // virtual pcpp::field::dataset::DataBufferType &Field(const std::string &fieldName)
204  // {
205  // return(pcpp::field::dataset::Field(fieldName));
206  // };
207 
208  virtual void CopyStateData(const base &inBase)
209  {
210  Destroy();
212  numStateVar = inBase.numStateVar;
215  for(int iField = 0;iField < numStateFields;iField++){
216  int inStateFieldIndex = inBase.stateFieldIndices[iField];
217  stateFieldIndices[iField] = iField;
218  }
219  // domainVarIndices = inBase.domainVarIndices;
220  // paramVarIndices = inBase.paramVarIndices;
221  };
222 
223  virtual void Copy(const base &inBase)
224  {
225  Destroy();
227  numStateVar = inBase.numStateVar;
230  // domainVarIndices = inBase.domainVarIndices;
231  // paramVarIndices = inBase.paramVarIndices;
232  };
233 
234  virtual void Copy(const base &inBase,const std::string &copyStates)
235  {
236  Destroy();
237  pcpp::field::dataset::Copy(inBase,copyStates);
238  };
239 
240  virtual void Destroy()
241  {
242  numStateVar = 0;
243  numStateFields = 0;
244  stateFieldIndices.resize(0);
245  // domainVarIndices.resize(0);
246  // paramVarIndices.resize(0);
248  };
249 
250  int Alias(const std::string &sourceField,const std::string &fieldAlias)
251  {
252  int fieldIndex = this->GetFieldIndex(sourceField);
253  if(fieldIndex < 0)
254  return(1);
255  // Copy source meta into new meta
256  // Add field/meta to state
257  // Set field buffer to source field buffer
258  return(1);
259  };
260 
261  int ConfigureState(ConfigurationType &inConfig,std::ostream &messageStream);
262 
263  int NumStateFieldComponents(int stateFieldIndex)
264  {
265  int fieldIndex = stateFieldIndices[stateFieldIndex];
266  return(meta[fieldIndex].ncomp);
267  };
268 
269 
270  int NumStateFields() { return(numStateFields); };
271 
272  int NumStateVar() { return(numStateVar); };
273 
274  std::vector<std::string> GetStateFieldNames()
275  {
276  std::vector<std::string> stateFieldNames;
277  for(int iField = 0;iField < numStateFields;iField++){
278  stateFieldNames.push_back(meta[stateFieldIndices[iField]].name);
279  }
280  return(stateFieldNames);
281  };
282 
283  inline double *GetStateFieldData(int stateFieldIndex)
284  {
285  int fieldIndex = stateFieldIndices[stateFieldIndex];
286  return(data[fieldIndex].Data<double>());
287  };
288 
289  inline double *GetStateFieldData(const std::string &fieldName)
290  {
291  int stateFieldIndex = GetStateFieldIndex(fieldName);
292  if(stateFieldIndex < 0)
293  return((double *)NULL);
294  int fieldIndex = stateFieldIndices[stateFieldIndex];
295  return(data[fieldIndex].Data<double>());
296  };
297 
298  inline int GetStateFieldIndex(const std::string &fieldName)
299  {
300  for(int iField = 0;iField < numStateFields;iField++){
301  if(meta[stateFieldIndices[iField]].name == fieldName)
302  return(iField);
303  }
304  return(-1);
305  };
306 
307  const std::vector<int> &StateFieldIndices() const
308  { return(stateFieldIndices); };
309 
310  int SetStateFields(const std::vector<int> &inFieldIndices)
311  {
312  numStateFields = 0;
313  stateFieldIndices.resize(0);
314  int nVar = 0;
315  int numMeta = NumMeta();
316  std::vector<int>::const_iterator fieldIndIt = inFieldIndices.begin();
317  while(fieldIndIt != inFieldIndices.end()){
318  int fieldIndex(*fieldIndIt++);
319  if(fieldIndex < numMeta){
320  stateFieldIndices.push_back(fieldIndex);
321  nVar += meta[fieldIndex].ncomp;
322  numStateFields++;
323  }
324  }
325  numStateVar = nVar;
326  return(numStateFields);
327  };
328 
329  int SetStateFields(const std::vector<std::string> &inFieldNames)
330  {
331  numStateFields = 0;
332  stateFieldIndices.resize(0);
333  int nVar = 0;
334  int numMeta = NumMeta();
335  std::vector<std::string>::const_iterator fieldNameIt = inFieldNames.begin();
336  while(fieldNameIt != inFieldNames.end()){
337  std::string fieldName(*fieldNameIt++);
338  int fieldIndex = GetDataIndex(fieldName);
339  if(fieldIndex >= 0){
340  stateFieldIndices.push_back(fieldIndex);
341  nVar += meta[fieldIndex].ncomp;
342  numStateFields++;
343  }
344  }
345  numStateVar = nVar;
346  return(numStateFields);
347  };
348 
349 
350  int SetStateFields(const std::string &inFieldNames)
351  {
352  std::vector<std::string> fieldNameVec;
353  std::istringstream Istr(inFieldNames);
354  std::string fieldName;
355  while(Istr >> fieldName){
356  if(!fieldName.empty())
357  fieldNameVec.push_back(fieldName);
358  }
359  return(SetStateFields(fieldNameVec));
360  };
361 
362  std::string ReportMeta()
363  {
364  return(Meta().Report());
365  };
366 
367  protected:
368 
369  int numStateFields;
371  std::vector<int> stateFieldIndices;
372  // std::vector<int> domainVarIndices; /// @brief index(id) of domain-global variables
373  // std::vector<int> paramVarIndices; /// @brief index(id) of parameter (static) data
374 
375  };
376 
377  int ConfigureMeta(ConfigurationType &inConfig,pcpp::field::metadataset &inMeta,
378  std::ostream &messageStream);
379 
380  class probe {
381  public:
382  probe() : statePtr(NULL),pointDelimiter("\n") {};
383  probe(pcpp::IndexIntervalType &inInterval) : statePtr(NULL),pointDelimiter("\n"),
384  probeInterval(inInterval) {};
386  pcpp::IndexIntervalType &inProbeInterval) : statePtr(NULL),pointDelimiter("\n"),
387  dataInterval(inDataInterval),
388  probeInterval(inProbeInterval) {};
389  void SetProbeFields(const std::vector<std::string> &inFields);
390  void SetDelimiter(const std::string &inPointDelimiter);
391  void SetState(const simulation::state::base &inState);
392  void SetDataInterval(const pcpp::IndexIntervalType &inInterval);
393  void SetProbeInterval(const pcpp::IndexIntervalType &inInterval);
394  virtual int Process(){return(0);};
395  int Probe(const simulation::state::base &inState,std::ostream &outStream);
396  int Probe(std::ostream &outStream);
397  protected:
399  std::vector<std::string> probeFields;
400  std::vector<int> fieldIndices;
403  std::vector<size_t> flatProbeIndices;
404  std::string pointDelimiter;
405  private:
406  size_t numNodes;
407  int InitFieldIndices();
408  int InitFlatProbeIndices();
409  };
410 
411  class halo {
412 
413  public:
414 
415  struct messagebuffers {
417  std::vector<size_t> numPointsSend;
418  std::vector<size_t> numPointsRecv;
419  std::vector<double *> sendBuffers;
420  std::vector<double *> recvBuffers;
421  };
422 
423  public:
426  // These indicate the field indices wrt the state that are included
427  // in the halo, and the number of components for the given field, resp.
428  std::vector<int> stateFieldIndices;
429  std::vector<int> numFieldComponents;
430 
431  halo() : numStateComponents(0), numStateFields(0), ownSendBuffers(false),
432  ownRecvBuffers(false), ownHaloBuffers(false), doFill(false), numThreads(1)
433  {};
434 
435  halo(const pcpp::IndexIntervalType &inGlobalExtent,const pcpp::IndexIntervalType &inPartitionExtent) :
436  numStateComponents(0), numStateFields(0), ownSendBuffers(false),
437  ownRecvBuffers(false), ownHaloBuffers(false), doFill(false), globalGridExtent(inGlobalExtent),
438  globalPartitionExtent(inPartitionExtent), numThreads(1)
439  {};
440 
441  void SetGridInterval(const pcpp::IndexIntervalType &inExtent) { globalGridExtent = inExtent; };
442  void SetPartitionInterval(const pcpp::IndexIntervalType &inExtent) { globalPartitionExtent = inExtent; };
443 
444  bool SetFill(bool yesno){ doFill = yesno; return(doFill); };
445  bool Fill() {return(doFill); };
446 
447  void SetLocalBufferSizes(const std::vector<size_t> &inBufferSizes)
448  {
449  localBufferSizes = inBufferSizes;
450  numPointsBuffer = 1;
451  std::vector<size_t>::iterator bsIt = localBufferSizes.begin();
452  while(bsIt != localBufferSizes.end())
453  numPointsBuffer *= *bsIt++;
454  };
455 
456  void SetLocalPartitionExtent(const pcpp::IndexIntervalType &inExtent){ localPartitionExtent = inExtent; };
457 
458  std::vector<pcpp::IndexIntervalType> CreateRemoteHaloExtents(const pcpp::IndexIntervalType &globalExtent,
459  const pcpp::IndexIntervalType &partitionExtent,
460  std::vector<size_t> &haloSizes);
461  std::vector<pcpp::IndexIntervalType> CreateRemoteHaloExtents(std::vector<size_t> &haloSizes);
462 
463  std::vector<pcpp::IndexIntervalType> CreateLocalHaloExtents(const pcpp::IndexIntervalType &globalExtent,
464  const pcpp::IndexIntervalType &partitionExtent,
465  std::vector<size_t> &haloSizes);
466  std::vector<pcpp::IndexIntervalType> CreateLocalHaloExtents(std::vector<size_t> &haloSizes);
467 
468  // deprecated
469  void ConfigureHalo(const pcpp::IndexIntervalType &partitionExtent,
470  const std::vector<pcpp::IndexIntervalType> &haloExtents,
471  size_t numHaloVar);
472  void ConfigureHalo(const pcpp::IndexIntervalType &globalExtent,
473  const pcpp::IndexIntervalType &partitionExtent,
474  const std::vector<pcpp::IndexIntervalType> &haloExtents);
475  void ConfigureHalo(const pcpp::IndexIntervalType &globalExtent,
476  const pcpp::IndexIntervalType &partitionExtent);
477  void ConfigureData(const state::base &inState);
478  void ConfigureData(const state::base &inState,const std::vector<int> &selectFields);
479 
480  // -------- Threaded interface --------------
481  int CreateThreadSendIndices(int threadId);
482  int CreateThreadRecvIndices(int threadId);
483  int UnpackSimpleRecvBuffers(int threadId);
484  int PackSimpleSendBuffers(const state::base &inX, int threadId);
485  void SetRemoteHaloExtents(const std::vector<pcpp::IndexIntervalType> haloExtents)
486  {
487  remoteHaloExtents = haloExtents;
488  if(!localPartitionExtent.empty()){
489  int numDim = haloExtents.size()/2;
490  remoteHaloBufferExtents.resize(2*numDim);
491  for(int iDim = 0;iDim < numDim;iDim++){
492  pcpp::IndexIntervalType &leftHaloExtent(remoteHaloExtents[2*iDim]);
493  if(leftHaloExtent.NNodes() > 0){ // Left remote halo for iDim direction
494  int haloSize = leftHaloExtent[iDim].second - leftHaloExtent[iDim].first + 1;
495  pcpp::IndexIntervalType remoteHaloBufferExtent(localPartitionExtent);
496  remoteHaloBufferExtent[iDim].first = 0;
497  remoteHaloBufferExtent[iDim].second = haloSize - 1;
498  remoteHaloBufferExtents[iDim*2].Copy(remoteHaloBufferExtent);
499  }
500  pcpp::IndexIntervalType &rightHaloExtent(remoteHaloExtents[2*iDim+1]);
501  if(rightHaloExtent.NNodes() > 0){ // Right remote halo for iDim direction
502  int haloSize = rightHaloExtent[iDim].second - rightHaloExtent[iDim].first + 1;
503  pcpp::IndexIntervalType remoteHaloBufferExtent(localPartitionExtent);
504  remoteHaloBufferExtent[iDim].second = localBufferSizes[iDim] - 1;
505  remoteHaloBufferExtent[iDim].first = remoteHaloBufferExtent[iDim].second - haloSize + 1;
506  remoteHaloBufferExtents[iDim*2+1].Copy(remoteHaloBufferExtent);
507  }
508  }
509  }
510  // if(!localPartitionExtent.empty()){
511  // }
512  };
513 
514  void SetThreadExtent(int myThreadId,pcpp::IndexIntervalType threadInterval)
515  {
516  threadExtents[myThreadId] = threadInterval;
517  if(!localPartitionExtent.empty()){
518  int numDim = threadInterval.size();
519  pcpp::IndexIntervalType &threadBufferExtent(threadBufferExtents[myThreadId]);
520  threadBufferExtent = (threadInterval - globalPartitionExtent);
521  threadBufferExtent += localPartitionExtent;
522  for(int iDim = 0;iDim < numDim;iDim++){
523  if(threadBufferExtent[iDim].first == localPartitionExtent[iDim].first){
524  threadBufferExtent[iDim].first = 0;
525  }
526  if(threadBufferExtent[iDim].second == localPartitionExtent[iDim].second)
527  threadBufferExtent[iDim].second = localBufferSizes[iDim] - 1;
528  }
529  }
530  };
531  void SetNumThreads(int numThreadsIn)
532  {
533  numThreads = numThreadsIn;
534  threadExtents.resize(numThreads,globalPartitionExtent);
535  threadBufferExtents.resize(numThreads,localPartitionExtent);
536  threadSendIndices.resize(numThreads);
537  threadSendBufferIndices.resize(numThreads);
538  threadRecvIndices.resize(numThreads);
539  threadRecvBufferIndices.resize(numThreads);
540  threadHaloBufferIndices.resize(numThreads);
541  };
542  int NumThreads() { return (numThreads); };
543  // ----------------------------------------
544 
545  void SetLocalHaloExtents(const std::vector<pcpp::IndexIntervalType> haloExtents)
546  {
547  localHaloExtents = haloExtents;
548  if(!localPartitionExtent.empty()){
549  // assert(!bufferSizes.empty());
550  int numDim = haloExtents.size();
551  localHaloBufferExtents.resize(numDim);
552  for(int iDim = 0;iDim < numDim;iDim++){
553  pcpp::IndexIntervalType &threadSendInterval(localHaloExtents[iDim]);
554  // Adjust to local numbering: extentWRTLocal = extentWRTGlobal - globalPartitionExtent
555  pcpp::IndexIntervalType subThreadSendExtent(threadSendInterval - globalPartitionExtent);
556  // Adjust to the buffer numbering: extentWRTLocalBuffer = extentWRTLocal + localPartitionInterval
557  subThreadSendExtent += localPartitionExtent;
558  // Obtain flat indices: bufferExtent.GetFlatIndices(subHaloExtent,sendIndices[i]);
559  localHaloBufferExtents[iDim].Copy(subThreadSendExtent);
560  }
561  }
562  };
563 
564  void CreateHaloBuffers();
565  int CreateSendBuffers(const std::vector<pcpp::RemoteCollisionType> &inCollisions);
566  int CreateRecvBuffers(const std::vector<pcpp::RemoteCollisionType> &inCollisions);
567 
568  int CreateSimpleSendBuffers();
569  int CreateSimpleSendIndices();
570  int CreateSimpleRecvBuffers();
571  int CreateSimpleRecvIndices();
572 
573  int CreateMessageBuffers(int numComponents);
574  int PackMessageBuffers(const int messageId,const int componentId,
575  const int numComponents,const double *sourceBuffer);
576  int PackMessageBuffers(const int messageId,const int componentId,
577  const int numComponents,const double *sourceBuffer,
578  const int threadId);
579  int SendMessage(const int messageId,const std::vector<int> &neighborRanks,
580  CommunicatorType &inComm);
581  int ReceiveMessage(const int messageId,const std::vector<int> &neighborRanks,
582  CommunicatorType &inComm);
583  int UnPackMessageBuffers(const int messageId,const int componentId,
584  const int numComponents,double *targetBuffer);
585  int UnPackMessageBuffers(const int messageId,const int componentId,
586  const int numComponents,double *targetBuffer,
587  const int threadId);
588 
589  void DestroySendBuffers();
590  void DestroyHaloBuffers();
591  void DestroyRecvBuffers();
592  int UnpackReceiveBuffers();
593  int UnpackSimpleRecvBuffers();
594  int PackSendBuffers(const state::base &inState);
595  int PackSimpleSendBuffers(const state::base &inState);
596  int PackSimpleSendBuffers(double inA,const state::base &inX,const state::base &inY);
597  int Send(CommunicatorType &inComm);
598  int SimpleSend(std::vector<int> &neighborRanks,CommunicatorType &inComm);
599  int PostReceives(CommunicatorType &inComm);
600  int PostSimpleReceives(std::vector<int> &sourceRanks,CommunicatorType &inComm);
601  int CompleteReceives(CommunicatorType &inComm);
602  int CompleteSimpleReceives(CommunicatorType &inComm);
603  int Wait(CommunicatorType &inComm);
604  void SetNeighbors(const std::vector<bool> &inNeighbors){
605  haveNeighbor = inNeighbors;
606  };
607  inline std::vector<double *> &RecvBuffers()
608  { return(recvBuffers); };
609  inline std::vector<std::vector<double *> > &HaloBuffers()
610  { return(haloBuffers); };
611  inline std::vector<double *> &SendBuffers()
612  { return(sendBuffers); };
613  inline std::vector<std::pair<int,std::vector<size_t> > > &HaloRecvIndices()
614  { return(haloRecvIndices); };
615  inline std::vector<pcpp::RemoteCollisionType> &SendCollisions()
616  { return(sendCollisions); };
617  inline std::vector<pcpp::RemoteCollisionType> &RecvCollisions()
618  { return(recvCollisions); };
619  inline double *HaloBuffer(int fieldIndex,int directionIndex)
620  { return(haloBuffers[fieldIndex][directionIndex]); };
621  inline std::vector<pcpp::IndexIntervalType> &ThreadExtents() { return(threadExtents); };
622  inline std::vector<int> &StateFieldIndices() { return(stateFieldIndices); };
623  inline pcpp::IndexIntervalType &GlobalExtent() { return(globalGridExtent); };
624  inline pcpp::IndexIntervalType &PartitionExtent() { return (globalPartitionExtent); };
625  inline std::vector<pcpp::IndexIntervalType> &RemoteHaloExtents() { return(remoteHaloExtents); };
626  inline std::vector<pcpp::IndexIntervalType> &LocalHaloExtents() { return(localHaloExtents); };
627  const std::vector<pcpp::IndexIntervalType> &RemoteHaloBufferExtents() const { return(remoteHaloBufferExtents); };
628  const std::vector<pcpp::IndexIntervalType> &LocalHaloBufferExtents() const { return(localHaloBufferExtents); };
629 
630  std::vector<messagebuffers> &CommunicationBuffers() { return(communicationBuffers); };
631  const std::vector<std::vector<size_t> > &SendIndices() const {return(sendIndices);};
632  const std::vector<std::vector<size_t> > &RecvIndices() const {return(recvIndices);};
633  inline std::vector<int> &PeriodicDirs() { return(periodicDirs); };
634 
635  void ReportSimpleBufferContents(std::ostream &outStream);
636  ~halo(){
637  DestroyAll();
638  }
639  void DestroyAll()
640  {
641  DestroyHaloBuffers();
642  DestroySendBuffers();
643  DestroyRecvBuffers();
644  };
645  protected:
646 
647  bool ownSendBuffers;
652  bool doFill;
655  // int numStateComponents;
656 
657  std::vector<int> periodicDirs;
658 
659  // These are the extents of the partition and
660  // halos, resp.
664  std::vector<size_t> localBufferSizes;
665 
666  std::vector<bool> haveNeighbor;
667  std::vector<pcpp::IndexIntervalType> remoteHaloExtents;
668  std::vector<pcpp::IndexIntervalType> localHaloExtents;
669  std::vector<pcpp::IndexIntervalType> localHaloBufferExtents;
670  std::vector<pcpp::IndexIntervalType> remoteHaloBufferExtents;
671  std::vector<pcpp::IndexIntervalType> sendExtents;
672 
673  std::vector<pcpp::IndexIntervalType> threadExtents;
674  std::vector<pcpp::IndexIntervalType> threadBufferExtents;
675 
676  // For each send required, these indicate the index ranges
677  // and a flat array of indices into the state data
678  std::vector<pcpp::RemoteCollisionType> sendCollisions;
679  std::vector<std::vector<size_t> > sendIndices;
680  std::vector<std::vector<std::vector<size_t> > > threadSendIndices;
681  std::vector<std::vector<std::vector<size_t> > > threadSendBufferIndices;
682 
683  // These indicate the receive buffer intervals
684  std::vector<pcpp::RemoteCollisionType> recvCollisions;
685  std::vector<std::vector<size_t> > recvIndices;
686  std::vector<std::pair<int,std::vector<size_t> > > haloRecvIndices;
687  // receive intervals for threads
688  std::vector<std::vector<std::vector<size_t> > > threadRecvIndices;
689  std::vector<std::vector<std::vector<size_t> > > threadRecvBufferIndices;
690  std::vector<std::vector<std::vector<size_t> > > threadHaloBufferIndices;
691 
692 
693 
694 
695  // Communication buffers are densely stuffed and
696  // packed/unpacked with special functions
697  std::vector<messagebuffers> communicationBuffers;
698  std::vector<double *> sendBuffers;
699  std::vector<double *> recvBuffers;
700 
706  std::vector< std::vector<double *> > haloBuffers;
707 
708  };
709 
710  template<typename StateType>
711  void ConvertLegacyState(int numDim,size_t numPoints,StateType &inState)
712  {
713 
714  // convert density
715  int rhoIndex = inState.GetFieldIndex("rho");
716  if(rhoIndex >= 0){ // then rho already exists, just switch its buffer
717  double *legacyDataBuffer = inState.template GetFieldBuffer<double>("cv01");
718  inState.SetFieldBuffer("rho",legacyDataBuffer);
719  } else { // otherwise rename cv01 to rho
720  inState.RenameField("cv01","rho");
721  }
722 
723  // convert energy
724  std::ostringstream Ostr;
725  Ostr << "cv0" << numDim+2;
726  const std::string legacyRhoE(Ostr.str());
727  int rhoEIndex = inState.GetFieldIndex("rhoE");
728  if(rhoEIndex >= 0) { // rhoE already exists, buffer switch
729  double *legacyDataBuffer = inState.template GetFieldBuffer<double>(legacyRhoE);
730  inState.SetFieldBuffer("rhoE",legacyDataBuffer);
731  } else {
732  inState.RenameField(legacyRhoE,"rhoE");
733  }
734 
735  // convert momentum
736  int rhoVIndex = inState.GetFieldIndex("rhoV");
737  if(rhoVIndex < 0) {
738  inState.AddField("rhoV",'n',numDim,8,"momentum");
739  inState.Create();
740  }
741  double *targetData = inState.template GetFieldBuffer<double>("rhoV");
742  for(int iDim = 0;iDim < numDim;iDim++){
743  std::ostringstream Ostr2;
744  Ostr2 << "cv0" << iDim+2;
745  const std::string fieldName(Ostr2.str());
746  double *srcData = inState.template GetFieldBuffer<double>(Ostr2.str());
747  std::memcpy(&targetData[iDim*numPoints],srcData,sizeof(double)*numPoints);
748  }
749 
750  // convert auxVars
751  const std::string pc2Name("scalarVars");
752  int scalarIndex = inState.GetFieldIndex(pc2Name);
753 
754  int numComponents = 0;
755  const pcpp::field::metadataset &legacyMeta(inState.Meta());
756  pcpp::field::metadataset::const_iterator metaIt = legacyMeta.begin();
757  while(metaIt != legacyMeta.end()){
758  const pcpp::field::metadata &fieldMeta(*metaIt++);
759  const std::string &fieldName(fieldMeta.name);
760  std::string::size_type x = fieldName.find("aux");
761  if(x == 0){ // this is an aux var
762  numComponents++;
763  }
764  }
765  if(numComponents > 0){
766 
767  if(scalarIndex < 0){
768  inState.AddField(pc2Name,'n',numComponents,8,"massfraction");
769  inState.Create();
770  }
771 
772  targetData = inState.template GetFieldBuffer<double>(pc2Name);
773  for(int iComponent = 0;iComponent < numComponents;iComponent++){
774  std::ostringstream nameStr;
775  nameStr << "aux" << (iComponent < 9 ? "0" : "")
776  << iComponent+1;
777  const std::string legacyName(nameStr.str());
778  double *srcData = inState.template GetFieldBuffer<double>(legacyName);
779  size_t targetOffset = iComponent*numPoints;
780  std::memcpy(&targetData[targetOffset],srcData,sizeof(double)*numPoints);
781  }
782  }
783  };
784 
785  };
786 };
787 #endif
std::vector< pcpp::IndexIntervalType > localHaloBufferExtents
Definition: State.H:669
virtual int Process()
Definition: State.H:394
std::vector< std::pair< int, std::vector< size_t > > > haloRecvIndices
Definition: State.H:686
base operator-(const base &inBase)
Definition: State.H:103
void SetNumThreads(int numThreadsIn)
Definition: State.H:531
std::vector< pcpp::IndexIntervalType > threadExtents
Definition: State.H:673
std::vector< double * > & SendBuffers()
Definition: State.H:611
probe(pcpp::IndexIntervalType &inDataInterval, pcpp::IndexIntervalType &inProbeInterval)
Definition: State.H:385
std::vector< std::vector< double * > > & HaloBuffers()
Definition: State.H:609
std::vector< int > & PeriodicDirs()
Definition: State.H:633
std::vector< pcpp::IndexIntervalType > & RemoteHaloExtents()
Definition: State.H:625
std::vector< int > fieldIndices
Definition: State.H:400
pcpp::CommunicatorType CommunicatorType
Definition: State.H:14
std::vector< int > stateFieldIndices
total number of components in unsteady state
Definition: State.H:371
std::vector< std::vector< double * > > haloBuffers
stores the state variable values in the halo zones
Definition: State.H:706
int GetDataIndex(const std::string &name) const
void const size_t * numPoints
Definition: EulerKernels.H:10
std::vector< int > numFieldComponents
Definition: State.H:429
int SetStateFields(const std::vector< int > &inFieldIndices)
Definition: State.H:310
std::vector< pcpp::IndexIntervalType > remoteHaloBufferExtents
Definition: State.H:670
std::vector< messagebuffers > & CommunicationBuffers()
Definition: State.H:630
std::vector< int > periodicDirs
Definition: State.H:657
std::vector< pcpp::IndexIntervalType > & ThreadExtents()
Definition: State.H:621
bool SetFill(bool yesno)
Definition: State.H:444
base(const base &inBase)
Definition: State.H:25
std::vector< std::vector< size_t > > recvIndices
Definition: State.H:685
const std::vector< int > & StateFieldIndices() const
Definition: State.H:307
std::vector< size_t > numPointsSend
Definition: State.H:417
int SetStateFields(const std::vector< std::string > &inFieldNames)
Definition: State.H:329
void ConvertLegacyState(int numDim, size_t numPoints, StateType &inState)
Definition: State.H:711
double * GetStateFieldData(const std::string &fieldName)
Definition: State.H:289
virtual void CopyStateData(const base &inBase)
Definition: State.H:208
std::vector< pcpp::IndexIntervalType > sendExtents
Definition: State.H:671
size_t NumData() const
Definition: FieldData.C:3
pcpp::IndexIntervalType & PartitionExtent()
Definition: State.H:624
int ConfigureMeta(ConfigurationType &inConfig, pcpp::field::metadataset &inMeta, std::ostream &messageStream)
void SetGridInterval(const pcpp::IndexIntervalType &inExtent)
Definition: State.H:441
std::vector< double * > recvBuffers
Definition: State.H:699
size_t numPointsBuffer
Definition: State.H:654
void SetNeighbors(const std::vector< bool > &inNeighbors)
Definition: State.H:604
void SetPartitionInterval(const pcpp::IndexIntervalType &inExtent)
Definition: State.H:442
std::vector< double * > recvBuffers
Definition: State.H:420
std::vector< pcpp::RemoteCollisionType > sendCollisions
Definition: State.H:678
virtual void Copy(const base &inBase, const std::string &copyStates)
Definition: State.H:234
std::vector< pcpp::RemoteCollisionType > recvCollisions
Definition: State.H:684
const simulation::state::base * statePtr
Definition: State.H:398
std::vector< std::vector< size_t > > sendIndices
Definition: State.H:679
pcpp::ConfigType ConfigurationType
Definition: State.H:13
int SetStateFields(const std::string &inFieldNames)
Definition: State.H:350
std::vector< size_t > flatProbeIndices
Definition: State.H:403
void const size_t const size_t const size_t const double const double * x
std::vector< std::vector< std::vector< size_t > > > threadRecvIndices
Definition: State.H:688
size_t NNodes() const
Definition: IndexUtil.H:254
int NumStateFieldComponents(int stateFieldIndex)
Definition: State.H:263
void SetThreadExtent(int myThreadId, pcpp::IndexIntervalType threadInterval)
Definition: State.H:514
std::vector< bool > haveNeighbor
Definition: State.H:666
void SetLocalPartitionExtent(const pcpp::IndexIntervalType &inExtent)
Definition: State.H:456
std::vector< std::vector< std::vector< size_t > > > threadSendBufferIndices
Definition: State.H:681
metadataset & Meta()
const std::vector< std::vector< size_t > > & RecvIndices() const
Definition: State.H:632
base operator+(const base &inBase)
Definition: State.H:95
pcpp::IndexIntervalType probeInterval
Definition: State.H:402
virtual void Report(std::ostream &outStream)
Definition: State.H:145
std::vector< double * > sendBuffers
Definition: State.H:698
std::vector< std::vector< std::vector< size_t > > > threadHaloBufferIndices
Definition: State.H:690
std::vector< std::string > GetStateFieldNames()
Definition: State.H:274
probe(pcpp::IndexIntervalType &inInterval)
Definition: State.H:383
pcpp::IndexIntervalType dataInterval
Definition: State.H:401
std::vector< pcpp::IndexIntervalType > localHaloExtents
Definition: State.H:668
void SetLocalHaloExtents(const std::vector< pcpp::IndexIntervalType > haloExtents)
Definition: State.H:545
std::vector< std::string > probeFields
Definition: State.H:399
void Copy(const sizeextent &inExtent)
Definition: IndexUtil.H:228
std::vector< size_t > numPointsRecv
Definition: State.H:418
Main encapsulation of MPI.
Definition: COMM.H:62
void SetLocalBufferSizes(const std::vector< size_t > &inBufferSizes)
Definition: State.H:447
pcpp::IndexIntervalType globalPartitionExtent
Definition: State.H:662
base & operator-=(const base &inBase)
Definition: State.H:67
size_t NumMeta() const
int ConfigureState(ConfigurationType &inConfig, std::ostream &messageStream)
Configures state data.
Definition: State.C:17
std::vector< int > & StateFieldIndices()
Definition: State.H:622
std::vector< pcpp::RemoteCollisionType > & SendCollisions()
Definition: State.H:615
base & operator*=(double inScalar)
Definition: State.H:111
std::vector< double * > & RecvBuffers()
Definition: State.H:607
int GetStateFieldIndex(const std::string &fieldName)
Definition: State.H:298
void SetRemoteHaloExtents(const std::vector< pcpp::IndexIntervalType > haloExtents)
Definition: State.H:485
base & operator+=(const base &inBase)
Definition: State.H:47
std::vector< std::vector< std::vector< size_t > > > threadSendIndices
Definition: State.H:680
std::string pointDelimiter
Definition: State.H:404
std::vector< size_t > localBufferSizes
Definition: State.H:664
std::vector< std::vector< std::vector< size_t > > > threadRecvBufferIndices
Definition: State.H:689
std::vector< pcpp::IndexIntervalType > remoteHaloExtents
Definition: State.H:667
halo(const pcpp::IndexIntervalType &inGlobalExtent, const pcpp::IndexIntervalType &inPartitionExtent)
Definition: State.H:435
int Alias(const std::string &sourceField, const std::string &fieldAlias)
Definition: State.H:250
std::vector< messagebuffers > communicationBuffers
Definition: State.H:697
double * GetStateFieldData(int stateFieldIndex)
Definition: State.H:283
std::vector< double * > sendBuffers
Definition: State.H:419
std::vector< pcpp::IndexIntervalType > threadBufferExtents
Definition: State.H:674
std::vector< pcpp::RemoteCollisionType > & RecvCollisions()
Definition: State.H:617
double * HaloBuffer(int fieldIndex, int directionIndex)
Definition: State.H:619
pcpp::IndexIntervalType localPartitionExtent
Definition: State.H:663
MetaDataSetType meta
std::vector< std::pair< int, std::vector< size_t > > > & HaloRecvIndices()
Definition: State.H:613
const std::vector< std::vector< size_t > > & SendIndices() const
Definition: State.H:631
const std::vector< pcpp::IndexIntervalType > & LocalHaloBufferExtents() const
Definition: State.H:628
DataContainerType data
int GetFieldIndex(const std::string &name) const
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
std::vector< int > stateFieldIndices
Definition: State.H:428
pcpp::IndexIntervalType globalGridExtent
Definition: State.H:661
std::string ReportMeta()
Definition: State.H:362
void size_t int * numComponents
virtual void Destroy()
Definition: State.H:240
virtual void Copy(const base &inBase)
Definition: State.H:223
base & operator=(const base &inState)
Definition: State.H:133
base operator*(double inScalar)
Definition: State.H:125
void ReportBufferStats(std::ostream &outStream, size_t numValues, const BufferDataType *dataBuffer)
Definition: PCPPUtil.H:55
void const size_t * numPointsBuffer
Definition: MetricKernels.H:19
pcpp::IndexIntervalType & GlobalExtent()
Definition: State.H:623
const std::vector< pcpp::IndexIntervalType > & RemoteHaloBufferExtents() const
Definition: State.H:627
std::vector< pcpp::IndexIntervalType > & LocalHaloExtents()
Definition: State.H:626
virtual void Destroy()
virtual void Destroy(const std::string &fieldName)
Definition: State.H:141
virtual void Copy(const dataset &inData)