PlasCom2  1.0
XPACC Multi-physics simluation application
Grid.H
Go to the documentation of this file.
1 #ifndef __GRID_H__
2 #define __GRID_H__
3 
4 #include "PCPPUtil.H"
5 #include "PCPPCommUtil.H"
6 #include "Stencil.H"
7 
8 #ifdef USE_OMP
9 #include <omp.h>
10 #endif
11 
12 using namespace pcpp::util;
13 using namespace fixtures;
14 
15 namespace simulation{
16  namespace grid {
17 
29  static const int NUMGRIDTYPES = NUMTOPOTYPE;
30  static const char *topoNames[] = {"Cartesian","Uniform-rectangular","Rectilinear","Curvilinear","Unknown"};
31  int ResolveTopoName(const std::string &inName);
32  std::string ResolveTopoType(int inType);
33 
34 
35 
36  struct subregion {
37  std::string regionName;
42  std::vector<size_t> partitionBufferIndices;
43  // Threading support
44  std::vector<pcpp::IndexIntervalType> threadPartitionIntervals;
45  std::vector<pcpp::IndexIntervalType> threadPartitionBufferIntervals;
46  std::vector<std::vector<size_t> > threadPartitionBufferIndices;
47  };
48 
49 
50  int InitSubRegionFromString(const std::string &inString,const std::vector<size_t> &gridSizes,
51  subregion &inSubRegion);
52 
54  const pcpp::IndexIntervalType &partitionBufferInterval,
55  const pcpp::IndexIntervalType &partitionSubInterval);
56 
57  class halo {
58 
59  public:
60 
61  struct messagebuffers {
64  std::vector<size_t> numPointsSend;
65  std::vector<size_t> numPointsRecv;
66  std::vector<double *> sendBuffers;
67  std::vector<double *> recvBuffers;
68  std::vector<int *> sendFlagBuffers;
69  std::vector<int *> recvFlagBuffers;
70  };
71 
72  public:
73 
74  halo() : doFill(false), numThreads(1) {};
75 
76  halo(const pcpp::IndexIntervalType &inGlobalExtent,
77  const pcpp::IndexIntervalType &inPartitionExtent) :
78  doFill(false), globalGridExtent(inGlobalExtent),
79  globalPartitionExtent(inPartitionExtent), numThreads(1)
80  {};
81 
82  void SetGridInterval(const pcpp::IndexIntervalType &inExtent) { globalGridExtent = inExtent; };
83  void SetPartitionInterval(const pcpp::IndexIntervalType &inExtent) { globalPartitionExtent = inExtent; };
84 
85  bool SetFill(bool yesno){ doFill = yesno; return(doFill); };
86  bool Fill() {return(doFill); };
87 
88  void SetLocalBufferSizes(const std::vector<size_t> &inBufferSizes);
89 
90  void SetLocalPartitionExtent(const pcpp::IndexIntervalType &inExtent){ localPartitionExtent = inExtent; };
91 
92  std::vector<pcpp::IndexIntervalType> CreateRemoteHaloExtents(const pcpp::IndexIntervalType &globalExtent,
93  const pcpp::IndexIntervalType &partitionExtent,
94  std::vector<size_t> &haloSizes);
95  std::vector<pcpp::IndexIntervalType> CreateRemoteHaloExtents(std::vector<size_t> &haloSizes);
96 
97  std::vector<pcpp::IndexIntervalType> CreateLocalHaloExtents(const pcpp::IndexIntervalType &globalExtent,
98  const pcpp::IndexIntervalType &partitionExtent,
99  std::vector<size_t> &haloSizes);
100  std::vector<pcpp::IndexIntervalType> CreateLocalHaloExtents(std::vector<size_t> &haloSizes);
101 
102  int CreateSimpleSendIndices();
103  int CreateSimpleRecvIndices();
104 
105 
106  // -------- Threaded interface --------------
107  int CreateThreadSendIndices(int threadId);
108  int CreateThreadRecvIndices(int threadId);
109  int UnpackSimpleRecvBuffers(int threadId);
110  // int PackSimpleSendBuffers(const state::base &inX, int threadId);
111  void SetRemoteHaloExtents(const std::vector<pcpp::IndexIntervalType> haloExtents);
112  void SetThreadExtent(int myThreadId,pcpp::IndexIntervalType threadInterval);
113  void SetNumThreads(int numThreadsIn);
114  int NumThreads() { return (numThreads); };
115  // ----------------------------------------
116 
117  void SetLocalHaloExtents(const std::vector<pcpp::IndexIntervalType> haloExtents);
118  int DestroyMessageBuffer(int messageId);
119  int CreateMessageBuffers(int numComponents,int componentSize=8);
120  int PackMessageBuffers(const int messageId,const int componentId,
121  const int numComponents,const double *sourceBuffer);
122  int PackMessageBuffers(const int messageId,const int componentId,
123  const int numComponents,const int *sourceBuffer);
124  int PackMessageBuffers(const int messageId,const int componentId,
125  const int numComponents,const double *sourceBuffer,
126  const int threadId);
127  int PackMessageBuffers(const int messageId,const int componentId,
128  const int numComponents,const int *sourceBuffer,
129  const int threadId);
130  int SendMessage(const int messageId,const std::vector<int> &neighborRanks,
132  int ReceiveMessage(const int messageId,const std::vector<int> &neighborRanks,
134  int UnPackMessageBuffers(const int messageId,const int componentId,
135  const int numComponents,double *targetBuffer);
136  int UnPackMessageBuffers(const int messageId,const int componentId,
137  const int numComponents,double *targetBuffer,
138  const int threadId);
139  int UnPackMessageBuffers(const int messageId,const int componentId,
140  const int numComponents,int *targetBuffer);
141  int UnPackMessageBuffers(const int messageId,const int componentId,
142  const int numComponents,int *targetBuffer,
143  const int threadId);
144 
145  void SetNeighbors(const std::vector<bool> &inNeighbors){
146  haveNeighbor = inNeighbors;
147  };
148 
149 
150  inline pcpp::IndexIntervalType &GlobalExtent() { return(globalGridExtent); };
151  inline pcpp::IndexIntervalType &PartitionExtent() { return (globalPartitionExtent); };
152  inline std::vector<pcpp::IndexIntervalType> &RemoteHaloExtents() { return(remoteHaloExtents); };
153  inline std::vector<pcpp::IndexIntervalType> &LocalHaloExtents() { return(localHaloExtents); };
154  const std::vector<pcpp::IndexIntervalType> &RemoteHaloBufferExtents() const { return(remoteHaloBufferExtents); };
155  const std::vector<pcpp::IndexIntervalType> &LocalHaloBufferExtents() const { return(localHaloBufferExtents); };
156 
157  std::vector<messagebuffers> &CommunicationBuffers() { return(communicationBuffers); };
158  const std::vector<std::vector<size_t> > &SendIndices() const {return(sendIndices);};
159  const std::vector<std::vector<size_t> > &RecvIndices() const {return(recvIndices);};
160  inline std::vector<int> &PeriodicDirs() { return(periodicDirs); };
161  void SetPeriodicDirs(const std::vector<int> &inPeriodic)
162  { periodicDirs = inPeriodic; };
163  void ReportSimpleBufferContents(std::ostream &outStream);
164 
165  void DestroyAll();
166 
167  ~halo(){
168  DestroyAll();
169  }
170 
171  protected:
172 
175  bool doFill;
178 
179  std::vector<int> periodicDirs;
180 
181  // These are the extents of the partition and
182  // halos, resp.
186  std::vector<size_t> localBufferSizes;
187 
188  std::vector<bool> haveNeighbor;
189  std::vector<pcpp::IndexIntervalType> remoteHaloExtents;
190  std::vector<pcpp::IndexIntervalType> localHaloExtents;
191  std::vector<pcpp::IndexIntervalType> localHaloBufferExtents;
192  std::vector<pcpp::IndexIntervalType> remoteHaloBufferExtents;
193  std::vector<pcpp::IndexIntervalType> sendExtents;
194 
195  std::vector<pcpp::IndexIntervalType> threadExtents;
196  std::vector<pcpp::IndexIntervalType> threadBufferExtents;
197 
198  // For each send required, these indicate the index ranges
199  // and a flat array of indices into the state data
200  std::vector<pcpp::RemoteCollisionType> sendCollisions;
201  std::vector<std::vector<size_t> > sendIndices;
202  std::vector<std::vector<std::vector<size_t> > > threadSendIndices;
203  std::vector<std::vector<std::vector<size_t> > > threadSendBufferIndices;
204 
205  // These indicate the receive buffer intervals
206  std::vector<pcpp::RemoteCollisionType> recvCollisions;
207  std::vector<std::vector<size_t> > recvIndices;
208  std::vector<std::pair<int,std::vector<size_t> > > haloRecvIndices;
209  // receive intervals for threads
210  std::vector<std::vector<std::vector<size_t> > > threadRecvIndices;
211  std::vector<std::vector<std::vector<size_t> > > threadRecvBufferIndices;
212  std::vector<std::vector<std::vector<size_t> > > threadHaloBufferIndices;
213 
214 
215 
216 
217  // Communication buffers are densely stuffed and
218  // packed/unpacked with special functions
219  std::vector<messagebuffers> communicationBuffers;
220 
221  };
222 
223 
224  struct partition_info {
227  };
228 
229  struct patch_info {
230  std::string Name;
233  };
234 
235 
236  struct intervalset
237  {
240  std::vector<pcpp::IndexIntervalType> threadBufferIntervals;
241  std::vector<pcpp::IndexIntervalType> threadOpIntervals;
242  };
243 
244  class base {
245 
246  protected:
248  size_t numPoints;
249  int numDim;
250 
251  public:
252  virtual int ConfigureGrid(fixtures::ConfigurationType &inConfig,std::ostream &messageStream)
253  {
254  /*
255  advect1d:Dimension = 3
256  advect1d:GridType = UniRect
257  advect1d:PhysicalDomain = 0 1 0 1 0 1 # Cube domain [0,1]^3
258  advect1d:NumPoints = 24000000 3 3 # vertices in each dir
259  advect1d:GenerateGrid = Yes # do grid generation
260 
261  */
262 
263  std::string configName(inConfig.GetValue("ConfigName"));
265  std::ostringstream paramNameOut;
266  paramNameOut << "Dimension " << "GridType "
267  << "PhysicalExtent " << "NumPoints "
268  << "GenerateGrid " << "PhysicalDomain "
269  << "DecompDirs " << "ThreadDecompDirs";
270  std::string configParamNames(paramNameOut.str());
271  std::istringstream paramNameIn(configParamNames);
272  std::string paramName;
273  while(paramNameIn >> paramName){
274  std::string configKey(ConfigKey(configName,paramName));
275  if(inConfig.IsSet(configKey)){
276  gridParam.first = paramName;
277  gridParam.second = inConfig.GetValue(configKey);
278  gridConfig.push_back(gridParam);
279  }
280  }
281  return(0);
282  };
283 
284  virtual int Configure(fixtures::ConfigurationType &inConfig)
285  {
286  /*
287  advect1d:Dimension = 3
288  advect1d:GridType = UniRect
289  advect1d:PhysicalDomain = 0 1 0 1 0 1 # Cube domain [0,1]^3
290  advect1d:NumPoints = 24000000 3 3 # vertices in each dir
291  advect1d:GenerateGrid = Yes # do grid generation
292 
293  */
294 
295  std::string configName(inConfig.GetValue("ConfigName"));
297  std::ostringstream paramNameOut;
298  paramNameOut << "Dimension " << "GridType "
299  << "PhysicalDomain " << "NumPoints "
300  << "GenerateGrid";
301  std::string configParamNames(paramNameOut.str());
302  std::istringstream paramNameIn(configParamNames);
303  std::string paramName;
304  while(paramNameIn >> paramName){
305  std::string configKey(ConfigKey(configName,paramName));
306  if(inConfig.IsSet(configKey)){
307  gridParam.first = paramName;
308  gridParam.second = inConfig.GetValue(configKey);
309  gridConfig.push_back(gridParam);
310  }
311  }
312  return(0);
313  };
314 
315  virtual std::string ReportConfiguration()
316  {
317  std::ostringstream Ostr;
318  Ostr << gridConfig << std::endl;
319  return(Ostr.str());
320  };
321  int NumDim() const { return(numDim); };
322  size_t NumPoints() const { return(numPoints); };
323  int Dimension() const { return(numDim); };
324  };
325 
326  class parallel_base : public base {
327 
328  public:
329 
330  // using base::ConfigureGrid;
331 
332  virtual int ConfigureGrid(fixtures::ConfigurationType &inConfig,std::ostream &messageStream) {
333  // gridCommunicator.Initialize(inCommunicator);
334  return(base::ConfigureGrid(inConfig,messageStream));
335  };
336  virtual int Configure(fixtures::ConfigurationType &inConfig){
337  // gridCommunicator.Initialize(inCommunicator);
338  return(base::Configure(inConfig));
339  };
340 
341  virtual std::string ReportConfiguration()
342  {
343  // std::ostringstream Ostr;
344  // Ostr << base::ReportConfiguration()
345  // << "grid::parallel_base: ReportConfig" << std::endl;
346  // return(Ostr.str());
347  return(base::ReportConfiguration());
348  };
349 
351  { return(const_cast<fixtures::CommunicatorType &>(gridCommunicator)); };
352 
353  size_t NumGlobalPoints() { return(numGlobalPoints); };
354  size_t NumLocalPoints() { return(numLocalPoints); };
355  protected:
356  fixtures::CommunicatorType gridCommunicator;
359  };
360 
361 
362  struct pbsintervals {
363  pbsintervals() : numDim(0) {};
364  int numDim;
366  std::vector<size_t> gridSizes;
368  std::vector<size_t> bufferSizes;
370  std::vector<size_t> partitionSizes;
375  //#ifdef USE_OMP
377  std::vector<pcpp::IndexIntervalType> threadBufferIntervals;
379  std::vector<pcpp::IndexIntervalType> threadPartitionBufferIntervals;
381  std::vector<pcpp::IndexIntervalType> threadPartitionIntervals;
383  std::vector<int> decompSizes;
384  //#endif
385  };
386 
388  {
389 
390  public:
391 
392  typedef halo HaloType;
393 
394  public:
395 
396  int SetupThreads(std::vector<int> &numThreadPartitions);
397 
398  parallel_blockstructured() : parallel_base(), haloPtr(&gridHalo),
399  stencilSet(NULL), stencilConnectivity(NULL),
400  xyzMessageId(-1), metricMessageId(-1),
402  {};
403 
404 
405  int NumberOfThreads() const
406  { return(partitionIntervals.threadPartitionBufferIntervals.size()); };
407 
408  void SetNumThreads(int numThreads);
409 
410  std::vector<pcpp::IndexIntervalType> &ThreadPartitionIntervals()
411  { return(partitionIntervals.threadPartitionIntervals); };
412 
413  const std::vector<pcpp::IndexIntervalType> &ThreadPartitionIntervals() const
414  { return(partitionIntervals.threadPartitionIntervals); };
415 
416  std::vector<pcpp::IndexIntervalType> &ThreadPartitionBufferIntervals()
417  { return(partitionIntervals.threadPartitionBufferIntervals); };
418 
419  const std::vector<pcpp::IndexIntervalType> &ThreadPartitionBufferIntervals() const
420  { return(partitionIntervals.threadPartitionBufferIntervals); };
421 
422  std::vector<pcpp::IndexIntervalType> &ThreadBufferIntervals()
423  { return(partitionIntervals.threadBufferIntervals); };
424 
425  const std::vector<pcpp::IndexIntervalType> &ThreadBufferIntervals() const
426  { return(partitionIntervals.threadBufferIntervals); };
427 
428  int Dimension() const { return (partitionIntervals.numDim); };
429 
430  size_t BufferSize() const { return(numPointsBuffer); };
431 
432  size_t PartitionSize() const { return(numPointsPartition); };
433 
434  pbsintervals &Intervals(){ return(partitionIntervals); };
435  const pbsintervals &Intervals() const { return(partitionIntervals); };
436 
437  void SetDecompSizes(const std::vector<int> &inDecomp)
438  {
439  partitionIntervals.decompSizes = inDecomp;
440  };
441 
442  const std::vector<int> &DecompSizes() const
443  {
444  return(partitionIntervals.decompSizes);
445  };
446 
447  std::vector<int> &DecompSizes()
448  {
449  return(partitionIntervals.decompSizes);
450  };
451 
452  void SetGridSizes(const std::vector<size_t> &inSize)
453  {
454  partitionIntervals.gridSizes = inSize;
455  partitionIntervals.numDim = inSize.size();
456  numDim = partitionIntervals.numDim;
457  };
458 
459  const std::vector<size_t> &BufferSizes() const
460  {
461  return(partitionIntervals.bufferSizes);
462  };
463 
464  std::vector<size_t> &BufferSizes()
465  {
466  return(partitionIntervals.bufferSizes);
467  };
468 
469  const std::vector<size_t> &GridSizes() const
470  {
471  return(partitionIntervals.gridSizes);
472  };
473 
474  std::vector<size_t> &GridSizes()
475  {
476  return(partitionIntervals.gridSizes);
477  };
478 
479 
480  void SetPartitionSizes(const std::vector<size_t> &inPartSize)
481  {
482  partitionIntervals.partitionSizes = inPartSize;
483  numDim = inPartSize.size();
484  partitionIntervals.numDim = numDim;
485  };
486 
487  const std::vector<size_t> &PartitionSizes() const
488  {
489  return(partitionIntervals.partitionSizes);
490  };
491 
492  void SetDimensionExtensions(const std::vector<size_t> &inExtensions)
493  {
494  dimExtensions = inExtensions;
495  };
496 
498  { partitionIntervals.partitionInterval = inInterval; };
499 
500  pcpp::IndexIntervalType &PartitionInterval(){ return(partitionIntervals.partitionInterval); };
501  const pcpp::IndexIntervalType &PartitionInterval() const { return(partitionIntervals.partitionInterval); };
502 
503  std::vector<double> &CoordinateData(){ return(gridCoordinates); };
504  const std::vector<double> &CoordinateData() const { return(gridCoordinates); };
505 
506  const double *CoordinateData(int inDim) const
507  {
508  assert(inDim < numDim);
509  return(&gridCoordinates[inDim*numPointsBuffer]);
510  };
511  double *CoordinateData(int inDim)
512  {
513  assert(inDim < numDim);
514  return(&gridCoordinates[inDim*numPointsBuffer]);
515  };
516 
517  int ExchangeCoordinates();
518 
519  pcpp::IndexIntervalType &PartitionBufferInterval(){ return(partitionIntervals.partitionBufferInterval); };
520  const pcpp::IndexIntervalType &PartitionBufferInterval() const { return(partitionIntervals.partitionBufferInterval); };
521 
522  int Finalize(bool allocateCoordinateData = false);
523 
525  {
526  size_t numAllocate = numPointsBuffer*numDim;
527  if(numAllocate > 0){
528  if(gridCoordinates.size() != numAllocate)
529  gridCoordinates.resize(numAllocate);
530  }
531  };
532 
533  const std::vector<double> &PhysicalExtent() const {return (physicalExtent); };
534  std::vector<double> &PhysicalExtent() {return (physicalExtent); };
535  void SetPhysicalExtent(const std::vector<double> &inExtent){
536  physicalExtent = inExtent;
537  };
538  const std::vector<double> &DX() const {return(dX);};
539  std::vector<double> &DX() {return(dX);};
540  void SetGridSpacings(const std::vector<double> &inSpacing){
541  dX = inSpacing;
542  };
543  void SetHalo(halo &inHalo) { haloPtr = &inHalo;}
544  HaloType &Halo() { return(*haloPtr); };
545  int GenerateCoordinates(std::ostream &);
546  int GenerateCoordinates(int (*)(const std::vector<size_t> &,std::vector<double> &),
547  std::ostream &);
548  int GenerateGrid(int (*)(const std::vector<int> &,
549  const std::vector<double> &,
550  const std::vector<size_t> &,
551  const std::vector<size_t> &,
552  std::vector<double> &),
553  std::ostream &);
554 
555  const std::vector<subregion> &SubRegions() const
556  { return(subRegions); };
557 
558  std::vector<subregion> &SubRegions()
559  { return(subRegions); };
560 
561  int GetRegionIndex(const std::string &regionName) const {
562  int regionIndex = 0;
563  std::vector<subregion>::const_iterator regIt = subRegions.begin();
564  while(regIt != subRegions.end()){
565  if(regIt++->regionName == regionName)
566  return(regionIndex);
567  regionIndex++;
568  }
569  return(-1);
570  };
571 
572  // Dumb interface - deprecated
573  // pcpp::IndexIntervalType &LocalPartitionInterval(){ return(localPartInterval); };
574  // const pcpp::IndexIntervalType &LocalPartitionInterval() const { return(localPartInterval); };
575 
576  std::vector<bool> &PeriodicDirs()
577  { return(periodicDirs); };
578  const std::vector<bool> &PeriodicDirs() const
579  { return(periodicDirs); };
580  std::vector<int> &DecompDirs()
581  { return(decompDirs); };
582  const std::vector<int> &DecompDirs() const
583  { return(decompDirs); };
584  void SetDecompDirs(const std::vector<int> &inDecomp)
585  { decompDirs = inDecomp; };
586  void SetPeriodicDirs(const std::vector<bool> &inPeriodic)
587  { periodicDirs = inPeriodic; };
588  void SetPeriodicLengths(const std::vector<double> &inLengths)
589  { periodicLengths = inLengths; };
590  std::vector<int> &ThreadDecompDirs()
591  { return(threadDecompDirs); };
592  const std::vector<int> &ThreadDecompDirs() const
593  { return(threadDecompDirs); };
594  void SetThreadDecompDirs(const std::vector<int> &inThread)
595  { threadDecompDirs = inThread; };
596  void SetType(int inType)
597  {
598  gridType = inType;
599  };
600  int Type() const
601  { return(gridType); };
602  void SetScaleFactor(const std::vector<double> &inScale)
603  { scaleFactor = inScale; };
604  int ParallelSetup(fixtures::CommunicatorType &inComm,pcpp::ParallelTopologyInfoType &cartInfo,
605  int haloDepth,std::ostream &messageStream);
606 
607  std::vector<int> &FlagData()
608  {
609  size_t numFlags = BufferSize();
610  if(flagData.size() != numFlags)
611  flagData.resize(numFlags,0);
612  return(flagData);
613  };
614 
615  const std::vector<int> &FlagData() const
616  {
617  return(flagData);
618  };
619 
620  void DestroyFlags() { std::vector<int>().swap(flagData); };
621  size_t FlagMask(int *iMask,int flagValue = 0,int flagBit = 1) const;
622  std::vector<double> &Metric() { return(gridMetric); };
623  std::vector<double> Metric() const { return(gridMetric); };
624  std::vector<double> &Jacobian() {return(gridJacobian); };
625  std::vector<double> Jacobian() const { return(gridJacobian); };
626  std::vector<double> &JacobianMatrix() { return(jacobianMatrix); };
627  std::vector<double> JacobianMatrix() const { return(jacobianMatrix); };
628 
629  int ComputeUniformRectangularMetrics(std::ostream &messageStream);
630  int ComputeRectilinearMetrics(std::ostream &messageStream);
631  int ComputeCurvilinearMetrics2D(std::ostream &messageStream);
632  int ComputeCurvilinearMetrics3D(std::ostream &messageStream);
633  int CurvilinearMetrics(std::ostream &messageStream);
634  int ComputeMetrics(std::ostream &messageStream);
635  int ComputeMetricIdentities(std::vector<double> &identityData,std::ostream &messageStream);
636  int SetupDifferentialOperator(plascom2::operators::stencilset *inStencilSet,int *inStencilConnectivity);
637  int ExchangeNodalData(int numComponents,double *dataBuffer);
638  int ExchangeJacobianMatrix(std::ostream &messageStream);
639  int GradIJK(int numComponents,double *sourceBuffer,
640  double *targetBuffer,std::ostream &messageStream,bool exchange);
641  int ComputeJacobianMatrix(std::ostream &messageStream);
642  int ComputeJacobianMatrix2(std::ostream &messageStream);
643  std::vector<double> &GridGenerationParameters()
644  { return(gridGenParams); };
645  const std::vector<double> &GridGenerationParameters() const
646  { return(gridGenParams); };
647  void SetGridGenerationParameters(const std::vector<double> &inParams)
648  { gridGenParams = inParams; };
649  std::vector<int> &GridGenerationOptions()
650  { return(gridGenOptions); };
651  const std::vector<int> &GridGenerationOptions() const
652  { return(gridGenOptions); };
653  void SetGridGenerationOptions(const std::vector<int> &inOptions)
654  { gridGenOptions = inOptions; };
655 
656  protected:
657 
659  int gridType;
667  std::vector<size_t> dimExtensions;
671  std::vector<double> gridCoordinates;
675  std::vector<double> gridMetric;
676  std::vector<double> gridJacobian;
677  std::vector<double> jacobianMatrix;
678  std::vector<double> jacobianMatrix2;
679  std::vector<double> gridGenParams;
680  std::vector<int> gridGenOptions;
681  std::vector<int> flagData;
682 
684  std::vector<double> physicalExtent;
686  std::vector<double> dX;
688  std::vector<double> scaleFactor;
692 
696  std::vector<bool> periodicDirs;
697  std::vector<double> periodicLengths;
698  std::vector<int> decompDirs;
699  std::vector<int> threadDecompDirs;
702 
704  std::vector<subregion> subRegions;
705 
707 
708  };
709 
710 
711 
712  class unstructured : public base
713  {
714  };
715 
716  template<typename GridType>
717  std::vector<double> GenerateUniformGrid(GridType &inGrid,const std::vector<double> &physicalExtent)
718  {
719  int numDim = inGrid.Dimension();
720  const std::vector<size_t> &gridSizes(inGrid.GridSizes());
721  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
722  pcpp::IndexIntervalType &partInterval(inGrid.PartitionInterval());
723  pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
724  std::vector<double> dX(numDim,0.0);
725  size_t numPointsBuffer = inGrid.BufferSize();
726  for(int iDim = 0;iDim < numDim;iDim++)
727  dX[iDim] = (physicalExtent[2*iDim+1] - physicalExtent[2*iDim])/static_cast<double>(gridSizes[iDim]-1);
728  inGrid.AllocateCoordinateData();
729  std::vector<double> &gridCoordinates(inGrid.CoordinateData());
730 
731  if(numDim == 3){
732 
733  size_t bufferPlane = bufferSizes[0]*bufferSizes[1];
734  size_t bufferLine = bufferSizes[0];
735 
736  size_t xStart = partInterval[0].first;
737  size_t xEnd = partInterval[0].second;
738  size_t yStart = partInterval[1].first;
739  size_t yEnd = partInterval[1].second;
740  size_t zStart = partInterval[2].first;
741  size_t zEnd = partInterval[2].second;
742 
743  size_t iStart = partitionBufferInterval[0].first;
744  size_t iEnd = partitionBufferInterval[0].second;
745  size_t jStart = partitionBufferInterval[1].first;
746  size_t jEnd = partitionBufferInterval[1].second;
747  size_t kStart = partitionBufferInterval[2].first;
748  size_t kEnd = partitionBufferInterval[2].second;
749 
750  size_t kIndex = kStart;
751  size_t zIndex = zStart;
752 
753  for(kIndex = kStart,zIndex = zStart;kIndex <= kEnd;kIndex++,zIndex++){
754  size_t jIndex = jStart;
755  size_t yIndex = yStart;
756  size_t bzIndex = kIndex * (bufferPlane);
757  double zCoordinate = zIndex*dX[2] + physicalExtent[4];
758  for(jIndex = jStart,yIndex = yStart;jIndex <= jEnd;jIndex++,yIndex++){
759  size_t iIndex = iStart;
760  size_t xIndex = xStart;
761  size_t byzIndex = bzIndex + jIndex*bufferLine;
762  double yCoordinate = yIndex*dX[1] + physicalExtent[2];
763  for(iIndex = iStart,xIndex = xStart;iIndex <= iEnd;iIndex++,xIndex++){
764  size_t bufferIndex = byzIndex + iIndex;
765  double xCoordinate = xIndex*dX[0] + physicalExtent[0];
766  gridCoordinates[bufferIndex] = xCoordinate;
767  gridCoordinates[bufferIndex+numPointsBuffer] = yCoordinate;
768  gridCoordinates[bufferIndex+2*numPointsBuffer] = zCoordinate;
769  }
770  }
771  }
772  } else if (numDim == 2) {
773 
774  size_t bufferLine = bufferSizes[0];
775 
776  size_t xStart = partInterval[0].first;
777  size_t xEnd = partInterval[0].second;
778  size_t yStart = partInterval[1].first;
779  size_t yEnd = partInterval[1].second;
780 
781  size_t iStart = partitionBufferInterval[0].first;
782  size_t iEnd = partitionBufferInterval[0].second;
783  size_t jStart = partitionBufferInterval[1].first;
784  size_t jEnd = partitionBufferInterval[1].second;
785 
786  size_t jIndex = jStart;
787  size_t yIndex = yStart;
788  for(jIndex = jStart,yIndex = yStart;jIndex <= jEnd;jIndex++,yIndex++){
789  size_t iIndex = iStart;
790  size_t xIndex = xStart;
791  size_t byIndex = jIndex*bufferLine;
792  double yCoordinate = yIndex*dX[1] + physicalExtent[2];
793  for(iIndex = iStart,xIndex = xStart;iIndex <= iEnd;iIndex++,xIndex++){
794  size_t bufferIndex = byIndex + iIndex;
795  double xCoordinate = xIndex*dX[0] + physicalExtent[0];
796  gridCoordinates[bufferIndex] = xCoordinate;
797  gridCoordinates[bufferIndex+numPointsBuffer] = yCoordinate;
798  }
799  }
800  } else if (numDim == 1) {
801 
802 
803  size_t xStart = partInterval[0].first;
804  size_t xEnd = partInterval[0].second;
805 
806  size_t iStart = partitionBufferInterval[0].first;
807  size_t iEnd = partitionBufferInterval[0].second;
808 
809  size_t iIndex = iStart;
810  size_t xIndex = xStart;
811  for(iIndex = iStart,xIndex = xStart;iIndex <= iEnd;iIndex++,xIndex++){
812  gridCoordinates[iIndex] = xIndex*dX[0] + physicalExtent[0];
813  }
814  }
815  return(dX);
816  }
817 
818  };
819 };
820 #endif
std::vector< double > Jacobian() const
Definition: Grid.H:625
std::vector< int * > recvFlagBuffers
Definition: Grid.H:69
int NumDim() const
Definition: Grid.H:321
void const size_t const size_t const size_t const int const int const double * gridMetric
Definition: EulerKernels.H:10
pcpp::IndexIntervalType partitionBufferInterval
Partition interval wrt the local buffer dimensions.
Definition: Grid.H:374
virtual std::string ReportConfiguration()
Definition: Grid.H:341
std::vector< std::vector< std::vector< size_t > > > threadHaloBufferIndices
Definition: Grid.H:212
void SetPartitionInterval(const pcpp::IndexIntervalType &inInterval)
Definition: Grid.H:497
fixtures::ConfigurationType gridConfig
Definition: Grid.H:247
void SetPartitionSizes(const std::vector< size_t > &inPartSize)
Definition: Grid.H:480
std::vector< double > & Jacobian()
Definition: Grid.H:624
std::vector< double > gridJacobian
Definition: Grid.H:676
void SetPeriodicDirs(const std::vector< bool > &inPeriodic)
Definition: Grid.H:586
void SetPartitionInterval(const pcpp::IndexIntervalType &inExtent)
Definition: Grid.H:83
const std::vector< pcpp::IndexIntervalType > & LocalHaloBufferExtents() const
Definition: Grid.H:155
pcpp::IndexIntervalType partitionInterval
Partition interval wrt the grid dimensions.
Definition: Grid.H:372
const pbsintervals & Intervals() const
Definition: Grid.H:435
std::vector< size_t > partitionSizes
Number of points in each dimension for local partition.
Definition: Grid.H:370
int GenerateGrid(GridType &inGrid, const std::string &gridName, const fixtures::ConfigurationType &inConfig, std::ostream &messageStream)
pcpp::IndexIntervalType regionInterval
Definition: Grid.H:39
pcpp::IndexIntervalType globalInterval
Definition: Grid.H:225
const pcpp::IndexIntervalType & PartitionBufferInterval() const
Definition: Grid.H:520
std::vector< std::vector< size_t > > threadPartitionBufferIndices
Definition: Grid.H:46
std::vector< double > & Metric()
Definition: Grid.H:622
std::vector< double > scaleFactor
Grid scaling factor.
Definition: Grid.H:688
std::vector< int > threadDecompDirs
Definition: Grid.H:699
std::vector< std::vector< std::vector< size_t > > > threadRecvBufferIndices
Definition: Grid.H:211
const std::vector< double > & CoordinateData() const
Definition: Grid.H:504
std::vector< int > & PeriodicDirs()
Definition: Grid.H:160
std::vector< std::vector< std::vector< size_t > > > threadRecvIndices
Definition: Grid.H:210
const std::vector< size_t > & PartitionSizes() const
Definition: Grid.H:487
const std::vector< std::vector< size_t > > & RecvIndices() const
Definition: Grid.H:159
const std::vector< pcpp::IndexIntervalType > & ThreadBufferIntervals() const
Definition: Grid.H:425
std::vector< double > & DX()
Definition: Grid.H:539
std::vector< int * > sendFlagBuffers
Definition: Grid.H:68
static const char * topoNames[]
Definition: Grid.H:30
std::vector< pcpp::IndexIntervalType > threadBufferExtents
Definition: Grid.H:196
pcpp::IndexIntervalType bufferInterval
Definition: Grid.H:238
void SetPeriodicDirs(const std::vector< int > &inPeriodic)
Definition: Grid.H:161
std::vector< size_t > bufferSizes
Buffer size in each dimension.
Definition: Grid.H:368
virtual int ConfigureGrid(fixtures::ConfigurationType &inConfig, std::ostream &messageStream)
Definition: Grid.H:252
const double * CoordinateData(int inDim) const
Definition: Grid.H:506
bool SetFill(bool yesno)
Definition: Grid.H:85
std::vector< double > Metric() const
Definition: Grid.H:623
const std::vector< double > & DX() const
Definition: Grid.H:538
pcpp::IndexIntervalType & PartitionInterval()
Definition: Grid.H:500
pcpp::IndexIntervalType regionPartitionBufferInterval
Definition: Grid.H:41
std::vector< messagebuffers > & CommunicationBuffers()
Definition: Grid.H:157
std::vector< size_t > & GridSizes()
Definition: Grid.H:474
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
std::vector< double > jacobianMatrix2
Definition: Grid.H:678
std::vector< double * > recvBuffers
Definition: Grid.H:67
void SetThreadDecompDirs(const std::vector< int > &inThread)
Definition: Grid.H:594
int Dimension() const
Definition: Grid.H:323
void SetDimensionExtensions(const std::vector< size_t > &inExtensions)
Definition: Grid.H:492
void const size_t const size_t const size_t const int const int * gridType
Definition: EulerKernels.H:10
std::vector< messagebuffers > communicationBuffers
Definition: Grid.H:219
pcpp::IndexIntervalType regionPartitionInterval
Definition: Grid.H:40
std::vector< size_t > localBufferSizes
Definition: Grid.H:186
const std::vector< pcpp::IndexIntervalType > & ThreadPartitionBufferIntervals() const
Definition: Grid.H:419
size_t NumPoints() const
Definition: Grid.H:322
std::vector< pcpp::IndexIntervalType > & RemoteHaloExtents()
Definition: Grid.H:152
std::vector< size_t > numPointsSend
Definition: Grid.H:64
size_t BufferSize(int numDim, size_t *dimSize)
Definition: Stencil.C:1300
std::vector< subregion > & SubRegions()
Definition: Grid.H:558
const std::vector< bool > & PeriodicDirs() const
Definition: Grid.H:578
void SetGridSizes(const std::vector< size_t > &inSize)
Definition: Grid.H:452
std::vector< pcpp::IndexIntervalType > localHaloExtents
Definition: Grid.H:190
std::vector< size_t > gridSizes
Number of points in each dimension for the grid.
Definition: Grid.H:366
std::vector< int > & GridGenerationOptions()
Definition: Grid.H:649
const pcpp::IndexIntervalType & PartitionInterval() const
Definition: Grid.H:501
const std::vector< subregion > & SubRegions() const
Definition: Grid.H:555
void SetGridGenerationOptions(const std::vector< int > &inOptions)
Definition: Grid.H:653
const std::vector< size_t > & BufferSizes() const
Definition: Grid.H:459
const std::vector< std::vector< size_t > > & SendIndices() const
Definition: Grid.H:158
const std::vector< pcpp::IndexIntervalType > & RemoteHaloBufferExtents() const
Definition: Grid.H:154
int InitSubRegionFromString(const std::string &inString, const std::vector< size_t > &gridSizes, subregion &inSubRegion)
Definition: Grid.C:174
std::vector< bool > haveNeighbor
Definition: Grid.H:188
std::vector< std::vector< std::vector< size_t > > > threadSendIndices
Definition: Grid.H:202
size_t numPointsBuffer
Definition: Grid.H:177
std::vector< double > GenerateUniformGrid(GridType &inGrid, const std::vector< double > &physicalExtent)
Definition: Grid.H:717
virtual int Configure(fixtures::ConfigurationType &inConfig)
Definition: Grid.H:284
std::vector< std::vector< size_t > > sendIndices
Definition: Grid.H:201
static const int NUMGRIDTYPES
Definition: Grid.H:29
void SetPeriodicLengths(const std::vector< double > &inLengths)
Definition: Grid.H:588
size_t numPointsPartition
Number of points in the partition.
Definition: Grid.H:663
std::vector< int > & ThreadDecompDirs()
Definition: Grid.H:590
const std::vector< int > & FlagData() const
Definition: Grid.H:615
std::vector< pcpp::IndexIntervalType > & LocalHaloExtents()
Definition: Grid.H:153
virtual int Configure(fixtures::ConfigurationType &inConfig)
Definition: Grid.H:336
const std::vector< pcpp::IndexIntervalType > & ThreadPartitionIntervals() const
Definition: Grid.H:413
std::vector< std::vector< size_t > > recvIndices
Definition: Grid.H:207
std::vector< int > & FlagData()
Definition: Grid.H:607
pcpp::IndexIntervalType & PartitionExtent()
Definition: Grid.H:151
size_t numPointsBuffer
Number of points in the buffer.
Definition: Grid.H:661
const std::vector< int > & GridGenerationOptions() const
Definition: Grid.H:651
const std::vector< double > & GridGenerationParameters() const
Definition: Grid.H:645
std::vector< bool > periodicDirs
Definition: Grid.H:696
pcpp::IndexIntervalType & PartitionBufferInterval()
Definition: Grid.H:519
void SetDecompDirs(const std::vector< int > &inDecomp)
Definition: Grid.H:584
const std::vector< size_t > & GridSizes() const
Definition: Grid.H:469
void SetLocalPartitionExtent(const pcpp::IndexIntervalType &inExtent)
Definition: Grid.H:90
std::vector< pcpp::IndexIntervalType > threadPartitionIntervals
Definition: Grid.H:44
const std::vector< int > & DecompDirs() const
Definition: Grid.H:582
pcpp::IndexIntervalType localInterval
Definition: Grid.H:226
std::string regionName
Definition: Grid.H:37
std::vector< pcpp::IndexIntervalType > threadBufferIntervals
Definition: Grid.H:240
pcpp::IndexIntervalType localPartitionExtent
Definition: Grid.H:185
std::vector< size_t > partitionBufferIndices
Definition: Grid.H:42
std::vector< int > decompSizes
Prescribed decomposition.
Definition: Grid.H:383
void SetGridSpacings(const std::vector< double > &inSpacing)
Definition: Grid.H:540
const std::vector< int > & ThreadDecompDirs() const
Definition: Grid.H:592
std::vector< pcpp::IndexIntervalType > threadBufferIntervals
Buffer interval owned by each thread (omp)
Definition: Grid.H:377
Definition: Grid.f90:1
void SetNeighbors(const std::vector< bool > &inNeighbors)
Definition: Grid.H:145
void SetDecompSizes(const std::vector< int > &inDecomp)
Definition: Grid.H:437
std::vector< double * > sendBuffers
Definition: Grid.H:66
std::vector< double > jacobianMatrix
Definition: Grid.H:677
Main encapsulation of MPI.
Definition: COMM.H:62
int ResolveTopoName(const std::string &inName)
Definition: Grid.C:135
std::vector< pcpp::IndexIntervalType > remoteHaloExtents
Definition: Grid.H:189
std::string GetValue(const std::string &key) const
Definition: Parameters.C:24
Encapsulation for a collection of operator stencils.
Definition: Stencil.H:26
TopoType
Geometry/grid topology types.
Definition: Grid.H:28
std::vector< double > gridGenParams
Definition: Grid.H:679
void const size_t const size_t const size_t const int const double * gridJacobian
Definition: MetricKernels.H:9
std::vector< double > physicalExtent
Physical grid extent (when applicable)
Definition: Grid.H:684
std::vector< double > dX
Grid spacing data structure (size depends on gridTopoType)
Definition: Grid.H:686
std::vector< pcpp::IndexIntervalType > & ThreadPartitionIntervals()
Definition: Grid.H:410
void SetGridGenerationParameters(const std::vector< double > &inParams)
Definition: Grid.H:647
void const size_t const size_t * bufferSizes
Definition: MetricKernels.H:19
void SetScaleFactor(const std::vector< double > &inScale)
Definition: Grid.H:602
std::vector< subregion > subRegions
Sub-regions and boundaries.
Definition: Grid.H:704
virtual std::string ReportConfiguration()
Definition: Grid.H:315
TopoType gridTopoType
The topology type.
Definition: Grid.H:673
std::string ConfigKey(const std::string &configName, const std::string &keyName)
Definition: PCPPUtil.C:191
std::vector< bool > & PeriodicDirs()
Definition: Grid.H:576
std::vector< pcpp::IndexIntervalType > threadExtents
Definition: Grid.H:195
double * CoordinateData(int inDim)
Definition: Grid.H:511
const std::vector< double > & PhysicalExtent() const
Definition: Grid.H:533
std::vector< pcpp::IndexIntervalType > threadPartitionIntervals
Partition intervals owned by thread (omp)
Definition: Grid.H:381
std::vector< std::pair< int, std::vector< size_t > > > haloRecvIndices
Definition: Grid.H:208
std::vector< double > & CoordinateData()
Definition: Grid.H:503
std::vector< int > periodicDirs
Definition: Grid.H:179
pcpp::IndexIntervalType & GlobalExtent()
Definition: Grid.H:150
pbsintervals partitionIntervals
The relevant partition intervals.
Definition: Grid.H:665
std::vector< size_t > dimExtensions
Number of "halo/ghost" points in each (+/-) of the 2*numDim directions.
Definition: Grid.H:667
std::vector< int > & DecompSizes()
Definition: Grid.H:447
halo(const pcpp::IndexIntervalType &inGlobalExtent, const pcpp::IndexIntervalType &inPartitionExtent)
Definition: Grid.H:76
std::vector< pcpp::IndexIntervalType > remoteHaloBufferExtents
Definition: Grid.H:192
virtual int ConfigureGrid(fixtures::ConfigurationType &inConfig, std::ostream &messageStream)
Definition: Grid.H:332
std::vector< pcpp::IndexIntervalType > threadPartitionBufferIntervals
Partition buffer interval owned by each thread (omp)
Definition: Grid.H:379
std::vector< pcpp::IndexIntervalType > threadOpIntervals
Definition: Grid.H:241
std::vector< pcpp::RemoteCollisionType > recvCollisions
Definition: Grid.H:206
std::vector< double > & JacobianMatrix()
Definition: Grid.H:626
pcpp::IndexIntervalType patchInterval
Definition: Grid.H:232
pcpp::IndexIntervalType opInterval
Definition: Grid.H:239
std::vector< size_t > numPointsRecv
Definition: Grid.H:65
pcpp::IndexIntervalType ResolveBufferInterval(const pcpp::IndexIntervalType &partitionInterval, const pcpp::IndexIntervalType &partitionBufferInterval, const pcpp::IndexIntervalType &partitionSubInterval)
Definition: Grid.C:153
std::string ResolveTopoType(int inType)
Definition: Grid.C:144
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
void SetGridInterval(const pcpp::IndexIntervalType &inExtent)
Definition: Grid.H:82
std::vector< pcpp::IndexIntervalType > sendExtents
Definition: Grid.H:193
std::vector< pcpp::IndexIntervalType > threadPartitionBufferIntervals
Definition: Grid.H:45
std::vector< double > JacobianMatrix() const
Definition: Grid.H:627
fixtures::CommunicatorType & Communicator() const
Definition: Grid.H:350
std::vector< size_t > & BufferSizes()
Definition: Grid.H:464
std::vector< pcpp::IndexIntervalType > & ThreadBufferIntervals()
Definition: Grid.H:422
void size_t int * numComponents
int ConfigureGrid(const fixtures::ConfigurationType &inConfig, const std::string &gridName, GridType &inGrid, std::ostream &messageStream)
Definition: PC2Util.H:101
const std::vector< int > & DecompSizes() const
Definition: Grid.H:442
std::vector< double > & GridGenerationParameters()
Definition: Grid.H:643
pcpp::IndexIntervalType globalBufferInterval
The local buffer interval wrt the global grid size [yet unused].
Definition: Grid.H:669
std::vector< pcpp::RemoteCollisionType > sendCollisions
Definition: Grid.H:200
pcpp::IndexIntervalType globalGridExtent
Definition: Grid.H:183
Simple key-value pair.
std::vector< double > gridCoordinates
The coordinate buffer.
Definition: Grid.H:671
void SetPhysicalExtent(const std::vector< double > &inExtent)
Definition: Grid.H:535
std::vector< double > periodicLengths
Definition: Grid.H:697
std::vector< std::vector< std::vector< size_t > > > threadSendBufferIndices
Definition: Grid.H:203
std::vector< pcpp::IndexIntervalType > & ThreadPartitionBufferIntervals()
Definition: Grid.H:416
pcpp::IndexIntervalType globalPartitionExtent
Definition: Grid.H:184
int GetRegionIndex(const std::string &regionName) const
Definition: Grid.H:561
std::vector< double > gridMetric
Grid metrics (sizes depend on gridTopoType)
Definition: Grid.H:675
std::vector< double > & PhysicalExtent()
Definition: Grid.H:534
void const size_t * numPointsBuffer
Definition: MetricKernels.H:19
halo gridHalo
Halo object for communicating data with grid "neighbors".
Definition: Grid.H:694
bool IsSet(const std::string &Key) const
Definition: Parameters.C:115
std::vector< int > & DecompDirs()
Definition: Grid.H:580
plascom2::operators::stencilset * stencilSet
Differential operator.
Definition: Grid.H:690
std::vector< pcpp::IndexIntervalType > localHaloBufferExtents
Definition: Grid.H:191